108 lines
4.2 KiB
Lua
108 lines
4.2 KiB
Lua
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<uint, Playerdata> 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<string, boolean> 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)
|