From 708cd0d58281785970411e45d72ef874a2502e11 Mon Sep 17 00:00:00 2001 From: David Cernat Date: Mon, 29 Jul 2013 23:31:46 +0300 Subject: [PATCH] Add some more item world events. Make "on entity targets entity" use delayed targeting task instead of event's target method. --- .../net/aufdemrand/denizen/objects/aH.java | 5 +- .../net/aufdemrand/denizen/objects/dItem.java | 22 +++++++- .../net/aufdemrand/denizen/objects/dList.java | 4 ++ .../containers/core/WorldScriptHelper.java | 53 ++++++++++++++----- 4 files changed, 68 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/aufdemrand/denizen/objects/aH.java b/src/main/java/net/aufdemrand/denizen/objects/aH.java index e5b75f721c..d1cf7110bd 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/aH.java +++ b/src/main/java/net/aufdemrand/denizen/objects/aH.java @@ -158,8 +158,9 @@ public T asType(Class clazz) { .invoke(null, value); // dB.log("Created: " + clazz.cast(arg).debug()); - - return (T) clazz.cast(arg).setPrefix(prefix); + if (arg != null) { + return (T) clazz.cast(arg).setPrefix(prefix); + } } catch (IllegalAccessException e) { e.printStackTrace(); diff --git a/src/main/java/net/aufdemrand/denizen/objects/dItem.java b/src/main/java/net/aufdemrand/denizen/objects/dItem.java index 0ee04e9d15..7c4cbf11bd 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dItem.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dItem.java @@ -5,7 +5,6 @@ import net.aufdemrand.denizen.scripts.containers.core.ItemScriptContainer; import net.aufdemrand.denizen.tags.Attribute; import net.aufdemrand.denizen.utilities.debugging.dB; -import net.aufdemrand.denizen.utilities.nbt.CustomNBT; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -389,6 +388,25 @@ public String getLore(String prefix) { return ""; } + /** + * Check whether this item contains the lore specific + * to item scripts. + * + * @return True if it does, otherwise false + * + */ + public boolean isItemscript() { + + if (containsLore("§0id:")) { + return true; + } + return false; + } + + public String getMaterial() { + return getItemStack().getType().name().toLowerCase(); + } + public void setAmount(int value) { if (item != null) item.setAmount(value); @@ -479,7 +497,7 @@ public String identify() { return "i@" + getSaved(this); // If not a saved item, but is a custom item, return the script id - else if (containsLore("§0id:")) { + else if (isItemscript()) { return "i@" + getLore("§0id:"); } } diff --git a/src/main/java/net/aufdemrand/denizen/objects/dList.java b/src/main/java/net/aufdemrand/denizen/objects/dList.java index b0241d5c1e..a72161e659 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dList.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dList.java @@ -270,6 +270,10 @@ public String getAttribute(Attribute attribute) { else return new Element(item).getAttribute(attribute.fulfill(1)); } + + if (attribute.startsWith("last")) { + return new Element(get(size() - 1)).getAttribute(attribute.fulfill(1)); + } if (attribute.startsWith("prefix")) return new Element(prefix) diff --git a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/WorldScriptHelper.java b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/WorldScriptHelper.java index cc58288f3c..b15eaa088c 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/WorldScriptHelper.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/WorldScriptHelper.java @@ -109,9 +109,9 @@ public static String doEvents(List eventNames, dNPC npc, Player player, if (script == null) continue; for (String eventName : eventNames) { - + if (!script.contains("EVENTS.ON " + eventName.toUpperCase())) continue; - + // Fetch script from Event // // Note: a "new dPlayer(null)" will not be null itself, @@ -175,12 +175,17 @@ public void blockBreak(BlockBreakEvent event) { events.add("player breaks " + blockType + " with " + item.identify()); if (item.identify().equals(item.identify().split(":")[0]) == false) { - events.add("player breaks block with " + item.identify().split(":")[0]); events.add("player breaks " + blockType + " with " + item.identify().split(":")[0]); } + if (item.isItemscript()) { + events.add("player breaks block with itemscript " + + item.getMaterial()); + events.add("player breaks " + blockType + " with itemscript " + + item.getMaterial()); + } String determination = doEvents(events, null, event.getPlayer(), context); @@ -781,11 +786,15 @@ public void entityTarget(EntityTargetEvent event) { // and endermen for instance else if (dEntity.matches(determination)) { - dEntity newTarget = dEntity.valueOf(determination); + final dEntity attacker = new dEntity(entity); + final dEntity newTarget = dEntity.valueOf(determination); - if (newTarget.isSpawned()) { - event.setTarget(newTarget.getBukkitEntity()); - } + Bukkit.getScheduler().scheduleSyncDelayedTask(DenizenAPI.getCurrentInstance(), new Runnable() { + public void run() { + + attacker.target(newTarget.getLivingEntity()); + } + }, 1); } } @@ -883,12 +892,17 @@ public void inventoryClickEvent(InventoryClickEvent event) { item.identify() + " in " + type + " inventory"); if (item.identify().equals(item.identify().split(":")[0]) == false) { - events.add(interaction + " on " + item.identify().split(":")[0] + " in inventory"); events.add(interaction + " on " + item.identify().split(":")[0] + " in " + type + " inventory"); } + if (item.isItemscript()) { + events.add(interaction + " on " + + item.getMaterial() + " in inventory"); + events.add(interaction + " on " + + item.getMaterial() + " in " + type + " inventory"); + } } String determination = doEvents(events, null, player, context); @@ -1139,9 +1153,11 @@ else if (action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK) events.add(interaction + " with " + item.identify()); if (item.identify().equals(item.identify().split(":")[0]) == false) { - events.add(interaction + " with " + item.identify().split(":")[0]); } + if (item.isItemscript()) { + events.add(interaction + " with itemscript " + item.getMaterial()); + } } if (event.hasBlock()) { @@ -1156,9 +1172,11 @@ else if (action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK) events.add(interaction + " with " + item.identify()); if (item.identify().equals(item.identify().split(":")[0]) == false) { - events.add(interaction + " with " + item.identify().split(":")[0]); } + if (item.isItemscript()) { + events.add(interaction + " with itemscript " + item.getMaterial()); + } } } @@ -1202,12 +1220,17 @@ else if (entity instanceof Player) { item.identify()); if (item.identify().equals(item.identify().split(":")[0]) == false) { - events.add("player right clicks entity with " + item.identify().split(":")[0]); events.add("player right clicks " + entityType + " with " + item.identify().split(":")[0]); } + if (item.isItemscript()) { + events.add("player right clicks entity with itemscript " + + item.getMaterial()); + events.add("player right clicks " + entityType + " with itemscript " + + item.getMaterial()); + } if (entity instanceof ItemFrame) { dItem itemFrame = new dItem(((ItemFrame) entity).getItem()); @@ -1221,6 +1244,10 @@ else if (entity instanceof Player) { events.add("player right clicks " + entityType + " " + itemFrame.identify().split(":")[0]); } + if (itemFrame.isItemscript()) { + events.add("player right clicks " + entityType + + " itemscript " + item.getMaterial()); + } } determination = doEvents(events, npc, event.getPlayer(), context); @@ -1241,9 +1268,11 @@ public void playerItemConsume(PlayerItemConsumeEvent event) { events.add("player consumes " + item.identify()); if (item.identify().equals(item.identify().split(":")[0]) == false) { - events.add("player consumes " + item.identify().split(":")[0]); } + if (item.isItemscript()) { + events.add("player consumes itemscript " + item.getMaterial()); + } String determination = doEvents(events, null, event.getPlayer(), context);