From 17d07ac228a95d3ca6fb0c7158a613b72accc53e Mon Sep 17 00:00:00 2001 From: PHIDIAS Date: Sat, 23 Sep 2023 05:07:20 +0900 Subject: [PATCH 1/5] addon module inserter gui --- config/_file_loader.lua | 2 +- config/expcore/roles.lua | 3 +- config/module.lua | 20 +++ modules/gui/module.lua | 267 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 290 insertions(+), 2 deletions(-) create mode 100644 config/module.lua create mode 100644 modules/gui/module.lua diff --git a/config/_file_loader.lua b/config/_file_loader.lua index 32ce6fac..16ec66d8 100644 --- a/config/_file_loader.lua +++ b/config/_file_loader.lua @@ -91,7 +91,7 @@ return { 'modules.gui.server-ups', 'modules.gui.vlayer', 'modules.gui.research', - + 'modules.gui.module', 'modules.graftorio.require', -- graftorio --- Config Files diff --git a/config/expcore/roles.lua b/config/expcore/roles.lua index cc942655..3c8efabf 100644 --- a/config/expcore/roles.lua +++ b/config/expcore/roles.lua @@ -282,7 +282,8 @@ local default = Roles.new_role('Guest','') 'gui/warp-list', 'gui/readme', 'gui/vlayer', - 'gui/research' + 'gui/research', + 'gui/module' } --- Jail role diff --git a/config/module.lua b/config/module.lua new file mode 100644 index 00000000..953b1b3d --- /dev/null +++ b/config/module.lua @@ -0,0 +1,20 @@ +return { + -- type of machine to handle together + module_row = 4, + module_slot_max = 4, + machine_prod_disallow = { + ['beacon'] = true + }, + machine = { + ['electric-mining-drill'] = 'effectivity-module', + ['assembling-machine-2'] = 'productivity-module', + ['assembling-machine-3'] = 'productivity-module-3', + ['electric-furnace'] = 'productivity-module-3', + ['beacon'] = 'speed-module-3', + ['oil-refinery'] = 'productivity-module-3', + ['chemical-plant'] = 'productivity-module-3', + ['centrifuge'] = 'productivity-module-3', + ['lab'] = 'productivity-module-3', + ['rocket-silo'] = 'productivity-module-3' + } +} \ No newline at end of file diff --git a/modules/gui/module.lua b/modules/gui/module.lua new file mode 100644 index 00000000..f6f05b8c --- /dev/null +++ b/modules/gui/module.lua @@ -0,0 +1,267 @@ +---- module inserter +-- @addon module + +local Gui = require 'expcore.gui' --- @dep expcore.gui +local Event = require 'utils.event' --- @dep utils.event +local Roles = require 'expcore.roles' --- @dep expcore.roles +local config = require 'config.module' --- @dep config.module +local Selection = require 'modules.control.selection' --- @dep modules.control.selection +local SelectionModuleArea = 'ModuleArea' + +--[[ +for some reason this dont work + +local module_allowed = {} + +for _, r in pairs(game.item_prototypes['productivity-module'].limitations) do + module_allowed[r] = true +end +]] + +--- align an aabb to the grid by expanding it +local function aabb_align_expand(aabb) + return { + left_top = {x = math.floor(aabb.left_top.x), y = math.floor(aabb.left_top.y)}, + right_bottom = {x = math.ceil(aabb.right_bottom.x), y = math.ceil(aabb.right_bottom.y)} + } +end + +local module_container + +local machine_name = {} + +for k, _ in pairs(config.machine) do + table.insert(machine_name, k) +end + +local module_allowed = { + ['advanced-circuit'] = true, + ['automation-science-pack'] = true, + ['battery'] = true, + ['chemical-science-pack'] = true, + ['copper-cable'] = true, + ['copper-plate'] = true, + ['electric-engine-unit'] = true, + ['electronic-circuit'] = true, + ['empty-barrel'] = true, + ['engine-unit'] = true, + ['explosives'] = true, + ['flying-robot-frame'] = true, + ['iron-gear-wheel'] = true, + ['iron-plate'] = true, + ['iron-stick'] = true, + ['logistic-science-pack'] = true, + ['low-density-structure'] = true, + ['lubricant'] = true, + ['military-science-pack'] = true, + ['nuclear-fuel'] = true, + ['plastic-bar'] = true, + ['processing-unit'] = true, + ['production-science-pack'] = true, + ['rocket-control-unit'] = true, + ['rocket-fuel'] = true, + ['rocket-part'] = true, + ['steel-plate'] = true, + ['stone-brick'] = true, + ['sulfur'] = true, + ['sulfuric-acid'] = true, + ['uranium-fuel-cell'] = true, + ['utility-science-pack'] = true, + ['basic-oil-processing'] = true, + ['advanced-oil-processing'] = true, + ['coal-liquefaction'] = true, + ['heavy-oil-cracking'] = true, + ['light-oil-cracking'] = true, + ['solid-fuel-from-light-oil'] = true, + ['solid-fuel-from-petroleum-gas'] = true, + ['solid-fuel-from-heavy-oil'] = true, + ['uranium-processing'] = true, + ['nuclear-fuel-reprocessing'] = true, + ['kovarex-enrichment-process'] = true +} + +local elem_filter = { + name = {{ + filter = 'name', + name = machine_name + }}, + normal = {{ + filter = 'type', + type = 'module' + }}, + prod = {{ + filter = 'type', + type = 'module' + }, { + filter = 'name', + name = 'productivity', + invert = true + }} +} + +local function clear_module(player, area, machine) + for _, entity in pairs(player.surface.find_entities_filtered{area=area, name=machine, force=player.force}) do + for _, r in pairs(player.surface.find_entities_filtered{position=entity.position, name='item-request-proxy', force=player.force}) do + if r ~= nil then + r.destroy{raise_destroy=true} + end + end + + local m_current_module = entity.get_module_inventory() + + if m_current_module ~= nil then + local m_current_module_content = m_current_module.get_contents() + + if m_current_module_content ~= nil then + for k, m in pairs(m_current_module_content) do + player.surface.spill_item_stack(entity.bounding_box.left_top, {name=k, count=m}, true, player.force, false) + end + end + + m_current_module.clear() + end + end +end + +local function apply_module(player, area, machine, module) + for _, entity in pairs(player.surface.find_entities_filtered{area=area, name=machine, force=player.force}) do + local m_current_recipe = entity.get_recipe() + + -- insert + if m_current_recipe ~= nil then + if module_allowed[m_current_recipe.name] ~= nil then + if module_allowed[m_current_recipe.name] then + entity.surface.create_entity{name='item-request-proxy', target=entity, position=entity.position, force=entity.force, modules=module} + end + end + else + entity.surface.create_entity{name='item-request-proxy', target=entity, position=entity.position, force=entity.force, modules=module} + end + end +end + +--- when an area is selected to add protection to the area +Selection.on_selection(SelectionModuleArea, function(event) + local area = aabb_align_expand(event.area) + local player = game.get_player(event.player_index) + + if player == nil then + return + end + + local frame = Gui.get_left_element(player, module_container) + + for i=1, config.module_row do + local m_machine = frame.container.scroll.table['module_mm_' .. i .. '_0'].elem_value + + if m_machine ~= nil then + local m_module = {} + + for j=1, config.module_slot_max do + local mmo = frame.container.scroll.table['module_mm_' .. i .. '_' .. j].elem_value + + if mmo ~= nil then + if m_module[mmo] == nil then + m_module[mmo] = 1 + else + m_module[mmo] = m_module[mmo] + 1 + end + end + end + + if m_module ~= nil then + clear_module(player, area, m_machine) + apply_module(player, area, m_machine, m_module) + end + end + end +end) + +local function row_set(player, element) + local name = element.name:sub(1, -1 - math.floor(math.log(config.module_slot_max))) + + if element.elem_value ~= nil then + local frame = Gui.get_left_element(player, module_container) + + for i=1, config.module_slot_max do + if i <= game.entity_prototypes[element.elem_value].module_inventory_size then + frame.container.scroll.table[name .. i].enabled = true + frame.container.scroll.table[name .. i].elem_value = config.machine[element.elem_value] + else + frame.container.scroll.table[name .. i].enabled = false + frame.container.scroll.table[name .. i].elem_value = nil + end + frame.container.scroll.table[name .. i].elem_filters = elem_filter.normal + end + else + local frame = Gui.get_left_element(player, module_container) + local mf = elem_filter.normal + + if config.machine_prod_disallow[element.elem_value] ~= nil then + if config.machine_prod_disallow[element.elem_value] then + mf = elem_filter.prod + end + end + + for i=1, config.module_slot_max do + frame.container.scroll.table[name .. i].enabled = true + frame.container.scroll.table[name .. i].elem_filters = mf + frame.container.scroll.table[name .. i].elem_value = nil + end + end +end + +Event.add(defines.events.on_gui_elem_changed, function(event) + row_set(game.players[event.player_index], event.element) +end) + +local button_apply = +Gui.element{ + name = 'module_b', + type = 'button', + caption = 'Apply', + style = 'button' +}:on_click(function(player) + if Selection.is_selecting(player, SelectionModuleArea) then + Selection.stop(player) + else + Selection.start(player, SelectionModuleArea) + end +end) + +module_container = +Gui.element(function(event_trigger, parent) + local container = Gui.container(parent, event_trigger, (config.module_slot_max + 2) * 36) + Gui.header(container, 'Module Inserter', '', true) + + local scroll_table = Gui.scroll_table(container, (config.module_slot_max + 2) * 36, config.module_slot_max + 1) + + for i=1, config.module_row do + scroll_table.add{ + name = 'module_mm_' .. i .. '_0', + type = 'choose-elem-button', + elem_type = 'entity', + elem_filters = elem_filter.name, + style = 'slot_button' + } + + for j=1, config.module_slot_max do + scroll_table.add{ + name = 'module_mm_' .. i .. '_' .. j, + type = 'choose-elem-button', + elem_type = 'item', + elem_filters = elem_filter.normal, + style = 'slot_button' + } + end + end + + button_apply(container) + + return container.parent +end) +:add_to_left_flow() + +Gui.left_toolbar_button('item/productivity-module-3', {'module.main-tooltip'}, module_container, function(player) + return Roles.player_allowed(player, 'gui/module') +end) From 0df9aacd1abd6e17b0421d8e7a2d60f2e2024128 Mon Sep 17 00:00:00 2001 From: PHIDIAS Date: Sat, 23 Sep 2023 05:25:38 +0900 Subject: [PATCH 2/5] module gui locale --- locale/en/gui.cfg | 3 +++ locale/zh-CN/gui.cfg | 3 +++ locale/zh-TW/gui.cfg | 3 +++ 3 files changed, 9 insertions(+) diff --git a/locale/en/gui.cfg b/locale/en/gui.cfg index 623fbbbd..9505fcb2 100644 --- a/locale/en/gui.cfg +++ b/locale/en/gui.cfg @@ -211,3 +211,6 @@ toggle-msg=Fast decon has been __1__ [vlayer] main-tooltip=Enable vlayer GUI + +[module] +main-tooltip=Enable Module GUI diff --git a/locale/zh-CN/gui.cfg b/locale/zh-CN/gui.cfg index dc242759..e7b00aaf 100644 --- a/locale/zh-CN/gui.cfg +++ b/locale/zh-CN/gui.cfg @@ -211,3 +211,6 @@ toggle-msg=樹木快速拆除已 __1__ [vlayer] main-tooltip=Enable vlayer GUI + +[module] +main-tooltip=Enable Module GUI diff --git a/locale/zh-TW/gui.cfg b/locale/zh-TW/gui.cfg index dc242759..e7b00aaf 100644 --- a/locale/zh-TW/gui.cfg +++ b/locale/zh-TW/gui.cfg @@ -211,3 +211,6 @@ toggle-msg=樹木快速拆除已 __1__ [vlayer] main-tooltip=Enable vlayer GUI + +[module] +main-tooltip=Enable Module GUI From 3616efd4f0457df22794bcc437ad553df3aa0f8f Mon Sep 17 00:00:00 2001 From: PHIDIAS Date: Sat, 23 Sep 2023 15:28:38 +0900 Subject: [PATCH 3/5] fix --- config/module.lua | 2 +- modules/gui/module.lua | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/config/module.lua b/config/module.lua index 953b1b3d..10857f16 100644 --- a/config/module.lua +++ b/config/module.lua @@ -1,6 +1,6 @@ return { -- type of machine to handle together - module_row = 4, + default_module_row = 4, module_slot_max = 4, machine_prod_disallow = { ['beacon'] = true diff --git a/modules/gui/module.lua b/modules/gui/module.lua index f6f05b8c..e09e835d 100644 --- a/modules/gui/module.lua +++ b/modules/gui/module.lua @@ -151,7 +151,7 @@ Selection.on_selection(SelectionModuleArea, function(event) local frame = Gui.get_left_element(player, module_container) - for i=1, config.module_row do + for i=1, config.default_module_row do local m_machine = frame.container.scroll.table['module_mm_' .. i .. '_0'].elem_value if m_machine ~= nil then @@ -211,10 +211,6 @@ local function row_set(player, element) end end -Event.add(defines.events.on_gui_elem_changed, function(event) - row_set(game.players[event.player_index], event.element) -end) - local button_apply = Gui.element{ name = 'module_b', @@ -236,7 +232,7 @@ Gui.element(function(event_trigger, parent) local scroll_table = Gui.scroll_table(container, (config.module_slot_max + 2) * 36, config.module_slot_max + 1) - for i=1, config.module_row do + for i=1, config.default_module_row do scroll_table.add{ name = 'module_mm_' .. i .. '_0', type = 'choose-elem-button', @@ -244,7 +240,10 @@ Gui.element(function(event_trigger, parent) elem_filters = elem_filter.name, style = 'slot_button' } - + --[[:on_elem_changed(function(player, element) + row_set(player, element) + end) + ]] for j=1, config.module_slot_max do scroll_table.add{ name = 'module_mm_' .. i .. '_' .. j, From 6e9a64e88aac8f86cd274ee535c885101403f19c Mon Sep 17 00:00:00 2001 From: PHIDIAS Date: Sun, 24 Sep 2023 05:20:13 +0900 Subject: [PATCH 4/5] gui event --- config/module.lua | 2 +- modules/gui/module.lua | 61 +++++++++++++++++++++--------------------- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/config/module.lua b/config/module.lua index 10857f16..cb776990 100644 --- a/config/module.lua +++ b/config/module.lua @@ -1,6 +1,6 @@ return { -- type of machine to handle together - default_module_row = 4, + default_module_row_count = 4, module_slot_max = 4, machine_prod_disallow = { ['beacon'] = true diff --git a/modules/gui/module.lua b/modules/gui/module.lua index e09e835d..2ec7c47d 100644 --- a/modules/gui/module.lua +++ b/modules/gui/module.lua @@ -8,16 +8,6 @@ local config = require 'config.module' --- @dep config.module local Selection = require 'modules.control.selection' --- @dep modules.control.selection local SelectionModuleArea = 'ModuleArea' ---[[ -for some reason this dont work - -local module_allowed = {} - -for _, r in pairs(game.item_prototypes['productivity-module'].limitations) do - module_allowed[r] = true -end -]] - --- align an aabb to the grid by expanding it local function aabb_align_expand(aabb) return { @@ -34,6 +24,14 @@ for k, _ in pairs(config.machine) do table.insert(machine_name, k) end +--[[ +local module_allowed = {} + +for _, r in pairs(game.item_prototypes['productivity-module'].limitations) do + module_allowed[r] = true +end +]] + local module_allowed = { ['advanced-circuit'] = true, ['automation-science-pack'] = true, @@ -151,7 +149,7 @@ Selection.on_selection(SelectionModuleArea, function(event) local frame = Gui.get_left_element(player, module_container) - for i=1, config.default_module_row do + for i=1, config.default_module_row_count do local m_machine = frame.container.scroll.table['module_mm_' .. i .. '_0'].elem_value if m_machine ~= nil then @@ -178,23 +176,20 @@ Selection.on_selection(SelectionModuleArea, function(event) end) local function row_set(player, element) - local name = element.name:sub(1, -1 - math.floor(math.log(config.module_slot_max))) - - if element.elem_value ~= nil then - local frame = Gui.get_left_element(player, module_container) + local frame = Gui.get_left_element(player, module_container) + if frame.container.scroll.table[element .. '0'].elem_value ~= nil then for i=1, config.module_slot_max do - if i <= game.entity_prototypes[element.elem_value].module_inventory_size then - frame.container.scroll.table[name .. i].enabled = true - frame.container.scroll.table[name .. i].elem_value = config.machine[element.elem_value] + if i <= game.entity_prototypes[frame.container.scroll.table[element .. '0'].elem_value].module_inventory_size then + frame.container.scroll.table[element .. i].enabled = true + frame.container.scroll.table[element .. i].elem_value = config.machine[frame.container.scroll.table[element .. '0'].elem_value] else - frame.container.scroll.table[name .. i].enabled = false - frame.container.scroll.table[name .. i].elem_value = nil + frame.container.scroll.table[element .. i].enabled = false + frame.container.scroll.table[element .. i].elem_value = nil end - frame.container.scroll.table[name .. i].elem_filters = elem_filter.normal + frame.container.scroll.table[element .. i].elem_filters = elem_filter.normal end else - local frame = Gui.get_left_element(player, module_container) local mf = elem_filter.normal if config.machine_prod_disallow[element.elem_value] ~= nil then @@ -204,9 +199,9 @@ local function row_set(player, element) end for i=1, config.module_slot_max do - frame.container.scroll.table[name .. i].enabled = true - frame.container.scroll.table[name .. i].elem_filters = mf - frame.container.scroll.table[name .. i].elem_value = nil + frame.container.scroll.table[element .. i].enabled = true + frame.container.scroll.table[element .. i].elem_filters = mf + frame.container.scroll.table[element .. i].elem_value = nil end end end @@ -232,7 +227,7 @@ Gui.element(function(event_trigger, parent) local scroll_table = Gui.scroll_table(container, (config.module_slot_max + 2) * 36, config.module_slot_max + 1) - for i=1, config.default_module_row do + for i=1, config.default_module_row_count do scroll_table.add{ name = 'module_mm_' .. i .. '_0', type = 'choose-elem-button', @@ -240,10 +235,7 @@ Gui.element(function(event_trigger, parent) elem_filters = elem_filter.name, style = 'slot_button' } - --[[:on_elem_changed(function(player, element) - row_set(player, element) - end) - ]] + for j=1, config.module_slot_max do scroll_table.add{ name = 'module_mm_' .. i .. '_' .. j, @@ -264,3 +256,12 @@ end) Gui.left_toolbar_button('item/productivity-module-3', {'module.main-tooltip'}, module_container, function(player) return Roles.player_allowed(player, 'gui/module') end) + + +Event.add(defines.events.on_gui_elem_changed, function(event) + if event.element.name:sub(1, 10) == 'module_mm_' then + if event.element.name:sub(-1) == '0' then + row_set(game.players[event.player_index], 'module_mm_' .. event.element.name:sub(-3):sub(1, 1) .. '_') + end + end +end) From 2381c664b8fda2442f248e543166f089062a3bd0 Mon Sep 17 00:00:00 2001 From: PHIDIAS Date: Sun, 24 Sep 2023 18:15:48 +0900 Subject: [PATCH 5/5] remove extra line --- modules/gui/module.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/gui/module.lua b/modules/gui/module.lua index 2ec7c47d..760ea015 100644 --- a/modules/gui/module.lua +++ b/modules/gui/module.lua @@ -257,7 +257,6 @@ Gui.left_toolbar_button('item/productivity-module-3', {'module.main-tooltip'}, m return Roles.player_allowed(player, 'gui/module') end) - Event.add(defines.events.on_gui_elem_changed, function(event) if event.element.name:sub(1, 10) == 'module_mm_' then if event.element.name:sub(-1) == '0' then