Skip to content

Commit

Permalink
add IMPERFECT shield raise/lower event, for #2104
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Dec 24, 2019
1 parent 409d467 commit e60e77b
Show file tree
Hide file tree
Showing 9 changed files with 220 additions and 18 deletions.
Expand Up @@ -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) {
Expand Down
@@ -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:<area> to only process the event if it occurred within a specified area.
//
// @Triggers when a player starts or stops holding up a shield.
//
// @Context
// <context.state> 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<UUID> 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());
}
}
Expand Up @@ -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
Expand All @@ -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);
}

Expand Down
Expand Up @@ -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:<area> to only process the event if it occurred within a specified area.
//
Expand All @@ -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
Expand All @@ -56,7 +60,6 @@ public boolean matches(ScriptPath path) {
if (cmd.equals("stops") && state) {
return false;
}

if (!runInCheck(path, event.getPlayer().getLocation())) {
return false;
}
Expand Down
@@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down
Expand Up @@ -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) {
Expand Down
Expand Up @@ -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) {
Expand Down

0 comments on commit e60e77b

Please sign in to comment.