Minecraft基巖版實(shí)體、方塊、物品事件格式詳解

定義事件
定義事件(Definition Event)是一種可以用于實(shí)體、方塊和物品的JSON定義中的事件。
默認(rèn)值
可能性:1.0
自身過(guò)濾器合集類型:與(0)
定義事件類型:無(wú)(3)
邏輯
模式
每個(gè)事件加載的邏輯順序
事件接受的值:一個(gè)事件加載器,一個(gè)JSON值(本事件的定義JSON),一個(gè)事件調(diào)用者,一個(gè)事件響應(yīng)工廠。其中事件調(diào)用者即正在執(zhí)行該事件的類型,如下:
先讀取weight
字段并計(jì)算、存值,取絕對(duì)值并覆蓋默認(rèn)的可能性值。
檢測(cè)該事件的調(diào)用者,如果是活動(dòng)對(duì)象(1),讀取filters
字段并存值、解析,否則(即是方塊(0)或物品(2))讀取condition
字段并存值、評(píng)估。
檢測(cè)是否存在randomize
字段,如果存在,讀取randomize
字段并檢測(cè)是否存在sequence
字段,如果二者皆存在,提示內(nèi)容日志錯(cuò)誤,并忽略sequence
字段。如果randomize
字段不存在,檢測(cè)并讀取sequence
字段。randomize
字段或sequence
字段是一個(gè)數(shù)組,數(shù)組中每個(gè)對(duì)象稱為一個(gè)子事件,將讀取到的所有子事件稱為一個(gè)合集,遞歸加載合集中的每個(gè)子事件,而后將整個(gè)合集存入該父事件中,并將該父事件的定義事件類型更改為序列(1)或隨機(jī)(2)。如果二者皆不存在,該事件的定義事件類型更改為葉節(jié)點(diǎn)(0),并繼續(xù)執(zhí)行下述邏輯。
讀取trigger
字段并按照定義觸發(fā)器的常規(guī)解析方式解析該定義觸發(fā)器。
檢測(cè)該事件的調(diào)用者,如果是活動(dòng)對(duì)象(1),讀取add
字段(若有)和remove
字段(若有)并解析。二者格式皆為一個(gè)對(duì)象,目前內(nèi)只有component_groups
字段,用于添加或移除一個(gè)組件組。
如果事件響應(yīng)工廠存在(前提之一為已打開(kāi)“假日創(chuàng)作者功能”‘實(shí)驗(yàn)性玩法,目前有三種事件響應(yīng)工廠,分別是活動(dòng)對(duì)象、物品和方塊),對(duì)該葉節(jié)點(diǎn)進(jìn)行模式驗(yàn)證(schema validation)。若驗(yàn)證通過(guò)(即JSON結(jié)構(gòu)合乎一個(gè)事件響應(yīng)),執(zhí)行事件響應(yīng)邏輯。如果驗(yàn)證失敗將強(qiáng)制將該事件的定義事件類型更改為無(wú)(3)并報(bào)內(nèi)容日志錯(cuò)誤。
事件響應(yīng)
首先明確一點(diǎn),實(shí)體(即活動(dòng)對(duì)象)、物品和方塊是共用事件響應(yīng)的,一個(gè)事件響應(yīng)不屬于上述任何一種事物,只存該事物會(huì)調(diào)用哪種事件響應(yīng)的邏輯,比如,CommandResponse
(run_command
)事件響應(yīng)早期會(huì)被實(shí)體、物品和方塊調(diào)用,后期出現(xiàn)了專門為實(shí)體調(diào)用的ActorCommandResponse
,CommandResponse
依舊同時(shí)為物品和方塊調(diào)用,調(diào)用時(shí)他們使用的邏輯是一致的,而ShootEventResponse
事件響應(yīng)只會(huì)被物品調(diào)用。
同時(shí)還要明確一點(diǎn),任何事件響應(yīng)的使用都需要“假日創(chuàng)作者功能”‘實(shí)驗(yàn)性玩法。
事件響應(yīng)列表
ActorCommandResponse

以target
為起點(diǎn)執(zhí)行一條或多條命令。
SetPropertyResponse
設(shè)置實(shí)體的一個(gè)屬性,接受一般值或Molang表達(dá)式。
CommandResponse

以target
為起點(diǎn)執(zhí)行一條或多條命令。
DecrementStackEventResponse
物品堆疊減少1。
DamageResponse

對(duì)target
造成type
類型的amount
點(diǎn)帶有擊退的傷害或損壞。特別地,當(dāng)對(duì)物品造成損壞時(shí),type
字段不表示任何意義,可以為任意字符串。當(dāng)對(duì)實(shí)體造成傷害時(shí),如果type
為fire
,會(huì)額外地點(diǎn)燃實(shí)體。
DieEventResponse

致實(shí)體死亡或方塊掉落。
MobEffectResponse

給予一個(gè)狀態(tài)效果。
RemoveMobEffectResponse

移除一個(gè)或全部狀態(tài)效果。
ParticleEffectResponse

在一個(gè)位置帶有數(shù)據(jù)值播放一個(gè)舊版粒子。
PlaySoundResponse

SetBlockProperty
設(shè)置方塊的一個(gè)屬性,接受一般值或Molang表達(dá)式。
ShootEventResponse

發(fā)射一個(gè)彈射物,彈射物的發(fā)射角度如上所示,初始威力為對(duì)應(yīng)實(shí)體的minecraft:projectile
組件的power
字段的值乘以此處的launch_power
字段的值,不確定性為對(duì)應(yīng)實(shí)體的minecraft:projectile
組件的uncertainty_base
字段的值減去該實(shí)體所在存檔的難度乘以組件uncertainty_multiplier
字段的值,基速度為零向量,彈射物無(wú)特定攻擊目標(biāo),無(wú)傷害擁有者。
SwingEventResponse
使持有該物品的實(shí)體播放擺臂動(dòng)畫。
TeleportResponse

傳送一個(gè)實(shí)體。
TransformItemResponse
將物品轉(zhuǎn)化為另一個(gè)物品。
SetBlock
在當(dāng)前方塊處設(shè)置方塊類型。
SetBlockAtPos
在相對(duì)于當(dāng)前方塊的偏移位置處設(shè)置方塊類型。
SpawnLootEventResponse
在存檔中以0.0幸運(yùn)值無(wú)作用實(shí)體無(wú)玩家無(wú)傷害來(lái)源的模式從戰(zhàn)利品表中抽取物品并掉落在該方塊處。
事件響應(yīng)工廠


附錄:定義觸發(fā)器
定義觸發(fā)器(Definition Trigger)是一種可以用于實(shí)體、方塊和物品的JSON定義中的觸發(fā)器。
邏輯
定義觸發(fā)器分為適用于物品和方塊的普通定義觸發(fā)器和適用于實(shí)體的活動(dòng)對(duì)象定義觸發(fā)器。
模式
附錄:過(guò)濾器組
過(guò)濾器組(Filter Group)指實(shí)體中需要條件的位置傳入的過(guò)濾器集合,一個(gè)過(guò)濾器組中可以有一個(gè)或多個(gè)過(guò)濾器。
邏輯
每個(gè)過(guò)濾器組都可以有子過(guò)濾器組或一個(gè)過(guò)濾器組成。過(guò)濾器的合集類型默認(rèn)由執(zhí)行該過(guò)濾器的組件、事件響應(yīng)或觸發(fā)器提供,比如所有的定義事件中執(zhí)行的過(guò)濾器以及定義事件中的trigger
觸發(fā)器和事件響應(yīng)中執(zhí)行的過(guò)濾器的默認(rèn)合集類型都為“與”(AND,0)。
模式
注意事項(xiàng)
在源碼層面中,以下這種格式的結(jié)構(gòu)中,如果父級(jí)(示例中為top
)的合集類型為OR,會(huì)自動(dòng)在該父級(jí)下新建一個(gè)合計(jì)類型為AND的子過(guò)濾器組,并將該結(jié)構(gòu)視為該合集類型為AND的子組的結(jié)構(gòu)進(jìn)行解析。
簡(jiǎn)言之,父級(jí)如果是OR的情況下,如果父級(jí)被解析為一個(gè)對(duì)象,而且對(duì)該象中沒(méi)有test
字段(即不是葉節(jié)點(diǎn)),而且該對(duì)象中的字段數(shù)目不止1個(gè)(嚴(yán)格大于1),那么在該父級(jí)下會(huì)先新建一個(gè)AND合集類型的子組,將該對(duì)象視為該子組的內(nèi)容來(lái)解析。如果該父級(jí)解析為一個(gè)數(shù)組,則不受任何影響;如果該父級(jí)是AND或NOT,也不受此影響。上述格式等價(jià)轉(zhuǎn)換成下述格式后,將會(huì)正常按照OR的邏輯進(jìn)行解析:
該邏輯保證了所有非葉節(jié)點(diǎn)的表現(xiàn)為對(duì)象的節(jié)點(diǎn)的邏輯都是AND或NOT(一般可來(lái)說(shuō),如果是根節(jié)點(diǎn),可以肯定為AND,因?yàn)楦?jié)點(diǎn)的合集類型是由組件、事件響應(yīng)或觸發(fā)器來(lái)提供的,一般不會(huì)提供NOT的根節(jié)點(diǎn)邏輯)。表現(xiàn)為數(shù)組的邏輯則需要根據(jù)父級(jí)來(lái)確定。