Stargate Address

基本信息

属性 值
类 gcewing.sg.SGAddressing(SGAddressing.java:38),共 276 行
字符表 ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789(SGAddressing.java:46)
符号总数 36(SGAddressing.java:47)
地址长度 7 位(同维度)或 9 位(跨维度),即 CCCCCCC 或 CCCCCCCDD(SGAddressing.java:10-20)
坐标范围 ±139 967 区块 = ±2 239 472 格(SGAddressing.java:22、:52)

功能

地址是星门的唯一身份标识,由区块坐标 + 维度经哈希与交织后编码成 36 进制字符串。

编码流程

addressForLocation 分四步(SGAddressing.java:101-122):

  1. 取 chunkx = pos.x >> 4、chunkz = pos.z >> 4,超范围抛"坐标越界"(SGAddressing.java:104-106)。
  2. 两坐标各经 hash(v, pc, mc) 散列后 interleaveCoords 交织成 c(SGAddressing.java:109、:187-202)。交织是 6 进制交替展开,因此 7 位符号够编码两路 6 进制数。
  3. 维度经 permuteDimension 与坐标耦合后 hash 得 d(SGAddressing.java:110-111、:177-180)。
  4. c 取 7 位、d 取 2 位,拼接成 9 位地址(SGAddressing.java:120)。

解码流程

findAddressedStargate 反向运算(SGAddressing.java:123-158),并在目标区块的 chunkTileEntityMap 中找出第一个 SGBaseTE(SGAddressing.java:159-176)。7 位地址被当作相对地址,只在调用者所在维度查找(SGAddressing.java:151-155)。

维度符号的动态映射

维度编号来自 SGDimensionMap.indexForDimension,上限 1295(SGAddressing.java:56、:107-108),超过则抛"维度不可达"。

代码保留了一条历史兼容路径:若按新方案找不到门,会用 qdOld / mdOld 重新解释同两个维度符号再试一次(SGAddressing.java:144-150、:66-69)。源码注释标为 “Historical error”(SGAddressing.java:66)。

数值

常量 值 来源
numSymbols 36 SGAddressing.java:47
numCoordSymbols 7 SGAddressing.java:48
numDimensionSymbols 2 SGAddressing.java:49
maxCoord / minCoord 139 967 / -139 967 SGAddressing.java:52-53
coordRange 279 935 SGAddressing.java:54
maxDimensionIndex 1295 SGAddressing.java:56
mc coordRange + 2 = 279 937 SGAddressing.java:59
pc 93 563(满足 (pc * qc) % mc == 1) SGAddressing.java:60
qc 153 742 SGAddressing.java:61
md dimensionRange + 1 = 1297 SGAddressing.java:63
pd 953(满足 (pd * qd) % md == 1) SGAddressing.java:64
qd 788 SGAddressing.java:65
归一化 replace("-", "").toUpperCase() SGAddressing.java:97-100
显示格式 坐标部分第 4 位后插分隔符 SGAddressing.java:263-270

pc 与 qc 互为模 mc 的乘法逆元,这就是同一个 hash 函数既能用 pc 正向散列、又能用 qc 反向还原的原因(SGAddressing.java:129-130)。同理解释了 pd / qd。

交互

  • 自动生成:底座首次服务端加载时写入 homeAddress;失败时把 AddressingError 的消息写入 addressError(tileentities/SGBaseTE.java:650-656)。
  • 本地地址:localAddress() 只取前 7 位,用于显示(SGAddressing.java:272-275)。
  • 补齐显示:padAddress 用 - 补到指定长度,再 formatAddress 加空格分隔(SGAddressing.java:258-270)。
  • 错误类型:malformedAddressError(长度或字符非法)、coordRangeError、dimensionRangeError(SGAddressing.java:42-45)。

相关条目