第四十三章 players——记分板商店
test,之前见过,意为“探测”、“检测”。通过test,可以探测一个变量的分数是否在一个区间内。我们就得通过它,来防止欠账的事情发生。
(注意,test子命令在Java1.13更新中被移除。现在仅Java1.12.2及以下版本和基岩版拥有该子命令)
现在已经有了“$”这个货币,并且作者有100万$(游戏里)。假设现在有一个物品,价值120万$(什么东东这么贵)。如果这个记分板商店就是一个scoreboard—br /layers—remove加上/give,那么作者也会买成功,但是$变成了-20万$(欠了20万美元)。
但是,Minecraft里可没有自带还债机制,所以作者能够一直扣下去。
为了防止这种事情的发生,我们就需要用到test子命令。其格式是:
... test <目标选择器><计分项><最小值>[<最大值>]
注意,在Java版有test的时候,格式确实如上,“最大值”参数是选填的。但在基岩版中,“最大值”参数是必填的。
假设我们要使用test检测玩家“李四250”是否能够购买这个120万美元的东西,我们就需要执行指令:
/scoreboard br /layers test 李四250 $ 1200000 *
其中,最大值被替换为了星号。这个“星号”是什么意思呢?
当最小值填*时,代指-2147483648;当最大值填*时,代指2147483647。
也就是说,这个/scoreboard br /layers test 李四250 $ 1200000 *,实际上是/scoreboard br /layers test 李四250 $ 1200000 2147483647。
所以这条指令的意思是:
检测玩家“李四250”在$计分项上的分数是否大于等于1200000(并小于2147483647)。
如果成功,那么游戏会提示“分数xxx在1200000到2147483647范围内”。
如果失败,则会在“在”字前加个“不”字,并将整个消息的颜色改为红色。
在命令方块中检测成功也会输出信号,进而激活接下来的命令方块。
我们记分板商店的原理之一就是这个。命令方块如下摆放即可做成简单的记分板商店:
A→B→C
A(脉冲,不受制约/无条件,红石控制/需要红石):
/scoreboard br /layers test @br / $<物品单价>*
B(连锁,条件制约/有条件的,保持开启/始终活动):
/scoreboard br /layers remove @br / $<物品单价>
C(连锁,条件制约/有条件的,保持开启/始终活动):
/give @br / <物品id> 1
这是最简单的记分板商店,其购买流程如下:
玩家按下拉杆激活A→A执行指令,检测玩家是否能够购买→如果能,激活B/如果不能,结束购买→B执行指令,扣除玩家虚拟币,并激活C→C执行指令,给予物品给玩家→购买成功
这种记分板商店还有许多待完善之处:
①由于使用@br /选取最近玩家,B和C可能将指令执行到错误的玩家上
②远处的玩家也可以碰到拉杆,但命令方块可能不会将指令执行到该玩家身上
③成功和失败都没有消息提示
解决办法也很简单:
一、目标选择器加上x、y、z参数指定执行中心,加上r或dx、dy、dz指定执行范围。
二、将每个购买项目单独做成一间1×1的铁门间,门内放测重压力板(如有装mod,可以使用夸克模组内的黑曜石压力板,更加安全)。
三、可以在A前面再加上两个命令方块D和E,在C后面加上F,即D→E→A→B→C→F。把A改为连锁,不受制约/无条件,保持开启/始终活动。D、E和F如下:
D(脉冲,不受制约/无条件,红石控制/需要红石):
/scoreboard br /layers test @br / $*<物品单价-1>
E(连锁,条件制约/有条件的,保持开启/始终活动):
/tellraw @br / {“text“:“购买失败“,“color“:“red“}
F(连锁,条件制约/有条件的,保持开启/始终活动):
/tellraw @br / {“text“:“购买成功“,“color“:“green“}
其原理就是在检测检测玩家是否能够购买前检测玩家是否不能购买。如果确实不能,发出消息“购买失败”。以及在玩家购买成功后发送“购买成功”的消息。
注意,在这里,D和E不能放在A、B、C、F之后,即不能:
A→B→C→F→D→E
这主要是因为这是就变成了在检测玩家是否能购买后再检测一遍是否不能购买。不要小看这一前一后的问题,如果这名玩家能购买,购买成功后就不能再购买一个了,那么这个商店就会先后发出“购买成功”、“购买失败”两条消息。
现在,你知道如何做一个最基础的记分板商店了吧?这东西在网易租贷服中可大有用处。(毕竟网易租贷服可加不了什么mod或插件,只能靠指令)
记分板简要历史:
Java
1.5——加入了记分板
1.7.2——计分项的准则现在可以使用统计菜单中的数据了
1.8——现在非玩家也能被记分板追踪并拥有分数了;为br /layers下的reset子命令加入了“计分项”参数;统计类准则可以使用ID名了;加入了队伍击杀相关准则以及其他的一堆准则;为br /layers下的add、set和remove子命令加入了NBT参数;为obr /eration加入了=、>、<和><操作。
1.8.2——又加入了一堆准则
1.9——加入了stat.sneakTime、xbr /、food、armor、level和air等准则。
1.13——准则大改;加入了/scoreboard objectives modify子命令。
基岩版
1.7.0——加入了被阉割的记分板和dummy准则。