Move registration functions into a dedicated file.

This commit is contained in:
Karamel 2020-12-29 23:50:04 +01:00
parent 0d2f7c1b5b
commit 985262d6cb
2 changed files with 70 additions and 68 deletions

@ -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 <player>, <old_pos>, <new_pos> arguments.
-- The first call will have <old_pos> 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 <player>, <pos>, <node>,
-- <node definition> 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)

64
register.lua Normal file

@ -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 <player>, <old_pos>, <new_pos> arguments.
-- The first call will have <old_pos> 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 <player>, <pos>, <node>,
-- <node definition> 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