附加包教程:11.方块(二)
本帖最后由 Cat_Anchor 于 2024-11-9 22:52 编辑前言
上期,我们成功向附加包中添加了方块,了解了方块组件。这一期,我们将类比学习物品组件地学习方块组件。
https://klpbbs.com/static/image/hrline/line5.png
组件列表
geometry模型组件:指定方块的模型。
这个组件可以决定方块的模型(形状)、骨骼可见性(模型的一部分是否可见)、剔除面设置和渲染设置。
方块模型存储在资源包根目录下的models文件夹下的blocks文件夹下,后缀是.geo.json。
剔除面设置存储在资源包根目录下的block_culling文件夹下的 JSON 文件中。
渲染设置可以控制方块在物品栏UI里、玩家头上、第一人称左手上、第一人称右手上、第三人称左手上、第三人称右手上、作为物品漂浮在地面上和物品展示框中的大小、旋转和缩放。"minecraft:geometry": {
"identifier": "geometry.custom_block",
"bone_visibility": {
"bone_name": "q.block_state('complementary:lit_bit')"
},
"culling": "complementary:test_cull",
"item_display_transforms": {
"gui": {
"translation": ,
"rotation": ,
"scale": ,
"rotation_pivot": ,
"scale_pivot": ,
"fit_to_frame": true
},
"firstperson_righthand": {
"translation": ,
"rotation": ,
"scale": ,
"rotation_pivot": ,
"scale_pivot":
},
"firstperson_lefthand": {
"translation": ,
"rotation": ,
"scale": ,
"rotation_pivot": ,
"scale_pivot":
},
"thirdperson_righthand": {
"translation": ,
"rotation": ,
"scale": ,
"rotation_pivot": ,
"scale_pivot":
},
"thirdperson_lefthand": {
"translation": ,
"rotation": ,
"scale": ,
"rotation_pivot": ,
"scale_pivot":
},
"ground": {
"translation": ,
"rotation": ,
"scale": ,
"rotation_pivot": ,
"scale_pivot":
},
"fixed": {
"translation": ,
"rotation": ,
"scale": ,
"rotation_pivot": ,
"scale_pivot":
},
"head": {
"translation": ,
"rotation": ,
"scale": ,
"rotation_pivot": ,
"scale_pivot":
}
}
}字段功能描述类型
identifier方块模型ID。也可以填写原版ID,见下。字符串
bone_visibility骨骼可见性。其中的键(如 bone_name)填写骨骼名称,值是条件。可以有很多个这样的键值对。对象
culling方块剔除规则的ID。字符串
item_display_transforms在不同情况下方块的渲染。对象
gui在物品栏或快捷栏中时。对象
firstperson_righthand第一人称右手时。对象
firstperson_lefthand第一人称左手时。对象
thirdperson_righthand第三人称右手时。对象
thirdperson_lefthand第三人称左手时。对象
ground作为物品在地面漂浮时。对象
fixed在物品展示框中时。对象
head戴在玩家头部时。对象
translation平移,其中数值的范围是[-80.0, 80.0]。数组
rotation旋转,其中数值的范围是[-360.0, 360.0]。数组
scale缩放,其中数值的范围是。数组
rotation_pivot旋转枢轴点,其中数值的范围是[-80.0, 80.0]。数组
scale_pivot缩放枢轴点,其中数值的范围是[-80.0, 80.0]。数组
fit_to_frame是否缩放到物品栏中单个物品的边框(此字段没有在官方文档中提到,可能无效)。布尔值
所有原版ID:
minecraft:geometry.full_block 就是一个完整的方块,于1.20.60.23版本添加,取代了minecraft:unit_cube组件。添加后,方块不再被视为固体,也没有相邻面剔除效果。
minecraft:geometry.cross 类似于草丛或滴水石锥的交叉模型,使用时需要指定渲染方法为 alpha_test,否则模型从特定方向上不可见。
骨骼可见性中,条件的值可以是true(默认,渲染),false(不渲染),Molang表达式(根据情况决定渲不渲染)。
Molang表达式被限制了上下文,目前已知只能用q.block_state这个函数查询方块状态。还能用数学符号及函数,但不能使用会生成随机数的函数,例如math.random。
material_instances材质实例组件:指定方块的渲染设置。
如果使用半透明或透明纹理,那些纹理在游戏内会默认显示不透明的颜色,可以更改渲染方法来解决这个问题。这个组件指定了一个方块的纹理、渲染方法、渲染面等等设置。
这个组件与minecraft:geometry一起用时可以修改纹理,但单独用时不能修改纹理,只能指定渲染方法等。
如果与定义模型的组件一起用,blocks.json中指定的纹理会被这里指定的纹理覆盖,也就是说,这个方块在blocks.json中的texture字段会被忽略。"minecraft:material_instances": {
"*": {
"texture": "atlas_texture",
"ambient_occlusion": false,
"face_dimming": false,
"render_method": "alpha_test"
},
"custom_sides": {
"texture": "side_texture"
},
"up": {
"texture": "top_texture"
},
"down": {
"texture": "bottom_texture"
},
"north": "custom_sides",
"south": "custom_sides",
"east": "custom_sides",
"west": "custom_sides"
}字段功能描述类型
minecraft:material_instances可以在其中填写多个键值对。键决定材质实例设置应用的对象,值是具体的设置。键可以填写逐面UV模型中某一面的UV设置中的material_instance字段,也可以填写在这里定义好的材质实例名称。对象
*将材质实例设置应用到任意模型,而且指定了破坏方块时的纹理。对象
texture纹理短名。字符串
render_method渲染方法。所有渲染方法及其效果见下。字符串
face_dimming是否应该因其所面向的方向而变暗。布尔值
ambient_occlusion在被光照射时是否应该有环境光遮蔽(方块周围和下面的阴影)。填写浮点数时,控制照明后应用于AO值的指数,此时需要“即将到来的创作者功能”实验性玩法。布尔值或浮点数
custom_sides一个材质实例的名称。这里的custom_sides可以是任意字符串。现在custom_sides可以被其他同级字段使用。对象
north使用指定的材质实例名称。north是内置的方向,即北方,同理有其他 5 个方向。字符串
以下是所有可用的渲染方法:
opaque:只允许不透明纹理。透明纹理将失去它的alpha图层,一般会导致它完全变黑(#000000)。它启用背面剔除,这会导致你在同一时间同一地点内最多只能看到它的3个面。背对你的方块面,或者与使用同样渲染方法的方块相邻的面,将被剔除(也就是移除掉,不渲染)。它可以作为红石导体被强充能,怪物会在它上面生成,在它内部的玩家会窒息。
double_sided:与opaque大体相同,但它禁用背面剔除,导致你能直接看到它的6个面(虽然这通常不可能)。不论什么条件,不论与什么方块相邻,它的每个面总是都在渲染,因此比较消耗性能。这种方块的渲染距离是实际渲染距离的一半,例如,如果设置16个区块的渲染距离,那么这个方块只有在8个区块内才能看见。
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
transformation变换组件:变换方块的模型。
这个组件用于平移、旋转或缩放方块。必须与minecraft:geometry组件一起使用。平移、旋转或缩放之后的模型还是有以前的限制(例如模型的最大尺寸是30*30,立方体不能超过这个限制等)。
当这个组件与模型minecraft:geometry.full_block(默认方块模型)一起使用时,不能使用平移或缩放字段,仅能以90度为单位进行旋转。"minecraft:transformation": {
"translation": ,
"scale": ,
"scale_pivot": ,
"rotation": ,
"rotation_pivot":
}字段功能描述类型
translation平移的距离,以一个方块为1.0,例如一个像素长是0.0625。浮点数
scale缩放的大小,以一个方块为1.0。浮点数
scale_pivot指定缩放时要沿着哪个点缩放。浮点数
rotation指定旋转的角度,必须是90的倍数,例如0, 90, -90, 180, -180, 270, -270, 等等。整数
rotation_pivot指定旋转时要沿着哪个点旋转,以一个方块为1.0,例如4个像素长是0.25。浮点数
item_visual物品外观组件:修改方块作为物品时的外观。
这个组件用于修改方块对应物品的外观。它是minecraft:geometry和minecraft:material_instances组件的总和,拥有这两个组件有的字段。必须与minecraft:geometry组件和minecraft:material_instances组件一起使用。"minecraft:item_visual": {
"geometry": {},
"material_instances": {}
}字段功能描述类型
geometry请参阅minecraft:geometry组件以获取这个字段的信息。对象
material_instances请参阅minecraft:material_instances组件以获取这个字段的信息。对象
map_color地图颜色组件:指定方块在地图上的颜色。
有这个组件的方块摆在地上,显示在地图里时会显示给出的颜色值。如果没有这个组件,会显示为透明,也就是显示这个方块下面的方块的地图颜色。
这个有两种写法,可以这么写。"minecraft:map_color": "#FFFFFF"
还可以这么写。"minecraft:map_color": [
255,
255,
255
]字段功能描述类型
minecraft:map_color填写字符串时,需要十六进制颜色值,#红红绿绿蓝蓝。例如 (255, 255, 255) 转换成十六进制就是#FFFFFF(纯白色)。填写数组时,分别填写红色、绿色和蓝色分量。字符串或数组
selection_box判定箱组件:指定方块的判定箱。
指定方块的判定箱,就是你必须瞄准方块的哪里才能打到方块。"minecraft:selection_box": {
"enabled": true,
"origin": [-8.0, 0.0, -8.0],
"size":
}字段功能描述类型
minecraft:selection_box填写对象时,根据对象提供的值设置判定箱。填写true时,使用默认的判定箱(整个方块)。填写false时,方块没有判定箱,玩家选择不到方块。对象或布尔值
origin判定箱的起始点,按照(x, y, z)的格式。数组
size判定箱的大小,按照(x, y, z)的格式。数组
enabled指定是否启用判定箱,1.18版本可用。布尔值
判定箱不能超出 16*16*16 的方块大小限制,即使指定minecraft:transformation组件中的平移字段也不行,判定箱会被截断到限制边缘。
collision_box碰撞箱组件:指定方块的碰撞箱。
指定方块的碰撞箱,就是你可以碰到方块的哪里。"minecraft:collision_box": {
"enabled": true,
"origin": [-8.0, 0.0, -8.0],
"size":
}字段功能描述类型
minecraft:selection_box填写对象时,根据对象提供的值设置碰撞箱。填写true时,使用默认的碰撞箱(整个方块)。填写false时,方块没有碰撞箱,使方块可以被穿过。对象或布尔值
origin碰撞箱的起始点,按照(x, y, z)的格式。数组
size碰撞箱的大小,按照(x, y, z)的格式。数组
enabled指定是否启用碰撞箱,1.18版本可用。布尔值
碰撞箱不能超出 16*16*16 的方块大小限制,然而指定minecraft:transformation组件中的平移字段可以使碰撞箱突破限制。
destructible_by_mining挖掘破坏组件:指定方块的硬度和合适挖掘工具。
指定方块的硬度以及挖掘时间。"minecraft:destructible_by_mining": {
"seconds_to_destroy": 10.0,
"item_specific_speeds": [
{
"item": "minecraft:diamond_pickaxe",
"speed": 7.0
}
]
}字段功能描述类型
minecraft:destructible_by_mining对象表示详细的挖掘设置,true表示方块可以被瞬间破坏(挖掘耗时为0.05秒),false表示不可被挖掘破坏(相当于基岩)。对象或布尔值
seconds_to_destroy挖掘所用时长,填写浮点数。这个数值越大,挖掘耗时越长。单位是秒。浮点数
item_specific_speeds特定物品对挖掘此方块的加速效果。对象列表
item指定加速挖掘的物品 ID。字符串
speed物品加速的速度。浮点数
destructible_by_explosion爆炸破坏组件:指定方块的爆炸抗性。
指定方块能否被爆炸破坏和方块的爆炸抗性。"minecraft:destructible_by_explosion": {
"explosion_resistance": 5.0
}字段功能描述类型
minecraft:destructible_by_explosion对象代表详细的爆炸破坏行为,true代表爆炸抗性为0,false代表不可被爆炸破坏。对象或布尔值
explosion_resistance爆炸抗性。浮点数
flammable燃烧组件:指定方块的燃烧属性。
指定方块能否被烧毁,以及燃烧可能性和烧毁可能性。"minecraft:flammable": {
"catch_chance_modifier": 5,
"destroy_chance_modifier": 20
}字段功能描述类型
minecraft:flammable对象代表详细的燃烧属性配置,true代表方块有木板的燃烧可能性和烧毁可能性,false代表方块不可燃烧。对象或布尔值
catch_chance_modifier燃烧可能性。值等于0时,火焰不会传播到这个方块上。如果直接点燃这个方块,火会熄灭。值大于0时,火焰有几率传播到方块上。值越大越容易燃烧。整数
destroy_chance_modifier烧毁可能性。值等于0且燃烧可能性大于0时,火焰会永远燃烧下去,同时方块不会被摧毁。值大于0时,火焰有可能烧毁这个方块。值等于0时,方块永远不会被烧毁。值越大,方块越容易被烧毁。整数
light_emission发光组件:指定方块的发光量。
"minecraft:light_emission": 10字段功能描述类型
minecraft:light_emission发光量。值越大,发光量越多。范围是。整数
light_dampening吸光组件:指定方块的吸光量。
"minecraft:light_dampening": 10字段功能描述类型
minecraft:light_dampening吸光量。值越大,吸光量越多。范围是。整数
placement_filter放置条件组件:指定方块可以被放在哪里。
"minecraft:placement_filter": {
"conditions": [
{
"allowed_faces": [
"up",
"down",
"side"
],
"block_filter": [
"grass",
{
"tags": "q.any_tag('stone')"
},
{
"name": "minecraft:planks",
"states": {
"wood_type": "jungle"
}
}
]
}
]
}字段功能描述类型
conditions所有放置的条件。最多有64个条件。对象列表
allowed_faces可以放置的面。最多有6个面。字符串列表
block_filter可以放置在其表面的方块。最多有64个方块。可以直接写方块ID,也可以指定方块描述符。字符串列表或对象列表
tags要检测的方块标签。字符串
name方块ID。字符串
states方块状态。字符串
redstone_conductivity红石组件:指定方块的基本红石属性。
"minecraft:redstone_conductivity": {
"redstone_conductor": false,
"allows_wire_to_step_down": true
}字段功能描述类型
redstone_conductor方块是否为红石导体,即是否可以被强充能,默认为false,即不是红石导体。布尔值
allows_wire_to_step_down红石线是否可以沿此方块向下传输红石能量,默认为true,即可以向下传输。布尔值
liquid_detection液体检测组件:指定方块与液体的交互。
这个组件用于修改方块的液体检测属性,例如是否可以含水,是否会挡住水,以及是否会被水破坏等。"minecraft:liquid_detection": {
"detection_rules": [
{
"liquid_type": "water",
"can_contain_liquid": true,
"on_liquid_touches": "no_reaction",
"stops_liquid_flowing_from_direction": []
}
]
}字段功能描述类型
detection_rules方块与液体的交互规则。每个液体类型只允许一个规则,如果指定了多个,将使用第一个,其余的将被忽略。对象列表
liquid_type规则适用的液体类型,目前只能填写 water。可选,默认值为 water。字符串
can_contain_liquid方块是否能包含液体。例如,如果liquid_type是water,那么指定方块是否能含水。布尔值
on_liquid_touches液体流过时方块的行为。可选,默认为blocking。字符串
stops_liquid_flowing_from_direction阻止液体流经方块的面的列表。如果列表为空,允许液体流入或流出方块。字符串列表
on_liquid_touches 字段的所有可选值和解释如下。
blocking:方块阻止液体流过。
broken:液体使方块直接消失。
popped:液体摧毁方块,方块掉落为物品。
no_reaction:液体流经方块而方块没有任何反应。
需要1.21.50+的格式版本和即将到来的创作者功能实验性玩法。
loot战利品组件:指定方块被破坏时掉落的战利品表。
"minecraft:loot": "loot_tables/custom_loot.json"字段功能描述类型
minecraft:loot战利品表。路径最多256字节。字符串
friction摩擦组件:指定方块的摩擦力。
"minecraft:friction": 0.4字段功能描述类型
minecraft:friction值越大,摩擦力越大。一般方块的摩擦力是0.4。范围是。浮点数
crafting_table工作台组件:指定方块为工作台。
指定方块拥有工作台的能力。"minecraft:crafting_table": {
"crafting_tags": [
"crafting_table",
"custom_crafting_tag"
],
"table_name": ""
}字段功能描述类型
crafting_tags合成标签,最多64个标签,每个标签最多64字节。字符串列表
table_name本地化字符串,需要在.lang语言文件里表示出来。例如这里写“ui.custom_crafting”,需要在.lang文件里写“ui.custom_crafting=自定义工作台”。字符串原版工作台标签是 crafting_table。自定义标签可以写到自定义配方的crafting_tag数组里,表示这个配方可以用含有这个标签的工作台合成,只支持有序配方和无序配方。
custom_components自定义组件:指定方块的自定义组件。
"minecraft:custom_components": [
"complementary:sapling"
]字段功能描述类型
minecraft:custom_components字符串列表自定义组件的名称,可以有多个,方块排列覆盖时会完全覆盖。
tick计划刻组件:指定方块如何触发计划刻。
"minecraft:tick": {
"interval_range": [
20,
20
],
"looping": true
}字段功能描述类型
interval_range在这个数组中的两个数字之间生成随机值,作为方块下一次触发计划刻的时间,以刻为单位。数组
looping是否循环触发计划刻。布尔值
entity_fall_on组件:指定实体摔落在方块上时触发脚本的最小距离。
这个组件必须用在一个至少有4个像素高的方块上才能生效。"minecraft:entity_fall_on": {
"min_fall_distance": 0
}字段功能描述类型
min_fall_distance最小摔落距离。小于这个距离将不会触发脚本。浮点数
以上就是所有可用的组件了。有可能会有遗漏,我会尽力补充。也可以给方块添加标签,标签和组件同级。标签应该是下面这样的。
"tag:标签名字": {} //这里的标签名字最好使用命名空间ID。
标签似乎没有现成的用途。
自定义方块的标签会被原版物品忽略。
添加特定的标签可能可以给这个方块一些原版方块拥有的功能,然而不确定这样的标签的存在。
目前还没有已知办法给自定义方块加上合成标签,使其被配方文档中的{"tag":"..."}识别。对于此功能,请创建方块物品。
以下是方块的开发计划,可能不准确或不会实现。
[*]移除blocks.json。
[*]发布自定义重力方块的教程文档。
[*]同步 Java 版的方块标签。
[*]添加改变原版方块战利品表的功能。(短期)
[*]使自定义组件可以传参,并使其看起来更像其他组件,很可能需要脚本v2.0.0。(2025 年)
[*]添加colormap对自定义方块的支持,例如树叶和草地颜色。(2025 年,中长期)
[*]添加数据驱动原版方块模型ID。原版方块模型可能用了一些硬编码功能,也将添加这些功能。(长期)
[*]重新添加minecraft:unwalkable和minecraft:immovable这样的组件。
[*]通过minecraft:material_instances组件设置方块的纹理变种。(长期)
[*]自定义方块音效。(长期)
[*]添加“一个方块有多个碰撞箱”的功能。(长期)
[*]进一步设置方块红石属性,如定义接收红石信号的反应/发出红石信号。
[*]添加onBlockDestroyed触发器。(很久之后)
[*]尝试添加beforeOnPlayerInteract触发器。
[*]使方块可以含雪或含熔岩。
[*]逐渐实现原版所有方块的数据驱动。
[*]目前不会添加onBlockUpdate触发器,遇到了技术困难。
[*]目前不会添加通过SAPI修改方块模型的功能。
[*]绝对不会添加方块模型的polymesh。
注意:此段落所述功能已被移除,请使用脚本代替其功能。
然而,出于学习并理解旧版附加包的必要性,我保留了这个段落。
接下来是各种触发器组件,它们负责在某些条件下触发事件。所有的触发器组件都拥有"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" //事件名称
}
}
https://klpbbs.com/static/image/hrline/line1.png
总结
这一期,我把所有方块组件罗列了一遍。下一期,我们不讲方块事件,而是先把模型讲了,因为这篇教程里多次提到了模型。下下期讲战利品表,然后再讲方块事件。
第十期 第十一期 第十二期 阿巴无影 发表于 2023-1-12 19:22
这里错了
感谢反馈,已改正 这里错了 感谢苦力怕论坛
页: [1]