前言

要解读本篇教程需要较为熟练的命令知识,以及一些数据包的基础,至少要了解/scoreboard,/data,/execute等命令。

无权限使用命令

在计分板中,有一个触发器叫“触发器”,,写为trigger。(基岩版没有,所以基岩版可以跑了)

这个触发器根dummy准则差不多,但是它可以给予玩家权限。被给予权限的玩家拥有权限使用/trigger命令来修改该计分板的内容。

最后让我们再配合目标选择器,就可以实现无权限使用命令了。

注:/trigger命令无需任何权限。


那么让我们举一个例子。我现在需要让玩家在没有权限的情况下保留物品栏并杀死自己。若保留物品栏没有开启,则也不会掉落任何物品。

命令写法

首先,让我们先做一些准备工作。

/scoreboard objectives add kill_me trigger

这个命令用于添加一个名字为kill_me的计分板,类型为trigger,用于使玩家触发。

在刚刚创建计分板时,没有人被计分板追踪,导致系统可能会认为刚开始时它就已经触发了,所以我们要给予没有被计分板追踪的玩家一个分数:0

这个命令需要用循环命令方块进行循环执行。

/execute as @a unless score @s kill_me = @s kill_me run scoreboard players set @s kill_me 0

现在,我们需要检测玩家触发trigger后,对其执行命令。

这个时候肯定有人心急直接把分数清零,但是这个分数还有用,暂时先别清理。

那么现在问题又来了:如何让玩家死亡时不掉落物品?

其实,如果玩家位于旁观模式死亡时,其身上的物品不会掉落。

那么我们就可以用一个有条件连锁命令方块,连接在上面那个循环命令方块后面,写入:

/execute as @a unless score @s kill_me matches 0 run gamemode spectator @s

然后杀死它,命令方块连锁无条件连接在上面那个方块后面并写入命令:

/execute as @a unless score @s kill_me matches 0 run kill @s

最后将它的触发器计分板设置为0 ,防止反复触发,作为一个连锁命令方块有条件检测连接在上面那个命令方块的后面:

/execute as @a unless score @s kill_me matches 0 run gamemode survival @s

最后清空玩家的trigger计分板,防止反复触发,连接在上面那个命令方块后面,调为连锁有条件:

/execute as @a unless score kill_me matches 0 run scoreboard players set @s kill_me 0

那么这样的一个无权限使用命令就完成了,此时玩家使用/trigger kill_me时,就可以杀死自己并且不掉落任何物品了。

数据包写法

对于数据包而言,数据包有函数标签,可以直接像命令方块一样循环执行,且不受区块加载的影响。

这里以命名空间kill_me为例,创建一个函数文件位于data/kill_me/functions/main.mcfunction

其中写入:

scoreboard objectives add kill_me trigger
execute as @a unless score @s kill_me = @s kill_me run scoreboard players set @s kill_me 0
execute as @a unless score @s kill_me matches 0 run gamemode spectator @s
execute as @a unless score @s kill_me matches 0 run kill @s
execute as @a unless score @s kill_me matches 0 run gamemode survival @s
execute as @a unless score kill_me matches 0 run scoreboard players set @s kill_me 0

然后将其加入tick函数标签,让其没tick高频执行:

在data/Minecraft/tags/functions/tick.json

{
    "value": [
        "kill_me:main"
    ],
    "replace": true
}

这样子,一个简简单单的数据包就做好了。

巧用/clear合成带有NBT的物品

想到指令/clear,大家可以想到什么?清除玩家背包,亦或者清除指定物品?现在先让我们看一下/clear命令的语法:

/clear (要清除的物品) (清除数量)

可是你知道:清楚数量可以填写为0吗?

当数量填写为0时,玩家的背包并不会发生任何变化,但是会返回玩家背包对应的物品数量,配合上进度触发器,从而达到使合成的物品具有NBT的特点。

举一个例子:现在我要用一个钻石块合成一个祖母碎片(自己加的一个物品),其拥有NBT值CustomData:11451414。

首先我们用数据包创建一个无序配方(此处教程省略)合成为一个知识之书,再利用minecrat:recipe_crafted触发器进行检测并触发对应函数即可。

在触发的函数写入以下命令(大写字母表示可以被替代)

#创建计分板
scoreboard objectives add SCOREBOARD_ITEM dummy

#对于计分板添加参数
execute storage result score @s SCOREBOARD_ITEM run clear @s minecraft:knowledge_book 0

#清除所有知识之书
execute if score @s SCOREBOARD_ITEM matches 1.. run clear @s minecraft:knowledge_book

#给予一次知识之书
execute if score @s SCOREBOARD_IEM matches 1.. run give @s minecraft:ITEM {CustomData:11451414}

#清除一次计分板
execute if score @s SCOREBOARD_ITEM matches 1.. run scoreboard players remove @s SCOREBOARD_ITEM 1

#重复执行
execute if score @s SCOREBOARD_ITEM matches 1.. run function (这条函数名字)

那么这样子就可以将合成出来的物品添加NBT了。请不要把这个函数加入minecraft:tick或者minecraft:load标签,因为这个函数并不需要高频执行,也不需要在玩家加入世界之前就执行(反而会出问题)


未完待续,我未来还会更多的小技巧分享。