[SPIGOT-1941] Won't set resulting ItemStack in Anvil Inventory Created: 16/Mar/16  Updated: 10/Jul/16  Resolved: 10/Jul/16

Status: Resolved
Project: Spigot
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Minor
Reporter: Braden Mitchell Assignee: Unassigned
Resolution: Cannot Reproduce Votes: 0
Labels: 1.8, Craftbukkit


 Description   

Won't let me set resulting ItemStack in anvil inventory. Also, a better way to customize the repair cost would be good.

org.bukkit.craftbukkit.git-Bukkit-efe04b8.inventory.CraftContainer is not implemented properly. setupSlots lacks multiple inventory types.

https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/browse/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java#118

Here is where it should set the resulting item...

meta.setLore(Arrays.asList(two));
result.setItemMeta(meta);
anvil.setItem(2, result);

Here is the rest of the class...

public class Anvil implements Listener {

    String one = ChatColor.translateAlternateColorCodes('&', "&bSwift I");
    String two = ChatColor.translateAlternateColorCodes('&', "&eSwift II");

    @EventHandler
    public void onCombine(InventoryClickEvent e) {
        if (!(e.getWhoClicked() instanceof Player))
            return;
        ClickType click = e.getClick();
        int slot = e.getSlot();
        SlotType stype = e.getSlotType();
        InventoryType inv = e.getInventory().getType();
        ItemStack current = e.getCurrentItem();
        ItemStack cursor = e.getCursor();
        if (click == ClickType.LEFT || click == ClickType.RIGHT) {
            if (current.getType() == Material.AIR && cursor.getType() != Material.AIR) {
                if (!(stype == SlotType.CRAFTING && inv == InventoryType.ANVIL))
                    return;
                AnvilInventory anvil = (AnvilInventory) e.getInventory();
                ItemStack[] items = anvil.getContents();
                ItemStack item1 = items[0];
                ItemStack item2 = items[1];
                List<String> lore = cursor.getItemMeta().getLore();
                Material book = Material.ENCHANTED_BOOK;
                ItemStack result = new ItemStack(Material.ENCHANTED_BOOK);
                ItemMeta meta = result.getItemMeta();
                if (slot == 1 && item1 != null) {
                    if (!(cursor.getType() == book && item1.getType() == book))
                        return;
                    List<String> lore1 = item1.getItemMeta().getLore();
                    if (lore1.contains(one) && lore.contains(one)) {
                        meta.setLore(Arrays.asList(two));
                        result.setItemMeta(meta);
                        anvil.setItem(2, result);
                    }
                } else if (item1 == null && item2 != null) {
                    if (!(cursor.getType() == book && item2.getType() == book))
                        return;
                    List<String> lore2 = item2.getItemMeta().getLore();
                    if (lore2.contains(one) && lore.contains(one)) {
                        meta.setLore(Arrays.asList(two));
                        result.setItemMeta(meta);
                        anvil.setItem(2, result);
                    }
                }
            }
        }
    }
}


 Comments   
Comment by md_5 [ 10/Jul/16 ]
    public void click(InventoryClickEvent event)
    {
        if ( event.getInventory() instanceof AnvilInventory )
        {
            AnvilInventory anvil = (AnvilInventory) event.getInventory();
            anvil.setItem( 2, new ItemStack( Material.STONE ) );
        }
    }
Comment by Braden Mitchell [ 16/Mar/16 ]

The resulting slot shows no itemstack when I try to get the itemstack in slot 2 of the anvil which should be resulting slot. There is also no slot defined when I ask it for the slot when clicked.

Generated at Tue Apr 22 07:03:26 UTC 2025 using Jira 10.3.5#10030005-sha1:190c783f2bd6c69cd5accdb70f97e48812a78d14.