From 29b1a450f3db47e89af3db50e638454bd8b3fa08 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Thu, 18 Jun 2020 17:25:25 +0800 Subject: [PATCH] Fix duplicate username in chat. --- .../player/ServerPlayerEntityBridge.java | 2 + .../player/ServerPlayerEntityMixin.java | 5 +++ .../play/ServerPlayNetHandlerMixin.java | 45 +++++++++++++------ 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/entity/player/ServerPlayerEntityBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/entity/player/ServerPlayerEntityBridge.java index 04a41324..ca356536 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/entity/player/ServerPlayerEntityBridge.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/entity/player/ServerPlayerEntityBridge.java @@ -28,6 +28,8 @@ public interface ServerPlayerEntityBridge extends PlayerEntityBridge { void bridge$sendMessage(ITextComponent[] ichatbasecomponent); + void bridge$sendMessage(ITextComponent component); + boolean bridge$isJoining(); void bridge$reset(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/player/ServerPlayerEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/player/ServerPlayerEntityMixin.java index 31a9737d..6d6fd039 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/player/ServerPlayerEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/player/ServerPlayerEntityMixin.java @@ -433,6 +433,11 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin implemen sendMessage(ichatbasecomponent); } + @Override + public void bridge$sendMessage(ITextComponent component) { + this.sendMessage(component); + } + @Redirect(method = "copyFrom", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/crafting/ServerRecipeBook;copyFrom(Lnet/minecraft/item/crafting/RecipeBook;)V")) private void arclight$noRecipeBookCopy(ServerRecipeBook serverRecipeBook, RecipeBook that) { } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/ServerPlayNetHandlerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/ServerPlayNetHandlerMixin.java index 54860c9d..57010b0f 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/ServerPlayNetHandlerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/ServerPlayNetHandlerMixin.java @@ -79,6 +79,7 @@ import net.minecraft.world.GameRules; import net.minecraft.world.GameType; import net.minecraft.world.IWorldReader; import net.minecraft.world.server.ServerWorld; +import net.minecraftforge.common.ForgeHooks; import org.apache.logging.log4j.Logger; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -947,13 +948,10 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB if (s.isEmpty() || this.player.getChatVisibility() == ChatVisibility.HIDDEN) { return; } + ServerPlayNetHandler handler = (ServerPlayNetHandler) (Object) this; if (!async && s.startsWith("/")) { this.handleSlashCommand(s); } else if (this.player.getChatVisibility() != ChatVisibility.SYSTEM) { - ITextComponent itextcomponent = new TranslationTextComponent("chat.type.text", this.player.getDisplayName(), net.minecraftforge.common.ForgeHooks.newChatWithLinks(s)); - itextcomponent = net.minecraftforge.common.ForgeHooks.onServerChatEvent((ServerPlayNetHandler) (Object) this, s, itextcomponent); - if (itextcomponent == null) return; - s = CraftChatMessage.fromComponent(itextcomponent); Player player = this.getPlayer(); AsyncPlayerChatEvent event = new AsyncPlayerChatEvent(async, player, s, new LazyPlayerSet(this.minecraftServer)); this.server.getPluginManager().callEvent(event); @@ -969,14 +967,16 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB return null; } String message = String.format(queueEvent.getFormat(), queueEvent.getPlayer().getDisplayName(), queueEvent.getMessage()); - Bukkit.getConsoleSender().sendMessage(message); + ITextComponent component = ForgeHooks.onServerChatEvent(handler, queueEvent.getMessage(), ForgeHooks.newChatWithLinks(message)); + if (component == null) return null; + Bukkit.getConsoleSender().sendMessage(CraftChatMessage.fromComponent(component)); if (((LazyPlayerSet) queueEvent.getRecipients()).isLazy()) { for (Object player : minecraftServer.getPlayerList().players) { - ((ServerPlayerEntityBridge) player).bridge$sendMessage(CraftChatMessage.fromString(message)); + ((ServerPlayerEntityBridge) player).bridge$sendMessage(component); } } else { for (Player player2 : queueEvent.getRecipients()) { - player2.sendMessage(message); + ((ServerPlayerEntityBridge) player2).bridge$sendMessage(component); } } return null; @@ -1002,15 +1002,32 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB return; } s = String.format(event.getFormat(), event.getPlayer().getDisplayName(), event.getMessage()); - Bukkit.getConsoleSender().sendMessage(s); - if (((LazyPlayerSet) event.getRecipients()).isLazy()) { - for (Object recipient : minecraftServer.getPlayerList().players) { - ((ServerPlayerEntityBridge) recipient).bridge$sendMessage(CraftChatMessage.fromString(s)); + ITextComponent chatWithLinks = ForgeHooks.newChatWithLinks(s); + class ForgeChat extends Waitable { + + @Override + protected Void evaluate() { + // this is called on main thread + ITextComponent component = ForgeHooks.onServerChatEvent(handler, event.getMessage(), chatWithLinks); + if (component == null) return null; + Bukkit.getConsoleSender().sendMessage(CraftChatMessage.fromComponent(component)); + if (((LazyPlayerSet) event.getRecipients()).isLazy()) { + for (Object recipient : minecraftServer.getPlayerList().players) { + ((ServerPlayerEntityBridge) recipient).bridge$sendMessage(component); + } + } else { + for (Player recipient2 : event.getRecipients()) { + ((ServerPlayerEntityBridge) recipient2).bridge$sendMessage(component); + } + } + return null; } + } + Waitable waitable = new ForgeChat(); + if (async) { + ((MinecraftServerBridge) minecraftServer).bridge$queuedProcess(waitable); } else { - for (Player recipient2 : event.getRecipients()) { - recipient2.sendMessage(s); - } + waitable.run(); } } }