97 lines
3.8 KiB
Lua
97 lines
3.8 KiB
Lua
--- Configuration changed event handling.
|
|
-- This module registers events
|
|
-- @module Changes
|
|
-- @usage require('stdlib/event/changes')
|
|
|
|
local Event = require('stdlib/event/event')
|
|
|
|
local Changes = {
|
|
_module_name = 'Changes'
|
|
}
|
|
setmetatable(Changes, {__index = require('stdlib/core')})
|
|
|
|
--[[
|
|
ConfigurationChangedData
|
|
Table with the following fields:
|
|
old_version :: string (optional): Old version of the map. Present only when loading map version other than the current version.
|
|
new_version :: string (optional): New version of the map. Present only when loading map version other than the current version.
|
|
mod_changes :: dictionary string → ModConfigurationChangedData: Dictionary of mod changes. It is indexed by mod name.
|
|
ModConfigurationChangedData
|
|
Table with the following fields:
|
|
old_version :: string: Old version of the mod. May be nil if the mod wasn't previously present (i.e. it was just added).
|
|
new_version :: string: New version of the mod. May be nil if the mod is no longer present (i.e. it was just removed).
|
|
--]]
|
|
Changes.versions = prequire('changes/versions') or {}
|
|
Changes['map-change-always-first'] = prequire('changes/map-change-always-first')
|
|
Changes['any-change-always-first'] = prequire('changes/any-change-always-first')
|
|
Changes['mod-change-always-first'] = prequire('changes/mod-change-always-first')
|
|
Changes['mod-change-always-last'] = prequire('changes/mod-change-always-last')
|
|
Changes['any-change-always-last'] = prequire('changes/any-change-always-last')
|
|
Changes['map-change-always-last'] = prequire('changes/map-change-always-last')
|
|
|
|
local function run_if_exists(func)
|
|
return func and type(func) == 'function' and func()
|
|
end
|
|
|
|
--[Mark all migrations as complete during Init]--
|
|
function Changes.on_init()
|
|
local list = {}
|
|
local cur_version = game.active_mods[script.mod_name]
|
|
for ver in pairs(Changes.versions) do
|
|
list[ver] = cur_version
|
|
end
|
|
global._changes = list
|
|
end
|
|
|
|
function Changes.on_configuration_changed(event)
|
|
run_if_exists(Changes['map-change-always-first'])
|
|
if event.mod_changes then
|
|
run_if_exists(Changes['any-change-always-first'])
|
|
if event.mod_changes[script.mod_name] then
|
|
run_if_exists(Changes['mod-change-always-first'])
|
|
local this_mod_changes = event.mod_changes[script.mod_name]
|
|
Changes.on_mod_changed(this_mod_changes)
|
|
log('Version changed from ' .. tostring(this_mod_changes.old_version) .. ' to ' .. tostring(this_mod_changes.new_version))
|
|
run_if_exists(Changes['mod-change-always-last'])
|
|
end
|
|
run_if_exists(Changes['any-change-always-last'])
|
|
end
|
|
run_if_exists(Changes['map-change-always-last'])
|
|
end
|
|
|
|
function Changes.on_mod_changed(this_mod_changes)
|
|
global._changes = global._changes or {}
|
|
|
|
local old = this_mod_changes.old_version
|
|
if old then -- Find the last installed version
|
|
for ver, func in pairs(Changes.versions) do
|
|
if not global._changes[ver] then
|
|
run_if_exists(func)
|
|
global._changes[ver] = old
|
|
log('Migration completed for version ' .. ver)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function Changes.register_events()
|
|
Event.register(Event.core_events.configuration_changed, Changes.on_configuration_changed)
|
|
Event.register(Event.core_events.init, Changes.on_init)
|
|
return Changes
|
|
end
|
|
|
|
--[Always run these before any migrations]--
|
|
--Changes["map-change-always-first"] = function() end
|
|
--Changes["any-change-always-first"] = function() end
|
|
--Changes["mod-change-always-first"] = function() end
|
|
|
|
--Mod version changes made
|
|
--Changes.version["0.0.1"] = function() end
|
|
|
|
--[Always run these at the end]--
|
|
--Changes["mod-change-always-last"] = function() end
|
|
--Changes["any-change-always-last"] = function() end
|
|
--Changes["map-change-always-last"] = function() end
|
|
|
|
return Changes
|