Cat_Anchor 发表于 2023-3-31 21:54:43

附加包教程: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


总结



这一期,我们制作了一个液体方块。由于技术性限制,这个液体无法让玩家在内部游泳,这是不可避免的。也出现了一些用脚本赋予状态效果从而游泳的例子,但我不会写脚本,所以没有搬上来。也有一些其他方法,然而它们会导致游戏卡顿,世界区域几乎被冻结,游戏刻极为缓慢等现象。
不管怎样,虽然目前做到原版那种液体是不可能的,但至少我们可以做一个“半液体”。制作这种近似液体的方法有很多,这只是其中一种。
最后,我放出我为这个液体做的纹理,以及所有的示例文档,可以参考一下。






第三十三期 第三十四期 第三十五期

ASD361521 发表于 2023-11-22 13:24:28

[贴吧_呼~][贴吧_呼~]

方n 发表于 2023-4-8 22:40:31

什么时候更新gameTest

方n 发表于 2023-4-8 22:38:01

什么时候可以更新Js

蝙蝠侠艾登 发表于 2023-3-31 22:11:55

6666666666

巅疯狂魔 发表于 2023-3-31 21:56:52

感谢分享
页: [1]
查看完整版本: 附加包教程:34.方块(六)