1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-11-23 22:22:34 +02:00
Files
ComfyFactorio/utils/event_core.lua
Gerkiz 595b8caeb4 II: tweaks and changes
Some techs are now locked behind islands.
Text is printed out to chat when a new tech is unlocked.

Basic loot is added to the ammo chest whenever the player progresses manually towards the next island.

Fixed an issue with biters attacking an island too soon.

Fixed an issue with terrain generation.
2025-11-04 22:30:36 +01:00

164 lines
4.5 KiB
Lua

-- This module exists to break the circular dependency between event.lua and storage.lua.
-- It is not expected that any user code would require this module instead event.lua should be required.
local Public = {}
local init_event_name = -1
local load_event_name = -2
local configuration_changed_name = -3
-- map of event_name to handlers[]
local event_handlers = {}
-- map of nth_tick to handlers[]
local on_nth_tick_event_handlers = {}
local xpcall = xpcall
local trace = debug.traceback
local log = log
local script_on_event = script.on_event
local script_on_nth_tick = script.on_nth_tick
local script_on_configuration_changed = script.on_configuration_changed
local function handler_error(err)
log('\n\t' .. trace(err))
end
local function call_handlers(handlers, event)
for i = 1, #handlers do
if _DEBUG then
local handler = handlers[i]
if handler then
handler(event)
end
else
xpcall(handlers[i], handler_error, event)
end
end
end
local function on_event(event)
local handlers = event_handlers[event.name]
if not handlers then
handlers = event_handlers[event.input_name]
end
call_handlers(handlers, event)
end
local function on_init()
_LIFECYCLE = 5 -- on_init
local handlers = event_handlers[init_event_name]
call_handlers(handlers)
event_handlers[init_event_name] = nil
event_handlers[load_event_name] = nil
_LIFECYCLE = 8 -- Runtime
end
local function on_load()
_LIFECYCLE = 6 -- on_load
local handlers = event_handlers[load_event_name]
call_handlers(handlers)
event_handlers[init_event_name] = nil
event_handlers[load_event_name] = nil
_LIFECYCLE = 8 -- Runtime
end
local function configuration_changed()
_LIFECYCLE = 7 -- config_change
local handlers = event_handlers[configuration_changed_name]
call_handlers(handlers)
event_handlers[configuration_changed_name] = nil
_LIFECYCLE = 8 -- Runtime
end
local function on_nth_tick_event(event)
local handlers = on_nth_tick_event_handlers[event.nth_tick]
call_handlers(handlers, event)
end
--- Do not use this function, use Event.add instead as it has safety checks.
function Public.add(event_name, handler)
local handlers = event_handlers[event_name]
if not handlers then
event_handlers[event_name] = { handler }
script_on_event(event_name, on_event)
else
table.insert(handlers, handler)
if #handlers == 1 then
script_on_event(event_name, on_event)
end
end
end
--- Do not use this function, use Event.on_init instead as it has safety checks.
function Public.on_init(handler)
local handlers = event_handlers[init_event_name]
if not handlers then
event_handlers[init_event_name] = { handler }
script.on_init(on_init)
else
table.insert(handlers, handler)
if #handlers == 1 then
script.on_init(on_init)
end
end
end
--- Do not use this function, use Event.on_configuration_changed instead as it has safety checks.
function Public.on_configuration_changed(handler)
local handlers = event_handlers[configuration_changed_name]
if not handlers then
event_handlers[configuration_changed_name] = { handler }
script_on_configuration_changed(configuration_changed)
else
table.insert(handlers, handler)
if #handlers == 1 then
script.on_configuration_changed(configuration_changed)
end
end
end
--- Do not use this function, use Event.on_load instead as it has safety checks.
function Public.on_load(handler)
local handlers = event_handlers[load_event_name]
if not handlers then
event_handlers[load_event_name] = { handler }
script.on_load(on_load)
else
table.insert(handlers, handler)
if #handlers == 1 then
script.on_load(on_load)
end
end
end
--- Do not use this function, use Event.on_nth_tick instead as it has safety checks.
function Public.on_nth_tick(tick, handler)
local handlers = on_nth_tick_event_handlers[tick]
if not handlers then
on_nth_tick_event_handlers[tick] = { handler }
script_on_nth_tick(tick, on_nth_tick_event)
else
table.insert(handlers, handler)
if #handlers == 1 then
script_on_nth_tick(tick, on_nth_tick_event)
end
end
end
function Public.get_event_handlers()
return event_handlers
end
function Public.get_on_nth_tick_event_handlers()
return on_nth_tick_event_handlers
end
return Public