Fix multiple listener not being called with the same trigger.

This commit is contained in:
Karamel 2018-06-25 13:55:41 +02:00
parent 4cc361ea41
commit 90bcb40a93

@ -20,11 +20,11 @@ end
-- more than once per loop (player) if they are registered for more than one event
-- (for example triggered on walk on multiple groups)
local triggered_listeners = {}
local function set_listener_triggered(name, pos)
if not triggered_listeners.name then
triggered_listeners.name = {}
local function set_listener_triggered(listener_name, pos)
if not triggered_listeners[listener_name] then
triggered_listeners[listener_name] = {}
end
table.insert(triggered_listeners.name, pos)
table.insert(triggered_listeners[listener_name], pos)
end
--- Internal utility to create an empty table on first registration.
@ -39,10 +39,10 @@ local function get_subtable_or_create(mothertable, item)
end
--- Check if a listener can be triggered
local function is_callable(name, pos)
local function is_callable(listener_name, pos)
-- Check if not aleady called
if triggered_listeners.name then
for _, trigg_pos in ipairs(triggered_listeners.name) do
if triggered_listeners[listener_name] then
for _, trigg_pos in ipairs(triggered_listeners[listener_name]) do
if vector.equals(trigg_pos, pos) then
return false
end
@ -148,10 +148,10 @@ 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)
for name, callback in pairs(walk_listeners[trigger_name]) do
if is_callable(name, pos) then
for listener_name, callback in pairs(walk_listeners[trigger_name]) do
if is_callable(listener_name, pos) then
callback(player, pos, node, node_def, trigger_meta)
set_listener_triggered(trigger_name, pos)
set_listener_triggered(listener_name, pos)
end
end
end