附加包教程:34.方块(六)
本帖最后由 Cat_Anchor 于 2023-6-17 12:46 编辑黏性熔岩https://pic.imgdb.cn/item/6426e491a682492fcc3c5a75.png
稀有度常见
创造分类命令
材料流体
合适挖掘工具桶
硬度∞
爆炸抗性500
亮度15
窒息生物否
红石导体否
光照透明0.2
可被火破坏否
可被熔岩生成火否
可再生是
最大堆叠64
命名空间IDviscous_lava
前言
今天我们继续放出方块的例子。
https://klpbbs.com/static/image/hrline/line5.png
目标
这次我想制作一种液体,拥有真实的扩散机制,还可以用桶装起来。
https://klpbbs.com/static/image/hrline/line7.png
分析与解决
没错,今天要做一个液体方块。既然没有说明到底是什么液体,那我就先做着,做完了再说吧。液体这个东西虽然比坩埚难些,但还是可以做出来的。首先,既然是液体,那么必须定义一个方块属性,来决定液体方块的高度。这个例子中,7代表液体源,8代表竖直向下的液体方块,剩下的代表水平扩散的液体方块。
{
"format_version": "1.18.0",
"minecraft:block": {
"description": {
"identifier": "supplementary:viscous_lava",
"properties": {
"supplementary:viscous_lava_liquid_height": [ //一个属性
1,
2,
3,
4,
5,
6,
7,
8
]
}
}, ...
}
}
然后定义一些基本的方块组件,例如爆炸抗性、光照等。由于我们定义的属性中,7才是液体源,所以要在玩家放置这个液体方块后把它自身的属性设定为7,不然就无法放置液体源了。
... "components": {
"minecraft:on_player_placing": {
"event": "on_placed"
}, //玩家放置此方块后触发on_placed事件。
"minecraft:aim_collision": false, //无法被选中
"minecraft:block_collision": false, //没有碰撞体积
"minecraft:geometry": "geometry.liquid_height8", //方块模型
"minecraft:creative_category": {
"category": "construction"
}, //创造模式物品栏分类(可以不加这个组件)
"minecraft:material_instances": {
"*": {
"texture": "viscous_lava",
"render_method": "blend"
}
}, //定义这个方块的纹理。blend决定是半透明纹理,而且不能在它上面刷怪。
"minecraft:destroy_time": 10000000, //无法被挖掘破坏。其实只是挖掘时间特别长而已,在1.19格式版本下可以用"minecraft:destructible_by_mining": false来定义这个方块不可被挖掘破坏。
"minecraft:map_color": "#4C4C4C", //地图颜色
"minecraft:block_light_filter": 0, //方块吸光量
"minecraft:block_light_emission": 1, //方块发光量,这里是15级光照亮度
"minecraft:explosion_resistance": 500 //爆炸抗性是500
},
"events": {
"on_placed": {
"set_block_property": {
"supplementary:viscous_lava_liquid_height": 7 //将液体高度设为7,即液体源方块
}
}, ...
现在来定义方块排列。
... {
"condition": "q.block_property('supplementary:viscous_lava_liquid_height')==7", //液体源方块
"components": {
"minecraft:geometry": "geometry.liquid_height7", //液体源方块的模型
"tag:supplementary:viscous_lava_liquid_height7": {}, //这里加一个tag,为了方便以后的判断
"minecraft:ticking": {
"looping": true,
"range": [
0.2,
0.2
], //速度,这里是每0.2秒散播一次
"on_tick": {
"event": "spread_to_6", //这个事件的作用是在这个方块的周围放置高度为6的液体方块。同理,高度为6的液体方块会放置高度为5的液体方块,直到结束。
"target": "self"
}
}, //液体散播的组件
"minecraft:aim_collision": true //指定了液体源方块可以被选中,这是为了方便以后用桶装液体。
}
}, ...
现在我们来看看最难的部分——事件。由于这一部分重复度过高,我不会把所有事件都列出,就拿液体源的事件代码做一个例子吧。
... "spread_to_6": {
"sequence": [
{
"run_command": {
"command": [
"execute if block ~1~~ air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~1~~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":6]",
"execute if block ~-1~~ air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~-1~~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":6]",
"execute if block ~~~1 air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~~~1 supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":6]",
"execute if block ~~~-1 air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~~~-1 supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":6]",
"execute if block ~~-1~ air run setblock ~~-1~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":8]",
"execute if block ~~-1~ supplementary:viscous_lava run setblock ~~-1~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":8]",
"damage @e 4 lava"
] //要运行的一个命令组。前4条负责水平扩散,第5到6条负责竖直扩散,第7条负责造成熔岩伤害。第7条可有可无,甚至可以替换成其他效果。
}
}
]
}, ...
基本上每个液体方块都是以上的逻辑,所以自定义液体其实不难。这些代码还有些缺陷,但我实在想不出既能解决缺陷又不会让游戏卡顿的代码了。
当然了,还需要设计一个能让液体在没有液体源后就消失的功能。在 spread_to_5 事件后,还额外触发了一个 5air 事件,这个事件负责让液体消失,如下。
... "5air": {
"sequence": [
{
"condition": "!(q.block_neighbor_has_any_tag(1,0,0,'supplementary:viscous_lava_liquid_height7')||q.block_neighbor_has_any_tag(-1,0,0,'supplementary:viscous_lava_liquid_height7')||q.block_neighbor_has_any_tag(0,0,1,'supplementary:viscous_lava_liquid_height7')||q.block_neighbor_has_any_tag(0,0,-1,'supplementary:viscous_lava_liquid_height7')||q.block_neighbor_has_any_tag(1,0,0,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(-1,0,0,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(0,0,1,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(0,0,-1,'supplementary:viscous_lava_liquid_height8'))", //检测周围有没有更高的液体,没有就运行下面的事件方法,有就什么也不做。
"run_command": {
"command": [
"setblock ~~~ air" //在自身位置放置空气,也就是让自己消失。
]
}
}
]
}, ...
然后都有规律了,穷举就可以了。最后,随便定义一下这个液体到底是什么。我就叫它黏性熔岩好了。
一番操作猛如虎,我终于做好了一个液体方块。以下代码就是我的viscous_lava.json里写的内容,供大家参考。
{
"format_version": "1.18.0",
"minecraft:block": {
"description": {
"identifier": "supplementary:viscous_lava",
"properties": {
"supplementary:viscous_lava_liquid_height": [
1,
2,
3,
4,
5,
6,
7,
8
]
}
},
"components": {
"minecraft:on_player_placing": {
"event": "on_placed"
},
"minecraft:aim_collision": false,
"minecraft:block_collision": false,
"minecraft:geometry": "geometry.liquid_height8",
"minecraft:creative_category": {
"category": "construction"
},
"minecraft:material_instances": {
"*": {
"texture": "viscous_lava",
"render_method": "blend"
}
},
"minecraft:destroy_time": 10000000,
"minecraft:map_color": "#4C4C4C",
"minecraft:block_light_filter": 0,
"minecraft:block_light_emission": 1,
"minecraft:explosion_resistance": 500
},
"events": {
"on_placed": {
"set_block_property": {
"supplementary:viscous_lava_liquid_height": 7
}
},
"downstream": {
"sequence": [
{
"run_command": {
"command": [
"execute if block ~~-1~ air run setblock ~~-1~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":8]",
"execute if block ~~-1~ supplementary:viscous_lava run setblock ~~-1~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":8]",
"damage @e 4 lava"
]
}
},
{
"trigger": {
"event": "downair"
}
}
]
},
"downair": {
"sequence": [
{
"condition": "!(q.block_neighbor_has_any_tag(1,0,0,'supplementary:viscous_lava_liquid_height2')||q.block_neighbor_has_any_tag(-1,0,0,'supplementary:viscous_lava_liquid_height2')||q.block_neighbor_has_any_tag(0,0,1,'supplementary:viscous_lava_liquid_height2')||q.block_neighbor_has_any_tag(0,0,-1,'supplementary:viscous_lava_liquid_height2')||q.block_neighbor_has_any_tag(1,0,0,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(-1,0,0,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(0,0,1,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(0,0,-1,'supplementary:viscous_lava_liquid_height8'))",
"run_command": {
"command": [
"setblock ~~~ air"
]
}
}
]
},
"spread_to_6": {
"sequence": [
{
"run_command": {
"command": [
"execute if block ~1~~ air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~1~~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":6]",
"execute if block ~-1~~ air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~-1~~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":6]",
"execute if block ~~~1 air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~~~1 supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":6]",
"execute if block ~~~-1 air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~~~-1 supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":6]",
"execute if block ~~-1~ air run setblock ~~-1~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":8]",
"execute if block ~~-1~ supplementary:viscous_lava run setblock ~~-1~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":8]",
"damage @e 4 lava"
]
}
}
]
},
"spread_to": {
"sequence": [
{
"run_command": {
"command": [
"execute if block ~1~~ air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~1~~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":6]",
"execute if block ~-1~~ air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~-1~~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":6]",
"execute if block ~~~1 air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~~~1 supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":6]",
"execute if block ~~~-1 air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~~~-1 supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":6]",
"execute if block ~~-1~ air run setblock ~~-1~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":8]",
"execute if block ~~-1~ supplementary:viscous_lava run setblock ~~-1~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":8]",
"execute unless block ~~1~ supplementary:viscous_lava run setblock ~~~ air",
"damage @e 4 lava"
]
}
}
]
},
"spread_to_5": {
"sequence": [
{
"run_command": {
"command": [
"execute if block ~1~~ air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~1~~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":5]",
"execute if block ~-1~~ air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~-1~~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":5]",
"execute if block ~~~1 air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~~~1 supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":5]",
"execute if block ~~~-1 air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~~~-1 supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":5]",
"execute if block ~~-1~ air run setblock ~~-1~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":8]",
"execute if block ~~-1~ supplementary:viscous_lava run setblock ~~-1~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":8]",
"damage @e 4 lava"
]
}
},
{
"trigger": {
"event": "5air"
}
}
]
},
"5air": {
"sequence": [
{
"condition": "!(q.block_neighbor_has_any_tag(1,0,0,'supplementary:viscous_lava_liquid_height7')||q.block_neighbor_has_any_tag(-1,0,0,'supplementary:viscous_lava_liquid_height7')||q.block_neighbor_has_any_tag(0,0,1,'supplementary:viscous_lava_liquid_height7')||q.block_neighbor_has_any_tag(0,0,-1,'supplementary:viscous_lava_liquid_height7')||q.block_neighbor_has_any_tag(1,0,0,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(-1,0,0,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(0,0,1,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(0,0,-1,'supplementary:viscous_lava_liquid_height8'))",
"run_command": {
"command": [
"setblock ~~~ air"
]
}
}
]
},
"spread_to_4": {
"sequence": [
{
"run_command": {
"command": [
"execute if block ~1~~ air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~1~~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":4]",
"execute if block ~-1~~ air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~-1~~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":4]",
"execute if block ~~~1 air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~~~1 supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":4]",
"execute if block ~~~-1 air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~~~-1 supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":4]",
"execute if block ~~-1~ air run setblock ~~-1~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":8]",
"execute if block ~~-1~ supplementary:viscous_lava run setblock ~~-1~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":8]",
"damage @e 4 lava"
]
}
},
{
"trigger": {
"event": "4air"
}
}
]
},
"4air": {
"sequence": [
{
"condition": "!(q.block_neighbor_has_any_tag(1,0,0,'supplementary:viscous_lava_liquid_height6')||q.block_neighbor_has_any_tag(-1,0,0,'supplementary:viscous_lava_liquid_height6')||q.block_neighbor_has_any_tag(0,0,1,'supplementary:viscous_lava_liquid_height6')||q.block_neighbor_has_any_tag(0,0,-1,'supplementary:viscous_lava_liquid_height6')||q.block_neighbor_has_any_tag(1,0,0,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(-1,0,0,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(0,0,1,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(0,0,-1,'supplementary:viscous_lava_liquid_height8'))",
"run_command": {
"command": [
"setblock ~~~ air"
]
}
}
]
},
"spread_to_3": {
"sequence": [
{
"run_command": {
"command": [
"execute if block ~1~~ air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~1~~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":3]",
"execute if block ~-1~~ air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~-1~~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":3]",
"execute if block ~~~1 air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~~~1 supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":3]",
"execute if block ~~~-1 air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~~~-1 supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":3]",
"execute if block ~~-1~ air run setblock ~~-1~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":8]",
"execute if block ~~-1~ supplementary:viscous_lava run setblock ~~-1~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":8]",
"damage @e 4 lava"
]
}
},
{
"trigger": {
"event": "3air"
}
}
]
},
"3air": {
"sequence": [
{
"condition": "!(q.block_neighbor_has_any_tag(1,0,0,'supplementary:viscous_lava_liquid_height5')||q.block_neighbor_has_any_tag(-1,0,0,'supplementary:viscous_lava_liquid_height5')||q.block_neighbor_has_any_tag(0,0,1,'supplementary:viscous_lava_liquid_height5')||q.block_neighbor_has_any_tag(0,0,-1,'supplementary:viscous_lava_liquid_height5')||q.block_neighbor_has_any_tag(1,0,0,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(-1,0,0,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(0,0,1,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(0,0,-1,'supplementary:viscous_lava_liquid_height8'))",
"run_command": {
"command": [
"setblock ~~~ air"
]
}
}
]
},
"spread_to_2": {
"sequence": [
{
"run_command": {
"command": [
"execute if block ~1~~ air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~1~~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":2]",
"execute if block ~-1~~ air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~-1~~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":2]",
"execute if block ~~~1 air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~~~1 supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":2]",
"execute if block ~~~-1 air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~~~-1 supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":2]",
"execute if block ~~-1~ air run setblock ~~-1~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":8]",
"execute if block ~~-1~ supplementary:viscous_lava run setblock ~~-1~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":8]",
"damage @e 4 lava"
]
}
},
{
"trigger": {
"event": "2air"
}
}
]
},
"2air": {
"sequence": [
{
"condition": "!(q.block_neighbor_has_any_tag(1,0,0,'supplementary:viscous_lava_liquid_height4')||q.block_neighbor_has_any_tag(-1,0,0,'supplementary:viscous_lava_liquid_height4')||q.block_neighbor_has_any_tag(0,0,1,'supplementary:viscous_lava_liquid_height4')||q.block_neighbor_has_any_tag(0,0,-1,'supplementary:viscous_lava_liquid_height4')||q.block_neighbor_has_any_tag(1,0,0,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(-1,0,0,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(0,0,1,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(0,0,-1,'supplementary:viscous_lava_liquid_height8'))",
"run_command": {
"command": [
"setblock ~~~ air"
]
}
}
]
},
"spread_to_1": {
"sequence": [
{
"run_command": {
"command": [
"execute if block ~1~~ air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~1~~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":1]",
"execute if block ~-1~~ air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~-1~~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":1]",
"execute if block ~~~1 air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~~~1 supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":1]",
"execute if block ~~~-1 air unless block ~~-1~ air unless block ~~-1~ supplementary:viscous_lava run setblock ~~~-1 supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":1]",
"execute if block ~~-1~ air run setblock ~~-1~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":8]",
"execute if block ~~-1~ supplementary:viscous_lava run setblock ~~-1~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":8]",
"damage @e 4 lava"
]
}
},
{
"trigger": {
"event": "1air"
}
}
]
},
"1air": {
"sequence": [
{
"condition": "!(q.block_neighbor_has_any_tag(1,0,0,'supplementary:viscous_lava_liquid_height3')||q.block_neighbor_has_any_tag(-1,0,0,'supplementary:viscous_lava_liquid_height3')||q.block_neighbor_has_any_tag(0,0,1,'supplementary:viscous_lava_liquid_height3')||q.block_neighbor_has_any_tag(0,0,-1,'supplementary:viscous_lava_liquid_height3')||q.block_neighbor_has_any_tag(1,0,0,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(-1,0,0,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(0,0,1,'supplementary:viscous_lava_liquid_height8')||q.block_neighbor_has_any_tag(0,0,-1,'supplementary:viscous_lava_liquid_height8'))",
"run_command": {
"command": [
"setblock ~~~ air"
]
}
}
]
}
},
"permutations": [
{
"condition": "q.block_property('supplementary:viscous_lava_liquid_height')==1",
"components": {
"minecraft:geometry": "geometry.liquid_height1",
"tag:supplementary:viscous_lava_liquid_height1": {},
"minecraft:ticking": {
"looping": true,
"range": [
0.2,
0.2
],
"on_tick": {
"event": "downstream",
"target": "self"
}
}
}
},
{
"condition": "q.block_property('supplementary:viscous_lava_liquid_height')==2",
"components": {
"minecraft:geometry": "geometry.liquid_height2",
"tag:supplementary:viscous_lava_liquid_height2": {},
"minecraft:ticking": {
"looping": true,
"range": [
0.2,
0.2
],
"on_tick": {
"event": "spread_to_1",
"target": "self"
}
}
}
},
{
"condition": "q.block_property('supplementary:viscous_lava_liquid_height')==3",
"components": {
"minecraft:geometry": "geometry.liquid_height3",
"tag:supplementary:viscous_lava_liquid_height3": {},
"minecraft:ticking": {
"looping": true,
"range": [
0.2,
0.2
],
"on_tick": {
"event": "spread_to_2",
"target": "self"
}
}
}
},
{
"condition": "q.block_property('supplementary:viscous_lava_liquid_height')==4",
"components": {
"minecraft:geometry": "geometry.liquid_height4",
"tag:supplementary:viscous_lava_liquid_height4": {},
"minecraft:ticking": {
"looping": true,
"range": [
0.2,
0.2
],
"on_tick": {
"event": "spread_to_3",
"target": "self"
}
}
}
},
{
"condition": "q.block_property('supplementary:viscous_lava_liquid_height')==5",
"components": {
"minecraft:geometry": "geometry.liquid_height5",
"tag:supplementary:viscous_lava_liquid_height5": {},
"minecraft:ticking": {
"looping": true,
"range": [
0.2,
0.2
],
"on_tick": {
"event": "spread_to_4",
"target": "self"
}
}
}
},
{
"condition": "q.block_property('supplementary:viscous_lava_liquid_height')==6",
"components": {
"minecraft:geometry": "geometry.liquid_height6",
"tag:supplementary:viscous_lava_liquid_height6": {},
"minecraft:ticking": {
"looping": true,
"range": [
0.2,
0.2
],
"on_tick": {
"event": "spread_to_5",
"target": "self"
}
}
}
},
{
"condition": "q.block_property('supplementary:viscous_lava_liquid_height')==7",
"components": {
"minecraft:geometry": "geometry.liquid_height7",
"tag:supplementary:viscous_lava_liquid_height7": {},
"minecraft:ticking": {
"looping": true,
"range": [
0.2,
0.2
],
"on_tick": {
"event": "spread_to_6",
"target": "self"
}
},
"minecraft:aim_collision": true
}
},
{
"condition": "q.block_property('supplementary:viscous_lava_liquid_height')==8",
"components": {
"tag:supplementary:viscous_lava_liquid_height8": {},
"minecraft:geometry": "geometry.liquid_height8",
"minecraft:ticking": {
"looping": true,
"range": [
0.2,
0.2
],
"on_tick": {
"event": "spread_to",
"target": "self"
}
}
}
}
]
}
}
以下是模型文件。
{"format_version":"1.14.0","minecraft:geometry":[{"description":{"identifier":"geometry.liquid_height1","texture_width":16,"texture_height":16,"visible_bounds_width":2,"visible_bounds_height":2},"bones":[{"name":"root","pivot":,"cubes":[{"origin":[-8.0,0.0,-8.0],"size":,"uv":{"up":{"uv":,"uv_size":},"down":{"uv":,"uv_size":[-16.0,-16.0]},"north":{"uv":,"uv_size":},"south":{"uv":,"uv_size":},"east":{"uv":,"uv_size":},"west":{"uv":,"uv_size":}}}]}]},{"description":{"identifier":"geometry.liquid_height2","texture_width":16,"texture_height":16,"visible_bounds_width":2,"visible_bounds_height":2},"bones":[{"name":"root","pivot":,"cubes":[{"origin":[-8.0,0.0,-8.0],"size":,"uv":{"up":{"uv":,"uv_size":},"down":{"uv":,"uv_size":[-16.0,-16.0]},"north":{"uv":,"uv_size":},"south":{"uv":,"uv_size":},"east":{"uv":,"uv_size":},"west":{"uv":,"uv_size":}}}]}]},{"description":{"identifier":"geometry.liquid_height3","texture_width":16,"texture_height":16,"visible_bounds_width":2,"visible_bounds_height":2},"bones":[{"name":"root","pivot":,"cubes":[{"origin":[-8.0,0.0,-8.0],"size":,"uv":{"up":{"uv":,"uv_size":},"down":{"uv":,"uv_size":[-16.0,-16.0]},"north":{"uv":,"uv_size":},"south":{"uv":,"uv_size":},"east":{"uv":,"uv_size":},"west":{"uv":,"uv_size":}}}]}]},{"description":{"identifier":"geometry.liquid_height4","texture_width":16,"texture_height":16,"visible_bounds_width":2,"visible_bounds_height":2},"bones":[{"name":"root","pivot":,"cubes":[{"origin":[-8.0,0.0,-8.0],"size":,"uv":{"up":{"uv":,"uv_size":},"down":{"uv":,"uv_size":[-16.0,-16.0]},"north":{"uv":,"uv_size":},"south":{"uv":,"uv_size":},"east":{"uv":,"uv_size":},"west":{"uv":,"uv_size":}}}]}]},{"description":{"identifier":"geometry.liquid_height5","texture_width":16,"texture_height":16,"visible_bounds_width":2,"visible_bounds_height":2},"bones":[{"name":"root","pivot":,"cubes":[{"origin":[-8.0,0.0,-8.0],"size":,"uv":{"up":{"uv":,"uv_size":},"down":{"uv":,"uv_size":[-16.0,-16.0]},"north":{"uv":,"uv_size":},"south":{"uv":,"uv_size":},"east":{"uv":,"uv_size":},"west":{"uv":,"uv_size":}}}]}]},{"description":{"identifier":"geometry.liquid_height6","texture_width":16,"texture_height":16,"visible_bounds_width":2,"visible_bounds_height":2},"bones":[{"name":"root","pivot":,"cubes":[{"origin":[-8.0,0.0,-8.0],"size":,"uv":{"up":{"uv":,"uv_size":},"down":{"uv":,"uv_size":[-16.0,-16.0]},"north":{"uv":,"uv_size":},"south":{"uv":,"uv_size":},"east":{"uv":,"uv_size":},"west":{"uv":,"uv_size":}}}]}]},{"description":{"identifier":"geometry.liquid_height7","texture_width":16,"texture_height":16,"visible_bounds_width":2,"visible_bounds_height":2},"bones":[{"name":"root","pivot":,"cubes":[{"origin":[-8.0,0.0,-8.0],"size":,"uv":{"up":{"uv":,"uv_size":},"down":{"uv":,"uv_size":[-16.0,-16.0]},"north":{"uv":,"uv_size":},"south":{"uv":,"uv_size":},"east":{"uv":,"uv_size":},"west":{"uv":,"uv_size":}}}]}]},{"description":{"identifier":"geometry.liquid_height8","texture_width":16,"texture_height":16,"visible_bounds_width":2,"visible_bounds_height":2},"bones":[{"name":"root","pivot":,"cubes":[{"origin":[-8.0,0.0,-8.0],"size":,"uv":{"up":{"uv":,"uv_size":},"down":{"uv":,"uv_size":[-16.0,-16.0]},"north":{"uv":,"uv_size":},"south":{"uv":,"uv_size":},"east":{"uv":,"uv_size":},"west":{"uv":,"uv_size":}}}]}]}]}
等等!虽然我们已经定义了液体的模型和液体的方块文档,但液体不都应该有动态纹理吗?于是,我又在flipbook_textures.json文件里输入了以下代码。
[
{
"flipbook_texture": "textures/blocks/viscous_lava",
"atlas_tile": "viscous_lava",
"ticks_per_frame": 16
}
]
然后简单地通过terrain_texture.json给方块纹理。
{
"texture_data": {
"viscous_lava": {
"textures": "textures/blocks/viscous_lava"
}
}
}
现在来定义一个桶吧!因为不能直接修改原版桶,必须自定义一个桶。我叫它加固的桶。代码稍微有点长,我折叠一下。
{
"format_version": "1.17.0",
"minecraft:item": {
"description": {
"identifier": "supplementary:consolidated_bucket",
"category": "items" //定义物品分类,必须有这一行代码
},
"components": {
"minecraft:icon": {
"texture": "consolidated_bucket"
}, //定义物品纹理
"minecraft:creative_category": {
"parent": "itemGroup.name.diamond"
}, //定义在创造模式物品栏里的位置。
"minecraft:allow_off_hand": true, //允许拿在副手上
"minecraft:on_use_on": {
"on_use_on": {
"event": "test"
}
} //点击方块时触发事件 test 。
},
"events": {
"test": {
"sequence": [
{
"condition": "q.block_neighbor_has_any_tag(0,0,0,'supplementary:viscous_lava_liquid_height7')", //如果被点击的方块是黏性熔岩源,那么...
"run_command": {
"command": [
"gamerule sendcommandfeedback false", //关闭命令提示
"setblock ~~~ air", //清除黏性熔岩源
"clear @p supplementary:consolidated_bucket 0 1", //清除加固的桶
"give @p supplementary:viscous_lava_bucket", //给予装满黏性熔岩的桶
"playsound bucket.fill_lava @a ~~~" //播放装熔岩的音效
]
}
}
]
}
}
}
}
然后还需要定义一个物品,黏性熔岩桶。由于用minecraft:on_use_on事件时会以这个方块为基准点,所以只能用minecraft:entity_placer来放置一个技术性实体,再让这个实体放置黏性熔岩源方块。
{
"format_version": "1.17.0",
"minecraft:item": {
"description": {
"identifier": "supplementary:viscous_lava_bucket",
"category": "items" //定义物品分类,必须有这一行代码
},
"components": {
"minecraft:icon": {
"texture": "viscous_lava_bucket" //定义纹理
},
"minecraft:creative_category": {
"parent": "itemGroup.name.diamond"
}, //定义在创造模式物品栏里的位置。
"minecraft:allow_off_hand": true, //允许左手
"minecraft:entity_placer": {
"entity": "supplementary:viscous_lava_placer" //放置技术性实体
}
}
}
}
所以,还需要定义一个新实体。代码略长,我折叠一下。
{
"format_version": "1.10.0",
"minecraft:entity": {
"description": {
"identifier": "supplementary:viscous_lava_placer", //实体ID
"is_spawnable": false, //不可自然生成
"is_summonable": true, //可以被命令召唤
"is_experimental": false //不是实验性实体
},
"components": {
"minecraft:timer": {
"time": [
0.02,
0.02
],
"looping": false,
"time_down_event": {
"event": "place"
}
}, //放下的0.02秒后触发事件place
"minecraft:collision_box": {
"width": 0.98,
"height": 0.98
}, //碰撞箱是0.98*0.98*0.98个方块大小
"minecraft:damage_sensor": [
{
"cause": "all",
"deals_damage": false
}
], //让实体不受任何类型的伤害
"minecraft:physics": {} //有物理模拟
},
"events": {
"place": {
"run_command": {
"command": [
"gamerule sendcommandfeedback false", //关掉命令提示
"fill ~ ~ ~ ~ ~ ~ supplementary:viscous_lava [\"supplementary:viscous_lava_liquid_height\":7] keep", //放置一个黏性熔岩源方块
"give @p supplementary:consolidated_bucket", //给予一个空桶(注:在放置实体时黏性熔岩桶已经被用掉了,所以不用再清除了。)
"playsound bucket.empty_lava @a ~~~", //播放倒出熔岩的声音
"tp @s 0 -1000 0", //传送到虚空,避免出现声音和粒子
"kill @s" //使自身消失
]
}
}
}
}
}
好了,这就差不多了。上面那个实体是技术性实体,不需要显示出来,因此不用额外定义什么了。下面是我制作的一个配方。
{
"format_version": "1.12",
"minecraft:recipe_shaped": {
"description": {
"identifier": "supplementary:viscous_lava_bucket"
},
"tags": [
"crafting_table"
],
"pattern": [
"BAB",
"CBC"
],
"key": {
"A": {
"item": "minecraft:lava_bucket"
},
"B": {
"item": "minecraft:magma_cream"
},
"C": {
"item": "minecraft:obsidian"
}
},
"result": {
"item": "supplementary:viscous_lava_bucket"
}
}
}
https://klpbbs.com/static/image/hrline/line3.png
总结
这一期,我们制作了一个液体方块。由于技术性限制,这个液体无法让玩家在内部游泳,这是不可避免的。也出现了一些用脚本赋予状态效果从而游泳的例子,但我不会写脚本,所以没有搬上来。也有一些其他方法,然而它们会导致游戏卡顿,世界区域几乎被冻结,游戏刻极为缓慢等现象。
不管怎样,虽然目前做到原版那种液体是不可能的,但至少我们可以做一个“半液体”。制作这种近似液体的方法有很多,这只是其中一种。
最后,我放出我为这个液体做的纹理,以及所有的示例文档,可以参考一下。
第三十三期 第三十四期 第三十五期 [贴吧_呼~][贴吧_呼~] 什么时候更新gameTest 什么时候可以更新Js 6666666666 感谢分享
页: [1]