mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2024-12-30 23:17:53 +02:00
237 lines
8.4 KiB
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
|