样板上传选择界面字符串渲染改用component
This commit is contained in:
parent
a9f1a6cadf
commit
aa8fda3b73
|
|
@ -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());
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 计算供应器空槽位数量 */
|
/** 计算供应器空槽位数量 */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user