逻辑运算---And, or, not
什么是逻辑运算呢?就是对布尔值(boolean,有两个值true/false)进行运算
常用的就是要多个条件同时符合(and),或者是任何一个条件符合(or),或是不能符合某个条件(not)
真值表
以下表格可以拓展至n个不同输入/输出
输入 | and | or |
---|---|---|
True, True | True | True |
True, False | False | True |
False, True | False | True |
False, False | False | False |
输入 | not |
---|---|
True | False |
False | True |
MC实现And
记分板+选择器
选择器的规则就是选择到的实体必须是符合所有条件的
由于记分板的选择器参数是"score_XXX"或者是"score_XXX_min",因此可以同时有多个参数
因此,你可以用多个参数来指定同时拥有多个分数的实体
举个例子,@e[score_a=5,score_a_min=5,score_b=6,score_b_min=6],就是选择所有记分板a=5、b=6的实体
需要注意的是,除了记分板以外的参数都不能重复出现(score_a=和score_b=实为不同参数,因此可“重复”),详见选择器教程
链锁CB 条件模式
条件模式就是要前面的命令成功执行,之后的才会执行*。因此我们可以用多条检测命令来当条件,最后执行别的命令
例子:
testfor @a[r=5]
cond:testfor @e[type=ArmorStand,name=a]
cond:say 5格范围内有玩家,并且场上有个叫a的AS
需要注意的是,如果前面的检查不成功,后面的也不会执行
使用条件制约下的链锁cb请注意方向问题(cccb规则强制要求同向),一般来说拐弯会导致cond的ccb无法触发!
MC实现Or
记分板tag
方法很简单,分别检测不同情况是否符合,符合就给实体一个分数/标签。然后针对那个分数/标签的实体执行命令
例子:
scoreboard players set @a[tag=a] tagScb 1
scoreboard players set @a[tag=b] tagScb 1
execute @a[score_tagScb_min=1,score_tagScb=1] ~ ~ ~ say 我有a/b标签
MC实现Not
not就是当条件不满足的时候才执行命令(为了方便,下面会用!代表not)
举个例子,分数a!=5的时候say hi,就是分数不等于5的时候才say hi
记分板分数
首先给所有实体一个初始分数,然后给符合条件的实体另一个分数
还维持着原来分数的实体就自然是不符合那些条件的实体了
scoreboard players set @e notSlime 1
scoreboard players set @e[type=Slime] notSlime 0
scoreboard players set @e[type=LavaSlime] notSlime 0
execute @e[score_notSlime_min=1] ~ ~ ~ say i am not slime
注意: 记分板的好处在于能够在大量逻辑的时候进行简化, 而且如果不止是not一种的话, 记分板就能做到特殊优化
tag
原理就是这样,给符合要求的实体一个tag,然后用=!tag选择没那个tag的实体
scoreboard players tag @e[type=Slime] add Slime
scoreboard players tag @e[type=LavaSlime] add Slime
execute @e[tag=!Slime] ~ ~ ~ say i am not slime
注意: tag的话则不能做到and。如果需要复杂逻辑的话建议使用记分板分数,因为那比较方便优化
条件不符合时执行命令
比如,我希望在场上全部玩家都不是gamemode 2的时候将所有人tp到某处,这种时候除了可以用类似前两种的方式execute执行,还可以用testfor+检查SuccessCount的结构。
//默认向上
testfor @a[m=2]
testforblock ~ ~-1 ~ {SuccessCount:0}
cond:tp @a 0 0 0
cond:后续要执行的命令