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 a120cceadc..feb718fbf4 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java @@ -193,6 +193,7 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(PlayerPreparesAnvilCraftScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerPreparesEnchantScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerQuitsScriptEvent.class); + ScriptEvent.registerScriptEvent(PlayerReceivesActionbarScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerReceivesCommandsScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerReceivesMessageScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerRespawnsScriptEvent.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerReceivesActionbarScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerReceivesActionbarScriptEvent.java new file mode 100644 index 0000000000..b11b4de20f --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerReceivesActionbarScriptEvent.java @@ -0,0 +1,47 @@ +package com.denizenscript.denizen.events.player; + +public class PlayerReceivesActionbarScriptEvent extends PlayerReceivesMessageScriptEvent { + + // <--[event] + // @Events + // player receives actionbar + // + // @Regex ^on player receives actionbar$ + // + // @Group Player + // + // @Cancellable true + // + // @Warning Triggering new actionbar messages in this event will cause it to re-fire. + // + // @Triggers when a player receives any actionbar from the server. + // + // @Context + // returns an ElementTag of the actionbar. + // returns an ElementTag of the raw JSON used for the actionbar. + // + // @Determine + // "MESSAGE:" + ElementTag to change the actionbar. + // "RAW_JSON:" + ElementTag to change the JSON used for the actionbar. + // + // @Player Always. + // + // --> + + public PlayerReceivesActionbarScriptEvent() { + instance = this; + } + + public static PlayerReceivesActionbarScriptEvent instance; + public boolean modified; + + @Override + public boolean couldMatch(ScriptPath path) { + return path.eventLower.startsWith("player receives actionbar"); + } + + @Override + public String getName() { + return "PlayerReceivesActionbar"; + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/packets/PacketOutChat.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/packets/PacketOutChat.java index 2f64c992db..7834ca2d15 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/packets/PacketOutChat.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/packets/PacketOutChat.java @@ -2,6 +2,10 @@ public interface PacketOutChat { + boolean isSystem(); + + boolean isActionbar(); + int getPosition(); String getMessage(); 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 433d6eb501..a0f8e8403e 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,15 +1,12 @@ package com.denizenscript.denizen.utilities.packets; import com.denizenscript.denizen.Denizen; -import com.denizenscript.denizen.events.player.PlayerHoldsItemEvent; +import com.denizenscript.denizen.events.player.*; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.utilities.implementation.DenizenCoreImplementation; import com.denizenscript.denizen.nms.interfaces.packets.*; import com.denizenscript.denizen.utilities.debugging.Debug; -import com.denizenscript.denizen.events.player.PlayerReceivesMessageScriptEvent; -import com.denizenscript.denizen.events.player.PlayerSteersEntityScriptEvent; -import com.denizenscript.denizen.events.player.ResourcePackStatusScriptEvent; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizen.scripts.commands.player.GlowCommand; @@ -108,33 +105,31 @@ public void receiveDigPacket(final Player player) { } public boolean shouldInterceptChatPacket() { - return !ExecuteCommand.silencedPlayers.isEmpty() || PlayerReceivesMessageScriptEvent.instance.loaded; + return !ExecuteCommand.silencedPlayers.isEmpty() + || PlayerReceivesMessageScriptEvent.instance.loaded + || PlayerReceivesActionbarScriptEvent.instance.loaded; } public boolean sendPacket(final Player player, final PacketOutChat chat) { - if (ExecuteCommand.silencedPlayers.contains(player.getUniqueId())) { + if (!chat.isActionbar() && ExecuteCommand.silencedPlayers.contains(player.getUniqueId())) { return true; } if (chat.getMessage() == null) { return false; } - final PlayerReceivesMessageScriptEvent event = PlayerReceivesMessageScriptEvent.instance; + final PlayerReceivesMessageScriptEvent event = chat.isActionbar() ? PlayerReceivesActionbarScriptEvent.instance : PlayerReceivesMessageScriptEvent.instance; if (event.loaded) { Callable eventCall = () -> { - int pos = chat.getPosition(); - if (pos != 2) { - event.message = new ElementTag(chat.getMessage()); - event.rawJson = new ElementTag(chat.getRawJson()); - event.system = new ElementTag(pos == 1); - event.player = PlayerTag.mirrorBukkitPlayer(player); - event.modifyMessage = chat::setMessage; - event.modifyRawJson = chat::setRawJson; - event.cancelled = false; - event.modifyCancellation = (c) -> event.cancelled = c; - event.fire(); - return event.cancelled; - } - return false; + event.message = new ElementTag(chat.getMessage()); + event.rawJson = new ElementTag(chat.getRawJson()); + event.system = new ElementTag(chat.isSystem()); + event.player = PlayerTag.mirrorBukkitPlayer(player); + event.modifyMessage = chat::setMessage; + event.modifyRawJson = chat::setRawJson; + event.cancelled = false; + event.modifyCancellation = (c) -> event.cancelled = c; + event.fire(); + return event.cancelled; }; try { if (DenizenCoreImplementation.isSafeThread()) { diff --git a/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/impl/network/packets/PacketOutChatImpl.java b/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/impl/network/packets/PacketOutChatImpl.java index e71e54053c..a12407f95a 100644 --- a/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/impl/network/packets/PacketOutChatImpl.java +++ b/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/impl/network/packets/PacketOutChatImpl.java @@ -44,6 +44,16 @@ public PacketOutChatImpl(PacketPlayOutChat internal) { } } + @Override + public boolean isSystem() { + return position == ChatMessageType.SYSTEM; + } + + @Override + public boolean isActionbar() { + return position == ChatMessageType.GAME_INFO; + } + @Override public int getPosition() { return position.ordinal(); diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/network/handlers/DenizenNetworkManagerImpl.java index d8a679d537..e352b11022 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -1,6 +1,7 @@ package com.denizenscript.denizen.nms.v1_17.impl.network.handlers; import com.denizenscript.denizen.events.player.PlayerHearsSoundScriptEvent; +import com.denizenscript.denizen.events.player.PlayerReceivesActionbarScriptEvent; import com.denizenscript.denizen.nms.abstracts.BlockLight; import com.denizenscript.denizen.nms.v1_17.Handler; import com.denizenscript.denizen.nms.v1_17.ReflectionMappingsInfo; @@ -22,6 +23,7 @@ import com.denizenscript.denizen.utilities.entity.HideEntitiesHelper; import com.denizenscript.denizen.utilities.packets.DenizenPacketHandler; import com.denizenscript.denizen.utilities.packets.HideParticles; +import com.denizenscript.denizencore.objects.core.ElementTag; import com.mojang.datafixers.util.Pair; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; @@ -31,6 +33,7 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.core.SectionPos; @@ -248,6 +251,7 @@ else if (packet instanceof ClientboundLevelChunkPacket) { || processMirrorForPacket(packet) || processParticlesForPacket(packet) || processSoundPacket(packet) + || processActionbarPacket(packet, genericfuturelistener) || processDisguiseForPacket(packet, genericfuturelistener) || processMetadataChangesForPacket(packet, genericfuturelistener) || processEquipmentForPacket(packet, genericfuturelistener) @@ -258,6 +262,43 @@ else if (packet instanceof ClientboundLevelChunkPacket) { oldManager.send(packet, genericfuturelistener); } + public boolean processActionbarPacket(Packet packet, GenericFutureListener> genericfuturelistener) { + if (!PlayerReceivesActionbarScriptEvent.instance.loaded) { + return false; + } + if (packet instanceof ClientboundSetActionBarTextPacket) { + ClientboundSetActionBarTextPacket actionbarPacket = (ClientboundSetActionBarTextPacket) packet; + PlayerReceivesActionbarScriptEvent event = PlayerReceivesActionbarScriptEvent.instance; + Component baseComponent = actionbarPacket.getText(); + event.message = new ElementTag(FormattedTextHelper.stringify(Handler.componentToSpigot(baseComponent), ChatColor.WHITE)); + event.rawJson = new ElementTag(Component.Serializer.toJson(baseComponent)); + event.system = new ElementTag(false); + event.player = PlayerTag.mirrorBukkitPlayer(player.getBukkitEntity()); + event.modifyMessage = (msg) -> { + event.message = new ElementTag(msg); + event.modified = true; + }; + event.modifyRawJson = (json) -> { + event.message = new ElementTag(FormattedTextHelper.stringify(ComponentSerializer.parse(json), ChatColor.WHITE)); + event.modified = true; + }; + event.modifyCancellation = (c) -> event.cancelled = c; + event.cancelled = false; + event.modified = false; + event.fire(); + if (event.cancelled) { + return true; + } + if (event.modified) { + Component component = Handler.componentToNMS(FormattedTextHelper.parse(event.message.asString(), ChatColor.WHITE)); + ClientboundSetActionBarTextPacket newPacket = new ClientboundSetActionBarTextPacket(component); + oldManager.send(newPacket, genericfuturelistener); + return true; + } + } + return false; + } + public boolean processSoundPacket(Packet packet) { if (!PlayerHearsSoundScriptEvent.enabled) { return false; diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/network/packets/PacketOutChatImpl.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/network/packets/PacketOutChatImpl.java index 79e7b71097..7d7fbafc95 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/network/packets/PacketOutChatImpl.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/network/packets/PacketOutChatImpl.java @@ -43,6 +43,16 @@ public PacketOutChatImpl(ClientboundChatPacket internal) { } } + @Override + public boolean isSystem() { + return position == ChatType.SYSTEM; + } + + @Override + public boolean isActionbar() { + return position == ChatType.GAME_INFO; + } + @Override public int getPosition() { return position.ordinal(); diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/network/handlers/DenizenNetworkManagerImpl.java index 4ff3448a20..2789e34db9 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -1,6 +1,7 @@ package com.denizenscript.denizen.nms.v1_18.impl.network.handlers; import com.denizenscript.denizen.events.player.PlayerHearsSoundScriptEvent; +import com.denizenscript.denizen.events.player.PlayerReceivesActionbarScriptEvent; import com.denizenscript.denizen.nms.abstracts.BlockLight; import com.denizenscript.denizen.nms.v1_18.Handler; import com.denizenscript.denizen.nms.v1_18.ReflectionMappingsInfo; @@ -23,6 +24,7 @@ import com.denizenscript.denizen.utilities.entity.HideEntitiesHelper; import com.denizenscript.denizen.utilities.packets.DenizenPacketHandler; import com.denizenscript.denizen.utilities.packets.HideParticles; +import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.utilities.CoreUtilities; import com.mojang.datafixers.util.Pair; import io.netty.buffer.Unpooled; @@ -33,6 +35,7 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.core.SectionPos; @@ -290,6 +293,7 @@ public void send(Packet packet, GenericFutureListener packet, GenericFutureListener packet, GenericFutureListener> genericfuturelistener) { + if (!PlayerReceivesActionbarScriptEvent.instance.loaded) { + return false; + } + if (packet instanceof ClientboundSetActionBarTextPacket) { + ClientboundSetActionBarTextPacket actionbarPacket = (ClientboundSetActionBarTextPacket) packet; + PlayerReceivesActionbarScriptEvent event = PlayerReceivesActionbarScriptEvent.instance; + Component baseComponent = actionbarPacket.getText(); + event.message = new ElementTag(FormattedTextHelper.stringify(Handler.componentToSpigot(baseComponent), ChatColor.WHITE)); + event.rawJson = new ElementTag(Component.Serializer.toJson(baseComponent)); + event.system = new ElementTag(false); + event.player = PlayerTag.mirrorBukkitPlayer(player.getBukkitEntity()); + event.modifyMessage = (msg) -> { + event.message = new ElementTag(msg); + event.modified = true; + }; + event.modifyRawJson = (json) -> { + event.message = new ElementTag(FormattedTextHelper.stringify(ComponentSerializer.parse(json), ChatColor.WHITE)); + event.modified = true; + }; + event.modifyCancellation = (c) -> event.cancelled = c; + event.cancelled = false; + event.modified = false; + event.fire(); + if (event.cancelled) { + return true; + } + if (event.modified) { + Component component = Handler.componentToNMS(FormattedTextHelper.parse(event.message.asString(), ChatColor.WHITE)); + ClientboundSetActionBarTextPacket newPacket = new ClientboundSetActionBarTextPacket(component); + oldManager.send(newPacket, genericfuturelistener); + return true; + } + } + return false; + } + public boolean processSoundPacket(Packet packet) { if (!PlayerHearsSoundScriptEvent.enabled) { return false; diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/network/packets/PacketOutChatImpl.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/network/packets/PacketOutChatImpl.java index 894eb4d15a..f46d191f57 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/network/packets/PacketOutChatImpl.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/network/packets/PacketOutChatImpl.java @@ -43,6 +43,16 @@ public PacketOutChatImpl(ClientboundChatPacket internal) { } } + @Override + public boolean isSystem() { + return position == ChatType.SYSTEM; + } + + @Override + public boolean isActionbar() { + return position == ChatType.GAME_INFO; + } + @Override public int getPosition() { return position.ordinal();