From e60e77b1cc81489865b13bf2c9a164831c9a572e Mon Sep 17 00:00:00 2001 From: Alex 'mcmonkey' Goodwin Date: Tue, 24 Dec 2019 01:58:16 -0800 Subject: [PATCH] add IMPERFECT shield raise/lower event, for #2104 --- .../denizen/events/ScriptEventRegistry.java | 1 + .../events/player/PlayerHoldsShieldEvent.java | 133 ++++++++++++++++++ .../events/player/PlayerSneakScriptEvent.java | 10 +- .../player/PlayerSprintScriptEvent.java | 11 +- .../packets/DenizenPacketHandler.java | 23 +++ .../handlers/DenizenPacketListenerImpl.java | 18 ++- .../handlers/DenizenPacketListenerImpl.java | 18 ++- .../handlers/DenizenPacketListenerImpl.java | 12 ++ .../handlers/DenizenPacketListenerImpl.java | 12 ++ 9 files changed, 220 insertions(+), 18 deletions(-) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerHoldsShieldEvent.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java index 6f50e8d916..3afc7ea9cb 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java @@ -131,6 +131,7 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(new PlayerFillsBucketScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerFishesScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerFlyingScriptEvent()); + ScriptEvent.registerScriptEvent(new PlayerHoldsShieldEvent()); ScriptEvent.registerScriptEvent(new PlayerItemTakesDamageScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerJoinsScriptEvent()); if (!Denizen.supportsPaper) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerHoldsShieldEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerHoldsShieldEvent.java new file mode 100644 index 0000000000..0d2eb2d977 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerHoldsShieldEvent.java @@ -0,0 +1,133 @@ +package com.denizenscript.denizen.events.player; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.PlayerTag; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerItemHeldEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import java.util.HashSet; +import java.util.UUID; + +public class PlayerHoldsShieldEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // player raises shield + // player lowers shield + // player toggles shield + // + // @Regex ^on player (toggles|raises|lowers) shield$ + // + // @Switch in: to only process the event if it occurred within a specified area. + // + // @Triggers when a player starts or stops holding up a shield. + // + // @Context + // returns an ElementTag(Boolean) with a value of "true" if the player is now holding a shield and "false" otherwise. + // + // @Player Always. + // + // --> + + public PlayerHoldsShieldEvent() { + instance = this; + } + + public static PlayerHoldsShieldEvent instance; + public PlayerTag player; + public boolean state; + + @Override + public boolean couldMatch(ScriptPath path) { + String middleWord = path.eventArgAt(1); + if (!(middleWord.equals("raises") || middleWord.equals("lowers") || middleWord.equals("toggles"))) { + return false; + } + return path.eventArgLowerAt(0).equals("player") && path.eventArgLowerAt(2).equals("shield"); + } + + @Override + public boolean matches(ScriptPath path) { + String cmd = path.eventArgLowerAt(1); + if (cmd.equals("raises") && !state) { + return false; + } + if (cmd.equals("lowers") && state) { + return false; + } + if (!runInCheck(path, player.getLocation())) { + return false; + } + return super.matches(path); + } + + @Override + public String getName() { + return "PlayerHoldsShield"; + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(player, null); + } + + @Override + public ObjectTag getContext(String name) { + if (name.equals("state")) { + return new ElementTag(state); + } + return super.getContext(name); + } + + public static HashSet raisedShields = new HashSet<>(); + + public static void signalDidRaise(Player player) { + if (raisedShields.contains(player.getUniqueId())) { + return; + } + raisedShields.add(player.getUniqueId()); + instance.state = true; + instance.player = new PlayerTag(player); + instance.cancelled = false; + instance.fire(); + } + + public static void signalDidLower(Player player) { + if (!raisedShields.remove(player.getUniqueId())) { + return; + } + instance.state = false; + instance.player = new PlayerTag(player); + instance.cancelled = false; + instance.fire(); + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + signalDidLower(event.getPlayer()); + } + + @EventHandler + public void onPlayerDeath(PlayerDeathEvent event) { + signalDidLower(event.getEntity()); + } + + @EventHandler + public void onPlayerChangeItem(PlayerItemHeldEvent event) { + signalDidLower(event.getPlayer()); + } + + @EventHandler + public void onPlayerDropItem(PlayerDropItemEvent event) { + signalDidLower(event.getPlayer()); + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSneakScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSneakScriptEvent.java index 8f6207ef9c..2bd6d6381e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSneakScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSneakScriptEvent.java @@ -39,12 +39,16 @@ public PlayerSneakScriptEvent() { } public static PlayerSneakScriptEvent instance; - public Boolean state; + public boolean state; public PlayerToggleSneakEvent event; @Override public boolean couldMatch(ScriptPath path) { - return path.eventArgLowerAt(2).equals("sneaking"); + String middleWord = path.eventArgAt(1); + if (!(middleWord.equals("starts") || middleWord.equals("stops") || middleWord.equals("toggles"))) { + return false; + } + return path.eventArgLowerAt(0).equals("player") && path.eventArgLowerAt(2).equals("sneaking"); } @Override @@ -56,11 +60,9 @@ public boolean matches(ScriptPath path) { if (cmd.equals("stops") && state) { return false; } - if (!runInCheck(path, event.getPlayer().getLocation())) { return false; } - return super.matches(path); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSprintScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSprintScriptEvent.java index dd3c01b884..11256a7011 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSprintScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSprintScriptEvent.java @@ -19,7 +19,7 @@ public class PlayerSprintScriptEvent extends BukkitScriptEvent implements Listen // player starts sprinting // player stops sprinting // - // @Regex ^on player (toggles|starts\stops) sprinting$ + // @Regex ^on player (toggles|starts|stops) sprinting$ // // @Switch in: to only process the event if it occurred within a specified area. // @@ -39,12 +39,16 @@ public PlayerSprintScriptEvent() { } public static PlayerSprintScriptEvent instance; - public Boolean state; + public boolean state; public PlayerToggleSprintEvent event; @Override public boolean couldMatch(ScriptPath path) { - return path.eventArgLowerAt(2).startsWith("sprint"); + String middleWord = path.eventArgAt(1); + if (!(middleWord.equals("starts") || middleWord.equals("stops") || middleWord.equals("toggles"))) { + return false; + } + return path.eventArgLowerAt(0).equals("player") && path.eventArgLowerAt(2).equals("sprinting"); } @Override @@ -56,7 +60,6 @@ public boolean matches(ScriptPath path) { if (cmd.equals("stops") && state) { return false; } - if (!runInCheck(path, event.getPlayer().getLocation())) { return false; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/packets/DenizenPacketHandler.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/packets/DenizenPacketHandler.java index 55a19c18d5..b3b00e74c4 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/packets/DenizenPacketHandler.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/packets/DenizenPacketHandler.java @@ -1,5 +1,6 @@ package com.denizenscript.denizen.utilities.packets; +import com.denizenscript.denizen.events.player.PlayerHoldsShieldEvent; import com.denizenscript.denizen.utilities.implementation.DenizenCoreImplementation; import com.denizenscript.denizen.nms.interfaces.packets.*; import com.denizenscript.denizen.utilities.debugging.Debug; @@ -17,6 +18,7 @@ import com.denizenscript.denizen.utilities.DenizenAPI; import com.denizenscript.denizencore.objects.core.ElementTag; import org.bukkit.Bukkit; +import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -72,6 +74,27 @@ public Boolean call() throws Exception { return false; } + public static boolean isHoldingShield(Player player) { + return player.getEquipment().getItemInMainHand().getType() == Material.SHIELD + || player.getEquipment().getItemInOffHand().getType() == Material.SHIELD; + } + + public void receivePlacePacket(final Player player) { + if (isHoldingShield(player)) { + Bukkit.getScheduler().runTask(DenizenAPI.getCurrentInstance(), () -> { + PlayerHoldsShieldEvent.signalDidRaise(player); + }); + } + } + + public void receiveDigPacket(final Player player) { + if (isHoldingShield(player)) { + Bukkit.getScheduler().runTask(DenizenAPI.getCurrentInstance(), () -> { + PlayerHoldsShieldEvent.signalDidLower(player); + }); + } + } + public boolean sendPacket(final Player player, final PacketOutChat chat) { if (ExecuteCommand.silencedPlayers.contains(player.getUniqueId())) { return true; diff --git a/v1_12/src/main/java/com/denizenscript/denizen/nms/v1_12/impl/packets/handlers/DenizenPacketListenerImpl.java b/v1_12/src/main/java/com/denizenscript/denizen/nms/v1_12/impl/packets/handlers/DenizenPacketListenerImpl.java index dfa6301e51..bf487f4125 100644 --- a/v1_12/src/main/java/com/denizenscript/denizen/nms/v1_12/impl/packets/handlers/DenizenPacketListenerImpl.java +++ b/v1_12/src/main/java/com/denizenscript/denizen/nms/v1_12/impl/packets/handlers/DenizenPacketListenerImpl.java @@ -4,11 +4,7 @@ import com.denizenscript.denizen.nms.v1_12.impl.packets.PacketInResourcePackStatusImpl; import com.denizenscript.denizen.nms.v1_12.impl.packets.PacketInSteerVehicleImpl; import com.denizenscript.denizen.utilities.packets.DenizenPacketHandler; -import net.minecraft.server.v1_12_R1.EntityPlayer; -import net.minecraft.server.v1_12_R1.NetworkManager; -import net.minecraft.server.v1_12_R1.Packet; -import net.minecraft.server.v1_12_R1.PacketPlayInResourcePackStatus; -import net.minecraft.server.v1_12_R1.PacketPlayInSteerVehicle; +import net.minecraft.server.v1_12_R1.*; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -41,6 +37,18 @@ public void a(PacketPlayInResourcePackStatus packet) { super.a(packet); } + @Override + public void a(PacketPlayInBlockPlace packet) { + packetHandler.receivePlacePacket(player.getBukkitEntity()); + super.a(packet); + } + + @Override + public void a(PacketPlayInBlockDig packet) { + packetHandler.receiveDigPacket(player.getBukkitEntity()); + super.a(packet); + } + // For compatibility with other plugins using Reflection weirdly... @Override public void sendPacket(Packet packet) { diff --git a/v1_13/src/main/java/com/denizenscript/denizen/nms/v1_13/impl/packets/handlers/DenizenPacketListenerImpl.java b/v1_13/src/main/java/com/denizenscript/denizen/nms/v1_13/impl/packets/handlers/DenizenPacketListenerImpl.java index 171e87a109..b22e233630 100644 --- a/v1_13/src/main/java/com/denizenscript/denizen/nms/v1_13/impl/packets/handlers/DenizenPacketListenerImpl.java +++ b/v1_13/src/main/java/com/denizenscript/denizen/nms/v1_13/impl/packets/handlers/DenizenPacketListenerImpl.java @@ -6,11 +6,7 @@ import io.netty.util.concurrent.GenericFutureListener; import com.denizenscript.denizen.nms.v1_13.impl.packets.PacketInResourcePackStatusImpl; import com.denizenscript.denizen.nms.v1_13.impl.packets.PacketInSteerVehicleImpl; -import net.minecraft.server.v1_13_R2.EntityPlayer; -import net.minecraft.server.v1_13_R2.NetworkManager; -import net.minecraft.server.v1_13_R2.Packet; -import net.minecraft.server.v1_13_R2.PacketPlayInResourcePackStatus; -import net.minecraft.server.v1_13_R2.PacketPlayInSteerVehicle; +import net.minecraft.server.v1_13_R2.*; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -45,6 +41,18 @@ public void a(PacketPlayInResourcePackStatus packet) { super.a(packet); } + @Override + public void a(PacketPlayInBlockPlace packet) { + packetHandler.receivePlacePacket(player.getBukkitEntity()); + super.a(packet); + } + + @Override + public void a(PacketPlayInBlockDig packet) { + packetHandler.receiveDigPacket(player.getBukkitEntity()); + super.a(packet); + } + // For compatibility with other plugins using Reflection weirdly... @Override public void sendPacket(Packet packet) { diff --git a/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/impl/network/handlers/DenizenPacketListenerImpl.java b/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/impl/network/handlers/DenizenPacketListenerImpl.java index 995575813a..4ad696d030 100644 --- a/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/impl/network/handlers/DenizenPacketListenerImpl.java +++ b/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/impl/network/handlers/DenizenPacketListenerImpl.java @@ -41,6 +41,18 @@ public void a(PacketPlayInResourcePackStatus packet) { super.a(packet); } + @Override + public void a(PacketPlayInBlockPlace packet) { + packetHandler.receivePlacePacket(player.getBukkitEntity()); + super.a(packet); + } + + @Override + public void a(PacketPlayInBlockDig packet) { + packetHandler.receiveDigPacket(player.getBukkitEntity()); + super.a(packet); + } + // For compatibility with other plugins using Reflection weirdly... @Override public void sendPacket(Packet packet) { diff --git a/v1_15/src/main/java/com/denizenscript/denizen/nms/v1_15/impl/network/handlers/DenizenPacketListenerImpl.java b/v1_15/src/main/java/com/denizenscript/denizen/nms/v1_15/impl/network/handlers/DenizenPacketListenerImpl.java index effb33f3c5..310695a6f3 100644 --- a/v1_15/src/main/java/com/denizenscript/denizen/nms/v1_15/impl/network/handlers/DenizenPacketListenerImpl.java +++ b/v1_15/src/main/java/com/denizenscript/denizen/nms/v1_15/impl/network/handlers/DenizenPacketListenerImpl.java @@ -41,6 +41,18 @@ public void a(PacketPlayInResourcePackStatus packet) { super.a(packet); } + @Override + public void a(PacketPlayInBlockPlace packet) { + packetHandler.receivePlacePacket(player.getBukkitEntity()); + super.a(packet); + } + + @Override + public void a(PacketPlayInBlockDig packet) { + packetHandler.receiveDigPacket(player.getBukkitEntity()); + super.a(packet); + } + // For compatibility with other plugins using Reflection weirdly... @Override public void sendPacket(Packet packet) {