From 34e81368b16ca4bc926bfc9e21c4ccbfb90bfed6 Mon Sep 17 00:00:00 2001 From: beisenser Date: Thu, 8 Jan 2026 16:58:26 +0800 Subject: [PATCH] =?UTF-8?q?=E9=93=81=E7=A0=A7=E5=8F=AF=E4=BB=A5=E5=BD=A9?= =?UTF-8?q?=E8=89=B2=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/revaria/chatplus/mixin/AnvilMixin.java | 42 +++++++++++++++++++ .../cn/revaria/chatplus/mixin/ChatMixin.java | 1 + .../chatplus/util/TextStyleFormatter.java | 14 ++++++- src/main/resources/chat-plus.mixins.json | 1 + 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/revaria/chatplus/mixin/AnvilMixin.java diff --git a/src/main/java/cn/revaria/chatplus/mixin/AnvilMixin.java b/src/main/java/cn/revaria/chatplus/mixin/AnvilMixin.java new file mode 100644 index 0000000..3f35a97 --- /dev/null +++ b/src/main/java/cn/revaria/chatplus/mixin/AnvilMixin.java @@ -0,0 +1,42 @@ +package cn.revaria.chatplus.mixin; + +import net.minecraft.screen.AnvilScreenHandler; +import net.minecraft.screen.Property; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.screen.ScreenHandlerType; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import static cn.revaria.chatplus.util.TextStyleFormatter.applySimpleStyle; + +@Mixin(AnvilScreenHandler.class) +public abstract class AnvilMixin extends ScreenHandler { + @Shadow + @Nullable + private String newItemName; + + @Shadow + @Final + private Property levelCost; + + protected AnvilMixin(@Nullable ScreenHandlerType type, int syncId) { + super(type, syncId); + } + + @Inject(method = "updateResult", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isEmpty()Z", ordinal = 0)) + private void applyColorToName(CallbackInfo ci) { + if (this.newItemName != null && !this.newItemName.isEmpty()) { + String formattedName = applySimpleStyle(this.newItemName); + if (!formattedName.equals(this.newItemName)) { + this.newItemName = formattedName; + // In some versions, we might need to ensure the level cost is updated or the result is recalculated. + // But usually, modifying newItemName before the result item is constructed is enough. + } + } + } +} diff --git a/src/main/java/cn/revaria/chatplus/mixin/ChatMixin.java b/src/main/java/cn/revaria/chatplus/mixin/ChatMixin.java index b557078..ccae1af 100644 --- a/src/main/java/cn/revaria/chatplus/mixin/ChatMixin.java +++ b/src/main/java/cn/revaria/chatplus/mixin/ChatMixin.java @@ -41,3 +41,4 @@ public abstract class ChatMixin { } #endif } +// 拦截玩家发送的聊天数据包,在消息发送前将其中的 & 颜色代码和 [item] 占位符替换为 Minecraft 内部的文本样式组件。 \ No newline at end of file diff --git a/src/main/java/cn/revaria/chatplus/util/TextStyleFormatter.java b/src/main/java/cn/revaria/chatplus/util/TextStyleFormatter.java index f932bda..1109007 100644 --- a/src/main/java/cn/revaria/chatplus/util/TextStyleFormatter.java +++ b/src/main/java/cn/revaria/chatplus/util/TextStyleFormatter.java @@ -76,5 +76,17 @@ public class TextStyleFormatter { } return finalText; + } + + /** + * Simple style application that only replaces color codes. + * Used for anvil renaming where [item] tags are not appropriate. + * + * @param text The text to format + * @return Formatted text with § color codes + */ + public static String applySimpleStyle(String text) { + if (text == null) return null; + return text.replace('&', '§').replace("§§", "&"); + } } -} diff --git a/src/main/resources/chat-plus.mixins.json b/src/main/resources/chat-plus.mixins.json index bbb0e0e..933e538 100644 --- a/src/main/resources/chat-plus.mixins.json +++ b/src/main/resources/chat-plus.mixins.json @@ -4,6 +4,7 @@ "plugin": "cn.revaria.chatplus.plugin.MixinConfigPlugin", "mixins": [ "ChatMixin", + "AnvilMixin", "compat.DynmapMixin", "compat.StyledChatMixin" ],