diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemInventory.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemInventory.java index fe8a79cb2c..6a98e3ac93 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemInventory.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemInventory.java @@ -1,5 +1,7 @@ package com.denizenscript.denizen.objects.properties.item; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.properties.inventory.InventoryContents; import com.denizenscript.denizen.utilities.Conversion; import com.denizenscript.denizen.objects.InventoryTag; @@ -11,21 +13,34 @@ import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.tags.Attribute; import com.denizenscript.denizencore.utilities.Deprecations; +import org.bukkit.Material; import org.bukkit.block.BlockState; import org.bukkit.block.Chest; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BlockStateMeta; +import org.bukkit.inventory.meta.BundleMeta; +import org.bukkit.inventory.meta.ItemMeta; +import java.util.Arrays; import java.util.Map; public class ItemInventory implements Property { public static boolean describes(ObjectTag item) { - return item instanceof ItemTag - && ((ItemTag) item).getItemMeta() instanceof BlockStateMeta - && ((BlockStateMeta) ((ItemTag) item).getItemMeta()).getBlockState() instanceof InventoryHolder; + if (!(item instanceof ItemTag)) { + return false; + } + ItemMeta meta = ((ItemTag) item).getItemMeta(); + if (meta instanceof BlockStateMeta + && ((BlockStateMeta) meta).getBlockState() instanceof InventoryHolder) { + return true; + } + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_17) && meta instanceof BundleMeta) { + return true; + } + return false; } public static ItemInventory getFrom(ObjectTag _item) { @@ -90,17 +105,29 @@ public ObjectTag getObjectAttribute(Attribute attribute) { } public ListTag getInventoryContents() { - InventoryTag inventory = getItemInventory(); - if (inventory == null) { - return null; + if (item.getItemMeta() instanceof BlockStateMeta) { + InventoryTag inventory = getItemInventory(); + if (inventory == null) { + return null; + } + return InventoryContents.getFrom(inventory).getContents(false); + } + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_17)) { + ListTag result = new ListTag(); + for (ItemStack item : ((BundleMeta) item.getItemMeta()).getItems()) { + if (item != null && item.getType() != Material.AIR) { + result.addObject(new ItemTag(item)); + } + } + return result; } - return InventoryContents.getFrom(inventory).getContents(false); + return null; } @Override public String getPropertyString() { - ListTag inv = getInventoryContents(); - return inv != null ? inv.identify() : null; + ListTag items = getInventoryContents(); + return items != null ? items.identify() : null; } @Override @@ -131,20 +158,26 @@ public void adjust(Mechanism mechanism) { if (inventoryPair == null || inventoryPair.getValue().getInventory() == null) { return; } - BlockStateMeta bsm = ((BlockStateMeta) item.getItemMeta()); - InventoryHolder invHolder = (InventoryHolder) bsm.getBlockState(); ListTag items = InventoryContents.getFrom(inventoryPair.getValue()).getContents(false); - if (items.size() > invHolder.getInventory().getSize()) { - mechanism.echoError("Invalid inventory_contents input size; expected " + invHolder.getInventory().getSize() + " or less."); - return; - } ItemStack[] itemArray = new ItemStack[items.size()]; for (int i = 0; i < itemArray.length; i++) { itemArray[i] = ((ItemTag) items.objectForms.get(i)).getItemStack().clone(); } - invHolder.getInventory().setContents(itemArray); - bsm.setBlockState((BlockState) invHolder); - item.setItemMeta(bsm); + if (item.getItemMeta() instanceof BlockStateMeta) { + BlockStateMeta bsm = ((BlockStateMeta) item.getItemMeta()); + InventoryHolder invHolder = (InventoryHolder) bsm.getBlockState(); + if (items.size() > invHolder.getInventory().getSize()) { + mechanism.echoError("Invalid inventory_contents input size; expected " + invHolder.getInventory().getSize() + " or less."); + return; + } + invHolder.getInventory().setContents(itemArray); + bsm.setBlockState((BlockState) invHolder); + item.setItemMeta(bsm); + } + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_17)) { + BundleMeta bundle = (BundleMeta) item.getItemMeta(); + bundle.setItems(Arrays.asList(itemArray)); + } } } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java index 0c937887e8..56fc40d8c5 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java @@ -80,7 +80,9 @@ private ItemRawNBT(ItemTag _item) { // Stew specific "Effects", // Lodestone compass specific - "LodestoneDimension", "LodestonePos", "LodestoneTracked" + "LodestoneDimension", "LodestonePos", "LodestoneTracked", + // Bundle specific + "Items" }; defaultNbtKeys = new StringHolder[defaultNbtKeysRaw.length]; for (int i = 0; i < defaultNbtKeysRaw.length; i++) { @@ -116,6 +118,8 @@ public MapTag getFullNBTMap() { // @description // The item Raw_NBT property encodes and decodes raw NBT data. // For the sake of inter-compatibility, a special standard format is used to preserve data types. + // This system exists in Denizen primarily for the sake of compatibility with external plugins. + // It should not be used in any scripts that don't rely on data from external plugins. // // NBT Tags are encoded as follows: // CompoundTag: (a fully formed MapTag) diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/packets/DenizenPacketHandler.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/packets/DenizenPacketHandler.java index bf0fe4632e..433d6eb501 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/packets/DenizenPacketHandler.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/packets/DenizenPacketHandler.java @@ -74,6 +74,7 @@ public boolean receivePacket(final Player player, final PacketInSteerVehicle ste static { raisableItems.add(Material.SHIELD); raisableItems.add(Material.CROSSBOW); + raisableItems.add(Material.BOW); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_17)) { raisableItems.add(Material.valueOf("SPYGLASS")); }