diff --git a/common/src/main/java/dev/architectury/event/events/client/ClientChatEvent.java b/common/src/main/java/dev/architectury/event/events/client/ClientChatEvent.java index bcbf967f..5c126fa8 100644 --- a/common/src/main/java/dev/architectury/event/events/client/ClientChatEvent.java +++ b/common/src/main/java/dev/architectury/event/events/client/ClientChatEvent.java @@ -24,6 +24,7 @@ import dev.architectury.event.Event; import dev.architectury.event.EventFactory; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.network.chat.ChatSender; import net.minecraft.network.chat.ChatType; import net.minecraft.network.chat.Component; import org.jetbrains.annotations.Nullable; @@ -63,10 +64,10 @@ public interface ClientChatEvent { * * @param type Where was the message emitted from. * @param message The chat message. - * @param sender The packet sender. Can be {@code null}, but probably is the sending player UUID or {@link net.minecraft.Util#NIL_UUID} + * @param sender The packet sender. Can be {@code null}, but probably is the sending player UUID or null for system messages. * @return A {@link CompoundEventResult} determining the outcome of the event, * if an outcome is set, the received message is overridden. */ - CompoundEventResult process(ChatType type, Component message, @Nullable UUID sender); + CompoundEventResult process(ChatType type, Component message, @Nullable ChatSender sender); } } diff --git a/fabric/src/main/java/dev/architectury/mixin/fabric/MixinServerGamePacketListenerImpl.java b/fabric/src/main/java/dev/architectury/mixin/fabric/MixinServerGamePacketListenerImpl.java index d831121c..04c60227 100644 --- a/fabric/src/main/java/dev/architectury/mixin/fabric/MixinServerGamePacketListenerImpl.java +++ b/fabric/src/main/java/dev/architectury/mixin/fabric/MixinServerGamePacketListenerImpl.java @@ -23,6 +23,7 @@ import dev.architectury.event.events.common.ChatEvent; import dev.architectury.impl.fabric.ChatComponentImpl; import net.minecraft.network.chat.ChatType; import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ServerboundChatPacket; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerGamePacketListenerImpl; @@ -52,20 +53,20 @@ public abstract class MixinServerGamePacketListenerImpl { @Shadow public abstract void disconnect(Component component); - @Inject(method = "handleChat(Lnet/minecraft/server/network/TextFilter$FilteredText;)V", + @Inject(method = "handleChat(Lnet/minecraft/network/protocol/game/ServerboundChatPacket;Lnet/minecraft/server/network/TextFilter$FilteredText;)V", at = @At(value = "INVOKE", - target = "Lnet/minecraft/server/players/PlayerList;broadcastMessage(Lnet/minecraft/network/chat/Component;Ljava/util/function/Function;Lnet/minecraft/network/chat/ChatType;Ljava/util/UUID;)V"), + target = "Lnet/minecraft/server/players/PlayerList;broadcastPlayerMessage(Lnet/minecraft/network/chat/Component;Ljava/util/function/Function;Lnet/minecraft/network/chat/ChatType;Lnet/minecraft/network/chat/ChatSender;Ljava/time/Instant;Lnet/minecraft/util/Crypt$SaltSignaturePair;)V"), cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD) - private void handleChat(TextFilter.FilteredText message, CallbackInfo ci, String string, String string2, Component component, Component component2) { - var chatComponent = new ChatComponentImpl(component2, component); + private void handleChat(ServerboundChatPacket packet, TextFilter.FilteredText message, CallbackInfo ci, String normalizedMessage, String filteredMessage, Component filtered, Component raw) { + var chatComponent = new ChatComponentImpl(raw, filtered); var process = ChatEvent.SERVER.invoker().process(this.player, message, chatComponent); if (process.isEmpty()) return; if (process.isFalse()) { ci.cancel(); - } else if (!Objects.equals(chatComponent.getRaw(), component2) || !Objects.equals(chatComponent.getFiltered(), component)) { - this.server.getPlayerList().broadcastMessage(chatComponent.getRaw(), (serverPlayer) -> { + } else if (!Objects.equals(chatComponent.getRaw(), raw) || !Objects.equals(chatComponent.getFiltered(), filtered)) { + this.server.getPlayerList().broadcastPlayerMessage(chatComponent.getRaw(), (serverPlayer) -> { return this.player.shouldFilterMessageTo(serverPlayer) ? chatComponent.getFiltered() : chatComponent.getRaw(); - }, ChatType.CHAT, this.player.getUUID()); + }, ChatType.CHAT, this.player.asChatSender(), packet.getTimeStamp(), packet.getSaltSignature()); this.chatSpamTickCount += 20; if (this.chatSpamTickCount > 200 && !this.server.getPlayerList().isOp(this.player.getGameProfile())) { diff --git a/fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinClientPacketListener.java b/fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinClientPacketListener.java index fd5d98af..e3ce6cb1 100644 --- a/fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinClientPacketListener.java +++ b/fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinClientPacketListener.java @@ -25,10 +25,7 @@ import dev.architectury.event.events.client.ClientRecipeUpdateEvent; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.network.protocol.game.ClientboundChatPacket; -import net.minecraft.network.protocol.game.ClientboundLoginPacket; -import net.minecraft.network.protocol.game.ClientboundRespawnPacket; -import net.minecraft.network.protocol.game.ClientboundUpdateRecipesPacket; +import net.minecraft.network.protocol.game.*; import net.minecraft.world.item.crafting.RecipeManager; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -66,16 +63,30 @@ public class MixinClientPacketListener { this.tmpPlayer = null; } - @Inject(method = "handleChat", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/gui/Gui;handleChat(Lnet/minecraft/network/chat/ChatType;Lnet/minecraft/network/chat/Component;Ljava/util/UUID;)V"), + @Inject(method = "handleSystemChat", at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/gui/Gui;handleSystemChat(Lnet/minecraft/network/chat/ChatType;Lnet/minecraft/network/chat/Component;)V"), cancellable = true) - private void handleChat(ClientboundChatPacket packet, CallbackInfo ci) { - var process = ClientChatEvent.RECEIVED.invoker().process(packet.getType(), packet.getMessage(), packet.getSender()); + private void handleChat(ClientboundSystemChatPacket packet, CallbackInfo ci) { + var process = ClientChatEvent.RECEIVED.invoker().process(packet.type(), packet.content(), null); if (process.isEmpty()) return; if (process.isFalse()) { ci.cancel(); - } else if (process.object() != null && !process.object().equals(packet.getMessage())) { - this.minecraft.gui.handleChat(packet.getType(), packet.getMessage(), packet.getSender()); + } else if (process.object() != null && !process.object().equals(packet.content())) { + this.minecraft.gui.handleSystemChat(packet.type(), packet.content()); + ci.cancel(); + } + } + + @Inject(method = "handlePlayerChat", at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/gui/Gui;handlePlayerChat(Lnet/minecraft/network/chat/ChatType;Lnet/minecraft/network/chat/Component;Lnet/minecraft/network/chat/ChatSender;)V"), + cancellable = true) + private void handleChat(ClientboundPlayerChatPacket packet, CallbackInfo ci) { + var process = ClientChatEvent.RECEIVED.invoker().process(packet.type(), packet.content(), packet.sender()); + if (process.isEmpty()) return; + if (process.isFalse()) { + ci.cancel(); + } else if (process.object() != null && !process.object().equals(packet.content())) { + this.minecraft.gui.handlePlayerChat(packet.type(), packet.content(), packet.sender()); ci.cancel(); } } diff --git a/gradle.properties b/gradle.properties index 997b6c0e..fff8623d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,8 +3,8 @@ org.gradle.daemon=false forgeEnabled=false -minecraft_version=22w16b -supported_version=22w16b +minecraft_version=22w17a +supported_version=22w17a cf_type=beta @@ -13,8 +13,8 @@ archives_base_name_snapshot=architectury-snapshot base_version=5.2 maven_group=dev.architectury -fabric_loader_version=0.14.0 -fabric_api_version=0.51.2+1.19 +fabric_loader_version=0.14.3 +fabric_api_version=0.51.3+1.19 mod_menu_version=3.1.0 forge_version=40.0.1 diff --git a/testmod-common/src/main/java/dev/architectury/test/item/TestBlockInteractions.java b/testmod-common/src/main/java/dev/architectury/test/item/TestBlockInteractions.java index 83ba323b..d0d19180 100644 --- a/testmod-common/src/main/java/dev/architectury/test/item/TestBlockInteractions.java +++ b/testmod-common/src/main/java/dev/architectury/test/item/TestBlockInteractions.java @@ -22,7 +22,6 @@ package dev.architectury.test.item; import dev.architectury.hooks.item.tool.AxeItemHooks; import dev.architectury.hooks.item.tool.HoeItemHooks; import dev.architectury.hooks.item.tool.ShovelItemHooks; -import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; @@ -40,7 +39,7 @@ public final class TestBlockInteractions { if (!ctx.getLevel().isClientSide) { Player player = ctx.getPlayer(); if (player != null) - player.sendMessage(Component.literal("These dark arts can only be done at night!"), Util.NIL_UUID); + player.sendSystemMessage(Component.literal("These dark arts can only be done at night!")); } return false; } @@ -51,7 +50,7 @@ public final class TestBlockInteractions { if (!ctx.getLevel().isClientSide) { Player player = ctx.getPlayer(); if (player != null) - player.sendMessage(Component.literal("Thou has successfully committed the dark arts of alchemy!!"), Util.NIL_UUID); + player.sendSystemMessage(Component.literal("Thou has successfully committed the dark arts of alchemy!!")); } }); } diff --git a/testmod-common/src/main/java/dev/architectury/test/networking/ButtonClickedMessage.java b/testmod-common/src/main/java/dev/architectury/test/networking/ButtonClickedMessage.java index 77c73755..a1555b18 100644 --- a/testmod-common/src/main/java/dev/architectury/test/networking/ButtonClickedMessage.java +++ b/testmod-common/src/main/java/dev/architectury/test/networking/ButtonClickedMessage.java @@ -22,7 +22,6 @@ package dev.architectury.test.networking; import dev.architectury.networking.NetworkManager; import dev.architectury.networking.simple.BaseC2SMessage; import dev.architectury.networking.simple.MessageType; -import net.minecraft.Util; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; @@ -52,6 +51,6 @@ public class ButtonClickedMessage extends BaseC2SMessage { @Override public void handle(NetworkManager.PacketContext context) { - context.getPlayer().sendMessage(Component.literal("You clicked button #" + buttonId), Util.NIL_UUID); + context.getPlayer().sendSystemMessage(Component.literal("You clicked button #" + buttonId)); } } \ No newline at end of file diff --git a/testmod-common/src/main/java/dev/architectury/test/networking/SyncDataMessage.java b/testmod-common/src/main/java/dev/architectury/test/networking/SyncDataMessage.java index 89b29107..2c4d4d80 100644 --- a/testmod-common/src/main/java/dev/architectury/test/networking/SyncDataMessage.java +++ b/testmod-common/src/main/java/dev/architectury/test/networking/SyncDataMessage.java @@ -22,7 +22,6 @@ package dev.architectury.test.networking; import dev.architectury.networking.NetworkManager; import dev.architectury.networking.simple.BaseS2CMessage; import dev.architectury.networking.simple.MessageType; -import net.minecraft.Util; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; @@ -55,6 +54,6 @@ public class SyncDataMessage extends BaseS2CMessage { @Override public void handle(NetworkManager.PacketContext context) { - context.getPlayer().sendMessage(Component.literal("Received data from server: " + serverData), Util.NIL_UUID); + context.getPlayer().sendSystemMessage(Component.literal("Received data from server: " + serverData)); } } \ No newline at end of file