2019-01-17 01:55:19 +02:00
local Command = require ' utils.command '
2020-09-23 12:14:36 +02:00
local Rank = require ' features.rank_system '
2019-01-17 01:55:19 +02:00
local Task = require ' utils.task '
local Token = require ' utils.token '
local Server = require ' features.server '
local Popup = require ' features.gui.popup '
local Global = require ' utils.global '
2019-01-30 05:52:43 +02:00
local Ranks = require ' resources.ranks '
2020-09-23 12:14:36 +02:00
local Utils = require ' utils.core '
2019-01-17 01:55:19 +02:00
local server_player = { name = ' <server> ' , print = print }
local global_data = { restarting = nil }
Global.register (
global_data ,
function ( tbl )
global_data = tbl
end
)
local function double_print ( str )
game.print ( str )
print ( str )
end
local callback
callback =
Token.register (
function ( data )
if not global_data.restarting then
return
end
local state = data.state
if state == 0 then
Server.start_scenario ( data.scenario_name )
double_print ( ' restarting ' )
2020-04-16 00:03:51 +02:00
global_data.restarting = nil
2019-01-17 01:55:19 +02:00
return
elseif state == 1 then
Popup.all ( ' \n Server restarting! \n Initiated by ' .. data.name .. ' \n ' )
end
double_print ( state )
data.state = state - 1
Task.set_timeout_in_ticks ( 60 , callback , data )
end
)
2019-03-06 23:35:38 +02:00
local function restart ( args , player )
player = player or server_player
if global_data.restarting then
player.print ( ' Restart already in progress ' )
return
end
2020-09-23 12:14:36 +02:00
if Rank.less_than ( player.name , Ranks.admin ) then
-- Check enemy count
local enemy_count = game.player . surface.count_entities_filtered { force = " enemy " }
if ( enemy_count ~= 0 ) then
game.player . print ( ' All enemy spawners, worms, buildings, biters and spitters must be cleared for non-admin restart. Current enemy count: ' .. enemy_count )
return
end
end
2019-03-06 23:35:38 +02:00
global_data.restarting = true
double_print ( ' #################-Attention-################# ' )
double_print ( ' Server restart initiated by ' .. player.name )
double_print ( ' ########################################### ' )
for k , v in pairs ( game.players ) do
if v.admin then
game.print ( ' Abort restart with /abort ' )
end
end
print ( ' Abort restart with /abort ' )
2020-09-23 12:14:36 +02:00
2019-03-06 23:35:38 +02:00
Task.set_timeout_in_ticks ( 60 , callback , { name = player.name , scenario_name = args.scenario_name , state = 10 } )
end
local function abort ( _ , player )
player = player or server_player
if global_data.restarting then
global_data.restarting = nil
double_print ( ' Restart aborted by ' .. player.name )
else
player.print ( ' Cannot abort a restart that is not in progress. ' )
end
end
Command.add (
' crash-site-restart-abort ' ,
{
description = { ' command_description.crash_site_restart_abort ' } ,
required_rank = Ranks.admin ,
allowed_by_server = true
} ,
abort
)
2019-01-17 01:55:19 +02:00
Command.add (
2019-03-06 23:35:38 +02:00
' abort ' ,
2019-01-17 01:55:19 +02:00
{
2019-03-04 00:13:56 +02:00
description = { ' command_description.crash_site_restart_abort ' } ,
2019-01-30 05:52:43 +02:00
required_rank = Ranks.admin ,
2019-01-17 01:55:19 +02:00
allowed_by_server = true
} ,
2019-03-06 23:35:38 +02:00
abort
2019-01-17 01:55:19 +02:00
)
2019-07-28 12:44:13 +02:00
local Public = { }
function Public . control ( config )
local default_name = config.scenario_name or ' crashsite '
Command.add (
' crash-site-restart ' ,
{
description = { ' command_description.crash_site_restart ' } ,
arguments = { ' scenario_name ' } ,
default_values = { scenario_name = default_name } ,
required_rank = Ranks.admin ,
allowed_by_server = true
} ,
restart
)
Command.add (
' restart ' ,
{
description = { ' command_description.crash_site_restart ' } ,
arguments = { ' scenario_name ' } ,
default_values = { scenario_name = default_name } ,
2020-09-23 12:14:36 +02:00
required_rank = Ranks.guest ,
2019-07-28 12:44:13 +02:00
allowed_by_server = true
} ,
restart
)
end
return Public