Skip to content

Commit

Permalink
ItemTag.Inventory_Contents: bundle support
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Sep 25, 2021
1 parent 1e5b592 commit f206be9
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 19 deletions.
@@ -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;
Expand All @@ -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) {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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));
}
}
}
}
Expand Up @@ -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++) {
Expand Down Expand Up @@ -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)
Expand Down
Expand Up @@ -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"));
}
Expand Down

0 comments on commit f206be9

Please sign in to comment.