Files
factorio-scenario-ExpCluster/modules/gui/surveillance.lua
2023-10-03 02:50:24 +09:00

172 lines
4.9 KiB
Lua

---- module surveillance
-- @addon surveillance
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 cctv_container
local player_list = {}
local cctv_player =
Gui.element{
type = 'drop-down',
name = 'cctv_player',
items = player_list,
selected_index = 1
}
local cctv_type =
Gui.element{
type = 'drop-down',
name = 'cctv_status',
items = {'Enable', 'Disable'},
selected_index = 1
}:style{
width = 96
}:on_click(function(_, element, _)
if element.selected_index == 1 then
element.parent.parent.cctv_display.visible = true
else
element.parent.parent.cctv_display.visible = false
end
end)
local cctv_status =
Gui.element{
type = 'drop-down',
name = 'cctv_status',
items = {'Player', 'Static'},
selected_index = 1
}:style{
width = 96
}:on_click(function(_, element, _)
if element.selected_index == 1 then
element.parent.parent.cctv_display.visible = true
else
element.parent.parent.cctv_display.visible = false
end
end)
local cctv_location =
Gui.element{
type = 'button',
caption = 'set'
}:style{
width = 48
}:on_click(function(player, element, _)
element.parent.parent.cctv_display.position = player.position
end)
local zoom_in =
Gui.element{
type = 'button',
caption = '+'
}:style{
width = 36
}:on_click(function(_, element, _)
if element.parent.parent.cctv_display.zoom < 2.0 then
element.parent.parent.cctv_display.zoom = element.parent.parent.cctv_display.zoom + 0.05
end
end)
local zoom_out =
Gui.element{
type = 'button',
caption = '-'
}:style{
width = 36
}:on_click(function(_, element, _)
if element.parent.parent.cctv_display.zoom > 0.2 then
element.parent.parent.cctv_display.zoom = element.parent.parent.cctv_display.zoom - 0.05
end
end)
local camera_set =
Gui.element(function(_, parent)
local camera_set = parent.add{type='flow'}
local buttons = Gui.scroll_table(camera_set, 400, 6, 'buttons')
cctv_player(buttons)
cctv_type(buttons)
cctv_status(buttons)
cctv_location(buttons)
zoom_out(buttons)
zoom_in(buttons)
local camera = camera_set.add{
type = 'camera',
name = 'cctv_display',
position = {x=0, y=0},
surface_index = game.surfaces['nauvis'].index,
zoom = 0.75,
}
camera.style.minimal_width = 400
camera.style.minimal_height = 300
return camera_set
end)
cctv_container =
Gui.element(function(event_trigger, parent)
local container = Gui.container(parent, event_trigger, 480)
local scroll_table_1 = Gui.scroll_table(container, 400, 6, 'cctv_st_1')
local scroll_table_2 = Gui.scroll_table(container, 400, 6, 'cctv_st_2')
player_list = {}
for _, player in pairs(game.connected_players) do
table.insert(player_list, player.name)
end
camera_set(scroll_table_1)
camera_set(scroll_table_2)
return container.parent
end)
:add_to_left_flow()
Gui.left_toolbar_button('entity/radar', 'Surveillance GUI', cctv_container, function(player)
return Roles.player_allowed(player, 'gui/surveillance')
end)
local function gui_update()
player_list = {}
for _, player in pairs(game.connected_players) do
table.insert(player_list, player.name)
end
for _, player in pairs(game.connected_players) do
local frame = Gui.get_left_element(player, cctv_container)
frame.container['cctv_st_1'].table.flow['buttons'][cctv_player.name].items = player_list
frame.container['cctv_st_2'].table.flow['buttons'][cctv_player.name].items = player_list
end
end
Event.add(defines.events.on_player_joined_game, gui_update)
Event.add(defines.events.on_player_left_game, gui_update)
Event.add(defines.events.on_tick, function(_)
for _, player in pairs(game.connected_players) do
local frame = Gui.get_left_element(player, cctv_container)
for i=1, 2 do
local scroll_table_name = 'cctv_st_' .. i
local switch_index = frame.container[scroll_table_name].table.flow[cctv_status.name].selected_index
if switch_index == 1 then
local selected_index = frame.container[scroll_table_name].table.flow[cctv_player.name].selected_index
if selected_index ~= nil or selected_index ~= 0 then
frame.container[scroll_table_name].table.flow['cctv_display'].position = game.players[selected_index].position
frame.container[scroll_table_name].table.flow['cctv_display'].surface_index = game.players[selected_index].surface_index
else
frame.container[scroll_table_name].table.flow['cctv_display'].position = {x=0, y=0}
frame.container[scroll_table_name].table.flow['cctv_display'].surface_index = game.surfaces['nauvis'].index
end
end
end
end
end)