1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2024-12-30 23:17:53 +02:00
ComfyFactorio/modules/turret_filler.lua

237 lines
8.4 KiB
Lua

local Event = require 'utils.event'
local Global = require 'utils.global'
local turrettable = {
players = {},
enabled = true
}
local Public = {}
Global.register(
turrettable,
function(tbl)
turrettable = tbl
end
)
function Public.get_table()
return turrettable
end
local function draw_turret_button()
for _, player in pairs(game.connected_players) do
if not player.gui.top.turret_filler_button then
local b = player.gui.top.add({type = 'sprite-button', name = 'turret_filler_button', sprite = 'entity/gun-turret', tooltip = {'modules.turret_filler_tooltip'}})
b.style.minimal_height = 38
b.style.maximal_height = 38
end
player.gui.top.turret_filler_button.visible = turrettable.enabled
end
end
local function turret_gui(player)
if player.gui.screen['turret_filler'] then
player.gui.screen['turret_filler'].destroy()
return
end
if turrettable.enabled == false then
player.gui.top.turret_filler_button.visible = false
return
end
local playerdata = turrettable.players[player.index]
local frame = player.gui.screen.add({type = 'frame', name = 'turret_filler', caption = {'modules.turret_filler'}, direction = 'vertical'})
frame.location = {x = 150, y = 45}
frame.style.minimal_height = 200
frame.style.maximal_height = 500
frame.style.minimal_width = 200
frame.style.maximal_width = 400
frame.add({type = 'label', caption = {'modules.turret_filler_tooltip'}})
local switch_state = 'left'
if playerdata.enabled then
switch_state = 'right'
end
local t = frame.add({type = 'table', column_count = 4, name = 'turret_filler_enabled_table'})
t.add({type = 'label', caption = {'modules.turret_filler_label_enabled'}})
local label = t.add({type = 'label', caption = 'OFF'})
label.style.padding = 0
label.style.left_padding = 10
label.style.font_color = {0.77, 0.77, 0.77}
local switch = t.add({type = 'switch', name = 'turret_filler_enabled'})
switch.switch_state = switch_state
switch.style.padding = 0
switch.style.margin = 0
local label2 = t.add({type = 'label', caption = 'ON'})
label2.style.padding = 0
label2.style.font_color = {0.70, 0.70, 0.70}
local amount = playerdata.amount
local t2 = frame.add({type = 'table', column_count = 3, name = 'turret_filler_amount_table'})
t2.add({type = 'label', caption = {'modules.turret_filler_label_amount'}})
t2.add({type = 'slider', name = 'turret_filler_amount', minimum_value = 1, maximum_value = 100, value = amount or 5})
local textfield = t2.add({type = 'textfield', name = 'turret_filler_amount2', numeric = true, text = amount or 5})
textfield.style.width = 40
local t3 = frame.add({type = 'table', column_count = 4, name = 'turret_filler_ammo_table'})
t3.add({type = 'label', caption = {'modules.turret_filler_ammo_type'}})
local filter = {{filter = 'name', name = {'firearm-magazine', 'piercing-rounds-magazine', 'uranium-rounds-magazine'}}}
t3.add({type = 'choose-elem-button', name = 'turret_filler_ammo', elem_type = 'item', item = playerdata.ammo_type or 'firearm-magazine', elem_filters = filter})
t3.add({type = 'label', caption = {'modules.turret_filler_ammo_lower'}})
t3.add({type = 'checkbox', name = 'turret_filler_lower', state = playerdata.lower_allowed})
frame.add({type = 'line'})
local close = frame.add({type = 'button', name = 'close_turret_filler', caption = 'Save & Close'})
close.style.horizontally_stretchable = true
end
local function save_and_close(player)
local frame = player.gui.screen['turret_filler']
if not frame or not frame.valid then
return
end
turrettable.players[player.index].enabled = frame['turret_filler_enabled_table']['turret_filler_enabled'].switch_state == 'right'
turrettable.players[player.index].amount = frame['turret_filler_amount_table']['turret_filler_amount'].slider_value
turrettable.players[player.index].ammo_type = frame['turret_filler_ammo_table']['turret_filler_ammo'].elem_value
turrettable.players[player.index].lower_allowed = frame['turret_filler_ammo_table']['turret_filler_lower'].state
frame.destroy()
end
local function on_player_joined_game(event)
draw_turret_button()
if not turrettable.players[event.player_index] then
turrettable.players[event.player_index] = {
enabled = true,
amount = 5,
ammo_type = 'firearm-magazine',
lower_allowed = false
}
end
end
local function on_gui_click(event)
if not event then
return
end
if not event.element then
return
end
if not event.element.valid then
return
end
local player = game.get_player(event.player_index)
if event.element.name == 'turret_filler_button' then
turret_gui(player)
return
elseif event.element.name == 'close_turret_filler' then
save_and_close(player)
return
end
end
local function flying_text(surface, position, text, color)
surface.create_entity(
{
name = 'flying-text',
position = {position.x, position.y - 0.5},
text = text,
color = color
}
)
end
local function on_gui_value_changed(event)
local slider = event.element
if not slider or not slider.valid then
return
end
if slider.name ~= 'turret_filler_amount' then
return
end
local frame = slider.parent
frame['turret_filler_amount2'].text = tostring(slider.slider_value)
end
local function on_gui_text_changed(event)
local field = event.element
if not field or not field.valid then
return
end
if field.name ~= 'turret_filler_amount2' then
return
end
local frame = field.parent
local slider = frame['turret_filler_amount']
local number = tonumber(field.text) or 1
if number <= slider.get_slider_maximum() and number >= slider.get_slider_minimum() then
slider.slider_value = number
end
end
local function transfer_ammo(player, turret)
if not turrettable.players[player.index].enabled then
return
end
local item = turrettable.players[player.index].ammo_type
local count = player.get_item_count(item) or 0
if count == 0 and turrettable.players[player.index].lower_allowed then
if item == 'uranium-rounds-magazine' then
item = 'piercing-rounds-magazine'
count = player.get_item_count(item) or 0
end
if count == 0 and item == 'piercing-rounds-magazine' then
item = 'firearm-magazine'
count = player.get_item_count(item) or 0
end
end
if count > 0 then
local inserted = turret.insert({name = item, count = math.min(count, turrettable.players[player.index].amount)})
player.remove_item({name = item, count = inserted})
local text = '-' .. inserted .. ' [item=' .. item .. ']'
flying_text(turret.surface, turret.position, text, {r = 0.8, g = 0.2, b = 0.2})
end
end
local function on_built_entity(event)
if not turrettable.enabled then
return
end
local turret = event.created_entity
if not turret or not turret.valid then
return
end
if turret.name ~= 'gun-turret' then
return
end
local player = game.get_player(event.player_index)
if not player or not player.valid then
return
end
transfer_ammo(player, turret)
end
local function on_robot_built_entity(event)
if not turrettable.enabled then
return
end
local turret = event.created_entity
if not turret or not turret.valid then
return
end
if turret.name ~= 'gun-turret' then
return
end
local player = turret.last_user
if player and player.valid and player.connected then
local x, y = player.position.x - turret.position.x, player.position.y - turret.position.y
if player.surface == turret.surface and math.sqrt(x * x + y * y) <= 40 then
transfer_ammo(player, turret)
end
end
end
Event.add(defines.events.on_player_joined_game, on_player_joined_game)
Event.add(defines.events.on_gui_click, on_gui_click)
Event.add(defines.events.on_built_entity, on_built_entity)
Event.add(defines.events.on_robot_built_entity, on_robot_built_entity)
Event.add(defines.events.on_gui_value_changed, on_gui_value_changed)
Event.add(defines.events.on_gui_text_changed, on_gui_text_changed)
return Public