//++ BulliT #include "extdll.h" #include "util.h" #include "cbase.h" #include "player.h" #include "weapons.h" #include "gamerules.h" #include "aggamerules.h" #include "agglobal.h" #include "aglms.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// extern int gmsgCountdown; AgLMS::AgLMS() { m_fMatchStart = 0.0; m_fNextCountdown = 0.0; m_Status = Waiting; } AgLMS::~AgLMS() { } void AgLMS::Think() { if (!g_pGameRules) return; if (Playing == m_Status) { if (m_fNextCountdown > gpGlobals->time) return; m_fNextCountdown = gpGlobals->time + 0.5f; if (g_pGameRules->IsTeamplay()) { //Teams. AgStringSet setTeams; for ( int i = 1; i <= gpGlobals->maxClients; i++ ) { CBasePlayer* pPlayerLoop = AgPlayerByIndex(i); if (pPlayerLoop) { if (!pPlayerLoop->IsAlive()) { pPlayerLoop->SetIngame(false); //Cant respawn if(!pPlayerLoop->IsSpectator()) { //Quake1 teleport splash around him. MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); WRITE_BYTE( TE_TELEPORT ); WRITE_COORD(pPlayerLoop->pev->origin.x); WRITE_COORD(pPlayerLoop->pev->origin.y); WRITE_COORD(pPlayerLoop->pev->origin.z); MESSAGE_END(); pPlayerLoop->Spectate_Start(false); pPlayerLoop->Spectate_SetMode(OBS_IN_EYE); } } else { setTeams.insert(pPlayerLoop->m_szTeamName); } } } if (!(setTeams.size() > 1)) { m_sWinner = ""; AgStringSet::iterator itrTeams = setTeams.begin(); if (itrTeams != setTeams.end()) { m_sWinner = *itrTeams; } m_Status = Waiting; } } else { int iPlayersAlive = 0; CBasePlayer* pPlayer = NULL; for ( int i = 1; i <= gpGlobals->maxClients; i++ ) { CBasePlayer* pPlayerLoop = AgPlayerByIndex(i); if (pPlayerLoop) { if (!pPlayerLoop->IsAlive()) { pPlayerLoop->SetIngame(false); //Cant respawn if(!pPlayerLoop->IsSpectator()) { //Quake1 teleport splash around him. MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); WRITE_BYTE( TE_TELEPORT ); WRITE_COORD(pPlayerLoop->pev->origin.x); WRITE_COORD(pPlayerLoop->pev->origin.y); WRITE_COORD(pPlayerLoop->pev->origin.z); MESSAGE_END(); pPlayerLoop->Spectate_Start(false); pPlayerLoop->Spectate_SetMode(OBS_IN_EYE); } } else { iPlayersAlive++; pPlayer = pPlayerLoop; } } } if (!(iPlayersAlive > 1)) { m_sWinner = ""; if (pPlayer) m_sWinner = pPlayer->GetName(); m_Status = Waiting; } } } else { //We only update status once every second. if (m_fNextCountdown > gpGlobals->time) return; m_fNextCountdown = gpGlobals->time + 1.0f; //Handle the status if (Waiting == m_Status) { if (g_pGameRules->IsTeamplay()) { //Teams. AgStringSet setTeams; for ( int i = 1; i <= gpGlobals->maxClients; i++ ) { CBasePlayer* pPlayerLoop = AgPlayerByIndex(i); if (pPlayerLoop && pPlayerLoop->m_bReady) { setTeams.insert(pPlayerLoop->m_szTeamName); } } if (setTeams.size() > 1) { m_Status = Countdown; m_fMatchStart = gpGlobals->time + 8.0f; m_fNextCountdown = gpGlobals->time + 3.0f; } } else { int iPlayers = 0; for ( int i = 1; i <= gpGlobals->maxClients; i++ ) { CBasePlayer* pPlayerLoop = AgPlayerByIndex(i); if (pPlayerLoop && pPlayerLoop->m_bReady) { iPlayers++; } } if (iPlayers > 1) { m_Status = Countdown; m_fMatchStart = gpGlobals->time + 8.0f; m_fNextCountdown = gpGlobals->time + 3.0f; } } //Write waiting message #ifdef AG_NO_CLIENT_DLL if (0 != m_sWinner.size()) { AgString s; s = "Last match won by " + m_sWinner; AgSay(NULL,s.c_str(),NULL,10,0.4,0.1,2); m_sWinner = ""; } AgSay(NULL,"Waiting for players to get ready!\n",&m_fNextSay,2,0.4,0.5); #else MESSAGE_BEGIN( MSG_ALL, gmsgCountdown); WRITE_BYTE( 50 ); WRITE_BYTE( 1 ); WRITE_STRING( m_sWinner.c_str() ); WRITE_STRING( "" ); MESSAGE_END(); #endif } else if (Countdown == m_Status) { if (m_fMatchStart < gpGlobals->time) { //Clear out the map AgResetMap(); int i = 1; for ( i = 1; i <= gpGlobals->maxClients; i++ ) { CBasePlayer* pPlayerLoop = AgPlayerByIndex(i); if (pPlayerLoop && pPlayerLoop->m_bReady) { pPlayerLoop->SetIngame(true); g_pGameRules->m_ScoreCache.UpdateScore(pPlayerLoop); } } m_Status = Spawning; m_sWinner = ""; //Time to start playing. for ( i = 1; i <= gpGlobals->maxClients; i++ ) { CBasePlayer* pPlayerLoop = AgPlayerByIndex(i); if (pPlayerLoop && pPlayerLoop->m_bReady) { if (pPlayerLoop->IsSpectator()) { pPlayerLoop->Spectate_Stop(); } else pPlayerLoop->RespawnMatch(); } } m_Status = Playing; //Stop countdown #ifndef AG_NO_CLIENT_DLL MESSAGE_BEGIN( MSG_ALL, gmsgCountdown); WRITE_BYTE( -1 ); WRITE_BYTE( 0 ); WRITE_STRING( "" ); WRITE_STRING( "" ); MESSAGE_END(); #endif } else { //Write countdown message. #ifdef AG_NO_CLIENT_DLL char szMatchStart[128]; sprintf(szMatchStart,"Match will begin in %d seconds!\n",(int)(m_fMatchStart - gpGlobals->time)); AgSay(NULL,szMatchStart,&m_fNextSay,1,0.3,0.5); #else MESSAGE_BEGIN( MSG_ALL, gmsgCountdown); WRITE_BYTE( (int)(m_fMatchStart - gpGlobals->time) ); WRITE_BYTE( 1 ); WRITE_STRING( "" ); WRITE_STRING( "" ); MESSAGE_END(); #endif } } } } void AgLMS::ClientConnected(CBasePlayer* pPlayer) { ASSERT(NULL != pPlayer); if (!pPlayer) return; ASSERT(NULL != pPlayer->pev); if (!pPlayer->pev) return; //Set status pPlayer->SetIngame(false); } void AgLMS::ClientDisconnected(CBasePlayer* pPlayer) { ASSERT(NULL != pPlayer); if (!pPlayer) return; ASSERT(NULL != pPlayer->pev); if (!pPlayer->pev) return; //Set status pPlayer->SetIngame(false); } //-- Martin Webrant