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):
- 取
chunkx = pos.x >> 4、chunkz = pos.z >> 4,超范围抛"坐标越界"(SGAddressing.java:104-106)。 - 两坐标各经
hash(v, pc, mc)散列后interleaveCoords交织成c(SGAddressing.java:109、:187-202)。交织是 6 进制交替展开,因此 7 位符号够编码两路 6 进制数。 - 维度经
permuteDimension与坐标耦合后hash得d(SGAddressing.java:110-111、:177-180)。 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)。
相关条目
- SGBaseTE - 持有
homeAddress与dialledAddress - 界面 - 地址显示与输入
- Packet Channel -
ConnectOrDisconnect传输的就是地址字符串 - Stargate Base