Skip to content

Commit

Permalink
ItemInventory: operate as an item list, not inventory objects
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Apr 25, 2020
1 parent b6dc5a3 commit 82877d0
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 28 deletions.
@@ -1,17 +1,23 @@
package com.denizenscript.denizen.objects.properties.item;

import com.denizenscript.denizen.objects.properties.inventory.InventoryContents;
import com.denizenscript.denizen.utilities.Conversion;
import com.denizenscript.denizen.utilities.debugging.Debug;
import com.denizenscript.denizen.objects.InventoryTag;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizencore.objects.Mechanism;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ListTag;
import com.denizenscript.denizencore.objects.properties.Property;
import com.denizenscript.denizencore.tags.Attribute;
import com.denizenscript.denizencore.utilities.Deprecations;
import org.bukkit.block.BlockState;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BlockStateMeta;

import java.util.Map;

public class ItemInventory implements Property {

public static boolean describes(ObjectTag item) {
Expand All @@ -30,11 +36,11 @@ public static ItemInventory getFrom(ObjectTag _item) {
}

public static final String[] handledTags = new String[] {
"inventory"
"inventory", "inventory_contents"
};

public static final String[] handledMechs = new String[] {
"inventory"
"inventory", "inventory_contents"
};

private InventoryTag getItemInventory() {
Expand All @@ -55,59 +61,79 @@ public ObjectTag getObjectAttribute(Attribute attribute) {
}

// <--[tag]
// @attribute <ItemTag.inventory>
// @returns InventoryTag
// @mechanism ItemTag.inventory
// @attribute <ItemTag.inventory_contents>
// @returns ListTag(ItemTag)
// @mechanism ItemTag.inventory_contents
// @group properties
// @description
// Returns a InventoryTag of a container item.
// Returns a list of the contents of the inventory of a container item.
// -->
if (attribute.startsWith("inventory_contents")) {
return getInventoryContents().getObjectAttribute(attribute.fulfill(1));
}
if (attribute.startsWith("inventory")) {
Deprecations.itemInventoryTag.warn(attribute.context);
return getItemInventory().getObjectAttribute(attribute.fulfill(1));
}

return null;
}

public ListTag getInventoryContents() {
InventoryTag inventory = getItemInventory();
if (inventory == null) {
return null;
}
return InventoryContents.getFrom(inventory).getContents(0);
}

@Override
public String getPropertyString() {
InventoryTag inv = getItemInventory();
ListTag inv = getInventoryContents();
return inv != null ? inv.identify() : null;
}

@Override
public String getPropertyId() {
return "inventory";
return "inventory_contents";
}

@Override
public void adjust(Mechanism mechanism) {

// <--[mechanism]
// @object ItemTag
// @name inventory
// @input InventoryTag
// @name inventory_contents
// @input ListTag(ItemTag)
// @description
// Sets the item's inventory contents.
// @tags
// <ItemTag.inventory>
// <ItemTag.inventory_contents>
// -->
if (mechanism.matches("inventory") && mechanism.requireObject(InventoryTag.class)) {
InventoryTag inventory = mechanism.valueAsType(InventoryTag.class);
if (inventory == null || inventory.getInventory() == null) {
if ((mechanism.matches("inventory_contents") || mechanism.matches("inventory")) && mechanism.hasValue()) {
if (mechanism.matches("inventory")) {
Deprecations.itemInventoryTag.warn(mechanism.context);
}
Map.Entry<Integer, InventoryTag> inventoryPair = Conversion.getInventory(mechanism.getValue().asString(), mechanism.context);
if (inventoryPair == null || inventoryPair.getValue().getInventory() == null) {
return;
}

ItemStack itemStack = item.getItemStack();
BlockStateMeta bsm = ((BlockStateMeta) itemStack.getItemMeta());
InventoryHolder invHolder = (InventoryHolder) bsm.getBlockState();

if (inventory.getSize() > invHolder.getInventory().getSize()) {
Debug.echoError("Invalid InventoryTag size; expected " + invHolder.getInventory().getSize() + " or less.");
ListTag items = InventoryContents.getFrom(inventoryPair.getValue()).getContents(0);
if (items.size() > invHolder.getInventory().getSize()) {
Debug.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(inventory.getContents());
invHolder.getInventory().setContents(itemArray);
bsm.setBlockState((BlockState) invHolder);
itemStack.setItemMeta(bsm);
}
Expand Down
@@ -1,10 +1,10 @@
package com.denizenscript.denizen.utilities;

import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizen.objects.*;
import com.denizenscript.denizencore.objects.Argument;
import com.denizenscript.denizencore.objects.core.ListTag;
import com.denizenscript.denizencore.scripts.ScriptEntry;
import com.denizenscript.denizencore.tags.TagContext;
import org.bukkit.Color;
import org.bukkit.entity.Entity;
import org.bukkit.inventory.ItemStack;
Expand All @@ -21,7 +21,6 @@ public class Conversion {
* @param colors The list of ColorTags
* @return The list of Colors
*/

public static List<Color> convertColors(List<ColorTag> colors) {

List<Color> newList = new ArrayList<>();
Expand All @@ -39,7 +38,6 @@ public static List<Color> convertColors(List<ColorTag> colors) {
* @param items The list of ItemTags
* @return The list of ItemStacks
*/

public static List<ItemStack> convertItems(List<ItemTag> items) {

List<ItemStack> newList = new ArrayList<>();
Expand All @@ -57,7 +55,6 @@ public static List<ItemStack> convertItems(List<ItemTag> items) {
* @param entities The list of dEntities
* @return The list of Entities
*/

public static List<Entity> convertEntities(List<EntityTag> entities) {

List<Entity> newList = new ArrayList<>();
Expand All @@ -76,14 +73,14 @@ public static List<Entity> convertEntities(List<EntityTag> entities) {
* @param arg An argument to parse
* @return The InventoryTag retrieved by parsing the argument
*/

public static AbstractMap.SimpleEntry<Integer, InventoryTag> getInventory(Argument arg, ScriptEntry scriptEntry) {
String string = arg.getValue();
return getInventory(arg.getValue(), scriptEntry.context);
}

public static AbstractMap.SimpleEntry<Integer, InventoryTag> getInventory(String string, TagContext context) {
if (InventoryTag.matches(string)) {
BukkitScriptEntryData data = (BukkitScriptEntryData) scriptEntry.entryData;
if (data != null) {
InventoryTag inv = InventoryTag.valueOf(string, data.getTagContext());
if (context != null) {
InventoryTag inv = InventoryTag.valueOf(string, context);
if (inv != null) {
return new AbstractMap.SimpleEntry<>(inv.getContents().length, inv);
}
Expand All @@ -95,8 +92,8 @@ public static AbstractMap.SimpleEntry<Integer, InventoryTag> getInventory(Argume
}
}
}
else if (arg.matchesArgumentList(ItemTag.class)) {
List<ItemTag> list = ListTag.valueOf(string, scriptEntry.getContext()).filter(ItemTag.class, scriptEntry);
else if (ListTag.valueOf(string, context).containsObjectsFrom(ItemTag.class)) {
List<ItemTag> list = ListTag.valueOf(string, context).filter(ItemTag.class, context);
ItemStack[] items = convertItems(list).toArray(new ItemStack[list.size()]);
InventoryTag inventory = new InventoryTag(Math.min(InventoryTag.maxSlots, (items.length / 9) * 9 + 9));
inventory.setContents(items);
Expand Down

0 comments on commit 82877d0

Please sign in to comment.