CTeam* CTeamMgr::GetTeam(const char* sName) { // Sanity checks... if (!sName) return(NULL); if (sName[0] == '\0') return(NULL); // Look for a team with the given name... CTeam* pTeam = GetFirstTeam(); while (pTeam) { if (strncmp(pTeam->GetName(), sName, TM_MAX_NAME) == 0) { return(pTeam); } pTeam = GetNextTeam(pTeam); } // If we get here, we didn't find the team... return(NULL); }
void CHL1MP_Player::SetPlayerTeamModel( void ) { int iTeamNum = GetTeamNumber(); if ( iTeamNum <= TEAM_SPECTATOR ) return; CTeam * pTeam = GetGlobalTeam( iTeamNum ); char szModelName[256]; Q_snprintf( szModelName, 256, "%s%s/%s.mdl", s_szModelPath, pTeam->GetName(), pTeam->GetName() ); // Check to see if the model was properly precached, do not error out if not. int i = modelinfo->GetModelIndex( szModelName ); if ( i == -1 ) { Warning("Model %s does not exist.\n", szModelName ); return; } SetModel( szModelName ); m_flNextModelChangeTime = gpGlobals->curtime + 5; }
//----------------------------------------------------------------------------------------------------- int CFuncNavBlocker::DrawDebugTextOverlays( void ) { int offset = BaseClass::DrawDebugTextOverlays(); if (m_debugOverlays & OVERLAY_TEXT_BIT) { CFmtStr str; // FIRST_GAME_TEAM skips TEAM_SPECTATOR and TEAM_UNASSIGNED, so we can print // useful team names in a non-game-specific fashion. for ( int i=FIRST_GAME_TEAM; i<FIRST_GAME_TEAM + MAX_NAV_TEAMS; ++i ) { if ( IsBlockingNav( i ) ) { CTeam *team = GetGlobalTeam( i ); if ( team ) { EntityText( offset++, str.sprintf( "blocking team %s", team->GetName() ), 0 ); } else { EntityText( offset++, str.sprintf( "blocking team %d", i ), 0 ); } } } NavAreaCollector collector( true ); Extent extent; extent.Init( this ); TheNavMesh->ForAllAreasOverlappingExtent( collector, extent ); for ( int i=0; i<collector.m_area.Count(); ++i ) { CNavArea *area = collector.m_area[i]; Extent areaExtent; area->GetExtent( &areaExtent ); debugoverlay->AddBoxOverlay( vec3_origin, areaExtent.lo, areaExtent.hi, vec3_angle, 0, 255, 0, 10, NDEBUG_PERSIST_TILL_NEXT_SERVER ); } } return offset; }
void CEventLog::FormatPlayer( CBaseEntity *ent, char *str, int len ) const { if ( !str || len <= 0 ) { return; } CBasePlayer *player = ToBasePlayer( ent ); const char *playerName = "Unknown"; int userID = 0; const char *networkIDString = ""; const char *teamName = ""; int areaID = 0; if ( player ) { playerName = player->GetPlayerName(); userID = player->GetUserID(); networkIDString = player->GetNetworkIDString(); CTeam *team = player->GetTeam(); if ( team ) { teamName = team->GetName(); } } #ifdef USE_NAV_MESH if ( ent && ent->MyCombatCharacterPointer() ) { CNavArea *area = ent->MyCombatCharacterPointer()->GetLastKnownArea(); if ( area ) { areaID = area->GetID(); } } #endif // USE_NAV_MESH V_snprintf( str, len, "\"%s<%i><%s><%s><Area %d>\"", playerName, userID, networkIDString, teamName, areaID ); }
//// HOST_SAY // String comes in as // say blah blah blah // or as // blah blah blah // void Host_Say( edict_t *pEdict, const CCommand &args, bool teamonly ) { CBasePlayer *client; int j; char *p; char text[256]; char szTemp[256]; const char *cpSay = "say"; const char *cpSayTeam = "say_team"; const char *pcmd = args[0]; bool bSenderDead = false; // We can get a raw string now, without the "say " prepended if ( args.ArgC() == 0 ) return; if ( !stricmp( pcmd, cpSay) || !stricmp( pcmd, cpSayTeam ) ) { if ( args.ArgC() >= 2 ) { p = (char *)args.ArgS(); } else { // say with a blank message, nothing to do return; } } else // Raw text, need to prepend argv[0] { if ( args.ArgC() >= 2 ) { Q_snprintf( szTemp,sizeof(szTemp), "%s %s", ( char * )pcmd, (char *)args.ArgS() ); } else { // Just a one word command, use the first word...sigh Q_snprintf( szTemp,sizeof(szTemp), "%s", ( char * )pcmd ); } p = szTemp; } CBasePlayer *pPlayer = NULL; if ( pEdict ) { pPlayer = ((CBasePlayer *)CBaseEntity::Instance( pEdict )); Assert( pPlayer ); // make sure the text has valid content p = CheckChatText( pPlayer, p ); } if ( !p ) return; if ( pEdict ) { if ( !pPlayer->CanSpeak() ) return; // See if the player wants to modify of check the text pPlayer->CheckChatText( p, 127 ); // though the buffer szTemp that p points to is 256, // chat text is capped to 127 in CheckChatText above Assert( strlen( pPlayer->GetPlayerName() ) > 0 ); bSenderDead = ( pPlayer->m_lifeState != LIFE_ALIVE ); } else { bSenderDead = false; } const char *pszFormat = NULL; const char *pszPrefix = NULL; const char *pszLocation = NULL; if ( g_pGameRules ) { pszFormat = g_pGameRules->GetChatFormat( teamonly, pPlayer ); pszPrefix = g_pGameRules->GetChatPrefix( teamonly, pPlayer ); pszLocation = g_pGameRules->GetChatLocation( teamonly, pPlayer ); } const char *pszPlayerName = pPlayer ? pPlayer->GetPlayerName():"Console"; if ( pszPrefix && strlen( pszPrefix ) > 0 ) { if ( pszLocation && strlen( pszLocation ) ) { Q_snprintf( text, sizeof(text), "%s %s @ %s: ", pszPrefix, pszPlayerName, pszLocation ); } else { Q_snprintf( text, sizeof(text), "%s %s: ", pszPrefix, pszPlayerName ); } } else { Q_snprintf( text, sizeof(text), "%s: ", pszPlayerName ); } j = sizeof(text) - 2 - strlen(text); // -2 for /n and null terminator if ( (int)strlen(p) > j ) p[j] = 0; Q_strncat( text, p, sizeof( text ), COPY_ALL_CHARACTERS ); Q_strncat( text, "\n", sizeof( text ), COPY_ALL_CHARACTERS ); // loop through all players // Start with the first player. // This may return the world in single player if the client types something between levels or during spawn // so check it, or it will infinite loop client = NULL; for ( int i = 1; i <= gpGlobals->maxClients; i++ ) { client = ToBaseMultiplayerPlayer( UTIL_PlayerByIndex( i ) ); if ( !client || !client->edict() ) continue; if ( client->edict() == pEdict ) continue; if ( !(client->IsNetClient()) ) // Not a client ? (should never be true) continue; if ( teamonly && g_pGameRules->PlayerCanHearChat( client, pPlayer ) != GR_TEAMMATE ) continue; if ( pPlayer && !client->CanHearAndReadChatFrom( pPlayer ) ) continue; if ( pPlayer && GetVoiceGameMgr() && GetVoiceGameMgr()->IsPlayerIgnoringPlayer( pPlayer->entindex(), i ) ) continue; CSingleUserRecipientFilter user( client ); user.MakeReliable(); if ( pszFormat ) { UTIL_SayText2Filter( user, pPlayer, true, pszFormat, pszPlayerName, p, pszLocation ); } else { UTIL_SayTextFilter( user, text, pPlayer, true ); } } if ( pPlayer ) { // print to the sending client CSingleUserRecipientFilter user( pPlayer ); user.MakeReliable(); if ( pszFormat ) { UTIL_SayText2Filter( user, pPlayer, true, pszFormat, pszPlayerName, p, pszLocation ); } else { UTIL_SayTextFilter( user, text, pPlayer, true ); } } // echo to server console // Adrian: Only do this if we're running a dedicated server since we already print to console on the client. if ( engine->IsDedicatedServer() ) Msg( "%s", text ); Assert( p ); int userid = 0; const char *networkID = "Console"; const char *playerName = "Console"; const char *playerTeam = "Console"; if ( pPlayer ) { userid = pPlayer->GetUserID(); networkID = pPlayer->GetNetworkIDString(); playerName = pPlayer->GetPlayerName(); CTeam *team = pPlayer->GetTeam(); if ( team ) { playerTeam = team->GetName(); } } if ( teamonly ) UTIL_LogPrintf( "\"%s<%i><%s><%s>\" say_team \"%s\"\n", playerName, userid, networkID, playerTeam, p ); else UTIL_LogPrintf( "\"%s<%i><%s><%s>\" say \"%s\"\n", playerName, userid, networkID, playerTeam, p ); IGameEvent * event = gameeventmanager->CreateEvent( "player_say" ); if ( event ) // will be null if there are no listeners! { event->SetInt("userid", userid ); event->SetString("text", p ); event->SetInt("priority", 1 ); // HLTV event priority, not transmitted gameeventmanager->FireEvent( event ); } }
bool CEventLog::PrintPlayerEvent( IGameEvent *event ) { const char * eventName = event->GetName(); const int userid = event->GetInt( "userid" ); if ( !Q_strncmp( eventName, "player_connect", Q_strlen("player_connect") ) ) // player connect is before the CBasePlayer pointer is setup { const char *name = event->GetString( "name" ); const char *address = event->GetString( "address" ); const char *networkid = event->GetString("networkid" ); UTIL_LogPrintf( "\"%s<%i><%s><>\" connected, address \"%s\"\n", name, userid, networkid, address); return true; } else if ( !Q_strncmp( eventName, "player_disconnect", Q_strlen("player_disconnect") ) ) { const char *reason = event->GetString("reason" ); const char *name = event->GetString("name" ); const char *networkid = event->GetString("networkid" ); CTeam *team = NULL; CBasePlayer *pPlayer = UTIL_PlayerByUserId( userid ); if ( pPlayer ) { team = pPlayer->GetTeam(); } UTIL_LogPrintf( "\"%s<%i><%s><%s>\" disconnected (reason \"%s\")\n", name, userid, networkid, team ? team->GetName() : "", reason ); return true; } CBasePlayer *pPlayer = UTIL_PlayerByUserId( userid ); if ( !pPlayer) { DevMsg( "CEventLog::PrintPlayerEvent: Failed to find player (userid: %i, event: %s)\n", userid, eventName ); return false; } if ( !Q_strncmp( eventName, "player_team", Q_strlen("player_team") ) ) { const bool bDisconnecting = event->GetBool( "disconnect" ); if ( !bDisconnecting ) { const int newTeam = event->GetInt( "team" ); const int oldTeam = event->GetInt( "oldteam" ); CTeam *team = GetGlobalTeam( newTeam ); CTeam *oldteam = GetGlobalTeam( oldTeam ); UTIL_LogPrintf( "\"%s<%i><%s><%s>\" joined team \"%s\"\n", pPlayer->GetPlayerName(), pPlayer->GetUserID(), pPlayer->GetNetworkIDString(), oldteam->GetName(), team->GetName() ); } return true; } else if ( !Q_strncmp( eventName, "player_death", Q_strlen("player_death") ) ) { const int attackerid = event->GetInt("attacker" ); #ifdef MSS const char *weapon = event->GetString( "weapon" ); #endif CBasePlayer *pAttacker = UTIL_PlayerByUserId( attackerid ); CTeam *team = pPlayer->GetTeam(); CTeam *attackerTeam = NULL; if ( pAttacker ) { attackerTeam = pAttacker->GetTeam(); } if ( pPlayer == pAttacker && pPlayer ) { #ifdef MSS UTIL_LogPrintf( "\"%s<%i><%s><%s>\" committed suicide with \"%s\"\n", pPlayer->GetPlayerName(), userid, pPlayer->GetNetworkIDString(), team ? team->GetName() : "", weapon ); #else UTIL_LogPrintf( "\"%s<%i><%s><%s>\" committed suicide with \"%s\"\n", pPlayer->GetPlayerName(), userid, pPlayer->GetNetworkIDString(), team ? team->GetName() : "", pAttacker->GetClassname() ); #endif } else if ( pAttacker ) { CTeam *attackerTeam = pAttacker->GetTeam(); #ifdef MSS UTIL_LogPrintf( "\"%s<%i><%s><%s>\" killed \"%s<%i><%s><%s>\" with \"%s\"\n", pAttacker->GetPlayerName(), attackerid, pAttacker->GetNetworkIDString(), attackerTeam ? attackerTeam->GetName() : "", pPlayer->GetPlayerName(), userid, pPlayer->GetNetworkIDString(), team ? team->GetName() : "", weapon ); #else UTIL_LogPrintf( "\"%s<%i><%s><%s>\" killed \"%s<%i><%s><%s>\"\n", pAttacker->GetPlayerName(), attackerid, pAttacker->GetNetworkIDString(), attackerTeam ? attackerTeam->GetName() : "", pPlayer->GetPlayerName(), userid, pPlayer->GetNetworkIDString(), team ? team->GetName() : "" ); #endif } else { // killed by the world UTIL_LogPrintf( "\"%s<%i><%s><%s>\" committed suicide with \"world\"\n", pPlayer->GetPlayerName(), userid, pPlayer->GetNetworkIDString(), team ? team->GetName() : "" ); } return true; } else if ( !Q_strncmp( eventName, "player_activate", Q_strlen("player_activate") ) ) { UTIL_LogPrintf( "\"%s<%i><%s><>\" entered the game\n", pPlayer->GetPlayerName(), userid, pPlayer->GetNetworkIDString() ); return true; } else if ( !Q_strncmp( eventName, "player_changename", Q_strlen("player_changename") ) ) { const char *newName = event->GetString( "newname" ); const char *oldName = event->GetString( "oldname" ); CTeam *team = pPlayer->GetTeam(); UTIL_LogPrintf( "\"%s<%i><%s><%s>\" changed name to \"%s\"\n", oldName, userid, pPlayer->GetNetworkIDString(), team ? team->GetName() : "", newName ); return true; } // ignored events //player_hurt return false; }
bool PrintCStrikeEvent( IGameEvent *event ) // print Mod specific logs { const char *eventName = event->GetName(); // messages that don't have a user associated to them if ( !Q_strncmp( eventName, "round_end", Q_strlen("round_end") ) ) { const int winner = event->GetInt( "winner" ); const int reason = event->GetInt( "reason" ); const char *msg = event->GetString( "message" ); msg++; // remove the '#' char switch( reason ) { case Game_Commencing: UTIL_LogPrintf( "World triggered \"Game_Commencing\"\n" ); return true; break; } CTeam *ct = GetGlobalTeam( TEAM_CT ); CTeam *ter = GetGlobalTeam( TEAM_TERRORIST ); Assert( ct && ter ); switch ( winner ) { case WINNER_CT: UTIL_LogPrintf( "Team \"%s\" triggered \"%s\" (CT \"%i\") (T \"%i\")\n", ct->GetName(), msg, ct->GetScore(), ter->GetScore() ); break; case WINNER_TER: UTIL_LogPrintf( "Team \"%s\" triggered \"%s\" (CT \"%i\") (T \"%i\")\n", ter->GetName(), msg, ct->GetScore(), ter->GetScore() ); break; case WINNER_DRAW: default: UTIL_LogPrintf( "World triggered \"%s\" (CT \"%i\") (T \"%i\")\n", msg, ct->GetScore(), ter->GetScore() ); break; } UTIL_LogPrintf( "Team \"CT\" scored \"%i\" with \"%i\" players\n", ct->GetScore(), ct->GetNumPlayers() ); UTIL_LogPrintf( "Team \"TERRORIST\" scored \"%i\" with \"%i\" players\n", ter->GetScore(), ter->GetNumPlayers() ); UTIL_LogPrintf("World triggered \"Round_End\"\n"); return true; } else if ( !Q_strncmp( eventName, "server_", strlen("server_")) ) { return false; // ignore server_ messages } const int userid = event->GetInt( "userid" ); CBasePlayer *pPlayer = UTIL_PlayerByUserId( userid ); if ( !pPlayer ) { return false; } if ( FStrEq( eventName, "player_hurt" ) ) { const int attackerid = event->GetInt("attacker" ); const char *weapon = event->GetString( "weapon" ); CBasePlayer *pAttacker = UTIL_PlayerByUserId( attackerid ); if ( !pAttacker ) { return false; } bool isTeamAttack = ( (pPlayer->GetTeamNumber() == pAttacker->GetTeamNumber() ) && (pPlayer != pAttacker) ); int detail = mp_logdetail.GetInt(); if ( ( isTeamAttack && ( detail & LOG_DETAIL_TEAMMATE_ATTACKS ) ) || ( !isTeamAttack && ( detail & LOG_DETAIL_ENEMY_ATTACKS ) ) ) { int hitgroup = event->GetInt( "hitgroup" ); const char *hitgroupStr = "GENERIC"; switch ( hitgroup ) { case HITGROUP_GENERIC: hitgroupStr = "generic"; break; case HITGROUP_HEAD: hitgroupStr = "head"; break; case HITGROUP_CHEST: hitgroupStr = "chest"; break; case HITGROUP_STOMACH: hitgroupStr = "stomach"; break; case HITGROUP_LEFTARM: hitgroupStr = "left arm"; break; case HITGROUP_RIGHTARM: hitgroupStr = "right arm"; break; case HITGROUP_LEFTLEG: hitgroupStr = "left leg"; break; case HITGROUP_RIGHTLEG: hitgroupStr = "right leg"; break; } UTIL_LogPrintf( "\"%s<%i><%s><%s>\" attacked \"%s<%i><%s><%s>\" with \"%s\" (damage \"%d\") (damage_armor \"%d\") (health \"%d\") (armor \"%d\") (hitgroup \"%s\")\n", pAttacker->GetPlayerName(), attackerid, pAttacker->GetNetworkIDString(), pAttacker->GetTeam()->GetName(), pPlayer->GetPlayerName(), userid, pPlayer->GetNetworkIDString(), pPlayer->GetTeam()->GetName(), weapon, event->GetInt( "dmg_health" ), event->GetInt( "dmg_armor" ), event->GetInt( "health" ), event->GetInt( "armor" ), hitgroupStr ); } return true; } else if ( !Q_strncmp( eventName, "player_death", Q_strlen("player_death") ) ) { const int attackerid = event->GetInt("attacker" ); const char *weapon = event->GetString( "weapon" ); const bool headShot = (event->GetInt( "headshot" ) == 1); CBasePlayer *pAttacker = UTIL_PlayerByUserId( attackerid ); if ( pPlayer == pAttacker ) { UTIL_LogPrintf( "\"%s<%i><%s><%s>\" committed suicide with \"%s\"\n", pPlayer->GetPlayerName(), userid, pPlayer->GetNetworkIDString(), pPlayer->GetTeam()->GetName(), weapon ); } else if ( pAttacker ) { UTIL_LogPrintf( "\"%s<%i><%s><%s>\" killed \"%s<%i><%s><%s>\" with \"%s\"%s\n", pAttacker->GetPlayerName(), attackerid, pAttacker->GetNetworkIDString(), pAttacker->GetTeam()->GetName(), pPlayer->GetPlayerName(), userid, pPlayer->GetNetworkIDString(), pPlayer->GetTeam()->GetName(), weapon, headShot ? " (headshot)":"" ); } else { // killed by the world UTIL_LogPrintf( "\"%s<%i><%s><%s>\" committed suicide with \"world\"\n", pPlayer->GetPlayerName(), userid, pPlayer->GetNetworkIDString(), pPlayer->GetTeam()->GetName() ); } return true; } else if ( !Q_strncmp( eventName, "round_start", Q_strlen("round_start") ) ) { UTIL_LogPrintf("World triggered \"Round_Start\"\n"); return true; } else if ( !Q_strncmp( eventName, "hostage_follows", Q_strlen("hostage_follows") ) ) { UTIL_LogPrintf( "\"%s<%i><%s><CT>\" triggered \"Touched_A_Hostage\"\n", pPlayer->GetPlayerName(), userid, pPlayer->GetNetworkIDString() ); return true; } else if ( !Q_strncmp( eventName, "hostage_killed", Q_strlen("hostage_killed") ) ) { UTIL_LogPrintf( "\"%s<%i><%s><%s>\" triggered \"Killed_A_Hostage\"\n", pPlayer->GetPlayerName(), userid, pPlayer->GetNetworkIDString(), pPlayer->GetTeam()->GetName() ); return true; } else if ( !Q_strncmp( eventName, "hostage_rescued", Q_strlen("hostage_rescued") ) ) { UTIL_LogPrintf("\"%s<%i><%s><CT>\" triggered \"Rescued_A_Hostage\"\n", pPlayer->GetPlayerName(), userid, pPlayer->GetNetworkIDString() ); return true; } else if ( !Q_strncmp( eventName, "bomb_planted", Q_strlen("bomb_planted") ) ) { UTIL_LogPrintf("\"%s<%i><%s><TERRORIST>\" triggered \"Planted_The_Bomb\"\n", pPlayer->GetPlayerName(), userid, pPlayer->GetNetworkIDString() ); return true; } else if ( !Q_strncmp( eventName, "bomb_defused", Q_strlen("bomb_defused") ) ) { UTIL_LogPrintf("\"%s<%i><%s><CT>\" triggered \"Defused_The_Bomb\"\n", pPlayer->GetPlayerName(), userid, pPlayer->GetNetworkIDString() ); return true; } else if ( !Q_strncmp( eventName, "bomb_dropped", Q_strlen("bomb_dropped") ) ) { UTIL_LogPrintf("\"%s<%i><%s><TERRORIST>\" triggered \"Dropped_The_Bomb\"\n", pPlayer->GetPlayerName(), userid, pPlayer->GetNetworkIDString() ); return true; } else if ( !Q_strncmp( eventName, "bomb_begindefuse", Q_strlen("bomb_begindefuse") ) ) { const bool haskit = (event->GetInt( "haskit" ) == 1); UTIL_LogPrintf("\"%s<%i><%s><CT>\" triggered \"%s\"\n", pPlayer->GetPlayerName(), userid, pPlayer->GetNetworkIDString(), haskit ? "Begin_Bomb_Defuse_With_Kit" : "Begin_Bomb_Defuse_Without_Kit" ); return true; } else if ( !Q_strncmp( eventName, "bomb_pickup", Q_strlen("bomb_pickup") ) ) { UTIL_LogPrintf("\"%s<%i><%s><TERRORIST>\" triggered \"Got_The_Bomb\"\n", pPlayer->GetPlayerName(), userid, pPlayer->GetNetworkIDString() ); return true; } // unused events: //hostage_hurt //bomb_exploded return false; }
void CHUDScores::Update() { if (m_nDraw <= 0) return; uint32 textCol = (m_bScreen ? m_nScreenTextColor : m_nTextColor); uint32 playerTextCol = (m_bScreen ? m_nScreenPlayerTextColor : m_nPlayerTextColor); float fScale = g_pInterfaceResMgr->GetXRatio(); if (fScale != m_fScale) { m_fScale = fScale; m_Server.SetScale(fScale); m_SingleFrame.SetScale(fScale); for (int team = 0; team < kNumTeams; team++) { m_Team[team].SetScale(fScale); m_Rounds[team].SetScale(fScale); m_Header[team].SetScale(fScale); m_Frame[team].SetScale(fScale); for (int i = 0; i < kMaxPlayers; i++) { m_Columns[team][i].SetScale(fScale); } } } if (IsTeamGameType()) { CUserProfile *pProfile = g_pProfileMgr->GetCurrentProfile(); for( uint8 team = 0; team < kNumTeams; ++team ) { CTeam* pTeam = CTeamMgr::Instance().GetTeam(team); if (!pTeam) continue; char szTmp[128]; sprintf(szTmp,"%s : %d",pTeam->GetName(),pTeam->GetScore()); m_Team[team].SetString(szTmp); sprintf(szTmp,"%s : %d", LoadTempString(IDS_ROUNDS), pTeam->GetRoundScore( )); m_Rounds[team].SetString(szTmp); m_Header[team].Show(LTTRUE); } } else { m_Team[0].SetString(""); m_Rounds[0].SetString(""); m_Header[1].Show(LTFALSE); } m_Server.SetColors(textCol,textCol,textCol); CClientInfoMgr *pCIMgr = g_pGameClientShell->GetInterfaceMgr( )->GetClientInfoMgr(); if (!pCIMgr) return; CLIENT_INFO* pCI = pCIMgr->GetFirstClient(); int nTotal = 0; int count[kNumTeams] = {0,0}; char szTmp[64] = ""; uint16 nHeight[kNumTeams]; nHeight[0] = m_Server.GetBaseHeight() + m_Header[0].GetBaseHeight() + m_Team[0].GetBaseHeight() + 24; nHeight[1] = m_Team[1].GetBaseHeight() + m_Header[1].GetBaseHeight() + 16; uint32 nLocalID = 0; g_pLTClient->GetLocalClientID (&nLocalID); while (pCI && (nTotal < kMaxPlayers)) { uint8 nTeam = 0; if (IsTeamGameType()) { nTeam = pCI->nTeamID; } int ndx = count[nTeam]; if (nTeam < kNumTeams) { sprintf( szTmp, "%s%s",pCI->sName.c_str( ), pCI->bIsAdmin ? "[*]" : "" ); m_Columns[nTeam][ndx].GetPolyString(0)->SetText( szTmp ); sprintf(szTmp,"%d",pCI->sScore.GetScore()); m_Columns[nTeam][ndx].GetPolyString(1)->SetText(szTmp); sprintf(szTmp,"%d",pCI->sScore.GetFrags()); m_Columns[nTeam][ndx].GetPolyString(2)->SetText(szTmp); sprintf(szTmp,"%d",pCI->sScore.GetTags()); m_Columns[nTeam][ndx].GetPolyString(3)->SetText(szTmp); sprintf(szTmp,"%d",pCI->nPing); m_Columns[nTeam][ndx].GetPolyString(4)->SetText(szTmp); if (nLocalID == pCI->nID) { m_Columns[nTeam][ndx].SetColors(playerTextCol,playerTextCol,playerTextCol); } else { m_Columns[nTeam][ndx].SetColors(textCol,textCol,textCol); } m_Columns[nTeam][ndx].Show(LTTRUE); nHeight[nTeam] += m_Columns[nTeam][ndx].GetBaseHeight(); } pCI = pCI->pNext; ++count[nTeam]; } for (int team = 0; team < kNumTeams; team++) { m_Team[team].SetColors(textCol,textCol,textCol); m_Rounds[team].SetColors(textCol,textCol,textCol); m_Header[team].SetColors(textCol,textCol,textCol); nHeight[team] += 16; m_Frame[team].SetSize(m_nFrameWidth,nHeight[team]); while (count[team] < kMaxPlayers) { m_Columns[team][count[team]].Show(LTFALSE); ++count[team]; } LTIntPt pos = m_BasePos; if (IsTeamGameType() && team > 0) { pos.y += nHeight[team-1] + 8; UpdateTeamPos(team,pos); } } m_SingleFrame.SetSize(m_nFrameWidth,nHeight[0]+8); }
//----------------------------------------------------------------------------- // Can the player be set as the parent? //----------------------------------------------------------------------------- void CTriggerCTFCapture::StartTouch(CBaseEntity *pOther) { if (!pOther->IsPlayer()) //Nothing else should trigger this. return; //Defines CHL2MP_Player *pPlayer = ToHL2MPPlayer(pOther); CtfFlag *pFlag = NULL; bool m_bHomeFlagTaken = false; if (!pPlayer || !pPlayer->IsAlive()) //Still alive? return; if (sv_ctf_capturestyle.GetInt() > 1) { while ((pFlag = static_cast<CtfFlag*>(gEntList.FindEntityByClassname(pFlag, "ctf_flag"))) != NULL) { if (pFlag->iTeam == pPlayer->GetTeamNumber()) //This flag is an enemy flag, we want the player's team's flag. continue; if (pFlag->GetAbsOrigin() != pFlag->FlagOrigin) //This flag belongs to the player's team. Is it at home? m_bHomeFlagTaken = true; } } while ((pFlag = static_cast<CtfFlag*>(gEntList.FindEntityByClassname(pFlag, "ctf_flag"))) != NULL) { if (pFlag->GetParent() && pFlag->GetParent() == pPlayer) //So the flag has a parent.. and it's the player who touched the trigger. { int TeamNumber = pPlayer->GetTeamNumber(); //For team affected by the trigger. switch (m_iAffectedTeam) { case 0: iTeam = TeamNumber; break; case 1: iTeam = TEAM_BRITISH; break; case 2: iTeam = TEAM_AMERICANS; break; } if (TeamNumber != iTeam) //Trigger isn't for this player's team. Die. return; // if (m_bHomeFlagTaken) //The player's team's flag is taken. So we cannot cap an enemy flag. { ClientPrint(pPlayer, CTF_DENY_CAPTURE); //Let the player know. return; //Die here. } //Assuming we've made it thus far, you're probably carrying a flag that belongs to the enemy. Go ahead and cap it. pFlag->PlaySound(GetAbsOrigin(), m_iSound); //Play the capture sound. pFlag->ResetFlag(); g_Teams[TeamNumber]->AddScore(m_iTeamBonus); //Adds the team score bonus. pPlayer->IncrementFragCount(m_iPlayerBonus); //Give the player the points. //reset the capturer's speed //pPlayer->SetSpeedModifier(0); pPlayer->RemoveSpeedModifier(ESpeedModID::Flag); //BG3 - Awesome - removed to more robust speed modifier system pFlag->PrintAlert(CTF_CAPTURE, pPlayer->GetPlayerName(), pFlag->cFlagName); //Do the log stuff. CTeam *team = pPlayer->GetTeam(); UTIL_LogPrintf("\"%s<%i><%s><%s>\" triggered \"ctf_flag_capture\"\n", pPlayer->GetPlayerName(), pPlayer->GetUserID(), pPlayer->GetNetworkIDString(), team ? team->GetName() : ""); // m_OnFlagCaptured.FireOutput(this, this); //Fire the OnFlagCaptured output, set it last just in case. } } }
void CHUDScores::Update() { if( !m_bInitialized ) return; if( !m_bDraw ) return; // uint32 textCol = (m_bScreen ? m_cScreenTextColor : m_cTextColor); // uint32 playerTextCol = (m_bScreen ? m_cScreenPlayerTextColor : m_cPlayerTextColor); //for the screen mode scoreboard, don't update the text once we've drawn it if (m_bScreen && !m_bFirstScreenUpdate) return; m_bFirstScreenUpdate = false; if (GameModeMgr::Instance( ).m_grbUseTeams) { for( uint8 nTeamNum = 0; nTeamNum < kNumTeams; ++nTeamNum ) { uint8 team; if (g_pInterfaceMgr->GetClientInfoMgr()->IsLocalTeam(nTeamNum)) team = 0; else team = 1; CTeam* pTeam = CTeamMgr::Instance().GetTeam(nTeamNum); if (!pTeam) continue; wchar_t wszTmp[128]; LTSNPrintF(wszTmp,LTARRAYSIZE(wszTmp),L"%s : %d",pTeam->GetName(),pTeam->GetScore()); m_Team[team].SetString(wszTmp); LTSNPrintF(wszTmp,LTARRAYSIZE(wszTmp),L"%s : %d", LoadString("IDS_ROUNDS"), pTeam->GetRoundScore( )); m_Rounds[team].SetString(wszTmp); m_Header[team].Show(true); } } else { m_Team[0].SetString(L""); m_Rounds[0].SetString(L""); m_Header[1].Show(false); } m_Server.SetColor(m_cTextColor); if ( !GameModeMgr::Instance( ).m_grwsSessionName.GetValue().empty()) { std::wstring wstr = GameModeMgr::Instance( ).m_grwsSessionName; if ( g_pClientConnectionMgr->IsConnectedToRemoteServer( )) { wstr += L" : "; wstr += MPA2W(g_pClientConnectionMgr->GetStartGameRequest( ).m_TCPAddress).c_str(); } m_Server.SetString(wstr.c_str()); } else { m_Server.SetString(L""); } // Update the round counter. m_RoundInfo.SetColor(m_cTextColor); wchar_t wszRound[32]; uint8 nCurrentRound = g_pClientConnectionMgr ? g_pClientConnectionMgr->GetCurrentRound() : 0; uint8 nNumRounds = GameModeMgr::Instance( ).m_grnNumRounds; FormatString( "HUD_SCORES_ROUNDINFO", wszRound, LTARRAYSIZE( wszRound ), nCurrentRound + 1, nNumRounds ); m_RoundInfo.SetString( wszRound ); CClientInfoMgr *pCIMgr = g_pGameClientShell->GetInterfaceMgr( )->GetClientInfoMgr(); if (!pCIMgr) return; CLIENT_INFO* pCI = pCIMgr->GetFirstClient(); int nTotal = 0; int count[kNumTeams] = {0,0}; wchar_t wszTmp[64] = L""; uint32 nHeight[kNumTeams]; nHeight[0] = m_Server.GetBaseHeight() + m_Header[0].GetBaseHeight() + m_Team[0].GetBaseHeight() + 24; nHeight[1] = m_Team[1].GetBaseHeight() + m_Header[1].GetBaseHeight() + 16; uint32 nLocalID = 0; g_pLTClient->GetLocalClientID (&nLocalID); while (pCI && (nTotal < kMaxPlayers)) { uint8 nTeam = 0; CCharacterFX* pCharacter = g_pGameClientShell->GetSFXMgr()->GetCharacterFromClientID(pCI->nID); if (GameModeMgr::Instance( ).m_grbUseTeams) { if (g_pInterfaceMgr->GetClientInfoMgr()->IsLocalTeam(pCI->nTeamID)) nTeam = 0; else nTeam = 1; } int ndx = count[nTeam]; if (nTeam < kNumTeams) { LTSNPrintF(wszTmp,LTARRAYSIZE(wszTmp),L"%s%s",pCI->sName.c_str( ), pCI->bIsAdmin ? L"[*]" : L"" ); m_Columns[nTeam][ndx].SetString( eColumnName, wszTmp ); LTSNPrintF(wszTmp,LTARRAYSIZE(wszTmp),L"%d",pCI->sScore.GetScore()); m_Columns[nTeam][ndx].SetString( eColumnScore, wszTmp ); LTSNPrintF(wszTmp,LTARRAYSIZE(wszTmp),L"%d",pCI->sScore.GetEventCount(CPlayerScore::eKill)); m_Columns[nTeam][ndx].SetString( eColumnKill, wszTmp ); LTSNPrintF(wszTmp,LTARRAYSIZE(wszTmp),L"%d",pCI->sScore.GetEventCount(CPlayerScore::eDeath)); m_Columns[nTeam][ndx].SetString( eColumnDeath, wszTmp ); LTSNPrintF(wszTmp,LTARRAYSIZE(wszTmp),L"%d",pCI->sScore.GetEventCount(CPlayerScore::eObjective)); m_Columns[nTeam][ndx].SetString( eColumnObjective, wszTmp ); if (GameModeMgr::Instance( ).m_grbUseTeams) { LTSNPrintF(wszTmp,LTARRAYSIZE(wszTmp),L"%d",pCI->sScore.GetEventCount(CPlayerScore::eTeamKill)); m_Columns[nTeam][ndx].SetString( eColumnTK, wszTmp ); m_Columns[nTeam][ndx].ShowColumn(eColumnTK, true); } else { m_Columns[nTeam][ndx].ShowColumn(eColumnTK, false); } LTSNPrintF(wszTmp,LTARRAYSIZE(wszTmp),L"%d",pCI->sScore.GetEventCount(CPlayerScore::eSuicide)); m_Columns[nTeam][ndx].SetString( eColumnSuicide, wszTmp ); LTSNPrintF(wszTmp,LTARRAYSIZE(wszTmp),L"%d",pCI->nPing); m_Columns[nTeam][ndx].SetString( eColumnPing, wszTmp ); if (nLocalID == pCI->nID) { if (!pCharacter || pCharacter->IsPlayerDead() || pCharacter->m_cs.bIsSpectating ) m_Columns[nTeam][ndx].SetColor(m_cPlayerDeadColor); else m_Columns[nTeam][ndx].SetColor(m_cPlayerTextColor); } else { if (!pCharacter || pCharacter->IsPlayerDead() || pCharacter->m_cs.bIsSpectating ) m_Columns[nTeam][ndx].SetColor(m_cDeadColor); else m_Columns[nTeam][ndx].SetColor(m_cTextColor); } m_Columns[nTeam][ndx].Show(true); nHeight[nTeam] += m_Columns[nTeam][ndx].GetBaseHeight(); } pCI = pCI->pNext; ++count[nTeam]; } for (uint8 team = 0; team < kNumTeams; team++) { m_Team[team].SetColor(m_cTextColor); m_Rounds[team].SetColor(m_cTextColor); m_Header[team].SetColor(m_cTextColor); nHeight[team] += 16; m_Frame[team].SetSize(LTVector2n(m_nFrameWidth,nHeight[team])); while (count[team] < kMaxPlayers) { m_Columns[team][count[team]].Show(false); ++count[team]; } LTVector2n pos = m_vBasePos; g_pInterfaceResMgr->ScaleScreenPos(pos); if (GameModeMgr::Instance( ).m_grbUseTeams && team > 0) { pos.y += nHeight[team-1] + 8; } UpdateTeamPos(team,pos); } m_SingleFrame.SetSize(LTVector2n(m_nFrameWidth,nHeight[0]+8)); }