diff --git a/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java b/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java index c808e36bd6..81b37dbcc1 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java @@ -702,6 +702,7 @@ public void onEnable() { ScriptEvent.registerScriptEvent(new PlayerSneakScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerSprintScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerStatisticIncrementsScriptEvent()); + ScriptEvent.registerScriptEvent(new PlayerSteersEntityScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerStepsOnScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerSwapsItemsScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerTakesFromFurnaceScriptEvent()); diff --git a/plugin/src/main/java/net/aufdemrand/denizen/events/player/PlayerSteersEntityScriptEvent.java b/plugin/src/main/java/net/aufdemrand/denizen/events/player/PlayerSteersEntityScriptEvent.java new file mode 100644 index 0000000000..b5c50bcd83 --- /dev/null +++ b/plugin/src/main/java/net/aufdemrand/denizen/events/player/PlayerSteersEntityScriptEvent.java @@ -0,0 +1,107 @@ +package net.aufdemrand.denizen.events.player; + +import net.aufdemrand.denizen.BukkitScriptEntryData; +import net.aufdemrand.denizen.events.BukkitScriptEvent; +import net.aufdemrand.denizen.objects.dEntity; +import net.aufdemrand.denizen.objects.dPlayer; +import net.aufdemrand.denizencore.objects.Element; +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; + +public class PlayerSteersEntityScriptEvent extends BukkitScriptEvent { + + // <--[event] + // @Events + // player steers entity (in ) + // player steers (in ) + // + // @Regex ^on player steers [^\s]+( in ((notable (cuboid|ellipsoid))|([^\s]+)))?$ + // + // @Cancellable true + // + // @Triggers when a player attempts to steer an entity. + // + // @Context + // returns the dEntity being steered by the player. + // returns an Element(Decimal) where a positive number signifies leftward movement. + // returns an Element(Decimal) where a positive number signifies forward movement. + // returns an Element(Boolean) that signifies whether the player is attempting to jump with the entity. + // returns an Element(Boolean) that signifies whether the player is attempting to dismount. + // + // --> + + public PlayerSteersEntityScriptEvent() { + instance = this; + } + + public static PlayerSteersEntityScriptEvent instance; + public boolean enabled; + public dEntity entity; + public dPlayer player; + public Element sideways; + public Element forward; + public Element jump; + public Element dismount; + + @Override + public boolean couldMatch(ScriptContainer scriptContainer, String s) { + return CoreUtilities.getXthArg(1, CoreUtilities.toLowerCase(s)).startsWith("steers"); + } + + @Override + public boolean matches(ScriptContainer scriptContainer, String s) { + String lower = CoreUtilities.toLowerCase(s); + String entityName = CoreUtilities.getXthArg(2, lower); + if (!tryEntity(entity, entityName)) { + return false; + } + return runInCheck(scriptContainer, s, lower, entity.getLocation()); + } + + @Override + public String getName() { + return "PlayerSteersEntity"; + } + + @Override + public void init() { + enabled = true; + } + + @Override + public void destroy() { + enabled = false; + } + + @Override + public boolean applyDetermination(ScriptContainer container, String determination) { + return super.applyDetermination(container, determination); + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(player, entity.isCitizensNPC() ? entity.getDenizenNPC() : null); + } + + @Override + public dObject getContext(String name) { + if (name.equals("entity")) { + return entity; + } + else if (name.equals("sideways")) { + return sideways; + } + else if (name.equals("forward")) { + return forward; + } + else if (name.equals("jump")) { + return jump; + } + else if (name.equals("dismount")) { + return dismount; + } + return super.getContext(name); + } +} diff --git a/plugin/src/main/java/net/aufdemrand/denizen/utilities/packets/intercept/DenizenPacketListener.java b/plugin/src/main/java/net/aufdemrand/denizen/utilities/packets/intercept/DenizenPacketListener.java index c50ad56808..2c64c1265b 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/utilities/packets/intercept/DenizenPacketListener.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/utilities/packets/intercept/DenizenPacketListener.java @@ -1,6 +1,8 @@ package net.aufdemrand.denizen.utilities.packets.intercept; +import net.aufdemrand.denizen.events.player.PlayerSteersEntityScriptEvent; import net.aufdemrand.denizen.events.player.ResourcePackStatusScriptEvent; +import net.aufdemrand.denizen.objects.dEntity; import net.aufdemrand.denizen.objects.dPlayer; import net.aufdemrand.denizen.utilities.DenizenAPI; import net.aufdemrand.denizen.utilities.debugging.dB; @@ -9,6 +11,7 @@ import net.minecraft.server.v1_10_R1.*; import net.minecraft.server.v1_10_R1.PacketPlayInResourcePackStatus.EnumResourcePackStatus; import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -17,6 +20,9 @@ import java.lang.reflect.Field; import java.util.List; import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; public class DenizenPacketListener extends AbstractListenerPlayIn { @@ -79,6 +85,41 @@ public void run() { super.a(packet); } + @Override + public void a(final PacketPlayInSteerVehicle packet) { + if (PlayerSteersEntityScriptEvent.instance.enabled) { + Future future = Bukkit.getScheduler().callSyncMethod(DenizenAPI.getCurrentInstance(), + new Callable() { + @Override + public Boolean call() throws Exception { + PlayerSteersEntityScriptEvent event = PlayerSteersEntityScriptEvent.instance; + Player pl = player.getBukkitEntity(); + event.player = dPlayer.mirrorBukkitPlayer(pl); + event.entity = pl.isInsideVehicle() ? new dEntity(pl.getVehicle()) : null; + event.sideways = new Element(packet.a()); + event.forward = new Element(packet.b()); + event.jump = new Element(packet.c()); + event.dismount = new Element(packet.d()); + event.fire(); + return event.cancelled; + } + } + ); + try { + if (future.get()) { + return; + } + } + catch (InterruptedException e) { + e.printStackTrace(); + } + catch (ExecutionException e) { + e.printStackTrace(); + } + } + super.a(packet); + } + // For compatibility with other plugins using Reflection weirdly... @Override public void sendPacket(Packet packet) {