diff --git a/src/main/java/com/extendedae_plus/client/screen/ProviderSelectScreen.java b/src/main/java/com/extendedae_plus/client/screen/ProviderSelectScreen.java index b73c910..8f7df89 100644 --- a/src/main/java/com/extendedae_plus/client/screen/ProviderSelectScreen.java +++ b/src/main/java/com/extendedae_plus/client/screen/ProviderSelectScreen.java @@ -22,11 +22,11 @@ public class ProviderSelectScreen extends Screen { private final Screen parent; // 原始数据 private final List ids; - private final List names; + private final List names; // 改为 Component private final List emptySlots; // 分组后的数据(同名合并) private final List gIds = new ArrayList<>(); // 代表条目使用的 providerId:选择空位数最多的那个 - private final List gNames = new ArrayList<>(); // 分组名(供应器名称) + private final List gNames = new ArrayList<>(); // 分组名(供应器名称)- 转换为 String 用于显示和匹配 private final List gTotalSlots = new ArrayList<>(); // 该名称下供应器空位总和 private final List gCount = new ArrayList<>(); // 该名称下供应器数量 // 过滤后的数据(由查询生成) @@ -43,7 +43,7 @@ public class ProviderSelectScreen extends Screen { private boolean needsRefresh = false; private int page = 0; - public ProviderSelectScreen(Screen parent, List ids, List names, List emptySlots) { + public ProviderSelectScreen(Screen parent, List ids, List names, List emptySlots) { super(Component.translatable("extendedae_plus.screen.choose_provider.title")); this.parent = parent; this.ids = ids; @@ -139,7 +139,7 @@ public class ProviderSelectScreen extends Screen { // 使用 LinkedHashMap 保持首次出现顺序 Map map = new LinkedHashMap<>(); for (int i = 0; i < this.names.size(); i++) { - String name = this.names.get(i); + String name = this.names.get(i).getString(); // 将 Component 转换为 String long id = this.ids.get(i); int slots = this.emptySlots.get(i); Group g = map.computeIfAbsent(name, k -> new Group()); diff --git a/src/main/java/com/extendedae_plus/network/ProvidersListS2CPacket.java b/src/main/java/com/extendedae_plus/network/ProvidersListS2CPacket.java index 7421a43..da8b116 100644 --- a/src/main/java/com/extendedae_plus/network/ProvidersListS2CPacket.java +++ b/src/main/java/com/extendedae_plus/network/ProvidersListS2CPacket.java @@ -4,6 +4,8 @@ import com.extendedae_plus.ExtendedAEPlus; import com.extendedae_plus.client.screen.ProviderSelectScreen; import net.minecraft.client.Minecraft; import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; @@ -26,18 +28,18 @@ public class ProvidersListS2CPacket implements CustomPacketPayload { buf.writeVarInt(pkt.ids.size()); for (int i = 0; i < pkt.ids.size(); i++) { buf.writeLong(pkt.ids.get(i)); - buf.writeUtf(pkt.names.get(i)); + ComponentSerialization.TRUSTED_STREAM_CODEC.encode(buf, pkt.names.get(i)); // 使用 Component 序列化 buf.writeVarInt(pkt.emptySlots.get(i)); } }, buf -> { int size = buf.readVarInt(); List ids = new ArrayList<>(size); - List names = new ArrayList<>(size); + List names = new ArrayList<>(size); List slots = new ArrayList<>(size); for (int i = 0; i < size; i++) { ids.add(buf.readLong()); - names.add(buf.readUtf()); + names.add(ComponentSerialization.TRUSTED_STREAM_CODEC.decode(buf)); // 使用 Component 反序列化 slots.add(buf.readVarInt()); } return new ProvidersListS2CPacket(ids, names, slots); @@ -45,10 +47,10 @@ public class ProvidersListS2CPacket implements CustomPacketPayload { ); private final List ids; - private final List names; + private final List names; // 改为 Component private final List emptySlots; - ProvidersListS2CPacket(List ids, List names, List emptySlots) { + ProvidersListS2CPacket(List ids, List names, List emptySlots) { this.ids = ids; this.names = names; this.emptySlots = emptySlots; diff --git a/src/main/java/com/extendedae_plus/network/RequestProvidersListC2SPacket.java b/src/main/java/com/extendedae_plus/network/RequestProvidersListC2SPacket.java index de38086..c515c6a 100644 --- a/src/main/java/com/extendedae_plus/network/RequestProvidersListC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/RequestProvidersListC2SPacket.java @@ -38,7 +38,7 @@ public class RequestProvidersListC2SPacket implements CustomPacketPayload { if (CtrlQPendingUploadUtil.hasPendingCtrlQPattern(player)) { List containers = CtrlQPendingUploadUtil.listAvailableProvidersFromPlayerNetwork(player); List idxIds = new ArrayList<>(); - List names = new ArrayList<>(); + List names = new ArrayList<>(); List slots = new ArrayList<>(); for (int i = 0; i < containers.size(); i++) { var c = containers.get(i); @@ -47,7 +47,7 @@ public class RequestProvidersListC2SPacket implements CustomPacketPayload { if (empty <= 0) continue; long encodedId = -1L - i; idxIds.add(encodedId); - names.add(ExtendedAEPatternUploadUtil.getProviderDisplayName(c)); + names.add(ExtendedAEPatternUploadUtil.getProviderDisplayNameComponent(c)); slots.add(empty); } player.connection.send(new ProvidersListS2CPacket(idxIds, names, slots)); @@ -61,7 +61,7 @@ public class RequestProvidersListC2SPacket implements CustomPacketPayload { if (accessMenu != null) { List ids = ExtendedAEPatternUploadUtil.getAllProviderIds(accessMenu); List filteredIds = new ArrayList<>(); - List names = new ArrayList<>(); + List names = new ArrayList<>(); List slots = new ArrayList<>(); for (Long id : ids) { @@ -70,7 +70,7 @@ public class RequestProvidersListC2SPacket implements CustomPacketPayload { int empty = ExtendedAEPatternUploadUtil.getAvailableSlots(id, accessMenu); if (empty <= 0) continue; // 只列出有空位的 filteredIds.add(id); - names.add(ExtendedAEPatternUploadUtil.getProviderDisplayName(id, accessMenu)); + names.add(ExtendedAEPatternUploadUtil.getProviderDisplayNameComponent(id, accessMenu)); slots.add(empty); } @@ -81,7 +81,7 @@ public class RequestProvidersListC2SPacket implements CustomPacketPayload { // 回退:基于编码终端所在网络枚举供应器,用“负数ID编码索引”:encodedId = -1 - index List containers = ExtendedAEPatternUploadUtil.listAvailableProvidersFromGrid(encMenu); List idxIds = new ArrayList<>(); - List names = new ArrayList<>(); + List names = new ArrayList<>(); List slots = new ArrayList<>(); for (int i = 0; i < containers.size(); i++) { var c = containers.get(i); @@ -90,7 +90,7 @@ public class RequestProvidersListC2SPacket implements CustomPacketPayload { if (empty <= 0) continue; long encodedId = -1L - i; // 约定:负数代表按索引 idxIds.add(encodedId); - names.add(ExtendedAEPatternUploadUtil.getProviderDisplayName(c)); + names.add(ExtendedAEPatternUploadUtil.getProviderDisplayNameComponent(c)); slots.add(empty); } player.connection.send(new ProvidersListS2CPacket(idxIds, names, slots)); diff --git a/src/main/java/com/extendedae_plus/util/uploadPattern/ExtendedAEPatternUploadUtil.java b/src/main/java/com/extendedae_plus/util/uploadPattern/ExtendedAEPatternUploadUtil.java index a56d204..4d9c20f 100644 --- a/src/main/java/com/extendedae_plus/util/uploadPattern/ExtendedAEPatternUploadUtil.java +++ b/src/main/java/com/extendedae_plus/util/uploadPattern/ExtendedAEPatternUploadUtil.java @@ -929,12 +929,6 @@ public class ExtendedAEPatternUploadUtil { * @param args 参数 */ private static void sendMessage(ServerPlayer player, String key, Object... args) { - // 静默:不再向玩家左下角发送任何提示信息 - // 如需恢复,取消下面注释即可: - // if (player != null) { - // player.sendSystemMessage(Component.translatable(key, args)); - // } - // 如果玩家为null,静默忽略(用于测试环境) } /** @@ -944,23 +938,32 @@ public class ExtendedAEPatternUploadUtil { * @param menu 样板访问终端菜单 * @return 显示名称,如果无法获取则返回"未知供应器" */ - public static String getProviderDisplayName(long providerId, PatternAccessTermMenu menu) { + public static Component getProviderDisplayNameComponent(long providerId, PatternAccessTermMenu menu) { PatternContainer container = getPatternContainerById(menu, providerId); if (container == null) { - return Component.translatable("extendedae_plus.provider.unknown").getString(); + return Component.translatable("extendedae_plus.provider.unknown"); } try { // 尝试获取供应器的组信息来构建显示名称 var group = container.getTerminalGroup(); if (group != null) { - return group.name().getString(); + return group.name(); // 直接返回 Component,不转换为 String } } catch (Exception e) { // 忽略异常,使用默认名称 } - return Component.translatable("extendedae_plus.provider.named_id", providerId).getString(); + return Component.translatable("extendedae_plus.provider.named_id", providerId); + } + + /** + * 获取供应器显示名称(已弃用,请使用 getProviderDisplayNameComponent) + * 注意:此方法在服务端调用时会使用服务端语言,不推荐用于客户端显示 + */ + @Deprecated + public static String getProviderDisplayName(long providerId, PatternAccessTermMenu menu) { + return getProviderDisplayNameComponent(providerId, menu).getString(); } /** @@ -1199,15 +1202,26 @@ public class ExtendedAEPatternUploadUtil { return list; } - /** 获取供应器显示名(优先组名) */ - public static String getProviderDisplayName(PatternContainer container) { - if (container == null) return "未知供应器"; + /** 获取供应器显示名(优先组名)- 返回 Component 以支持客户端翻译 */ + public static Component getProviderDisplayNameComponent(PatternContainer container) { + if (container == null) { + return Component.translatable("extendedae_plus.provider.unknown"); + } try { var group = container.getTerminalGroup(); - if (group != null) return group.name().getString(); + if (group != null) return group.name(); // 直接返回 Component } catch (Throwable ignored) { } - return "样板供应器"; + return Component.translatable("extendedae_plus.provider.default"); + } + + /** + * 获取供应器显示名(优先组名)- 已弃用 + * 注意:此方法在服务端调用时会使用服务端语言,不推荐用于客户端显示 + */ + @Deprecated + public static String getProviderDisplayName(PatternContainer container) { + return getProviderDisplayNameComponent(container).getString(); } /** 计算供应器空槽位数量 */