样板上传选择界面字符串渲染改用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 List<Long> ids;
private final List<String> names;
private final List<Component> names; // 改为 Component
private final List<Integer> emptySlots;
// 分组后的数据同名合并
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> 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<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"));
this.parent = parent;
this.ids = ids;
@ -139,7 +139,7 @@ public class ProviderSelectScreen extends Screen {
// 使用 LinkedHashMap 保持首次出现顺序
Map<String, Group> 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());

View File

@ -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<Long> ids = new ArrayList<>(size);
List<String> names = new ArrayList<>(size);
List<Component> names = new ArrayList<>(size);
List<Integer> 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<Long> ids;
private final List<String> names;
private final List<Component> names; // 改为 Component
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.names = names;
this.emptySlots = emptySlots;

View File

@ -38,7 +38,7 @@ public class RequestProvidersListC2SPacket implements CustomPacketPayload {
if (CtrlQPendingUploadUtil.hasPendingCtrlQPattern(player)) {
List<PatternContainer> containers = CtrlQPendingUploadUtil.listAvailableProvidersFromPlayerNetwork(player);
List<Long> idxIds = new ArrayList<>();
List<String> names = new ArrayList<>();
List<net.minecraft.network.chat.Component> names = new ArrayList<>();
List<Integer> 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<Long> ids = ExtendedAEPatternUploadUtil.getAllProviderIds(accessMenu);
List<Long> filteredIds = new ArrayList<>();
List<String> names = new ArrayList<>();
List<net.minecraft.network.chat.Component> names = new ArrayList<>();
List<Integer> 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<PatternContainer> containers = ExtendedAEPatternUploadUtil.listAvailableProvidersFromGrid(encMenu);
List<Long> idxIds = new ArrayList<>();
List<String> names = new ArrayList<>();
List<net.minecraft.network.chat.Component> names = new ArrayList<>();
List<Integer> 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));

View File

@ -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();
}
/** 计算供应器空槽位数量 */