UID82897
性别保密
经验 EP
铁粒 粒
回帖0
主题
精华
在线时间 小时
注册时间2021-7-23
最后登录1970-1-1
|
本帖最后由 Cat_Anchor 于 2024-5-3 17:56 编辑
前言
|
上期,我们成功向附加包中添加了方块,了解了方块组件。这一期,我们将类比学习物品组件地学习方块组件。不同的是,我将把方块组件分类讲解。
| | 组件列表
| visual_item_config(非正式名称) 这个组件定义了方块在物品栏中的外观是物品图标还是用方块渲染表示。
这个组件很可能添加到游戏内,但目前还没有添加,也没有相关文档,所以没有任何代码参考。请等待此组件添加,然后我会更新此段落。
- "minecraft:visual_item_config": {
- "render_type": "item_icon", //瞎编的
- "icon": "test" //还是瞎编的
- }
复制代码 |
geometry 这个组件可以决定方块的模型(形状)、骨骼可见性(模型的一部分是否可见)和剔除面设置。
模型存储在资源包根目录下的models文件夹下的blocks文件夹下,后缀是.json。
剔除面设置存储在资源包根目录下的block_culling文件夹下的culling.json文件中。
下面是代码。
- "minecraft:geometry": {
- "identifier": "geometry.custom_block", //这里的geometry.custom_block就是模型ID,以后会说到。也可以填写下面列出的原版ID。
- "bone_visibility": { //指定骨骼可见性
- "bone_name": "q.block_property('supplementary:lit_bit')" //bone_name是骨骼名称,后面是条件。可以有很多个这样的键值对。
- },
- "culling": "supplementary:test_cull" //填写方块剔除规则文件的ID。
- }
复制代码
注:
骨骼可见性中,条件的值可以是true(默认,渲染),false(不渲染),Molang表达式(根据情况决定渲不渲染)。
Molang表达式被限制了上下文,只能用“不需要方块位置数据”的查询函数。目前已知只能用q.block_state这个函数查询方块状态。还能用数学符号及函数,但不能使用会生成随机数的函数,例如math.random。不能访问上下文只读变量(以c.或context.开头的只读变量),也不能访问普通只读变量(以v.或variable.开头的只读变量)。不能定义新的变量(以v.或variable.开头的变量),不能定义新的缓存变量(以t.或temp.开头的一次性变量)。
所有原版ID:
minecraft:geometry.full_block,就是一个完整的方块,于1.20.60.23版本添加,取代了minecraft:unit_cube组件
minecraft:geometry.cross,可能类似于草丛或滴水石锥的交叉面纹理 |
如果使用半透明或透明纹理,那部分纹理在游戏内默认显示黑色。可以更改渲染方法来解决这个问题。material_instances 这个组件指定了一个方块的纹理、渲染方法、渲染面等等设置。
这个组件与minecraft:geometry一起用时可以修改纹理,但单独用时不能修改纹理,只能指定渲染方法等。
如果与定义模型的组件连用,blocks.json中指定的纹理会被这里指定的纹理覆盖,也就是说,这个方块在blocks.json中的texture字段会被忽略。
- "minecraft:material_instances": {
- "*": { //这里的*代表匹配任意模型。这个可以填写逐面UV模型中某一面的UV设置中的material_instance字段,用于指定那一面的纹理、渲染方法等。
- "texture": "atlas_texture", //纹理短名。也指定破坏方块时呈现的纹理。
- "ambient_occlusion": false, //这个材料在被光照射时是否应该有环境光遮蔽。如果填true,方块周围和下面将有阴影。
- "face_dimming": false, //这种材料是否应该因其所面向的方向而变暗。如果填true,会变暗。
- "render_method": "alpha_test" //指定渲染方法。所有渲染方法及其作用见下。
- },
- "custom_sides": {
- "texture": "side_texture" //这里指定了一个别名,side_texture又称custom_sides。side_texture是纹理短名。
- },
- "up": {
- "texture": "top_texture" //top_texture是纹理短名。
- },
- "down": {
- "texture": "bottom_texture" //bottom_texture是纹理短名。
- },
- "north": "custom_sides", //这里使用的是上面指定的那个别名。north是内置的方向,即北方。
- "south": "custom_sides", //这里使用的是上面指定的那个别名。south是内置的方向,即南方。
- "east": "custom_sides", //与上面的解释相同。
- "west": "custom_sides" //与上面的解释相同。
- }
复制代码 以下是所有可用的渲染方法:
opaque:只允许不透明纹理。透明纹理将失去它的alpha图层,一般会导致它完全变黑(#000000)。它启用背面剔除,这会导致你在同一时间同一地点内最多只能看到它的3个面。背对你的方块面,或者与使用同样渲染方法的方块相邻的面,将被剔除(也就是移除掉,不渲染)。它可以作为红石导体被强充能,怪物会在它上面生成,在它内部的玩家会窒息。
double_sided:与opaque大体相同,但它禁用背面剔除,导致你能直接看到它的6个面(虽然这通常不可能)。不论什么条件,不论与什么方块相邻,它的每个面总是都在渲染,因此比较消耗性能。
alpha_test:允许不透明和完全透明,不允许半透明纹理。透明度高于50%的半透明像素将失去它的alpha图层,其余的半透明像素会被当做完全透明处理。与空气、有除minecraft:geometry.full_block以外的模型的方块或使用blend渲染方法的方块相邻时,它禁用背面剔除,导致你能直接看到它的6个面(通过透明像素看到方块内部面)。它不能作为红石导体,怪物也不会在它上面生成,在它内部的玩家也不会窒息。
alpha_test_single_sided:这个渲染方法虽然好像目前(基岩版1.20)还没有什么记载,却是真实存在的。与alpha_test大体相同,但它启用背面剔除,这会导致你在同一时间同一地点内最多只能看到它的3个面。背对你的方块面,或者与使用同样渲染方法的方块相邻的面,将被剔除(也就是移除掉,不渲染)。
blend:允许不透明、半透明和完全透明纹理。它启用背面剔除。但是这个渲染方法目前(基岩版1.20)有bug,它会将渲染的纹理置于所有要渲染的半透明纹理的最底层。这实际上是由材料决定的,与实际纹理的透明情况无关。也就是说,即使你的纹理是不透明的,只要使用这个渲染方法,你就可以透过这种方块看到下雨的粒子等等,这让它看起来十分奇怪。它不能作为红石导体,怪物也不会在它上面生成,在它内部的玩家也不会窒息。
性能排名(越靠前越消耗性能,应尽量避免使用)如下:
blend > alpha_test > alpha_test_single_sided > double_sided > opaque
|
接下来是1.19.80.20新增的组件。transformation 这个组件用于平移、旋转或缩放方块。必须与minecraft:geometry组件一起使用。平移、旋转或缩放之后的模型还是有以前的限制(例如模型的最大尺寸是30*30,立方体不能超过这个限制等)。
当这个组件与模型minecraft:geometry.full_block(默认方块模型)连用时,不能使用平移或缩放字段,仅能以90度为单位进行旋转。
- "minecraft:transformation": {
- "translation": [0.0, 0.125, -0.125], //平移的距离,以一个方块为1.0,例如一个像素长是0.0625。
- "scale": [0.5, 0.1, 0.5], //缩放的大小,以一个方块为1.0
- "scale_pivot": [0.2, 0.2, 0.2], //指定缩放时要沿着哪个点缩放
- "rotation": [0, 90, 90], //指定旋转的角度,必须是90的倍数,例如0, 90, -90, 180, -180, 270, -270, 等等。
- "rotation_pivot": [0, 0.25, -0.25] //指定旋转时要沿着哪个点旋转,以一个方块为1.0,例如4个像素长是0.25。
- }
复制代码 |
接下来讲地图颜色。map_color 有这个组件的方块摆在地上,显示在地图里时会显示给出的颜色值。如果没有这个组件,会显示为透明。(就是显示这个方块下面的方块的地图颜色。)
这个有两种写法,可以这么写。- "minecraft:map_color": "#FFFFFF" //#FFFFFF是十六进制颜色值,用“#红红绿绿蓝蓝”的RGB格式的十六进制值。例如255,255,255转换成十六进制就是FF,FF,FF(纯白色)。
复制代码 还可以这么写。- "minecraft:map_color": [
- 255, //红色值
- 255, //绿色值
- 255 //蓝色值
- ]//这个数组里包括的3个值都是255,代表R:255,G:255,B:255。
复制代码 |
下面是两个“箱”组件,一个指定了判定箱,另一个指定了碰撞箱。selection_box 指定方块的判定箱,就是你必须瞄准方块的哪里才能打到方块。
- "minecraft:selection_box": { //可以是对象,也可以是true或false。设置为对象就会根据对象提供的值进行设置判定箱,设置为true就是默认的判定箱(一整个方块),设置为false就完全选择不到方块。
- "origin": [-8.0, 0.0, -8.0], //判定箱的起始点。按照x,y,z的格式。不能超过-8,-8,-8。
- "size": [16.0, 16.0, 16.0] //判定箱的大小。按照长,宽,高的格式。不能超过16,16,16。
- }
复制代码 |
collision_box 指定方块的碰撞箱,就是你可以碰到方块的哪里。- "minecraft:collision_box": { //可以是对象,也可以是true或false。设置为对象就会根据对象提供的值进行设置碰撞箱,设置为true就是默认的碰撞箱(一整个方块),设置为false就完全碰不到方块,使方块可以被穿过。
- "origin": [-8.0, 0.0, -8.0], //碰撞箱的起始点。按照x,y,z的格式。不能超过-8,-8,-8。
- "size": [16.0, 16.0, 16.0] //碰撞箱的大小。按照长,宽,高的格式。不能超过16,16,16。
- }
复制代码 |
接下来是3个“能否被破坏”,一个是被挖掘,一个是被爆炸,一个是被燃烧。destructible_by_mining 指定方块能否被挖掘破坏,以及挖掘时间。
- "minecraft:destructible_by_mining": { //可以是对象,也可以是true或false。是true代表挖掘耗时为0秒,是false代表不可被挖掘破坏(相当于基岩)。
- "seconds_to_destroy": 10 //挖掘所用时长。这个数值越大,挖掘耗时越长。单位是秒。可以是小数。
- }
复制代码 |
destructible_by_explosion 指定方块能否被爆炸破坏和方块的爆炸抗性。- "minecraft:destructible_by_explosion": { //可以是对象,也可以是true或false。是true代表爆炸抗性为0,是false代表不可被爆炸破坏。
- "explosion_resistance": 50 //爆炸抗性。可以是小数。
- }
复制代码 |
flammable 指定方块能否被烧毁,以及燃烧可能性和烧毁可能性。- "minecraft:flammable": { //可以是对象,也可以是true或false。是true代表方块有木板的燃烧可能性和烧毁可能性,是false代表不可燃烧。
- "catch_chance_modifier": 5, //燃烧可能性。值等于0时,火焰不会传播到这个方块上。如果直接点燃这个方块,火会熄灭。值大于0时,火焰有几率传播到方块上。值越大越容易燃烧。
- "destroy_chance_modifier": 20 //烧毁可能性。值等于0且燃烧可能性大于0时,火焰会永远燃烧下去,同时方块不会被摧毁。值大于0时,火焰有可能烧毁这个方块。值等于0时,方块永远不会被烧毁。值越大,方块越容易被烧毁。
- }
复制代码 |
接下来是一些杂项的组件。friction 指定方块的摩擦力。- "minecraft:friction": 0.6 //填写0.1-0.9之间的小数。值越大,摩擦力越大。一般方块的摩擦力是0.4。
复制代码 |
placement_filter 指定方块可以被放在哪里。- "minecraft:placement_filter":{
- "conditions": [ //这个数组里列出了所有条件。限制最多有64个条件。
- {
- "allowed_faces": [ //这个数组里列出了可以放置的面。限制最多有6个面。
- "up",
- "down",
- "side"
- ],
- "block_filter": [ //这个数组里列出了可以放置在其表面的方块。限制最多有64个方块。
- "grass", //可以直接写方块ID
- {
- "tags": "query.any_tag('stone')" //也可以这么写
- },
- {
- "name": "minecraft:planks", //还可以这么写
- "states": {
- "wood_type": "jungle" //方块状态
- }
- }
- ]
- }
- ]
- }
复制代码 |
loot 指定方块的掉落物。- "minecraft:loot": "loot_tables/custom_loot.json" //指定战利品表。路径最多256字节。
复制代码 |
接下来是两个“光”,一个是发光量,一个是吸光量。light_emission
方块的发光量。- "minecraft:light_emission": 10 //发光量。范围是0-15。不可以有小数。值越大,发光量越多。
复制代码 |
light_dampening 方块的吸光量。- "minecraft:light_dampening": 10 //吸光量。范围是0-15。不可以有小数。值越大,吸光量越多。
复制代码 |
还有最后一个。crafting_table 指定方块拥有工作台的能力。- "minecraft:crafting_table": {
- "crafting_tags": [ //这个数组指定合成标签,最多64个标签,每个标签最多64字节。
- "crafting_table", //原版工作台标签
- "custom_crafting_tag" //自定义标签,这个标签可以写到自定义配方的crafting_tag数组里,表示这个配方可以用含有这个标签的工作台合成,只支持有序配方和无序配方。
- ],
- "table_name": "" //本地化字符串,需要在.lang语言文件里表示出来。例如这里写“ui.custom_crafting”,需要在.lang文件里写“ui.custom_crafting=自定义工作台”。
- }
复制代码 |
接下来是各种触发器组件,它们负责在某些条件下触发事件。所有的触发器组件都拥有"condition": ""(指定条件,填写Molang表达式)、"event": ""(指定要触发的事件,填写事件名称)和"target": ""(指定目标,填写self或other)键值对。以下将不对这些字段作出解释。
当实体摔落到方块上时触发事件:- "minecraft:on_fall_on": { //注:这个组件必须用在一个至少有4个像素高的方块上才能生效。
- "min_fall_distance": 0, //指定最小摔落距离。小于这个距离将不会触发事件。
- "condition": "q.is_sneaking",
- "event": "test",
- "target": "self"
- }
复制代码 当玩家右键点击方块时触发事件:- "minecraft:on_interact": {
- "condition": "q.is_sneaking",
- "event": "test",
- "target": "self"
- }
复制代码 当方块被放置时触发事件:- "minecraft:on_placed": {
- "condition": "q.is_sneaking",
- "event": "test",
- "target": "self"
- }
复制代码 当方块被玩家放置时触发事件:- "minecraft:on_player_placing": {
- "condition": "q.is_sneaking",
- "event": "test",
- "target": "self"
- }
复制代码 当方块被玩家破坏时触发事件(创造模式破坏不算数):- "minecraft:on_player_destroyed": {
- "condition": "q.is_sneaking",
- "event": "test",
- "target": "self"
- }
复制代码 当实体从方块上走开时触发事件:- "minecraft:on_step_off": { //注:这个组件必须用在一个至少有4个像素高的方块上才能生效。
- "condition": "q.is_sneaking",
- "event": "test",
- "target": "self"
- }
复制代码 当实体走上方块时触发事件:- "minecraft:on_step_on": { //注:这个组件必须用在一个至少有4个像素高的方块上才能生效。
- "condition": "q.is_sneaking",
- "event": "test",
- "target": "self"
- }
复制代码 还有两个特别的组件,分别是minecraft:random_ticking和minecraft:queued_ticking。这两个组件用于周期性地触发事件,前者基于随机刻,后者基于计划刻。
minecraft:random_ticking的代码如下。- "minecraft:random_ticking": {
- "on_tick": {
- "event": "update" //事件名称
- }
- }
复制代码 minecraft:queued_ticking的代码如下。- "minecraft:queued_ticking": {
- "interval_range": [ //范围,单位是刻。设置成一样的会导致固定在这个时间触发事件,设置成不一样的会导致在范围内随机选择时长,然后触发事件。
- 10, //0.5秒
- 30 //1.5秒
- ],
- "looping": true, //是否循环触发,默认为true(循环)。设置为false后不会循环。
- "on_tick": {
- "event": "update" //事件名称
- }
- }
复制代码
以上就是所有可用的组件了。有可能会有遗漏,我会尽力补充。也可以给方块添加标签,标签和组件同级。标签应该是下面这样的。
- "tag:标签名字": {} //这里的标签名字最好使用命名空间ID。
复制代码
标签似乎没有现成的用途。
自定义方块的标签会被原版物品忽略。
添加特定的标签可能可以给这个方块一些原版方块拥有的功能,然而不确定这样的标签的存在。
目前还没有已知办法给自定义方块加上合成标签,使其被配方文档中的{"tag":"..."}识别。
| | 总结
|
这一期,我把所有方块组件罗列了一遍。下一期,我们不讲方块事件,而是先把模型讲了,因为这篇教程里多次提到了模型。下下期讲战利品表,然后再讲方块事件。
|
|
评分
-
查看全部评分
|