样板上传选择界面字符串渲染改用component

This commit is contained in:
GaLi 2026-03-02 10:21:03 +08:00
parent a9f1a6cadf
commit aa8fda3b73
4 changed files with 46 additions and 30 deletions

View File

@ -22,11 +22,11 @@ public class ProviderSelectScreen extends Screen {
private final Screen parent; private final Screen parent;
// 原始数据 // 原始数据
private final List<Long> ids; private final List<Long> ids;
private final List<String> names; private final List<Component> names; // 改为 Component
private final List<Integer> emptySlots; private final List<Integer> emptySlots;
// 分组后的数据同名合并 // 分组后的数据同名合并
private final List<Long> gIds = new ArrayList<>(); // 代表条目使用的 providerId选择空位数最多的那个 private final List<Long> gIds = new ArrayList<>(); // 代表条目使用的 providerId选择空位数最多的那个
private final List<String> gNames = new ArrayList<>(); // 分组名供应器名称 private final List<String> gNames = new ArrayList<>(); // 分组名供应器名称- 转换为 String 用于显示和匹配
private final List<Integer> gTotalSlots = new ArrayList<>(); // 该名称下供应器空位总和 private final List<Integer> gTotalSlots = new ArrayList<>(); // 该名称下供应器空位总和
private final List<Integer> gCount = new ArrayList<>(); // 该名称下供应器数量 private final List<Integer> gCount = new ArrayList<>(); // 该名称下供应器数量
// 过滤后的数据由查询生成 // 过滤后的数据由查询生成
@ -43,7 +43,7 @@ public class ProviderSelectScreen extends Screen {
private boolean needsRefresh = false; private boolean needsRefresh = false;
private int page = 0; private int page = 0;
public ProviderSelectScreen(Screen parent, List<Long> ids, List<String> names, List<Integer> emptySlots) { public ProviderSelectScreen(Screen parent, List<Long> ids, List<Component> names, List<Integer> emptySlots) {
super(Component.translatable("extendedae_plus.screen.choose_provider.title")); super(Component.translatable("extendedae_plus.screen.choose_provider.title"));
this.parent = parent; this.parent = parent;
this.ids = ids; this.ids = ids;
@ -139,7 +139,7 @@ public class ProviderSelectScreen extends Screen {
// 使用 LinkedHashMap 保持首次出现顺序 // 使用 LinkedHashMap 保持首次出现顺序
Map<String, Group> map = new LinkedHashMap<>(); Map<String, Group> map = new LinkedHashMap<>();
for (int i = 0; i < this.names.size(); i++) { 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); long id = this.ids.get(i);
int slots = this.emptySlots.get(i); int slots = this.emptySlots.get(i);
Group g = map.computeIfAbsent(name, k -> new Group()); Group g = map.computeIfAbsent(name, k -> new Group());

View File

@ -4,6 +4,8 @@ import com.extendedae_plus.ExtendedAEPlus;
import com.extendedae_plus.client.screen.ProviderSelectScreen; import com.extendedae_plus.client.screen.ProviderSelectScreen;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.network.RegistryFriendlyByteBuf; 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.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -26,18 +28,18 @@ public class ProvidersListS2CPacket implements CustomPacketPayload {
buf.writeVarInt(pkt.ids.size()); buf.writeVarInt(pkt.ids.size());
for (int i = 0; i < pkt.ids.size(); i++) { for (int i = 0; i < pkt.ids.size(); i++) {
buf.writeLong(pkt.ids.get(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.writeVarInt(pkt.emptySlots.get(i));
} }
}, },
buf -> { buf -> {
int size = buf.readVarInt(); int size = buf.readVarInt();
List<Long> ids = new ArrayList<>(size); List<Long> ids = new ArrayList<>(size);
List<String> names = new ArrayList<>(size); List<Component> names = new ArrayList<>(size);
List<Integer> slots = new ArrayList<>(size); List<Integer> slots = new ArrayList<>(size);
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
ids.add(buf.readLong()); ids.add(buf.readLong());
names.add(buf.readUtf()); names.add(ComponentSerialization.TRUSTED_STREAM_CODEC.decode(buf)); // 使用 Component 反序列化
slots.add(buf.readVarInt()); slots.add(buf.readVarInt());
} }
return new ProvidersListS2CPacket(ids, names, slots); return new ProvidersListS2CPacket(ids, names, slots);
@ -45,10 +47,10 @@ public class ProvidersListS2CPacket implements CustomPacketPayload {
); );
private final List<Long> ids; private final List<Long> ids;
private final List<String> names; private final List<Component> names; // 改为 Component
private final List<Integer> emptySlots; private final List<Integer> emptySlots;
ProvidersListS2CPacket(List<Long> ids, List<String> names, List<Integer> emptySlots) { ProvidersListS2CPacket(List<Long> ids, List<Component> names, List<Integer> emptySlots) {
this.ids = ids; this.ids = ids;
this.names = names; this.names = names;
this.emptySlots = emptySlots; this.emptySlots = emptySlots;

View File

@ -38,7 +38,7 @@ public class RequestProvidersListC2SPacket implements CustomPacketPayload {
if (CtrlQPendingUploadUtil.hasPendingCtrlQPattern(player)) { if (CtrlQPendingUploadUtil.hasPendingCtrlQPattern(player)) {
List<PatternContainer> containers = CtrlQPendingUploadUtil.listAvailableProvidersFromPlayerNetwork(player); List<PatternContainer> containers = CtrlQPendingUploadUtil.listAvailableProvidersFromPlayerNetwork(player);
List<Long> idxIds = new ArrayList<>(); List<Long> idxIds = new ArrayList<>();
List<String> names = new ArrayList<>(); List<net.minecraft.network.chat.Component> names = new ArrayList<>();
List<Integer> slots = new ArrayList<>(); List<Integer> slots = new ArrayList<>();
for (int i = 0; i < containers.size(); i++) { for (int i = 0; i < containers.size(); i++) {
var c = containers.get(i); var c = containers.get(i);
@ -47,7 +47,7 @@ public class RequestProvidersListC2SPacket implements CustomPacketPayload {
if (empty <= 0) continue; if (empty <= 0) continue;
long encodedId = -1L - i; long encodedId = -1L - i;
idxIds.add(encodedId); idxIds.add(encodedId);
names.add(ExtendedAEPatternUploadUtil.getProviderDisplayName(c)); names.add(ExtendedAEPatternUploadUtil.getProviderDisplayNameComponent(c));
slots.add(empty); slots.add(empty);
} }
player.connection.send(new ProvidersListS2CPacket(idxIds, names, slots)); player.connection.send(new ProvidersListS2CPacket(idxIds, names, slots));
@ -61,7 +61,7 @@ public class RequestProvidersListC2SPacket implements CustomPacketPayload {
if (accessMenu != null) { if (accessMenu != null) {
List<Long> ids = ExtendedAEPatternUploadUtil.getAllProviderIds(accessMenu); List<Long> ids = ExtendedAEPatternUploadUtil.getAllProviderIds(accessMenu);
List<Long> filteredIds = new ArrayList<>(); List<Long> filteredIds = new ArrayList<>();
List<String> names = new ArrayList<>(); List<net.minecraft.network.chat.Component> names = new ArrayList<>();
List<Integer> slots = new ArrayList<>(); List<Integer> slots = new ArrayList<>();
for (Long id : ids) { for (Long id : ids) {
@ -70,7 +70,7 @@ public class RequestProvidersListC2SPacket implements CustomPacketPayload {
int empty = ExtendedAEPatternUploadUtil.getAvailableSlots(id, accessMenu); int empty = ExtendedAEPatternUploadUtil.getAvailableSlots(id, accessMenu);
if (empty <= 0) continue; // 只列出有空位的 if (empty <= 0) continue; // 只列出有空位的
filteredIds.add(id); filteredIds.add(id);
names.add(ExtendedAEPatternUploadUtil.getProviderDisplayName(id, accessMenu)); names.add(ExtendedAEPatternUploadUtil.getProviderDisplayNameComponent(id, accessMenu));
slots.add(empty); slots.add(empty);
} }
@ -81,7 +81,7 @@ public class RequestProvidersListC2SPacket implements CustomPacketPayload {
// 回退基于编码终端所在网络枚举供应器负数ID编码索引encodedId = -1 - index // 回退基于编码终端所在网络枚举供应器负数ID编码索引encodedId = -1 - index
List<PatternContainer> containers = ExtendedAEPatternUploadUtil.listAvailableProvidersFromGrid(encMenu); List<PatternContainer> containers = ExtendedAEPatternUploadUtil.listAvailableProvidersFromGrid(encMenu);
List<Long> idxIds = new ArrayList<>(); List<Long> idxIds = new ArrayList<>();
List<String> names = new ArrayList<>(); List<net.minecraft.network.chat.Component> names = new ArrayList<>();
List<Integer> slots = new ArrayList<>(); List<Integer> slots = new ArrayList<>();
for (int i = 0; i < containers.size(); i++) { for (int i = 0; i < containers.size(); i++) {
var c = containers.get(i); var c = containers.get(i);
@ -90,7 +90,7 @@ public class RequestProvidersListC2SPacket implements CustomPacketPayload {
if (empty <= 0) continue; if (empty <= 0) continue;
long encodedId = -1L - i; // 约定负数代表按索引 long encodedId = -1L - i; // 约定负数代表按索引
idxIds.add(encodedId); idxIds.add(encodedId);
names.add(ExtendedAEPatternUploadUtil.getProviderDisplayName(c)); names.add(ExtendedAEPatternUploadUtil.getProviderDisplayNameComponent(c));
slots.add(empty); slots.add(empty);
} }
player.connection.send(new ProvidersListS2CPacket(idxIds, names, slots)); player.connection.send(new ProvidersListS2CPacket(idxIds, names, slots));

View File

@ -929,12 +929,6 @@ public class ExtendedAEPatternUploadUtil {
* @param args 参数 * @param args 参数
*/ */
private static void sendMessage(ServerPlayer player, String key, Object... 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 样板访问终端菜单 * @param menu 样板访问终端菜单
* @return 显示名称如果无法获取则返回"未知供应器" * @return 显示名称如果无法获取则返回"未知供应器"
*/ */
public static String getProviderDisplayName(long providerId, PatternAccessTermMenu menu) { public static Component getProviderDisplayNameComponent(long providerId, PatternAccessTermMenu menu) {
PatternContainer container = getPatternContainerById(menu, providerId); PatternContainer container = getPatternContainerById(menu, providerId);
if (container == null) { if (container == null) {
return Component.translatable("extendedae_plus.provider.unknown").getString(); return Component.translatable("extendedae_plus.provider.unknown");
} }
try { try {
// 尝试获取供应器的组信息来构建显示名称 // 尝试获取供应器的组信息来构建显示名称
var group = container.getTerminalGroup(); var group = container.getTerminalGroup();
if (group != null) { if (group != null) {
return group.name().getString(); return group.name(); // 直接返回 Component不转换为 String
} }
} catch (Exception e) { } 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; return list;
} }
/** 获取供应器显示名(优先组名) */ /** 获取供应器显示名(优先组名)- 返回 Component 以支持客户端翻译 */
public static String getProviderDisplayName(PatternContainer container) { public static Component getProviderDisplayNameComponent(PatternContainer container) {
if (container == null) return "未知供应器"; if (container == null) {
return Component.translatable("extendedae_plus.provider.unknown");
}
try { try {
var group = container.getTerminalGroup(); var group = container.getTerminalGroup();
if (group != null) return group.name().getString(); if (group != null) return group.name(); // 直接返回 Component
} catch (Throwable ignored) { } catch (Throwable ignored) {
} }
return "样板供应器"; return Component.translatable("extendedae_plus.provider.default");
}
/**
* 获取供应器显示名优先组名- 已弃用
* 注意此方法在服务端调用时会使用服务端语言不推荐用于客户端显示
*/
@Deprecated
public static String getProviderDisplayName(PatternContainer container) {
return getProviderDisplayNameComponent(container).getString();
} }
/** 计算供应器空槽位数量 */ /** 计算供应器空槽位数量 */