Star Gate
基本信息
| 属性 | 值 |
|---|---|
| 形状 | 5 × 5 的竖直平面外框(1 格厚),非 3D 方块结构 |
| 核心方块 | Stargate Base × 1,位于外框底部正中 |
| 外环方块 | Stargate Ring meta 0 × 8 + meta 1(导标)× 7 |
| 判定来源 | SGBaseBlock.pattern(blocks/SGBaseBlock.java:50-51) |
| 需要的外环总数 | 15(8 + 7) |
功能
星门没有"方块实体"——没有 ItemBlock 框,也没有 Multiblock 类。它的判定完全是底座方块自己扫描周边方块得出的:checkForMerge 在底座局部坐标的 i ∈ [-2,2]、j ∈ [0,4] 平面上逐格比对 pattern(blocks/SGBaseBlock.java:169-197)。
getRingBlockType 把世界方块翻译成图案值:空气 → 0;未合并的外环 meta 0 → 1;未合并的外环 meta 1 → 2;其余一律 -1(blocks/SGBaseBlock.java:199-214)。已被合并的外环不再匹配——这就是为什么拆掉一个环段会导致整座门立即解散。
图案
pattern 按 pattern[4 - j][2 + i] 索引,即数组第 0 行对应局部高度 j=4(最顶),第 4 行对应 j=0(最底)(blocks/SGBaseBlock.java:50-51、blocks/SGBaseBlock.java:180):
| j=4(顶) | 2 | 1 | 2 | 1 | 2 |
|---|---|---|---|---|---|
| j=3 | 1 | 0 | 0 | 0 | 1 |
| j=2 | 2 | 0 | 0 | 0 | 2 |
| j=1 | 1 | 0 | 0 | 0 | 1 |
| j=0(底) | 2 | 1 | 底座 | 1 | 2 |
(表中 0 = 镂空,1 = 外环方块,2 = 导标方块。)
中柱 j=0、i=0 那一格被循环显式跳过(if (!(i == 0 && j == 0)),blocks/SGBaseBlock.java:176)——那里放的就是底座本身。图案值 0 的格子是镂空,可以填任何方块,也可以是空气。判定循环实际访问 24 格(25 减底座格),其中 9 格是镂空、15 格必须匹配。
数值
| 项目 | 值 | 来源 |
|---|---|---|
| 底座上方外环高度 | 4 格(j = 1…4) | blocks/SGBaseBlock.java:50-51 |
| 外框边长 | 5 × 5,1 格厚 | blocks/SGBaseBlock.java:50-51 |
| 导标方块(值 2) | 7 个 | 对 blocks/SGBaseBlock.java:50-51 计数 |
| 外环方块(值 1) | 8 个 | 对 blocks/SGBaseBlock.java:50-51 计数 |
| 镂空位(值 0) | 10 个(含底座格) | 对 blocks/SGBaseBlock.java:50-51 计数 |
5×5 = 25 = 7(导标)+ 8(外环)+ 10(镂空)。其中 10 个镂空位里,9 个是外框内部(3×3),第 10 个是底座占据的底部正中格。整座门实际消耗 7 个导标方块 + 8 个外环方块 + 1 个底座 = 16 个方块。
交互
- 成立:底座放下瞬间调用
onBlockAdded → checkForMerge(blocks/SGBaseBlock.java:131-134);外环段放下时updateBaseBlocks也会反向触发底座的checkForMerge(blocks/SGRingBlock.java:190-204)。 - 解散:任意环段被破坏 →
breakBlock调updateBaseBlocks→ 底座unmerge(blocks/SGRingBlock.java:183-188、blocks/SGBaseBlock.java:231-247)。若解散时门正在Connected,会引爆。 - 拆除底座:
unmergeRing扫描底座周围完整的 5×5×5 立方体把所有环段解除合并(blocks/SGBaseBlock.java:253-261)。
相关条目
- Stargate Base - 中心方块
- Stargate Ring - 两种外环形态
- Stargate Controller - 供能方块
- 星门结构合成