From 4f9d4a0413c84f421d0d2db929db36c3446f0fb8 Mon Sep 17 00:00:00 2001 From: Alex 'mcmonkey' Goodwin Date: Sun, 24 Nov 2019 03:13:09 -0800 Subject: [PATCH] add projectile collides event, fixes #2075 --- .../denizen/paper/PaperModule.java | 1 + .../events/ProjectileCollideScriptEvent.java | 84 +++++++++++++++++++ .../implementation/BukkitScriptEntryData.java | 18 ++++ 3 files changed, 103 insertions(+) create mode 100644 paper/src/main/java/com/denizenscript/denizen/paper/events/ProjectileCollideScriptEvent.java diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java index 9b95a61844..3ab613bdfd 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java @@ -12,6 +12,7 @@ public static void init() { ScriptEvent.registerScriptEvent(new PlayerJumpsPaperScriptEventImpl()); ScriptEvent.registerScriptEvent(new PlayerSpectatesEntityScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerStopsSpectatingScriptEvent()); + ScriptEvent.registerScriptEvent(new ProjectileCollideScriptEvent()); ScriptEvent.registerScriptEvent(new TNTPrimesScriptEvent()); } } diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/ProjectileCollideScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/ProjectileCollideScriptEvent.java new file mode 100644 index 0000000000..38f8e04c93 --- /dev/null +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/ProjectileCollideScriptEvent.java @@ -0,0 +1,84 @@ +package com.denizenscript.denizen.paper.events; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; +import com.destroystokyo.paper.event.entity.ProjectileCollideEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class ProjectileCollideScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // projectile collides with entity + // collides with + // + // @Regex ^on [^\s]+ collides with [^\s]+$ + // + // @Switch in: to only process the event if it occurred within a specified area. + // + // @Plugin Paper + // + // @Cancellable true + // + // @Triggers when a projectile entity collides with an entity (before any damage calculations are done). + // + // @Context + // returns the projectile that is colliding. + // returns the entity that was collided with. + // + // @Player When the entity collided with is a player. + // @NPC When the entity collided with is a NPC. + // + // --> + + public ProjectileCollideScriptEvent() { + instance = this; + } + + public static ProjectileCollideScriptEvent instance; + public ProjectileCollideEvent event; + + @Override + public boolean couldMatch(ScriptPath path) { + return path.eventArgLowerAt(1).equals("collides") && path.eventArgLowerAt(2).equals("with"); + } + + @Override + public boolean matches(ScriptPath path) { + if (!runInCheck(path, event.getEntity().getLocation())) { + return false; + } + return super.matches(path); + } + + @Override + public String getName() { + return "ProjectileCollides"; + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(event.getCollidedWith()); + } + + @Override + public ObjectTag getContext(String name) { + if (name.equals("entity")) { + return new EntityTag(event.getCollidedWith()); + } + else if (name.equals("projectile")) { + return new EntityTag(event.getEntity()); + } + return super.getContext(name); + } + + @EventHandler + public void projectileCollideEvent(ProjectileCollideEvent event) { + this.event = event; + fire(event); + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/implementation/BukkitScriptEntryData.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/implementation/BukkitScriptEntryData.java index f9e5593fd6..1f2bd361e1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/implementation/BukkitScriptEntryData.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/implementation/BukkitScriptEntryData.java @@ -1,10 +1,12 @@ package com.denizenscript.denizen.utilities.implementation; +import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.NPCTag; import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizen.tags.BukkitTagContext; import com.denizenscript.denizencore.scripts.ScriptEntryData; import com.denizenscript.denizencore.tags.TagContext; +import org.bukkit.entity.Entity; public class BukkitScriptEntryData extends ScriptEntryData { private PlayerTag player; @@ -15,6 +17,22 @@ public BukkitScriptEntryData(PlayerTag player, NPCTag npc) { this.npc = npc; } + public BukkitScriptEntryData(EntityTag entity) { + if (entity == null) { + return; + } + if (entity.isCitizensNPC()) { + this.npc = entity.getDenizenNPC(); + } + if (entity.isPlayer()) { + this.player = entity.getDenizenPlayer(); + } + } + + public BukkitScriptEntryData(Entity entity) { + this(entity == null ? null : new EntityTag(entity)); + } + public PlayerTag getPlayer() { return player; }