ExtendedAE_Plus/doc/labeled_wireless_transceiver_design.md
2025-12-11 20:31:37 +08:00

76 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Labeled Wireless Transceiver 设计方案(标签无线收发器)
## 目标与命名
- 新方块/物品/BELabeled Wireless Transceiver标签无线收发器注册名 `labeled_wireless_transceiver`
- 功能与旧收发器一致,但增加 UI使用字符串标签管理频道底层仍用 long 频率。
- 旧收发器保留原行为,频段互不干扰。
## 交互与 UI无主从统一标签界面虚拟节点中心
- 方块交互:**取消全部徒手/道具交互,只保留右键打开 UI**。
- 单一界面,核心元素:
1) 全局标签-频道列表(从服务端获取 LabelNetworkRegistry 映射),展示标签名、频道号、在线端点数。
2) 当前收发器的标签与频道号(只读频道号,标签可编辑/选择)。
3) 连接状态:已连接、未连接、离线/超距(可用状态徽标)。
4) 操作按钮:
- “新建标签”:输入合法标签,分配频道并创建/获取对应虚拟节点,当前收发器加入该网络。
- “删除标签”:删除当前标签映射(当网络端点数为 0 时销毁虚拟节点并回收频道),当前收发器清空标签并断开。
- “设为当前频道”:将当前收发器切换到列表选中的标签网络(连接到该标签的虚拟节点)。
- “刷新列表”:从服务端重新获取映射与统计。
5) 搜索/过滤框(可选):按标签关键字过滤列表。
- UI 流程(建议):
- 打开 UI → 获取全局映射列表 + 当前端点的标签/频道 + 连接状态 → 填充列表和回显。
- 应用/切换标签:发送 C2S 包BlockPos + label + 操作类型),服务端分配/查询频道号、创建或获取虚拟节点并写回 BE。
- 删除:发送删除操作;服务端移除映射(若网络无端点则销毁虚拟节点,回收频道),将该 BE 频率清零;列表与回显刷新。
## 标签网络注册中心(虚拟节点中心)
- 新建 `LabelNetworkRegistry`SavedData/服务端单例)管理标签网络:
- Key`(label标准化, 维度或 null 取决于跨维配置, owner/team UUID)`
- Value`LabelNetwork``Set<EndpointRef>` 端点集合、`VirtualNodeRef virtualNode`(虚拟 AE2 节点句柄)、`long channel`(专用频道号)、在线统计。
- 虚拟节点:
- 创建:新建/首用标签时,使用 `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 + 操作类型[新建/删除/切换])。
- 服务端处理:
1) 校验 label → 调用 `LabelNetworkRegistry` 分配/切换/删除;必要时创建/销毁虚拟节点。
2) 写入 BE更新 `frequency`、`labelForDisplay`;指向虚拟节点并重连。
3) 反馈消息包含标签、频道号、在线数/连接状态。
## 方块与资源
- 方块模型/贴图/语言键需新增(`block.extendedae_plus.labeled_wireless_transceiver` 等)。
- 配方独立(避免与旧版冲突)。
- BlockState可复用旧收发器的 STATE 显示逻辑。
## 配置项(可选)
- 映射区间起始/上限。
- 标签字符集/长度限制。
- 跨维度共享开关(与现有无线配置保持一致)。
## 风险与注意点
- 并发分配:务必在服务端单点分配并二次检查注册中心占用,防止重复。
- 同名稳定:同 owner/team 的同名需返回同一频道号,否则可能导致已有网络断开。
- 预留区间耗尽:需提示玩家清理无用标签或回退使用旧版数值收发器。
- 交互收缩:已移除所有徒手 +/- 频率操作,玩家需通过 UI 设置标签。