目录

新人手册

1 逻辑运算---And, or, not

什么是逻辑运算呢?就是对布尔值(boolean,有两个值true/false)进行运算
常用的就是要多个条件同时符合(and),或者是任何一个条件符合(or),或是不能符合某个条件(not)

1.1 真值表

以下表格可以拓展至n个不同输入/输出

输入 and or
True, True True True
True, False False True
False, True False True
False, False False False
输入 not
True False
False True

1.2 MC实现And

1.2.1 记分板+选择器

选择器的规则就是选择到的实体必须是符合所有条件
由于记分板的选择器参数是"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=实为不同参数,因此可“重复”),详见选择器教程

1.2.2 链锁CB 条件模式

条件模式就是要前面的命令成功执行之后的才会执行*。因此我们可以用多条检测命令来当条件,最后执行别的命令

例子:

testfor @a[r=5]
cond:testfor @e[type=ArmorStand,name=a]
cond:say 5格范围内有玩家,并且场上有个叫a的AS

需要注意的是,如果前面的检查不成功,后面的也不会执行
使用条件制约下的链锁cb请注意方向问题(cccb规则强制要求同向),一般来说拐弯会导致cond的ccb无法触发!

1.3 MC实现Or

1.3.1 记分板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标签

1.4 MC实现Not

not就是当条件不满足的时候才执行命令(为了方便,下面会用!代表not)
举个例子,分数a!=5的时候say hi,就是分数不等于5的时候才say hi

1.4.1 记分板分数

首先给所有实体一个初始分数,然后给符合条件的实体另一个分数
还维持着原来分数的实体就自然是不符合那些条件的实体了

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一种的话, 记分板就能做到特殊优化

1.4.2 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。如果需要复杂逻辑的话建议使用记分板分数,因为那比较方便优化

1.4.3 条件不符合时执行命令

比如,我希望在场上全部玩家都不是gamemode 2的时候将所有人tp到某处,这种时候除了可以用类似前两种的方式execute执行,还可以用testfor+检查SuccessCount的结构。

//默认向上
testfor @a[m=2]
testforblock ~ ~-1 ~ {SuccessCount:0}
cond:tp @a 0 0 0
cond:后续要执行的命令