附加包教程:14.方块(三)
本帖最后由 Cat_Anchor 于 2024-8-4 19:33 编辑注意:此页面所述功能已于1.21.20.23被移除,请使用脚本代替其功能。
然而,出于学习并理解旧版附加包的必要性,我保留了这个页面。
前言
上上上期,我们学习了所有我已知的方块组件。这一期,我们将继续学习方块相关知识。这次,我们要学习方块事件。事件存储在与组件同级的地方。下面是一个例子。
{
"format_version": "1.19.40",
"minecraft:block": {
"description": {不要在意这些细节},
"components": {不要在意这些细节},
"events": { //在意这个就对了,这就是事件存放的地方。
"loot": { //“loot”是这个事件的名字。
"run_command": { //一个事件方法(意思是运行命令)
"command": [ //要运行的命令组
"loot spawn ~~~ loot \"items/ancientcity_map\" minecraft:air" //一个命令,注意命令里的引号前面的转义符\。
]
},
"decrement_stack": {} //又一个事件方法(意思是将当前物品减少1个)
}
}
}
}这其实和物品事件是大致相同的。
https://klpbbs.com/static/image/hrline/line5.png
事件方法列表
add_mob_effect增加状态效果。"add_mob_effect": {
"amplifier": 0, //效果的倍率。效果的等级=倍率 + 1。
"duration": 1.0, //效果的时长。
"effect": "poison", //效果ID。
"target": "self" //要添加状态效果的目标。
}
damage对指定的实体或对在指定的条件下的实体造成指定类型和程度的伤害。"damage": {
"amount": 1, //造成伤害的数量。
"mob_amount": 1, //实体造成伤害的数量。
"target": {"test": "in_lava"}, //可以填写对象,也可以填写self或other。指定伤害的目标。
"type": "lava" //指定伤害的种类。
}
decrement_stack将物品减少1个。"decrement_stack": {
"ignore_game_mode": true //指定是否影响创造模式的玩家。默认为false,即不影响。
}
die摧毁指定的实体,或使指定方块直接消失而没有掉落物。"die": {
"target": { //可以填写self或other。也可以指定一个条件。
"test": "random_chance", //随机几率触发
"value": 1 //意思是在0和1之间随机选择,即50%的几率。
}
}
play_effect播放粒子效果。"play_effect": {
"delta": 0, //粒子数据
"effect": "evaporation", //要播放的粒子名称。不能写/particle命令中的ID,可能需要写/particlelegacy命令中的ID。
"target": {"test": "random_chance", "value": "3"} //下面所有target键值对都可以写self或other。这里是在0、1、2、3中随机选择,就是25%的几率。
}
play_sound播放声音。"play_sound": {
"sound": "jumpscare", //只能写一些原版声音ID
"target": {"test": "random_chance", "value": "2"} //同理,这是33%。
}
remove_mob_effect移除状态效果。"remove_mob_effect": {
"effect": "poison", //状态效果名称。写all代表所有状态效果。
"target": "self" //要移除状态效果的目标。
}
run_command运行命令。"run_command": {
"command": "give @p emerald", //要运行的命令。使用数组运行多个命令。不能有斜杠。
"target": "self" //目标
}
set_block放置方块。"set_block": {
"block_type": "redstone_block" //填写方块ID。也可以填写方块描述符。
}
set_block_at_pos在指定位置放置方块。"set_block_at_pos": {
"block_offset": , //偏移量,按照x,y,z的格式。这里的值相当于命令中的~2 ~1 ~-3。
"block_type": "bedrock" //方块ID或方块描述符。
}
set_block_state设置方块状态。
"set_block_state": {
"example_boolean_state": true, //键名为方块状态名称,值为方块状态值,可以用Molang表达式。
"example_string_state": "'red'" //可以一次设置多个状态,设置字符串时需要用'括起来。
}
spawn_loot根据战利品表生成掉落物。"spawn_loot": {
"table": "loot_tables/blocks/custom_block.json" //指向战利品表的路径。
}
swing使实体摇晃。"swing": {} //播放摇晃的动画效果。
teleport在指定范围内传送实体。"teleport": {
"avoid_water": true, //如果是true,传送时避开水。如果是false,传送时不会避开水。
"destination": , //以这个点为中心进行传送。
"land_on_block": true, //如果是true,传送时避开空中。如果是false,传送时就有可能传送到空气中。
"max_range": , //指定了可能传送的距离。与destination一起使用。
"target": { "test": "has_damage", "subject": "self", "operator": "equals", "value": "suffocating" } //根据情况填写other或self。也可以填写对象。
}
transform_item将物品转化为另一个物品。"transform_item": {
"transform": "iron_sword" //转化后的物品的ID。
}这个事件方法可能由于未知原因失败。
trigger触发另一个事件。"trigger": {
"event": "test_event", //事件名称
"target": "self"
}也可以直接填写字符串。
以上就是所有可用的方块事件方法了。还有两个特殊结构,这两个特殊结构可以算作特殊的事件方法,我在下面列出。
下面这个用于有序执行事件方法。"sequence": [
{
"condition": "表达式a", //Molang表达式。如果输出true,那么就会执行事件方法a。输出false则不会。
"target": "holder", //目标。
"事件方法a": ...
},
{
"condition": "表达式b", //又一个Molang表达式。如果输出true,那么就会执行事件方法b。输出false则不会。
"target": "holder", //目标。
"事件方法b": ...
}
] //这一大堆东西的效果是:游戏将先评估表达式a,如果输出true,那么执行事件方法a,执行完之后进行下一个。如果输出false,那么进行下一个。然后评估表达式b,如果输出true,那么执行事件方法b,执行完之后进行下一个。如果输出false,那么进行下一个。以此类推,直到执行完毕。
下面这个用于随机执行事件方法。"randomize":[
{
"weight": 1, //执行这个事件的权重。
"事件方法c": ...
},
{
"weight": 3, //执行这个事件的权重。
"事件方法d": ...
}
] //这一大堆东西的效果是:游戏有1/(1+3)的概率(说人话就是四分之一)执行事件方法c,有3/(1+3)的概率(说人话就是四分之三)执行事件方法d。某个对象的概率的计算公式是这个对象的weight值除以所有对象的weight值之和。
以上的两个事件可以互相套用,没什么限制,随便用。"sequence":[{
"randomize":[
{
"weight": 2,
"事件方法a": ...
},
{
"weight": 3,
"事件方法b": ...
}
]
}] //这一类用法没什么不行的。
"sequence":[{
"sequence":[{
"sequence":[{
"sequence":[{
"sequence":[{
"事件方法": ...
}]
}]
}]
}]
}] //这个也没什么不行的,你开心就好。这两个事件方法其实和我在物品那篇教程里的一样。
https://klpbbs.com/static/image/hrline/line1.png
总结
这一期,我把所有方块事件方法罗列了一遍。下期我们学习方块状态和对应状态的赋值。
第十三期 第十四期 第十五期 感谢分享
页: [1]