Minecraft基岩版实体、方块、物品事件格式详解

定义事件
定义事件(Definition Event)是一种可以用于实体、方块和物品的JSON定义中的事件。
默认值
可能性:1.0
自身过滤器合集类型:与(0)
定义事件类型:无(3)
逻辑
模式
每个事件加载的逻辑顺序
事件接受的值:一个事件加载器,一个JSON值(本事件的定义JSON),一个事件调用者,一个事件响应工厂。其中事件调用者即正在执行该事件的类型,如下:
先读取weight
字段并计算、存值,取绝对值并覆盖默认的可能性值。
检测该事件的调用者,如果是活动对象(1),读取filters
字段并存值、解析,否则(即是方块(0)或物品(2))读取condition
字段并存值、评估。
检测是否存在randomize
字段,如果存在,读取randomize
字段并检测是否存在sequence
字段,如果二者皆存在,提示内容日志错误,并忽略sequence
字段。如果randomize
字段不存在,检测并读取sequence
字段。randomize
字段或sequence
字段是一个数组,数组中每个对象称为一个子事件,将读取到的所有子事件称为一个合集,递归加载合集中的每个子事件,而后将整个合集存入该父事件中,并将该父事件的定义事件类型更改为序列(1)或随机(2)。如果二者皆不存在,该事件的定义事件类型更改为叶节点(0),并继续执行下述逻辑。
读取trigger
字段并按照定义触发器的常规解析方式解析该定义触发器。
检测该事件的调用者,如果是活动对象(1),读取add
字段(若有)和remove
字段(若有)并解析。二者格式皆为一个对象,目前内只有component_groups
字段,用于添加或移除一个组件组。
如果事件响应工厂存在(前提之一为已打开“假日创作者功能”‘实验性玩法,目前有三种事件响应工厂,分别是活动对象、物品和方块),对该叶节点进行模式验证(schema validation)。若验证通过(即JSON结构合乎一个事件响应),执行事件响应逻辑。如果验证失败将强制将该事件的定义事件类型更改为无(3)并报内容日志错误。
事件响应
首先明确一点,实体(即活动对象)、物品和方块是共用事件响应的,一个事件响应不属于上述任何一种事物,只存该事物会调用哪种事件响应的逻辑,比如,CommandResponse
(run_command
)事件响应早期会被实体、物品和方块调用,后期出现了专门为实体调用的ActorCommandResponse
,CommandResponse
依旧同时为物品和方块调用,调用时他们使用的逻辑是一致的,而ShootEventResponse
事件响应只会被物品调用。
同时还要明确一点,任何事件响应的使用都需要“假日创作者功能”‘实验性玩法。
事件响应列表
ActorCommandResponse

以target
为起点执行一条或多条命令。
SetPropertyResponse
设置实体的一个属性,接受一般值或Molang表达式。
CommandResponse

以target
为起点执行一条或多条命令。
DecrementStackEventResponse
物品堆叠减少1。
DamageResponse

对target
造成type
类型的amount
点带有击退的伤害或损坏。特别地,当对物品造成损坏时,type
字段不表示任何意义,可以为任意字符串。当对实体造成伤害时,如果type
为fire
,会额外地点燃实体。
DieEventResponse

致实体死亡或方块掉落。
MobEffectResponse

给予一个状态效果。
RemoveMobEffectResponse

移除一个或全部状态效果。
ParticleEffectResponse

在一个位置带有数据值播放一个旧版粒子。
PlaySoundResponse

SetBlockProperty
设置方块的一个属性,接受一般值或Molang表达式。
ShootEventResponse

发射一个弹射物,弹射物的发射角度如上所示,初始威力为对应实体的minecraft:projectile
组件的power
字段的值乘以此处的launch_power
字段的值,不确定性为对应实体的minecraft:projectile
组件的uncertainty_base
字段的值减去该实体所在存档的难度乘以组件uncertainty_multiplier
字段的值,基速度为零向量,弹射物无特定攻击目标,无伤害拥有者。
SwingEventResponse
使持有该物品的实体播放摆臂动画。
TeleportResponse

传送一个实体。
TransformItemResponse
将物品转化为另一个物品。
SetBlock
在当前方块处设置方块类型。
SetBlockAtPos
在相对于当前方块的偏移位置处设置方块类型。
SpawnLootEventResponse
在存档中以0.0幸运值无作用实体无玩家无伤害来源的模式从战利品表中抽取物品并掉落在该方块处。
事件响应工厂


附录:定义触发器
定义触发器(Definition Trigger)是一种可以用于实体、方块和物品的JSON定义中的触发器。
逻辑
定义触发器分为适用于物品和方块的普通定义触发器和适用于实体的活动对象定义触发器。
模式
附录:过滤器组
过滤器组(Filter Group)指实体中需要条件的位置传入的过滤器集合,一个过滤器组中可以有一个或多个过滤器。
逻辑
每个过滤器组都可以有子过滤器组或一个过滤器组成。过滤器的合集类型默认由执行该过滤器的组件、事件响应或触发器提供,比如所有的定义事件中执行的过滤器以及定义事件中的trigger
触发器和事件响应中执行的过滤器的默认合集类型都为“与”(AND,0)。
模式
注意事项
在源码层面中,以下这种格式的结构中,如果父级(示例中为top
)的合集类型为OR,会自动在该父级下新建一个合计类型为AND的子过滤器组,并将该结构视为该合集类型为AND的子组的结构进行解析。
简言之,父级如果是OR的情况下,如果父级被解析为一个对象,而且对该象中没有test
字段(即不是叶节点),而且该对象中的字段数目不止1个(严格大于1),那么在该父级下会先新建一个AND合集类型的子组,将该对象视为该子组的内容来解析。如果该父级解析为一个数组,则不受任何影响;如果该父级是AND或NOT,也不受此影响。上述格式等价转换成下述格式后,将会正常按照OR的逻辑进行解析:
该逻辑保证了所有非叶节点的表现为对象的节点的逻辑都是AND或NOT(一般可来说,如果是根节点,可以肯定为AND,因为根节点的合集类型是由组件、事件响应或触发器来提供的,一般不会提供NOT的根节点逻辑)。表现为数组的逻辑则需要根据父级来确定。