//++ BulliT #include "extdll.h" #include "util.h" #include "cbase.h" #include "game.h" #include "agglobal.h" #include "player.h" #include "gamerules.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// extern int gmsgCountdown; extern int gmsgCheatCheck; AgMatch::AgMatch() { m_fMatchStart = 0.0; m_fNextSay = 0.0; m_fNextHLTV = 0.0; CVAR_SET_FLOAT("sv_ag_match_running",0); CVAR_SET_FLOAT("ag_spectalk",1); CVAR_SET_FLOAT("sv_ag_show_gibs",1); } AgMatch::~AgMatch() { } void AgMatch::Think() { if (m_fMatchStart > 0 ) { if (m_fMatchStart < gpGlobals->time) { //Start it MatchStart(); } else { //Countdown if (m_fNextSay < gpGlobals->time) { #ifdef AG_NO_CLIENT_DLL //Play countdown beeb for ( int i = 1; i <= gpGlobals->maxClients; i++ ) { CBasePlayer* pPlayerLoop = AgPlayerByIndex(i); if (pPlayerLoop && !pPlayerLoop->IsSpectator()) AgPlayCountdown(pPlayerLoop,(int)(m_fMatchStart - gpGlobals->time)); } char szMatchStart[16]; sprintf(szMatchStart,"%d",(int)(m_fMatchStart - gpGlobals->time)); AgSay(NULL,szMatchStart,&m_fNextSay,1,0.5,0.45); #else //Play countdown beeb MESSAGE_BEGIN( MSG_BROADCAST, gmsgCountdown); WRITE_BYTE( (int)(m_fMatchStart - gpGlobals->time) ); WRITE_BYTE( 1 ); WRITE_STRING( "" ); WRITE_STRING( "" ); MESSAGE_END(); m_fNextSay = gpGlobals->time + 1.0; #endif } } } /* else if (g_bPaused) { AgSay(NULL,"Game is paused!\n",&m_fNextSay,5,0.4); } */ else if (0 == timelimit.value && 0 == fraglimit.value) { //Stop the match since it could go on forever. Abort(); } if (m_fNextHLTV < gpGlobals->time) { //Send again in one minute. m_fNextHLTV = gpGlobals->time + 60.0; //Spectator scoreboards g_pGameRules->HLTV_ResendScoreBoard(); } } void AgMatch::Start(const AgString& sSpawn) { if (m_fMatchStart > 0 || 0 == timelimit.value && 0 == fraglimit.value) return; //Count players int iPlayers = 0; int i = 0; for ( i = 1; i <= gpGlobals->maxClients; i++ ) { CBasePlayer* pPlayerLoop = AgPlayerByIndex(i); if (pPlayerLoop && !pPlayerLoop->IsSpectator()) iPlayers++; } if (iPlayers < (int)ag_start_minplayers.value) { UTIL_ClientPrintAll(HUD_PRINTCENTER, UTIL_VarArgs("You need %d players to start a game on this server.",(int)ag_start_minplayers.value)); return; } //Set match flag. (All entered after matchstart will go into specmode and they cant respawn.) CVAR_SET_FLOAT("sv_ag_match_running",1); CVAR_SET_FLOAT("ag_spectalk",0); CVAR_SET_FLOAT("sv_ag_show_gibs",0); //Set match start time. m_fMatchStart = gpGlobals->time + 10.0; m_sSpawnFlag = sSpawn; //Pause the game g_bPaused = true; } void AgMatch::MatchStart() { m_fMatchStart = -1; //Reset score cache. g_pGameRules->m_ScoreCache.Reset(); //Reset available timeouts. g_pGameRules->m_Timeout.Reset(); //Reset map. AgResetMap(); //Reset CTF score g_pGameRules->m_CTF.ResetScore(); //++ muphicks if (DOM == AgGametype()) g_pGameRules->m_DOM.ResetControlPoints(); //-- muphicks //Loop through all active players, reset Score and respawn. for ( int i = 1; i <= gpGlobals->maxClients; i++ ) { CBasePlayer* pPlayerLoop = AgPlayerByIndex(i); if (pPlayerLoop) { if (pPlayerLoop->IsSpectator()) { //Regular spectators aint spawned when match is restarted. pPlayerLoop->ResetScore(); //Reset the score. if (strstr(m_sSpawnFlag.c_str(),"nolock")) pPlayerLoop->SetIngame(true); else pPlayerLoop->SetIngame(false); //Player is not allowed to enter the game if he dropped. pPlayerLoop->SetDisplayGamemode(2); //Show settings. g_pGameRules->m_ScoreCache.UpdateScore(pPlayerLoop); continue; } else { if (strstr(m_sSpawnFlag.c_str(),"full")) pPlayerLoop->SetSpawnFull(true); else pPlayerLoop->SetSpawnFull(false); pPlayerLoop->SetIngame(true); //Player is allowed to enter the game if he dropped. pPlayerLoop->ResetScore(); //Reset the score. pPlayerLoop->RespawnMatch(); //Now spawn the sucker :-) pPlayerLoop->SetDisplayGamemode(2); //Show settings. g_pGameRules->m_ScoreCache.UpdateScore(pPlayerLoop); } } } #ifndef AG_NO_CLIENT_DLL //Stop countdown MESSAGE_BEGIN( MSG_ALL, gmsgCountdown); WRITE_BYTE( -1 ); WRITE_BYTE( 0 ); WRITE_STRING( "" ); WRITE_STRING( "" ); MESSAGE_END(); #endif //Reset spawn full variable. m_sSpawnFlag = ""; //Remove pause. g_bPaused = false; //Reset timer. g_pGameRules->m_Timer.Reset(); //Score log g_pGameRules->m_ScoreLog.Start(); //Spectator scoreboards g_pGameRules->HLTV_ResendScoreBoard(); } void AgMatch::Abort() { //Turn off match CVAR_SET_FLOAT("sv_ag_match_running",0); CVAR_SET_FLOAT("sv_ag_show_gibs",1); CVAR_SET_FLOAT("ag_spectalk",1); m_fMatchStart = -1; //Score log off g_pGameRules->m_ScoreLog.End(); //Remove pause. g_bPaused = false; //Loop through all active players. for ( int i = 1; i <= gpGlobals->maxClients; i++ ) { CBasePlayer* pPlayerLoop = AgPlayerByIndex(i); if (pPlayerLoop) { if (pPlayerLoop->IsSpectator()) { //Regular spectators aint spawned when match is restarted. pPlayerLoop->ResetScore(); //Reset the score. pPlayerLoop->SetIngame(true); pPlayerLoop->Spectate_Stop(true); } pPlayerLoop->SetDisplayGamemode(2); //Show settings. } } } void AgMatch::Allow(CBasePlayer* pPlayer) { ASSERT(NULL != pPlayer); if (!pPlayer) return; ASSERT(NULL != pPlayer->pev); if (!pPlayer->pev) return; pPlayer->SetIngame(true); g_pGameRules->m_ScoreCache.UpdateScore(pPlayer); if (pPlayer->IsSpectator()) { pPlayer->Spectate_Stop(true); } AgString sText; sText = UTIL_VarArgs("\"%s\" is now allowed to enter the game",pPlayer->GetName()); AgSay(NULL,sText); AgConsole(sText); } //-- Martin Webrant