addon module inserter gui

This commit is contained in:
2023-09-23 05:07:20 +09:00
parent 72153df210
commit 17d07ac228
4 changed files with 290 additions and 2 deletions

267
modules/gui/module.lua Normal file
View File

@@ -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)