Skip to content

Commit

Permalink
Add player receives actionbar event (#2326)
Browse files Browse the repository at this point in the history
* Add player receives actionbar event

* Add var to track whether event has been modified
  • Loading branch information
mergu committed Feb 28, 2022
1 parent 4f7a698 commit 11ce7ef
Show file tree
Hide file tree
Showing 9 changed files with 180 additions and 21 deletions.
Expand Up @@ -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);
Expand Down
@@ -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
// <context.message> returns an ElementTag of the actionbar.
// <context.raw_json> 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";
}
}
Expand Up @@ -2,6 +2,10 @@

public interface PacketOutChat {

boolean isSystem();

boolean isActionbar();

int getPosition();

String getMessage();
Expand Down
@@ -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;
Expand Down Expand Up @@ -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<Boolean> 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()) {
Expand Down
Expand Up @@ -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();
Expand Down
@@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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)
Expand All @@ -258,6 +262,43 @@ else if (packet instanceof ClientboundLevelChunkPacket) {
oldManager.send(packet, genericfuturelistener);
}

public boolean processActionbarPacket(Packet<?> packet, GenericFutureListener<? extends Future<? super Void>> 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;
Expand Down
Expand Up @@ -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();
Expand Down
@@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -290,6 +293,7 @@ public void send(Packet<?> packet, GenericFutureListener<? extends Future<? supe
|| processMirrorForPacket(packet)
|| processParticlesForPacket(packet)
|| processSoundPacket(packet)
|| processActionbarPacket(packet, genericfuturelistener)
|| processDisguiseForPacket(packet, genericfuturelistener)
|| processMetadataChangesForPacket(packet, genericfuturelistener)
|| processEquipmentForPacket(packet, genericfuturelistener)
Expand All @@ -303,6 +307,43 @@ public void send(Packet<?> packet, GenericFutureListener<? extends Future<? supe
oldManager.send(packet, genericfuturelistener);
}

public boolean processActionbarPacket(Packet<?> packet, GenericFutureListener<? extends Future<? super Void>> 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;
Expand Down
Expand Up @@ -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();
Expand Down

0 comments on commit 11ce7ef

Please sign in to comment.