Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add player receives actionbar event #2326

Merged
merged 2 commits into from Feb 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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