minetest 回调注册函数学习

.注册函数

仅在加载时候调用这些函数。


.全局回调的注册函数

仅在加载的时候调用这些函数。


  

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的修改已由回调处理好,否则返回falsenil,调用者将从itemstack中删除一个项目。

输入参数:

pos:放置的node位置。

`placer`可以是任何有效的ObjectRefnil。玩家。

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)时调用。

输入参数:

posnode位置。

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_singleplayertrue

   如果需要把这个权限作为基本权限授予给玩家,可以在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}param1param2可以省略,默认是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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值