From 0c56fb97db408b3fa742648eea80f552e6141574 Mon Sep 17 00:00:00 2001 From: PHIDIAS Date: Sun, 23 Feb 2025 02:46:57 +0900 Subject: [PATCH 1/2] Cleanup miner decon (#377) * Update miner.lua * Update miner.lua * Update miner.lua * Update miner.lua --- exp_legacy/module/modules/addons/miner.lua | 46 +++++++++------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/exp_legacy/module/modules/addons/miner.lua b/exp_legacy/module/modules/addons/miner.lua index d83a9c3f..7dd8f29f 100644 --- a/exp_legacy/module/modules/addons/miner.lua +++ b/exp_legacy/module/modules/addons/miner.lua @@ -41,7 +41,7 @@ local function check_entity(entity) end if not entity.minable then - -- if it is minable + -- if it is not minable return true end @@ -102,10 +102,6 @@ local function miner_check(entity) end end - --[[ - entity.status ~= defines.entity_status.no_minable_resources - ]] - if check_entity(entity) then return end @@ -113,32 +109,28 @@ local function miner_check(entity) local pipe_build = {} if config.fluid and entity.fluidbox and #entity.fluidbox > 0 then - -- if require fluid to mine table.insert(pipe_build, { x = 0, y = 0 }) - - local half = math.floor(entity.get_radius()) - local r = 1 + er - + local rh = math.ceil(er / 2) - 1 + local r = er + 1 local entities = es.find_entities_filtered{ area = { { ep.x - r, ep.y - r }, { ep.x + r, ep.y + r } }, type = { "mining-drill", "pipe", "pipe-to-ground" } } local entities_t = es.find_entities_filtered{ area = { { ep.x - r, ep.y - r }, { ep.x + r, ep.y + r } }, ghost_type = { "pipe", "pipe-to-ground" } } - table.insert_array(entities, entities_t) for _, e in pairs(entities) do if (e.position.x > ep.x) and (e.position.y == ep.y) then - for h = 1, half do + for h = 1, rh do table.insert(pipe_build, { x = h, y = 0 }) end elseif (e.position.x < ep.x) and (e.position.y == ep.y) then - for h = 1, half do + for h = 1, rh do table.insert(pipe_build, { x = -h, y = 0 }) end elseif (e.position.x == ep.x) and (e.position.y > ep.y) then - for h = 1, half do + for h = 1, rh do table.insert(pipe_build, { x = 0, y = h }) end elseif (e.position.x == ep.x) and (e.position.y < ep.y) then - for h = 1, half do + for h = 1, rh do table.insert(pipe_build, { x = 0, y = -h }) end end @@ -152,7 +144,7 @@ local function miner_check(entity) table.insert(miner_data.queue, { t = game.tick + 5, e = entity }) for _, pos in ipairs(pipe_build) do - es.create_entity{ name = "entity-ghost", position = { x = ep.x + pos.x, y = ep.y + pos.y }, force = ef, inner_name = "pipe", raise_built = true } + es.create_entity{ name = "entity-ghost", position = { x = ep.x + pos.x, y = ep.y + pos.y }, force = ef, inner_name = "pipe" } end end @@ -161,27 +153,27 @@ Event.add(defines.events.on_resource_depleted, function(event) return end - local entities = event.entity.surface.find_entities_filtered{ area = { { event.entity.position.x - 1, event.entity.position.y - 1 }, { event.entity.position.x + 1, event.entity.position.y + 1 } }, type = "mining-drill" } + local resource = event.entity + local drills = resource.surface.find_entities_filtered{ area = { { event.entity.position.x - 1, event.entity.position.y - 1 }, { event.entity.position.x + 1, event.entity.position.y + 1 } }, type = "mining-drill" } - if #entities == 0 then - return - end - - for _, entity in pairs(entities) do - if ((math.abs(entity.position.x - event.entity.position.x) < entity.prototype.mining_drill_radius) and (math.abs(entity.position.y - event.entity.position.y) < entity.prototype.mining_drill_radius)) then + for _, entity in pairs(drills) do + local radius = entity.prototype.mining_drill_radius + local dx = math.abs(entity.position.x - resource.position.x) + local dy = math.abs(entity.position.y - resource.position.y) + if dx <= radius and dy <= radius then miner_check(entity) end end end) Event.on_nth_tick(10, function(event) - for k, q in pairs(miner_data.queue) do + for i = #miner_data.queue, 1, -1 do + local q = miner_data.queue[i] if not q.e or not q.e.valid then - table.remove(miner_data.queue, k) - break + table.remove(miner_data.queue, i) elseif event.tick >= q.t then q.e.order_deconstruction(q.e.force) - table.remove(miner_data.queue, k) + table.remove(miner_data.queue, i) end end end) From 121e7c81ea96984eb5146680d25cddd3fd986861 Mon Sep 17 00:00:00 2001 From: PHIDIAS Date: Sun, 23 Feb 2025 02:47:16 +0900 Subject: [PATCH 2/2] Cleanup Research GUI (#378) * Update research.lua * Update research.lua * Update research.lua * Update research.lua * Update research.lua * Update nukeprotect.lua * Update nukeprotect.lua * Update research.lua --- exp_legacy/module/config/nukeprotect.lua | 4 - exp_legacy/module/config/research.lua | 31 ++- .../module/modules/addons/nukeprotect.lua | 9 - exp_legacy/module/modules/gui/research.lua | 206 ++++++++---------- 4 files changed, 109 insertions(+), 141 deletions(-) diff --git a/exp_legacy/module/config/nukeprotect.lua b/exp_legacy/module/config/nukeprotect.lua index 65af3830..f80b6a7a 100644 --- a/exp_legacy/module/config/nukeprotect.lua +++ b/exp_legacy/module/config/nukeprotect.lua @@ -27,8 +27,4 @@ return { }, ignore_permisison = "bypass-nukeprotect", -- @setting ignore_permisison The permission that nukeprotect will ignore ignore_admins = true, -- @setting ignore_admins Ignore admins, true by default. Allows usage outside of the roles module - disable_nuke_research = false, -- @setting disable_nuke_research Disable the nuke research, true by default - disable_nuke_research_names = { - ["atomic-bomb"] = true, - }, -- @setting disable_nuke_research_names The names of the researches to disabled } diff --git a/exp_legacy/module/config/research.lua b/exp_legacy/module/config/research.lua index c2511d28..41a102f0 100644 --- a/exp_legacy/module/config/research.lua +++ b/exp_legacy/module/config/research.lua @@ -76,17 +76,17 @@ return { ["space-science-pack"] = 300 }, ["space-age"] = { - ["logistic-science-pack"] = 2400, - ["military-science-pack"] = 2400, - ["chemical-science-pack"] = 3000, - ["utility-science-pack"] = 3600, - ["production-science-pack"] = 3600, - ["space-science-pack"] = 3600, - ["metallurgic-science-pack"] = 4200, - ["electromagnetic-science-pack"] = 4200, - ["agricultural-science-pack"] = 4200, - ["cryogenic-science-pack"] = 4200, - ["promethium-science-pack"] = 4800 + ["logistic-science-pack"] = 3600, + ["military-science-pack"] = 3600, + ["chemical-science-pack"] = 4500, + ["utility-science-pack"] = 5400, + ["production-science-pack"] = 5400, + ["space-science-pack"] = 5400, + ["metallurgic-science-pack"] = 6300, + ["electromagnetic-science-pack"] = 6300, + ["agricultural-science-pack"] = 6300, + ["cryogenic-science-pack"] = 6300, + ["promethium-science-pack"] = 7200 } }, inf_res = { @@ -159,4 +159,13 @@ return { ["follower-robot-count-5"] = 5, } }, + -- prevent research up to a certain level + limit_res = { + -- Artillery Range + ["artillery-shell-range-1"] = 7, + -- Artillery Speed + ["artillery-shell-speed-1"] = 7, + -- Atomic Bomb + -- ["atomic-bomb"] = 1 + }, } diff --git a/exp_legacy/module/modules/addons/nukeprotect.lua b/exp_legacy/module/modules/addons/nukeprotect.lua index e474de28..59238290 100644 --- a/exp_legacy/module/modules/addons/nukeprotect.lua +++ b/exp_legacy/module/modules/addons/nukeprotect.lua @@ -43,12 +43,3 @@ for _, inventory in ipairs(config.inventories) do end) end end - -if config.disable_nuke_research then - Event.add(defines.events.on_research_started, function(event) - local name = event.research.name - if config.disable_nuke_research_names[name] then - event.research.force.cancel_current_research() - end - end) -end diff --git a/exp_legacy/module/modules/gui/research.lua b/exp_legacy/module/modules/gui/research.lua index fbce2cea..4a8bed31 100644 --- a/exp_legacy/module/modules/gui/research.lua +++ b/exp_legacy/module/modules/gui/research.lua @@ -20,9 +20,9 @@ Storage.register(research, function(tbl) research = tbl end) -for i = 1, #config.mod_set_lookup do - if script.active_mods[config.mod_set_lookup[i]] then - config.mod_set = config.mod_set_lookup[i] +for _, mod_name in ipairs(config.mod_set_lookup) do + if script.active_mods[mod_name] then + config.mod_set = mod_name break end end @@ -31,10 +31,9 @@ local research_time_format = ExpUtil.format_time_factory{ format = "clock", hour local empty_time = research_time_format(nil) local font_color = { - -- positive - [1] = { r = 0.3, g = 1, b = 0.3 }, - -- negative - [2] = { r = 1, g = 0.3, b = 0.3 }, + ["neutral"] = { r = 1, g = 1, b = 1 }, + ["positive"] = { r = 0.3, g = 1, b = 0.3 }, + ["negative"] = { r = 1, g = 0.3, b = 0.3 }, } local res = { @@ -64,36 +63,24 @@ end local function research_add_log() local result_data = {} - for i = 1, #research.time, 1 do + for i = 1, #research.time do result_data[res["disp"][i]["raw_name"]] = research.time[i] end write_file(config.file_name, table_to_json(result_data) .. "\n", true, 0) end -local function research_res_n(res_) - local res_n = 1 +local function research_res_n() + local current = #res.disp + 1 - for k, _ in pairs(res_) do - if research.time[k] == 0 then - res_n = k - 1 + for i = 1, #res.disp do + if research.time[i] == 0 then + current = i break end end - if research.time[#res_] and research.time[#res_] > 0 then - if res_n == 1 then - res_n = #res_ - end - end - - if res_n < 3 then - res_n = 3 - elseif res_n > (#research.time - 5) then - res_n = #research.time - 5 - end - - return res_n + return math.clamp(current - 3, 1, math.max(1, #res.disp - 7)) end local function research_notification(event) @@ -105,70 +92,61 @@ local function research_notification(event) end if config.bonus_inventory.enabled then - if (event.research.level - 1) <= math.ceil(config.bonus_inventory.limit / config.bonus_inventory.rate) then - event.research.force[config.bonus_inventory.name] = math.max((event.research.level - 1) * config.bonus_inventory.rate, config.bonus_inventory.limit) - end + event.research.force[config.bonus_inventory.name] = math.max((event.research.level - 1) * config.bonus_inventory.rate, config.bonus_inventory.limit) end if config.pollution_ageing_by_research then game.map_settings.pollution.ageing = math.min(10, event.research.level / 5) end - else - if not (event.by_script) then - game.print{ "research.inf", research_time_format(game.tick), event.research.name, event.research.level - 1 } - end + end + + if not (event.by_script) then + game.print{ "research.inf", research_time_format(game.tick), event.research.name, event.research.level - 1 } end else if not (event.by_script) then game.print{ "research.msg", research_time_format(game.tick), event.research.name } end - if config.bonus_inventory.enabled then - if event.research.name == "mining-productivity-1" or event.research.name == "mining-productivity-2" or event.research.name == "mining-productivity-3" then - event.research.force[config.bonus_inventory.name] = event.research.level * config.bonus_inventory.rate - end + if config.bonus_inventory.enabled and (event.research.name == "mining-productivity-1" or event.research.name == "mining-productivity-2" or event.research.name == "mining-productivity-3") then + event.research.force[config.bonus_inventory.name] = event.research.level * config.bonus_inventory.rate end end end local function research_gui_update() local res_disp = {} - local res_n = research_res_n(res["disp"]) + local res_n = research_res_n() - for i = 1, 8, 1 do - res_disp[i] = { - ["name"] = "", - ["target"] = "", - ["attempt"] = "", - ["difference"] = "", - ["difference_color"] = font_color[1], + for i = 1, 8 do + local res_i = res_n + i - 1 + local entry = res.disp[res_i] or {} + local data = { + name = "", + target = "", + attempt = "", + difference = "", + color = font_color["positive"] } - local res_i = res_n + i - 3 - - if res["disp"][res_i] then - local raw_name = res["disp"][res_i]["raw_name"] - local proto = assert(prototypes.technology[raw_name], "Invalid Research: " .. tostring(raw_name)) - res_disp[i]["name"] = { "research.res-name", raw_name, proto.localised_name } + if entry.raw_name then + assert(prototypes.technology[entry.raw_name], "Invalid Research: " .. tostring(entry.raw_name)) + data.name = { "research.res-name", entry.raw_name, prototypes.technology[entry.raw_name].localised_name } + data.target = entry.target_disp if research.time[res_i] == 0 then - res_disp[i]["target"] = res["disp"][res_i].target_disp - res_disp[i]["attempt"] = empty_time - res_disp[i]["difference"] = empty_time - res_disp[i]["difference_color"] = font_color[1] - else - res_disp[i]["target"] = res["disp"][res_i].target_disp - res_disp[i]["attempt"] = research_time_format(research.time[res_i]) + data.attempt = empty_time + data.difference = empty_time - if research.time[res_i] < res["disp"][res_i].target then - res_disp[i]["difference"] = "-" .. research_time_format(res["disp"][res_i].target - research.time[res_i]) - res_disp[i]["difference_color"] = font_color[1] - else - res_disp[i]["difference"] = research_time_format(research.time[res_i] - res["disp"][res_i].target) - res_disp[i]["difference_color"] = font_color[2] - end + else + data.attempt = research_time_format(research.time[res_i]) + local diff = research.time[res_i] - entry.target + data.difference = (diff < 0 and "-" or "") .. research_time_format(math.abs(diff)) + data.color = (diff < 0 and font_color["positive"]) or font_color["negative"] end end + + res_disp[i] = data end return res_disp @@ -200,42 +178,19 @@ local research_clock_set = Gui.element("research_clock_set") -- @element research_data_group local research_data_group = Gui.element("research_data_group") :draw(function(_def, parent, i) - local name = parent.add{ - type = "label", - name = "research_" .. i .. "_name", - caption = "", - style = "heading_2_label", - } - name.style.width = 180 - name.style.horizontal_align = "left" + local labels = { "name", "target", "attempt", "difference" } - local target = parent.add{ - type = "label", - name = "research_" .. i .. "_target", - caption = "", - style = "heading_2_label", - } - target.style.width = 70 - target.style.horizontal_align = "right" - - local attempt = parent.add{ - type = "label", - name = "research_" .. i .. "_attempt", - caption = "", - style = "heading_2_label", - } - attempt.style.width = 70 - attempt.style.horizontal_align = "right" - - local difference = parent.add{ - type = "label", - name = "research_" .. i .. "_difference", - caption = "", - style = "heading_2_label", - } - difference.style.width = 70 - difference.style.horizontal_align = "right" - difference.style.font_color = font_color[1] + for _, label in ipairs(labels) do + local elem = parent.add{ + type = "label", + name = "research_" .. i .. "_" .. label, + caption = "", + style = "heading_2_label" + } + elem.style.minimal_width = (label == "name" and 180) or 70 + elem.style.horizontal_align = (label == "name" and "left") or "right" + elem.style.font_color = (label == "difference" and font_color["positive"]) or font_color["neutral"] + end end) --- A vertical flow containing the data @@ -251,17 +206,16 @@ local research_data_set = Gui.element("research_data_set") disp["research_0_target"].caption = { "research.target" } disp["research_0_attempt"].caption = { "research.attempt" } disp["research_0_difference"].caption = { "research.difference" } + disp["research_0_difference"].style.font_color = font_color["neutral"] - for i = 1, 8, 1 do + for i = 1, 8 do research_data_group(disp, i) - local research_name_i = "research_" .. i - disp[research_name_i .. "_name"].caption = res_disp[i]["name"] disp[research_name_i .. "_target"].caption = res_disp[i]["target"] disp[research_name_i .. "_attempt"].caption = res_disp[i]["attempt"] disp[research_name_i .. "_difference"].caption = res_disp[i]["difference"] - disp[research_name_i .. "_difference"].style.font_color = res_disp[i]["difference_color"] + disp[research_name_i .. "_difference"].style.font_color = res_disp[i]["color"] end return research_set @@ -291,32 +245,50 @@ Gui.toolbar.create_button{ Event.add(defines.events.on_research_finished, function(event) research_notification(event) + local research_name = event.research.name - if res["lookup_name"][event.research.name] == nil then + if not res["lookup_name"][research_name] then return end - local n_i = res["lookup_name"][event.research.name] - research.time[n_i] = game.tick + research.time[res.lookup_name[research_name]] = game.tick local res_disp = research_gui_update() for _, player in pairs(game.connected_players) do - local container = Gui.get_left_element(research_container, player) - local disp = container.frame["research_st_2"].disp.table + if Roles.player_allowed(player, "gui/research") then + local container = Gui.get_left_element(research_container, player) + local disp = container.frame["research_st_2"].disp.table - for i = 1, 8, 1 do - local research_name_i = "research_" .. i - - disp[research_name_i .. "_name"].caption = res_disp[i]["name"] - disp[research_name_i .. "_target"].caption = res_disp[i]["target"] - disp[research_name_i .. "_attempt"].caption = res_disp[i]["attempt"] - disp[research_name_i .. "_difference"].caption = res_disp[i]["difference"] - disp[research_name_i .. "_difference"].style.font_color = res_disp[i]["difference_color"] + for i = 1, 8 do + local research_name_i = "research_" .. i + disp[research_name_i .. "_name"].caption = res_disp[i]["name"] + disp[research_name_i .. "_target"].caption = res_disp[i]["target"] + disp[research_name_i .. "_attempt"].caption = res_disp[i]["attempt"] + disp[research_name_i .. "_difference"].caption = res_disp[i]["difference"] + disp[research_name_i .. "_difference"].style.font_color = res_disp[i]["color"] + end end end end) +Event.add(defines.events.on_research_started, function(event) + if config.limit_res[event.research.name] and event.research.level > config.limit_res[event.research.name] then + event.research.enabled = false + event.research.visible_when_disabled = true + local rq = event.research.force.research_queue + + for i = #rq, 1, -1 do + if rq[i] == event.research.name then + table.remove(rq, i) + end + end + + event.research.force.cancel_current_research() + event.research.force.research_queue = rq + end +end) + Event.on_nth_tick(60, function() local current_time = research_time_format(game.tick)