3

I am currently coding my own GUI Shop for my Server Network and I am facing two weird problems.

The first problem is, whenever I want to get 2 leaves with the Item ID 161 and two different Meta ID's (0 and 1) I just get returned a Meta ID of 2.

Here is what I get in my debug when it tries to get the Item Data: Problem 1

And this is what I get in my inventory: Problem 1

But it should be this (for example): 161/0 or 161/1

I get this Item Meta from Spigot/Bukkit itself so I don't aquire it anyhow by myself.

The next problem I have is that whenever I want to buy wool, it only works perfectly till the 9th byte, then everything above it just returns me Orange Wool or Clay or Glass everytime.

Thats how I am displaying the items:

if(t == ShopType.SHOP_DECORATION){
        inv = Bukkit.createInventory(null, 54, "Shop: Decoration");
        createDisplay(Material.WOOL, (byte)0, inv, 0, null, getShopLore("wool"));
        createDisplay(Material.WOOL, (byte)1, inv, 1, null, getShopLore("wool2"));
        createDisplay(Material.WOOL, (byte)2, inv, 2, null, getShopLore("wool3"));
        createDisplay(Material.WOOL, (byte)3, inv, 3, null, getShopLore("wool4"));
        createDisplay(Material.WOOL, (byte)4, inv, 4, null, getShopLore("wool5"));
        createDisplay(Material.WOOL, (byte)5, inv, 5, null, getShopLore("wool6"));
        createDisplay(Material.WOOL, (byte)6, inv, 6, null, getShopLore("wool7"));
        createDisplay(Material.WOOL, (byte)7, inv, 7, null, getShopLore("wool8"));
        createDisplay(Material.WOOL, (byte)8, inv, 8, null, getShopLore("wool9"));
        createDisplay(Material.WOOL, (byte)9, inv, 9, null, getShopLore("woola"));
        createDisplay(Material.WOOL, (byte)10, inv, 10, null, getShopLore("woolb"));
        createDisplay(Material.WOOL, (byte)11, inv, 11, null, getShopLore("woolc"));
        createDisplay(Material.WOOL, (byte)12, inv, 12, null, getShopLore("woold"));
        createDisplay(Material.WOOL, (byte)13, inv, 13, null, getShopLore("woole"));
        createDisplay(Material.WOOL, (byte)14, inv, 14, null, getShopLore("woolf"));
        createDisplay(Material.WOOL, (byte)15, inv, 15, null, getShopLore("woolg"));
        createDisplay(Material.STAINED_GLASS, (byte)0, inv, 16, null, getShopLore("glass"));
        createDisplay(Material.STAINED_GLASS, (byte)1, inv, 17, null, getShopLore("glass2"));
        createDisplay(Material.STAINED_GLASS, (byte)2, inv, 18, null, getShopLore("glass3"));
        createDisplay(Material.STAINED_GLASS, (byte)3, inv, 19, null, getShopLore("glass4"));
        createDisplay(Material.STAINED_GLASS, (byte)4, inv, 20, null, getShopLore("glass5"));
        createDisplay(Material.STAINED_GLASS, (byte)5, inv, 21, null, getShopLore("glass6"));
        createDisplay(Material.STAINED_GLASS, (byte)6, inv, 22, null, getShopLore("glass7"));
        createDisplay(Material.STAINED_GLASS, (byte)7, inv, 23, null, getShopLore("glass8"));
        createDisplay(Material.STAINED_GLASS, (byte)8, inv, 24, null, getShopLore("glass9"));
        createDisplay(Material.STAINED_GLASS, (byte)9, inv, 25, null, getShopLore("glassa"));
        createDisplay(Material.STAINED_GLASS, (byte)10, inv, 26, null, getShopLore("glassb"));
        createDisplay(Material.STAINED_GLASS, (byte)11, inv, 27, null, getShopLore("glassc"));
        createDisplay(Material.STAINED_GLASS, (byte)12, inv, 28, null, getShopLore("glassd"));
        createDisplay(Material.STAINED_GLASS, (byte)13, inv, 29, null, getShopLore("glasse"));
        createDisplay(Material.STAINED_GLASS, (byte)14, inv, 30, null, getShopLore("glassf"));
        createDisplay(Material.STAINED_GLASS, (byte)15, inv, 31, null, getShopLore("glassg"));
        createDisplay(Material.STAINED_CLAY, (byte)0, inv, 32, null, getShopLore("clay"));
        createDisplay(Material.STAINED_CLAY, (byte)1, inv, 33, null, getShopLore("clay2"));
        createDisplay(Material.STAINED_CLAY, (byte)2, inv, 34, null, getShopLore("clay3"));
        createDisplay(Material.STAINED_CLAY, (byte)3, inv, 35, null, getShopLore("clay4"));
        createDisplay(Material.STAINED_CLAY, (byte)4, inv, 36, null, getShopLore("clay5"));
        createDisplay(Material.STAINED_CLAY, (byte)5, inv, 37, null, getShopLore("clay6"));
        createDisplay(Material.STAINED_CLAY, (byte)6, inv, 38, null, getShopLore("clay7"));
        createDisplay(Material.STAINED_CLAY, (byte)7, inv, 39, null, getShopLore("clay8"));
        createDisplay(Material.STAINED_CLAY, (byte)8, inv, 40, null, getShopLore("clay9"));
        createDisplay(Material.STAINED_CLAY, (byte)9, inv, 41, null, getShopLore("claya"));
        createDisplay(Material.STAINED_CLAY, (byte)10, inv, 42, null, getShopLore("clayb"));
        createDisplay(Material.STAINED_CLAY, (byte)11, inv, 43, null, getShopLore("clayc"));
        createDisplay(Material.STAINED_CLAY, (byte)12, inv, 44, null, getShopLore("clayd"));
        createDisplay(Material.STAINED_CLAY, (byte)13, inv, 45, null, getShopLore("claye"));
        createDisplay(Material.STAINED_CLAY, (byte)14, inv, 46, null, getShopLore("clayf"));
        createDisplay(Material.STAINED_CLAY, (byte)15, inv, 47, null, getShopLore("clayg"));
        createButtons(inv);
        p.openInventory(inv);
    }

Those displays are shown correct in the GUI but when I want to purchase them I get always orange Wool or clay or glass after the cyan wool/clay/glass.

This is how I give it to them:

    public static boolean withdrawPlayer(Player player, double amount, int am){
    double money = econ.getBalance(player);
    if(money < amount){
        return false;
    }
    econ.withdrawPlayer(player, amount);
    JSONObject json = Shop.getItemData(player);
    int itemID = json.getInt("item_id");
    byte itemMeta = (byte)json.getInt("item_data");
    ItemStack item = new ItemStack(itemID, 1, itemMeta);

    item.setAmount(am);
    player.sendMessage("Debug: " + item.getAmount() + " " + item.getType() + " -- Data: " + Shop.getData(item.getData()) + " ||| " + item.getData());
    player.getInventory().addItem(item);
    player.updateInventory();
    return true;
}

This is how I add the JSONObject:

private static void addItem(String item, int price, ShopType type){
    priceList.put(item, price);
    slotList.put(item, type);
    JSONObject temp = new JSONObject();
    switch(type){
    case SHOP_REDSTONE:
        temp.put("slot", a);
        temp.put("type", type.toString());
        temp.put("name", item);
        temp.put("price", price);
        a++;
        break;
    case SHOP_ORES:
        temp.put("slot", b);
        temp.put("type", type.toString());
        temp.put("name", item);
        temp.put("price", price);
        b++;
        break;
    case SHOP_SEEDS:
        temp.put("slot", c);
        temp.put("type", type.toString());
        temp.put("name", item);
        temp.put("price", price);
        c++;
        break;
    case SHOP_FOOD:
        temp.put("slot", d);
        temp.put("type", type.toString());
        temp.put("name", item);
        temp.put("price", price);
        d++;
        break;
    case SHOP_DROPS:
        temp.put("slot", e);
        temp.put("type", type.toString());
        temp.put("name", item);
        temp.put("price", price);
        e++;
        break;
    case SHOP_MISC:
        temp.put("slot", f);
        temp.put("type", type.toString());
        temp.put("name", item);
        temp.put("price", price);
        f++;
        break;
    case SHOP_DECORATION:
        temp.put("slot", g);
        temp.put("type", type.toString());
        temp.put("name", item);
        temp.put("price", price);
        g++;
        break;
    }
    System.out.println("A: " +a);
    System.out.println("B: " +b);
    System.out.println("C: " +c);
    System.out.println("D: " +d);
    System.out.println("E: " +e);
    System.out.println("F: " +f);
    System.out.println("G: " +g);
    debug.add(temp);
}

This is the code that runs when someone clicks on an item:

@EventHandler
public void onInventoryClick(InventoryClickEvent e){
    Player p = (Player) e.getWhoClicked();
    int slot = e.getSlot();

    if (e.getSlotType().equals(SlotType.OUTSIDE)) {
        return;
    }


    if(e.getClickedInventory().getName().equalsIgnoreCase("Menu")){

        if (e.getSlotType().equals(SlotType.OUTSIDE)) {
            return;
        }

        for(ClickType type : ClickType.values()){
            if(e.getClick() == type){
                e.setCancelled(true);
            }
        }

        for(InventoryAction action : InventoryAction.values()){
            if(e.getAction() == action){
                e.setCancelled(true);
            }
        }
        if(e.isRightClick() || e.isLeftClick()){
            e.setCancelled(true);
            switch(slot){
            case 0:
                p.closeInventory();
                new Shop(ShopType.SHOP_REDSTONE, p);
                break;
            case 1:
                p.closeInventory();
                new Shop(ShopType.SHOP_ORES, p);
                break;
            case 2:
                p.closeInventory();
                new Shop(ShopType.SHOP_SEEDS, p);
                break;
            case 3:
                p.closeInventory();
                new Shop(ShopType.SHOP_FOOD, p);
                break;
            case 4:
                p.closeInventory();
                new Shop(ShopType.SHOP_DROPS, p);
                break;
            case 5:
                p.closeInventory();
                new Shop(ShopType.SHOP_MISC, p);
                break;
            case 6:
                p.closeInventory();
                new Shop(ShopType.SHOP_DECORATION, p);
                break;
            }   
        }
    }

    if(e.getClickedInventory().getName().contains("Shop: ")){
        if (e.getSlotType().equals(SlotType.OUTSIDE)) {
            return;
        }

        for(ClickType type : ClickType.values()){
            if(e.getClick() == type){
                e.setCancelled(true);
            }
        }

        for(InventoryAction action : InventoryAction.values()){
            if(e.getAction() == action){
                e.setCancelled(true);
            }
        }

        if(e.isRightClick() || e.isLeftClick()){
            e.setCancelled(true);
            ItemStack it = e.getCurrentItem();
            if(it == null){
                return;
            }
            int paperID = 339;
            if(it.getTypeId() == paperID){
                Shop.goBack(p);
            }
        }
    }



    switch(e.getClickedInventory().getName()){
    case "Shop: Redstone":
        e.setCancelled(true);
        if(e.isLeftClick() && e.getCurrentItem().getTypeId() != 0){
            ItemStack item = e.getCurrentItem();
            Material mat = item.getType();
            Shop.prepareBuy(p, slot, ShopType.SHOP_REDSTONE, mat.name());
            Shop.addItemData(p, e.getCurrentItem().getTypeId(), Shop.getData(e.getCurrentItem().getData()));
        }

        if(e.isRightClick() && e.getCurrentItem().getTypeId() != 0){
            ItemStack item = e.getCurrentItem();
            Material mat = item.getType();
            Shop.prepareSell(p, slot, ShopType.SHOP_REDSTONE, mat.name());
            Shop.addItemData(p, e.getCurrentItem().getTypeId(), Shop.getData(e.getCurrentItem().getData()));
        }
        break;
    case "Shop: Ores":
        e.setCancelled(true);
        if(e.isLeftClick() && e.getCurrentItem().getTypeId() != 0){
            ItemStack item = e.getCurrentItem();
            Material mat = item.getType();
            Shop.prepareBuy(p, slot, ShopType.SHOP_ORES, mat.name());
            Shop.addItemData(p, e.getCurrentItem().getTypeId(), Shop.getData(e.getCurrentItem().getData()));
        }

        if(e.isRightClick() && e.getCurrentItem().getTypeId() != 0){
            ItemStack item = e.getCurrentItem();
            Material mat = item.getType();
            Shop.prepareSell(p, slot, ShopType.SHOP_ORES, mat.name());
            Shop.addItemData(p, e.getCurrentItem().getTypeId(), Shop.getData(e.getCurrentItem().getData()));
        }
        break;
    case "Shop: Seeds":
        e.setCancelled(true);
        if(e.isLeftClick() && e.getCurrentItem().getTypeId() != 0){
            ItemStack item = e.getCurrentItem();
            Material mat = item.getType();
            Shop.prepareBuy(p, slot, ShopType.SHOP_SEEDS, mat.name());
            Shop.addItemData(p, e.getCurrentItem().getTypeId(), Shop.getData(e.getCurrentItem().getData()));
        }

        if(e.isRightClick() && e.getCurrentItem().getTypeId() != 0){
            ItemStack item = e.getCurrentItem();
            Material mat = item.getType();
            Shop.prepareSell(p, slot, ShopType.SHOP_SEEDS, mat.name());
            Shop.addItemData(p, e.getCurrentItem().getTypeId(), Shop.getData(e.getCurrentItem().getData()));
        }
        break;
    case "Shop: Food":
        e.setCancelled(true);
        if(e.isLeftClick() && e.getCurrentItem().getTypeId() != 0){
            ItemStack item = e.getCurrentItem();
            Material mat = item.getType();
            Shop.prepareBuy(p, slot, ShopType.SHOP_FOOD, mat.name());
            Shop.addItemData(p, e.getCurrentItem().getTypeId(), Shop.getData(e.getCurrentItem().getData()));
        }


        if(e.isRightClick() && e.getCurrentItem().getTypeId() != 0){
            ItemStack item = e.getCurrentItem();
            Material mat = item.getType();
            Shop.prepareSell(p, slot, ShopType.SHOP_FOOD, mat.name());
            Shop.addItemData(p, e.getCurrentItem().getTypeId(), Shop.getData(e.getCurrentItem().getData()));
        }
        break;
    case "Shop: Drops":
        e.setCancelled(true);
        if(e.isLeftClick() && e.getCurrentItem().getTypeId() != 0){
            ItemStack item = e.getCurrentItem();
            Material mat = item.getType();
            Shop.prepareBuy(p, slot, ShopType.SHOP_DROPS, mat.name());
            Shop.addItemData(p, e.getCurrentItem().getTypeId(), Shop.getData(e.getCurrentItem().getData()));
        }

        if(e.isRightClick() && e.getCurrentItem().getTypeId() != 0){
            ItemStack item = e.getCurrentItem();
            Material mat = item.getType();
            Shop.prepareSell(p, slot, ShopType.SHOP_DROPS, mat.name());
            Shop.addItemData(p, e.getCurrentItem().getTypeId(), Shop.getData(e.getCurrentItem().getData()));
        }
        break;
    case "Shop: Misc.":
        e.setCancelled(true);
        if(e.isLeftClick() && e.getCurrentItem().getTypeId() != 0){
            ItemStack item = e.getCurrentItem();
            Material mat = item.getType();
            Shop.prepareBuy(p, slot, ShopType.SHOP_MISC, mat.name());
            Shop.addItemData(p, e.getCurrentItem().getTypeId(), Shop.getData(e.getCurrentItem().getData()));
        }

        if(e.isRightClick() && e.getCurrentItem().getTypeId() != 0){
            ItemStack item = e.getCurrentItem();
            Material mat = item.getType();
            Shop.prepareSell(p, slot, ShopType.SHOP_MISC, mat.name());
            Shop.addItemData(p, e.getCurrentItem().getTypeId(), Shop.getData(e.getCurrentItem().getData()));
        }
        break;
    case "Shop: Decoration":
        e.setCancelled(true);
        if(e.getClick() == ClickType.DROP){
            return;
        }
        if(e.isLeftClick() && e.getCurrentItem().getTypeId() != 0){
            ItemStack item = e.getCurrentItem();
            Material mat = item.getType();
            Shop.prepareBuy(p, slot, ShopType.SHOP_DECORATION, mat.name());
            Shop.addItemData(p, e.getCurrentItem().getTypeId(), Shop.getData(e.getCurrentItem().getData()));
        }

        if(e.isRightClick() && e.getCurrentItem().getTypeId() != 0){
            ItemStack item = e.getCurrentItem();
            Material mat = item.getType();
            Shop.prepareSell(p, slot, ShopType.SHOP_DECORATION, mat.name());
            Shop.addItemData(p, e.getCurrentItem().getTypeId(), Shop.getData(e.getCurrentItem().getData()));
        }
        break;
    }
}

So please, am I missing something or am I doing something wrong?

Krawtox
  • 41
  • 1

1 Answers1

0

For the first question: new ItemStack(Material.LEAVES_2,1,(short)0); new ItemStack(Material.LEAVES_2,1,(short)1); the constructors of your leaves should look something like this.

For the second question: What does Shop.getData exactly return? If you want to give him an item similar to the shop item you could do the following:

p.getInventory().addItem(new ItemStack(e.getCurrentItem().getType(),1,e.getCurrentItem().getDurability()));

The value after the ':' (idk what its called in english; I'm german) is called durability for items, and is called data for blocks. Also for the durability Bukkit uses a short, but for a blocks data they use a byte.