diff --git a/src/main/java/net/aufdemrand/denizen/Denizen.java b/src/main/java/net/aufdemrand/denizen/Denizen.java index 04c1155c54..b3f173007f 100644 --- a/src/main/java/net/aufdemrand/denizen/Denizen.java +++ b/src/main/java/net/aufdemrand/denizen/Denizen.java @@ -599,6 +599,7 @@ public void onEnable() { ScriptEvent.registerScriptEvent(new EntityDamagedScriptEvent()); ScriptEvent.registerScriptEvent(new EntityDeathScriptEvent()); ScriptEvent.registerScriptEvent(new EntityDespawnScriptEvent()); + ScriptEvent.registerScriptEvent(new EntityEntersPortalScriptEvent()); ScriptEvent.registerScriptEvent(new EntityExplodesScriptEvent()); ScriptEvent.registerScriptEvent(new EntityFormsBlock()); ScriptEvent.registerScriptEvent(new EntityHealsScriptEvent()); diff --git a/src/main/java/net/aufdemrand/denizen/events/scriptevents/EntityEntersPortalScriptEvent.java b/src/main/java/net/aufdemrand/denizen/events/scriptevents/EntityEntersPortalScriptEvent.java new file mode 100644 index 0000000000..a6c5e2e3d4 --- /dev/null +++ b/src/main/java/net/aufdemrand/denizen/events/scriptevents/EntityEntersPortalScriptEvent.java @@ -0,0 +1,105 @@ +package net.aufdemrand.denizen.events.scriptevents; + +import net.aufdemrand.denizen.BukkitScriptEntryData; +import net.aufdemrand.denizen.objects.dEntity; +import net.aufdemrand.denizen.objects.dLocation; +import net.aufdemrand.denizen.utilities.DenizenAPI; +import net.aufdemrand.denizencore.events.ScriptEvent; +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.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityPortalEnterEvent; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +public class EntityEntersPortalScriptEvent extends ScriptEvent implements Listener { + + // <--[event] + // @Events + // entity enters portal + // enters portal + // + // @Cancellable false + // + // @Triggers when an entity enters a portal. + // + // @Context + // returns the dEntity. + // returns the dLocation of the portal block touched by the entity. + // + // --> + + public EntityEntersPortalScriptEvent() { + instance = this; + } + public static EntityEntersPortalScriptEvent instance; + public dEntity entity; + public dLocation location; + public EntityPortalEnterEvent event; + + @Override + public boolean couldMatch(ScriptContainer scriptContainer, String s) { + String lower = CoreUtilities.toLowerCase(s); + String entOne = CoreUtilities.getXthArg(0, lower); + List types = Arrays.asList("entity", "player", "npc"); + return (types.contains(entOne) || dEntity.matches(entOne)) + && lower.contains("enters portal"); + } + + @Override + public boolean matches(ScriptContainer scriptContainer, String s) { + String lower = CoreUtilities.toLowerCase(s); + String target = CoreUtilities.getXthArg(0,lower); + List types = Arrays.asList("entity", "player", "npc"); + return types.contains(target) || entity.matchesEntity(target); + } + + @Override + public String getName() { + return "EntityEntersPortal"; + } + + @Override + public void init() { + Bukkit.getServer().getPluginManager().registerEvents(this, DenizenAPI.getCurrentInstance()); + } + + @Override + public void destroy() { + EntityPortalEnterEvent.getHandlerList().unregister(this); + } + + @Override + public boolean applyDetermination(ScriptContainer container, String determination) { + 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("location", location); + return context; + } + + @EventHandler + public void onEntityEntersPortal(EntityPortalEnterEvent event) { + entity = new dEntity(event.getEntity()); + location = new dLocation(event.getLocation()); + this.event = event; + fire(); + } +} 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 870fc827cb..fd97877484 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 @@ -139,38 +139,6 @@ public void timeEvent() { // Additional EVENTS ///////////////// - // <--[event] - // @Events - // entity enters portal - // enters portal - // - // @Triggers when an entity enters a portal. - // @Context - // returns the dEntity. - // returns the dLocation of the portal block touched by the entity. - // - // --> - @EventHandler // TODO: This fires very rapidly. Smart event? - public void entityPortalEnter(EntityPortalEnterEvent event) { - - dPlayer player = null; - dNPC npc = null; - - Map context = new HashMap(); - dEntity entity = new dEntity(event.getEntity()); - - context.put("location", new dLocation(event.getLocation())); - context.put("entity", entity.getDenizenObject()); - - if (entity.isCitizensNPC()) npc = entity.getDenizenNPC(); - else if (entity.isPlayer()) player = entity.getDenizenPlayer(); - - doEvents(Arrays.asList - ("entity enters portal", - entity.identifyType() + " enters portal"), - npc, player, context, true); - } - // <--[event] // @Events // entity exits portal