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) {