class ServerModeSA extends Actor config(ServerMode);

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 ServerMode6 extends ServerMode config(ServerMode);

class ServerMode7 extends ServerMode config(ServerMode);

class ServerMode8 extends ServerMode config(ServerMode);

class ServerMode9 extends ServerMode config(ServerMode);

class ServerMode10 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[15];
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<15; 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;
var config string Password;
var config int IdleMode;
var config int ForceMode;

var PlayerPawn ServerModeAdmins[5];

var config float TimeIdle, Interval;
var float fTimeIdle;

function PostBeginPlay()
{
    if ( NextMutator!= None ) { NextMutator.PostBeginPlay(); }
    SetTimer(interval,true);
}

function Timer() {
   if (Level.Game.NumPlayers==0) {
      fTimeIdle += Interval;
      if (fTimeIdle >= TimeIdle) {
      SetTimer(0, false);
      SpawnServerMode(IdleMode,ForceMode);
      }
   } else {
   fTimeIdle = 0;
   }
}

function Mutate(string MutateString, PlayerPawn Sender)
{

	local ServerMode1 sma1;
	local ServerMode2 sma2;
	local ServerMode3 sma3;
	local ServerMode4 sma4;
	local ServerMode5 sma5;
	local ServerMode6 sma6;
	local ServerMode7 sma7;
	local ServerMode8 sma8;
	local ServerMode9 sma9;
	local ServerMode10 sma10;
	local string sMode;
	local int i;
	local bool bIsModeAdmin;

	if (Left(Caps(MutateString),5) == "MODE ")
	{
		sMode = Mid(MutateString, 5);

		if (Left(Caps(sMode),6) == "LOGIN ") {

			if ( (Password!="") && (Mid(sMode, 6)==Password) ) {

				// Add PlayerPawn to free admin slot
				for (i=0; i<5; i++) {
					if (ServerModeAdmins[i]==None) {
						ServerModeAdmins[i] = Sender;
						Sender.ClientMessage("[ServerMode] Logged in.");
						return;
					}
				}
				Sender.ClientMessage("[ServerMode] Login error: No free admin slots!");
				return;
			}
		}

		// Check for admin status
		bIsModeAdmin = false;
		if ( (Sender.PlayerReplicationInfo!=None) && (Sender.PlayerReplicationInfo.bAdmin) ) {
			bIsModeAdmin = true;
		} else {
			for (i=0; i<5; i++) {
				if (ServerModeAdmins[i]==Sender) {
					bIsModeAdmin = true;
					break;
				}
			}
		}

		if (bIsModeAdmin)
		{
			sMode = Mid(MutateString, 5);
		//	SpawnServerMode(sMode,ForceMode);

            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 (sMode == "6")
			{
				sma6 = Spawn(class'ServerMode6', self);
			}
			else if (sMode == "7")
			{
				sma7 = Spawn(class'ServerMode7', self);
			}
			else if (sMode == "8")
			{
				sma8 = Spawn(class'ServerMode8', self);
			}
			else if (sMode == "9")
			{
				sma9 = Spawn(class'ServerMode9', self);
			}
			else if (sMode == "10")
			{
				sma10 = Spawn(class'ServerMode10', 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("> 6 = " $ class'ServerMode6'.default.Name);
		Sender.ClientMessage("> 7 = " $ class'ServerMode7'.default.Name);
		Sender.ClientMessage("> 8 = " $ class'ServerMode8'.default.Name);
		Sender.ClientMessage("> 9 = " $ class'ServerMode9'.default.Name);
		Sender.ClientMessage("> 10 = " $ class'ServerMode10'.default.Name);
		Sender.ClientMessage("> Last known mode: " $ LastMode);
	}

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

}

function SpawnServerMode(int iMode, int iChange) {
     local ServerMode sm;
     switch (iMode) {
            case 1:
            sm = Spawn(class'ServerMode1', self);
            break;
            case 2:
            sm = Spawn(class'ServerMode2', self);
            break;
            case 3:
            sm = Spawn(class'ServerMode3', self);
            break;
            case 4:
            sm = Spawn(class'ServerMode4', self);
            break;
            case 5:
            sm = Spawn(class'ServerMode5', self);
            break;
            case 6:
            sm = Spawn(class'ServerMode6', self);
            break;
            case 7:
            sm = Spawn(class'ServerMode7', self);
            break;
            case 8:
            sm = Spawn(class'ServerMode8', self);
            break;
            case 9:
            sm = Spawn(class'ServerMode9', self);
            break;
            case 10:
            sm = Spawn(class'ServerMode10', self);
            break;

     }

     //sm.Init();
     if (sm!=None) {
         switch (iChange) {
         case 1:
         sm.ChangeMode();
         //sm.ChangeFriendly();
         break;
         case 2:
         sm.ChangeMode();
         //sm.ChangeForced();
         break;
         case 3:
         sm.ChangeMode();
         //sm.ChangeSilent();
         break;
         }
     }
}

