mirror of
https://files.creativekara.fr/git/poschangelib.git
synced 2024-10-04 00:33:12 +02:00
Move registration functions into a dedicated file.
This commit is contained in:
parent
0d2f7c1b5b
commit
985262d6cb
74
init.lua
74
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 <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
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
|
Loading…
Reference in New Issue
Block a user