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

5.7 KiB
Raw Blame History

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 频率清零;列表与回显刷新。

标签网络注册中心(虚拟节点中心)

  • 新建 LabelNetworkRegistrySavedData/服务端单例)管理标签网络:
    • Key(label标准化, 维度或 null 取决于跨维配置, owner/team UUID)
    • ValueLabelNetworkSet<EndpointRef> 端点集合、VirtualNodeRef virtualNode(虚拟 AE2 节点句柄)、long channel(专用频道号)、在线统计。
  • 虚拟节点:
    • 创建:新建/首用标签时,使用 ManagedGridNodesetInWorldNode(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 labelForDisplayUI 回显);long frequency 由标签网络分配。
  • NBT继续存 frequencylonglabel 字符串;加载后通过 registry 获取频道号并连向虚拟节点。
  • 连接实现:可复用 WirelessSlaveLink 的“连接到指定节点”能力,去掉主端假设;或实现单一 LabelLink,始终尝试连接虚拟节点(失败则重试/断开)。

网络与数据包

  • 新包:LabelNetworkActionC2SPacketBlockPos + label + 操作类型[新建/删除/切换])。
  • 服务端处理:
    1. 校验 label → 调用 LabelNetworkRegistry 分配/切换/删除;必要时创建/销毁虚拟节点。
    2. 写入 BE更新 frequencylabelForDisplay;指向虚拟节点并重连。
    3. 反馈消息包含标签、频道号、在线数/连接状态。

方块与资源

  • 方块模型/贴图/语言键需新增(block.extendedae_plus.labeled_wireless_transceiver 等)。
  • 配方独立(避免与旧版冲突)。
  • BlockState可复用旧收发器的 STATE 显示逻辑。

配置项(可选)

  • 映射区间起始/上限。
  • 标签字符集/长度限制。
  • 跨维度共享开关(与现有无线配置保持一致)。

风险与注意点

  • 并发分配:务必在服务端单点分配并二次检查注册中心占用,防止重复。
  • 同名稳定:同 owner/team 的同名需返回同一频道号,否则可能导致已有网络断开。
  • 预留区间耗尽:需提示玩家清理无用标签或回退使用旧版数值收发器。
  • 交互收缩:已移除所有徒手 +/- 频率操作,玩家需通过 UI 设置标签。