From 22ab3a20e28aaf32a1de8bcece35da88538f314a Mon Sep 17 00:00:00 2001 From: Talamar1 Date: Sat, 20 Jun 2015 22:37:01 -0400 Subject: [PATCH] Rewrote "on entity shoots bow" event in new ScriptEvent format. --- .../java/net/aufdemrand/denizen/Denizen.java | 1 + .../events/entity/EntityShootsBowEvent.java | 170 ++++++++++++++++++ .../core/BukkitWorldScriptHelper.java | 90 ---------- 3 files changed, 171 insertions(+), 90 deletions(-) create mode 100644 src/main/java/net/aufdemrand/denizen/events/entity/EntityShootsBowEvent.java diff --git a/src/main/java/net/aufdemrand/denizen/Denizen.java b/src/main/java/net/aufdemrand/denizen/Denizen.java index 8a692002c0..130fb631a9 100644 --- a/src/main/java/net/aufdemrand/denizen/Denizen.java +++ b/src/main/java/net/aufdemrand/denizen/Denizen.java @@ -609,6 +609,7 @@ public void onEnable() { ScriptEvent.registerScriptEvent(new EntityHealsScriptEvent()); ScriptEvent.registerScriptEvent(new EntityInteractScriptEvent()); ScriptEvent.registerScriptEvent(new EntityKilledScriptEvent()); + ScriptEvent.registerScriptEvent(new EntityShootsBowEvent()); ScriptEvent.registerScriptEvent(new EntitySpawnScriptEvent()); ScriptEvent.registerScriptEvent(new EntityTargetsScriptEvent()); ScriptEvent.registerScriptEvent(new EntityTeleportScriptEvent()); diff --git a/src/main/java/net/aufdemrand/denizen/events/entity/EntityShootsBowEvent.java b/src/main/java/net/aufdemrand/denizen/events/entity/EntityShootsBowEvent.java new file mode 100644 index 0000000000..a192e27c4b --- /dev/null +++ b/src/main/java/net/aufdemrand/denizen/events/entity/EntityShootsBowEvent.java @@ -0,0 +1,170 @@ +package net.aufdemrand.denizen.events.entity; + +import net.aufdemrand.denizen.BukkitScriptEntryData; +import net.aufdemrand.denizen.objects.dEntity; +import net.aufdemrand.denizen.objects.dItem; +import net.aufdemrand.denizen.utilities.Conversion; +import net.aufdemrand.denizen.utilities.DenizenAPI; +import net.aufdemrand.denizen.utilities.entity.Position; +import net.aufdemrand.denizencore.events.ScriptEvent; +import net.aufdemrand.denizencore.objects.Element; +import net.aufdemrand.denizencore.objects.aH; +import net.aufdemrand.denizencore.objects.dList; +import net.aufdemrand.denizencore.objects.dObject; +import net.aufdemrand.denizencore.scripts.ScriptEntryData; +import net.aufdemrand.denizencore.scripts.containers.ScriptContainer; +import net.aufdemrand.denizencore.utilities.CoreUtilities; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Entity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityShootBowEvent; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +public class EntityShootsBowEvent extends ScriptEvent implements Listener { + + // <--[event] + // @Events + // entity shoots bow + // shoots bow + // entity shoots + // shoots + // + // @Cancellable true + // + // @Triggers when an entity shoots something out of a bow. + // + // @Context + // returns the dEntity that shot the bow. + // returns a dEntity of the projectile. + // returns the bow item used to shoot. + // returns the force of the shot. + // + // @Determine + // dList(dEntity) to change the projectile(s) being shot. + // --> + + public EntityShootsBowEvent() { + instance = this; + } + + public static EntityShootsBowEvent instance; + + public dEntity entity; + public Float force; + public dItem bow; + public dEntity projectile; + public EntityShootBowEvent event; + + @Override + public boolean couldMatch(ScriptContainer scriptContainer, String s) { + String lower = CoreUtilities.toLowerCase(s); + String cmd = CoreUtilities.getXthArg(1, lower); + String entOne = CoreUtilities.getXthArg(0, lower); + String entTwo = lower.contains(" by ") ? CoreUtilities.getXthArg(3, lower): CoreUtilities.getXthArg(2, lower); + List types = Arrays.asList("entity", "player", "npc"); + return ((types.contains(entOne) || dEntity.matches(entOne)) + && cmd.equals("shoots")); + } + + @Override + public boolean matches(ScriptContainer scriptContainer, String s) { + String lower = CoreUtilities.toLowerCase(s); + String attacker = CoreUtilities.getXthArg(0, lower); + String item = CoreUtilities.getXthArg(2, lower); + + if (!entity.matchesEntity(attacker)) { + return false; + } + + if (!item.equals("bow") + && (!item.equals(bow.identifyNoIdentifier()) && !item.equals(bow.identifySimpleNoIdentifier()))) { + return false; + } + + return true; + } + + @Override + public String getName() { + return "EntityShootsBow"; + } + + @Override + public void init() { + Bukkit.getServer().getPluginManager().registerEvents(this, DenizenAPI.getCurrentInstance()); + } + + @Override + public void destroy() { + EntityShootBowEvent.getHandlerList().unregister(this); + } + + @Override + public boolean applyDetermination(ScriptContainer container, String determination) { + if (aH.Argument.valueOf(determination).matchesArgumentList(dEntity.class)) { + cancelled = true; + + // Get the list of entities + Object list = dList.valueOf(determination).filter(dEntity.class); + @SuppressWarnings("unchecked") + List newProjectiles = (List) list; + // Go through all the entities, spawning/teleporting them + for (dEntity newProjectile : newProjectiles) { + newProjectile.spawnAt(entity.getEyeLocation() + .add(entity.getEyeLocation().getDirection())); + // Set the entity as the shooter of the projectile, + // where applicable + if (newProjectile.isProjectile()) { + newProjectile.setShooter(entity); + } + } + + // Mount the projectiles on top of each other + Position.mount(Conversion.convertEntities(newProjectiles)); + // Get the last entity on the list, i.e. the one at the bottom + // if there are many mounted on top of each other + Entity lastProjectile = newProjectiles.get + (newProjectiles.size() - 1).getBukkitEntity(); + // Give it the same velocity as the arrow that would + // have been shot by the bow + // Note: No, I can't explain why this has to be multiplied by three, it just does. + lastProjectile.setVelocity(event.getEntity().getLocation() + .getDirection().multiply(force)); + return true; + } + return super.applyDetermination(container, determination); + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(entity.isPlayer() ? dEntity.getPlayerFrom(event.getEntity()): null, + entity.isCitizensNPC() ? dEntity.getNPCFrom(event.getEntity()): null); + } + + @Override + public HashMap getContext() { + HashMap context = super.getContext(); + context.put("entity", entity); + context.put("force", new Element(force)); + context.put("bow", bow); + context.put("projectile", projectile); + return context; + } + + @EventHandler + public void onEntityShootsBow(EntityShootBowEvent event) { + entity = new dEntity(event.getEntity()); + force = event.getForce() * 3; + bow = new dItem(event.getBow()); + projectile = new dEntity(event.getProjectile()); + cancelled = event.isCancelled(); + this.event = event; + fire(); + event.setCancelled(cancelled); + } +} diff --git a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/BukkitWorldScriptHelper.java b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/BukkitWorldScriptHelper.java index a645f9c496..33a7d33f37 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/BukkitWorldScriptHelper.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/BukkitWorldScriptHelper.java @@ -12,11 +12,9 @@ import net.aufdemrand.denizen.objects.*; import net.aufdemrand.denizencore.objects.*; import net.aufdemrand.denizen.objects.notable.NotableManager; -import net.aufdemrand.denizen.utilities.Conversion; import net.aufdemrand.denizen.utilities.DenizenAPI; import net.aufdemrand.denizen.utilities.ScoreboardHelper; import net.aufdemrand.denizen.utilities.debugging.dB; -import net.aufdemrand.denizen.utilities.entity.Position; import net.aufdemrand.denizencore.objects.aH.Argument; import org.bukkit.*; @@ -139,94 +137,6 @@ public void timeEvent() { // Additional EVENTS ///////////////// - // <--[event] - // @Events - // entity shoots bow - // shoots bow - // entity shoots - // shoots - // - // @Triggers when an entity shoots something out of a bow. - // @Context - // returns the dEntity that shot the bow. - // returns a dEntity of the projectile. - // returns the bow item used to shoot. - // returns the force of the shot. - // - // @Determine - // "CANCELLED" to stop the entity from shooting the bow. - // dList(dEntity) to change the projectile(s) being shot. - // - // --> - @EventHandler - public void entityShootBow(EntityShootBowEvent event) { - - Map context = new HashMap(); - dPlayer player = null; - dNPC npc = null; - - dItem bow = new dItem(event.getBow()); - dEntity projectile = new dEntity(event.getProjectile()); - dEntity entity = new dEntity(event.getEntity()); - - context.put("bow", bow); - context.put("projectile", projectile); - context.put("entity", entity.getDenizenObject()); - context.put("force", new Element(event.getForce() * 3)); - - if (entity.isCitizensNPC()) npc = entity.getDenizenNPC(); - else if (entity.isPlayer()) player = entity.getDenizenPlayer(); - - String determination = doEvents(Arrays.asList - ("entity shoots bow", - "entity shoots " + bow.identifySimple(), - entity.identifyType() + " shoots bow", - entity.identifyType() + " shoots " + bow.identifySimple()), - npc, player, context, true); - - if (determination.toUpperCase().startsWith("CANCELLED")) { - event.setCancelled(true); - } - - // Don't use event.setProjectile() because it doesn't work - else if (Argument.valueOf(determination).matchesArgumentList(dEntity.class)) { - - event.setCancelled(true); - - // Get the list of entities - Object list = dList.valueOf(determination).filter(dEntity.class); - - @SuppressWarnings("unchecked") - List newProjectiles = (List) list; - - // Go through all the entities, spawning/teleporting them - for (dEntity newProjectile : newProjectiles) { - newProjectile.spawnAt(entity.getEyeLocation() - .add(entity.getEyeLocation().getDirection())); - - // Set the entity as the shooter of the projectile, - // where applicable - if (newProjectile.isProjectile()) { - newProjectile.setShooter(entity); - } - } - - // Mount the projectiles on top of each other - Position.mount(Conversion.convertEntities(newProjectiles)); - - // Get the last entity on the list, i.e. the one at the bottom - // if there are many mounted on top of each other - Entity lastProjectile = newProjectiles.get - (newProjectiles.size() - 1).getBukkitEntity(); - - // Give it the same velocity as the arrow that would - // have been shot by the bow - // Note: No, I can't explain why this has to be multiplied by three, it just does. - lastProjectile.setVelocity(event.getEntity().getLocation() - .getDirection().multiply(event.getForce() * 3)); - } - } - // <--[event] // @Events // entity tamed