5.7 KiB
5.7 KiB
Labeled Wireless Transceiver 设计方案(标签无线收发器)
目标与命名
- 新方块/物品/BE:Labeled Wireless Transceiver(标签无线收发器),注册名
labeled_wireless_transceiver。 - 功能与旧收发器一致,但增加 UI,使用字符串标签管理频道;底层仍用 long 频率。
- 旧收发器保留原行为,频段互不干扰。
交互与 UI(无主从,统一标签界面,虚拟节点中心)
- 方块交互:取消全部徒手/道具交互,只保留右键打开 UI。
- 单一界面,核心元素:
- 全局标签-频道列表(从服务端获取 LabelNetworkRegistry 映射),展示标签名、频道号、在线端点数。
- 当前收发器的标签与频道号(只读频道号,标签可编辑/选择)。
- 连接状态:已连接、未连接、离线/超距(可用状态徽标)。
- 操作按钮:
- “新建标签”:输入合法标签,分配频道并创建/获取对应虚拟节点,当前收发器加入该网络。
- “删除标签”:删除当前标签映射(当网络端点数为 0 时销毁虚拟节点并回收频道),当前收发器清空标签并断开。
- “设为当前频道”:将当前收发器切换到列表选中的标签网络(连接到该标签的虚拟节点)。
- “刷新列表”:从服务端重新获取映射与统计。
- 搜索/过滤框(可选):按标签关键字过滤列表。
- UI 流程(建议):
- 打开 UI → 获取全局映射列表 + 当前端点的标签/频道 + 连接状态 → 填充列表和回显。
- 应用/切换标签:发送 C2S 包(BlockPos + label + 操作类型),服务端分配/查询频道号、创建或获取虚拟节点并写回 BE。
- 删除:发送删除操作;服务端移除映射(若网络无端点则销毁虚拟节点,回收频道),将该 BE 频率清零;列表与回显刷新。
标签网络注册中心(虚拟节点中心)
- 新建
LabelNetworkRegistry(SavedData/服务端单例)管理标签网络:- Key:
(label标准化, 维度或 null 取决于跨维配置, owner/team UUID) - Value:
LabelNetwork:Set<EndpointRef>端点集合、VirtualNodeRef virtualNode(虚拟 AE2 节点句柄)、long channel(专用频道号)、在线统计。
- Key:
- 虚拟节点:
- 创建:新建/首用标签时,使用
ManagedGridNode,setInWorldNode(false),create(level, null)创建非 in-world 节点;setIdlePowerUsage(0)(可配置)并设置 visual representation。 - 维度选择:若跨维开启,统一用主世界;否则按所在维度创建对应虚拟节点。
- 持久化:SavedData 记录虚拟节点需要的重建信息(labelKey、channel、owner/team);重启时重建虚拟节点并复用频道。
- 创建:新建/首用标签时,使用
- 连接拓扑:
- 所有收发器端点直接连接到该标签的虚拟节点(单中心,避免选举和 n² 连接)。
- 当标签网络端点数为 0 时,销毁虚拟节点并回收频道号。
- 频道号分配:
- 预留专用频率区间:从
1_000_000起向上分配,防止与旧版收发器冲突。 - 频道号存放在 LabelNetwork 中,端点读取后设置自己的
frequency字段即可,无需改底层 AE2 API。
- 预留专用频率区间:从
- API 建议:
register(endpoint, label, owner, level):加入网络,若无虚拟节点则创建并分配频道。unregister(endpoint):移除端点,若网络端点为 0 则销毁虚拟节点并回收频道。setLabel(endpoint, newLabel):先注销再按新标签注册。listNetworks(owner, dim/null):供 UI 拉取“标签-频道-在线数”。getNetwork(labelKey):UI 获取当前标签网络的在线端/状态。
- 持久化:SavedData 持久化标签→频道号→端点集合(弱引用/位置)及虚拟节点重建所需信息;主线程访问,定期清理无效引用。
- 校验:字符集
[A-Za-z0-9_-],长度 ≤ 32(或 64),标准化 trim + lower,空串无效。
BE 与逻辑复用
- BE 保留
long frequency字段与节点/连接逻辑,不分主从;连接目标是标签对应的虚拟节点。 - 新增字段:
String labelForDisplay(UI 回显);long frequency由标签网络分配。 - NBT:继续存
frequency(long)和label字符串;加载后通过 registry 获取频道号并连向虚拟节点。 - 连接实现:可复用
WirelessSlaveLink的“连接到指定节点”能力,去掉主端假设;或实现单一LabelLink,始终尝试连接虚拟节点(失败则重试/断开)。
网络与数据包
- 新包:
LabelNetworkActionC2SPacket(BlockPos + label + 操作类型[新建/删除/切换])。 - 服务端处理:
- 校验 label → 调用
LabelNetworkRegistry分配/切换/删除;必要时创建/销毁虚拟节点。 - 写入 BE:更新
frequency、labelForDisplay;指向虚拟节点并重连。 - 反馈消息包含标签、频道号、在线数/连接状态。
- 校验 label → 调用
方块与资源
- 方块模型/贴图/语言键需新增(
block.extendedae_plus.labeled_wireless_transceiver等)。 - 配方独立(避免与旧版冲突)。
- BlockState:可复用旧收发器的 STATE 显示逻辑。
配置项(可选)
- 映射区间起始/上限。
- 标签字符集/长度限制。
- 跨维度共享开关(与现有无线配置保持一致)。
风险与注意点
- 并发分配:务必在服务端单点分配并二次检查注册中心占用,防止重复。
- 同名稳定:同 owner/team 的同名需返回同一频道号,否则可能导致已有网络断开。
- 预留区间耗尽:需提示玩家清理无用标签或回退使用旧版数值收发器。
- 交互收缩:已移除所有徒手 +/- 频率操作,玩家需通过 UI 设置标签。