mod_prefix = "ghost-counter-" NAME = require("shared/constants") require("scripts/core") require("scripts/events") require("scripts/gui") ---Creates all necessary global tables. function on_init() ---@type table Table of all `playerdata` tables, indexed by `player_index` global.playerdata = {} ---@type uint Last game tick where an event updated mod data global.last_event = 0 ---@type {min_update_interval: uint} Map settings table global.settings = {min_update_interval=settings.global[NAME.setting.min_update_interval].value --[[@as uint]]} ---@type table Contains registration status of different event handler groups global.events = {inventory=false, logistics=false, nth_tick=false} end script.on_init(on_init) ---Re-setups conditional event handlers. function on_load() -- Inventory/entity event handlers if global.events.inventory then script.on_event(defines.events.on_player_main_inventory_changed, on_player_main_inventory_changed) script.on_event(defines.events.on_player_cursor_stack_changed, on_player_main_inventory_changed) script.on_event(defines.events.on_entity_destroyed, on_ghost_destroyed) end -- Logistics event handler if global.events.logistics then script.on_event(defines.events.on_entity_logistic_slot_changed, on_entity_logistic_slot_changed) end -- nth_tick event handler if global.events.nth_tick then script.on_nth_tick(global.settings.min_update_interval, on_nth_tick) end end script.on_load(on_load) ---Validates mod data. function on_configuration_changed() -- Validate `playerdata.job` table and contents for _, playerdata in pairs(global.playerdata) do playerdata.job = playerdata.job or {} playerdata.job.area = playerdata.job.area or {} playerdata.job.ghosts = playerdata.job.ghosts or {} playerdata.job.requests = playerdata.job.requests or {} playerdata.job.requests_sorted = playerdata.job.requests_sorted or {} end end script.on_configuration_changed(on_configuration_changed) ---Re-registers event handlers if appropriate for joining player. ---@param event EventData.on_player_joined_game Event table function on_player_joined_game(event) local playerdata = get_make_playerdata(event.player_index) if playerdata.is_active then register_inventory_monitoring(true) end if playerdata.is_active or table_size(playerdata.logistic_requests) > 0 then register_logistics_monitoring(true) end end script.on_event(defines.events.on_player_joined_game, on_player_joined_game) ---Re-evaluates whether event handlers should continue to be bound. ---@param event EventData.on_player_left_game Event able function on_player_left_game(event) if not is_inventory_monitoring_needed() then register_inventory_monitoring(false) end if not is_logistics_monitoring_needed() then register_logistics_monitoring(false) end end script.on_event(defines.events.on_player_left_game, on_player_left_game) ---Deletes playerdata table associated with removed player. ---@param event EventData.on_player_removed Event table function on_player_removed(event) global.playerdata[event.player_index] = nil if not is_inventory_monitoring_needed() then register_inventory_monitoring(false) end if not is_logistics_monitoring_needed() then register_logistics_monitoring(false) end end script.on_event(defines.events.on_player_removed, on_player_removed) ---Listens to runtime settings changes. ---@param event EventData.on_runtime_mod_setting_changed Event table function on_runtime_mod_setting_changed(event) if event.setting == NAME.setting.min_update_interval then local new_value = settings.global[NAME.setting.min_update_interval].value --[[@as uint]] -- Reregister on_nth_tick event handler using the new minimum interval if global.events.nth_tick then ---@diagnostic disable-next-line script.on_nth_tick(nil) script.on_nth_tick(new_value, on_nth_tick) end global.settings.min_update_interval = new_value end end script.on_event(defines.events.on_runtime_mod_setting_changed, on_runtime_mod_setting_changed)