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
|
-- File table of contents
|
||||||
@ -64,29 +69,7 @@ local function copy_trigger_meta(meta)
|
|||||||
return new_meta
|
return new_meta
|
||||||
end
|
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.
|
--- Trigger registered callbacks if not already triggered.
|
||||||
-- Reset triggered_listeners to be able to recall the callback.
|
-- 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
|
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.
|
--- Trigger a walk listener by it's name.
|
||||||
-- Never called directly, use trigger_player_walk_listener_by_* functions
|
-- 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)
|
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