mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2024-12-26 22:56:43 +02:00
168 lines
5.6 KiB
Lua
168 lines
5.6 KiB
Lua
--made by Hanakocz
|
|
-- modified by gerkiz
|
|
--charge your armor equipment from nearby accumulators!
|
|
local Event = require 'utils.event'
|
|
local SpamProtection = require 'utils.spam_protection'
|
|
local BottomFrame = require 'utils.gui.bottom_frame'
|
|
local Gui = require 'utils.gui'
|
|
local Color = require 'utils.color_presets'
|
|
|
|
local Public = {}
|
|
local module_name = '[color=blue][Charging station][/color] '
|
|
local charging_station_name = Gui.uid_name()
|
|
|
|
local function draw_charging_gui(player, activate_custom_buttons)
|
|
local button =
|
|
player.gui.top[charging_station_name] or
|
|
player.gui.top.add(
|
|
{
|
|
type = 'sprite-button',
|
|
name = charging_station_name,
|
|
sprite = 'item/battery-mk2-equipment',
|
|
tooltip = {
|
|
'modules.charging_station_tooltip'
|
|
},
|
|
style = Gui.button_style
|
|
}
|
|
)
|
|
button.style.minimal_height = 38
|
|
button.style.maximal_height = 38
|
|
|
|
if activate_custom_buttons then
|
|
if button and button.valid then
|
|
button.destroy()
|
|
end
|
|
end
|
|
end
|
|
|
|
local function discharge_accumulators(surface, position, force, power_needs)
|
|
local accumulators = surface.find_entities_filtered { name = 'accumulator', force = force, position = position, radius = 13 }
|
|
local power_drained = 0
|
|
power_needs = power_needs * 1
|
|
for _, accu in pairs(accumulators) do
|
|
if accu.valid then
|
|
if accu.energy > 3000000 and power_needs > 0 then
|
|
if power_needs >= 2000000 then
|
|
power_drained = power_drained + 2000000
|
|
accu.energy = accu.energy - 2000000
|
|
power_needs = power_needs - 2000000
|
|
else
|
|
power_drained = power_drained + power_needs
|
|
accu.energy = accu.energy - power_needs
|
|
end
|
|
elseif power_needs <= 0 then
|
|
break
|
|
end
|
|
end
|
|
end
|
|
return power_drained / 1
|
|
end
|
|
|
|
local function charge(player)
|
|
if not player.character then
|
|
return player.print(module_name .. 'It seems that you are not in the realm of living.', { color = Color.warning })
|
|
end
|
|
if player.controller_type == defines.controllers.remote then
|
|
return player.print(module_name .. 'It seems that you are not in the realm of living.', { color = Color.warning })
|
|
end
|
|
local armor_inventory = player.get_inventory(defines.inventory.character_armor)
|
|
if not armor_inventory.valid then
|
|
return player.print(module_name .. 'No valid armor to charge was found.', { color = Color.warning })
|
|
end
|
|
local armor = armor_inventory[1]
|
|
if not armor.valid_for_read then
|
|
return player.print(module_name .. 'No valid armor to charge was found.', { color = Color.warning })
|
|
end
|
|
local grid = armor.grid
|
|
if not grid or not grid.valid then
|
|
return player.print(module_name .. 'No valid armor to charge was found.', { color = Color.warning })
|
|
end
|
|
|
|
local ents = player.physical_surface.find_entities_filtered { name = 'accumulator', force = player.force, position = player.physical_position, radius = 13 }
|
|
if not ents or not next(ents) then
|
|
return player.print(module_name .. 'No accumulators nearby.', { color = Color.warning })
|
|
end
|
|
|
|
local equip = grid.equipment
|
|
for _, piece in pairs(equip) do
|
|
if piece.valid and piece.generator_power == 0 then
|
|
local energy_needs = piece.max_energy - piece.energy
|
|
if energy_needs > 0 then
|
|
local energy = discharge_accumulators(player.physical_surface, player.physical_position, player.force, energy_needs)
|
|
if energy > 0 then
|
|
if piece.energy + energy >= piece.max_energy then
|
|
piece.energy = piece.max_energy
|
|
else
|
|
piece.energy = piece.energy + energy
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function on_player_joined_game(event)
|
|
local player = game.get_player(event.player_index)
|
|
if not player or not player.valid then
|
|
return
|
|
end
|
|
|
|
local activate_custom_buttons = BottomFrame.get('activate_custom_buttons')
|
|
|
|
draw_charging_gui(player, activate_custom_buttons)
|
|
if activate_custom_buttons then
|
|
BottomFrame.add_inner_frame(
|
|
{
|
|
player = player,
|
|
element_name = charging_station_name,
|
|
tooltip = {
|
|
'modules.charging_station_tooltip'
|
|
},
|
|
sprite = 'item/battery-mk2-equipment'
|
|
}
|
|
)
|
|
end
|
|
end
|
|
|
|
Gui.on_click(
|
|
charging_station_name,
|
|
function (event)
|
|
local player = game.get_player(event.player_index)
|
|
if not player or not player.valid then
|
|
return
|
|
end
|
|
|
|
local is_spamming = SpamProtection.is_spamming(player, nil, 'Charging Station Gui Click')
|
|
if is_spamming then
|
|
return
|
|
end
|
|
|
|
charge(player)
|
|
end
|
|
)
|
|
|
|
Event.add(defines.events.on_player_joined_game, on_player_joined_game)
|
|
|
|
Event.add(
|
|
BottomFrame.events.bottom_quickbar_location_changed,
|
|
function (event)
|
|
local player_index = event.player_index
|
|
if not player_index then
|
|
return
|
|
end
|
|
local player = game.get_player(player_index)
|
|
if not player or not player.valid then
|
|
return
|
|
end
|
|
|
|
local bottom_frame_data = event.data
|
|
if bottom_frame_data and bottom_frame_data.top then
|
|
draw_charging_gui(player, false)
|
|
else
|
|
draw_charging_gui(player, true)
|
|
end
|
|
end
|
|
)
|
|
|
|
return Public
|