
init()
{
	if(!level.ex_motdrotate) return;

	//logprint("MOTD DEBUG: motd system initializing...\n");
	level.rotmotd = [];

	count = 1;
	for(;;)
	{
		cvarname = "ex_motd" + count;
		msg = extreme\_ex_drm::drm_getCvar(cvarname);
		if(!isDefined(msg) || msg == "") break;
		level.rotmotd[level.rotmotd.size] = msg;
		count++;
	}

	if(level.rotmotd.size > 0) level thread OnPlayerConnect();
		else logprint("MOTD DEBUG: shutting down motd system. No messages defined\n");
}

OnPlayerConnect()
{
	for(;;)
	{
		level waittill("connected", player);
		player thread motdWaitForStop();
		player thread motdWaitForStart();
	}
}

motdWaitForStart()
{
	self endon("disconnect");

	for(;;)
	{
		self waittill("start_motd_rotation");
		//logprint("MOTD DEBUG: " + self.name + " received signal \"start_motd_rotation\"\n");
		self.ex_motd_rotate = 1;
		self thread motdStartRotation();
	}
}

motdWaitForStop()
{
	self endon("disconnect");

	for(;;)
	{
		self waittill("stop_motd_rotation");
		//logprint("MOTD DEBUG: " + self.name + " received signal \"stop_motd_rotation\"\n");
		self.ex_motd_rotate = 0;
		self notify("stop_motd");
	}
}

motdStartRotation()
{
	self endon("disconnect");
	self endon("stop_motd");

	//logprint("MOTD DEBUG: " + self.name + " started motd rotation\n");

	while(self.ex_motd_rotate)
	{
		for(i = 0; i < level.rotmotd.size; i++)
		{
			msg = level.rotmotd[i];
			self setClientCvar("ui_motd", msg);
			wait( [[level.ex_fpstime]](level.ex_motdrotdelay) );
		}
	}
}

welcomeMsg()
{
	level endon("ex_gameover");
	self endon("disconnect");
	self endon("ex_dead");

	if(isDefined(self.pers["welcdone"])) return;

	self.pers["welcdone"] = true;

	if(!level.ex_pwelcome) return;
		
	// welcome message line 1
	self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_ALL_MESSAGE_1");
	wait( [[level.ex_fpstime]](level.ex_pweldelay) );

	// welcome message line 2
	self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_ALL_MESSAGE_2");
	wait( [[level.ex_fpstime]](level.ex_pweldelay) );

	// voting status
	if(getCvarInt("g_allowvote") == 1)
	{
		if(level.ex_clanvoting)
		{
			if(isDefined(self.ex_name) && level.ex_clvote[self.ex_clid]) self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_VOTE_ALLOWED");
				else self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_VOTE_NOT_ALLOWED");
		}
		else self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_VOTE_ALLOWED");
	}
	else self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_VOTE_NOT_ALLOWED");

	if(level.ex_clanwelcome && isDefined(self.ex_name)) self thread clanWelcome();
	else
	{
		// welcome message - custom 1
		if(level.ex_pwelmsg >= 1)
		{
			wait( [[level.ex_fpstime]](level.ex_pweldelay) );
			self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_NONCLAN_MESSAGE_1");
		}
		else return;

		// welcome message - custom 2
		if(level.ex_pwelmsg >= 2)
		{
			wait( [[level.ex_fpstime]](level.ex_pweldelay) );
			self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_NONCLAN_MESSAGE_2");
		}
		else return;

		// welcome message - custom 3
		if(level.ex_pwelmsg == 3)
		{
			wait( [[level.ex_fpstime]](level.ex_pweldelay) );
			self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_NONCLAN_MESSAGE_3");
		}
		else return;
	}
}

clanWelcome()
{
	level endon("ex_gameover");
	self endon("disconnect");
	self endon("ex_dead");

	switch(self.ex_clid)
	{
		case 1:
		self thread clan1msgs();
		break;

		case 2:
		self thread clan2msgs();
		break;

		case 3:
		self thread clan3msgs();
		break;

		case 4:
		self thread clan4msgs();
		break;
	}
}

clan1msgs()
{
	level endon("ex_gameover");
	self endon("disconnect");
	self endon("ex_dead");

	// clan message - custom 1
	if(level.ex_clan1msg >= 1)
	{
		wait( [[level.ex_fpstime]](level.ex_clandelay) );
		self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_CLAN1_MESSAGE_1");
	}
	else return;

	// clan message - custom 2
	if(level.ex_clan1msg >= 2)
	{
		wait( [[level.ex_fpstime]](level.ex_clandelay) );
		self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_CLAN1_MESSAGE_2");
	}
	else return;

	// clan message - custom 3
	if(level.ex_clan1msg == 3)
	{
		wait( [[level.ex_fpstime]](level.ex_clandelay) );
		self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_CLAN1_MESSAGE_3");
	}
	else return;	
}

clan2msgs()
{
	level endon("ex_gameover");
	self endon("disconnect");
	self endon("ex_dead");

	// clan message - custom 1
	if(level.ex_clan2msg >= 1)
	{
		wait( [[level.ex_fpstime]](level.ex_clandelay) );
		self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_CLAN2_MESSAGE_1");
	}
	else return;

	// clan message - custom 2
	if(level.ex_clan2msg >= 2)
	{
		wait( [[level.ex_fpstime]](level.ex_clandelay) );
		self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_CLAN2_MESSAGE_2");
	}
	else return;

	// clan message - custom 3
	if(level.ex_clan2msg == 3)
	{
		wait( [[level.ex_fpstime]](level.ex_clandelay) );
		self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_CLAN2_MESSAGE_3");
	}
	else return;	
}

clan3msgs()
{
	level endon("ex_gameover");
	self endon("disconnect");
	self endon("ex_dead");

	// clan message - custom 1
	if(level.ex_clan3msg >= 1)
	{
		wait( [[level.ex_fpstime]](level.ex_clandelay) );
		self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_CLAN3_MESSAGE_1");
	}
	else return;

	// clan message - custom 2
	if(level.ex_clan3msg >= 2)
	{
		wait( [[level.ex_fpstime]](level.ex_clandelay) );
		self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_CLAN3_MESSAGE_2");
	}
	else return;

	// clan message - custom 3
	if(level.ex_clan3msg == 3)
	{
		wait( [[level.ex_fpstime]](level.ex_clandelay) );
		self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_CLAN3_MESSAGE_3");
	}
	else return;	
}

clan4msgs()
{
	level endon("ex_gameover");
	self endon("disconnect");
	self endon("ex_dead");

	// clan message - custom 1
	if(level.ex_clan4msg >= 1)
	{
		wait( [[level.ex_fpstime]](level.ex_clandelay) );
		self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_CLAN4_MESSAGE_1");
	}
	else return;

	// clan message - custom 2
	if(level.ex_clan4msg >= 2)
	{
		wait( [[level.ex_fpstime]](level.ex_clandelay) );
		self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_CLAN4_MESSAGE_2");
	}
	else return;

	// clan message - custom 3
	if(level.ex_clan4msg == 3)
	{
		wait( [[level.ex_fpstime]](level.ex_clandelay) );
		self thread extreme\_ex_utils::ex_hud_announce(&"CUSTOM_CLAN4_MESSAGE_3");
	}
	else return;	
}

goodluckMsg()
{
	level endon("ex_gameover");
	self endon("disconnect");
	self endon("ex_dead");

	if(!isdefined(self.pers["team"])) return;

	// if using the readyup system, no need to hear any intro sounds again
	if(level.ex_readyup && isDefined(game["readyup_done"]) && isDefined(self.pers["team"])) return;

	// on round based games, no need to hear any intro sounds every round
	if(level.ex_roundbased && game["roundnumber"] > 0 && isDefined(self.pers["team"])) return;

	stp = undefined;
	wait( [[level.ex_fpstime]](5) );

	if(isPlayer(self))
	{
		if(self.pers["team"] == "allies")
		{
			switch(game["allies"])
			{
				case "american":
				stp = "us_welcome";
				break;

				case "british":
				stp = "uk_welcome";
				break;

				case "russian":
				stp = "ru_welcome";
				break;
			}
		}
		else if(self.pers["team"] == "axis")
		{
			switch(game["axis"])
			{
				case "german":
				stp = "ge_welcome";
				break;
			}
		}

		if(isdefined(stp))
		{
			self playLocalSound(stp);
			self.ex_glplay = true;
		}
	}
}

serverMessages()
{
	level endon("ex_gameover");

	svrmsg = [];
	svrmsg[0] = &"CUSTOM_SERVER_MESSAGE_1";
	svrmsg[1] = &"CUSTOM_SERVER_MESSAGE_2";
	svrmsg[2] = &"CUSTOM_SERVER_MESSAGE_3";
	svrmsg[3] = &"CUSTOM_SERVER_MESSAGE_4";
	svrmsg[4] = &"CUSTOM_SERVER_MESSAGE_5";
	svrmsg[5] = &"CUSTOM_SERVER_MESSAGE_6";
	svrmsg[6] = &"CUSTOM_SERVER_MESSAGE_7";
	svrmsg[7] = &"CUSTOM_SERVER_MESSAGE_8";
	svrmsg[8] = &"CUSTOM_SERVER_MESSAGE_9";
	svrmsg[9] = &"CUSTOM_SERVER_MESSAGE_10";
	svrmsg[10] = &"CUSTOM_SERVER_MESSAGE_11";
	svrmsg[11] = &"CUSTOM_SERVER_MESSAGE_12";
	svrmsg[12] = &"CUSTOM_SERVER_MESSAGE_13";
	svrmsg[13] = &"CUSTOM_SERVER_MESSAGE_14";
	svrmsg[14] = &"CUSTOM_SERVER_MESSAGE_15";
	svrmsg[15] = &"CUSTOM_SERVER_MESSAGE_16";
	svrmsg[16] = &"CUSTOM_SERVER_MESSAGE_17";
	svrmsg[17] = &"CUSTOM_SERVER_MESSAGE_18";
	svrmsg[18] = &"CUSTOM_SERVER_MESSAGE_19";
	svrmsg[19] = &"CUSTOM_SERVER_MESSAGE_20";

	while(!level.ex_gameover)
	{
		if(level.ex_svrmsg_loop) wait( [[level.ex_fpstime]](level.ex_svrmsg_delay_main / 2) );
			else wait( [[level.ex_fpstime]](level.ex_svrmsg_delay_main) );

		for(i = 0; i < level.ex_svrmsg; i++)
		{
			iprintln(svrmsg[i]);
			wait( [[level.ex_fpstime]](level.ex_svrmsg_delay_msg) );
		}
	
		if(level.ex_svrmsg_info >= 1)
			thread extreme\_ex_maps::DisplayMapRotation();

		if(!level.ex_svrmsg_loop)
			break;

		wait( [[level.ex_fpstime]](level.ex_svrmsg_delay_main / 2) );
	}
}

spectatorMessages()
{
	level endon("ex_gameover");
	self endon("disconnect");
	self endon("ex_spawned");

	specmsg = [];
	specmsg[0] = &"CUSTOM_SPECTATOR_MESSAGE_1";
	specmsg[1] = &"CUSTOM_SPECTATOR_MESSAGE_2";
	specmsg[2] = &"CUSTOM_SPECTATOR_MESSAGE_3";
	specmsg[3] = &"CUSTOM_SPECTATOR_MESSAGE_4";
	specmsg[4] = &"CUSTOM_SPECTATOR_MESSAGE_5";
	specmsg[5] = &"CUSTOM_SPECTATOR_MESSAGE_6";
	specmsg[6] = &"CUSTOM_SPECTATOR_MESSAGE_7";
	specmsg[7] = &"CUSTOM_SPECTATOR_MESSAGE_8";
	specmsg[8] = &"CUSTOM_SPECTATOR_MESSAGE_9";
	specmsg[9] = &"CUSTOM_SPECTATOR_MESSAGE_10";

	while(isPlayer(self) && self.pers["team"] == "spectator")
	{
		for(i = 0; i < level.ex_specmsg; i++)
		{
			self iprintln(specmsg[i]);
			wait( [[level.ex_fpstime]](level.ex_specmsg_delay_msg) );
		}

		wait( [[level.ex_fpstime]](level.ex_svrmsg_delay_main / 2) );
	}
}
