插件编写:方块、物品和合成
阅读
2020-10-18更新
最新编辑:pevernow
阅读:
更新日期:2020-10-18
最新编辑:pevernow
注册新的节点和材料,以及制作处方,对于许多模组来说是基本要求。
什么是方块和物品
节点、工艺品(或者是原材料)以及工具都是物品。物品是可以在库存中找到的东西,即使通过正常的游戏可能无法找到。<br/>
一个方块是一个可以被放置或者在这个世界中找得到的物品。世界上的每个位置都必须有一个且只有一个节点——看似空白的位置通常是空方块。<br/>
一个工艺品(或者是原材料)在这个世界里不能被放置,只能在物品库中或者在这个世界中作为掉落物品。<br/>
工具具有磨损能力,通常具有非默认挖掘功能。在未来,手工艺品和工具很可能会合并成一种物品,因为它们之间的区别是相当人为的。
注册物品
项定义由项名称和定义表组成。定义表包含影响项行为的属性。
minetest.register_craftitem("modname:itemname", {
description = "My Special Item",
inventory_image = "modname_itemname.png"
})
物品名称和别名
每个项都有一个用于引用它的项名称,该名称应采用以下格式:
modname:itemname
modname是项目注册所在的mod的名称,而itemname是项目本身的名称。项目名称应与项目的内容相关,并且无法注册。<br/>
项也可以有指向其名称的别名。别名是一个伪项名称,这会导致引擎将别名的任何出现视为项名称。它有两个主要的常见用途:
- 将已删除的项重命名为其他项。如果一个项目在没有任何修正代码的情况下从mod中移除,那么在世界和库存中可能会有未知的节点。如果可以获得remove节点,那么避免与无法获取的节点产生混淆是很重要的。
- 添加快捷方式。
/giveme dirt
比/giveme default:dirt
更简单。
注册一个别名非常简单。记住参数顺序的好方法是from → to
其中from是别名,to是目标。
minetest.register_alias("dirt", "default:dirt")
模组需要确保在直接处理项名称之前解析别名,因为引擎不会这样做。不过,这很简单:
itemname = minetest.registered_aliases[itemname] or itemname
贴图
贴图应该放在存放以modname_itemname.png
格式为命名的图片的textures/
文件夹。<br/>
支持JPEG贴图,但它们不支持透明度,在低分辨率下通常质量较差。通常情况下,最好使用PNG格式。<br/>
Minetest中的纹理通常为16×16像素。它们可以是任何分辨率,但建议按2的顺序排列,例如16、32、64或128。这是因为旧设备可能无法正确支持其他分辨率,从而导致性能下降。
注册一个基本方块
minetest.register_node("mymod:diamond", {
description = "Alien Diamond",
tiles = {"mymod_diamond.png"},
is_ground_content = true,
groups = {cracky=3, stone=1}
})
tiles
属性是节点将使用的纹理名称表。当只有一个贴图时,该贴图将在每一侧使用。要为每侧提供不同的贴图,请按以下顺序提供6个纹理的名称:
up (+Y), down (-Y), right (+X), left (-X), back (+Z), front (-Z).
(+Y, -Y, +X, -X, +Z, -Z)
记住,Minetest中的+Y是向上的,这是3D计算机图形的惯例。
minetest.register_node("mymod:diamond", {
description = "Alien Diamond",
tiles = {
"mymod_diamond_up.png", -- y+
"mymod_diamond_down.png", -- y-
"mymod_diamond_right.png", -- x+
"mymod_diamond_left.png", -- x-
"mymod_diamond_back.png", -- z+
"mymod_diamond_front.png", -- z-
},
is_ground_content = true,
groups = {cracky = 3},
drop = "mymod:diamond_fragments"
-- ^ Rather than dropping diamond, drop mymod:diamond_fragments
})
isgroundcontent属性允许在石头上生成洞穴。这对于地图生成过程中可能放置在地下的任何方块都是必不可少的。在一个地区的所有其他方块都生成之后,洞穴就被从这个世界上切断了。
行动和反馈
Minetest大量使用基于回调的模组设计。回调可以放在项定义表中,以允许响应各种不同的用户事件。
on_use
默认情况下,当玩家左键单击某个项目时,将触发使用回调。有一个使用回调可以防止该物品被用来挖掘节点。使用回调的一个常见用途是用于食品:
minetest.register_craftitem("mymod:mudpie", {
description = "Alien Mud Pie",
inventory_image = "myfood_mudpie.png",
on_use = minetest.item_eat(20),
})
提供给minetest.itemeat函数的数字是食用此食物时治愈的生命点数。玩家拥有的每个爱心图标值两个生命值。一个玩家通常可以有10颗心,相当于20个生命值。(一个爱心=2个生命值)连接点不必是整数(整数);它们可以是小数。<br/>
itemeat()是一个返回函数的函数,将其设置为on_use回调函数。这意味着上面的代码大致类似于:
minetest.register_craftitem("mymod:mudpie", {
description = "Alien Mud Pie",
inventory_image = "myfood_mudpie.png",
on_use = function(...)
return minetest.do_item_eat(20, nil, ...)
end,
})
通过简单地返回一个函数来理解item_eat的工作原理,可以修改它来执行更复杂的行为,例如播放自定义声音。
制作
有几种可用的工艺配方,由type
属性指示。
- shaped(规定形状配方) - 材料必须放在正确的位置。
- shapeless(无形状限制配方) - 无论你怎么摆放,只要数量正确即可。
- cooking(烹饪) - 需要通过熔炉制作物品。
- fuel(燃料) - 可在熔炉中燃烧的物品。
- tool_repair(可修复) - 可通过工具修复的物品。
工艺配方不是项,因此它们不使用项名称来唯一标识自己。<br/>
规定形状配方
规定形状的配方是指当原料需要在正确的位置才能制作物品。在下面的例子中,原料需要摆成椅子的形状才能工作。比如:
minetest.register_craft({
output = "mymod:diamond_chair 99",
recipe = {
{"mymod:diamond_fragments", "" },
{"mymod:diamond_fragments", "mymod:diamond_fragments"},
{"mymod:diamond_fragments", "mymod:diamond_fragments"}
}
})
类型字段实际上不需要用于成形工艺,因为规定形状是默认工艺类型。
无形状限制配方
无形状限制的配方是一种配方,当原材料放在哪里并不重要,只要配料在那里就可以制作物品。
minetest.register_craft({
type = "shapeless",
output = "mymod:diamond 3",
recipe = {
"mymod:diamond_fragments",
"mymod:diamond_fragments",
"mymod:diamond_fragments",
},
})
烹饪与燃料
如果该配料的类型为“烹饪”,那么就意味着不能在制作界面中(工艺网格)制作该物品。你需要使用熔炉,或者在其他模组中可以找到的其他烹调工具来烹调该物品。
minetest.register_craft({
type = "cooking",
output = "mymod:diamond_fragments",
recipe = "default:coalblock",
cooktime = 10,
})
代码中唯一真正的区别是,与在表中(大括号之间)相比,菜谱只是一个条目。它们还具有一个可选的“cooktime”参数,该参数定义了项目烹饪所需的时间。如果未设置,则默认为3。<br/>
当一个煤块放入输入槽,就可以使用以上配方制作物品,根据下面的燃料的类型。需要10秒才能产生钻石碎片!<br/>
这是类型是烹饪类型的附属品,它可以在熔炉中或者在在其他模组中可以找到的其他烹调工具的被燃烧。
minetest.register_craft({
type = "fuel",
recipe = "mymod:diamond",
burntime = 300,
})
它们不像其他配方一样可以输出物品,但是他们有一个按秒计算的燃烧时间。因此,钻石的燃烧时间是300秒!
组
物品可以组成一个组,一个组可以有许多成员(物品)。组是由groups
定义而成的列表,并且有相关联的值。
groups = {cracky = 3, wood = 1}
使用组有几个原因。首先,用组来描述挖掘类型和可燃性等性质。其次,可以在工艺配方中使用组而不是项名称,以允许使用组中的任何项。
minetest.register_craft({
type = "shapeless",
output = "mymod:diamond_thing 3",
recipe = {"group:wood", "mymod:diamond"}
})
工具,功能和挖掘类型
挖掘类型是用于定义使用不同工具挖掘方块时方块强度的组。具有较高关联值的dig类型组意味着方块更容易和更快地被挖掉。可以组合多个挖掘类型,以便更有效地使用多种类型的工具。没有挖掘类型的方块不能被任何工具挖掘。
组 | 推荐使用的工具 | 说明 |
---|---|---|
crumbly | spade(铲) | 土, 沙 |
cracky | pickaxe(斧) | Tough (but brittle) stuff like stone |
snappy | any(任何工具) | 可以被好的工具破坏;<br/>如:叶子,小植物,线, 金属片 |
choppy | axe(斧) | 可以被尖锐工具破坏;例如:树木,木板 |
fleshy | sword(剑) | 动物和玩家之类的生物。<br/>这就意味着被击中时可能会有掉血效果。 |
explody | ? | 特别容易爆炸 |
oddlybreakableby_hand | any(任何工具) | 挖起来非常容易的方块,如:火炬等 |
每个工具都有各自的能力。功能包括支持的挖掘类型列表,以及每种类型的相关属性,如挖掘时间和磨损量。工具对于每种类型也可以有最大的支持硬度,这使得可以防止较弱的工具挖掘较硬的节点。工具在其功能中包含所有挖掘类型是非常常见的,而不太合适的挖掘类型具有非常低效的属性。如果玩家当前使用的物品没有明确的工具能力,则该使用该工具挖掘的能力降低到相当于用手挖掘的能力。
minetest.register_tool("mymod:tool", {
description = "My Tool",
inventory_image = "mymod_tool.png",
tool_capabilities = {
full_punch_interval = 1.5,
max_drop_level = 1,
groupcaps = {
crumbly = {
maxlevel = 2,
uses = 20,
times = { [1]=1.60, [2]=1.20, [3]=0.80 }
},
},
damage_groups = {fleshy=2},
},
})
Groupcaps是挖掘节点支持的挖掘类型列表。伤害组是用来控制工具如何伤害物体的,这将在后面的物体,玩家和实体章节中讨论。