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)。

相关条目