diff --git a/data/lua/on_event.lua b/data/lua/on_event.lua index 077f1c020ca2..9bbc0ab9bd75 100644 --- a/data/lua/on_event.lua +++ b/data/lua/on_event.lua @@ -3,19 +3,25 @@ local utils = wesnoth.require "wml-utils" -- so you have to call this function from a toplevel lua tag or from a preload event. -- It is also not possible to use this for first_time_only=yes events. +if rawget(_G, "core_on_event") then + return rawget(_G, "core_on_event") -- prevent double execution +end + local event_handlers = {} + local old_on_event = wesnoth.game_events.on_event or function(eventname) end wesnoth.game_events.on_event = function(eventname) old_on_event(eventname) local context = nil - for k,v in pairs(event_handlers[eventname] or {}) do + for _, entry in pairs(event_handlers[eventname] or {}) do if context == nil then context = wesnoth.current.event_context end - v.h(context) + entry.h(context) end end + local function on_event(eventname, arg1, arg2) if string.match(eventname, ",") then for elem in utils.split(eventname or "") do @@ -35,7 +41,7 @@ local function on_event(eventname, arg1, arg2) event_handlers[eventname] = event_handlers[eventname] or {} local eh = event_handlers[eventname] table.insert(eh, { h = handler, p = priority}) - -- sort it. + -- prioritize last entry for i = #eh - 1, 1, -1 do if eh[i].p < eh[i + 1].p then eh[i], eh[i + 1] = eh[i + 1], eh[i] @@ -43,4 +49,5 @@ local function on_event(eventname, arg1, arg2) end end +core_on_event = on_event return on_event