Skip to content

雪球填平

丢出雪球自动填平飞行路径上的空气方块,用重复命令方块实现

社区
官方•Dingding OvO · 2026-08-12

丢出雪球后,雪球飞行路径上的空气方块会被自动替换为砂岩,实现快速填平空地的效果。整套装置只用一个重复命令方块驱动,通过 /execute 的 at 与 if block 子命令定位雪球并判断空气,再调用 /setblock 逐格填充。核心语法依赖基岩版 1.19.50+ 的新版 /execute 命令。

原理

雪球是一种投射物实体,飞行轨迹是受重力影响的抛物线,初速约 1.5 方块/游戏刻,以约 40° 角抛掷时平地最远能飞约 51 格。因为它始终是「实体」而非「方块」,正常飞行时其坐标所在的方块几乎总是空气,这恰好把「雪球当前位置」和「待填平的缺口」对应起来,让雪球可以像画笔一样描出路径。雪球撞上方块或实体后会碎裂消失,痕迹也就随之结束。

整套逻辑压缩在一条 /execute 链里。@e[type=snowball] 先选出世界里所有雪球实体;at 子命令把执行位置与朝向切换到每一个雪球身上,于是后面的 ~ ~ ~ 表示的是雪球坐标,而不是命令方块自己的坐标;if block ~ ~ ~ air 检查该坐标处的方块是否为空气,是才继续;run setblock ~ ~ ~ sandstone 则在雪球所在的整数格放入砂岩。at 会对选择器命中的每个雪球各执行一次,因此同时抛出多个雪球会各自生成一条痕迹。

关键在于重复命令方块每个游戏刻只执行一次,也就是说它每个游戏刻只对雪球当时的位置采样一次,填充那个位置的方块。雪球每个游戏刻前进约 1 到 1.5 格,两次采样之间可能隔着半格到一格,所以痕迹是「每个游戏刻一个方块」的离散点列,而不是数学上连续的整条线。速度较快或轨迹较陡时,相邻采样偶尔会跳过一个方块,痕迹上出现零星缺口,这是采样机制的正常表现。

这套装置依赖区块加载:命令方块和雪球都必须位于已加载的区块内,@e 选择器才能找到雪球,setblock 才能写入方块。一旦玩家走远导致区块卸载,或雪球飞入未加载区块,装置就会停止工作,跨大片区域使用时应设置常加载区域。此外,新版 /execute 语法(at、if block、run)是基岩版 1.19.50+ 才引入的,且命令方块会保存「写入时的命令版本」,在旧存档里创建的命令方块升级后需要重新编辑并保存一次,才会按新语法解析。

前置指令

在聊天栏依次执行以下两条命令,关闭命令方块和命令的刷屏输出。这两条不是必需,但能让装置安静运行。

/gamerule commandblockoutput false
/gamerule sendcommandfeedback false

搭建步骤

步骤 1:放置主体重复命令方块

在要填平的区域附近放置一个重复命令方块,把它设为「无条件、保持开启、延迟 0」,然后输入:

execute at @e[type=snowball] if block ~ ~ ~ air run setblock ~ ~ ~ sandstone

该命令方块每个游戏刻自动运行一次,检测场上所有雪球,并在其经过的空气格填入砂岩。丢出雪球即可看到方块沿抛物线一路铺开。

步骤 2(可选):更换填充方块

把 sandstone 换成 stone、grass、dirt 或 cobblestone 等方块 ID,即可用别的方块填平。

execute at @e[type=snowball] if block ~ ~ ~ air run setblock ~ ~ ~ stone

步骤 3(可选):改成填平液体

把条件里的 air 换成 water,雪球飞过水面时就会把水格填成砂岩。

execute at @e[type=snowball] if block ~ ~ ~ water run setblock ~ ~ ~ sandstone

常见问题

雪球飞过去没有任何方块被填充?

先确认命令方块与雪球都位于已加载的区块内。玩家离得太远时,命令方块所在区块被卸载,或者雪球飞入未加载区块,@e 选择器都找不到雪球。跨区域使用时建议用 /tickingarea 设置常加载区域。同时确认你的基岩版不低于 1.19.50,低于该版本请使用旧版 execute 语法。

填出来的痕迹不是连续的一条线,而是断断续续的?

这是正常现象。重复命令方块每个游戏刻只对雪球位置采样一次,而雪球每个游戏刻前进约 1 到 1.5 格,速度较快或轨迹较陡时,相邻两次采样之间可能隔着一个方块,痕迹就会出现零星缺口。降低抛出角度、让雪球飞得更平缓,可以减少缺口。

会不会覆盖已经存在的方块?

不会。if block ~ ~ ~ air 只在目标位置是空气时才继续执行,已放置的方块不会被替换,水、岩浆等非空气方块也不会被误填。若确实想填液体,请参考步骤 3 把条件换成 water 或 lava。

雪球撞到方块或实体后直接消失了,正常吗?

正常。雪球是投射物,碰撞方块或实体后会碎裂消失,这是原版行为,痕迹也在碰撞点结束。基岩版中雪球命中玩家会造成击退,但除了烈焰人外不造成伤害。

想只在某个高度以下填充,该怎么做?

基岩版的 /execute 没有直接比较 Y 坐标的 if y 条件(Java 版也没有)。要限制高度,需要先用另一条命令把雪球的 Y 坐标写入计分板,再配合 execute if score ... matches ..55 之类的分数范围判断,实现较复杂,本文从略。

基岩版注意

  • 在聊天栏输入 /execute 需要 OP 等级 2,/setblock 和 /gamerule 需要 OP 等级 1;放置和编辑命令方块需要开启作弊并具备操作员权限。
  • 新版 /execute 语法(at、if block、run)是基岩版 1.19.50+ 引入的,低于该版本请使用旧版 execute 语法,本文命令无法直接套用。
  • 命令方块保存的是「写入时的命令版本」,从旧存档升级后需重新编辑并保存命令方块一次,才会按新语法解析。
  • 与 Java 版差异:Java 版 if block 使用带命名空间的方块 ID(如 minecraft:air),基岩版直接写 air;Java 版雪球命中玩家不造成击退,基岩版会造成击退。
  • 装置仅在已加载区块内工作,雪球飞入未加载区块会停止更新,跨区域使用时建议设置常加载区域。
  • 网易版命令语法与本文档(基于国际版)可能存在细微差异,请以网易版实际测试为准。