本帖最后由 Cat_Anchor 于 2023-6-17 12:46 编辑
黏性熔岩 |  | | 稀有度 | 常见 | | 创造分类 | 命令 | | 材料 | 流体 | | 合适挖掘工具 | 桶 | | 硬度 | ∞ | | 爆炸抗性 | 500 | | 亮度 | 15 | | 窒息生物 | 否 | | 红石导体 | 否 | | 光照透明 | 0.2 | | 可被火破坏 | 否 | | 可被熔岩生成火 | 否 | | 可再生 | 是 | | 最大堆叠 | 64 | | 命名空间ID | viscous_lava |
前言
|
今天我们继续放出方块的例子。
|  | 目标
|
这次我想制作一种液体,拥有真实的扩散机制,还可以用桶装起来。
|  | 分析与解决
|
没错,今天要做一个液体方块。既然没有说明到底是什么液体,那我就先做着,做完了再说吧。液体这个东西虽然比坩埚难些,但还是可以做出来的。首先,既然是液体,那么必须定义一个方块属性,来决定液体方块的高度。这个例子中,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[r=0.5] 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[r=0.5] 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[r=0.5] 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[r=0.5] 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[r=0.5] 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[r=0.5] 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[r=0.5] 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[r=0.5] 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[r=0.5] 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":[0.0,0.0,0.0],"cubes":[{"origin":[-8.0,0.0,-8.0],"size":[16.0,2.0,16.0],"uv":{"up":{"uv":[0.0,0.0],"uv_size":[16.0,16.0]},"down":{"uv":[16.0,16.0],"uv_size":[-16.0,-16.0]},"north":{"uv":[0.0,0.0],"uv_size":[16.0,2.0]},"south":{"uv":[0.0,0.0],"uv_size":[16.0,2.0]},"east":{"uv":[0.0,0.0],"uv_size":[16.0,2.0]},"west":{"uv":[0.0,0.0],"uv_size":[16.0,2.0]}}}]}]},{"description":{"identifier":"geometry.liquid_height2","texture_width":16,"texture_height":16,"visible_bounds_width":2,"visible_bounds_height":2},"bones":[{"name":"root","pivot":[0.0,0.0,0.0],"cubes":[{"origin":[-8.0,0.0,-8.0],"size":[16.0,4.0,16.0],"uv":{"up":{"uv":[0.0,0.0],"uv_size":[16.0,16.0]},"down":{"uv":[16.0,16.0],"uv_size":[-16.0,-16.0]},"north":{"uv":[0.0,0.0],"uv_size":[16.0,4.0]},"south":{"uv":[0.0,0.0],"uv_size":[16.0,4.0]},"east":{"uv":[0.0,0.0],"uv_size":[16.0,4.0]},"west":{"uv":[0.0,0.0],"uv_size":[16.0,4.0]}}}]}]},{"description":{"identifier":"geometry.liquid_height3","texture_width":16,"texture_height":16,"visible_bounds_width":2,"visible_bounds_height":2},"bones":[{"name":"root","pivot":[0.0,0.0,0.0],"cubes":[{"origin":[-8.0,0.0,-8.0],"size":[16.0,6.0,16.0],"uv":{"up":{"uv":[0.0,0.0],"uv_size":[16.0,16.0]},"down":{"uv":[16.0,16.0],"uv_size":[-16.0,-16.0]},"north":{"uv":[0.0,0.0],"uv_size":[16.0,6.0]},"south":{"uv":[0.0,0.0],"uv_size":[16.0,6.0]},"east":{"uv":[0.0,0.0],"uv_size":[16.0,6.0]},"west":{"uv":[0.0,0.0],"uv_size":[16.0,6.0]}}}]}]},{"description":{"identifier":"geometry.liquid_height4","texture_width":16,"texture_height":16,"visible_bounds_width":2,"visible_bounds_height":2},"bones":[{"name":"root","pivot":[0.0,0.0,0.0],"cubes":[{"origin":[-8.0,0.0,-8.0],"size":[16.0,8.0,16.0],"uv":{"up":{"uv":[0.0,0.0],"uv_size":[16.0,16.0]},"down":{"uv":[16.0,16.0],"uv_size":[-16.0,-16.0]},"north":{"uv":[0.0,0.0],"uv_size":[16.0,8.0]},"south":{"uv":[0.0,0.0],"uv_size":[16.0,8.0]},"east":{"uv":[0.0,0.0],"uv_size":[16.0,8.0]},"west":{"uv":[0.0,0.0],"uv_size":[16.0,8.0]}}}]}]},{"description":{"identifier":"geometry.liquid_height5","texture_width":16,"texture_height":16,"visible_bounds_width":2,"visible_bounds_height":2},"bones":[{"name":"root","pivot":[0.0,0.0,0.0],"cubes":[{"origin":[-8.0,0.0,-8.0],"size":[16.0,10.0,16.0],"uv":{"up":{"uv":[0.0,0.0],"uv_size":[16.0,16.0]},"down":{"uv":[16.0,16.0],"uv_size":[-16.0,-16.0]},"north":{"uv":[0.0,0.0],"uv_size":[16.0,10.0]},"south":{"uv":[0.0,0.0],"uv_size":[16.0,10.0]},"east":{"uv":[0.0,0.0],"uv_size":[16.0,10.0]},"west":{"uv":[0.0,0.0],"uv_size":[16.0,10.0]}}}]}]},{"description":{"identifier":"geometry.liquid_height6","texture_width":16,"texture_height":16,"visible_bounds_width":2,"visible_bounds_height":2},"bones":[{"name":"root","pivot":[0.0,0.0,0.0],"cubes":[{"origin":[-8.0,0.0,-8.0],"size":[16.0,12.0,16.0],"uv":{"up":{"uv":[0.0,0.0],"uv_size":[16.0,16.0]},"down":{"uv":[16.0,16.0],"uv_size":[-16.0,-16.0]},"north":{"uv":[0.0,0.0],"uv_size":[16.0,12.0]},"south":{"uv":[0.0,0.0],"uv_size":[16.0,12.0]},"east":{"uv":[0.0,0.0],"uv_size":[16.0,12.0]},"west":{"uv":[0.0,0.0],"uv_size":[16.0,12.0]}}}]}]},{"description":{"identifier":"geometry.liquid_height7","texture_width":16,"texture_height":16,"visible_bounds_width":2,"visible_bounds_height":2},"bones":[{"name":"root","pivot":[0.0,0.0,0.0],"cubes":[{"origin":[-8.0,0.0,-8.0],"size":[16.0,14.0,16.0],"uv":{"up":{"uv":[0.0,0.0],"uv_size":[16.0,16.0]},"down":{"uv":[16.0,16.0],"uv_size":[-16.0,-16.0]},"north":{"uv":[0.0,0.0],"uv_size":[16.0,14.0]},"south":{"uv":[0.0,0.0],"uv_size":[16.0,14.0]},"east":{"uv":[0.0,0.0],"uv_size":[16.0,14.0]},"west":{"uv":[0.0,0.0],"uv_size":[16.0,14.0]}}}]}]},{"description":{"identifier":"geometry.liquid_height8","texture_width":16,"texture_height":16,"visible_bounds_width":2,"visible_bounds_height":2},"bones":[{"name":"root","pivot":[0.0,0.0,0.0],"cubes":[{"origin":[-8.0,0.0,-8.0],"size":[16.0,16.0,16.0],"uv":{"up":{"uv":[0.0,0.0],"uv_size":[16.0,16.0]},"down":{"uv":[16.0,16.0],"uv_size":[-16.0,-16.0]},"north":{"uv":[0.0,0.0],"uv_size":[16.0,16.0]},"south":{"uv":[0.0,0.0],"uv_size":[16.0,16.0]},"east":{"uv":[0.0,0.0],"uv_size":[16.0,16.0]},"west":{"uv":[0.0,0.0],"uv_size":[16.0,16.0]}}}]}]}]}
复制代码 |
|
等等!虽然我们已经定义了液体的模型和液体的方块文档,但液体不都应该有动态纹理吗?于是,我又在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[r=5] ~~~" //播放装熔岩的音效
- ]
- }
- }
- ]
- }
- }
- }
- }
复制代码 |
然后还需要定义一个物品,黏性熔岩桶。由于用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[r=5] ~~~", //播放倒出熔岩的声音
- "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"
- }
- }
- }
复制代码
|  | 总结
|
这一期,我们制作了一个液体方块。由于技术性限制,这个液体无法让玩家在内部游泳,这是不可避免的。也出现了一些用脚本赋予状态效果从而游泳的例子,但我不会写脚本,所以没有搬上来。也有一些其他方法,然而它们会导致游戏卡顿,世界区域几乎被冻结,游戏刻极为缓慢等现象。
不管怎样,虽然目前做到原版那种液体是不可能的,但至少我们可以做一个“半液体”。制作这种近似液体的方法有很多,这只是其中一种。
最后,我放出我为这个液体做的纹理,以及所有的示例文档,可以参考一下。
示例文档和纹理.zip
(9.47 KB, 下载次数: 34)
|
|