- 编程
第二期:/execute 教程(二)
- @ 2025-6-17 10:02:20
上一期还有一个存储子命令没有讲
存储子命令
在mc里,每一个命令都有它的返回值
有两种,success和result:
success是 布尔值,表示是否成功执行
比如说,你 /tp @e[type=sheep,distance=3..5] ^ ^5 ^
但是选择器没有选到,此时success为 0
result是 整数,如果不是,向下取整
比如所,你用 /data get entity @s Pos[0]
success 为 0 ,result 为你的x坐标向下取整
那么,知道了这些,就可以看接下来的内容了:
存储子命令只有 store 这一个子命令,可以将 run子命令后面的命令的result或success值存储到指定位置。
store 后面先跟着 result或success ,表示存储哪一种返回值
它与其他子命令一起处理,先行记录存储位置,不影响其他子命令。当最后一个子命令执行后,将其返回值存入指定位置
可用存入位置有5个:
block:存入指定方块实体的指定NBT标签内。
bossbar:存为Boss栏的当前值或最大值。
entity:存入指定实体的指定NBT标签内。
score:存入指定分数持有者的指定记分项上。
storage:存入指定存储容器的指定NBT标签内。
score位置 可以将返回值存储到积分项上,很好用。
/execute as InnitTimmer store result score #y(这是一个变量) (这里写那个变量所在计分板名) run data get entity @s Pos[1]
如果你想随机传送到一个位置,可以用 entity 和 /random 来做
execute summon armor_stand at @s run function namespace:tp_stc
#召唤盔甲架
### 在 tp_stc 里放↓
data merge entity @s {Invulnerable:true, Invisible:true, NoGravity:true, Marker:true}
#将盔甲架设为一个标记
execute store result entity @s Pos[0] double 1.0 run random value -3000..3000
execute store result entity @s Pos[1] double 1.0 run random value 128..324
execute store result entity @s Pos[2] double 1.0 run random value -3000..3000
tp @e[type=player] @s
kill @s
为什么要费力用盔甲架呢?因为data 和store entity都不能修改玩家的NBT,但是可以修改盔甲架的NBT
如果你想随机传送到一个位置并且精度为0.001,可是result返回值只能是整数怎么办?
这就要用到 scale 参数。它为double类型。存储时,会先将原数据变为double,再乘上 scale ,再转换类型,就有了真正被赋值给NBT的数据
另外,再数据包的实际编写中,若用计分板做变量,只能存储int范围内的整数,不过便于比较大小。若用实体的NBT做变量,可以存储和读取浮点数,整数,布尔值等。
在上面的例子里,scale参数为 1.0。
稍微改一下就满足要求了
data merge entity @s {Invulnerable:true, Invisible:true, NoGravity:true, Marker:true}
execute store result entity @s Pos[0] double 0.001 run random value -3000000..3000000
execute store result entity @s Pos[1] double 0.001 run random value 128000..324000
execute store result entity @s Pos[2] double 0.001 run random value -3000000..3000000
tp @e[type=player] @s
kill @s
store storage 的语法和 entity 差不多,不多赘述
来个离子:
# 将距离最近的玩家4格内的所有猪扔向天空:
/execute at @p as @e[type=pig,distance=..4] run data merge entity @s {Motion:[0.0,3.0,0.0]}
补充一下,mc中的“范围类型” 的语法:
1
1..1
1..2
1.2..2
45..123.3
..112
42..
以上都是正确语法,至于意义,应该很好理解吧,都和区间差不多
那么显然, 2..1 是错误的。