
/*
	Eric multiplayer script - DM
*/

#include <inc\sc_global.h>
#include <inc\sc_def.h>


#define RECOVER_TIME	5.0f		// time to recover player after killed
#define NORECOV_TIME	3.0f		// disable time of recoverplace after recovering someone there

#define REC_WPNAME		"DM%d"
#define REC_MAX			64


dword gRecs = 0;
s_SC_MP_Recover gRec[REC_MAX];
float gRecTimer[REC_MAX];


dword gEndRule;
dword gEndValue;
float gTime;

dword gPlayersConnected = 0;

BOOL SRV_CheckEndRule(float time){
	int frags;

	switch(gEndRule){
		case SC_MP_ENDRULE_TIME:

			if (gPlayersConnected>0) gTime += time;
			SC_MP_EndRule_SetTimeLeft(gTime,gPlayersConnected>0);

			if (gTime>gEndValue){
				SC_MP_LoadNextMap();
				return TRUE;
			}

			break;

		case SC_MP_ENDRULE_FRAGS:

			if (SC_MP_GetMaxFragsPl(&frags)){

				if (frags>=gEndValue){
					SC_MP_LoadNextMap();
					return TRUE;
				}
			}

			break;

		default:
			SC_message("EndRule unsopported: %d",gEndRule);
			break;

	}// switch(gEndRule)

	return FALSE;

}// void SRV_CheckEndRule(float time)


int ScriptMain(s_SC_NET_info *info){
	char txt[32];
	dword i;
	s_SC_MP_Recover *precov;
	s_SC_MP_hud hudinfo;
	s_SC_MP_EnumPlayers enum_pl[64];
	s_SC_MP_SRV_settings SRVset;

	switch(info->message){
		
		case SC_NET_MES_SERVER_TICK:			

			gPlayersConnected = 64;
			SC_MP_EnumPlayers(enum_pl,&gPlayersConnected,SC_MP_ENUMPLAYER_SIDE_ALL);			

			if (SRV_CheckEndRule(info->elapsed_time)) break;

			for (i=0;i<gRecs;i++)
				gRecTimer[i] -= info->elapsed_time;


			break;

		case SC_NET_MES_CLIENT_TICK:

			break;// SC_NET_MES_CLIENT_TICK

		case SC_NET_MES_LEVELPREINIT:
			SC_sgi(GVAR_MP_MISSIONTYPE,GVAR_MP_MISSIONTYPE_DM);

			gEndRule = info->param1;
			gEndValue = info->param2;
			gTime = 0.0f;

			SC_MP_EnableBotsFromScene(FALSE);

			break;// SC_NET_MES_LEVELPREINIT

		case SC_NET_MES_LEVELINIT:


			SC_MP_SRV_SetForceSide(0xffffffff);
			SC_MP_SetChooseValidSides(3);

			
			SC_HUD_DisableRadar(TRUE);			

			SC_MP_SRV_SetClassLimitsForDM();			

			CLEAR(hudinfo);
			hudinfo.title = 1050;
			

			hudinfo.sort_by[0] = SC_HUD_MP_SORTBY_FRAGS;			
			hudinfo.sort_by[1] = SC_HUD_MP_SORTBY_KILLS;
			hudinfo.sort_by[2] = SC_HUD_MP_SORTBY_DEATHS | SC_HUD_MP_SORT_DOWNUP;
			hudinfo.sort_by[3] = SC_HUD_MP_SORTBY_PINGS | SC_HUD_MP_SORT_DOWNUP;

			hudinfo.pl_mask = SC_HUD_MP_PL_MASK_FRAGS | SC_HUD_MP_PL_MASK_KILLS | SC_HUD_MP_PL_MASK_DEATHS;
			hudinfo.use_sides = 0;

			SC_MP_HUD_SetTabInfo(&hudinfo);

			SC_MP_AllowStPwD(FALSE);
			SC_MP_AllowFriendlyFireOFF(FALSE);

			SC_MP_SetItemsNoDisappear(TRUE);

			if (info->param2){

				if (info->param1){
					// it's server							

					SC_MP_GetSRVsettings(&SRVset);
					SC_MP_SRV_InitWeaponsRecovery((float)SRVset.dm_weap_resp_time);

					gRecs = 0;

					for (i=0;i<REC_MAX;i++){		
						sprintf(txt,REC_WPNAME,i);			
						if (SC_NET_FillRecover(&gRec[gRecs],txt)) gRecs++;
					}					

#if _GE_VERSION_ >= 133

					i = REC_MAX - gRecs;
					SC_MP_GetRecovers(SC_MP_RESPAWN_DM,&gRec[gRecs],&i);
					gRecs += i;
#endif

					SC_Log(3,"DM respawns: %d",gRecs);

					if (gRecs==0) SC_message("no recover place defined!");

					CLEAR(gRecTimer);

				}// if (info->param1)

			}//if (info->param2)


			break;// SC_NET_MES_LEVELINIT


		case SC_NET_MES_RENDERHUD:

			break;

		case SC_NET_MES_SERVER_RECOVER_TIME:

			if (info->param2){
					info->fval1 = 0.1f;
			}
			else{
				// killed
				info->fval1 = RECOVER_TIME;
			}

			break;

		case SC_NET_MES_SERVER_RECOVER_PLACE:
			
			precov = (s_SC_MP_Recover*)info->param2;

			i = SC_MP_SRV_GetBestDMrecov(gRec,gRecs,gRecTimer,NORECOV_TIME);
			
			gRecTimer[i] = NORECOV_TIME;
			*precov = gRec[i];
						
			break;



		case SC_NET_MES_RESTARTMAP:

			gTime = 0;

			SC_MP_SRV_ClearPlsStats();

			SC_MP_SRV_InitGameAfterInactive();
			SC_MP_RecoverAllNoAiPlayers();			

			break;// SC_NET_MES_RESTARTMAP

		case SC_NET_MES_RULESCHANGED:			
			gEndRule = info->param1;
			gEndValue = info->param2;
			gTime = 0.0f;
			break;
						

	}// switch(info->message)
	

	return 1;

}// int ScriptMain(void)

