Skip to content

雪球菜单

丢雪球打开菜单,支持传送主城、去世、切换模式、设重生点、发起/接受传送

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

丢出雪球即可呼出一个悬浮菜单,抬头指向天空在六个选项间切换并确认,低头看向地面则关闭菜单或取消传送。整套系统由计分板状态机与三组命令方块链驱动,无需任何附加包;它依赖基岩版 1.19.50+ 的新版 /execute 语法、重复命令方块的「延迟」字段,以及基岩版特有的 rawtext 标题系统。

原理

整套系统的核心是一张用计分板搭建的「状态机」。雪球菜单 这个 dummy 目标对每位玩家保存一个整数:0 表示菜单关闭,1 到 6 分别对应「传送主城、原地去世、生存模式、设重生点、发起传送、接受传送」六个选项。打开菜单(丢雪球加 1 分)、切换选项(继续丢雪球,分数每 +1 就顺移一档,超过 6 时由指令 6 拉回 1 形成轮转)、确认(抬头命中当前分数对应的分支)、关闭(低头把分数写回 0),本质都是「读分数 → 命中条件分支 → 写回分数」的循环。dummy 准则不挂钩任何游戏事件,分数只能靠命令读写,正好承载这种纯逻辑状态;分数随世界存档持久化,因此每个分支末尾都必须显式复位,否则菜单会「卡住」。

视角方向是这套菜单的「输入设备」,靠选择器的俯仰角过滤实现。rx 是「最大俯仰角」,rxm 是「最小俯仰角」,两者把匹配范围夹成一段角度区间;基岩版俯仰角以水平为 0°,抬头为负(正上方是 -90°),低头为正(正下方是 +90°)。于是 rx=-88 只选中俯仰角 ≤ -88°、几乎仰面朝天的玩家,rxm=88 只选中俯仰角 ≥ 88°、几乎垂直向下看的玩家。把它与 scores={雪球菜单=1} 之类的条件叠加,就得到「菜单停在选项 1 且此刻抬头」这种精确触发,视角于是同时承担了「确认键」和「关闭键」。

命令方块链的时序决定了系统每个游戏刻的节奏。三组方块各以一块「无条件、保持开启、延迟 0」的重复命令方块为时钟(指令 1、10、27),它们每个游戏刻执行一次,并沿箭头方向依次触发后面的连锁命令方块,整条链在同一游戏刻内按编号顺序跑完。第一组的入口用 /replaceitem 的 destroy 模式,每个游戏刻向每位玩家快捷栏 slot.hotbar 8 槽位补满 16 个雪球,并用 minecraft:item_lock 的 lock_in_slot 组件把雪球钉死在槽位,因此雪球永远丢不完、也不会被误移;玩家丢出的雪球是实体,指令 2、3、4 在同一刻内依次给 2 格内的玩家加 1 分、播放音效、再击杀雪球本体以免实体堆积,先后顺序不能颠倒——必须先加分再杀雪球,否则选择器匹配不到目标。

「发起传送」到「接受传送」是两名不同玩家、跨多个游戏刻的异步流程,单靠菜单分数表达不了「谁发起了传送」,因此系统引入第二个目标 传送,并用计分板的「假名玩家」技巧承载倒计时。发起时指令 22 把发起者的 传送 分数置 1 作为通道占用标记,指令 21 把假名玩家 计时 在 雪球菜单 目标上的分数写为 60——假名玩家不是真实玩家,永远不会被 @a 匹配,却能像普通玩家一样存分数,因此适合当全局计时器;指令 27 的重复命令方块延迟 20(每秒一次)让它从 60 递减,落到 -1 时由指令 28 触发超时清理。复位统一走 scoreboard objectives remove 传送 这一条命令:它把整个目标和所有相关分数一次删净,无论超时、低头取消还是发起者离线,都比逐个玩家 set 0 更干净,也顺带解决了离线玩家残留标记的问题。边界情况是玩家离线:@a 展开不到离线玩家,其菜单分数会停在原值,重新上线后需要再丢一次雪球或低头才能复位。

前置指令

在聊天栏中依次执行下面三条命令完成基础准备。执行前需要开启作弊或具备 OP 等级 1。传送 目标会在发起传送时由命令方块动态创建(指令 20),计时 则是 雪球菜单 目标上的一个假名玩家,两者都不需要在这里提前手动创建。

/scoreboard objectives add 雪球菜单 dummy

创建 dummy 准则的 雪球菜单 目标,用来保存每位玩家的菜单状态(0 到 6)和假名玩家 计时 的倒计时数值。

/gamerule commandblockoutput false

关闭命令方块执行后在聊天栏输出的信息,避免每个游戏刻刷屏显示「命令已执行」。

/gamerule sendcommandfeedback false

关闭命令执行后返回给执行者的反馈信息(如传送成功的提示),让菜单在后台安静运行。

搭建步骤

把下面的命令方块按三组摆放。每组内部箭头方向沿指令编号递增依次连接;三组的入口指令(1、10、27)都是重复命令方块,其余为连锁命令方块,其中指令 25、29 是条件连锁命令方块。

一、雪球菜单运行

这组负责补发雪球、检测丢雪球、渲染菜单和处理低头关闭。指令 1 是重复命令方块,指令 2 到 9 是依次指向它的连锁命令方块。

指令 1 — 补满锁定雪球(重复命令方块,无条件,保持开启,延迟 0)

/replaceitem entity @a slot.hotbar 8 destroy snowball 16 0 {"minecraft:item_lock":{"mode":"lock_in_slot"},"minecraft:display_name":{"value":"雪球菜单"}}

每个游戏刻把每位玩家快捷栏 slot.hotbar 8 槽位补满 16 个名为「雪球菜单」的雪球,并用 lock_in_slot 锁死在槽位,保证雪球永远丢不完。

指令 2 — 丢雪球时计分 +1(连锁命令方块,无条件,保持开启,延迟 0)

/execute at @e[type=snowball] run scoreboard players add @p[r=2] 雪球菜单 1

以每个雪球为执行位置,给 2 格内最近的玩家在 雪球菜单 目标上加 1 分,即「打开菜单 / 切换到下一选项」。

指令 3 — 丢雪球时播放音效(连锁命令方块,无条件,保持开启,延迟 0)

/execute at @e[type=snowball] run playsound random.orb @p[r=2]

给 2 格内的玩家播放音效,作为丢出雪球后的即时反馈。

指令 4 — 清除雪球实体(连锁命令方块,无条件,保持开启,延迟 0)

/execute at @a[scores={雪球菜单=1..}] run kill @e[type=snowball,c=1,r=2]

在菜单已打开(分数 1..)的玩家位置,击杀 2 格内最近的 1 个雪球,防止丢出的雪球实体越积越多。

指令 5 — 显示菜单(连锁命令方块,无条件,保持开启,延迟 0)

/execute as @a[scores={雪球菜单=1..6}] run titleraw @s actionbar {"rawtext":[{"text":"§l§b 『雪球菜单』\n▶==================◀\n"},{"translate":"%%2","with":{"rawtext":[{"selector":"@s[scores={雪球菜单=1}]"},{"text":" §6"},{"text":" §e"}]}},{"text":"①.『传送主城』\n"},{"translate":"%%2","with":{"rawtext":[{"selector":"@s[scores={雪球菜单=2}]"},{"text":" §6"},{"text":" §e"}]}},{"text":"②.『原地去世』\n"},{"translate":"%%2","with":{"rawtext":[{"selector":"@s[scores={雪球菜单=3}]"},{"text":" §6"},{"text":" §e"}]}},{"text":"③.『生存模式』\n"},{"translate":"%%2","with":{"rawtext":[{"selector":"@s[scores={雪球菜单=4}]"},{"text":" §6"},{"text":" §e"}]}},{"text":"④.『设重生点』\n"},{"translate":"%%2","with":{"rawtext":[{"selector":"@s[scores={雪球菜单=5}]"},{"text":" §6"},{"text":" §e"}]}},{"text":"⑤.『发起传送』\n"},{"translate":"%%2","with":{"rawtext":[{"selector":"@s[scores={雪球菜单=6}]"},{"text":" §6"},{"text":" §e"}]}},{"text":"⑥.『接受传送』\n"},{"text":"§b▶==================◀\n§a抬头确定✔§c低头关闭✘\n\n\n\n\n"}]}

对菜单打开中的玩家,在 actionbar 位置用 titleraw 渲染菜单,其中的 rawtext 会根据当前分数高亮对应选项,因此每切一档高亮就跳到下一行。

指令 6 — 分数上限为 6(连锁命令方块,无条件,保持开启,延迟 0)

/scoreboard players set @a[scores={雪球菜单=7..}] 雪球菜单 1

分数超过 6 的玩家被拉回 1,让选项从头轮转,防止分数无限增长。

指令 7 — 低头显示关闭提示(连锁命令方块,无条件,保持开启,延迟 0)

/title @a[scores={雪球菜单=!0},rxm=88] actionbar §l§cMenu Off§f | §7已关闭

指令 8 — 低头播放音效(连锁命令方块,无条件,保持开启,延迟 0)

/execute as @a[scores={雪球菜单=!0},rxm=88] at @s run playsound random.levelup @s ~~~ 1 1.5

指令 9 — 低头重置分数(连锁命令方块,无条件,保持开启,延迟 0)

/scoreboard players set @a[scores={雪球菜单=!0},rxm=88] 雪球菜单 0

对菜单打开中(分数非 0)且低头看地的玩家,把分数写回 0,即关闭菜单或取消当前操作。

二、雪球菜单功能

这组实现六个选项对应的具体动作。指令 10 是重复命令方块,指令 11 到 26 依次指向它;其中指令 25 是条件连锁命令方块,仅当前一条(指令 24 的传送)成功时才执行。传送主城坐标等请按需修改。

指令 10 — 传送主城(重复命令方块,无条件,保持开启,延迟 0,坐标请替换)

/tp @a[scores={雪球菜单=1},rx=-88] 5000 70 5000

把菜单停在选项 1 且抬头的玩家传送到坐标 5000 70 5000,替换成你的主城坐标。

指令 11 — 回城提示(连锁命令方块,无条件,保持开启,延迟 0)

/title @a[scores={雪球菜单=1},rx=-88] actionbar §l§b回城成功

指令 12 — 原地去世(连锁命令方块,无条件,保持开启,延迟 0)

/kill @a[scores={雪球菜单=2},rx=-88]

指令 13 — 去世提示(连锁命令方块,无条件,保持开启,延迟 0)

/title @a[scores={雪球菜单=2},rx=-88] actionbar §l§c去世成功

指令 14 — 切换生存模式(连锁命令方块,无条件,保持开启,延迟 0)

/gamemode 0 @a[scores={雪球菜单=3},rx=-88]

把抬头的玩家切换到生存模式(0 为生存模式的数字代号)。

指令 15 — 模式切换提示(连锁命令方块,无条件,保持开启,延迟 0)

/title @a[scores={雪球菜单=3},rx=-88] actionbar §l§a已变为生存模式

指令 16 — 设置重生点(连锁命令方块,无条件,保持开启,延迟 0)

/spawnpoint @a[scores={雪球菜单=4},rx=-88]

把抬头玩家当前所在位置设为重生点(/spawnpoint 不带坐标时以执行者当前位置为准)。

指令 17 — 设置成功提示(连锁命令方块,无条件,保持开启,延迟 0)

/title @a[scores={雪球菜单=4},rx=-88] actionbar §l§6设置成功

指令 18 — 发起传送(通道占用提示)(连锁命令方块,无条件,保持开启,延迟 0)

/execute if entity @a[scores={传送=1}] as @a[scores={雪球菜单=5},rx=-88] run title @s actionbar §l§c互传通道已被占用

若已存在标记为发起者的玩家(传送=1),则提示当前发起者通道被占用,不再重复发起。

指令 19 — 发起传送(全服公告)(连锁命令方块,无条件,保持开启,延迟 0)

/execute unless entity @a[scores={传送=1}] as @a[scores={雪球菜单=5},rx=-88] run tellraw @a {"rawtext":[{"text":"§l〈§d世界公告§f〉§r玩家§b"},{"selector":"@s"},{"text":"§r发起了传送请求\n§7----------------------------\n§b●§7 打开雪球菜单接受传送请求\n§b●§7 60秒后无人同意自动取消传送\n§b●§7 发起传送者低头可取消传送\n----------------------------"}]}

若无发起者,则向全服公告「某玩家发起了传送请求」,并说明接受与取消方式。

指令 20 — 创建传送计分板(连锁命令方块,无条件,保持开启,延迟 0)

/execute unless entity @a[scores={传送=1}] as @a[scores={雪球菜单=5},rx=-88] run scoreboard objectives add 传送 dummy

发起传送时动态创建 传送 目标(若尚不存在)。

指令 21 — 设置 60 秒倒计时(连锁命令方块,无条件,保持开启,延迟 0)

/execute unless entity @a[scores={传送=1}] as @a[scores={雪球菜单=5},rx=-88] run scoreboard players set 计时 雪球菜单 60

把假名玩家 计时 在 雪球菜单 目标上的分数写为 60,作为倒计时起点。

指令 22 — 标记发起者(连锁命令方块,无条件,保持开启,延迟 0)

/execute unless entity @a[scores={传送=1}] as @a[scores={雪球菜单=5},rx=-88] run scoreboard players set @s 传送 1

把发起者自己在 传送 目标上的分数写为 1,占用互传通道。

指令 23 — 接受传送(公告)(连锁命令方块,无条件,保持开启,延迟 0)

/execute if entity @a[scores={传送=1}] as @a[scores={雪球菜单=6},rx=-88] run tellraw @a {"rawtext":[{"text":"§l〈§d世界公告§f〉§r已成功将玩家§b"},{"selector":"@a[scores={传送=1}]"},{"text":"§r传送至§b"},{"selector":"@s"}]}

若存在发起者,且接受者(选项 6 + 抬头)确认,则向全服公告传送成功。

指令 24 — 执行传送(连锁命令方块,无条件,保持开启,延迟 0)

/tp @a[scores={传送=1}] @a[scores={雪球菜单=6},rx=-88]

把标记为发起者的玩家传送到接受者身边。

指令 25 — 删除传送计分板(条件连锁命令方块,保持开启,延迟 0)

/scoreboard objectives remove 传送

仅当指令 24 的传送成功时执行,删除 传送 目标以复位互传通道。

指令 26 — 重置菜单分数(连锁命令方块,无条件,保持开启,延迟 0)

/scoreboard players set @a[scores={雪球菜单=1..6},rx=-88] 雪球菜单 0

任一选项确认后(抬头),把菜单分数写回 0 关闭菜单。

三、处理传送超时与低头取消

这组处理 60 秒超时和发起者低头取消两种清理路径。指令 27 是重复命令方块(需要红石,延迟 20),指令 28 到 31 依次指向它;其中指令 29 是条件连锁命令方块。

指令 27 用红石块常供电(设为「需要红石」而非「保持开启」),是作者针对网易版重复命令方块延迟精度问题的处理,目的是让 60 秒倒计时更稳定。国际版可直接设为「保持开启」。

指令 27 — 倒计时递减(重复命令方块,无条件,需要红石,延迟 20)

/execute if score 计时 雪球菜单 matches 0..60 run scoreboard players remove 计时 雪球菜单 1

延迟 20 游戏刻(1 秒)执行一次:只要 计时 分数在 0 到 60 之间就减 1,实现每秒递减。

指令 28 — 超时后删除计分板(连锁命令方块,无条件,保持开启,延迟 0)

/execute if score 计时 雪球菜单 matches ..-1 run scoreboard objectives remove 传送

计时 降到 -1 时删除 传送 目标,视为超时。

指令 29 — 超时公告(条件连锁命令方块,保持开启,延迟 0)

/tellraw @a {"rawtext":[{"text":"§l〈§d世界公告§f〉§r超时无人同意或发起传送者离线,已自动取消传送请求。"}]}

仅当指令 28 成功(确实发生超时)时向全服公告一次。

指令 30 — 低头取消传送(公告)(连锁命令方块,无条件,保持开启,延迟 0)

/execute as @a[scores={传送=1},rxm=88] run tellraw @a {"rawtext":[{"text":"§l〈§d世界公告§f〉§r玩家§b"},{"selector":"@s"},{"text":"§r已取消传送请求。"}]}

发起者低头看地时,向全服公告已取消传送请求。

指令 31 — 低头取消传送(删除计分板)(连锁命令方块,无条件,保持开启,延迟 0)

/execute as @a[scores={传送=1},rxm=88] run scoreboard objectives remove 传送

删除 传送 目标,复位互传通道。

常见问题

离远了菜单就没反应?

命令方块必须放在常加载区域内才能全图生效,否则玩家远离后命令方块所在区块被卸载,整套逻辑停止运行。站在命令方块旁执行:

/tickingarea add ~-10 ~-10 ~-10 ~10 ~10 ~10 菜单加载

把周围 21×21×21 的范围设为常加载区域。范围不够可调整坐标或添加多个区域。

确认后一直原地罚站,或视角被锁定?

这是菜单分数没被重置(指令 26 没生效)导致的:rx=-88 的条件会持续命中你,命令反复执行。依次检查是否抄错或漏抄、命令方块箭头方向是否沿编号递增、重置指令是否排在最后(指令 26 必须在功能指令之后)。稳妥做法是先关闭「启用命令方块」,全部搭完再开启。

全服公告一直刷屏?

发起/接受传送公告刷屏,说明菜单分数没被重置,按上一条排查。超时公告刷屏,说明没把超时公告的命令方块设为条件连锁——指令 29 必须是条件连锁命令方块且箭头指向指令 28,它才会只在真正超时的那一下触发一次。

想改成可移动、死亡不掉落的雪球?

把指令 1 换成下面的 /give 命令,改用 lock_in_inventory 把雪球锁在物品栏里,并用 keep_on_death 让它在死亡后保留:

/give @a snowball 16 0 {"minecraft:item_lock":{"mode":"lock_in_inventory"},"minecraft:keep_on_death":{},"minecraft:display_name":{"value":"雪球菜单"}}

注意 /give 是一次性命令,雪球丢完不会自动补充;想要常驻补充请继续使用指令 1 的 /replaceitem 方案。

菜单文本复制进去变成了 ***?

这是聊天栏或客户端对特殊字符、敏感词的转义问题。菜单里的符号被转义可以多复制几次试试;全服公告里的玩家名变成 *** 是因为名字命中敏感词,无法通过命令解决。部分符号在 iOS 端显示成问号属于客户端差异,可换安卓设备复制。

一直显示「互传通道被占用」?

超过 60 秒仍提示占用,说明 传送 目标没被删除。检查第三组是否抄错,尤其是指令 28 是否执行、指令 29 是否设为条件连锁;如果指令 27 没接红石或延迟设错,倒计时就不会走。

为什么用计分板而不是 /tag?

两个原因。一是计分板目标可以整表删除:scoreboard objectives remove 传送 一条命令就清掉目标和所有相关分数,无需逐个玩家处理;而 tag 要用 @a[tag=...] 逐个移除,玩家离线时选择器匹配不到,清理更麻烦。二是这里只需要一个 0/1 的布尔标记,分数足够表达,还能直接配合 scores={传送=1} 条件使用。

基岩版注意

  • 在聊天栏执行 /execute 需要 OP 等级 2;/scoreboard、/tp、/kill、/gamemode、/gamerule、/title、/playsound 需要 OP 等级 1;/replaceitem、/spawnpoint、/titleraw、/tickingarea 同样需要 OP 等级 1。放置和编辑命令方块需要开启作弊并具备操作员权限。
  • 新版 /execute 语法(at、if、unless、run)为基岩版 1.19.50+ 引入,低于该版本需改用旧版 execute 语法,本文命令无法直接套用。
  • 命令方块保存的是「写入时的命令版本」,旧存档升级后需重新编辑并保存每个命令方块一次,才会按新语法解析。
  • 与 Java 版差异:rx/rxm 的俯仰角语义在 Java 版一致(抬头为负、低头为正),但 rawtext、hasitem 选择器、/titleraw 命令、/replaceitem 的 destroy 模式等均为基岩版专属,Java 版没有对应写法。
  • /titleraw 是基岩版特有的独立命令(不是 /title 的子命令),用于直接渲染 rawtext JSON;Java 版对应的是 /title 加 JSON 文本组件。
  • /replaceitem 在较新基岩版中逐步被 /item replace 替代,若指令 1 报错可尝试改写(具体替代版本待验证)。
  • 指令 27 用红石块常供电(「需要红石」而非「保持开启」),是作者针对网易版重复命令方块延迟精度问题的处理;本文命令基于国际版编写,网易版语法可能存在细微差异,请以实际测试为准。
  • 三组命令方块都必须放在常加载区域内,玩家远离后命令方块会停止运行,菜单与传送逻辑随之失效。