From 985262d6cb2eb524dadae4d7da42598ace0ac8df Mon Sep 17 00:00:00 2001 From: Karamel Date: Tue, 29 Dec 2020 23:50:04 +0100 Subject: [PATCH] Move registration functions into a dedicated file. --- init.lua | 74 +++++----------------------------------------------- register.lua | 64 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 68 deletions(-) create mode 100644 register.lua diff --git a/init.lua b/init.lua index 4545397..28c6c90 100644 --- a/init.lua +++ b/init.lua @@ -1,4 +1,9 @@ -poschangelib = {} +poschangelib = { + player_pos_listeners = {}, + walk_listeners = {}, +} + +dofile(minetest.get_modpath(minetest.get_current_modname()) .. '/register.lua') --[[ -- File table of contents @@ -64,29 +69,7 @@ local function copy_trigger_meta(meta) return new_meta end ---[[ --- Player position listeners ---]] ---- Callback table filled with add_player_pos_listener. -local player_listeners = {} - ---- Register a callback that will be called everytime a player moves. --- @param name Unique name of the callback. Used to remove. --- @param callback Callback function. Take , , arguments. --- The first call will have set to nil. -function poschangelib.add_player_pos_listener(name, callback) - if player_listeners[name] then - minetest.log('error', 'Player pos listener ' .. name .. ' is already registered') - return - end - player_listeners[name] = callback -end - ---- Remove a registered callback. It won't be called anymore. -function poschangelib.remove_player_pos_listener(name) - if player_listeners[name] then player_listeners[name] = nil end -end --- Trigger registered callbacks if not already triggered. -- Reset triggered_listeners to be able to recall the callback. @@ -100,51 +83,6 @@ local function trigger_player_position_listeners(player, old_pos, pos, trigger_m end ---[[ --- Walk listeners ---]] - ---- Callback tables filled with add_player_walk_listener. --- Indexed by node groups as "group:name" or node names. -local walk_listeners = {} - ---- Register a callback that will be called everytime a player moves on a block. --- @param callback Callback function. Takes , , , --- as arguments. --- Node is the node below the player's position. --- @param nodenames List of node names or group (with 'group:X') to observe. --- The callback will be triggered only if the block has the same name or --- has one of these groups. -function poschangelib.add_player_walk_listener(name, callback, nodenames) - for _, nodename in ipairs(nodenames) do - if not walk_listeners[nodename] then walk_listeners[nodename] = {} end - if walk_listeners[nodename][name] then - minetest.log('error', 'Walk listener ' .. name .. ' is already registered') - end - walk_listeners[nodename][name] = callback - end -end - -function poschangelib.remove_player_walk_listener(name, nodenames) - local counts = {} - for _, nodename in ipairs(nodenames) do - if not counts[nodename] then counts[nodename] = 0 end - counts[nodename] = counts[nodename] + 1 - if walk_listeners[nodename] and walk_listeners[nodename][name] then - walk_listeners[nodename][name] = nil - counts[nodename] = counts[nodename] - 1 - end - end - -- If no listener left for the group, remove the group - -- to be able to skip node check if there are none left - for _, nodename in pairs(counts) do - if counts[nodename] == 0 then - walk_listeners[nodename] = nil - end - end -end - - --- Trigger a walk listener by it's name. -- Never called directly, use trigger_player_walk_listener_by_* functions local function trigger_player_walk_listeners(trigger_name, player, pos, node, node_def, trigger_meta) diff --git a/register.lua b/register.lua new file mode 100644 index 0000000..ee194f6 --- /dev/null +++ b/register.lua @@ -0,0 +1,64 @@ +--[[ +-- Player position listeners +--]] + +--- Register a callback that will be called everytime a player moves. +-- @param name Unique name of the callback. Used to remove. +-- @param callback Callback function. Take , , arguments. +-- The first call will have set to nil. +function poschangelib.add_player_pos_listener(name, callback) + if poschangelib.player_pos_listeners[name] then + minetest.log('error', 'Player pos listener ' .. name .. ' is already registered') + return + end + poschangelib.player_pos_listeners[name] = callback +end + +--- Remove a registered callback. It won't be called anymore. +function poschangelib.remove_player_pos_listener(name) + if poschangelib.player_pos_listeners[name] then + poschangelib.player_pos_listeners[name] = nil + end +end + +--[[ +-- Walk listeners +--]] + +--- Register a callback that will be called everytime a player moves on a block. +-- @param callback Callback function. Takes , , , +-- as arguments. +-- Node is the node below the player's position. +-- @param nodenames List of node names or group (with 'group:X') to observe. +-- The callback will be triggered only if the block has the same name or +-- has one of these groups. +function poschangelib.add_player_walk_listener(name, callback, nodenames) + for _, nodename in ipairs(nodenames) do + if not poschangelib.walk_listeners[nodename] then + poschangelib.walk_listeners[nodename] = {} + end + if poschangelib.walk_listeners[nodename][name] then + minetest.log('error', 'Walk listener ' .. name .. ' is already registered') + end + poschangelib.walk_listeners[nodename][name] = callback + end +end + +function poschangelib.remove_player_walk_listener(name, nodenames) + local counts = {} + for _, nodename in ipairs(nodenames) do + if not counts[nodename] then counts[nodename] = 0 end + counts[nodename] = counts[nodename] + 1 + if poschangelib.walk_listeners[nodename] and poschangelib.walk_listeners[nodename][name] then + poschangelib.walk_listeners[nodename][name] = nil + counts[nodename] = counts[nodename] - 1 + end + end + -- If no listener left for the group, remove the group + -- to be able to skip node check if there are none left + for _, nodename in pairs(counts) do + if counts[nodename] == 0 then + poschangelib.walk_listeners[nodename] = nil + end + end +end