Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

addon module inserter gui #248

Merged
merged 7 commits into from
Sep 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion config/_file_loader.lua
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ return {
'modules.gui.server-ups',
'modules.gui.vlayer',
'modules.gui.research',

'modules.gui.module',
'modules.graftorio.require', -- graftorio

--- Config Files
Expand Down
3 changes: 2 additions & 1 deletion config/expcore/roles.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
20 changes: 20 additions & 0 deletions config/module.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
return {
-- type of machine to handle together
default_module_row_count = 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'
}
}
3 changes: 3 additions & 0 deletions locale/en/gui.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -211,3 +211,6 @@ toggle-msg=Fast decon has been __1__

[vlayer]
main-tooltip=Enable Vlayer GUI

[module]
main-tooltip=Enable Module GUI
3 changes: 3 additions & 0 deletions locale/zh-CN/gui.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -211,3 +211,6 @@ toggle-msg=樹木快速拆除已 __1__

[vlayer]
main-tooltip=Enable Vlayer GUI

[module]
main-tooltip=Enable Module GUI
3 changes: 3 additions & 0 deletions locale/zh-TW/gui.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -211,3 +211,6 @@ toggle-msg=樹木快速拆除已 __1__

[vlayer]
main-tooltip=Enable Vlayer GUI

[module]
main-tooltip=Enable Module GUI
266 changes: 266 additions & 0 deletions modules/gui/module.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,266 @@
---- 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'

--- 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 = {}

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,
['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)
PHIDIAS0303 marked this conversation as resolved.
Show resolved Hide resolved
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.default_module_row_count 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 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[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[element .. i].enabled = false
frame.container.scroll.table[element .. i].elem_value = nil
end
frame.container.scroll.table[element .. i].elem_filters = elem_filter.normal
end
else
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[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

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.default_module_row_count 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)

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