☰
MC命令从入门到实战:execute、命令方块、计分板与数据包
2026/10/1 1:38:24 网站建设 项目流程

很多人第一次接触MC命令,是从"看别人在一个存档里随手敲了一句/tp @p 100 64 100,人就瞬移过去了"开始的。那一刻的感觉通常是:这游戏居然还能这么玩?但真正自己上手,打开聊天框敲下斜杠,屏幕上跳出"Unknown command"的时候,热情往往就凉了半截。这篇东西就是写给这个阶段的你——不管你是刚接触MC命令的新手,还是已经会用几条常用指令、但一碰到execute和命令方块就发懵的半吊子玩家,都能从里面找到能直接抄走的东西。我会把MC命令从最底层的语法骨架讲起,一路讲到目标选择器、条件判断、命令方块、计分板、数据包函数,最后给三个能直接落地的小项目。全文只讲Java版和基岩版共通或者需要区分的地方,不扯任何和本主题无关的内容。

1. 从一条 /tp 说起:MC命令的语法骨架到底长什么样

1.1 斜杠、空格、参数:命令的"三段式"结构

MC命令的语法其实极其规整,规整到有点无聊。抛开所有花哨的功能,任何一条指令都能拆成三段:斜杠加指令名、必填参数、可选参数。以/tp @p 100 64 100为例,tp是指令名,@p是"传送谁",后面三个数字是"传送到哪"。斜杠本身不是语法的一部分,它只是个开关——告诉游戏"我接下来敲的是指令,不是聊天内容"。你在聊天框里必须打斜杠,但在命令方块里、在.mcfunction函数文件里,斜杠必须去掉,写了反而报错。这一点我在早期踩过好几次,命令方块里粘贴聊天框的内容,一直提示语法错误,排查了半小时才发现是多了个斜杠。

空格是唯一的分隔符,参数之间必须用空格隔开,多打几个空格游戏会忽略,但少打一个空格就会把两个参数粘成一个,直接导致解析失败。指令名和参数在Java版里大小写敏感——/tp是对的,/TP会报错;而方块名、物品名则统一用小写下划线风格,比如diamond_sword、command_block。NBT标签(就是那对大括号里的东西)又是另一套规则,它区分大小写,{CustomName:...}写成{customname:...}就不生效。这三套大小写规则混在一起,是新手最容易翻车的地方,记住一句话就行:指令名和坐标随意,方块和物品全小写,NBT严格照抄。

1.2 坐标三种写法:绝对、相对、局部,别再用错波浪号

坐标是MC命令里最基础也最容易搞混的部分。游戏里有三套坐标系,写错了结果会差得很离谱。

  • 绝对坐标:100 64 100,直接指定世界坐标,X是东西方向(东为正),Y是高度(基岩层大约在Y=-64到Y=320之间,海平面约在Y=63),Z是南北方向(南为正)。
  • 相对坐标:~5 ~ ~-3,波浪号代表"执行这条命令的那个位置",后面跟数字是偏移量。~ ~ ~就是原地不动,~ ~1 ~是往上抬一格。这个"执行位置"很关键——玩家敲命令时是玩家脚下那格,命令方块执行时是方块自身的坐标。
  • 局部坐标:^ ^ ^5,这个基于朝向而不是世界方向。第一个^是左,第二个是上,第三个是前。^ ^ ^5的意思是"沿着我面朝的方向往前5格"。做导弹、激光、跟随视角的粒子效果时,局部坐标是唯一选择。

有一个坑我必须单独提醒:相对坐标和局部坐标不能混在同一条坐标串里,你写^ ^ ~5是无效的。另外相对坐标的数字可以是小数也可以是负数,~-0.5完全合法,做精确站位的时候很有用。

1.3 权限等级与执行位置:为什么同一条命令别人能跑你不能

同样一条/gamemode creative,你在自己单人存档里能用,进了某个服务器就提示没权限,原因就是权限等级。Java版的权限等级分成0到4级:0级是普通玩家,只能执行影响自己的指令;1级可以绕过出生点保护;2级能用命令方块、能执行大部分管理类指令,单人存档"开启作弊"后你就是这个级别;3级是多人服务器的管理员级别,能踢人、封人、给别人上权限;4级是服务器控制台,权限最高。

所以在单人游戏里用命令,第一件事是确认作弊已开启——创建世界时勾选,或者对已有的世界在"对局域网开放"里允许作弊。已经开着的存档如果发现命令不生效,去世界设置里把"允许作弊"打开再重进一次。服务器里则需要管理员给你/op,或者你直接改ops.json和server.properties里的相关配置。

2. 目标选择器:把"谁"这件事说清楚

2.1 六个基础选择器适用场景对照

命令里"对谁执行"这件事,全靠目标选择器来指定。基础选择器一共六个,用熟了能覆盖八成场景。

选择器含义典型用法
@p最近的玩家给最近的人发东西、传送到最近的人
@r随机一个玩家抽奖、随机选人
@a所有玩家全服公告、统一加效果
@e所有实体处理怪物、掉落物、箭矢
@s执行者自己在execute as之后指代当前实体
@n最近的实体(1.21后加入)需要指定最近非玩家实体时用

@s特别值得说。它本身几乎不单独使用,但在execute as @e[type=zombie] at @s run ...这种结构里,@s代表"当前被遍历到的那只僵尸"。这是MC命令从"单条指令"升级成"批量处理"的关键,后面讲execute时会反复用到。

注意:@a和@e的区别不只是"玩家"和"实体",@a只挑玩家,而@e默认会把玩家也包含进去。想让@e排除玩家,得写@e[type=!player]。

2.2 筛选参数:type、distance、scores、nbt 逐个拆

光靠基础选择器肯定不够。要给"10格内的僵尸"上效果,或者给"分数超过100的玩家"发奖励,就得靠方括号里的筛选参数。常用的几个:

  • type=:按实体类型筛,type=zombie只挑僵尸,type=!player排除玩家,type=#minecraft:raiders可以按标签筛一整类。
  • distance=:按距离筛,distance=..10表示10格以内(..是区间写法,前面省略代表负无穷),distance=5..15是5到15格之间。
  • scores={}:按计分板分数筛,scores={points=10..}表示 points 这项分数大于等于10。
  • tag=:按标签筛,配合/tag指令给实体打标记,是做状态管理最干净的方式。
  • nbt={}:按NBT数据筛,比如nbt={IsBaby:1b}只挑小僵尸,这个参数威力最大但也最容易写错。
  • gamemode=:按游戏模式筛玩家。
  • name=:按名字筛,玩家ID或者实体的自定义名字。
  • level=:按经验等级筛。

坐标范围筛选还有一组:x=y=z=配合dx=dy=dz=定义一个长方体区域。这里有个经典陷阱——dx/dy/dz的判定体积是从指定点往正方向延伸,且体积偏向负方向半格。很多人写x=0,y=64,z=0,dx=10,dy=10,dz=10以为是0到10的立方体,实际判定会往负方向偏。做精确区域检测时,我更推荐用distance或者干脆用/execute if block逐格判断。

2.3 排序与限量:limit、sort 组合出的实用写法

当选择器匹配到多个目标时,limit=和sort=决定"取几个、按什么顺序取"。这两个参数组合出来的写法特别实用:

@a[limit=1,sort=nearest] 最近的一个玩家(等价于@p) @a[limit=3,sort=random] 随机抽3个玩家 @e[type=item,limit=1,sort=nearest] 最近的一个掉落物 @a[scores={points=10..},limit=5,sort=furthest] 分数达标里最远的5个

sort=的取值有nearest、furthest、random、arbitrary(默认,按加载顺序,不稳定)。做排行榜、抽奖、范围伤害时,这组参数能省掉大量判断逻辑。我自己做跑酷地图的时候,"前三名传送上台"就是靠@a[scores={time=..},limit=3,sort=arbitrary]配合计分板排序实现的。

3. 高频指令分组清单:从改天气到发装备

3.1 环境与规则类:time、weather、gamerule

这类指令是搭场景、做地图的基础,改动的是整个世界而不是某个玩家。

/time set day 设为白天 /time set midnight 设为午夜 /time add 1000 时间前进1000刻 /weather clear 晴天 /weather rain 600 下雨600秒 /weather thunder 雷暴 /gamerule doDaylightCycle false 关闭昼夜循环 /gamerule keepInventory true 死亡不掉落 /gamerule mobGriefing false 阻止怪物破坏方块 /gamerule doMobSpawning false 禁止自然刷怪 /gamerule randomTickSpeed 0 关闭随机刻(作物不长、草不蔓延)

gamerule是地图作者用得最多的一条指令。randomTickSpeed值得单独说:默认是3,设成0之后作物不生长、树叶不腐烂、火不蔓延,性能会明显好转,做红石机器或者极限跑酷时经常要关掉。但注意,关闭随机刻之后很多依赖它的机制也停了,做生存地图时别乱关。

3.2 玩家状态类:gamemode、effect、experience

/gamemode creative @p 切换游戏模式 /effect give @p speed 30 2 给速度效果,30秒,等级2(放大器2代表III级) /effect give @p night_vision 999999 0 true 长时间夜视,隐藏粒子 /effect clear @p 清空所有效果 /experience add @p 100 points 给100点经验 /experience add @p 5 levels 给5级经验 /xp 10L @p 简写形式,给10级

药水效果指令里有两个容易搞错的点:一是放大器和等级差1,0是I级,1是II级,2是III级,写2想要I级效果是新手常见误解;二是时长单位是秒而不是刻,1.13之后改的,老教程里写20倍数值的是旧版本,抄了会得到超长效果。

3.3 物品与方块类:give、setblock、fill、clone

/give @p diamond_sword 1 /give @p minecraft:netherite_helmet{Enchantments:[{id:"minecraft:protection",lvl:4}]} 1 /setblock ~ ~ ~ stone 在脚下放石头 /setblock ~ ~-1 ~ chest{Items:[{Slot:0b,id:"minecraft:diamond",Count:1b}]} replace /fill ~-5 ~-1 ~-5 ~5 ~-1 ~5 stone 填充一片区域 /fill ~ ~ ~ ~10 ~10 ~10 air replace stone 把石头替换成空气 /clone ~-3 ~-3 ~-3 ~3 ~3 ~3 ~10 ~ ~ 复制一片区域到别处

/fill有两个关键参数:replace模式和replace [要替换的方块]模式。不写就是强制覆盖,写了replace stone就只替换石头,其他方块原样保留。做地形塑造的时候,/fill ... air replace stone能精准掏空石头而不影响周围的土和木头。

/clone后面还有masked、filtered、force这几个模式参数。masked只复制非空气方块,做建筑迁移的时候能省掉一堆空气格子,非常实用。

3.4 世界与实体类:summon、tp、data

/summon zombie ~ ~ ~ {IsBaby:1b,CustomName:'{"text":"小僵尸"}'} /summon lightning_bolt ~ ~ ~ 召唤闪电 /tp @p 0 100 0 传送玩家 /tp @e[type=item] @p 把所有掉落物吸到玩家身上 /data get entity @p 读取玩家NBT数据 /data merge entity @e[type=zombie,limit=1] {Health:50f} 修改实体数据

/summon的NBT部分是最能体现MC命令深度的地方。给召唤出来的生物加装备、改血量、设名字、加标签,全靠NBT。{CustomName:'{"text":"小僵尸"}'}里那对单引号是必须的——外层用单引号包住一个JSON文本组件,内层用双引号,这样才不会被解析器拆错。这个嵌套引号规则坑过无数人,记住"外层单引号,内层双引号"基本能解决九成的报错。

4. execute 与条件判断:命令真正开始"编程"的地方

4.1 execute 的四段式语法(as/at/if/run)

如果只会用前面那些指令,你顶多算个"会敲命令的人"。真正跨进"命令编程"这道门的标志,是看懂execute。1.13之后execute被彻底重构,语法变成链式结构,一条命令里可以串好几个子命令,最后必须用run收尾:

/execute <子命令> <子命令> ... run <真正的指令>

最常用的四个子命令:

  • as <目标>:改变"执行者",也就是@s指代谁。但不改变执行位置。
  • at <目标>:改变"执行位置和朝向",但不改变执行者。
  • positioned <坐标>:只改位置。
  • rotated <角度>:只改朝向。

as和at的区别是理解execute的分水岭。举个例子:

/execute as @e[type=zombie] run say 我被执行了 /execute at @e[type=zombie] run summon lightning_bolt ~ ~ ~

第一条:每只僵尸自己说一句话(执行者是僵尸)。第二条:在每只僵尸的位置召唤闪电,但执行者还是你。如果写成as @e[type=zombie] at @s run summon lightning_bolt ~ ~ ~,就是"以每只僵尸为执行者,并且把位置也移到它身上,然后原地召唤闪电"。@s在这里的作用是承接as选出来的那个实体。

4.2 if 与 unless 的条件源:block、entity、score、data

execute之所以强,是因为它能带条件。if是"满足则执行",unless是"不满足则执行"(等价于if取反)。条件源有好几种:

/execute if block ~ ~-1 ~ stone run say 脚下是石头 /execute if entity @a[distance=..10] run say 有人靠近 /execute if score @p points matches 10.. run say 分数够10了 /execute if data entity @s Inventory run say 背包里有东西 /execute if biome ~ ~ ~ minecraft:desert run say 我在沙漠 /execute if loaded ~ ~ ~ run say 这块区域已加载

if score ... matches 10..里的matches支持区间语法,10..是大于等于10,..10是小于等于10,5..15是闭区间,写单个数字就是精确匹配。这个语法在计分板相关判断里到处都是,必须练熟。

还有一个组合写法特别常用:

/execute as @a at @s if block ~ ~-1 ~ minecraft:emerald_block run give @s diamond 1

读法是:把每个玩家当作执行者,把位置移到玩家身上,如果玩家脚下是绿宝石块,就给他一颗钻石。这就是"踩到特定方块给奖励"的完整实现逻辑,做小游戏地图时几乎天天用。

4.3 一个完整例子:只在特定条件下给玩家发奖励

把前面的东西串起来,做一个"分数达标且站在特定区域,才能领奖"的小逻辑。假设已经建好了points计分板,目标是让分数达到100的玩家走到坐标为(0,64,0)附近10格内时,自动获得一把附魔剑并且扣掉100分:

/execute as @a[scores={points=100..}] at @s if entity @s[distance=..10,x=0,y=64,z=0] run give @s minecraft:diamond_sword{Enchantments:[{id:"minecraft:sharpness",lvl:5}]} 1 /execute as @a[scores={points=100..}] at @s if entity @s[distance=..10,x=0,y=64,z=0] run scoreboard players remove @s points 100

这里我把if entity @s[...]当作"位置判断"来用,因为@s配合x/y/z/distance就是一个位置条件。两条命令分别做"发东西"和"扣分",必须分开写,因为run后面只能跟一条指令。这也是很多人第一次写execute时的困惑:一条execute只能对应一条实际操作,要做两件事就写两条。

实际部署时,把这两条命令放进一个循环命令方块里,每刻执行一次,就能实现实时检测。记得配合/gamerule调整 tick 频率,或者加个冷却计分板防止手速太快重复触发。

5. 命令方块与函数:让命令自己跑起来

5.1 三种命令方块类型的区别与连锁顺序

命令方块是MC命令从"手动输入"走向"自动运行"的桥梁。它有三种颜色,对应三种运行方式:

方块类型颜色触发方式典型用途
脉冲命令方块橙色收到红石信号执行一次按钮触发的单次事件
循环命令方块紫色每游戏刻(1/20秒)执行一次持续检测、计时器
连锁命令方块绿色被前一个命令方块指向后执行把多条命令串成一条流水线

连锁命令方块的"指向"是靠放置方向决定的。放置时要站在你想让它"等待"的那个方块后面,对着它放,箭头指向的那个方块就是它的前驱。这个方向感很多人第一次摆都会摆反,摆完记得按F3看准星朝向,或者干脆先放一个、开红石触发测试一下顺序对不对。

三个方块都记得设置"自动执行"或者"需要红石"。脉冲方块默认需要红石信号,连锁方块默认"始终执行"(也就是前驱一跑它就跟着跑)。做流水线的时候,把第一个脉冲方块接按钮,后面的连锁方块全部保持默认,红石信号一进来,整条链就会在同一个游戏刻内按顺序跑完。

5.2 循环命令方块与刻的概念(tick)

MC的游戏循环是每秒20个刻(tick),也就是每50毫秒一次。循环命令方块默认就是每刻执行,这意味着它一秒跑20次。这个频率带来两个后果:一是能做出实时的检测效果(比如踩到压力板立刻响应),二是性能开销会累积——放几十个循环命令方块,再配上复杂的选择器,帧率会肉眼可见地掉。

我在做中型地图的时候踩过这个坑:为了做排行榜,放了十几个循环命令方块,每个都遍历@a计算分数,结果进游戏就卡成PPT。后来把逻辑改成用一个循环方块调用一条/function,再在函数里统一处理,帧率立刻回来了。经验是:循环命令方块数量尽量控制在个位数,复杂逻辑一律走函数。

还有个细节是"刻的先后顺序"。同一刻内,多个命令方块的执行顺序是按加载顺序来的,不是按坐标或者你摆放的顺序,这会导致依赖关系出错。解决方法是用一个主循环方块,串起所有链式方块,保证执行顺序严格可控。

5.3 数据包函数:比命令方块更干净的方案

数据包(datapack)是Java版里管理命令逻辑的正规方案,本质上就是把.mcfunction文件放在存档里,让游戏去读。它的优势很明显:可读、可版本管理、可以互相调用、不占用世界里的方块。

一个最小可用的数据包结构长这样:

saves/你的存档/datapacks/mypack/ ├── pack.mcmeta └── data/ └── mypack/ └── function/ └── hello.mcfunction

pack.mcmeta的内容:

{ "pack": { "pack_format": 15, "description": "我的第一个数据包" } }

pack_format的数值必须和你的游戏版本匹配,1.20.1 是 15,越新的版本数值越大,1.21 附近已经到 48 上下。填错了游戏会提示数据包不兼容。具体数值去查对应版本的官方文档,或者干脆新建一个世界,看看原版数据包用的是哪个数字,直接抄。

hello.mcfunction里写:

say 数据包加载成功 give @a minecraft:bread 1

然后在游戏里执行/reload重载数据包,再输入/function mypack:hello就能触发。函数名是命名空间:文件路径的形式,子文件夹会体现在路径里,比如data/mypack/function/shop/buy.mcfunction对应mypack:shop/buy。

注意:从 1.20.5 开始,函数目录名从functions改成了单数function,很多老教程还写着复数形式,照着抄会加载不到。写数据包之前先确认自己的版本号这个细节。

函数还有个杀手级特性:函数里的命令默认以函数调用者的身份和位置执行,而且执行过程中不会因为某条命令失败就中断(除非你显式加了条件)。这意味着你可以把一个复杂的连锁逻辑写进一个文件里,比摆一堆命令方块清爽太多。

6. 计分板与变量:MC里怎么"存数据"

6.1 scoreboard objectives 的三种类型

计分板(scoreboard)是MC命令体系里唯一的"变量系统"。它的核心概念是"记分项(objective)"和"分数(score)",每个玩家或实体在每个记分项上都有一个数值。创建记分项的语法:

/scoreboard objectives add points dummy /scoreboard objectives add deaths deathCount /scoreboard objectives add kills playerKillCount

第二个参数是准则(criteria),决定这个分数怎么涨:

  • dummy:手动控制的,只能靠命令加减,最灵活,用于自定义玩法。
  • deathCount:玩家死亡自动加1。
  • playerKillCount:击杀玩家自动加1。
  • totalKillCount:击杀任何生物都加1。
  • health、food、air、armor、level、xp:直接读取玩家的对应属性,只读,不能手动设。

想把记分项显示在屏幕右侧:

/scoreboard objectives setdisplay sidebar points /scoreboard objectives setdisplay list points

sidebar是右侧排行榜,list是Tab列表里的黄字,belowName显示在玩家名字下方,这些是地图里最常用的展示位置。

6.2 常用 operation 运算

分数本身可以参与运算,这是做逻辑判断的基础:

/scoreboard players set @p points 0 设为0 /scoreboard players add @p points 10 加10 /scoreboard players remove @p points 5 减5 /scoreboard players operation @p points += @p bonus 把bonus加到points上 /scoreboard players operation @p points *= @p multiplier 乘以倍率 /scoreboard players operation @p points >< @p other 交换两个分数 /scoreboard players operation @p points < @p other 取两者较小值

operation的语法是目标 运算符 来源,运算结果写回目标。这一组运算符里,><(交换)和<、>(取小取大)是很多人不知道但极其好用的。做血量同步、属性限制的时候,<能一行搞定"不超过上限"的逻辑。

有个必须注意的点:计分板里的分数是整数,没有小数。要做精确到0.1秒的计时,得用"分数存毫秒值,显示时除以10"的方式处理。这个坑我在做跑酷计时的时候踩得很深,一开始直接存秒数,结果所有人成绩都是整数秒,完全没有区分度。

6.3 用计分板做计数器与状态标记

计分板最经典的用法是冷却计时器。思路很简单:用循环命令方块每刻给某个记分项减1,减到0就可以再次触发。

/scoreboard objectives add cooldown dummy /scoreboard players set @p cooldown 100 触发时设为100刻(5秒) /execute as @a[scores={cooldown=1..}] run scoreboard players remove @s cooldown 1 循环减 /execute as @a[scores={cooldown=1}] run say 冷却结束

这套"设初值—循环递减—到0触发"的模式,是所有冷却、计时、状态持续时间逻辑的通用骨架。做技能、传送冷却、任务倒计时,全都是这个套路换皮。

另一种用法是状态标记。比如"玩家是否完成了某个任务",用一个task1记分项,0是未完成,1是已完成,配合if score @p task1 matches 1做条件判断。相比用标签(/tag),计分板能存数值、能排序、能展示;相比NBT,计分板操作简单、性能好。我一般的原则是:纯状态用标签,需要数值或展示用计分板。

7. 踩坑清单:这些报错我基本都遇到过

7.1 "Unknown command" 的几种真实原因

这个报错几乎是所有人的入门第一课,但它背后的原因远比想象的多:

报错场景真实原因解决方式
单人存档敲命令没反应作弊未开启世界设置里打开允许作弊
指令名拼写正确但报错大小写写错了指令名全小写
在命令方块里粘贴聊天框内容多了斜杠删掉开头的/
服务器里报错权限等级不够让管理员给 op
版本升级后老命令失效语法在1.13后大改查新版本对应语法
中文输入法状态敲命令标点是全角切到英文输入法

最后一条特别隐蔽。中文输入法下的逗号、括号都是全角字符,看起来一样但游戏解析不了。写NBT和JSON的时候我强烈建议先在记事本里写好再粘贴,避免输入法捣乱。

7.2 NBT 语法大小写与引号

NBT是MC命令里最容易写错的部分,错误类型基本固定几种:

  • 类型后缀漏了:Health:50不行,得写Health:50f(f代表浮点),Count:1b(b代表字节),IsBaby:1b。整数后缀还有s(short)、l(long)。
  • 字符串引号搞错:CustomName:"名字"在某些位置是错的,文本组件需要用 JSON 格式,标准写法是CustomName:'{"text":"名字"}',外层单引号内层双引号。
  • 该加minecraft:命名空间没加:id:"diamond"在新版本里建议写成id:"minecraft:diamond",不加虽然有时也能识别,但会有警告。
  • 列表格式写错:Enchantments:[{id:"...",lvl:4}]里那对大括号和小括号缺一不可,每条附魔是一个独立的对象。

我个人的习惯是每次写完NBT先执行/data get验证一次,确认数据真的挂上去了,再往下写。直接写完一长串命令方块然后发现不生效,回头定位是哪一层引号错了,会非常痛苦。

7.3 Java版与基岩版的语法差异对照

这是另一个高频踩坑区。很多人看的教程是Java版的,自己玩的却是基岩版(手机、主机、Windows商店版),照着抄必然失败。

功能Java版基岩版
游戏模式切换/gamemode creative @p语法类似,但参数顺序更宽松
药水效果/effect give @p speed 30 2旧版是/effect @p speed 30 2
目标选择器限量limit=3c=3
execute1.13后链式结构1.19.80后才引入新语法,老版本完全不同
NBT支持完整NBT大部分指令不支持NBT
数据包支持不支持,用行为包

差异最大的是execute。基岩版长期用的是/execute <目标> <坐标> <指令>的老结构,直到1.19.80才跟上Java版的新语法。如果你在基岩版里写execute as @a at @s run报错,先确认版本号,低于1.19.80就只能用老语法。

8. 从玩具到作品:三个可以直接抄的实战小项目

8.1 一键回城传送点

目标:玩家在任意位置执行/trigger home,传送回预设的家。这个项目能一次性练熟触发式计分板、函数调用和坐标存储。

/scoreboard objectives add home trigger /scoreboard players enable @a home

trigger类型的记分项有个特殊之处:玩家自己可以用/trigger改名,但只能通过/scoreboard players enable授权后才能用,而且用完会自动重置。然后在循环命令方块里挂一条:

/execute as @a[scores={home=1..}] at @s run tp @s 100 65 100 /execute as @a[scores={home=1..}] run scoreboard players set @s home 0

想给多个家升级,就加多个触发项home2、home3,每个对应不同坐标。这个方案的妙处在于完全不需要玩家有权限,普通玩家也能用/trigger触发自定义功能,是多人服务器的标准做法。

8.2 简易商店/兑换系统

目标:玩家打怪获得"金币"(计分板),走到商店方块前用金币换物品。

先建金币记分项并绑定击杀:

/scoreboard objectives add gold dummy /execute as @a run scoreboard players add @s gold 0

用一个循环命令方块做检测:玩家站在指定方块(比如一个金块)上方,且金币够10,就扣10金币给他一个苹果:

/execute as @a at @s if block ~ ~-1 ~ minecraft:gold_block if score @s gold matches 10.. run give @s minecraft:apple 1 /execute as @a at @s if block ~ ~-1 ~ minecraft:gold_block if score @s gold matches 10.. run scoreboard players remove @s gold 10

注意顺序:先给物品,再扣金币。如果反过来,扣完金币后分数可能不满足10..条件,第二条第if score判断就失败了,物品发不出去。这个执行顺序问题是做商店系统时最容易忽略的细节。

8.3 跑酷计时与排行榜

目标:玩家踩到起点方块开始计时,踩到终点方块结束,记录用时并排名。

/scoreboard objectives add timer dummy /scoreboard objectives add best dummy /scoreboard objectives setdisplay sidebar timer

起点检测(循环命令方块):

/execute as @a at @s if block ~ ~-1 ~ minecraft:redstone_block run scoreboard players set @s timer 0 /execute as @a at @s unless block ~ ~-1 ~ minecraft:redstone_block run scoreboard players add @s timer 1

逻辑是:站在起点红石块上时,计时器每刻被重置为0;一旦离开起点,计时器开始累加。到终点时,用>运算符比较并更新最佳成绩:

/execute as @a at @s if block ~ ~-1 ~ minecraft:emerald_block run scoreboard players operation @s best > @s timer

注意这里是反的——因为计时器数值越小越好,所以"最佳成绩"取两者的较小值需要用<而不是>:

/execute as @a at @s if block ~ ~-1 ~ minecraft:emerald_block run scoreboard players operation @s best < @s timer

跑酷计时里数值越小越好,所有比较运算的方向都要反过来,这一点我在第一次做的时候全写反了,排行榜显示的是"最慢记录",调了半天才发现。

我个人在做这类计时系统的时候,还有个心得:计时器每刻加1,20刻等于1秒,直接显示会有4位数,很难看。解决办法是用/scoreboard players operation做一次除法,把刻数除以20,或者干脆在展示界面用title显示"你用了 X 秒",在命令里做一次换算。整数除法的精度损失是无可避免的,只要比赛规则接受"秒级精度"就没问题;要精确到0.1秒,就得存毫秒值再手动插入小数点,代价是显示和排名的逻辑都要跟着改。这中间的取舍,取决于你的地图到底想精确到什么程度。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询