diff --git a/lib/scenarios/Hotpatch/control.lua b/lib/scenarios/Hotpatch/control.lua index b5b66946..e4cdb947 100644 --- a/lib/scenarios/Hotpatch/control.lua +++ b/lib/scenarios/Hotpatch/control.lua @@ -98,7 +98,7 @@ files['testfolder.test'] = [===[ ]===] files['test'] = [===[ - require 'testfolder.test' + require 'testfolder.test' ]===] hotpatch_tools.static_mod('require-test', '1.0.0', [===[ diff --git a/lib/scenarios/Hotpatch/hotpatch/commands.lua b/lib/scenarios/Hotpatch/hotpatch/commands.lua index 43ffbc80..efd02d0a 100644 --- a/lib/scenarios/Hotpatch/hotpatch/commands.lua +++ b/lib/scenarios/Hotpatch/hotpatch/commands.lua @@ -61,11 +61,11 @@ sub_commands = { if (not param) or (param == '') then caller.print('Usage: /hotpatch [command] [parameters]') caller.print('Available commands:') - for k, v in pairs(sub_commands) do caller.print(k) end + for k, _ in pairs(sub_commands) do caller.print(k) end caller.print('Use /hotpatch help [command] for help on a particular command') else local text = help_commands[param] - if text then + if text then caller.print(text) end end @@ -82,7 +82,7 @@ sub_commands = { caller.print(table.concat{'[', k, '] ', v.name, ' ', v.version, ' ', (v.loaded and 'loaded') or 'not loaded', ' ', (v.running and 'running') or 'not running'}) end else - + end end, } @@ -113,7 +113,7 @@ local admin_commands = { _ENV.commands.add_command('hotpatch', 'Commands for hotpatch. Run /hotpatch help for details.', function(e) local caller = (e.player_index and game.players[e.player_index]) or console - if (not e.parameter) or (e.parameter == '') then + if (not e.parameter) or (e.parameter == '') then sub_commands['help'](e.player_index) return end @@ -130,6 +130,6 @@ _ENV.commands.add_command('hotpatch', 'Commands for hotpatch. Run /hotpatch help end end) -]===]) +--]===]) return true \ No newline at end of file diff --git a/lib/scenarios/Hotpatch/hotpatch/gui.lua b/lib/scenarios/Hotpatch/hotpatch/gui.lua index 06acdbb1..481eb4b6 100644 --- a/lib/scenarios/Hotpatch/hotpatch/gui.lua +++ b/lib/scenarios/Hotpatch/hotpatch/gui.lua @@ -55,26 +55,26 @@ script.on_event(defines.events.on_player_joined_game, function(e) local top = mod_gui.get_button_flow(player) local left = mod_gui.get_frame_flow(player) local center = player.gui.center - + local button = top['hotpatch-button'] if button then button.destroy() end local menu = left['hotpatch-menu'] - if menu then + if menu then menu.destroy() end - + local IDE = center['hotpatch-IDE'] - if IDE then + if IDE then IDE.destroy() end - + local main = center['hotpatch-main'] - if main then + if main then main.destroy() end - + button = top.add{type = 'sprite-button', name = 'hotpatch-button', sprite='utility/heat_exchange_indication', tooltip = 'Hotpatch', style = mod_gui.button_style} end) @@ -89,26 +89,26 @@ on_gui_click_handlers = { local top = mod_gui.get_button_flow(player) local left = mod_gui.get_frame_flow(player) local center = player.gui.center - + local menu = left['hotpatch-menu'] if not menu then menu = left.add{type = 'frame', name = 'hotpatch-menu', direction = 'vertical'} menu.add{type = 'button', name = 'hotpatch-menu.IDE', caption = 'Mod IDE', tooltip = 'Open debugging GUI'} menu.add{type = 'button', name = 'hotpatch-menu.console', caption = 'Mod Console', tooltip = 'Open debugging console'} - menu.style.visible = true + menu.visible = true return end - menu.style.visible = not menu.style.visible + menu.visible = not menu.visible end, ['hotpatch-menu'] = function(e) local player = game.players[e.player_index] local top = mod_gui.get_button_flow(player) local left = mod_gui.get_frame_flow(player) local center = player.gui.center - + local menu = left['hotpatch-menu'] - menu.style.visible = not menu.style.visible - + menu.visible = not menu.visible + on_gui_click_handlers[e.element.name](e) end, ['hotpatch-menu.IDE'] = function(e) @@ -116,7 +116,7 @@ on_gui_click_handlers = { local top = mod_gui.get_button_flow(player) local left = mod_gui.get_frame_flow(player) local center = player.gui.center - + local IDE = center['hotpatch-IDE'] if not IDE then IDE = center.add{type = 'frame', name = 'hotpatch-IDE', direction = 'vertical', caption = 'Hotpatch IDE', style = mod_gui.frame_style} @@ -132,22 +132,22 @@ on_gui_click_handlers = { local code = IDE_table.add{type = 'text-box', name = 'hotpatch-IDE-code'} code.word_wrap = true files.style.width = 400 - files.style.cell_spacing = 0 + files.style.cell_padding = 0 files.style.top_padding = 0 files.style.bottom_padding = 0 code.style.width = 600 code.style.height = 600 - IDE.style.visible = false + IDE.visible = false end - + local IDE_dropdown = IDE['hotpatch-IDE-top']['hotpatch-IDE-mod-selector'] IDE_dropdown.clear_items() - for k, v in ipairs(installed_mods) do + for _, v in ipairs(installed_mods) do IDE_dropdown.add_item(v.name) end - - IDE.style.visible = not IDE.style.visible - if IDE.style.visible then + + IDE.visible = not IDE.visible + if IDE.visible then player.opened = IDE else player.opened = nil @@ -158,15 +158,15 @@ on_gui_click_handlers = { local top = mod_gui.get_button_flow(player) local left = mod_gui.get_frame_flow(player) local center = player.gui.center - - local console = center['hotpatch-console'] - if not console then - console = center.add{type = 'frame', name = 'hotpatch-console', direction = 'vertical', caption = 'Hotpatch Console'} - local top_flow = console.add{type = 'flow', name = 'hotpatch-console-top', direction = 'horizontal'} + + local hotpatch_console = center['hotpatch-console'] + if not hotpatch_console then + hotpatch_console = center.add{type = 'frame', name = 'hotpatch-console', direction = 'vertical', caption = 'Hotpatch Console'} + local top_flow = hotpatch_console.add{type = 'flow', name = 'hotpatch-console-top', direction = 'horizontal'} top_flow.add{type = 'label', name = 'hotpatch-console-mod-label', caption = 'Mod: '} local console_dropdown = top_flow.add{type = 'drop-down', name = 'hotpatch-console-mod-selector'} top_flow.add{type = 'label', name = 'hotpatch-console-mod-version', caption = 'Version: No mod selected'} - local bottom_flow = console.add{type = 'flow', name = 'hotpatch-console-bottom', direction = 'vertical'} + local bottom_flow = hotpatch_console.add{type = 'flow', name = 'hotpatch-console-bottom', direction = 'vertical'} local output = bottom_flow.add{type = 'text-box', name = 'hotpatch-console-output'} local bottom_input_flow = bottom_flow.add{type = 'flow', name = 'hotpatch-console-bottom-input', direction = 'horizontal'} local input = bottom_input_flow.add{type = 'textfield', name = 'hotpatch-console-input'} @@ -174,53 +174,54 @@ on_gui_click_handlers = { output.style.width = 800 output.style.height = 600 input.style.width = 600 + hotpatch_console.visible = false end - - local console_dropdown = console['hotpatch-console-top']['hotpatch-console-mod-selector'] + + local console_dropdown = hotpatch_console['hotpatch-console-top']['hotpatch-console-mod-selector'] console_dropdown.clear_items() - for k, v in ipairs(loaded_mods) do + for _, v in ipairs(loaded_mods) do console_dropdown.add_item(v.name) end - - console.style.visible = not console.style.visible - if console.style.visible then - player.opened = console + + hotpatch_console.visible = not hotpatch_console.visible + if hotpatch_console.visible then + player.opened = hotpatch_console else player.opened = nil end end, ['hotpatch-console-run'] = function(e) local player = game.players[e.player_index] - + local top = mod_gui.get_button_flow(player) local left = mod_gui.get_frame_flow(player) local center = player.gui.center - - local console = center['hotpatch-console'] - local output = console['hotpatch-console-bottom']['hotpatch-console-output'] - local input = console['hotpatch-console-bottom']['hotpatch-console-bottom-input']['hotpatch-console-input'] - local console_dropdown = console['hotpatch-console-top']['hotpatch-console-mod-selector'] - + + local hotpatch_console = center['hotpatch-console'] + local output = hotpatch_console['hotpatch-console-bottom']['hotpatch-console-output'] + local input = hotpatch_console['hotpatch-console-bottom']['hotpatch-console-bottom-input']['hotpatch-console-input'] + local console_dropdown = hotpatch_console['hotpatch-console-top']['hotpatch-console-mod-selector'] + if not player.admin then output.text = table.concat{output.text, '\n', 'Only admins!'} return end - + if not (console_dropdown.selected_index > 0) then output.text = table.concat{output.text, '\n', 'Select a mod!'} return end - + local mod_name = console_dropdown.items[console_dropdown.selected_index] local loaded_index = find_loaded_mod(mod_name) local env = loaded_mods[loaded_index].env local old_print = env.print local old_log = env.log - - - - - + + + + + env.print = function(...) --local count = select('#', ...) local t = table.pack(...) @@ -230,21 +231,22 @@ on_gui_click_handlers = { local text = table.concat(t, '\t') output.text = table.concat{output.text, '\n', text} end - + env.log = function(text) output.text = table.concat{output.text, '\n', text} end - + + local success local code, err = load(input.text, input.text, 't', env) - if code then - local success, err = pcall(code) + if code then + success, err = pcall(code) if not success then output.text = table.concat{output.text, '\n', err} end else output.text = table.concat{output.text, '\n', err} end - + env.print = old_print env.log = old_log end, @@ -253,10 +255,10 @@ on_gui_click_handlers = { local top = mod_gui.get_button_flow(player) local left = mod_gui.get_frame_flow(player) local center = player.gui.center - + local element = e.element local previous - for k, v in pairs(center['hotpatch-IDE']['hotpatch-IDE-table']['hotpatch-IDE-files']['hotpatch-IDE-files-table'].children) do + for _, v in pairs(center['hotpatch-IDE']['hotpatch-IDE-table']['hotpatch-IDE-files']['hotpatch-IDE-files-table'].children) do if table.compare(v.style.font_color or {}, {r=1.0, g=1.0, b=0.0, a=1.0}) then previous = v break @@ -297,7 +299,7 @@ on_gui_selection_state_changed_handlers = { local top = mod_gui.get_button_flow(player) local left = mod_gui.get_frame_flow(player) local center = player.gui.center - + local element = e.element local name = element.items[element.selected_index] if name then @@ -306,8 +308,8 @@ on_gui_selection_state_changed_handlers = { local mod = loaded_mods[index] local version_label = center['hotpatch-console']['hotpatch-console-top']['hotpatch-console-mod-version'] version_label.caption = 'Version: ' .. mod.version - local console = center['hotpatch-console'] - local output = console['hotpatch-console-bottom']['hotpatch-console-output'] + local hotpatch_console = center['hotpatch-console'] + local output = hotpatch_console['hotpatch-console-bottom']['hotpatch-console-output'] output.text = '' end end @@ -317,9 +319,9 @@ on_gui_selection_state_changed_handlers = { local top = mod_gui.get_button_flow(player) local left = mod_gui.get_frame_flow(player) local center = player.gui.center - + local element = e.element - + local name = element.items[element.selected_index] if name then local index = find_installed_mod(name) @@ -332,7 +334,7 @@ on_gui_selection_state_changed_handlers = { local file = list.add{type = 'label', style = 'hoverable_bold_label', caption = 'control', name = 'hotpatch-IDE-file.control'} file.style.bottom_padding = 0 file.style.top_padding = 0 - for k, v in pairs(mod.files) do + for k, _ in pairs(mod.files) do file = list.add{type = 'label', style = 'hoverable_bold_label', caption = k, name = 'hotpatch-IDE-file.' .. k} file.style.bottom_padding = 0 file.style.top_padding = 0 @@ -356,20 +358,20 @@ script.on_event(defines.events.on_gui_closed, function(e) if e.gui_type == defines.gui_type.custom then if element and element.valid then if element.name == 'hotpatch-IDE' then - if element.style.visible then + if element.visible then player.play_sound{path = "utility/gui_click"} end - element.style.visible = false + element.visible = false elseif element.name == 'hotpatch-console' then - if element.style.visible then + if element.visible then player.play_sound{path = "utility/gui_click"} end - element.style.visible = false + element.visible = false end end end end) -]===]) +--]===]) return true \ No newline at end of file diff --git a/lib/scenarios/Hotpatch/hotpatch/mod-tools.lua b/lib/scenarios/Hotpatch/hotpatch/mod-tools.lua index 89371cd6..d5356d3f 100644 --- a/lib/scenarios/Hotpatch/hotpatch/mod-tools.lua +++ b/lib/scenarios/Hotpatch/hotpatch/mod-tools.lua @@ -67,7 +67,7 @@ local mod_obj_template = { } -- this is for the core factorio libraries; hotpatch MUST load these now, as they cannot be dynamically loaded due to factorio limitation -local loaded_libraries = {} +local loaded_libraries = {} -- mod installation/uninstallation support functions -- These take a mod NAME as a first argument @@ -101,6 +101,8 @@ local mod_on_configuration_changed local on_event local on_nth_tick +local register_all_events + -- core handlers local on_init -- installs static mods, loads, runs, and calls mod_on_init local on_load -- loads, runs, and calls mod_on_load @@ -222,12 +224,12 @@ local function build_locale(ini) local t = {} local section = '' local temp - + -- line must end with a linefeed - single line file with no LF will fail if not ini:match('[\r\n]+$') then ini = ini .. '\n' end - + -- for each non-empty line do local key, value for l in ini:gmatch('[\r\n]*(.-)[\r\n]+') do @@ -261,7 +263,7 @@ local function static_translate(t, recursive) -- only translate tables that have a string as the first item local k = t[1] if type(k) ~= 'string' then return t end - + -- make a copy, don't destroy the original table, after we copy we can translate in place if not recursive then t = table.deepcopy(t) @@ -285,12 +287,12 @@ local function static_translate(t, recursive) -- substitution of parameters: use literal value of parameter n -- __n__ local result = (pattern:gsub('__(%d+)__', function(s) return tostring(t[tonumber(s)+1]) end)) - + -- re-substitution engine: match value of parameter n to provide additional translation; use for pluralization -- __n:(pattern-1)=substitution-1;(pattern-2)=substitution-2;...(pattern-i)=substitution-i;__ for n, p in result:gmatch('__(%d+)(:.-;)__') do for x, y in p:gmatch('%((.-)%)=(.-[^%%]);') do - if t[tonumber(n)+1]:match(x) then + if t[tonumber(n)+1]:match(x) then result = result:gsub(table.concat{'__', n, escape(p), '__'}, unescape(y)) break end @@ -324,7 +326,7 @@ local hidden_log = hidden(static_translate) -- logs localized data local function debug_log(message, mod_name, stack_level) - if debug_level > -1 then + if debug_level > -1 then if not stack_level then stack_level = 2 end local di = debug.getinfo(stack_level) local line = di.currentline @@ -363,7 +365,7 @@ debug_log({'hotpatch-info.logging-enabled'}) -- track _ENV accesses setmetatable(_ENV, { - __index = function(t, k) + __index = function(_, k) debug_log({'hotpatch-trace.nil-var-access', k}, nil, 3) return nil end, @@ -428,14 +430,14 @@ uninstall_mod = function(mod_name) return end local loaded_index = find_loaded_mod(mod_name) - + if loaded_index then unload_mod(loaded_index) end - + debug_log({'hotpatch-info.uninstalling', mod_name}) - + table.remove(global.mods, index) end @@ -446,7 +448,7 @@ install_mod_file = function(mod_name, mod_file, mod_file_code) return end local mod = global.mods[index] - + debug_log({'hotpatch-info.installing-file', mod_file}, mod_name) mod_file = mod_file:gsub('/', '.') @@ -474,7 +476,7 @@ install_mod = function(mod_name, mod_version, mod_code, mod_files) end debug_log({'hotpatch-warning.contains-comments-console'}, mod_name) end - + mod_code = mod_code:gsub('\t', ' ') mod.name = mod_name @@ -482,7 +484,7 @@ install_mod = function(mod_name, mod_version, mod_code, mod_files) mod.code = mod_code mod.version = mod_version mod.global = mod.global or {} - + if mod_files then for k,v in pairs(mod_files) do install_mod_file(mod_name, k, v) @@ -500,7 +502,7 @@ load_mod = function(installed_index) --TODO notify that mod was already loaded unload_mod(loaded_index) end - + local mod_obj = { name = mod_name, -- name of the current mod version = mod.version, @@ -515,7 +517,7 @@ load_mod = function(installed_index) on_nth_tick = {}, -- list of on_nth_tick handlers registered loaded_files = {}, -- list of files loaded by require() that were installed into the virtual file system } - + debug_log({'hotpatch-info.script-shim'}, mod_name) --mods private script table/shim local mod_script = {} @@ -540,7 +542,7 @@ load_mod = function(installed_index) mod_script.on_nth_tick = function(tick, f) if tick then if type(tick) == 'table' then - for k, v in pairs(tick) do + for _, v in pairs(tick) do mod_script.on_nth_tick(v, f) end return @@ -550,12 +552,12 @@ load_mod = function(installed_index) mod_obj.on_nth_tick = {} end end - else + else mod_script.on_event = function(event, f) if event == defines.events.on_tick then mod_obj.on_tick = f if mod_obj.running then - register_on_tick(mod_name, event) + register_on_tick(mod_name) end else mod_obj.on_event[event] = f @@ -567,7 +569,7 @@ load_mod = function(installed_index) mod_script.on_nth_tick = function(tick, f) if tick then if type(tick) == 'table' then - for k, v in pairs(tick) do + for _, v in pairs(tick) do mod_script.on_nth_tick(v, f) end return @@ -577,11 +579,11 @@ load_mod = function(installed_index) register_nth_tick(mod_name, tick) end else - local on_nth_tick = mod_obj.on_nth_tick + local mod_on_nth_tick = mod_obj.on_nth_tick mod_obj.on_nth_tick = {} if mod_obj.running then - for k, v in pairs(on_nth_tick) do - register_nth_tick(mod_name, tick) + for _, v in pairs(mod_on_nth_tick) do + register_nth_tick(mod_name, v) end end end @@ -603,7 +605,7 @@ load_mod = function(installed_index) mod_script.mod_name = function() return script.mod_name() end - + debug_log({'hotpatch-info.setting-env'}, mod_name) -- mods private env local env = mod_obj.env @@ -620,20 +622,20 @@ load_mod = function(installed_index) loaded[k] = v end loaded._G = env - + -- so many ways to escape sandboxes... - + for k,v in pairs(_ENV.package) do pack[k] = v end pack.loaded = loaded env.package = pack loaded.package = pack - + env.script = mod_script env.global = mod.global env._G = env - + env['remote'] = { add_interface = function(name, functions) if remote.interfaces[name] then @@ -649,7 +651,7 @@ load_mod = function(installed_index) return remote.call(...) end, interfaces = setmetatable({}, { - __index = function(t, k) return remote.interfaces[k] end, + __index = function(_, k) return remote.interfaces[k] end, __pairs = function(t) local function iter(t, k) local v; k, v = next(remote.interfaces, k); if v then return k, t[k] end; end; return iter, t, nil end }) } @@ -665,16 +667,16 @@ load_mod = function(installed_index) return commands.remove_command(name) end, commands = setmetatable({}, { - __index = function(t, k) return commands.commands[k] end, + __index = function(_, k) return commands.commands[k] end, __pairs = function(t) local function iter(t, k) local v; k, v = next(commands.commands, k); if v then return k, t[k] end; end; return iter, t, nil end }), game_commands = setmetatable({}, { - __index = function(t, k) return commands.game_commands[k] end, + __index = function(_, k) return commands.game_commands[k] end, __pairs = function(t) local function iter(t, k) local v; k, v = next(commands.game_commands, k); if v then return k, t[k] end; end; return iter, t, nil end }) } - - + + env.require = function(path) -- I blame Nexela for this path = path:gsub('/', '.') @@ -709,7 +711,7 @@ load_mod = function(installed_index) error(err) end end - local file = global.mods[installed_index].files[alt_path] + 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) @@ -723,31 +725,31 @@ load_mod = function(installed_index) error(err) end end - + debug_log({'hotpatch-trace.load-core-lib', path}, mod_name) env.package._current_path_in_package = oldbase local lib = package.loaded[path] - if not lib then - debug_log(path .. ' not found', nil, 3) + if not lib then + debug_log({'hotpatch-error.path-not-found', path}, mod_name, 3) error(path .. ' not found') end return lib end end - + env['load'] = function(l, s, m, e) return load(l, s, m, e or env) end env['loadstring'] = env['load'] - - + + env['game'] = setmetatable({}, { - __index = function(t, k) return game[k] end, + __index = function(_, k) return game[k] end, __pairs = function(t) local function iter(t, k) local v; k, v = next(game, k); if v then return k, t[k] end; end; return iter, t, nil end }) - + local mt = {} - mt.__index = function(t, k) + mt.__index = function(_, k) debug_log({'hotpatch-trace.nil-var-access', k}, nil, 3) return nil end @@ -761,7 +763,7 @@ load_mod = function(installed_index) --load/run code debug_log({'hotpatch-info.loading'}, mod_name) - + local mod_code, message = load(mod.code, '[' .. mod_name .. '] control.lua', 'bt', env) if not mod_code then debug_log({'hotpatch-error.compilation-failed'}, mod_name) @@ -815,12 +817,12 @@ reset_mod = function(loaded_index) end reset_mod_events = function(loaded_index) - local loaded_index = find_loaded_mod(mod_name) - - if not loaded_index then - debug_log({'hotpatch-warning.reset-events-not-running'}, mod_name) - else - local loaded_mod = loaded_mods[loaded_index] + --local loaded_index = find_loaded_mod(mod_name) + local loaded_mod = loaded_mods[loaded_index] + + if not loaded_mod then + --debug_log({'hotpatch-warning.reset-events-not-running'}, mod_name) + else loaded_mod.on_event = {} loaded_mod.on_nth_tick = {} loaded_mod.on_init = nil @@ -841,7 +843,7 @@ run_mod = function(loaded_index) --mod.env.global = {} end debug_log({'hotpatch-info.running'}, mod_name) - + local success, result = xpcall(mod.code, debug.traceback) if not success then debug_log({'hotpatch-error.execution-failed'}, mod_name) @@ -850,22 +852,22 @@ run_mod = function(loaded_index) if game and game.player then game.player.print(result) end - + return false end - + if strict_mode then --if mod.env.global ~= {} then --TODO: error, mod touched global inappropriately during load --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 + for k,_ in pairs(mod.env.global) do mod.env.global[k] = nil end for k,v in pairs(old_global) do @@ -874,16 +876,16 @@ run_mod = function(loaded_index) --mod.env.global = old_global end old_global = nil - + mod.running = true debug_log({'hotpatch-info.complete', {'hotpatch-info.running'}}, mod_name) - + --load complete, start notifying on event subscriptions if not compat_mode then mod.env.script.on_event = function(event, f) if event == defines.events.on_tick then mod.on_tick = f - register_on_tick(mod_name, event) + register_on_tick(mod_name) else mod.on_event[event] = f register_event(mod_name, event) @@ -892,18 +894,18 @@ run_mod = function(loaded_index) mod.env.script.on_nth_tick = function(tick, f) if tick then if type(tick) == 'table' then - for k, v in pairs(tick) do - mod_script.on_nth_tick(v, f) + for _, v in pairs(tick) do + mod.env.script.on_nth_tick(v, f) end return end mod.on_nth_tick[tick] = f register_nth_tick(mod_name, tick) else - local on_nth_tick = mod.on_nth_tick + local mod_on_nth_tick = mod.on_nth_tick mod.on_nth_tick = {} - for k, v in pairs(on_nth_tick) do - register_nth_tick(mod_name, tick) + for _, v in pairs(mod_on_nth_tick) do + register_nth_tick(mod_name, v) end end end @@ -923,7 +925,7 @@ on_event = function(event) for i = 1, #loaded_mods do mod = loaded_mods[i] f = mod.on_event[event.name] - if f then + if f then debug_log({'hotpatch-trace.event-running', event_name}, mod.name) f(event) end @@ -939,7 +941,7 @@ if debug_log_on_tick then for i = 1, #loaded_mods do mod = loaded_mods[i] f = mod.on_nth_tick[event.nth_tick] - if f then + if f then debug_log({'hotpatch-trace.nth-tick-event-running', tick}, mod.name) f(event) end @@ -953,7 +955,7 @@ else for i = 1, #loaded_mods do mod = loaded_mods[i] f = mod.on_nth_tick[event.nth_tick] - if f then + if f then debug_log({'hotpatch-trace.nth-tick-event-running', tick}, mod.name) f(event) end @@ -961,7 +963,7 @@ else end end -local register_all_events = function() +register_all_events = function() --unregister all events script.on_event(defines.events, nil) script.on_nth_tick(nil, nil) @@ -980,12 +982,12 @@ register_mod_events = function(loaded_index) debug_log({'hotpatch-trace.on-tick-event-registered'}, mod_name) script.on_event(defines.events.on_tick, on_tick) end - for k,v in pairs(mod.on_event) do + for k,_ in pairs(mod.on_event) do local event_name = (event_names[k] or k) debug_log({'hotpatch-trace.on-event-registered', event_name}, mod_name) script.on_event(k, on_event) end - for k,v in pairs(mod.on_nth_tick) do + for k,_ in pairs(mod.on_nth_tick) do debug_log({'hotpatch-trace.on-nth-tick-event-registered', k}, mod_name) script.on_nth_tick(k, on_nth_tick) end @@ -993,14 +995,14 @@ end mod_on_init = function(loaded_index) local mod = loaded_mods[loaded_index] - + if mod then debug_log({'hotpatch-trace.mod-on-init'}, mod.name) - if mod.on_init then + if mod.on_init then local success, result = xpcall(mod.on_init, debug.traceback) if not success then - debug_log('on_init failed for ' .. mod.name) - debug_log(result) + debug_log({'hotpatch-error.on-init-failed'}, mod_name) + debug_log(result, mod_name) return false end end @@ -1012,15 +1014,15 @@ end mod_on_load = function(loaded_index) local mod = loaded_mods[loaded_index] - + if mod then debug_log({'hotpatch-trace.mod-on-load'}, mod.name) - if mod.on_load then + 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) - debug_log(result) + debug_log({'hotpatch-error.on-load-failed'}, mod_name) + debug_log(result, mod_name) return false end end @@ -1032,14 +1034,14 @@ end mod_on_configuration_changed = function(loaded_index, config) local mod = loaded_mods[loaded_index] - + if mod then debug_log({'hotpatch-trace.mod-on-configuration-changed'}, mod.name) - if mod.on_configuration_changed then + if mod.on_configuration_changed then local success, result = xpcall(mod.on_configuration_changed, debug.traceback, config) if not success then - debug_log('on_configuration_changed failed for ' .. mod.name) - debug_log(result) + debug_log({'hotpatch-error.on-configuration-changed-failed'}, mod_name) + debug_log(result, mod_name) return false end end @@ -1057,9 +1059,9 @@ register_on_tick = function(mod_name) for i = 1, #loaded_mods do mod = loaded_mods[i] local f = mod.on_tick - if f then - found_event = true - break + if f then + found_event = true + break end end debug_log({'hotpatch-trace.on-tick-event-registered'}, mod_name) @@ -1077,9 +1079,9 @@ register_nth_tick = function(mod_name, nth_tick) for i = 1, #loaded_mods do mod = loaded_mods[i] local f = mod.on_nth_tick[nth_tick] - if f then - found_event = true - break + if f then + found_event = true + break end end debug_log({'hotpatch-trace.on-nth-tick-event-registered', nth_tick}, mod_name) @@ -1125,7 +1127,7 @@ on_init = function() debug_log({'hotpatch-info.on-init'}) --juuuuust in case global.mods = global.mods or {} - + debug_log({'hotpatch-info.installing-included-mods'}) local mod for i = 1, #static_mods do @@ -1136,7 +1138,7 @@ on_init = function() for i = 1, #global.mods do load_mod(i) end - + for i = 1, #loaded_mods do run_mod(i) mod_on_init(i) @@ -1152,10 +1154,10 @@ on_load = function() hidden_log = hidden() debug_log({'hotpatch-info.on-load'}) debug_log({'hotpatch-info.loading-installed-mods'}) - + if global.globals then error('Upgrading from Hotpatch 1.0.X to 1.1.0 is not currently supported!') - + -- untested migration: use a tick to do the migration script.on_event(defines.events.on_tick, function(e) global.mods = {} @@ -1173,19 +1175,19 @@ on_load = function() global.mod_code = nil global.mod_files = nil global.globals = nil - + on_load() -- jump back into loading on_tick(e) -- need to test if factorio auto calls this or not after assigning the handler script.on_event(defines.events.on_tick, on_tick) -- restore old on_tick handler end) return end - + -- load installed mods for i = 1, #global.mods do load_mod(i) end - + -- run mods which loaded successfully local failed_mods = {} for i = 1, #loaded_mods do @@ -1197,12 +1199,12 @@ on_load = function() 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'}}) end @@ -1211,11 +1213,11 @@ on_configuration_changed = function(config) debug_log({'hotpatch-info.on-configuration-changed'}) local failed_mods = {} for i = 1, #loaded_mods do - if not mod_on_configuration_changed(i) then + if not mod_on_configuration_changed(i, config) then table.insert(failed_mods, i) end end - + for i = 1, #failed_mods do unload_mod(failed_mods[i]) end @@ -1230,7 +1232,7 @@ if debug_log_on_tick then for i = 1, #loaded_mods do mod = loaded_mods[i] f = mod.on_tick - if f then + if f then debug_log({'hotpatch-trace.event-running', 'on_tick'}, mod.name) f(e) end @@ -1243,7 +1245,7 @@ else for i = 1, #loaded_mods do mod = loaded_mods[i] f = mod.on_tick - if f then + if f then f(e) end end @@ -1285,31 +1287,31 @@ local mod_tools_internal = setmetatable({ mod_on_init = mod_on_init, mod_on_load = mod_on_load, mod_on_configuration_changed = mod_on_configuration_changed, - + static_mods = static_mods, console = console, debug_log = debug_log, loaded_mods = loaded_mods, loaded_libraries = loaded_libraries, installed_mods = setmetatable({}, { - __index = function(t, k) + __index = function(_, k) return global.mods[k] end, - __newindex = function(t, k, v) + __newindex = function(_, __, ___) -- do nothing end, - __len = function(t) + __len = function(_) return #global.mods end, - __pairs = function(t) local function iter(t, k) local v; v = global.mods[k+1]; if v then return k+1, v end; end; return iter, t, 0 end, - __ipairs = function(t) local function iter(t, k) local v; v = global.mods[k+1]; if v then return k+1, v end; end; return iter, t, 0 end, + __pairs = function(t) local function iter(_, k) local v; v = global.mods[k+1]; if v then return k+1, v end; end; return iter, t, 0 end, + __ipairs = function(t) local function iter(_, k) local v; v = global.mods[k+1]; if v then return k+1, v end; end; return iter, t, 0 end, __metatable = false, }) },{ - __index = function(t, k) + __index = function(_, k) debug_log({'hotpatch-error.invalid-API-access', k}, nil, 3) end, - __newindex = function(t, k, v) + __newindex = function(_, __, ___) -- do nothing end, -- Don't let mods muck around @@ -1321,11 +1323,12 @@ local mod_tools = setmetatable({ -- most code should use static_mod static_mod = static_mod, -- (name, version, code, files) set_debug_level = function(level) - debug_level = tonumber(_ENV.debug_settings.level) or debug_levels[_ENV.debug_settings.level] + --debug_level = tonumber(_ENV.debug_settings.level) or debug_levels[_ENV.debug_settings.level] + debug_level = tonumber(level) or debug_levels[level] end, },{ __index = mod_tools_internal, - __newindex = function(t, k, v) + __newindex = function(_, __, ___) -- do nothing, read-only table end, -- Don't let mods muck around diff --git a/lib/scenarios/Hotpatch/hotpatch/remote-interface.lua b/lib/scenarios/Hotpatch/hotpatch/remote-interface.lua index 13844c31..6fa8c434 100644 --- a/lib/scenarios/Hotpatch/hotpatch/remote-interface.lua +++ b/lib/scenarios/Hotpatch/hotpatch/remote-interface.lua @@ -65,7 +65,7 @@ remote_interface['install'] = function(mod_name, mod_version, mod_code, mod_file local caller = game.player or console if caller.admin then if mod_files then - for k,v in pairs(mod_files) do + for k,_ in pairs(mod_files) do if k == 'control' then caller.print('ERROR: control.lua loaded twice for mod ' .. mod_name) return @@ -77,14 +77,14 @@ remote_interface['install'] = function(mod_name, mod_version, mod_code, mod_file if installed_index then local old_version = installed_mods[installed_index].version if old_version then - debug_log('WARNING: mod already exists: ' .. mod_name .. ' ' .. old_version) - debug_log('WARNING: reinstalling mod in-place: ' .. mod_name .. ' ' .. mod_version) + debug_log({'hotpatch-warning.already-exists', mod_name, old_version}) + debug_log({'hotpatch-warning.reinstalling', mod_name, old_version}) end if loaded_index then unload_mod(loaded_index) end end - + install_mod(mod_name, mod_version, mod_code, mod_files) if not only_install then installed_index = find_installed_mod(mod_name) @@ -131,6 +131,8 @@ remote_interface['run'] = function(mod_name) if caller.admin then local installed_index = find_installed_mod(mod_name) local loaded_index = find_loaded_mod(mod_name) + local mod + local version if installed_index and not loaded_index then if not load_mod(installed_index) then caller.print('compilation failed for mod ' .. mod_name) @@ -139,13 +141,13 @@ remote_interface['run'] = function(mod_name) loaded_index = find_loaded_mod(mod_name) else if loaded_index then - local mod = loaded_mods[loaded_index] - local version = mod.version - debug_log('WARNING: mod already loaded: ' .. mod_name .. ' ' .. version) - debug_log('WARNING: reinitializing: ' .. mod_name .. ' ' .. version) + mod = loaded_mods[loaded_index] + version = mod.version + debug_log({'hotpatch-warning.already-loaded', mod_name, version}) + debug_log({'hotpatch-warning.reinitializing', mod_name, version}) end end - + if loaded_index then if not run_mod(loaded_index) then caller.print('execution failed for mod ' .. mod_name) @@ -164,7 +166,7 @@ remote_interface['run'] = function(mod_name) unload_mod(loaded_index) return end - end + end else caller.print('You must be an admin to run this command.') end @@ -178,7 +180,7 @@ remote_interface['update'] = function(mod_name, mod_version, mod_code, mod_files local caller = game.player or console if caller.admin then if mod_files then - for k,v in pairs(mod_files) do + for k,_ in pairs(mod_files) do if k == 'control' then caller.print('ERROR: control.lua loaded twice for mod ' .. mod_name) return @@ -186,6 +188,9 @@ remote_interface['update'] = function(mod_name, mod_version, mod_code, mod_files end end local installed_index = find_installed_mod(mod_name) + if installed_index then + ; + end local loaded_index = find_loaded_mod(mod_name) local old_version if loaded_index then @@ -245,16 +250,40 @@ remote_interface['install_mod_file'] = function(mod_name, mod_file, mod_file_cod end end +remote_interface['exec'] = function(mod_name, exec_code) + local caller = game.player or console + if caller.admin then + local loaded_index = find_loaded_mod(mod_name) + local env = loaded_mods[loaded_index].env + + local success + local code, err = load(exec_code, exec_code, 't', env) + if code then + success, err = pcall(code) + if not success then + debug_log(err) + end + else + debug_log(err) + end + else + caller.print('You must be an admin to run this command.') + end +end + --TODO: most of this function remote_interface['clean'] = function(mod_name) -- Removes ALL mod data and reinitializes -- doesn't remove things a mod may add like surfaces, etc local caller = game.player or console if caller.admin then - mod_reset(mod_name) - run_mod(mod_name) - mod_on_init(mod_name) - mod_on_configuration_changed(mod_name, {mod_changes = {mod_name={new_version=mod_version}}}) + --mod_reset(mod_name) + --run_mod(mod_name) + --mod_on_init(mod_name) + local loaded_index = find_loaded_mod(mod_name) + local mod = loaded_mods[loaded_index] + local version = mod.version + mod_on_configuration_changed(loaded_index, {mod_changes = {mod_name={new_version=version}}}) else caller.print('You must be an admin to run this command.') end @@ -274,13 +303,13 @@ remote.add_interface('hotpatch', remote_interface) debug_log({'hotpatch-info.complete', {'hotpatch-info.remote-installing'}}) -]===]) +--]===]) --[[ -remote.call('hotpatch, 'install', 'test', '1.0.0', [===[ -script.on_event(defines.events.on_player_changed_position, function(e) - game.print('changed position') +remote.call('hotpatch, 'install', 'test', '1.0.0', [===[ +script.on_event(defines.events.on_player_changed_position, function(e) + game.print('changed position') end ]===] diff --git a/lib/scenarios/Hotpatch/locale/en/hotpatch.cfg b/lib/scenarios/Hotpatch/locale/en/hotpatch.cfg index d0c51230..50c9f6f8 100644 --- a/lib/scenarios/Hotpatch/locale/en/hotpatch.cfg +++ b/lib/scenarios/Hotpatch/locale/en/hotpatch.cfg @@ -65,13 +65,17 @@ contains-comments-console=comments from console will comment out the entire code reset-events-not-running=tried to reset events for mod that isn't running! remote-interface-exists=remote interface __1__ already exists, removing... command-exists=command __1__ already exists, removing... -already-loaded=mod already loaded -reinitializing=reinitializing... -already-exists=mod already exists -reinstalling=reinstalling mod in-place +already-exists=mod already exists: __1__ __2__ +reinstalling=reinstalling mod in-place: __1__ __2__ +already-loaded=mod already loaded: __1__ __2__ +reinitializing=reinitializing: __1__ __2__ [hotpatch-error] invalid-API-access=Invalid API access: __1__ not-installed=mod not installed, cannot install file for mod that does not exist compilation-failed=compilation failed for mod execution-failed=execution failed for mod +path-not-found=path '__1__' not found +on-init-failed=on_init failed +on-load-failed=on_load failed +on-configuration-changed-failed=on_configuration_changed failed \ No newline at end of file