开启辅助访问     
收藏本站

站内搜索

搜索

Minecraft(我的世界)苦力怕论坛

[BE教程] 附加包教程:34.方块(六)

 发表于 2023-3-31 21:54:43 来自手机|显示全部楼层|阅读模式 IP:天津
本帖最后由 Cat_Anchor 于 2023-6-17 12:46 编辑

黏性熔岩
稀有度常见
创造分类命令
材料流体
合适挖掘工具
硬度
爆炸抗性500
亮度15
窒息生物
红石导体
光照透明0.2
可被火破坏
可被熔岩生成火
可再生
最大堆叠64
命名空间IDviscous_lava       


前言

今天我们继续放出方块的例子。
目标

这次我想制作一种液体,拥有真实的扩散机制,还可以用桶装起来。
分析与解决

没错,今天要做一个液体方块。既然没有说明到底是什么液体,那我就先做着,做完了再说吧。液体这个东西虽然比坩埚难些,但还是可以做出来的。首先,既然是液体,那么必须定义一个方块属性,来决定液体方块的高度。这个例子中,7代表液体源,8代表竖直向下的液体方块,剩下的代表水平扩散的液体方块。
  1. {
  2.   "format_version": "1.18.0",
  3.   "minecraft:block": {
  4.     "description": {
  5.       "identifier": "supplementary:viscous_lava",
  6.       "properties": {
  7.         "supplementary:viscous_lava_liquid_height": [ //一个属性
  8.           1,
  9.           2,
  10.           3,
  11.           4,
  12.           5,
  13.           6,
  14.           7,
  15.           8
  16.         ]
  17.       }
  18.     }, ...
  19.   }
  20. }
复制代码

然后定义一些基本的方块组件,例如爆炸抗性、光照等。由于我们定义的属性中,7才是液体源,所以要在玩家放置这个液体方块后把它自身的属性设定为7,不然就无法放置液体源了。
  1. ... "components": {
  2.       "minecraft:on_player_placing": {
  3.         "event": "on_placed"
  4.       }, //玩家放置此方块后触发on_placed事件。
  5.       "minecraft:aim_collision": false, //无法被选中
  6.       "minecraft:block_collision": false, //没有碰撞体积
  7.       "minecraft:geometry": "geometry.liquid_height8", //方块模型
  8.       "minecraft:creative_category": {
  9.         "category": "construction"
  10.       }, //创造模式物品栏分类(可以不加这个组件)
  11.       "minecraft:material_instances": {
  12.         "*": {
  13.           "texture": "viscous_lava",
  14.           "render_method": "blend"
  15.         }
  16.       }, //定义这个方块的纹理。blend决定是半透明纹理,而且不能在它上面刷怪。
  17.       "minecraft:destroy_time": 10000000, //无法被挖掘破坏。其实只是挖掘时间特别长而已,在1.19格式版本下可以用  "minecraft:destructible_by_mining": false  来定义这个方块不可被挖掘破坏。
  18.       "minecraft:map_color": "#4C4C4C", //地图颜色
  19.       "minecraft:block_light_filter": 0, //方块吸光量
  20.       "minecraft:block_light_emission": 1, //方块发光量,这里是15级光照亮度
  21.       "minecraft:explosion_resistance": 500 //爆炸抗性是500
  22.     },
  23.     "events": {
  24.       "on_placed": {
  25.         "set_block_property": {
  26.           "supplementary:viscous_lava_liquid_height": 7 //将液体高度设为7,即液体源方块
  27.         }
  28.       }, ...
复制代码

现在来定义方块排列。
  1.   ... {
  2.         "condition": "q.block_property('supplementary:viscous_lava_liquid_height')==7", //液体源方块
  3.         "components": {
  4.           "minecraft:geometry": "geometry.liquid_height7", //液体源方块的模型
  5.           "tag:supplementary:viscous_lava_liquid_height7": {}, //这里加一个tag,为了方便以后的判断
  6.           "minecraft:ticking": {
  7.             "looping": true,
  8.             "range": [
  9.               0.2,
  10.               0.2
  11.             ], //速度,这里是每0.2秒散播一次
  12.             "on_tick": {
  13.               "event": "spread_to_6", //这个事件的作用是在这个方块的周围放置高度为6的液体方块。同理,高度为6的液体方块会放置高度为5的液体方块,直到结束。
  14.               "target": "self"
  15.             }
  16.           }, //液体散播的组件
  17.           "minecraft:aim_collision": true //指定了液体源方块可以被选中,这是为了方便以后用桶装液体。
  18.         }
  19.       }, ...
复制代码

现在我们来看看最难的部分——事件。由于这一部分重复度过高,我不会把所有事件都列出,就拿液体源的事件代码做一个例子吧。
  1.   ... "spread_to_6": {
  2.         "sequence": [
  3.           {
  4.             "run_command": {
  5.               "command": [
  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]",
  7.                 "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]",
  8.                 "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]",
  9.                 "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]",
  10.                 "execute if block ~~-1~ air run setblock ~~-1~ supplementary:viscous_lava ["supplementary:viscous_lava_liquid_height":8]",
  11.                 "execute if block ~~-1~ supplementary:viscous_lava run setblock ~~-1~ supplementary:viscous_lava ["supplementary:viscous_lava_liquid_height":8]",
  12.                 "damage @e[r=0.5] 4 lava"
  13.               ] //要运行的一个命令组。前4条负责水平扩散,第5到6条负责竖直扩散,第7条负责造成熔岩伤害。第7条可有可无,甚至可以替换成其他效果。
  14.             }
  15.           }
  16.         ]
  17.       }, ...
复制代码

基本上每个液体方块都是以上的逻辑,所以自定义液体其实不难。这些代码还有些缺陷,但我实在想不出既能解决缺陷又不会让游戏卡顿的代码了。
当然了,还需要设计一个能让液体在没有液体源后就消失的功能。在 spread_to_5 事件后,还额外触发了一个 5air 事件,这个事件负责让液体消失,如下。
  1.   ... "5air": {
  2.         "sequence": [
  3.           {
  4.             "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'))", //检测周围有没有更高的液体,没有就运行下面的事件方法,有就什么也不做。
  5.             "run_command": {
  6.               "command": [
  7.                 "setblock ~~~ air" //在自身位置放置空气,也就是让自己消失。
  8.               ]
  9.             }
  10.           }
  11.         ]
  12.       }, ...
复制代码

然后都有规律了,穷举就可以了。最后,随便定义一下这个液体到底是什么。我就叫它黏性熔岩好了。
一番操作猛如虎,我终于做好了一个液体方块。以下代码就是我的viscous_lava.json里写的内容,供大家参考。
以下是模型文件。

等等!虽然我们已经定义了液体的模型和液体的方块文档,但液体不都应该有动态纹理吗?于是,我又在flipbook_textures.json文件里输入了以下代码。
  1. [
  2.   {
  3.     "flipbook_texture": "textures/blocks/viscous_lava",
  4.     "atlas_tile": "viscous_lava",
  5.     "ticks_per_frame": 16
  6.   }
  7. ]
复制代码

然后简单地通过terrain_texture.json给方块纹理。
  1. {
  2.   "texture_data": {
  3.     "viscous_lava": {
  4.       "textures": "textures/blocks/viscous_lava"
  5.     }
  6.   }
  7. }
复制代码

现在来定义一个桶吧!因为不能直接修改原版桶,必须自定义一个桶。我叫它加固的桶。代码稍微有点长,我折叠一下。

然后还需要定义一个物品,黏性熔岩桶。由于用minecraft:on_use_on事件时会以这个方块为基准点,所以只能用minecraft:entity_placer来放置一个技术性实体,再让这个实体放置黏性熔岩源方块。
  1. {
  2.   "format_version": "1.17.0",
  3.   "minecraft:item": {
  4.     "description": {
  5.       "identifier": "supplementary:viscous_lava_bucket",
  6.       "category": "items" //定义物品分类,必须有这一行代码
  7.     },
  8.     "components": {
  9.       "minecraft:icon": {
  10.         "texture": "viscous_lava_bucket" //定义纹理
  11.       },
  12.       "minecraft:creative_category": {
  13.         "parent": "itemGroup.name.diamond"
  14.       }, //定义在创造模式物品栏里的位置。
  15.       "minecraft:allow_off_hand": true, //允许左手
  16.       "minecraft:entity_placer": {
  17.         "entity": "supplementary:viscous_lava_placer" //放置技术性实体
  18.       }
  19.     }
  20.   }
  21. }
复制代码

所以,还需要定义一个新实体。代码略长,我折叠一下。

好了,这就差不多了。上面那个实体是技术性实体,不需要显示出来,因此不用额外定义什么了。下面是我制作的一个配方。
  1. {
  2.   "format_version": "1.12",
  3.   "minecraft:recipe_shaped": {
  4.     "description": {
  5.       "identifier": "supplementary:viscous_lava_bucket"
  6.     },
  7.     "tags": [
  8.       "crafting_table"
  9.     ],
  10.     "pattern": [
  11.       "BAB",
  12.       "CBC"
  13.     ],
  14.     "key": {
  15.       "A": {
  16.         "item": "minecraft:lava_bucket"
  17.       },
  18.       "B": {
  19.         "item": "minecraft:magma_cream"
  20.       },
  21.       "C": {
  22.         "item": "minecraft:obsidian"
  23.       }
  24.     },
  25.     "result": {
  26.       "item": "supplementary:viscous_lava_bucket"
  27.     }
  28.   }
  29. }
复制代码

总结

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


评分

参与人数 1铁粒 +64收起理由
 WZM*** + 64我要这铁粒有何用

查看全部评分

苦力怕论坛,感谢有您~
 发表于 2023-11-22 13:24:28 来自手机|显示全部楼层 IP:内蒙古
6#2023-11-22 13:24:28回复收起回复
苦力怕论坛,感谢有您~
 发表于 2023-4-8 22:40:31 来自手机|显示全部楼层 IP:江西省
什么时候更新gameTest
5#2023-4-8 22:40:31回复收起回复
苦力怕论坛,感谢有您~
 发表于 2023-4-8 22:38:01 来自手机|显示全部楼层 IP:江西省
什么时候可以更新Js
4#2023-4-8 22:38:01回复收起回复
苦力怕论坛,感谢有您~
 发表于 2023-3-31 22:11:55 来自手机|显示全部楼层 IP:江西省
6666666666
3#2023-3-31 22:11:55回复收起回复
苦力怕论坛,感谢有您~
 发表于 2023-3-31 21:56:52 来自手机|显示全部楼层 IP:福建省
感谢分享
2#2023-3-31 21:56:52回复收起回复
苦力怕论坛,感谢有您~

本版积分规则

本站
关于我们
联系我们
坛史纲要
官方
哔哩哔哩
技术博客
下载
网易版
安卓版
JAVA
反馈
意见建议
教程中心
更多
捐助本站
QQ群
QQ群

QQ群

访问手机版

访问手机版

手机版|小黑屋|系统状态|klpbbs.com

粤公网安备 44200002445329号 | 由 木韩网络 提供支持 | GMT+8, 2024-12-16 10:06

声明:本站与Mojang以及微软公司没有从属关系

Powered by Discuz! X3.4 粤ICP备2023071842号-3