mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2025-12-27 03:25:23 +09:00
198 lines
6.8 KiB
Lua
198 lines
6.8 KiB
Lua
---- module surveillance
|
|
-- @gui surveillance
|
|
|
|
local Gui = require("modules.exp_legacy.expcore.gui") --- @dep expcore.gui
|
|
local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles
|
|
local Event = require("modules/exp_legacy/utils/event") --- @dep utils.event
|
|
|
|
local cctv_player =
|
|
Gui.element(function(definition, parent, player_list)
|
|
return parent.add{
|
|
name = definition.name,
|
|
type = "drop-down",
|
|
items = player_list,
|
|
selected_index = #player_list > 0 and 1,
|
|
}
|
|
end)
|
|
:style{
|
|
horizontally_stretchable = true,
|
|
}
|
|
:static_name(Gui.unique_static_name)
|
|
|
|
local cctv_status =
|
|
Gui.element{
|
|
type = "drop-down",
|
|
items = { { "surveillance.status-enable" }, { "surveillance.status-disable" } },
|
|
selected_index = 2,
|
|
}:style{
|
|
width = 96,
|
|
}:on_selection_changed(function(_, element, _)
|
|
if element.selected_index == 1 then
|
|
element.parent.parent.parent.cctv_display.visible = true
|
|
else
|
|
element.parent.parent.parent.cctv_display.visible = false
|
|
end
|
|
end)
|
|
|
|
local cctv_type =
|
|
Gui.element{
|
|
type = "drop-down",
|
|
name = Gui.unique_static_name,
|
|
items = { { "surveillance.type-player" }, { "surveillance.type-static" }, { "surveillance.type-player-loop" } },
|
|
selected_index = 1,
|
|
}:style{
|
|
width = 96,
|
|
}
|
|
|
|
local cctv_location =
|
|
Gui.element{
|
|
type = "button",
|
|
name = Gui.unique_static_name,
|
|
caption = { "surveillance.func-set" },
|
|
}:style{
|
|
width = 48,
|
|
}:on_click(function(player, element, _)
|
|
element.parent.parent.parent.cctv_display.position = player.physical_position
|
|
end)
|
|
|
|
local zoom_in =
|
|
Gui.element{
|
|
type = "button",
|
|
name = Gui.unique_static_name,
|
|
caption = "+",
|
|
}:style{
|
|
width = 32,
|
|
}:on_click(function(_, element, _)
|
|
local display = element.parent.parent.parent.cctv_display
|
|
if display.zoom < 2.0 then
|
|
display.zoom = display.zoom + 0.05
|
|
end
|
|
end)
|
|
|
|
local zoom_out =
|
|
Gui.element{
|
|
type = "button",
|
|
name = Gui.unique_static_name,
|
|
caption = "-",
|
|
}:style{
|
|
width = 32,
|
|
}:on_click(function(_, element, _)
|
|
local display = element.parent.parent.parent.cctv_display
|
|
if display.zoom > 0.2 then
|
|
display.zoom = display.zoom - 0.05
|
|
end
|
|
end)
|
|
|
|
local camera_set =
|
|
Gui.element(function(_, parent, name, player_list)
|
|
local camera_set = parent.add{ type = "flow", direction = "vertical", name = name }
|
|
local buttons = Gui.scroll_table(camera_set, 480, 6, "buttons")
|
|
|
|
cctv_player(buttons, player_list)
|
|
cctv_status(buttons)
|
|
cctv_type(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.visible = false
|
|
camera.style.minimal_width = 480
|
|
camera.style.minimal_height = 290
|
|
return camera_set
|
|
end)
|
|
|
|
local cctv_container =
|
|
Gui.element(function(definition, parent)
|
|
local container = Gui.container(parent, definition.name, 480)
|
|
local scroll = container.add{ name = "scroll", type = "scroll-pane", direction = "vertical" }
|
|
scroll.style.maximal_height = 704
|
|
local player_list = {}
|
|
|
|
for _, player in pairs(game.connected_players) do
|
|
table.insert(player_list, player.name)
|
|
end
|
|
|
|
camera_set(scroll, "cctv_st_1", player_list)
|
|
camera_set(scroll, "cctv_st_2", player_list)
|
|
|
|
return container.parent
|
|
end)
|
|
:static_name(Gui.unique_static_name)
|
|
:add_to_left_flow()
|
|
|
|
Gui.left_toolbar_button("entity/radar", { "surveillance.main-tooltip" }, cctv_container, function(player)
|
|
return Roles.player_allowed(player, "gui/surveillance")
|
|
end)
|
|
|
|
local function gui_update()
|
|
local 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.scroll["cctv_st_1"].buttons.table[cctv_player.name].items = player_list
|
|
frame.container.scroll["cctv_st_2"].buttons.table[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 current_camera_set = frame.container.scroll[scroll_table_name]
|
|
local switch_index = current_camera_set.buttons.table[cctv_type.name].selected_index
|
|
|
|
if (switch_index == 1) or (switch_index == 3) then
|
|
local selected_index = current_camera_set.buttons.table[cctv_player.name].selected_index
|
|
|
|
if selected_index ~= 0 then
|
|
selected_index = current_camera_set.buttons.table[cctv_player.name].items[selected_index]
|
|
current_camera_set["cctv_display"].position = game.players[selected_index].physical_position
|
|
current_camera_set["cctv_display"].surface_index = game.players[selected_index].surface_index
|
|
else
|
|
current_camera_set["cctv_display"].position = { x = 0, y = 0 }
|
|
current_camera_set["cctv_display"].surface_index = game.surfaces["nauvis"].index
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
Event.on_nth_tick(600, function(_)
|
|
for _, player in pairs(game.connected_players) do
|
|
local frame = Gui.get_left_element(player, cctv_container)
|
|
|
|
for i = 1, 2 do
|
|
local current_camera_set = frame.container.scroll["cctv_st_" .. i]
|
|
|
|
if current_camera_set.buttons.table[cctv_type.name].selected_index == 3 then
|
|
local item_n = #current_camera_set.buttons.table[cctv_player.name].items
|
|
|
|
if item_n ~= 0 then
|
|
if current_camera_set.buttons.table[cctv_player.name].selected_index < item_n then
|
|
current_camera_set.buttons.table[cctv_player.name].selected_index = current_camera_set.buttons.table[cctv_player.name].selected_index + 1
|
|
else
|
|
current_camera_set.buttons.table[cctv_player.name].selected_index = 1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|