From 2a1ea837ca4f21bc86dfc129a0049bb0d9c2ffdd Mon Sep 17 00:00:00 2001 From: Talamar1 Date: Thu, 11 Jun 2015 08:26:24 -0400 Subject: [PATCH] Rewrote "on entity death" event in new ScriptEvent format. --- .../java/net/aufdemrand/denizen/Denizen.java | 2 +- .../events/core/EntityDeathSmartEvent.java | 185 -------------- .../scriptevents/EntityDeathScriptEvent.java | 232 ++++++++++++++++++ 3 files changed, 233 insertions(+), 186 deletions(-) delete mode 100644 src/main/java/net/aufdemrand/denizen/events/core/EntityDeathSmartEvent.java create mode 100644 src/main/java/net/aufdemrand/denizen/events/scriptevents/EntityDeathScriptEvent.java diff --git a/src/main/java/net/aufdemrand/denizen/Denizen.java b/src/main/java/net/aufdemrand/denizen/Denizen.java index 8b1efc00e1..d281df70bc 100644 --- a/src/main/java/net/aufdemrand/denizen/Denizen.java +++ b/src/main/java/net/aufdemrand/denizen/Denizen.java @@ -569,7 +569,6 @@ public void onEnable() { // Register all the 'Core' SmartEvents. OldEventManager.registerSmartEvent(new CommandSmartEvent()); OldEventManager.registerSmartEvent(new CuboidEnterExitSmartEvent()); - OldEventManager.registerSmartEvent(new EntityDeathSmartEvent()); OldEventManager.registerSmartEvent(new EntityInteractSmartEvent()); OldEventManager.registerSmartEvent(new EntitySpawnSmartEvent()); OldEventManager.registerSmartEvent(new FlagSmartEvent()); @@ -595,6 +594,7 @@ public void onEnable() { ScriptEvent.registerScriptEvent(new ChunkUnloadScriptEvent()); ScriptEvent.registerScriptEvent(new EntityCombustsScriptEvent()); ScriptEvent.registerScriptEvent(new EntityDamagedScriptEvent()); + ScriptEvent.registerScriptEvent(new EntityDeathScriptEvent()); ScriptEvent.registerScriptEvent(new EntityDespawnScriptEvent()); ScriptEvent.registerScriptEvent(new EntityKilledScriptEvent()); ScriptEvent.registerScriptEvent(new EntityTeleportScriptEvent()); diff --git a/src/main/java/net/aufdemrand/denizen/events/core/EntityDeathSmartEvent.java b/src/main/java/net/aufdemrand/denizen/events/core/EntityDeathSmartEvent.java deleted file mode 100644 index f492d4b4f4..0000000000 --- a/src/main/java/net/aufdemrand/denizen/events/core/EntityDeathSmartEvent.java +++ /dev/null @@ -1,185 +0,0 @@ -package net.aufdemrand.denizen.events.core; - -import net.aufdemrand.denizen.BukkitScriptEntryData; -import net.aufdemrand.denizencore.events.OldEventManager; -import net.aufdemrand.denizencore.events.OldSmartEvent; -import net.aufdemrand.denizen.objects.*; -import net.aufdemrand.denizencore.objects.*; -import net.aufdemrand.denizen.utilities.DenizenAPI; -import net.aufdemrand.denizen.utilities.debugging.dB; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class EntityDeathSmartEvent implements OldSmartEvent, Listener { - - - /////////////////// - // SMARTEVENT METHODS - /////////////// - - - @Override - public boolean shouldInitialize(Set events) { - - // Loop through event names from loaded world script events - for (String event : events) { - - // Use a regex pattern to narrow down matches - Matcher m = Pattern.compile("on (e@)?\\w+ (death|dies)", Pattern.CASE_INSENSITIVE) - .matcher(event); - - if (m.matches()) { - // Event names are simple enough to just go ahead and pass on any match. - return true; - } - } - // No matches at all, just fail. - return false; - } - - - @Override - public void _initialize() { - DenizenAPI.getCurrentInstance().getServer().getPluginManager() - .registerEvents(this, DenizenAPI.getCurrentInstance()); - dB.log("Loaded Entity Death SmartEvent."); - } - - - @Override - public void breakDown() { - EntityDeathEvent.getHandlerList().unregister(this); - } - - ////////////// - // MECHANICS - /////////// - - // <--[event] - // @Events - // entity death - // entity dies - // dies - // death - // - // @Triggers when an entity dies. - // @Context - // returns the dEntity that died. - // returns the dEntity damaging the other entity, if any. - // returns an Element of a player's death message. - // returns the dInventory of the entity if it was a player. - // returns an Element of the cause of the death. - // returns a dList of all pending item drops. - // - // @Determine - // Element(String) to change the death message. - // "NO_DROPS" to specify that any drops should be removed. - // "NO_DROPS_OR_XP" to specify that any drops or XP orbs should be removed. - // "NO_XP" to specify that any XP orbs should be removed. - // dList(dItem) to specify new items to be dropped. - // Element(Number) to specify the new amount of XP to be dropped. - // - // --> - @EventHandler - public void entityDeath(EntityDeathEvent event) { - - dPlayer player = null; - dNPC npc = null; - - Map context = new HashMap(); - dEntity entity = new dEntity(event.getEntity()); - context.put("entity", entity.getDenizenObject()); - if (event.getEntity().getLastDamageCause() != null) - context.put("cause", new Element(event.getEntity().getLastDamageCause().getCause().toString())); - dList drops_dlist = new dList(); - for (ItemStack stack: event.getDrops()) { - if (stack == null) { - drops_dlist.add("i@air"); - } - else { - drops_dlist.add(new dItem(stack).identify()); - } - } - context.put("drops", drops_dlist); - - if (entity.isCitizensNPC()) npc = entity.getDenizenNPC(); - else if (entity.isPlayer()) player = entity.getDenizenPlayer(); - - // If this entity has a stored killer, get it and then - // remove it from the entityKillers map - EntityDamageEvent lastDamage = entity.getBukkitEntity().getLastDamageCause(); - if (lastDamage != null && lastDamage instanceof EntityDamageByEntityEvent) { - context.put("damager", new dEntity(((EntityDamageByEntityEvent) lastDamage).getDamager()).getDenizenObject()); - } - - PlayerDeathEvent subEvent = null; - - if (event instanceof PlayerDeathEvent) { - subEvent = (PlayerDeathEvent) event; - context.put("message", new Element(subEvent.getDeathMessage())); - - // Null check to prevent NPCs from causing an NPE - if (player != null) - context.put("inventory", player.getInventory()); - } - - List determinations = OldEventManager.doEvents(Arrays.asList - ("entity dies", - entity.identifyType() + " dies", - entity.identifySimple() + " dies", - entity.identifySimple() + " death", - "entity death", - entity.identifyType() + " death"), - new BukkitScriptEntryData(player, npc), context, true); - - for (String determination : determinations) { - // Handle message - if (determination.toUpperCase().startsWith("DROPS ")) { - determination = determination.substring(6); - } - - if (determination.toUpperCase().startsWith("NO_DROPS")) { - event.getDrops().clear(); - if (determination.endsWith("_OR_XP")) { - event.setDroppedExp(0); - } - } else if (determination.toUpperCase().equals("NO_XP")) { - event.setDroppedExp(0); - } - - // XP - else if (aH.Argument.valueOf(determination) - .matchesPrimitive(aH.PrimitiveType.Integer)) { - int xp = aH.Argument.valueOf(determination).asElement().asInt(); - event.setDroppedExp(xp); - } - - // Drops - else if (aH.Argument.valueOf(determination).matchesArgumentList(dItem.class)) { - dList drops = dList.valueOf(determination); - drops.filter(dItem.class); - event.getDrops().clear(); - for (String drop : drops) { - dItem item = dItem.valueOf(drop); - if (item != null) - event.getDrops().add(item.getItemStack()); - } - } - - else if (!determination.toUpperCase().equals("NONE")) { - if (event instanceof PlayerDeathEvent) { - subEvent.setDeathMessage(determination); - } - } - } - } -} diff --git a/src/main/java/net/aufdemrand/denizen/events/scriptevents/EntityDeathScriptEvent.java b/src/main/java/net/aufdemrand/denizen/events/scriptevents/EntityDeathScriptEvent.java new file mode 100644 index 0000000000..a5e9edc614 --- /dev/null +++ b/src/main/java/net/aufdemrand/denizen/events/scriptevents/EntityDeathScriptEvent.java @@ -0,0 +1,232 @@ +package net.aufdemrand.denizen.events.scriptevents; + +import net.aufdemrand.denizen.objects.*; +import net.aufdemrand.denizencore.events.ScriptEvent; +import net.aufdemrand.denizencore.objects.*; +import net.aufdemrand.denizen.utilities.DenizenAPI; +import net.aufdemrand.denizencore.scripts.containers.ScriptContainer; +import net.aufdemrand.denizencore.utilities.CoreUtilities; + +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; + +public class EntityDeathScriptEvent extends ScriptEvent implements Listener { + + // <--[event] + // @Events + // entity death + // entity dies + // dies + // death + // + // @Triggers when an entity dies. + // + // @Context + // returns the dEntity that died. + // returns the dEntity damaging the other entity, if any. + // returns an Element of a player's death message. + // returns the dInventory of the entity if it was a player. + // returns an Element of the cause of the death. + // returns a dList of all pending item drops. + // Causes: <@link url https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/event/entity/EntityDamageEvent.DamageCause.html> + // + // @Determine + // Element(String) to change the death message. + // "NO_DROPS" to specify that any drops should be removed. + // "NO_DROPS_OR_XP" to specify that any drops or XP orbs should be removed. + // "NO_XP" to specify that any XP orbs should be removed. + // dList(dItem) to specify new items to be dropped. + // Element(Number) to specify the new amount of XP to be dropped. + // + // --> + public EntityDeathScriptEvent() { + instance = this; + } + public static EntityDeathScriptEvent instance; + public dEntity entity; + public dEntity damager; + public Element message; + public dInventory inventory; + public Element cause; + public dList drops; + public Integer xp; + public boolean changed_drops; + public EntityDeathEvent event; + + @Override + public boolean couldMatch(ScriptContainer scriptContainer, String s) { + String lower = CoreUtilities.toLowerCase(s); + return lower.contains("dies") + || lower.contains("death"); + } + + @Override + public boolean matches(ScriptContainer scriptContainer, String s) { + String lower = CoreUtilities.toLowerCase(s); + String entityType = entity.identifyType(); + String entityName = entity.identifySimple(); + + return lower.equals("entity dies") + || lower.equals("entity death") + || lower.equals(entityType + " dies") + || lower.equals(entityType + " death") + || lower.equals(entityName + " dies") + || lower.equals(entityName + " death"); + } + + @Override + public String getName() { + return "EntityDies"; + } + + @Override + public void init() { + Bukkit.getServer().getPluginManager().registerEvents(this, DenizenAPI.getCurrentInstance()); + } + + @Override + public void destroy() { + EntityDeathEvent.getHandlerList().unregister(this); + } + + @Override + public boolean applyDetermination(ScriptContainer container, String determination) { + // finish this + String lower = CoreUtilities.toLowerCase(determination); + + // Deprecated?? This isn't listed in the meta + if (lower.startsWith("drops ")) { + lower = lower.substring(6); + } + + //Handle no_drops and no_drops_or_xp and just no_xp + if (lower.startsWith("no_drops")) { + drops.clear(); + changed_drops = true; + if (lower.endsWith("_or_xp")) { + xp = 0; + } + } + else if (lower.equals("no_xp")) { + xp = 0; + } + // Change xp value only + else if (aH.Argument.valueOf(lower) + .matchesPrimitive(aH.PrimitiveType.Integer)) { + xp = aH.Argument.valueOf(lower).asElement().asInt(); + } + + // Change dropped items if dList detected + else if (aH.Argument.valueOf(lower).matchesArgumentList(dItem.class)) { + drops.clear(); + changed_drops = true; + dList drops_list = dList.valueOf(lower); + drops_list.filter(dItem.class); + for (String drop : drops_list) { + dItem item = dItem.valueOf(drop); + if (item != null) + drops.add(item.identify()); + } + } + + // String containing new Death Message + else if (!lower.equals("none")) { + if (event instanceof PlayerDeathEvent) { + message = new Element(determination); + } + } + else { + return super.applyDetermination(container, determination); + } + return true; + } + + @Override + public HashMap getContext() { + HashMap context = super.getContext(); + context.put("entity", entity); + if (damager != null) { + context.put("damager", damager); + } + if (message != null) { + context.put("message", message); + } + if (inventory != null) { + context.put("inventory", inventory); + } + context.put("cause", cause); + if (drops != null) { + context.put("drops", drops); + } + return context; + } + + @EventHandler + public void onEntityDeath(EntityDeathEvent event) { + entity = new dEntity(event.getEntity()); + + dPlayer player = null; + + if (entity.isPlayer()) { + player = entity.getDenizenPlayer(); + } + + // If this entity has a stored killer, get it and then + // remove it from the entityKillers map + EntityDamageEvent lastDamage = entity.getBukkitEntity().getLastDamageCause(); + if (lastDamage != null && lastDamage instanceof EntityDamageByEntityEvent) { + damager = new dEntity(((EntityDamageByEntityEvent) lastDamage).getDamager()); + } + + message = null; + PlayerDeathEvent subEvent = null; + if (event instanceof PlayerDeathEvent) { + subEvent = (PlayerDeathEvent) event; + message = new Element(subEvent.getDeathMessage()); + + // Null check to prevent NPCs from causing an NPE + if (player != null) { + inventory = player.getInventory(); + } + } + + if (event.getEntity().getLastDamageCause() != null) { + cause = new Element(event.getEntity().getLastDamageCause().getCause().toString()); + } + + drops = new dList(); + for (ItemStack stack: event.getDrops()) { + if (stack == null) { + drops.add("i@air"); + } + else { + drops.add(new dItem(stack).identify()); + } + } + changed_drops = false; + xp = event.getDroppedExp(); + this.event = event; + fire(); + + event.setDroppedExp(xp); + if (changed_drops) { + for (String drop : drops) { + dItem item = dItem.valueOf(drop); + if (item != null) { + event.getDrops().add(item.getItemStack()); + } + } + } + if (message != null) { + subEvent.setDeathMessage(message.asString()); + } + } +}