From 17d07ac228a95d3ca6fb0c7158a613b72accc53e Mon Sep 17 00:00:00 2001 From: PHIDIAS Date: Sat, 23 Sep 2023 05:07:20 +0900 Subject: [PATCH] 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)