mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2025-12-27 11:35:22 +09:00
Vlayer Update (#254)
* redo * waterfill role * update * spacing * Apply solar_power_multiplier in one location * Better surface handling * Fix circuit interface with too many modded items * Better energy interfaces * update vlayer * auto down grade config * Fix production multiplier to work with fake surface * Add doc comments to vlayer * Update vlayer.lua --------- Co-authored-by: Cooldude2606 <25043174+Cooldude2606@users.noreply.github.com>
This commit is contained in:
@@ -1,276 +1,404 @@
|
||||
--- Adds a virtual layer to store power to save space.
|
||||
-- @addon Virtual Layer
|
||||
--[[-- Gui Module - Virtual Layer
|
||||
- Adds a virtual layer to store power to save space.
|
||||
@gui Virtual Layer
|
||||
@alias vlayer_container
|
||||
]]
|
||||
|
||||
local Gui = require 'expcore.gui' --- @dep expcore.gui
|
||||
local Roles = require 'expcore.roles' --- @dep expcore.roles
|
||||
local Event = require 'utils.event' --- @dep utils.event
|
||||
local format_number = require('util').format_number --- @dep util
|
||||
local config = require 'config.vlayer' --- @dep config.vlayer
|
||||
local format_number = require('util').format_number
|
||||
local vlayer = require 'modules.control.vlayer'
|
||||
|
||||
local vlayer_container
|
||||
local vlayer_display = {}
|
||||
|
||||
local function pos_to_gps_string(pos)
|
||||
return '[gps=' .. tostring(pos.x) .. ',' .. tostring(pos.y) .. ']'
|
||||
end
|
||||
|
||||
for i=1, #config.gui.content do
|
||||
if config.gui.content[i].type == 'item' or config.gui.content[i].type == 'signal' then
|
||||
vlayer_display[i] = {
|
||||
type = config.gui.content[i].type,
|
||||
name = config.gui.content[i].name,
|
||||
count = 0
|
||||
}
|
||||
local function format_energy(amount, unit)
|
||||
if amount < 1 then
|
||||
return '0 ' .. unit
|
||||
end
|
||||
|
||||
local suffix = ''
|
||||
local suffix_list = {
|
||||
['T'] = 1000000000000,
|
||||
['G'] = 1000000000,
|
||||
['M'] = 1000000,
|
||||
['k'] = 1000
|
||||
}
|
||||
|
||||
for letter, limit in pairs (suffix_list) do
|
||||
if math.abs(amount) >= limit then
|
||||
amount = string.format('%.1f', amount / limit)
|
||||
suffix = letter
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
local formatted, k = amount
|
||||
|
||||
while true do
|
||||
formatted, k = string.gsub(formatted, '^(-?%d+)(%d%d%d)', '%1,%2')
|
||||
|
||||
if (k == 0) then
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
return formatted .. ' ' .. suffix .. unit
|
||||
end
|
||||
|
||||
local function vlayer_convert_chest(player)
|
||||
local entities = player.surface.find_entities_filtered{position=player.position, radius=8, name='steel-chest', force=player.force}
|
||||
if (not entities or (#entities == 0)) then
|
||||
return nil
|
||||
local entities = player.surface.find_entities_filtered{position=player.position, radius=8, name='steel-chest', force=player.force, limit=1}
|
||||
|
||||
if (not entities or #entities == 0) then
|
||||
player.print('No steel chest detected')
|
||||
return
|
||||
end
|
||||
|
||||
local target_chest = player.surface.get_closest(player.position, entities)
|
||||
if (not target_chest) then
|
||||
player.print('No Steel Chest Detected')
|
||||
return nil
|
||||
end
|
||||
local entity = entities[1]
|
||||
local pos = entity.position
|
||||
|
||||
if (not target_chest.get_inventory(defines.inventory.chest).is_empty()) then
|
||||
if (not entity.get_inventory(defines.inventory.chest).is_empty()) then
|
||||
player.print('Chest is not emptied')
|
||||
return nil
|
||||
end
|
||||
|
||||
local pos = target_chest.position
|
||||
|
||||
if (not target_chest.destroy()) then
|
||||
player.print('Unable to convert chest')
|
||||
return nil
|
||||
end
|
||||
|
||||
return {x=math.floor(pos.x), y=math.floor(pos.y)}
|
||||
entity.destroy()
|
||||
return {x=string.format('%.1f', pos.x), y=string.format('%.1f', pos.y)}
|
||||
end
|
||||
|
||||
local function vlayer_convert_chest_storage_input(player)
|
||||
--- Display label for the number of solar panels
|
||||
-- @element vlayer_gui_display_item_solar_name
|
||||
local vlayer_gui_display_item_solar_name =
|
||||
Gui.element{
|
||||
type = 'label',
|
||||
name = 'vlayer_display_item_solar_name',
|
||||
caption = '[img=entity/solar-panel] Solar Panel',
|
||||
style = 'heading_1_label'
|
||||
}:style{
|
||||
width = 200
|
||||
}
|
||||
|
||||
local vlayer_gui_display_item_solar_count =
|
||||
Gui.element{
|
||||
type = 'label',
|
||||
name = 'vlayer_display_item_solar_count',
|
||||
caption = '0',
|
||||
style = 'heading_1_label'
|
||||
}:style{
|
||||
width = 120
|
||||
}
|
||||
|
||||
--- Display label for the number of accumulators
|
||||
-- @element vlayer_gui_display_item_accumulator_name
|
||||
local vlayer_gui_display_item_accumulator_name =
|
||||
Gui.element{
|
||||
type = 'label',
|
||||
name = 'vlayer_display_item_accumulator_name',
|
||||
caption = '[img=entity/accumulator] Accumulator',
|
||||
style = 'heading_1_label'
|
||||
}:style{
|
||||
width = 200
|
||||
}
|
||||
|
||||
local vlayer_gui_display_item_accumulator_count =
|
||||
Gui.element{
|
||||
type = 'label',
|
||||
name = 'vlayer_display_item_accumulator_count',
|
||||
caption = '0',
|
||||
style = 'heading_1_label'
|
||||
}:style{
|
||||
width = 120
|
||||
}
|
||||
|
||||
--- Display label for the current energy production
|
||||
-- @element vlayer_gui_display_signal_production_name
|
||||
local vlayer_gui_display_signal_production_name =
|
||||
Gui.element{
|
||||
type = 'label',
|
||||
name = 'vlayer_display_signal_peak_name',
|
||||
caption = '[virtual-signal=signal-P] Current Production',
|
||||
style = 'heading_1_label'
|
||||
}:style{
|
||||
width = 200
|
||||
}
|
||||
|
||||
local vlayer_gui_display_signal_production_count =
|
||||
Gui.element{
|
||||
type = 'label',
|
||||
name = 'vlayer_display_signal_peak_solar_count',
|
||||
caption = '0',
|
||||
style = 'heading_1_label'
|
||||
}:style{
|
||||
width = 120
|
||||
}
|
||||
|
||||
--- Display label for the sustained energy production
|
||||
-- @element vlayer_gui_display_signal_sustained_name
|
||||
local vlayer_gui_display_signal_sustained_name =
|
||||
Gui.element{
|
||||
type = 'label',
|
||||
name = 'vlayer_display_signal_sustained_name',
|
||||
caption = '[virtual-signal=signal-S] Sustained Production',
|
||||
style = 'heading_1_label'
|
||||
}:style{
|
||||
width = 200
|
||||
}
|
||||
|
||||
local vlayer_gui_display_signal_sustained_count =
|
||||
Gui.element{
|
||||
type = 'label',
|
||||
name = 'vlayer_display_signal_sustained_count',
|
||||
caption = '0',
|
||||
style = 'heading_1_label'
|
||||
}:style{
|
||||
width = 120
|
||||
}
|
||||
|
||||
--- Display label for the sustained energy capacity
|
||||
-- @element vlayer_gui_display_signal_capacity_name
|
||||
local vlayer_gui_display_signal_capacity_name =
|
||||
Gui.element{
|
||||
type = 'label',
|
||||
name = 'vlayer_display_signal_max_name',
|
||||
caption = '[virtual-signal=signal-C] Battery Capacity',
|
||||
style = 'heading_1_label'
|
||||
}:style{
|
||||
width = 200
|
||||
}
|
||||
|
||||
local vlayer_gui_display_signal_capacity_count =
|
||||
Gui.element{
|
||||
type = 'label',
|
||||
name = 'vlayer_display_signal_max_count',
|
||||
caption = '0',
|
||||
style = 'heading_1_label'
|
||||
}:style{
|
||||
width = 120
|
||||
}
|
||||
|
||||
--- Display label for the current energy in storage
|
||||
-- @element vlayer_gui_display_signal_current_name
|
||||
local vlayer_gui_display_signal_current_name =
|
||||
Gui.element{
|
||||
type = 'label',
|
||||
name = 'vlayer_display_signal_current_name',
|
||||
caption = '[virtual-signal=signal-E] Battery Charge',
|
||||
style = 'heading_1_label'
|
||||
}:style{
|
||||
width = 200
|
||||
}
|
||||
|
||||
local vlayer_gui_display_signal_current_count =
|
||||
Gui.element{
|
||||
type = 'label',
|
||||
name = 'vlayer_display_signal_current_count',
|
||||
caption = '0',
|
||||
style = 'heading_1_label'
|
||||
}:style{
|
||||
width = 120
|
||||
}
|
||||
|
||||
--- A vertical flow containing all the displays labels and their counts
|
||||
-- @element vlayer_display_set
|
||||
local vlayer_display_set =
|
||||
Gui.element(function(_, parent, name)
|
||||
local vlayer_set = parent.add{type='flow', direction='vertical', name=name}
|
||||
local disp = Gui.scroll_table(vlayer_set, 320, 2, 'disp')
|
||||
|
||||
vlayer_gui_display_item_solar_name(disp)
|
||||
vlayer_gui_display_item_solar_count(disp)
|
||||
vlayer_gui_display_item_accumulator_name(disp)
|
||||
vlayer_gui_display_item_accumulator_count(disp)
|
||||
vlayer_gui_display_signal_production_name(disp)
|
||||
vlayer_gui_display_signal_production_count(disp)
|
||||
vlayer_gui_display_signal_sustained_name(disp)
|
||||
vlayer_gui_display_signal_sustained_count(disp)
|
||||
vlayer_gui_display_signal_capacity_name(disp)
|
||||
vlayer_gui_display_signal_capacity_count(disp)
|
||||
vlayer_gui_display_signal_current_name(disp)
|
||||
vlayer_gui_display_signal_current_count(disp)
|
||||
|
||||
return vlayer_set
|
||||
end)
|
||||
|
||||
local function pos_to_gps_string(pos)
|
||||
return '[gps=' .. string.format('%.1f', pos.x) .. ',' .. string.format('%.1f', pos.y) .. ']'
|
||||
end
|
||||
|
||||
--- A button used to add a new storage input interface
|
||||
-- @element vlayer_gui_control_storage_input
|
||||
local vlayer_gui_control_storage_input =
|
||||
Gui.element{
|
||||
type = 'button',
|
||||
caption = 'Add Input Storage'
|
||||
}:style{
|
||||
width = 160
|
||||
}:on_click(function(player, element, _)
|
||||
local pos = vlayer_convert_chest(player)
|
||||
|
||||
if (pos) then
|
||||
local vlayer_storage = player.surface.create_entity{name='logistic-chest-storage', position=pos, force='neutral'}
|
||||
game.print(player.name .. ' built a vlayer input on ' .. pos_to_gps_string(pos))
|
||||
vlayer_storage.destructible = false
|
||||
vlayer_storage.minable = false
|
||||
vlayer_storage.operable = true
|
||||
vlayer_storage.last_user = player
|
||||
table.insert(vlayer.storage.input, vlayer_storage)
|
||||
vlayer.create_input_interface(player.surface, pos, player)
|
||||
game.print(player.name .. ' built a vlayer storage input on ' .. pos_to_gps_string(pos))
|
||||
end
|
||||
end
|
||||
|
||||
local function vlayer_convert_chest_power(player)
|
||||
element.enabled = (vlayer.get_interface_counts().storage_input < config.interface_limit.storage_input)
|
||||
end)
|
||||
|
||||
--- A button used to add a new storage output interface
|
||||
-- @element vlayer_gui_control_storage_output
|
||||
local vlayer_gui_control_storage_output =
|
||||
Gui.element{
|
||||
type = 'button',
|
||||
caption = 'Add Output Storage'
|
||||
}:style{
|
||||
width = 160
|
||||
}:on_click(function(player, element, _)
|
||||
local pos = vlayer_convert_chest(player)
|
||||
|
||||
if (pos) then
|
||||
if (player.surface.can_place_entity{name='electric-energy-interface', position=pos})then
|
||||
local vlayer_power = player.surface.create_entity{name='electric-energy-interface', position=pos, force='neutral'}
|
||||
game.print(player.name .. ' built a vlayer energy interface on ' .. pos_to_gps_string(pos))
|
||||
vlayer_power.destructible = false
|
||||
vlayer_power.minable = false
|
||||
vlayer_power.operable = false
|
||||
vlayer_power.last_user = player
|
||||
vlayer_power.electric_buffer_size = math.floor(config.energy_base_limit / 2)
|
||||
vlayer_power.power_production = math.floor(config.energy_base_limit / 60)
|
||||
vlayer_power.power_usage = math.floor(config.energy_base_limit / 60)
|
||||
vlayer_power.energy = 0
|
||||
table.insert(vlayer.power.entity, vlayer_power)
|
||||
else
|
||||
player.print('Unable to build energy entity')
|
||||
end
|
||||
vlayer.create_output_interface(player.surface, pos, player)
|
||||
game.print(player.name .. ' built a vlayer storage output on ' .. pos_to_gps_string(pos))
|
||||
end
|
||||
end
|
||||
|
||||
local function vlayer_convert_chest_circuit(player)
|
||||
element.enabled = (vlayer.get_interface_counts().storage_output < config.interface_limit.storage_output)
|
||||
end)
|
||||
|
||||
--- A button used to add a new circuit interface
|
||||
-- @element vlayer_gui_control_circuit
|
||||
local vlayer_gui_control_circuit =
|
||||
Gui.element{
|
||||
type = 'button',
|
||||
caption = 'Add Circuit'
|
||||
}:style{
|
||||
width = 160
|
||||
}:on_click(function(player, element, _)
|
||||
local pos = vlayer_convert_chest(player)
|
||||
|
||||
if (pos) then
|
||||
local circuit_o = player.surface.create_entity{name='constant-combinator', position=pos, force='neutral'}
|
||||
vlayer.create_circuit_interface(player.surface, pos, player)
|
||||
game.print(player.name .. ' built a vlayer circuit on ' .. pos_to_gps_string(pos))
|
||||
circuit_o.destructible = false
|
||||
circuit_o.minable = false
|
||||
circuit_o.operable = true
|
||||
circuit_o.last_user = player
|
||||
|
||||
local circuit_oc = circuit_o.get_or_create_control_behavior()
|
||||
circuit_oc.set_signal(1, {signal={type='virtual', name='signal-P'}, count=0})
|
||||
circuit_oc.set_signal(2, {signal={type='virtual', name='signal-S'}, count=0})
|
||||
circuit_oc.set_signal(3, {signal={type='virtual', name='signal-M'}, count=0})
|
||||
circuit_oc.set_signal(4, {signal={type='virtual', name='signal-C'}, count=0})
|
||||
circuit_oc.set_signal(5, {signal={type='virtual', name='signal-D'}, count=0})
|
||||
circuit_oc.set_signal(6, {signal={type='virtual', name='signal-T'}, count=0})
|
||||
circuit_oc.set_signal(7, {signal={type='virtual', name='signal-L'}, count=0})
|
||||
circuit_oc.set_signal(8, {signal={type='virtual', name='signal-A'}, count=0})
|
||||
circuit_oc.set_signal(9, {signal={type='virtual', name='signal-B'}, count=0})
|
||||
circuit_oc.set_signal(10, {signal={type='item', name='solar-panel'}, count=0})
|
||||
circuit_oc.set_signal(11, {signal={type='item', name='accumulator'}, count=0})
|
||||
|
||||
table.insert(vlayer.power.circuit, circuit_o)
|
||||
end
|
||||
end
|
||||
|
||||
local function vlayer_convert_remove(player)
|
||||
local entities = player.surface.find_entities_filtered{name={'logistic-chest-storage', 'constant-combinator', 'electric-energy-interface'}, position=player.position, radius=8, force='neutral', limit=1}
|
||||
element.enabled = (vlayer.get_interface_counts().circuit < config.interface_limit.circuit)
|
||||
end)
|
||||
|
||||
if (not entities or #entities == 0) then
|
||||
player.print('Entity not found')
|
||||
else
|
||||
for _, v in pairs(entities) do
|
||||
local name = v.name
|
||||
game.print(player.name .. ' removed a vlayer ' .. config.print_out[v.name] .. ' on ' .. pos_to_gps_string(v.position))
|
||||
v.destroy()
|
||||
--- A button used to add a new energy interface
|
||||
-- @element vlayer_gui_control_power
|
||||
local vlayer_gui_control_power =
|
||||
Gui.element{
|
||||
type = 'button',
|
||||
caption = 'Add Power'
|
||||
}:style{
|
||||
width = 160
|
||||
}:on_click(function(player, element, _)
|
||||
local pos = vlayer_convert_chest(player)
|
||||
|
||||
if name == 'logistic-chest-storage' then
|
||||
for k, vl in pairs(vlayer.storage.input) do
|
||||
if not vl.valid then
|
||||
vlayer.storage.input[k] = nil
|
||||
end
|
||||
end
|
||||
|
||||
elseif name == 'constant-combinator' then
|
||||
for k, vl in pairs(vlayer.power.circuit) do
|
||||
if not vl.valid then
|
||||
vlayer.power.circuit[k] = nil
|
||||
end
|
||||
end
|
||||
|
||||
elseif name == 'electric-energy-interface' then
|
||||
for k, vl in pairs(vlayer.power.entity) do
|
||||
if not vl.valid then
|
||||
vlayer.power.entity[k] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
if (pos) then
|
||||
if vlayer.create_energy_interface(player.surface, pos, player) then
|
||||
game.print(player.name .. ' built a vlayer energy interface on ' .. pos_to_gps_string(pos))
|
||||
else
|
||||
player.print('Unable to build vlayer energy entity')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local vlayer_gui_update
|
||||
|
||||
local button_power =
|
||||
Gui.element{
|
||||
name = 'button_1',
|
||||
type = 'button',
|
||||
caption = 'Power Entity',
|
||||
style = 'button'
|
||||
}:on_click(function(player)
|
||||
vlayer_convert_chest_power(player)
|
||||
vlayer_gui_update()
|
||||
element.enabled = (vlayer.get_interface_counts().energy < config.interface_limit.energy)
|
||||
end)
|
||||
|
||||
local button_storage_input =
|
||||
--- A button used to remove the closest vlayer interface
|
||||
-- @element vlayer_gui_control_remove
|
||||
local vlayer_gui_control_remove =
|
||||
Gui.element{
|
||||
name = 'button_2',
|
||||
type = 'button',
|
||||
caption = 'Storage Input',
|
||||
style = 'button'
|
||||
}:on_click(function(player)
|
||||
vlayer_convert_chest_storage_input(player)
|
||||
vlayer_gui_update()
|
||||
end)
|
||||
|
||||
local button_circuit =
|
||||
Gui.element{
|
||||
name = 'button_3',
|
||||
type = 'button',
|
||||
caption = 'Circuit',
|
||||
style = 'button'
|
||||
}:on_click(function(player)
|
||||
vlayer_convert_chest_circuit(player)
|
||||
vlayer_gui_update()
|
||||
end)
|
||||
|
||||
local button_remove =
|
||||
Gui.element{
|
||||
name = 'button_4',
|
||||
type = 'button',
|
||||
caption = 'Remove',
|
||||
style = 'button'
|
||||
}:on_click(function(player)
|
||||
vlayer_convert_remove(player)
|
||||
vlayer_gui_update()
|
||||
end)
|
||||
|
||||
function vlayer_gui_update()
|
||||
local button_power_enabled = #vlayer.power.entity < config.interface_limit.energy
|
||||
local button_storage_input_enabled = #vlayer.storage.input < config.interface_limit.storage_input
|
||||
local button_circuit_enabled = #vlayer.power.circuit < config.interface_limit.circuit
|
||||
|
||||
for _, player in pairs(game.connected_players) do
|
||||
local frame = Gui.get_left_element(player, vlayer_container)
|
||||
frame.container.scroll.table[button_power.name].enabled = button_power_enabled
|
||||
frame.container.scroll.table[button_storage_input.name].enabled = button_storage_input_enabled
|
||||
frame.container.scroll.table[button_circuit.name].enabled = button_circuit_enabled
|
||||
caption = 'Remove Special'
|
||||
}:style{
|
||||
width = 160
|
||||
}:on_click(function(player, element, _)
|
||||
local interface_type, interface_position = vlayer.remove_closest_interface(player.surface, player.position, 4)
|
||||
if not interface_type then
|
||||
return player.print('Interface not found in range, please move closer')
|
||||
end
|
||||
end
|
||||
|
||||
vlayer_container =
|
||||
local interfaces = vlayer.get_interface_counts()
|
||||
game.print(player.name .. ' removed a vlayer ' .. interface_type .. ' on ' .. pos_to_gps_string(interface_position))
|
||||
element.parent[vlayer_gui_control_storage_input.name].enabled = (interfaces.storage_input < config.interface_limit.storage_input)
|
||||
element.parent[vlayer_gui_control_storage_output.name].enabled = (interfaces.storage_output < config.interface_limit.storage_output)
|
||||
element.parent[vlayer_gui_control_circuit.name].enabled = (interfaces.circuit < config.interface_limit.circuit)
|
||||
element.parent[vlayer_gui_control_power.name].enabled = (interfaces.energy < config.interface_limit.energy)
|
||||
end)
|
||||
|
||||
--- A vertical flow containing all the control buttons
|
||||
-- @element vlayer_control_set
|
||||
local vlayer_control_set =
|
||||
Gui.element(function(_, parent, name)
|
||||
local vlayer_set = parent.add{type='flow', direction='vertical', name=name}
|
||||
local disp = Gui.scroll_table(vlayer_set, 320, 2, 'disp')
|
||||
|
||||
local interfaces = vlayer.get_interface_counts()
|
||||
vlayer_gui_control_storage_input(disp).enabled = (interfaces.storage_input < config.interface_limit.storage_input)
|
||||
vlayer_gui_control_storage_output(disp).enabled = (interfaces.storage_output < config.interface_limit.storage_output)
|
||||
vlayer_gui_control_circuit(disp).enabled = (interfaces.circuit < config.interface_limit.circuit)
|
||||
vlayer_gui_control_power(disp).enabled = (interfaces.energy < config.interface_limit.energy)
|
||||
vlayer_gui_control_remove(disp)
|
||||
|
||||
return vlayer_set
|
||||
end)
|
||||
|
||||
--- The main container for the vlayer gui
|
||||
-- @element vlayer_container
|
||||
local vlayer_container =
|
||||
Gui.element(function(event_trigger, parent)
|
||||
local player = Gui.get_player_from_element(parent)
|
||||
local container = Gui.container(parent, event_trigger, 300)
|
||||
Gui.header(container, 'VLAYER', '', true)
|
||||
local scroll_table = Gui.scroll_table(container, 300, 2)
|
||||
for i=1, #config.gui.content do
|
||||
scroll_table.add{
|
||||
name = 'vlayer_display_' .. i,
|
||||
caption = config.gui.content[i].title,
|
||||
type = config.gui.type,
|
||||
style = config.gui.style
|
||||
}
|
||||
end
|
||||
button_power(scroll_table)
|
||||
button_storage_input(scroll_table)
|
||||
button_circuit(scroll_table)
|
||||
button_remove(scroll_table)
|
||||
local container = Gui.container(parent, event_trigger, 320)
|
||||
|
||||
if (config.land.enabled ~= true) then
|
||||
for i=7, 12 do
|
||||
scroll_table['vlayer_display_' .. i].visible = false
|
||||
end
|
||||
end
|
||||
vlayer_display_set(container, 'vlayer_st_1')
|
||||
vlayer_control_set(container, 'vlayer_st_2')
|
||||
|
||||
if not (Roles.player_allowed(player, 'gui/vlayer-edit')) then
|
||||
scroll_table['vlayer_display_' .. #config.gui.content - 1].visible = false
|
||||
scroll_table['vlayer_display_' .. #config.gui.content].visible = false
|
||||
scroll_table[button_power.name].visible = false
|
||||
scroll_table[button_storage_input.name].visible = false
|
||||
scroll_table[button_circuit.name].visible = false
|
||||
scroll_table[button_remove.name].visible = false
|
||||
end
|
||||
|
||||
scroll_table[button_power.name].enabled = (#vlayer.power.entity < config.interface_limit.energy)
|
||||
scroll_table[button_storage_input.name].enabled = (#vlayer.storage.input < config.interface_limit.storage_input)
|
||||
scroll_table[button_circuit.name].enabled = (#vlayer.power.circuit < config.interface_limit.circuit)
|
||||
local table = container['vlayer_st_2'].disp.table
|
||||
local visible = Roles.player_allowed(player, 'gui/vlayer-edit')
|
||||
|
||||
table[vlayer_gui_control_storage_input.name].visible = visible
|
||||
table[vlayer_gui_control_storage_output.name].visible = visible
|
||||
table[vlayer_gui_control_circuit.name].visible = visible
|
||||
table[vlayer_gui_control_power.name].visible = visible
|
||||
table[vlayer_gui_control_remove.name].visible = visible
|
||||
return container.parent
|
||||
end)
|
||||
:add_to_left_flow()
|
||||
|
||||
--- Button on the top flow used to toggle the task list container
|
||||
-- @element toggle_left_element
|
||||
Gui.left_toolbar_button('entity/solar-panel', {'vlayer.main-tooltip'}, vlayer_container, function(player)
|
||||
return Roles.player_allowed(player, 'gui/vlayer')
|
||||
end)
|
||||
|
||||
Event.on_nth_tick(config.update_tick, function()
|
||||
for _, v in pairs(vlayer_display) do
|
||||
if v.type == 'item' then
|
||||
v.count = format_number(vlayer.storage.item[v.name])
|
||||
elseif v.type == 'signal' then
|
||||
v.count = format_number(vlayer.circuit.output[v.name].count)
|
||||
end
|
||||
end
|
||||
--- Update the visibly of the buttons based on a players roles
|
||||
local function role_update_event(event)
|
||||
local player = game.players[event.player_index]
|
||||
local visible = Roles.player_allowed(player, 'gui/vlayer-edit')
|
||||
local frame = Gui.get_left_element(player, vlayer_container)
|
||||
frame.container['vlayer_st_2'].visible = visible
|
||||
end
|
||||
|
||||
Event.add(Roles.events.on_role_assigned, role_update_event)
|
||||
Event.add(Roles.events.on_role_unassigned, role_update_event)
|
||||
|
||||
Event.on_nth_tick(config.update_tick_gui, function(_)
|
||||
local stats = vlayer.get_statistics()
|
||||
local items = vlayer.get_items()
|
||||
local vlayer_display = {
|
||||
[vlayer_gui_display_item_solar_count.name] = format_number(items['solar-panel']),
|
||||
[vlayer_gui_display_item_accumulator_count.name] = format_number(items['accumulator']),
|
||||
[vlayer_gui_display_signal_production_count.name] = format_energy(stats.energy_production, 'W'),
|
||||
[vlayer_gui_display_signal_sustained_count.name] = format_energy(stats.energy_sustained, 'W'),
|
||||
[vlayer_gui_display_signal_capacity_count.name] = format_energy(stats.energy_capacity, 'J'),
|
||||
[vlayer_gui_display_signal_current_count.name] = format_energy(stats.energy_storage, 'J'),
|
||||
}
|
||||
|
||||
for _, player in pairs(game.connected_players) do
|
||||
local frame = Gui.get_left_element(player, vlayer_container)
|
||||
local table = frame.container['vlayer_st_1'].disp.table
|
||||
|
||||
for k, v in pairs(vlayer_display) do
|
||||
frame.container.scroll.table['vlayer_display_' .. k].caption = v.count
|
||||
table[k].caption = v
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
Reference in New Issue
Block a user