Cat_Anchor 发表于 2024-8-17 07:29:55

基岩技术教程:5.嵌套方块

本帖最后由 Cat_Anchor 于 2024-10-4 12:50 编辑




前言

众所周知,Java 版和基岩版实现含水方块的逻辑不一样。Java 版只有一个方块状态,而基岩版不同,基岩版的实现逻辑很“厉害”,可以用这个鲜为人知的特性做出奇怪的方块。至于基岩版到底是怎么实现含水方块的,请让我引入两个概念——“前景层”和“背景层”。


https://klpbbs.com/static/image/hrline/line5.png


概念与性质

基岩版中,要实现方块的含水,需要让方块和水处于同一位置,我们称含水方块中的方块位于“前景层”,而水位于“背景层”。

实际上,引擎没有规定前景层和背景层的方块种类,也就是说,我们可以制作“含任何方块的任何方块”,比如含蜂蜜块的末地石、含紫水晶块的玻璃,等等。我把这类方块称为“嵌套方块”,它有以下性质:

[*]渲染方法相同时,首先渲染背景层方块,然后渲染前景层方块。

[*]渲染方法不同时,首先渲染使用 blend 渲染方法的方块,然后是 alpha_test,最后是 opaque,此时两个方块的阴影会叠加。

[*]与之互动时,体现前景层方块的性质。特别地,背景层的水可以灭火;前景层为空气时,背景层不渲染,体现背景层方块的性质。

[*](除爆炸外的)破坏时,首先破坏前景层方块,然后背景层方块成为前景层方块,最后背景层方块变为空气。

[*]被爆炸破坏时,前景层方块和背景层方块一起消失。

[*]如果前景层是液体方块,背景层是完整固体方块,液体方块不会流动,嵌套方块没有碰撞体积。液体流过这个方块时,它会被取代。


https://klpbbs.com/static/image/hrline/line4.png


获取

可以通过移动中的方块放置嵌套方块,需要修改物品栏 NBT。以下是移动中的方块的物品数据,由 NBT 转为 JSON。制作时只需要把 NBT 格式做得与以下数据格式一样即可。
以下 JSON 描述了 ~local_player 根标签中的空名称对象中的 Inventory 数组中的任意一个对象。
{ //一个物品堆叠
"block": {
    "name": "minecraft:movingBlock", //方块 ID
    "states": {}, //方块状态
    "version": 17879555 //数据版本,对应游戏版本
},
"count": 64, //物品堆叠的数量
"damage": 0, //物品的损害值
"name": "minecraft:movingBlock", //物品 ID
"slot": 0, //于物品栏的槽位索引
"wasPickedUp": false, //是否刚被捡起
"tag": {
    "movingBlock": { //前景层
      "name": "minecraft:glass", //方块 ID
      "states": {}, //方块状态
      "version": 17879555 //数据版本,对应游戏版本
    },
    "movingBlockExtra": { //背景层
      "name": "minecraft:diamond_block", //方块 ID
      "states": {}, //方块状态
      "version": 17879555 //数据版本,对应游戏版本
    }
} //含钻石块的玻璃
}

以下是移动的方块的完整物品数据,由 NBT 转为 JSON。
{
"block": {
    "name": "minecraft:movingBlock", //方块 ID
    "states": {}, //方块状态
    "version": 17879555 //数据版本,对应游戏版本
},
"count": 64, //物品堆叠的数量
"damage": 0, //物品的损害值
"name": "minecraft:movingBlock", //物品 ID
"slot": 0, //于物品栏的槽位索引
"wasPickedUp": false, //是否刚被捡起
"tag": {
    "movingBlock": { //前景层
      "name": "minecraft:glass", //方块 ID
      "states": {}, //方块状态
      "version": 17879555 //数据版本,对应游戏版本
    },
    "movingBlockExtra": { //背景层
      "name": "minecraft:diamond_block", //方块 ID
      "states": {}, //方块状态
      "version": 17879555 //数据版本,对应游戏版本
    },
    "pistonPosX": 0, //活塞 X 轴坐标
    "pistonPosY": 0, //活塞 Y 轴坐标
    "pistonPosZ": 0, //活塞 Z 轴坐标
    "movingEntity": { //方块实体数据
      "x": 0, //方块实体的 X 轴坐标
      "y": 0, //方块实体的 Y 轴坐标
      "z": 0, //方块实体的 Z 轴坐标
      "id": "", //方块实体的 ID
      "isMovable": true, //是否可以被活塞移动
      "customName": "" //方块实体的自定义名称
    }
}
}
以下是图片。https://pic.imgdb.cn/item/66bfe001d9c307b7e96b3203.jpg(蜂蜜块是前景层,末地石是背景层。)
https://pic.imgdb.cn/item/66bfe04ed9c307b7e96b589c.jpg(前景层是水或流动的水,背景层是荧石。如果不停放置,会制造“无源之水”,很难消除。)


https://klpbbs.com/static/image/hrline/line1.png


后记

这一期,我们讲解了嵌套方块。




第四期 第五期 第六期
页: [1]
查看完整版本: 基岩技术教程:5.嵌套方块