Major overhaul of inner workings:

- Change config layout to entity based;
- Change the gui layout to entity based;
- Fix entity placed event to work with new system;
- Change gui styles to fit other gui's more;
- Added demo entities with items:
* Car;
* Locomotive;
* Spidertron;
* Gun Turret;
* Stone furnace;
* Steel furnace;
This commit is contained in:
badgamernl
2020-09-01 05:43:05 +02:00
parent dac4d40682
commit f1537af711
3 changed files with 440 additions and 200 deletions

View File

@@ -1,98 +1,212 @@
--- This file contains all the different settings for the autofill system and gui --- This file contains all the different settings for the autofill system and gui
-- @config Autofill -- @config Autofill
return { local table = require 'overrides.table' --- @dep overrides.table
local ammo = 'ammo'
local fuel = 'fuel'
local shell = 'shell'
local car = 'car'
local tank = 'tank'
local spidertron = 'spidertron'
local locomotive = 'locomotive'
local gun_turret = 'gun-turret'
local stone_furnace = 'stone-furnace'
local steel_furnace = 'steel-furnace'
local config = {
-- General config -- General config
icon = 'item/piercing-rounds-magazine', --- @setting icon that will be used for the toolbar icon = 'item/piercing-rounds-magazine', --- @setting icon that will be used for the toolbar
entities = { categories = {
['car'] = { ammo = ammo,
[defines.inventory.fuel] = { fuel = fuel,
type = 'fuel', shell = shell
inventory = defines.inventory.fuel,
enabled = true
},
[defines.inventory.car_ammo] = {
type = 'ammo',
inventory = defines.inventory.car_ammo,
enabled = true
}
},
['locomotive'] = {
[defines.inventory.fuel] = {
type = 'fuel',
inventory = defines.inventory.fuel,
enabled = true
}
},
['tank'] = {
[defines.inventory.fuel] = {
type = 'fuel',
inventory = defines.inventory.fuel,
enabled = true
},
[defines.inventory.car_ammo] = {
type = 'ammo',
inventory = defines.inventory.car_ammo,
enabled = true
}
},
['gun-turret'] = {
[defines.inventory.turret_ammo] = {
type = 'ammo',
inventory = defines.inventory.turret_ammo,
enabled = true
}
}
}, },
default_settings = { entities = {
{ car = car,
type = 'ammo', tank = tank,
inventories = {defines.inventory.car_ammo, defines.inventory.turret_ammo}, spidertron = spidertron,
item = 'uranium-rounds-magazine', locomotive = locomotive,
amount = 10, gun_turret = gun_turret,
enabled = false stone_furnace = stone_furnace,
}, steel_furnace = steel_furnace
{ },
type = 'ammo', default_entities = {}
inventories = {defines.inventory.car_ammo, defines.inventory.turret_ammo}, }
item = 'piercing-rounds-magazine',
amount = 10, local default_autofill_item_settings = {
enabled = false {
}, category = config.categories.ammo,
{ entity = {config.entities.car, config.entities.tank, config.entities.gun_turret},
type = 'ammo', type = {defines.inventory.car_ammo, defines.inventory.turret_ammo},
inventories = {defines.inventory.car_ammo, defines.inventory.turret_ammo}, name = 'uranium-rounds-magazine',
item = 'firearm-magazine', amount = 10,
amount = 10, enabled = false
enabled = false },
}, {
{ category = config.categories.ammo,
type = 'fuel', entity = {config.entities.car, config.entities.tank, config.entities.gun_turret},
inventories = {defines.inventory.fuel}, type = {defines.inventory.car_ammo, defines.inventory.turret_ammo},
item = 'nuclear-fuel', name = 'piercing-rounds-magazine',
amount = 1, amount = 10,
enabled = false enabled = false
}, },
{ {
type = 'fuel', category = config.categories.ammo,
inventories = {defines.inventory.fuel}, entity = {config.entities.car, config.entities.tank, config.entities.gun_turret},
item = 'rocket-fuel', type = {defines.inventory.car_ammo, defines.inventory.turret_ammo},
amount = 10, name = 'firearm-magazine',
enabled = false amount = 10,
}, enabled = false
{ },
type = 'fuel', {
inventories = {defines.inventory.fuel}, category = config.categories.ammo,
item = 'solid-fuel', entity = {config.entities.tank},
amount = 10, type = {defines.inventory.car_ammo},
enabled = false name = 'flamethrower-ammo',
}, amount = 10,
{ enabled = false
type = 'fuel', },
inventories = {defines.inventory.fuel}, {
item = 'coal', category = config.categories.shell,
amount = 10, entity = {config.entities.tank},
enabled = false type = {defines.inventory.car_ammo},
} name = 'cannon-shell',
amount = 10,
enabled = false
},
{
category = config.categories.shell,
entity = {config.entities.tank},
type = {defines.inventory.car_ammo},
name = 'explosive-cannon-shell',
amount = 10,
enabled = false
},
{
category = config.categories.shell,
entity = {config.entities.tank},
type = {defines.inventory.car_ammo},
name = 'uranium-cannon-shell',
amount = 10,
enabled = false
},
{
category = config.categories.shell,
entity = {config.entities.tank},
type = {defines.inventory.car_ammo},
name = 'explosive-uranium-cannon-shell',
amount = 10,
enabled = false
},
{
category = config.categories.ammo,
entity = {config.entities.spidertron},
type = {defines.inventory.car_ammo},
name = 'rocket',
amount = 10,
enabled = false
},
{
category = config.categories.ammo,
entity = {config.entities.spidertron},
type = {defines.inventory.car_ammo},
name = 'explosive-rocket',
amount = 10,
enabled = false
},
{
category = config.categories.ammo,
entity = {config.entities.spidertron},
type = {defines.inventory.car_ammo},
name = 'atomic-bomb',
amount = 10,
enabled = false
},
{
category = config.categories.fuel,
entity = {config.entities.car, config.entities.tank, config.entities.locomotive, config.entities.stone_furnace, config.entities.steel_furnace},
type = {defines.inventory.fuel},
name = 'nuclear-fuel',
amount = 1,
enabled = false
},
{
category = config.categories.fuel,
entity = {config.entities.car, config.entities.tank, config.entities.locomotive, config.entities.stone_furnace, config.entities.steel_furnace},
type = {defines.inventory.fuel},
name = 'rocket-fuel',
amount = 10,
enabled = false
},
{
category = config.categories.fuel,
entity = {config.entities.car, config.entities.tank, config.entities.locomotive, config.entities.stone_furnace, config.entities.steel_furnace},
type = {defines.inventory.fuel},
name = 'solid-fuel',
amount = 10,
enabled = false
},
{
category = config.categories.fuel,
entity = {config.entities.car, config.entities.tank, config.entities.locomotive, config.entities.stone_furnace, config.entities.steel_furnace},
type = {defines.inventory.fuel},
name = 'coal',
amount = 10,
enabled = false
} }
} }
local function get_items_by_type(entity, type)
local items = entity.items
for _, item in pairs(default_autofill_item_settings) do
if table.contains(item.entity, entity.entity) then
if table.contains(item.type, type) then
items[item.name] = {
entity = entity.entity,
category = item.category,
type = type,
name = item.name,
amount = item.amount,
enabled = item.enabled
}
end
end
end
return items
end
local default_entities = config.default_entities
local function generate_default_setting(entity_name, type, enabled)
if not default_entities[entity_name] then
default_entities[entity_name] = {
entity = entity_name,
enabled = enabled,
items = {}
}
end
get_items_by_type(default_entities[entity_name], type)
end
generate_default_setting(config.entities.car, defines.inventory.fuel, true)
generate_default_setting(config.entities.car, defines.inventory.car_ammo, true)
generate_default_setting(config.entities.locomotive, defines.inventory.fuel, true)
generate_default_setting(config.entities.tank, defines.inventory.fuel, true)
generate_default_setting(config.entities.tank, defines.inventory.car_ammo, true)
generate_default_setting(config.entities.spidertron, defines.inventory.car_ammo, true)
generate_default_setting(config.entities.gun_turret, defines.inventory.turret_ammo, true)
generate_default_setting(config.entities.stone_furnace, defines.inventory.fuel, true)
generate_default_setting(config.entities.steel_furnace, defines.inventory.fuel, true)
-- Cleanup temporary table
default_autofill_item_settings = nil
return config

View File

@@ -83,13 +83,12 @@ discard-tooltip=Remove task
[autofill] [autofill]
main-tooltip=Autofill settings main-tooltip=Autofill settings
ammo-caption=Ammo Autofill toggle-section-tooltip=Expand Section
ammo-tooltip=Autofill settings when playing entities with a ammo slot toggle-section-collapse-tooltip=Collapse Section
fuel-caption=Fuel Autofill toggle-entity-tooltip=Toggle the autofill of __1__ entity (overwrites autofill settings of the entity)
fuel-tooltip=Autofill settings when placing entities with a fuel slot
toggle-tooltip=Toggle the autofill of __1__ into the __2__ slot of entities toggle-tooltip=Toggle the autofill of __1__ into the __2__ slot of entities
amount-tooltip=Amount of items it will try and put into the __1__ slot of entities amount-tooltip=Amount of items it will try and put into the __1__ slot of __2__
confirmed=Set autofill amount to __1__ for __2__ confirmed=Set autofill amount to __1__ __2__ for __3__
filled=Autofilled the __1__ with __2__ __3__ filled=Autofilled the __1__ with __2__ __3__
[warp-list] [warp-list]
main-caption=Warp List main-caption=Warp List

View File

@@ -25,99 +25,232 @@ local function rich_img(type, value)
return '[img='..type..'/'..value..']' return '[img='..type..'/'..value..']'
end end
--- Draw a section header and main scroll -- Button to toggle a section dropdown
-- @element autofill_section_container -- @element toggle_section
local section = local toggle_section =
Gui.element(function(_, parent, section_name, table_size) Gui.element{
-- Draw the header for the section type = 'sprite-button',
Gui.header( sprite = 'utility/expand_dark',
parent, hovered_sprite = 'utility/expand',
{'autofill.'..section_name..'-caption'}, tooltip = {'autofill.toggle-section-tooltip'}
{'autofill.'..section_name..'-tooltip'}, }
true, toggle_section
section_name..'-header' :style(Gui.sprite_style(20))
) :on_click(function(_, element, _)
-- Table used to display the settings local header_flow = element.parent
local scroll_table = Gui.scroll_table(parent, 215, table_size, section_name..'-scroll-table') local flow_name = header_flow.caption
return scroll_table local flow = header_flow.parent.parent[flow_name]
end) if Gui.toggle_visible_state(flow) then
element.sprite = 'utility/collapse_dark'
local toggle_item_button = element.hovered_sprite = 'utility/collapse'
Gui.element(function(event_trigger, parent, setting) element.tooltip = {'autofill.toggle-section-collapse-tooltip'}
return parent.add{ else
name = event_trigger, element.sprite = 'utility/expand_dark'
type = 'sprite-button', element.hovered_sprite = 'utility/expand'
sprite = 'item/'..setting.item, element.tooltip = {'autofill.toggle-section-tooltip'}
tooltip = {'autofill.toggle-tooltip', rich_img('item', setting.item), setting.type}, end
style = 'shortcut_bar_button_red' local event = {}
} for _, child in pairs(element.parent.parent.children) do
end) if child.alignment and child.alignment[toggle_section.name] then
:style(Gui.sprite_style(32, nil, { right_margin = -3 })) if element.parent.name ~= child.name then
:on_click(function(player, element) event.element = child.alignment[toggle_section.name]
for _, setting in pairs(autofill_player_settings[player.name]) do toggle_section:raise_custom_event(event)
if 'item/'..setting.item == element.sprite then
if setting.enabled then
setting.enabled = false
element.style = 'shortcut_bar_button_red'
else
setting.enabled = true
element.style = 'shortcut_bar_button_green'
end end
end end
end end
end) end)
-- Used to assign an event to the header label to trigger a toggle
-- @element header_toggle
local header_toggle = Gui.element()
:on_click(function(_, element, event)
event.element = element.parent.alignment[toggle_section.name]
toggle_section:raise_custom_event(event)
end)
-- Used to assign an event to the header label to trigger a toggle
-- @element header_toggle
local entity_toggle = Gui.element(function(event_trigger, parent, entity_name)
return parent.add{
name = event_trigger,
type = 'sprite-button',
sprite = 'item/'..entity_name,
tooltip = {'autofill.toggle-entity-tooltip', rich_img('item', entity_name)},
style = 'shortcut_bar_button_green'
}
end)
:style(Gui.sprite_style(22))
:on_click(function(player, element, _)
local entity_name = string.sub(element.parent.parent.name, 0, -(1 + string.len('-header')))
if not autofill_player_settings[player.name] then return end
local setting = autofill_player_settings[player.name][entity_name]
if not setting then return end
if setting.enabled then
setting.enabled = false
element.style = 'shortcut_bar_button_red'
else
setting.enabled = true
element.style = 'shortcut_bar_button_green'
end
end)
--- Draw a section header and main scroll
-- @element autofill_section_container
local section =
Gui.element(function(_, parent, section_name, table_size)
-- Draw the header for the section
local header = Gui.header(
parent,
{'entity-name.'..section_name},
{'autofill.toggle-section-tooltip'},
true,
section_name..'-header',
header_toggle.name
)
-- Right aligned button to toggle the section
header.caption = section_name
entity_toggle(header, section_name)
toggle_section(header)
-- Table used to display the settings
local scroll_table = Gui.scroll_table(parent, 999, table_size, section_name)
scroll_table.parent.visible = false
return scroll_table
end)
local toggle_item_button =
Gui.element(function(event_trigger, parent, item)
return parent.add{
name = event_trigger,
type = 'sprite-button',
sprite = 'item/'..item.name,
tooltip = {'autofill.toggle-tooltip', rich_img('item', item.name), item.category},
style = 'shortcut_bar_button_red'
}
end)
:style(Gui.sprite_style(32, nil, { right_margin = -3 }))
:on_click(function(player, element)
local item_name = string.sub(element.parent.name, 1 + string.len('toggle-setting-'), -1)
local entity_name = element.parent.parent.parent.parent.parent.parent.name
if not autofill_player_settings[player.name] then return end
local setting = autofill_player_settings[player.name][entity_name]
if not setting then return end
local item = setting.items[item_name]
if not item then return end
if item.enabled then
item.enabled = false
element.style = 'shortcut_bar_button_red'
else
item.enabled = true
element.style = 'shortcut_bar_button_green'
end
end)
local amount_textfield = local amount_textfield =
Gui.element(function(event_trigger, parent, setting) Gui.element(function(event_trigger, parent, item)
return parent.add{ return parent.add{
name = event_trigger, name = event_trigger,
type = 'textfield', type = 'textfield',
text = setting.amount, text = item.amount,
tooltip = {'autofill.amount-tooltip', setting.type}, tooltip = {'autofill.amount-tooltip', item.category, rich_img('item', item.entity) },
clear_and_focus_on_right_click = true clear_and_focus_on_right_click = true
} }
end) end)
:style{ :style{
maximal_width = 90, maximal_width = 40,
height = 32, height = 31,
padding = -2 padding = -2
} }
:on_confirmed(function(player, element, _) :on_confirmed(function(player, element, _)
local parent_name = element.parent.name local item_name = string.sub(element.parent.name, 1 + string.len('toggle-setting-'), -1)
for _, setting in pairs(autofill_player_settings[player.name]) do local entity_name = element.parent.parent.parent.parent.parent.parent.name
if 'amount-setting-'..setting.item == parent_name then if not autofill_player_settings[player.name] then return end
setting.amount = tonumber(element.text) local setting = autofill_player_settings[player.name][entity_name]
player.print({'autofill.confirmed', setting.amount, '[img=item/'..setting.item..']'}) if not setting then return end
end local item = setting.items[item_name]
end if not item then return end
item.amount = tonumber(element.text)
player.print({'autofill.confirmed', item.amount, rich_img('item', item.name), rich_img('entity', entity_name) })
end) end)
local add_autofill_setting = local add_autofill_setting =
Gui.element(function(_, parent, setting) Gui.element(function(_, parent, item)
local toggle_flow = parent.add{ type = 'flow', name = 'toggle-setting-'..setting.item } local toggle_flow = parent.add{ type = 'flow', name = 'toggle-setting-'..item.name }
local amount_flow = parent.add{ type = 'flow', name = 'amount-setting-'..setting.item } local amount_flow = parent.add{ type = 'flow', name = 'amount-setting-'..item.name }
toggle_flow.style.padding = 0 toggle_flow.style.padding = 0
amount_flow.style.padding = 0 amount_flow.style.padding = 0
toggle_item_button(toggle_flow, setting) toggle_item_button(toggle_flow, item)
amount_textfield(amount_flow, setting) amount_textfield(amount_flow, item)
end) end)
local toggle_item_button_empty =
Gui.element(function(_, parent, i)
return parent.add{
name = 'toggle-setting-empty-frame-'..i,
type = 'sprite-button'
}
end)
:style(Gui.sprite_style(32, nil, { right_margin = -3 }))
local amount_textfield_empty =
Gui.element(function(_, parent, i)
return parent.add{
name = 'amount-setting-empty-frame-'..i,
type = 'textfield'
}
end)
:style{ maximal_width = 40, height = 31, padding = -2 }
local add_empty_autofill_setting =
Gui.element(function(_, parent, i)
local toggle_flow = parent.add{ type = 'flow', name = 'toggle-setting-empty-'..i }
local amount_flow = parent.add{ type = 'flow', name = 'amount-setting-empty-'..i }
toggle_flow.style.padding = 0
amount_flow.style.padding = 0
local toggle_element = toggle_item_button_empty(toggle_flow, i)
toggle_element.enabled = false
local amount_element = amount_textfield_empty(amount_flow, i)
amount_element.enabled = false
end)
--- Main gui container for the left flow --- Main gui container for the left flow
-- @element autofill_container -- @element autofill_container
autofill_container = autofill_container =
Gui.element(function(event_trigger, parent) Gui.element(function(event_trigger, parent)
-- Draw the internal container -- Draw the internal container
local container = Gui.container(parent, event_trigger, 100) local container = Gui.container(parent, event_trigger)
container.parent.style.minimal_width = 245
-- Draw the header -- Draw the header
local ammo_table = section(container, 'ammo', 2) for _, setting in pairs(config.default_entities) do
local fuel_table = section(container, 'fuel', 2) local table_sizes = {}
local tables = {}
local entity_table = section(container, setting.entity, 3)
for _, category in pairs(config.categories) do
if not table_sizes[category] then table_sizes[category] = 0 end
local alignment = Gui.alignment(entity_table, category..'-'..setting.entity, 'center', 'top')
alignment.style.padding = 0
local category_table = Gui.scroll_table(alignment, 999, 2, category)
category_table.parent.style.padding = 0
tables[category] = category_table
for _, item in pairs(setting.items) do
if item.category == category then
add_autofill_setting(category_table, item)
table_sizes[category] = table_sizes[category] + 1
end
end
end
for _, setting in pairs(config.default_settings) do local t = table.get_values(table_sizes)
if setting.type == 'ammo' then table.sort(t)
add_autofill_setting(ammo_table, setting) local biggest = t[#t]
elseif setting.type == 'fuel' then for category, size in pairs(table_sizes) do
add_autofill_setting(fuel_table, setting) for i=biggest-size,1,-1 do
add_empty_autofill_setting(tables[category], i)
end
end end
end end
@@ -134,8 +267,10 @@ Gui.left_toolbar_button(config.icon, {'autofill.main-tooltip'}, autofill_contain
Event.add(defines.events.on_player_created, function(event) Event.add(defines.events.on_player_created, function(event)
local player = game.players[event.player_index] local player = game.players[event.player_index]
if not autofill_player_settings[player.name] then if not autofill_player_settings[player.name] then
autofill_player_settings[player.name] = table.deep_copy(config.default_settings) autofill_player_settings[player.name] = table.deep_copy(config.default_entities)
end end
print(game.table_to_json(autofill_player_settings[player.name]))
end) end)
local function entity_build(event) local function entity_build(event)
@@ -146,54 +281,46 @@ local function entity_build(event)
end end
-- Check if the entity is in the config and enabled -- Check if the entity is in the config and enabled
local entity = event.created_entity local entity = event.created_entity
local entity_configs = config.entities[entity.name]
if not entity_configs then -- Check if player has settings
return if not autofill_player_settings[player.name] then return end
end
-- Check if autofill for the entity is enabled
if not autofill_player_settings[player.name][entity.name] then return end
-- Get the inventory of the player -- Get the inventory of the player
local player_inventory = player.get_main_inventory() local player_inventory = player.get_main_inventory()
local text_position = { x = entity.position.x, y = entity.position.y } local text_position = { x = entity.position.x, y = entity.position.y }
-- Loop over all possible item settings to insert into the entity -- Loop over all possible items to insert into the entity
for _, setting in pairs(autofill_player_settings[player.name]) do for _, item in pairs(autofill_player_settings[player.name][entity.name].items) do
if not setting.enabled then -- Check if the item is enabled or goto next item
goto end_setting if not item.enabled then goto end_item end
end
-- Loop over possible inventories for this setting to put into the vehicle
for _, inventory in pairs(setting.inventories) do
-- Check in the configs if the inventory type exists and is enabled for this vehicle
if not entity_configs[inventory] or not entity_configs[inventory].enabled then
goto end_inventory
end
-- Get the inventory of the entity -- Get the inventory of the entity or goto next item
local entity_inventory = entity.get_inventory(inventory) local entity_inventory = entity.get_inventory(item.type)
if not entity_inventory then if not entity_inventory then goto end_item end
goto end_inventory
end
local item = setting.item local preferd_amount = item.amount
local preferd_amount = setting.amount local item_amount = player_inventory.get_item_count(item.name)
local item_amount = player_inventory.get_item_count(item) if item_amount ~= 0 then
if item_amount ~= 0 then local inserted
local inserted text_position.y = text_position.y - 0.2
text_position.y = text_position.y - 0.2 if item_amount >= preferd_amount then
if item_amount >= preferd_amount then -- Can item be inserted? no, goto next item!
if not entity_inventory.can_insert({name=item, count=preferd_amount}) then if not entity_inventory.can_insert({name=item.name, count=preferd_amount}) then
goto end_inventory goto end_item
end
inserted = entity_inventory.insert({name=item, count=preferd_amount})
player_inventory.remove({name=item, count=inserted})
print_text(entity.surface, text_position, {'autofill.filled', rich_img('entity', entity.name), inserted, rich_img('item', item) }, { r = 0, g = 255, b = 0, a = 1})
else
inserted = entity_inventory.insert({name=item, count=item_amount})
player_inventory.remove({name=item, count=inserted})
print_text(entity.surface, text_position, {'autofill.filled', rich_img('entity', entity.name), inserted, rich_img('item', item) }, { r = 255, g = 165, b = 0, a = 1})
end end
inserted = entity_inventory.insert({name=item.name, count=preferd_amount})
player_inventory.remove({name=item.name, count=inserted})
print_text(entity.surface, text_position, {'autofill.filled', rich_img('entity', entity.name), inserted, rich_img('item', item.name) }, { r = 0, g = 255, b = 0, a = 1})
else
inserted = entity_inventory.insert({name=item.name, count=item_amount})
player_inventory.remove({name=item.name, count=inserted})
print_text(entity.surface, text_position, {'autofill.filled', rich_img('entity', entity.name), inserted, rich_img('item', item.name) }, { r = 255, g = 165, b = 0, a = 1})
end end
::end_inventory::
end end
::end_setting:: ::end_item::
end end
end end