一.注册函数
仅在加载时候调用这些函数。
二.全局回调的注册函数
仅在加载的时候调用这些函数。
1.minetest.register_globalstep(func(dtime))
每个服务器的step时被调用,一般是0.05s。
dtime — 浮点的,自上一个全局step的时间。
示例:
local timer = 0
minetest.register_globalstep(function(dtime)
timer = timer + dtime;
if timer >= 5 then
-- Send "Minetest" to all players every 5 seconds
minetest.chat_send_all("Minetest")
timer = 0
end
end)
2.minetest.register_on_shutdown(func())
在服务器shutdown之前调用。一般可以保存数据。
注意:服务器异常终止时,可能不会调用。
3. minetest.register_on_placenode(func(pos, newnode, placer, oldnode, itemstack, pointed_thing))
当node已经place之后调用。不建议使用,尽可能在node定义中使用`on_construct` 或者 `after_place_node`。
如果返回“true”,表示itemstack的修改已由回调处理好,否则返回false或nil,调用者将从itemstack中删除一个项目。
输入参数:
pos:放置的node位置。
`placer`可以是任何有效的ObjectRef或nil。玩家。
pointed_thing 在0.4.10+中支持。
示例:(放置一个需要对周围做些更改的,可以使用这个回调函数)
minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing)
if oldnode ~= nil then
print("Node " .. oldnode.name .. " at " .. minetest.pos_to_string(pos) .. " replaced with " .. newnode.name .. " by " .. placer:get_player_name())
else
print("Node " .. newnode.name .. " at " .. minetest.pos_to_string(pos) .. " placed by " .. placer:get_player_name())
end
end)
4.minetest.register_on_dignode(func(pos, oldnode, digger))
当node被挖掘后调用。不推荐使用,尽可能在node定义中使用`on_destruct ` 或者 `after_dig_node `。
digger:是任何有效的ObjectRef。玩家。
示例:
minetest.register_on_dignode(function(pos, oldnode, digger)
print("Node " .. oldnode.name .. " at " .. minetest.pos_to_string(pos) .. " dug by " .. digger:get_player_name())
end)
5.minetest.register_on_punchnode(func(pos, node, puncher, pointed_thing))
当node被冲击、打(punch)时调用。
输入参数:
pos:node位置。
puncher:可以是任何有效的ObjectRef。玩家。
pointed_thing 在0.4.10中支持。
示例:(自己实现一个tool挖掘node的功能)
minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing)
if puncher:get_wielded_item():get_name() == "moretools:pick"
and node.name ~= "air" then
minetest.remove_node(pos)
puncher:get_inventory():add_item('main', node)
end
end)
6.minetest.register_on_generated(func(minp, maxp, blockseed))
生成世界上新的一片地方时调用。修改区域内的node比平常要快些。
minp, maxp:位置。
7.minetest.register_on_newplayer(func(ObjectRef))
在创建新玩家之后调用。
ObjectRef:创建了一个新的玩家ObjectRef,可用来对新创建的玩家进行一些操作。
8.minetest.register_on_dieplayer(func(ObjectRef))
当玩家死亡时调用。
如:玩家死亡时,物品保存问题,现在有些子游戏,死亡时保存物品,有些子游戏,死亡时物品存在bone中,有些死亡后物品丢失,都可以在这里处理player:get_inventory()。player:get_inventory():set_list("main", {})
9.minetest.register_on_punchplayer(func(player, hitter, time_from_last_punch, tool_capabilities, dir, damage))
当玩家被打时调用。返回`true`应该不会调用默认的punch损伤。
`player` - ObjectRef - 被打的玩家
`hitter` - ObjectRef - 攻打的玩家或者怪物等ObjectRef。
`time_from_last_punch`:从上次punch到现在的时间,可以用来屏蔽些垃圾敲击(可以为nil)。
`tool_capabilities`:使用工具的能力表(可以为nil)
`dir`:punch的方向。方向是从puncher到被punched的。
“damage” - 代表引擎估计的损伤值。
10.minetest.register_on_player_hpchange(func(player, hp_change), modifier)
当玩家受伤或治愈时调用,即健康值改变时调用。
`player` - ObjectRef - 玩家
hp_change ` - 改变量,当损伤时是负数。
`modifier`:当为true时,函数应该返回实际的`hp_change`。
注意:modifier只能得到一个临时的hp_change,后面的modifier可以修改它。
modifier可以返回true作为第二个参数来停止执行更多的函数。
11.minetest.register_on_respawnplayer(func(ObjectRef))
当玩家被重生时调用,在玩家重定位前调用。
在func中返回true,禁用普通玩家的放置方法。
12.minetest.register_on_prejoinplayer(func(name, ip))
玩家加入游戏前调用。(表示玩家正在试图connect进入)
返回值如果是string,则表示玩家是断开连接状态,原因即string的值。
13.minetest.register_on_joinplayer(func(ObjectRef))
玩家加入游戏时调用。
注意:有些函数在这个回调中不能正确工作。譬如:minetest.chat_send_player发送信息给刚刚创建好的玩家就会不起作用。如果要完成这个功能,可以使用minetest.after()延迟一段时间调用。minetest.after(时间,function())
示例:
minetest.register_on_joinplayer(function(player)
minetest.chat_send_all("Give a warm welcome to "..player:get_player_name().."!")
end)
14.minetest.register_on_leaveplayer(func(ObjectRef, timed_out))
当玩家离开游戏时调用。(可以处理一些玩家信息保存)
timed_out:超时时为真,其他原因时为false。
15.minetest.register_on_cheat(func(ObjectRef, cheat))
当玩家作弊时调用。
cheat:<cheat_type>中的一个。
moved_too_fast 、interacted_while_dead、finished_unknown_dig、dug_unbreakable、dug_too_fast。
16.minetest.register_on_chat_message(func(name, message))
当玩家说话发消息时调用。当返回true时,标识信息已经被处理了,信息如果是被标志处理过了,就不会再发给其他玩家了。
示例:
minetest.register_on_chat_message(function(name, message)
if name == "singleplayer"
and message == "please grant me everything" then
minetest.set_player_privs(name, minetest.registered_privileges)
minetest.chat_send_player(name, "<thisguy> ok")
end
end)
17.minetest.register_on_player_receive_fields(func(player, formname, fields))
当玩家库存表中的按钮被按下时调用。
示例:
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname == "default:team_choose" then -- This is your form name
print("Player "..player:get_player_name().." submitted fields "..dump(fields))
end
end)
18.minetest.register_on_craft(func(itemstack, player, old_craft_grid, craft_inv))
当玩家合成东西的时候调用。不适用于熔炉。default:book_written
itemstack是输出
old_craft_grid 包含配方
craft_inv是合成网格的库存
返回一个`ItemStack`替换输出(itemstack)或nil不修改它。
19.minetest.register_craft_predict(func(itemstack, player, old_craft_grid, craft_inv))
和上面的功能一样,除了这个是在玩家合成前调用,做一个合成预测,其它不做任何改变。
(后期合成长时间才能出来的物品,可能这个作用就体现出来)
20.minetest.register_on_protection_violation(func(pos, name))
当玩家在一个保护位置进行操作时调用,一般会在mod和builtin中调用。(譬如挖一个node或者是打一个受保护的entity)我们mod中的protector没有使用这个回调。允许多重保护。
这个注册的回调函数当使用minetest.record_protection_violation时会回调过来。
示例:
-- Show a message to protection violators
minetest.register_on_protection_violation(function(pos, name)
if not mymod:can_interact(pos, name) then
local pos_string = minetest.pos_to_string(pos)
local owner_string = mymod:get_owner_string(pos)
minetest.chat_send_player(name, pos_string.." is protected by "..owner_string)
end
end)
-- Damage protection violators
minetest.register_on_protection_violation(function(pos, name)
local player = minetest.get_player_by_name(name)
if not player then return end
player:set_hp(math.max(player:get_hp() - 1, 0))
end)
21.minetest.register_on_item_eat(func(hp_change, replace_with_item, itemstack, user, pointed_thing))
当一个item被吃掉时调用。使用`minetest.item_eat`之后调用。可用于0.4.10+。
返回“true”或“itemstack”取消默认的食物反应(即:hp增加)。
hp_change - 吃掉item带来的HP更改值,minetest.item_eat()中获得。
replace_with_item - 替换item,在add_item()中使用。 可以是nil。
itemstack - 包含被玩家吃掉的item,从on_use回调过来。
user - 玩家对象,吃掉item的玩家,从on_use回调过来。
pointed_thing - 玩家正在吃东西时候看向的地方,从on_use回调过来。
22.minetest.register_on_priv_grant(function(name, granter, priv))
当“granter”给“name”授予权限“priv”时调用。如果是由一个玩家设置权限,这个回调会被调用两次;一次granter是玩家名,一次granter是nil。
23.minetest.register_on_priv_revoke(function(name, revoker, priv))
当“revoker”给“name”撤销权限“priv”时调用。如果是由一个玩家撤销权限,这个回调会被调用两次;一次revoker是玩家名,一次revoker是nil。
24.minetest.register_can_bypass_userlimit(function(name, ip))
当用户名为`name`的用户使用`ip`连接时调用。
绕过玩家限制返回“true”。
25.minetest.register_on_modchannel_message(func(channel_name, sender, message))
当一个传入的mod信道消息被接收时调用。应该加入一些通道来接收事件。
*如果消息来自服务器mod,`sender`字段是一个空字符串。
三、其它注册函数
1.minetest.register_chatcommand(cmd, chatcommand definition)
注册一个聊天命令。
cmd:命令的名字。
chatcommand definition:定义一个表,一般有以后几个参数。
示例:
minetest.register_chatcommand("say", {
params = "<text>",
description = "Send text to chat",
privs = {talk = true},
func = function( _ , text)
minetest.chat_send_all(text)
return true, "Text was sent successfully"
end,
})
2.minetest.override_chatcommand(name, redefinition)
重写一个聊天命令。采用minetest.register_chatcommand注册的聊天命令。
3.minetest.unregister_chatcommand(name)
注销一个聊天命令。
4.minetest.register_privilege(name, definition)
注册一个权限。
definition:
description = "description text"
{description = ”description text“,give_to_singleplayer = boolean},默认give_to_singleplayer为true。
如果需要把这个权限作为基本权限授予给玩家,可以在minetest.conf中的basic_privs中修改。
可以有如下两个回调函数使用,不一定需要肯定实现。
on_grant(name, granter_name)
on_revoke(name, revoker_name)
示例:
minetest.register_privilege("fly", {
description = "Player can fly around using the free_move mode.",
give_to_singleplayer= false,
})
5.minetest.register_authentication_handler(authentication handler definition)
示例:
builtin.authentication
minetest.register_authentication_handler({
get_auth = function(name) return {password="foo", priveleges={shout=true}} end,
create_auth = function(name, password) end,
set_password = function(name, password) return true end,
set_privileges = function(name, privileges) end,
})
四.环境访问
1.minetest.set_node(pos, node)
2.minetest.add_node(pos, node)
将pos处设成node。
node:表格{name=string, param1=number, param2=number},param1和param2可以省略,默认是0.
示例:minetest.set_node({x=0, y=10, z=0}, {name="default:wood"})
3.minetest.swap_node(pos, node)
将pos处设成node,但不移除元数据。
4.minetest.remove_node(pos)
和minetest.set_node(pos, {name="air”})功能一致。
5.minetest.get_node(pos)
返回位置pos处的node,返回格式如:{name="node_name", param1=10, param2=0}。未加载的区域返回{name="ignore", param1=0, param2=0}。
6.minetest.get_node_or_nil(pos)
和minetest.get_node功能一样,未加载区域返回nil。
7.minetest.get_node_light(pos, timeofday)
获取pos处的光照值。
timeofday`:`nil`为当前时间,`0`为夜晚,`0.5`为白天。
返回“0”和“15”或“nil”之间的数字。
8.minetest.place_node(pos, node)
程序实现放置一个node,和玩家防止node效果一致。
9.minetest.dig_node(pos)
程序实现挖一个node,和玩家挖一个node效果一致。
成功返回“true”,失败返回“false”(譬如保护区域)。
10.
参考资料:
1.http://dev.minetest.net/Global_Minetest_object
2.https://github.com/minetest/minetest/blob/master/doc/lua_api.txt