mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-13 15:14:52 +09:00
Updated Hotpatch to 1.1.11, might have fixed some desync issues
This commit is contained in:
1 parent
d859cb554a
commit
064ee0827a
2 files changed
+111
-28
No files matched your search
@@ -680,12 +680,16 @@ load_mod = function(installed_index)
|
||||
-- I blame Nexela for this
|
||||
path = path:gsub('/', '.')
|
||||
path = path:gsub('\\', '.')
|
||||
local alt_path = ''
|
||||
if env.package._current_path_in_package then
|
||||
path = env.package._current_path_in_package .. path
|
||||
alt_path = env.package._current_path_in_package .. path
|
||||
end
|
||||
if mod_obj.loaded_files[path] then
|
||||
debug_log({'hotpatch-trace.cached-load-require', path}, mod_name)
|
||||
return mod_obj.loaded_files[path]
|
||||
elseif mod_obj.loaded_files[alt_path] then
|
||||
debug_log({'hotpatch-trace.cached-load-require', alt_path}, mod_name)
|
||||
return mod_obj.loaded_files[alt_path]
|
||||
else
|
||||
local oldbase = env.package._current_path_in_package
|
||||
env.package._current_path_in_package = path:match('.+%..+%.')
|
||||
@@ -706,9 +710,29 @@ load_mod = function(installed_index)
|
||||
error(err)
|
||||
end
|
||||
end
|
||||
local file = global.mods[installed_index].files[alt_path]
|
||||
if file then
|
||||
debug_log({'hotpatch-trace.load-require', alt_path}, mod_name)
|
||||
local code, err = load(file, '[' .. mod_name .. '] ' .. alt_path .. '.lua', 'bt', env)
|
||||
if code then
|
||||
local result = code()
|
||||
mod_obj.loaded_files[alt_path] = result or true
|
||||
env.package._current_path_in_package = oldbase
|
||||
return mod_obj.loaded_files[alt_path]
|
||||
else
|
||||
debug_log(err, nil, 3)
|
||||
error(err)
|
||||
end
|
||||
end
|
||||
|
||||
debug_log({'hotpatch-trace.load-core-lib', path}, mod_name)
|
||||
env.package._current_path_in_package = oldbase
|
||||
return package.loaded[path]
|
||||
local lib = package.loaded[path]
|
||||
if not lib then
|
||||
debug_log(path .. ' not found', nil, 3)
|
||||
error(path .. ' not found')
|
||||
end
|
||||
return lib
|
||||
end
|
||||
end
|
||||
|
||||
@@ -812,9 +836,10 @@ run_mod = function(loaded_index)
|
||||
local mod = loaded_mods[loaded_index]
|
||||
if mod then
|
||||
local mod_name = mod.name
|
||||
local old_global = mod.env.global
|
||||
local old_global = table.deepcopy(mod.env.global)
|
||||
|
||||
if strict_mode then
|
||||
mod.env.global = {}
|
||||
--mod.env.global = {}
|
||||
end
|
||||
debug_log({'hotpatch-info.running'}, mod_name)
|
||||
|
||||
@@ -826,19 +851,31 @@ run_mod = function(loaded_index)
|
||||
if game and game.player then
|
||||
game.player.print(result)
|
||||
end
|
||||
unload_mod(loaded_index)
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
|
||||
if strict_mode then
|
||||
if mod.env.global ~= {} then
|
||||
--if mod.env.global ~= {} then
|
||||
--TODO: error, mod touched global inappropriately during load
|
||||
end
|
||||
mod.env.global = old_global
|
||||
--end
|
||||
--mod.env.global = old_global
|
||||
|
||||
end
|
||||
|
||||
|
||||
-- if a mod is being loaded that already has global data, it must be restored after
|
||||
-- running control.lua, discarding any changes made
|
||||
if not table.compare(old_global, {}) then
|
||||
for k,v in pairs(mod.env.global) do
|
||||
mod.env.global[k] = nil
|
||||
end
|
||||
for k,v in pairs(old_global) do
|
||||
mod.env.global[k] = v
|
||||
end
|
||||
--mod.env.global = old_global
|
||||
end
|
||||
old_global = nil
|
||||
|
||||
mod.running = true
|
||||
debug_log({'hotpatch-info.complete', {'hotpatch-info.running'}}, mod_name)
|
||||
|
||||
@@ -964,7 +1001,7 @@ mod_on_init = function(loaded_index)
|
||||
local success, result = xpcall(mod.on_init, debug.traceback)
|
||||
if not success then
|
||||
debug_log('on_init failed for ' .. mod.name)
|
||||
unload_mod(loaded_index)
|
||||
debug_log(result)
|
||||
return false
|
||||
end
|
||||
end
|
||||
@@ -980,10 +1017,11 @@ mod_on_load = function(loaded_index)
|
||||
if mod then
|
||||
debug_log({'hotpatch-trace.mod-on-load'}, mod.name)
|
||||
if mod.on_load then
|
||||
--local old_global = table.deepcopy(mod.env.global)
|
||||
local success, result = xpcall(mod.on_load, debug.traceback)
|
||||
if not success then
|
||||
debug_log('on_load failed for ' .. mod.name)
|
||||
unload_mod(loaded_index)
|
||||
debug_log(result)
|
||||
return false
|
||||
end
|
||||
end
|
||||
@@ -1002,7 +1040,7 @@ mod_on_configuration_changed = function(loaded_index, config)
|
||||
local success, result = xpcall(mod.on_configuration_changed, debug.traceback, config)
|
||||
if not success then
|
||||
debug_log('on_configuration_changed failed for ' .. mod.name)
|
||||
unload_mod(loaded_index)
|
||||
debug_log(result)
|
||||
return false
|
||||
end
|
||||
end
|
||||
@@ -1048,10 +1086,10 @@ register_nth_tick = function(mod_name, nth_tick)
|
||||
debug_log({'hotpatch-trace.on-nth-tick-event-registered', nth_tick}, mod_name)
|
||||
if found_event then
|
||||
debug_log({'hotpatch-trace.nth-tick-handler-added', nth_tick})
|
||||
script.on_nth_tick(event.nth_tick, on_nth_tick)
|
||||
script.on_nth_tick(nth_tick, on_nth_tick)
|
||||
else
|
||||
debug_log({'hotpatch-trace.nth-tick-handler-removed', nth_tick})
|
||||
script.on_nth_tick(event.nth_tick, nil)
|
||||
script.on_nth_tick(nth_tick, nil)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1063,18 +1101,18 @@ register_event = function(mod_name, event_name)
|
||||
local f = mod.on_event[event_name]
|
||||
if f then found_event = true break end
|
||||
end
|
||||
debug_log({'hotpatch-trace.on-event-registered', nth_tick}, mod_name)
|
||||
debug_log({'hotpatch-trace.on-event-registered', (event_names[event_name] or event_name)}, mod_name)
|
||||
if found_event then
|
||||
if script.get_event_handler(event_name) then
|
||||
-- handler already installed
|
||||
return
|
||||
else
|
||||
debug_log({'hotpatch-trace.on-event-handler-added', (event_names[event_name] or event_name)})
|
||||
script.on_event(event.event, on_event)
|
||||
script.on_event(event_name, on_event)
|
||||
end
|
||||
else
|
||||
debug_log({'hotpatch-trace.on-event-handler-removed', (event_names[event_name] or event_name)})
|
||||
script.on_event(event.event, nil)
|
||||
script.on_event(event_name, nil)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1095,7 +1133,7 @@ on_init = function()
|
||||
mod = static_mods[i]
|
||||
install_mod(mod.name, mod.version, mod.code, mod.files)
|
||||
end
|
||||
|
||||
-- TODO: fix mod error loading behaviours
|
||||
for i = 1, #global.mods do
|
||||
load_mod(i)
|
||||
end
|
||||
@@ -1150,10 +1188,21 @@ on_load = function()
|
||||
end
|
||||
|
||||
-- run mods which loaded successfully
|
||||
local failed_mods = {}
|
||||
for i = 1, #loaded_mods do
|
||||
run_mod(i)
|
||||
mod_on_load(i)
|
||||
if run_mod(i) then
|
||||
if not mod_on_load(i) then
|
||||
table.insert(failed_mods, i)
|
||||
end
|
||||
else
|
||||
table.insert(failed_mods, i)
|
||||
end
|
||||
end
|
||||
|
||||
-- unload mods which failed to run
|
||||
for i = 1, #failed_mods do
|
||||
unload_mod(failed_mods[i])
|
||||
end
|
||||
|
||||
debug_log({'hotpatch-info.complete', {'hotpatch-info.loading-installed-mods'}})
|
||||
debug_log({'hotpatch-info.complete', {'hotpatch-info.on-load'}})
|
||||
@@ -1161,9 +1210,16 @@ end
|
||||
|
||||
on_configuration_changed = function(config)
|
||||
debug_log({'hotpatch-info.on-configuration-changed'})
|
||||
local failed_mods = {}
|
||||
for i = 1, #loaded_mods do
|
||||
mod_on_configuration_changed(i)
|
||||
if not mod_on_configuration_changed(i) then
|
||||
table.insert(failed_mods, i)
|
||||
end
|
||||
end
|
||||
|
||||
for i = 1, #failed_mods do
|
||||
unload_mod(failed_mods[i])
|
||||
end
|
||||
debug_log({'hotpatch-info.complete', {'hotpatch-info.on-configuration-changed'}})
|
||||
end
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local hotpatch_tools = require 'hotpatch.mod-tools'
|
||||
hotpatch_tools.static_mod('hotpatch-remote-interface', '1.0.1', [===[
|
||||
hotpatch_tools.static_mod('hotpatch-remote-interface', '1.0.2', [===[
|
||||
--[[
|
||||
|
||||
Copyright 2018 Chrisgbk
|
||||
@@ -64,6 +64,14 @@ remote_interface['install'] = function(mod_name, mod_version, mod_code, mod_file
|
||||
-- examples: on_player_created
|
||||
local caller = game.player or console
|
||||
if caller.admin then
|
||||
if mod_files then
|
||||
for k,v in pairs(mod_files) do
|
||||
if k == 'control' then
|
||||
caller.print('ERROR: control.lua loaded twice for mod ' .. mod_name)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
local installed_index = find_installed_mod(mod_name)
|
||||
local loaded_index = find_loaded_mod(mod_name)
|
||||
if installed_index then
|
||||
@@ -89,16 +97,19 @@ remote_interface['install'] = function(mod_name, mod_version, mod_code, mod_file
|
||||
if loaded_index then
|
||||
if not run_mod(loaded_index) then
|
||||
caller.print('execution failed for mod ' .. mod_name)
|
||||
unload_mod(loaded_index)
|
||||
return
|
||||
end
|
||||
if not mod_on_init(loaded_index) then
|
||||
caller.print('on_init failed for mod ' .. mod_name)
|
||||
unload_mod(loaded_index)
|
||||
return
|
||||
end
|
||||
-- TODO: notify all mods
|
||||
-- TODO: determine vanilla behaviour and replicate it
|
||||
if not mod_on_configuration_changed(loaded_index, {mod_changes = {mod_name={new_version=version}}}) then
|
||||
if not mod_on_configuration_changed(loaded_index, {mod_changes = {mod_name={new_version=mod_version}}}) then
|
||||
caller.print('on_configuration_changed failed for mod ' .. mod_name)
|
||||
unload_mod(loaded_index)
|
||||
return
|
||||
end
|
||||
else
|
||||
@@ -138,16 +149,19 @@ remote_interface['run'] = function(mod_name)
|
||||
if loaded_index then
|
||||
if not run_mod(loaded_index) then
|
||||
caller.print('execution failed for mod ' .. mod_name)
|
||||
unload_mod(loaded_index)
|
||||
return
|
||||
end
|
||||
if not mod_on_init(loaded_index) then
|
||||
caller.print('on_init failed for mod ' .. mod_name)
|
||||
unload_mod(loaded_index)
|
||||
return
|
||||
end
|
||||
-- TODO: notify all mods
|
||||
-- TODO: determine vanilla behaviour and replicate it
|
||||
if not mod_on_configuration_changed(loaded_index, {mod_changes = {mod_name={new_version=version}}}) then
|
||||
caller.print('on_configuration_changed failed for mod ' .. mod_name)
|
||||
unload_mod(loaded_index)
|
||||
return
|
||||
end
|
||||
end
|
||||
@@ -163,6 +177,14 @@ remote_interface['update'] = function(mod_name, mod_version, mod_code, mod_files
|
||||
-- TODO: validation
|
||||
local caller = game.player or console
|
||||
if caller.admin then
|
||||
if mod_files then
|
||||
for k,v in pairs(mod_files) do
|
||||
if k == 'control' then
|
||||
caller.print('ERROR: control.lua loaded twice for mod ' .. mod_name)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
local installed_index = find_installed_mod(mod_name)
|
||||
local loaded_index = find_loaded_mod(mod_name)
|
||||
local old_version
|
||||
@@ -179,28 +201,33 @@ remote_interface['update'] = function(mod_name, mod_version, mod_code, mod_files
|
||||
loaded_index = find_loaded_mod(mod_name)
|
||||
if not run_mod(loaded_index) then
|
||||
caller.print('execution failed for mod ' .. mod_name)
|
||||
unload_mod(loaded_index)
|
||||
return
|
||||
end
|
||||
if old_version then
|
||||
if not mod_on_load(installed_index) then
|
||||
if not mod_on_load(loaded_index) then
|
||||
caller.print('on_load failed for mod ' .. mod_name)
|
||||
unload_mod(loaded_index)
|
||||
return
|
||||
end
|
||||
-- The mod must do any migrations here
|
||||
-- TODO: notify all mods
|
||||
if not mod_on_configuration_changed(installed_index, {mod_changes = {mod_name={old_version=old_version, new_version=mod_version}}}) then
|
||||
if not mod_on_configuration_changed(loaded_index, {mod_changes = {mod_name={old_version=old_version, new_version=mod_version}}}) then
|
||||
caller.print('on_configuration_changed failed for mod ' .. mod_name)
|
||||
unload_mod(loaded_index)
|
||||
return
|
||||
end
|
||||
else
|
||||
-- first time install
|
||||
if not mod_on_init(installed_index) then
|
||||
if not mod_on_init(loaded_index) then
|
||||
caller.print('on_init failed for mod ' .. mod_name)
|
||||
unload_mod(loaded_index)
|
||||
return
|
||||
end
|
||||
-- TODO: notify all mods
|
||||
if not mod_on_configuration_changed(installed_index, {mod_changes = {mod_name={new_version=mod_version}}}) then
|
||||
if not mod_on_configuration_changed(loaded_index, {mod_changes = {mod_name={new_version=mod_version}}}) then
|
||||
caller.print('on_configuration_changed failed for mod ' .. mod_name)
|
||||
unload_mod(loaded_index)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
Reference in new issue
Block a user