From a31eabd97e27ff9668399b83dc83043cd66f0708 Mon Sep 17 00:00:00 2001 From: Xeane Date: Sat, 21 Dec 2019 09:19:36 -0500 Subject: [PATCH] Knockback (#2094) * Implements Paper only knockback event * fix typo (1.14->1.15) * small cleanup * fixes! * Moar Fix! * first thing in the morning fixes..... * learned the alphabet since the last update * more fix --- .../denizen/paper/PaperModule.java | 1 + .../EntityKnocksbackEntityScriptEvent.java | 126 ++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 paper/src/main/java/com/denizenscript/denizen/paper/events/EntityKnocksbackEntityScriptEvent.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 727b3f9237..3b5f2f981b 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 class PaperModule { public static void init() { Debug.log("Loading Paper support module..."); // Events + ScriptEvent.registerScriptEvent(new EntityKnocksbackEntityScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerEquipsArmorScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerJumpsPaperScriptEventImpl()); ScriptEvent.registerScriptEvent(new PlayerSpectatesEntityScriptEvent()); diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityKnocksbackEntityScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityKnocksbackEntityScriptEvent.java new file mode 100644 index 0000000000..c90c691f9e --- /dev/null +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityKnocksbackEntityScriptEvent.java @@ -0,0 +1,126 @@ +package com.denizenscript.denizen.paper.events; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; +import com.denizenscript.denizencore.scripts.containers.ScriptContainer; +import com.denizenscript.denizencore.utilities.CoreUtilities; +import com.destroystokyo.paper.event.entity.EntityKnockbackByEntityEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class EntityKnocksbackEntityScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // entity knocks back entity + // entity knocks back + // knocks back entity + // knocks back + // + // @Regex ^on [^\s]+ knocks back [^\s]+$ + // + // @Switch in: to only process the event if it occurred within a specified area. + // @Switch with: to only process the event when the item used to cause damage (in the damager's hand) is a specified item. + // + // @Plugin Paper + // + // @Cancellable true + // + // @Triggers when an entity is knocked back from the hit of another entity. + // + // @Context + // returns the EntityTag that was knocked back. + // returns the EntityTag of the one who knocked. + // returns the knockback applied as a vector. + // + // @Player when the damager or damaged entity is a player. Cannot be both. + // + // @NPC when the damager or damaged entity is an NPC. Cannot be both. + // + // --> + + public EntityKnocksbackEntityScriptEvent() { + instance = this; + } + + public static EntityKnocksbackEntityScriptEvent instance; + + public EntityTag entity; + public EntityTag hitBy; + public ItemTag held; + public EntityKnockbackByEntityEvent event; + + @Override + public boolean couldMatch(ScriptPath path) { + return path.eventArgLowerAt(1).equals("knocks") && + path.eventArgLowerAt(2).equals("back"); + } + + @Override + public boolean matches(ScriptPath path) { + String attacker = path.eventArgLowerAt(0); + String target = path.eventArgLowerAt(3); + if (!tryEntity(hitBy, attacker) || (!tryEntity(entity, target))) { + return false; + } + if (!runInCheck(path, entity.getLocation())) { + return false; + } + if (!runWithCheck(path, held)) { + return false; + } + return super.matches(path); + } + + @Override + public String getName() { + return "EntityKnocksbackEntity"; + } + + @Override + public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { + if (!isDefaultDetermination(determinationObj)) { + String determination = determinationObj.toString(); + if (LocationTag.matches(determination)) { + event.getAcceleration().copy((LocationTag.valueOf(determination)).toVector()); + return true; + } + } + return super.applyDetermination(path, determinationObj); + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData( + hitBy.isPlayer() ? hitBy.getDenizenPlayer() : entity.isPlayer() ? entity.getDenizenPlayer() : null, + hitBy.isCitizensNPC() ? hitBy.getDenizenNPC() : entity.isCitizensNPC() ? entity.getDenizenNPC() : null); + } + + @Override + public ObjectTag getContext(String name) { + if (name.equals("entity")) { + return entity.getDenizenObject(); + } + else if (name.equals("damager")) { + return hitBy.getDenizenObject(); + } + else if (name.equals("acceleration")) { + return new LocationTag(event.getAcceleration()); + } + return super.getContext(name); + } + + @EventHandler + public void onEntityKnockbackEntity(EntityKnockbackByEntityEvent event) { + entity = new EntityTag(event.getEntity()); + hitBy = new EntityTag(event.getHitBy()); + held = hitBy.getItemInHand(); + this.event = event; + fire(event); + } +}