1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-10 00:43:27 +02:00
ComfyFactorio/maps/biter_battles_v2/team_manager.lua

369 lines
12 KiB
Lua
Raw Normal View History

2020-01-02 17:09:24 +02:00
local Public = {}
2019-08-31 23:13:38 +02:00
local forces = {
{name = "north", color = {r = 0, g = 0, b = 200}},
{name = "spectator", color = {r = 111, g = 111, b = 111}},
{name = "south", color = {r = 200, g = 0, b = 0}},
}
local function get_player_array(force_name)
2019-09-01 02:42:14 +02:00
local a = {}
for _, p in pairs(game.forces[force_name].connected_players) do a[#a + 1] = p.name end
return a
end
2019-09-01 04:52:04 +02:00
local function freeze_players()
if not global.freeze_players then return end
2019-09-01 06:01:48 +02:00
global.team_manager_default_permissions = {}
local p = game.permissions.get_group("Default")
2019-09-01 04:52:04 +02:00
for action_name, _ in pairs(defines.input_action) do
2019-09-01 06:01:48 +02:00
global.team_manager_default_permissions[action_name] = p.allows_action(defines.input_action[action_name])
2019-09-01 04:52:04 +02:00
p.set_allows_action(defines.input_action[action_name], false)
end
local defs = {
defines.input_action.write_to_console,
defines.input_action.gui_click,
defines.input_action.gui_selection_state_changed,
defines.input_action.gui_checked_state_changed ,
defines.input_action.gui_elem_changed,
defines.input_action.gui_text_changed,
defines.input_action.gui_value_changed,
defines.input_action.edit_permission_group,
}
for _, d in pairs(defs) do p.set_allows_action(d, true) end
end
local function unfreeze_players()
2019-09-01 06:01:48 +02:00
local p = game.permissions.get_group("Default")
2019-09-01 04:52:04 +02:00
for action_name, _ in pairs(defines.input_action) do
2019-09-01 06:01:48 +02:00
if global.team_manager_default_permissions[action_name] then
p.set_allows_action(defines.input_action[action_name], true)
end
2019-09-01 04:52:04 +02:00
end
end
2019-09-01 02:42:14 +02:00
local function leave_corpse(player)
if not player.character then return end
local inventories = {
player.get_inventory(defines.inventory.character_main),
player.get_inventory(defines.inventory.character_guns),
player.get_inventory(defines.inventory.character_ammo),
player.get_inventory(defines.inventory.character_armor),
player.get_inventory(defines.inventory.character_vehicle),
player.get_inventory(defines.inventory.character_trash),
}
local corpse = false
for _, i in pairs(inventories) do
for index = 1, #i, 1 do
if not i[index].valid then break end
corpse = true
break
end
if corpse then
player.character.die()
break
end
2019-08-31 23:13:38 +02:00
end
2019-09-01 02:42:14 +02:00
if player.character then player.character.destroy() end
player.character = nil
player.set_controller({type=defines.controllers.god})
player.create_character()
2019-08-31 23:13:38 +02:00
end
2019-09-01 02:42:14 +02:00
local function switch_force(player_name, force_name)
if not game.players[player_name] then game.print("Team Manager >> Player " .. player_name .. " does not exist.", {r=0.98, g=0.66, b=0.22}) return end
if not game.forces[force_name] then game.print("Team Manager >> Force " .. force_name .. " does not exist.", {r=0.98, g=0.66, b=0.22}) return end
local player = game.players[player_name]
player.force = game.forces[force_name]
game.print(player_name .. " has been switched into team " .. force_name .. ".", {r=0.98, g=0.66, b=0.22})
2019-08-31 23:13:38 +02:00
2019-09-01 02:42:14 +02:00
leave_corpse(player)
2019-08-31 23:13:38 +02:00
2019-09-01 02:42:14 +02:00
global.chosen_team[player_name] = nil
if force_name == "spectator" then
spectate(player, true)
else
join_team(player, force_name, true)
end
end
2020-01-02 17:09:24 +02:00
function Public.draw_top_toggle_button(player)
2019-09-01 02:42:14 +02:00
if player.gui.top["team_manager_toggle_button"] then player.gui.top["team_manager_toggle_button"].destroy() end
2019-08-31 23:13:38 +02:00
local button = player.gui.top.add({type = "sprite-button", name = "team_manager_toggle_button", caption = "Team Manager", tooltip = tooltip})
button.style.font = "heading-2"
2019-09-01 02:42:14 +02:00
button.style.font_color = {r = 0.88, g = 0.55, b = 0.11}
2019-08-31 23:13:38 +02:00
button.style.minimal_height = 38
button.style.minimal_width = 120
button.style.top_padding = 2
button.style.left_padding = 0
button.style.right_padding = 0
button.style.bottom_padding = 2
end
local function draw_manager_gui(player)
if player.gui.center["team_manager_gui"] then player.gui.center["team_manager_gui"].destroy() end
2019-09-01 02:42:14 +02:00
local frame = player.gui.center.add({type = "frame", name = "team_manager_gui", caption = "Manage Teams", direction = "vertical"})
local t = frame.add({type = "table", name = "team_manager_root_table", column_count = 5})
2019-08-31 23:13:38 +02:00
local i2 = 1
for i = 1, #forces * 2 - 1, 1 do
if i % 2 == 1 then
2019-09-14 04:10:36 +02:00
local l = t.add({type = "sprite-button", caption = string.upper(forces[i2].name), name = forces[i2].name})
l.style.minimal_width = 160
l.style.maximal_width = 160
2019-08-31 23:13:38 +02:00
l.style.font_color = forces[i2].color
l.style.font = "heading-1"
i2 = i2 + 1
else
local tt = t.add({type = "label", caption = " "})
end
end
local i2 = 1
for i = 1, #forces * 2 - 1, 1 do
if i % 2 == 1 then
2019-09-01 02:42:14 +02:00
local list_box = t.add({type = "list-box", name = "team_manager_list_box_" .. i2, items = get_player_array(forces[i2].name)})
2019-08-31 23:13:38 +02:00
list_box.style.minimal_height = 360
list_box.style.minimal_width = 160
list_box.style.maximal_height = 480
i2 = i2 + 1
else
local tt = t.add({type = "table", column_count = 1})
2019-09-01 02:42:14 +02:00
local b = tt.add({type = "sprite-button", name = i2 - 1, caption = ""})
2019-08-31 23:13:38 +02:00
b.style.font = "heading-1"
b.style.maximal_height = 38
b.style.maximal_width = 38
2019-09-01 02:42:14 +02:00
local b = tt.add({type = "sprite-button", name = i2, caption = ""})
2019-08-31 23:13:38 +02:00
b.style.font = "heading-1"
b.style.maximal_height = 38
b.style.maximal_width = 38
end
end
2019-09-01 02:42:14 +02:00
frame.add({type = "label", caption = ""})
2019-09-01 04:52:04 +02:00
local t = frame.add({type = "table", name = "team_manager_bottom_buttons", column_count = 4})
2019-09-01 02:42:14 +02:00
local button = t.add({
type = "button",
name = "team_manager_close",
caption = "Close",
tooltip = "Close this window."
})
button.style.font = "heading-2"
if global.tournament_mode then
button = t.add({
type = "button",
name = "team_manager_activate_tournament",
caption = "Tournament Mode Enabled",
tooltip = "Only admins can move players and vote for difficulty.\nActive players can no longer go spectate.\nNew joining players are spectators."
2019-09-01 02:42:14 +02:00
})
button.style.font_color = {r = 222, g = 22, b = 22}
else
button = t.add({
type = "button",
name = "team_manager_activate_tournament",
caption = "Tournament Mode Disabled",
tooltip = "Only admins can move players. Active players can no longer go spectate. New joining players are spectators."
})
button.style.font_color = {r = 55, g = 55, b = 55}
end
button.style.font = "heading-2"
2019-09-01 04:52:04 +02:00
if global.freeze_players then
button = t.add({
type = "button",
name = "team_manager_freeze_players",
caption = "Unfreeze Players",
tooltip = "Releases all players."
})
button.style.font_color = {r = 222, g = 22, b = 22}
else
button = t.add({
type = "button",
name = "team_manager_freeze_players",
caption = "Freeze Players",
tooltip = "Freezes all players, unable to perform actions, until released."
})
button.style.font_color = {r = 55, g = 55, b = 222}
end
button.style.font = "heading-2"
if global.training_mode then
button = t.add({
type = "button",
name = "team_manager_activate_training",
caption = "Training Mode Activated",
tooltip = "Feed your own team's biters and only teams with players gain threat & evo."
})
button.style.font_color = {r = 222, g = 22, b = 22}
else
button = t.add({
type = "button",
name = "team_manager_activate_training",
caption = "Training Mode Disabled",
tooltip = "Feed your own team's biters and only teams with players gain threat & evo."
})
button.style.font_color = {r = 55, g = 55, b = 55}
end
2019-09-01 04:52:04 +02:00
button.style.font = "heading-2"
2019-08-31 23:13:38 +02:00
end
2019-09-14 04:10:36 +02:00
local function set_custom_team_name(force_name, team_name)
if team_name == "" then global.tm_custom_name[force_name] = nil return end
if not team_name then global.tm_custom_name[force_name] = nil return end
global.tm_custom_name[force_name] = tostring(team_name)
end
local function custom_team_name_gui(player, force_name)
if player.gui.center["custom_team_name_gui"] then player.gui.center["custom_team_name_gui"].destroy() return end
local frame = player.gui.center.add({type = "frame", name = "custom_team_name_gui", caption = "Set custom team name:", direction = "vertical"})
local text = force_name
if global.tm_custom_name[force_name] then text = global.tm_custom_name[force_name] end
local textfield = frame.add({ type = "textfield", name = force_name, text = text })
local t = frame.add({type = "table", column_count = 2})
local button = t.add({
type = "button",
name = "custom_team_name_gui_set",
caption = "Set",
tooltip = "Set custom team name."
})
button.style.font = "heading-2"
local button = t.add({
type = "button",
name = "custom_team_name_gui_close",
caption = "Close",
tooltip = "Close this window."
})
button.style.font = "heading-2"
end
local function team_manager_gui_click(event)
2019-09-01 02:42:14 +02:00
local player = game.players[event.player_index]
local name = event.element.name
2019-09-14 04:10:36 +02:00
if game.forces[name] then
2019-09-14 08:34:23 +02:00
if not player.admin then player.print("Only admins can change team names.", {r = 175, g = 0, b = 0}) return end
2019-09-14 04:10:36 +02:00
custom_team_name_gui(player, name)
player.gui.center["team_manager_gui"].destroy()
2019-09-01 02:42:14 +02:00
return
end
if name == "team_manager_close" then
player.gui.center["team_manager_gui"].destroy()
return
end
if name == "team_manager_activate_tournament" then
2019-09-01 04:52:04 +02:00
if not player.admin then player.print("Only admins can switch tournament mode.", {r = 175, g = 0, b = 0}) return end
2019-09-01 02:42:14 +02:00
if global.tournament_mode then
global.tournament_mode = false
draw_manager_gui(player)
2019-09-01 04:52:04 +02:00
game.print(">>> Tournament Mode has been disabled.", {r = 111, g = 111, b = 111})
2019-09-01 02:42:14 +02:00
return
end
global.tournament_mode = true
draw_manager_gui(player)
2019-09-01 04:52:04 +02:00
game.print(">>> Tournament Mode has been enabled!", {r = 225, g = 0, b = 0})
return
end
if name == "team_manager_freeze_players" then
if global.freeze_players then
if not player.admin then player.print("Only admins can unfreeze players.", {r = 175, g = 0, b = 0}) return end
global.freeze_players = false
draw_manager_gui(player)
game.print(">>> Players have been unfrozen!", {r = 255, g = 77, b = 77})
unfreeze_players()
return
end
if not player.admin then player.print("Only admins can freeze players.", {r = 175, g = 0, b = 0}) return end
global.freeze_players = true
draw_manager_gui(player)
game.print(">>> Players have been frozen!", {r = 111, g = 111, b = 255})
freeze_players()
return
end
if name == "team_manager_activate_training" then
if not player.admin then player.print("Only admins can switch training mode.", {r = 175, g = 0, b = 0}) return end
if global.training_mode then
global.training_mode = false
global.game_lobby_active = true
draw_manager_gui(player)
game.print(">>> Training Mode has been disabled.", {r = 111, g = 111, b = 111})
return
end
global.training_mode = true
global.game_lobby_active = false
draw_manager_gui(player)
game.print(">>> Training Mode has been enabled!", {r = 225, g = 0, b = 0})
2019-09-01 02:42:14 +02:00
return
end
if not event.element.parent then return end
local element = event.element.parent
if not element.parent then return end
local element = element.parent
if element.name ~= "team_manager_root_table" then return end
if not player.admin then player.print("Only admins can manage teams.", {r = 175, g = 0, b = 0}) return end
local listbox = player.gui.center["team_manager_gui"]["team_manager_root_table"]["team_manager_list_box_" .. tonumber(name)]
local selected_index = listbox.selected_index
if selected_index == 0 then player.print("No player selected.", {r = 175, g = 0, b = 0}) return end
local player_name = listbox.items[selected_index]
local m = -1
if event.element.caption == "" then m = 1 end
local force_name = forces[tonumber(name) + m].name
switch_force(player_name, force_name)
2019-08-31 23:13:38 +02:00
draw_manager_gui(player)
end
2020-01-02 17:09:24 +02:00
function Public.gui_click(event)
2019-09-14 04:10:36 +02:00
if not event.element then return end
if not event.element.valid then return end
local player = game.players[event.player_index]
local name = event.element.name
if name == "team_manager_toggle_button" then
if player.gui.center["team_manager_gui"] then player.gui.center["team_manager_gui"].destroy() return end
draw_manager_gui(player)
return
end
if player.gui.center["team_manager_gui"] then team_manager_gui_click(event) end
if player.gui.center["custom_team_name_gui"] then
if name == "custom_team_name_gui_set" then
local custom_name = player.gui.center["custom_team_name_gui"].children[1].text
local force_name = player.gui.center["custom_team_name_gui"].children[1].name
set_custom_team_name(force_name, custom_name)
player.gui.center["custom_team_name_gui"].destroy()
draw_manager_gui(player)
2019-09-14 08:34:23 +02:00
return
2019-09-14 04:10:36 +02:00
end
if name == "custom_team_name_gui_close" then
player.gui.center["custom_team_name_gui"].destroy()
draw_manager_gui(player)
return
end
end
end
2020-01-02 17:09:24 +02:00
function Public.init()
2019-09-14 04:10:36 +02:00
global.tm_custom_name = {}
end
2020-01-02 17:09:24 +02:00
return Public