class ServerModeSA extends Actor;

function PreBeginPlay()
{
	Level.Game.BaseMutator.AddMutator( Level.Game.Spawn( class'ServerModeMutator' ) );
	Destroy();
}

class ServerMode1 extends ServerMode config(ServerMode);

class ServerMode2 extends ServerMode config(ServerMode);

class ServerMode3 extends ServerMode config(ServerMode);

class ServerMode4 extends ServerMode config(ServerMode);

class ServerMode5 extends ServerMode config(ServerMode);

class ServerMode extends Mutator config(ServerMode);

var config string Name;
var config string DefaultMap;
var config string DefaultGametype;
var config string DefaultMutators;
var config string Commands[10];
var config bool ForceDefault;
var config bool ForceRestart;
var bool bInitialized;

function PreBeginPlay()
{

	if (bInitialized)
	{
		return;
	}

        bInitialized = True;
	SaveConfig();

	if (!Owner.IsA('ServerModeMutator'))
	{
		// Base mutator is not owner, assuming an added mutator: added mutators change immediate!
		if ( Level.ConsoleCommand("get ServerMode01.ServerModeMutator State") ~= "restart")
		{
			// Prevent restart loop
			Level.ConsoleCommand("set ServerMode01.ServerModeMutator State ");
			Destroy();
		}
		else
		{
			ChangeMode();
		}
		return;
	}
	else
	{
		// Initiated by administrator: notice about change and set countdown
		BroadCastMessage(">>> Server is changing to mode '" $ Name $ "' in 5 seconds...");
		SetTimer(5.0, false);
	}

}

function Timer()
{
	ChangeMode();
}

function ChangeMode()
{

	local int i;
	local string sTravel;

	// Process commands
	for (i=0; i<10; i++)
	{
		if (Commands[i] != "")
		{
			Level.ConsoleCommand(Commands[i]);
		}
	}

	// Configure game start
	sTravel = "";
	if (ForceDefault)
	{
		if (DefaultMap != "")
		{
			sTravel = DefaultMap;
		}
		else
		{
			sTravel = "?restart";
		}

		if (DefaultGametype != "")
		{
			sTravel = sTravel $ "?game=" $ DefaultGametype;
		}

		if (DefaultMutators != "")
		{
			sTravel = sTravel $ "?mutator=" $ DefaultMutators;
		}
	}
	else if (ForceRestart)
	{
		sTravel = "?restart";
	}

	// Restart game
	Level.ConsoleCommand("set ServerMode01.ServerModeMutator LastMode " $ Name);
	if (sTravel != "")
	{
		Level.ConsoleCommand("set ServerMode01.ServerModeMutator State restart");
		Level.ServerTravel(sTravel, false);
	}
	else
	{
		Level.ConsoleCommand("set ServerMode01.ServerModeMutator State ");
	}

}

class ServerModeMutator extends Mutator config(ServerMode);

var config string LastMode;

function Mutate(string MutateString, PlayerPawn Sender)
{

	local ServerMode1 sma1;
	local ServerMode2 sma2;
	local ServerMode3 sma3;
	local ServerMode4 sma4;
	local ServerMode5 sma5;
	local string sMode;

	if (Left(Caps(MutateString),5) == "MODE ") 
	{
		if ( (Sender.PlayerReplicationInfo!=None)&&(Sender.PlayerReplicationInfo.bAdmin) )
		{
			sMode = Mid(MutateString, 5);
			if (sMode == "1")
			{
				sma1 = Spawn(class'ServerMode1', self);
			}
			else if (sMode == "2")
			{
				sma2 = Spawn(class'ServerMode2', self);
			}
			else if (sMode == "3")
			{
				sma3 = Spawn(class'ServerMode3', self);
			}
			else if (sMode == "4")
			{
				sma4 = Spawn(class'ServerMode4', self);
			}
			else if (sMode == "5")
			{
				sma5 = Spawn(class'ServerMode5', self);
			}
		}

	}
	else if (Left(Caps(MutateString),4) == "MODE") 
	{
		Sender.ClientMessage("> ServerMode (C)2005 iDeFiX");
		Sender.ClientMessage("> -------------------------");
		Sender.ClientMessage("> 1 = " $ class'ServerMode1'.default.Name);
		Sender.ClientMessage("> 2 = " $ class'ServerMode2'.default.Name);
		Sender.ClientMessage("> 3 = " $ class'ServerMode3'.default.Name);
		Sender.ClientMessage("> 4 = " $ class'ServerMode4'.default.Name);
		Sender.ClientMessage("> 5 = " $ class'ServerMode5'.default.Name);
		Sender.ClientMessage("> Last known mode: " $ LastMode);
	}

	if (NextMutator != None) {
		NextMutator.Mutate(MutateString, Sender);
	}

}

