Description
Expected behavior
No matter how an inventory is created, it should behave identical regarding methods like isEmpty
. For example, setting the result slot in an anvil should always cause isEmpty
on that inventory to return false.
Observed/Actual behavior
Depending on how the inventory was created, these methods behave differently. Inventories that were created using open...
(e.g. openAnvil
) create an instance of CraftInventoryAnvil
. This class (and every other subclass of CraftResultInventory
) do not override getContents
or getStorageContents
and therefore isEmpty
in CraftInventory
do not work properly. Inventories that were created using createInventory
always create inventories of type CraftCustomInventory
which holds a single container for all slots in the inventory and does not hold a container specifically for the result. Therefore isEmpty
checks all slots, including the result slot.
Steps/models to reproduce
Player player = Bukkit.getOnlinePlayers().stream().findAny().get();
Inventory anvilInv = Bukkit.createInventory(null, InventoryType.ANVIL);
anvilInv.setItem(2, new ItemStack(Material.STONE));
player.openInventory(anvilInv);
Bukkit.getScheduler().runTaskLater(this, () -> {
System.out.println(anvilInv.isEmpty()); // false
System.out.println(player.getOpenInventory().getTopInventory().isEmpty()); // false
player.closeInventory();
InventoryView view = player.openAnvil(player.getLocation(), true);
view.getTopInventory().setItem(2, new ItemStack(Material.STONE));
Bukkit.getScheduler().runTaskLater(this, () -> {
System.out.println(view.getTopInventory().isEmpty()); // true
System.out.println(player.getOpenInventory().getTopInventory().isEmpty()); // true
}, 2L);
}, 2L);
Plugin and Datapack List
None
Paper version
This server is running Paper version git-Paper-496 (MC: 1.20.4) (Implementing API version 1.20.4-R0.1-SNAPSHOT) (Git: 7ac24a1 on ver/1.20.4)
You are running the latest version
Previous version: git-Paper-398 (MC: 1.20.4)
Other
No response
Metadata
Metadata
Assignees
Type
Projects
Status