From 8d5810d111ba6652a7d26f5811999516a4fdb969 Mon Sep 17 00:00:00 2001 From: mcmonkey4eva Date: Tue, 18 Nov 2014 13:32:22 -0800 Subject: [PATCH] Recode inventory.contains from scratch A manually coded method rather than trusting Bukkit. --- .../denizen/objects/dInventory.java | 33 +++++++++++++++++-- .../aufdemrand/denizen/objects/dLocation.java | 2 +- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/aufdemrand/denizen/objects/dInventory.java b/src/main/java/net/aufdemrand/denizen/objects/dInventory.java index 0f98ccb828..77c8744087 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dInventory.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dInventory.java @@ -352,6 +352,33 @@ else if (inventory == null) { loadIdentifiers(); } + public boolean containsItem(dItem item, int amount) { + if (item == null) + return false; + item.setAmount(1); + String myItem = CoreUtilities.toLowerCase(item.getFullString()); + for (int i = 0; i < inventory.getSize(); i++) { + ItemStack is = inventory.getItem(i); + if (is == null) + continue; + is = is.clone(); + int count = is.getAmount(); + is.setAmount(1); + String newItem = CoreUtilities.toLowerCase(new dItem(is).getFullString()); + if (myItem.equals(newItem)) { + if (count <= amount) { + amount -= count; + if (amount == 0) + return true; + } + else if (count > amount) { + return true; + } + } + } + return false; + } + public boolean removeItem(dItem item, int amount) { if (item == null) return false; @@ -1290,7 +1317,7 @@ public String getAttribute(Attribute attribute) { } for (dItem item : dList.valueOf(attribute.getContext(1)).filter(dItem.class, attribute.getScriptEntry())) { - if (getInventory().containsAtLeast(item.getItemStack(), qty)) + if (containsItem(item, qty)) return Element.TRUE.getAttribute(attribute.fulfill(attribs)); } return Element.FALSE.getAttribute(attribute.fulfill(attribs)); @@ -1321,7 +1348,7 @@ public String getAttribute(Attribute attribute) { } for (dItem item : dList.valueOf(attribute.getContext(1)).filter(dItem.class, attribute.getScriptEntry())) { - if (!getInventory().containsAtLeast(item.getItemStack(), qty)) + if (!containsItem(item, qty)) return Element.FALSE.getAttribute(attribute.fulfill(attribs)); } return Element.TRUE.getAttribute(attribute.fulfill(attribs)); @@ -1366,7 +1393,7 @@ public String getAttribute(Attribute attribute) { if (inventory.getItem(i) != null) { dItem compare_to = new dItem(inventory.getItem(i).clone()); compare_to.setAmount(1); - if (item.identify().equalsIgnoreCase(compare_to.identify())) { + if (item.getFullString().equalsIgnoreCase(compare_to.getFullString())) { slot = i + 1; break; } diff --git a/src/main/java/net/aufdemrand/denizen/objects/dLocation.java b/src/main/java/net/aufdemrand/denizen/objects/dLocation.java index ee9637ce9c..178206eb9a 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dLocation.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dLocation.java @@ -1238,7 +1238,7 @@ else return new Element(this.distance(toLocation)) // @attribute /]> // @returns Element(Boolean) // @description - // Returns whether the location is within the cuboid. + // Returns whether the location is within the cuboid or ellipsoid. // --> if (attribute.startsWith("is_within") && attribute.hasContext(1)) {