CraftItemPrepareEvent results in ingredients doubling after craft

Discussion in 'Plugin Development' started by mineShogun, Dec 26, 2020.

Thread Status:
Not open for further replies.
  1. Offline

    mineShogun

    I'm using a CraftItemPrepareEvent to check for a custom crafting recipe which involves the use of one custom item (i.e. with lore and a custom display name) as an ingredient, problem is, when I actually craft the item, instead of taking away the ingredients it only takes away the custom ingredient and changes the amount of the rest vanilla ingredients to (2 times - 2) somehow. Please help, code is as follows;

    Code:
    public class Main extends JavaPlugin implements Listener{
        @Override
        public void onEnable() {
            Bukkit.getPluginManager().registerEvents(this, this);
        }
        @Override
        public void onDisable() {
          
        }
        @EventHandler
        public void FusionCoreCraft(PrepareItemCraftEvent event) {
            CraftingInventory craft = event.getInventory();
            ItemStack[] matrix = event.getInventory().getMatrix();
            if(matrix[1] != null && matrix[3] != null && matrix[4] != null && matrix[5] != null && matrix[7] != null) {
                if((matrix[1].getType().equals(Material.IRON_INGOT) && matrix[1].getAmount() == 48) && (matrix[1].getType().equals(Material.IRON_INGOT) && matrix[1].getAmount() == 48) && (matrix[1].getType().equals(Material.IRON_INGOT) && matrix[1].getAmount() == 48) && (matrix[1].getType().equals(Material.IRON_INGOT) && matrix[1].getAmount() == 48) && matrix[4].equals(BlankFusionCore())) {
                    craft.setResult(IronFusionCore());
                }
                if((matrix[1].getType().equals(Material.DIAMOND) && matrix[1].getAmount() == 48) && (matrix[1].getType().equals(Material.DIAMOND) && matrix[1].getAmount() == 48) && (matrix[1].getType().equals(Material.DIAMOND) && matrix[1].getAmount() == 48) && (matrix[1].getType().equals(Material.DIAMOND) && matrix[1].getAmount() == 48) && matrix[4].equals(BlankFusionCore())) {
                    craft.setResult(GoldFusionCore());
                }
                if((matrix[1].getType().equals(Material.EMERALD) && matrix[1].getAmount() == 48) && (matrix[1].getType().equals(Material.EMERALD) && matrix[1].getAmount() == 48) && (matrix[1].getType().equals(Material.EMERALD) && matrix[1].getAmount() == 48) && (matrix[1].getType().equals(Material.EMERALD) && matrix[1].getAmount() == 48) && matrix[4].equals(BlankFusionCore())) {
                    craft.setResult(EmeraldFusionCore());
                }
                if((matrix[1].getType().equals(Material.DIAMOND) && matrix[1].getAmount() == 48) && (matrix[1].getType().equals(Material.DIAMOND) && matrix[1].getAmount() == 48) && (matrix[1].getType().equals(Material.DIAMOND) && matrix[1].getAmount() == 48) && (matrix[1].getType().equals(Material.DIAMOND) && matrix[1].getAmount() == 48) && matrix[4].equals(BlankFusionCore())) {
                    craft.setResult(DiamondFusionCore());
                }
            }
        }
      
        public ItemStack BlankFusionCore() {
            ItemStack item = new ItemStack(Material.NETHER_STAR);
            ItemMeta meta = item.getItemMeta();
            meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&f&lBlank Fusion Core"));
            ArrayList<String> Lore = new ArrayList<>();
            Lore.add("");
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&8&oHas a very small chance of being"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&8&odropped by creatures of the night."));
            Lore.add("");
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&o\"Maleable and soft to the touch, "));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&operhaps it can be molded into"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&osomething useful?\""));
            Lore.add("");
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&fThe building block of higher-tier"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&c&lFusion Cores&f."));
            Lore.add("");
            meta.setLore(Lore);
            meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
            item.setItemMeta(meta);
            return item;
        }
        public ItemStack IronFusionCore() {
            ItemStack item = new ItemStack(Material.NETHER_STAR);
            ItemMeta meta = item.getItemMeta();
            meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&7&lIron Fusion Core"));
            ArrayList<String> Lore = new ArrayList<>();
            Lore.add("");
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&8&oUsed to fuse upto [level I] Scrolls to"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&8&oweapons and tools. "));
            Lore.add("");
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&o\"They were experimenting with"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&othe blank cores, when they found"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&othat they had an affinity for"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&ominerals, Iron was the first choice.\""));
            Lore.add("");
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&fThe first tier of &c&lFusion Cores&f."));
            Lore.add("");
            meta.setLore(Lore);
            meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
            item.setItemMeta(meta);
            return item;
        }
        public ItemStack GoldFusionCore() {
            ItemStack item = new ItemStack(Material.NETHER_STAR);
            ItemMeta meta = item.getItemMeta();
            meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&e&lGold Fusion Core"));
            ArrayList<String> Lore = new ArrayList<>();
            Lore.add("");
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&8&oUsed to fuse upto [level II] Scrolls to"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&8&oweapons and tools. "));
            Lore.add("");
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&o\"The Gold Fusion Cores were"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&oa result of the continuous"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&osearch for improvement, after Iron"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&ocame Gold.\""));
            Lore.add("");
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&fThe second tier of &c&lFusion Cores&f."));
            Lore.add("");
            meta.setLore(Lore);
            meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
            item.setItemMeta(meta);
            return item;
        }
        public ItemStack EmeraldFusionCore() {
            ItemStack item = new ItemStack(Material.NETHER_STAR);
            ItemMeta meta = item.getItemMeta();
            meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&a&lEmerald Fusion Core"));
            ArrayList<String> Lore = new ArrayList<>();
            Lore.add("");
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&8&oUsed to fuse upto [level III] Scrolls to"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&8&oweapons and tools. "));
            Lore.add("");
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&o\"The Emerald Cores were a"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&odiscovery by accident. Some villagers"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&owere tinkering with Blank Cores "));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&oand Voila.\""));
            Lore.add("");
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&fThe third tier of &c&lFusion Cores&f."));
            Lore.add("");
            meta.setLore(Lore);
            meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
            item.setItemMeta(meta);
            return item;
        }
        public ItemStack DiamondFusionCore() {
            ItemStack item = new ItemStack(Material.NETHER_STAR);
            ItemMeta meta = item.getItemMeta();
            meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&b&lDiamond Fusion Core"));
            ArrayList<String> Lore = new ArrayList<>();
            Lore.add("");
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&8&oUsed to fuse upto [level IV] Scrolls to"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&8&oweapons and tools. "));
            Lore.add("");
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&o\"The ancient builders' most precious"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&oresource had to be a"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&ostepping stone to achieving even"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&ogreater power, and so it was;"));
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&7&oThey had created the ultimate material."));
            Lore.add("");
            Lore.add(ChatColor.translateAlternateColorCodes('&', "&fThe fourth and final tier of &c&lFusion Cores&f."));
            Lore.add("");
            meta.setLore(Lore);
            meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
            item.setItemMeta(meta);
            return item;
        }
      
    }
    Just to help out, I had originally tried to compare the craftinginventory slots with ItemStacks directly but that also resulted in the same outcome.

    The images and what the bug is actually doing is also as follow;
    1.png 2.png
     
  2. Offline

    CraftCreeper6

    @mineShogun
    The main problem I can see is that you are always comparing matrix[1] for each material. This will only check the top most iron ingot for the first recipe and ignore all others.

    I recommend you make a custom recipe handler for exactly this problem. Allow it to take in custom items and amounts of said items and return a result. It would improve your code a lot and reduce the amount of mistakes like this one.
     
    Last edited: Dec 26, 2020
Thread Status:
Not open for further replies.

Share This Page