红石科技基础之方块更新

红石科技基础之方块更新

方块更新的种类

在《我的世界》中,世界看起来是由无数静止的方块组成的,但实际上,这些方块一直在“互相通知变化”。这种“通知机制”,就叫做 方块更新(Block Update)

如果没有方块更新:红石不会响应,沙子不会掉落,火把不会熄灭,门、活塞、电路都会失灵。可以说方块更新,是 Minecraft 世界能动起来的底层逻辑之一。在Java版中,有两种主要的方块更新,即PP更新NC更新

PP更新(Shape Update/Post-Placement Update

PP更新是游戏内最广泛的方块更新类型。它用于方块的放置、修改和移除等各种方块变化中,执行改变方块的形状与检查附着性等操作。你可以将PP更新简单理解为检查“我还能不能待在这里?”当一个方块被放置、移除或形状发生变化时, 周围的方块会进行一次结构与附着检查

  • 产生PP更新

PP更新必须由一次方块放置、修改或移除产生。当方块被放置、破坏,或方块状态产生变化时,系统会在这个方块修改之后依次向西、东、北、南、下、上的方块传播PP更新

图 1:PP更新范围

6c042b118720260123154047

  • PP 更新行为对照表

行为类别 涉及方块(示例) 接收到 PP 更新后的主要行为
附着检查 火把、按钮、拉杆、告示牌、压力板等(不含铁轨) 检查是否仍能附着在更新来源方向的方块上;不能则掉落或延迟 1 刻后破坏
重力检查 沙子、沙砾、混凝土粉末 检查下方是否有支撑;无支撑则变为下落方块(混凝土粉末可能进一步固化)
流体更新 水、岩浆、含水方块 添加流体计划刻以重新计算流动或含水状态
含水方块特殊处理 含水栅栏 先处理流体更新,再更新连接形状
连接关系更新 箱子、栅栏、玻璃板、绊线 检查是否需要与更新方向上的方块建立或断开连接
多方块结构检查 床、门 检查多方块结构是否完整;若破坏且更新源在结构范围内则掉落
生物方块存活检查 珊瑚 检查周围是否有水;无水则延迟数秒后死亡
植物状态更新 树叶 延迟 1 刻后重新计算与原木的距离并更新状态
地表方块退化检查 耕地、草径、草方块、菌丝 接收到来自上方的 PP 更新时检查是否退化或改变状态
气泡柱相关 气泡柱、岩浆块、灵魂沙 检查是否需要生成、更新或移除气泡柱(可能延迟执行)
功能状态判断 营火 接收到来自下方的 PP 更新时检查是否成为信号火
音效 / 表现变化 音符盒 接收到来自上下方的 PP 更新时改变乐器类型
红石形态检查 红石线、中继器、比较器 检查附着、连接或锁定状态(不直接计算信号强度)
侦测器触发 侦测器 在未激活状态下接收到面对方向的 PP 更新会延迟输出红石信号
红石线间接传播 红石线 在间接 PP 更新时额外向斜上、斜下传播,用于更新红石线形态
活塞结构检查 活塞头 接收到来自后方的 PP 更新时检查对应活塞是否存在,不存在则立刻破坏

NC更新(Neighbor Changed Update

NC更新,指的是最基础的,是最广为人知的方块更新,主要用于红石元件。你可以将PP更新简单理解为“我旁边的方块变了,我要不要改变状态?”这是红石能工作的关键

  • 产生NC更新

    与PP更新类似,NC更新也必须由一次方块放置、修改或移除产生,方块实体的变化也可能产生NC更新

    为了简化说明,在这里我们引入更新核二阶更新核的概念:

    • 若一个方块为更新核,则它会依次向本方块的西、东、下、上、北、南方向(或排除其中某一个方向)上的方块传播NC更新。(与PP更新一致)

    • 若一个方块为二阶更新核,则它本质上等价于本方块周围6个方块都为更新核。在传播更新时,先执行本方块更新核的NC更新传播,再依次执行本方块下、上、北、南、西、东方向上的更新核进行NC更新传播。有些二阶更新核本方块不会产生NC更新,也有一些二阶更新核调用子更新核的顺序随机

    绝大多数的方块放置、破坏、更新方块状态和方块实体更新都会以自身方块为更新核传播NC更新,即按照西、东、下、上、北、南的顺序依次传播NC更新

    图 2:二阶更新核范围

    ad1dd675c420260123154050

    • 特殊NC更新表

    方块类型 触发情况 NC 更新的更新核 主要特征
    压力板 / 按钮 / 拉杆 / 避雷针 / 绊线钩 切换激活状态;激活时被破坏 自身 + 附着方块 更新中心偏向“所附着的方块”
    讲台 / 陷阱箱 / 幽匿感测体 激活状态变化;激活时被破坏 自身 + 下方方块 更新向下传播,是下方 BUD 的基础
    红石火把 放置、破坏、状态变化 自身(作为二阶更新核) 更新层级更深,易引发连锁反应
    侦测器 激活状态变化 输出方向方块 不以自身为核,认为变化发生在“输出端”
      激活时被破坏 自身 破坏时行为回归正常
    拉杆(更新顺序特性) 切换激活状态 先自身 → 再附着方块 双阶段 NC 更新
    幽匿感测体(更新顺序特性) 切换激活状态 先自身 → 再下方方块 双阶段 NC 更新
    潜影盒 开合、结束开合动画 自身 动画本身会触发 NC 更新
    铁轨(通用) 被破坏 上方 / 自身 / 下方(取决于状态) 更新核位置与倾斜、类型有关
    动力 / 激活 / 探测铁轨 放置、破坏、状态变化 上方 + 自身 + 下方(按顺序) NC 更新范围最大、次数最多
    倾斜铁轨 状态变化 上方方块(优先) 更新“向上抬一格”
    红石中继器 / 比较器 放置、破坏 自身 + 输出方向方块 输出端优先
      接收 NC 更新且下方无支撑 自身(二阶更新核) 会额外触发一轮 NC 更新
    红石比较器 输出信号变化 输出方向方块 不包含更新源自身
    红石线(总体) 放置、破坏、信号变化 自身 / 上下方 / 邻近红石线 NC 更新极其复杂
    红石线(传播顺序) 任意 NC 更新 北 → 东 → 南 → 西 顺序固定,是红石特性的来源
    红石线 + 红石导体 状态变化 导体上方或下方红石线 更新会被“抬高或压低”
    红石线形态变化(点 ↔ 十字) 形态切换 水平方向红石导体 更新核不在红石线自身
    可输出模拟信号的方块 / 容器 状态或内容变化 红石比较器 触发“比较器更新”(特殊 NC 更新)

详细内容见

  • NC更新行为对照表

行为类别 涉及方块 接收到 NC 更新后的主要行为
铁轨状态更新 各类铁轨(普通、动力、激活、探测) 更新激活状态并检查自身附着情况
流体传播 水、岩浆等流体 在可传播条件下添加流体计划刻,重新计算流动
命令执行 命令方块 更新激活状态;若被激活,延迟 1 游戏刻后执行命令
结构操作 结构方块 执行对应的保存 / 加载 / 检测等结构操作
声音输出(红石驱动) 更新激活状态,激活时发出声音
  音符盒 更新激活状态,激活时发出音符
植物行为 大型垂滴叶 在有红石信号时重置倾斜程度
开关类方块 门、活板门、栅栏门 更新开闭状态;含水活板门状态改变时额外更新流体
红石器件逻辑 红石中继器、红石比较器 检查附着并尝试重新计算输出信号
投掷与发射 投掷器、发射器 切换激活状态;激活时延迟 4 游戏刻执行投掷/发射
红石灯逻辑 红石灯 有信号但未亮:延迟点亮;无信号但已亮:立刻熄灭
红石火把稳定性检查 红石火把 若输出异常且本刻无计划刻,延迟 2 游戏刻切换状态
红石信号传播 红石线 重新计算红石信号并检查附着
环境变化 霜冰 尝试融化
  海绵 尝试吸收周围水
红石控制容器 漏斗 尝试更新启用 / 禁用状态
爆炸触发 TNT 在存在红石信号时被激活并点燃

更新的优先级

PP 更新(Post Placement Update)NC 更新(Neighbor Changed Update)并非同时发生,而是具有严格的执行顺序 当一个方块被放置、破坏或其状态发生改变时,游戏通常会按照既定流程依次触发不同类型的更新

正常情况下,一次方块状态变更会依照以下顺序执行:

  1. 修改子区块内的方块状态

  2. 更新高度图

  3. 调用被替代方块状态的破坏行为

  4. 调用新方块状态的放置行为

  5. 更新方块实体(Block Entity)信息

  6. 产生 NC 更新

  7. 产生 比较器更新

  8. 产生 PP 更新

在该流程中,NC 更新先于 PP 更新执行,这是红石系统设计中的默认行为

部分方块具有特殊的更新实现,其 NC 更新与 PP 更新的触发时机可能与上述流程不同。这些行为通常被称为非正常 NC 更新

激活状态切换相关

以下方块在切换激活状态时,先产生 PP 更新,再产生 NC 更新:压力板,侦测器,红石火把

当这些方块被破坏时,会在破坏行为中先执行非正常 NC 更新,随后继续执行正常更新流程

双阶段 NC 更新

以下方块在切换激活状态时,会在正常流程结束后额外产生一次 NC 更新,即 NC 更新被分为两个阶段:按钮,拉杆,讲台,避雷针,幽匿感测体,绊线钩

当这些方块被破坏时,同样会在破坏行为中先执行非正常 NC 更新,其后流程与正常情况一致

铁轨类方块

铁轨类方块在切换激活状态时:

  1. 先执行原状态破坏时产生的非正常 NC 更新

  2. 再正常执行放置流程

  3. 最后再次产生非正常 NC 更新

这种行为使铁轨类方块在红石系统中具有较高的更新复杂度

红石线

在切换点状 / 十字状形态时,红石线会在正常流程结束后额外产生一次非正常 NC 更新(NC 更新分为两次)。

在其他情况下,红石线通常先进行 PP 更新,再进行 NC 更新,与一般规则相反。

中继器与比较器的特殊破坏情况

当红石中继器或红石比较器接收到 NC 更新,且其下方失去支撑并因此被破坏时:

会在正常更新流程完成后,额外产生一次非正常 NC 更新

即 NC 更新同样被拆分为两个阶段执行

唱片机

当唱片机的方块状态 has_record 发生变化时:

先产生 PP 更新,再产生NC 更新

自更新(Self Update)

部分方块在执行放置行为或破坏行为时,会在其内部再次设置自身的方块状态,这种行为被称为自更新

自更新中触发的方块状态设置会完整执行正常的更新流程; 而外层的更新流程会在产生 NC 更新之前终止,因此外层原本应产生的 NC 更新和 PP 更新可能被忽略。

示例:漏斗

  • 玩家放置漏斗时,若周围存在红石信号

  • 漏斗在执行放置行为过程中会修改自身的激活状态

  • 该内部状态修改不会产生 NC 更新

  • 外层更新流程因此提前结束

  • 最终仅产生 PP 更新,而不会产生 NC 更新

方块更新的检测

BUD(Block Update Detector)

BUD(方块更新探测器)是一类利用方块更新机制工作的红石结构,用于在不直接接收到红石信号的情况下,感知周围方块的更新事件并产生红石输出

BUD 并非一种独立的方块或游戏内明确标识的机制,而是玩家基于NC 更新、PP 更新及其传播顺序所设计的一种红石原理结构。

在展示BUD结构之前需要补充一个概念:QC(Quasi-connectivity,半连接性)。在正常情况下,方块是否被红石信号激活,取决于其相邻方块是否提供直接供能或强供能。然而,在 QC 机制下,部分方块在进行供能判断时,会额外检查自身上方或斜上方的方块是否存在红石信号。以活塞为例:活塞在判断是否应当伸出时,不仅会检查与自身相邻的供能方块,还会检查其上方一格的方块是否被红石信号激活如果满足条件,即使活塞本身并未直接接触红石信号,也可能被视为“已供能”。这种并非严格相邻,却被视为连接的供能方式,被称为 半连接性(Quasi-Connectivity)

并非所有方块都支持 QC,在 Java 版中,QC 主要影响以下方块:活塞,粘性活塞,投掷器,发射器

图 3:透明玻璃为QC位

3c3aa55c4020260123154050

位于活塞上方方块的五个毗邻位置(排除了活塞自身)时,活塞也可以被激活,即使活塞的上方根本没有机械元件或红石导体(即便在上方方块是空气时也仍然有效)。这五个位置被称为非常规激活位,或称QC位。通过非常规激活位激活的方式称为半连接激活,或称非常规激活、QC位激活

图 4:QC位激活演示

a20ef6b48620260123154051

BUD活塞

图 5:NC激活检测

ab237a51fd20260123154027

一个被 QC 激活的 bud 态活塞,即为一个 NC 更新检测器,这也是最常用的 NC 更新检测器

对于检测PP更新,最常用的就是游戏内自带的侦测器,更多的方块更新感应器,详见

[Wiki]:https://zh.minecraft.wiki/w/Tutorial:%E6%96%B9%E5%9D%97%E6%9B%B4%E6%96%B0%E6%84%9F%E5%BA%94%E5%99%A8?variant=zh-cn

© 版权声明
THE END
喜欢就支持一下吧
点赞8赞赏 分享
评论 共3条

请登录后发表评论