void CHL2MP_Player::PickDefaultSpawnTeam( void ) { if ( GetTeamNumber() == 0 ) { if ( HL2MPRules()->IsTeamplay() == false ) { if ( GetModelPtr() == NULL ) { const char *szModelName = NULL; szModelName = engine->GetClientConVarValue( engine->IndexOfEdict( edict() ), "cl_playermodel" ); if ( ValidatePlayerModel( szModelName ) == false ) { char szReturnString[512]; //DHL - Skillet - Changed from combine soldier Q_snprintf( szReturnString, sizeof (szReturnString ), "cl_playermodel DHL_DEFAULTMODEL\n" ); engine->ClientCommand ( edict(), szReturnString ); } ChangeTeam( TEAM_UNASSIGNED ); } } else { CTeam *pCombine = g_Teams[TEAM_COMBINE]; CTeam *pRebels = g_Teams[TEAM_REBELS]; if ( pCombine == NULL || pRebels == NULL ) { ChangeTeam( random->RandomInt( TEAM_COMBINE, TEAM_REBELS ) ); } else { if ( pCombine->GetNumPlayers() > pRebels->GetNumPlayers() ) { ChangeTeam( TEAM_REBELS ); } else if ( pCombine->GetNumPlayers() < pRebels->GetNumPlayers() ) { ChangeTeam( TEAM_COMBINE ); } else { ChangeTeam( random->RandomInt( TEAM_COMBINE, TEAM_REBELS ) ); } } } } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTriggerAreaCapture::BreakCapture( bool bNotEnoughPlayers ) { if( m_bCapturing ) { // Remap team to get first game team = 1 switch ( m_nCapturingTeam - FIRST_GAME_TEAM+1 ) { case 1: m_OnBreakTeam1.FireOutput( this, this ); break; case 2: m_OnBreakTeam2.FireOutput( this, this ); break; default: Assert(0); break; } m_BreakOutput.FireOutput(this,this); m_bCapturing = false; m_nCapturingTeam = TEAM_UNASSIGNED; UpdateCappingTeam( TEAM_UNASSIGNED ); if ( bNotEnoughPlayers ) { IncrementCapAttemptNumber(); } SetCapTimeRemaining( 0 ); if( m_hPoint ) { m_hPoint->CaptureEnd(); } m_OnNumCappersChanged.Set( 0, this, this ); // tell all touching players to stop racking up capture points CTeam *pTeam = GetGlobalTeam( m_nCapturingTeam ); if ( pTeam ) { for ( int i=0;i<pTeam->GetNumPlayers();i++ ) { CBaseMultiplayerPlayer *pPlayer = ToBaseMultiplayerPlayer( pTeam->GetPlayer(i) ); if ( pPlayer && IsTouching( pPlayer ) ) { pPlayer->StopScoringEscortPoints(); } } } } }
CTeam* CTeamMgr::GetTeamWithLeastPlayers(LTBOOL bRandomizeTies) { // Look for the team with the most players... int cPlayers = 9999999; CTeam* pLeastTeam = NULL; CTeam* pTeam = GetFirstTeam(); while (pTeam) { if (pTeam->GetNumPlayers() < cPlayers) { pLeastTeam = pTeam; cPlayers = pTeam->GetNumPlayers(); } else if (pTeam->GetNumPlayers() == cPlayers) { if (bRandomizeTies) { if ((rand() % 100) > 50) { pLeastTeam = pTeam; cPlayers = pTeam->GetNumPlayers(); } } } pTeam = GetNextTeam(pTeam); } // All done... return(pLeastTeam); }
//----------------------------------------------------------------------------- // Purpose: Proxy that only sends data to team members // Input : *pStruct - // *pData - // *pOut - // objectID - // Output : Returns true on success, false on failure. //----------------------------------------------------------------------------- void* SendProxy_OnlyToTeam( const SendProp *pProp, const void *pStruct, const void *pVarData, CSendProxyRecipients *pRecipients, int objectID ) { CBaseEntity *pEntity = (CBaseEntity*)pStruct; if ( pEntity ) { CTeam *pTeam = pEntity->GetTeam(); if ( pTeam ) { pRecipients->ClearAllRecipients(); for ( int i=0; i < pTeam->GetNumPlayers(); i++ ) pRecipients->SetRecipient( pTeam->GetPlayer( i )->GetClientIndex() ); return (void*)pVarData; } } return NULL; }
void CSDKPlayer::State_Enter_OBSERVER_MODE() { // Always start a spectator session in roaming mode m_iObserverLastMode = OBS_MODE_ROAMING; if( m_hObserverTarget == NULL ) { // find a new observer target CheckObserverSettings(); } // Change our observer target to the nearest teammate CTeam *pTeam = GetGlobalTeam( GetTeamNumber() ); CBasePlayer *pPlayer; Vector localOrigin = GetAbsOrigin(); Vector targetOrigin; float flMinDist = FLT_MAX; float flDist; for ( int i=0;i<pTeam->GetNumPlayers();i++ ) { pPlayer = pTeam->GetPlayer(i); if ( !pPlayer ) continue; if ( !IsValidObserverTarget(pPlayer) ) continue; targetOrigin = pPlayer->GetAbsOrigin(); flDist = ( targetOrigin - localOrigin ).Length(); if ( flDist < flMinDist ) { m_hObserverTarget.Set( pPlayer ); flMinDist = flDist; } } StartObserverMode( m_iObserverLastMode ); PhysObjectSleep(); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTriggerAreaCapture::BreakCapture( bool bNotEnoughPlayers ) { if( m_bCapturing ) { // Remap team to get first game team = 1 switch ( m_nCapturingTeam - FIRST_GAME_TEAM+1 ) { case 1: m_OnBreakTeam1.FireOutput( this, this ); break; case 2: m_OnBreakTeam2.FireOutput( this, this ); break; default: Assert(0); break; } m_BreakOutput.FireOutput(this,this); m_bCapturing = false; m_nCapturingTeam = TEAM_UNASSIGNED; UpdateCappingTeam( TEAM_UNASSIGNED ); if ( bNotEnoughPlayers ) { IncrementCapAttemptNumber(); } SetCapTimeRemaining( 0 ); if( m_hPoint ) { m_hPoint->CaptureEnd(); // The point reverted to it's previous owner. IGameEvent *event = gameeventmanager->CreateEvent( "teamplay_capture_broken" ); if ( event ) { event->SetInt( "cp", m_hPoint->GetPointIndex() ); event->SetString( "cpname", m_hPoint->GetName() ); event->SetFloat( "time_remaining", m_fTimeRemaining ); gameeventmanager->FireEvent( event ); } } SetNumCappers( 0 ); // tell all touching players to stop racking up capture points CTeam *pTeam = GetGlobalTeam( m_nCapturingTeam ); if ( pTeam ) { for ( int i=0;i<pTeam->GetNumPlayers();i++ ) { CBaseMultiplayerPlayer *pPlayer = ToBaseMultiplayerPlayer( pTeam->GetPlayer(i) ); if ( pPlayer && IsTouching( pPlayer ) ) { pPlayer->StopScoringEscortPoints(); } } } } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTriggerAreaCapture::EndCapture( int team ) { IncrementCapAttemptNumber(); // Remap team to get first game team = 1 switch ( team - FIRST_GAME_TEAM+1 ) { case 1: m_OnCapTeam1.FireOutput( this, this ); break; case 2: m_OnCapTeam2.FireOutput( this, this ); break; default: Assert(0); break; } m_CapOutput.FireOutput(this,this); int numcappers = 0; int cappingplayers[MAX_AREA_CAPPERS]; GetNumCappingPlayers( team, numcappers, cappingplayers ); // Handle this before we assign the new team as the owner of this area HandleRespawnTimeAdjustments( m_nOwningTeam, team ); m_nOwningTeam = team; m_bCapturing = false; m_nCapturingTeam = TEAM_UNASSIGNED; SetCapTimeRemaining( 0 ); //there may have been more than one capper, but only report this one. //he hasn't gotten points yet, and his name will go in the cap string if its needed //first capper gets name sent and points given by flag. //other cappers get points manually above, no name in message //send the player in the cap string if( m_hPoint ) { OnEndCapture( m_nOwningTeam ); UpdateOwningTeam(); m_hPoint->SetOwner( m_nOwningTeam, true, numcappers, cappingplayers ); m_hPoint->CaptureEnd(); } SetNumCappers( 0 ); // tell all touching players to stop racking up capture points CTeam *pTeam = GetGlobalTeam( m_nCapturingTeam ); if ( pTeam ) { for ( int i=0;i<pTeam->GetNumPlayers();i++ ) { CBaseMultiplayerPlayer *pPlayer = ToBaseMultiplayerPlayer( pTeam->GetPlayer(i) ); if ( pPlayer && IsTouching( pPlayer ) ) { pPlayer->StopScoringEscortPoints(); } } } // play any special cap sounds if ( TeamplayRoundBasedRules() ) { TeamplayRoundBasedRules()->PlaySpecialCapSounds( m_nOwningTeam ); } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTriggerAreaCapture::StartCapture( int team, int capmode ) { // Remap team to get first game team = 1 switch ( team - FIRST_GAME_TEAM+1 ) { case 1: m_OnStartTeam1.FireOutput( this, this ); break; case 2: m_OnStartTeam2.FireOutput( this, this ); break; default: Assert(0); break; } m_StartOutput.FireOutput(this,this); m_nCapturingTeam = team; UpdateNumPlayers(); if ( CaptureModeScalesWithPlayers() ) { SetCapTimeRemaining( ((m_flCapTime * 2) * m_TeamData[team].iNumRequiredToCap) ); } else { SetCapTimeRemaining( m_flCapTime ); } m_bCapturing = true; m_bBlocked = false; m_iCapMode = capmode; m_flLastReductionTime = gpGlobals->curtime; UpdateCappingTeam( m_nCapturingTeam ); UpdateBlocked(); if( m_hPoint ) { int numcappers = 0; int cappingplayers[MAX_AREA_CAPPERS]; GetNumCappingPlayers( m_nCapturingTeam, numcappers, cappingplayers ); m_hPoint->CaptureStart( m_nCapturingTeam, numcappers, cappingplayers ); } // tell all touching players to start racking up capture points CTeamControlPointMaster *pMaster = g_hControlPointMasters.Count() ? g_hControlPointMasters[0] : NULL; if ( pMaster ) { float flRate = pMaster->GetPartialCapturePointRate(); if ( flRate > 0.0f ) { // for each player touch CTeam *pTeam = GetGlobalTeam( m_nCapturingTeam ); if ( pTeam ) { for ( int i=0;i<pTeam->GetNumPlayers();i++ ) { CBaseMultiplayerPlayer *pPlayer = ToBaseMultiplayerPlayer( pTeam->GetPlayer(i) ); if ( pPlayer && IsTouching( pPlayer ) ) { pPlayer->StartScoringEscortPoints( flRate ); } } } } } }
void CC4::PrimaryAttack() { bool PlaceBomb = false; CCSPlayer *pPlayer = GetPlayerOwner(); int onGround = FBitSet( pPlayer->GetFlags(), FL_ONGROUND ); if( m_bStartedArming == false ) { if( pPlayer->m_bInBombZone && onGround ) { m_bStartedArming = true; m_fArmedTime = gpGlobals->curtime + WEAPON_C4_ARM_TIME; m_bBombPlacedAnimation = false; //SendWeaponAnim( C4_ARM, UseDecrement() ? 1: 0 ); #if !defined( CLIENT_DLL ) // freeze the player in place while planting pPlayer->SetMaxSpeed( 1 ); // player "arming bomb" animation pPlayer->SetAnimation( PLAYER_ATTACK1 ); pPlayer->SetProgressBarTime( 3 ); #endif } else { if ( !pPlayer->m_bInBombZone ) { ClientPrint( pPlayer, HUD_PRINTCENTER, "#C4_Plant_At_Bomb_Spot"); } else { ClientPrint( pPlayer, HUD_PRINTCENTER, "#C4_Plant_Must_Be_On_Ground"); } m_flNextPrimaryAttack = gpGlobals->curtime + 1.0; return; } } else { if ( !onGround || !pPlayer->m_bInBombZone ) { if( !pPlayer->m_bInBombZone ) { ClientPrint( pPlayer, HUD_PRINTCENTER, "#C4_Arming_Cancelled" ); } else { ClientPrint( pPlayer, HUD_PRINTCENTER, "#C4_Plant_Must_Be_On_Ground" ); } m_flNextPrimaryAttack = gpGlobals->curtime + 1.5; m_bStartedArming = false; #if !defined( CLIENT_DLL ) // release the player from being frozen, we've somehow left the bomb zone pPlayer->ResetMaxSpeed(); pPlayer->SetProgressBarTime( 0 ); //pPlayer->SetAnimation( PLAYER_HOLDBOMB ); #endif /* if(m_bBombPlacedAnimation == true) //this means the placement animation is canceled { SendWeaponAnim( C4_DRAW, UseDecrement() ? 1: 0 ); } else { SendWeaponAnim( C4_IDLE1, UseDecrement() ? 1: 0 ); } */ return; } else { if( gpGlobals->curtime >= m_fArmedTime ) //the c4 is ready to be armed { //check to make sure the player is still in the bomb target area PlaceBomb = true; } else if( ( gpGlobals->curtime >= (m_fArmedTime - 0.75) ) && ( !m_bBombPlacedAnimation ) ) { //call the c4 Placement animation m_bBombPlacedAnimation = true; //SendWeaponAnim( C4_DROP, UseDecrement() ? 1: 0 ); #if !defined( CLIENT_DLL ) // player "place" animation //pPlayer->SetAnimation( PLAYER_HOLDBOMB ); #endif } } } if ( PlaceBomb && m_bStartedArming ) { m_bStartedArming = false; m_fArmedTime = 0; if( pPlayer->m_bInBombZone ) { #if !defined( CLIENT_DLL ) //Broadcast("BOMBPL"); CPlantedC4::ShootSatchelCharge( pPlayer, pPlayer->GetAbsOrigin(), QAngle(0,0,0) ); // send director message, that something important happened here /* MESSAGE_BEGIN( MSG_SPEC, SVC_DIRECTOR ); WRITE_BYTE ( 9 ); // command length in bytes WRITE_BYTE ( DRC_CMD_EVENT ); // bomb placed WRITE_SHORT( ENTINDEX(pPlayer->edict()) ); WRITE_SHORT( 0 ); WRITE_LONG( 11 | DRC_FLAG_FACEPLAYER ); // eventflags (priority and flags) MESSAGE_END(); */ // tell the Ts the bomb has been planted (on radar) CTeam *pTeam = GetGlobalTeam( TEAM_TERRORIST ); for ( int iPlayer=0; iPlayer < pTeam->GetNumPlayers(); iPlayer++ ) { CBasePlayer *pTempPlayer = pTeam->GetPlayer( iPlayer ); if ( pTempPlayer->m_lifeState != LIFE_DEAD ) { /* MESSAGE_BEGIN( MSG_ONE, gmsgBombDrop, NULL, pTempPlayer->pev ); WRITE_COORD( pBomb->pev->origin.x ); WRITE_COORD( pBomb->pev->origin.y ); WRITE_COORD( pBomb->pev->origin.z ); WRITE_BYTE( 1 ); // bomb was planted MESSAGE_END(); */ } } UTIL_ClientPrintAll( HUD_PRINTCENTER,"#Bomb_Planted" ); pPlayer->SetProgressBarTime( 0 ); // tell bots the bomb has been planted //g_pBotControl->OnEvent( EVENT_BOMB_PLANTED, pPlayer ); CSGameRules()->m_bBombDropped = false; // Play the plant sound. CPASAttenuationFilter filter( this ); EmitSound( filter, entindex(), "c4.plant" ); // release the player from being frozen pPlayer->ResetMaxSpeed(); // Remove the C4 icon from the HUD //pPlayer->SetBombIcon(); // No more c4! pPlayer->Weapon_Drop( this, NULL, NULL ); UTIL_Remove( this ); #endif return; } else { ClientPrint( pPlayer, HUD_PRINTCENTER, "#C4_Activated_At_Bomb_Spot" ); #if !defined( CLIENT_DLL ) //pPlayer->SetAnimation( PLAYER_HOLDBOMB ); // release the player from being frozen pPlayer->ResetMaxSpeed(); #endif m_flNextPrimaryAttack = gpGlobals->curtime + 1.0; return; } } m_flNextPrimaryAttack = gpGlobals->curtime + 0.3; m_flTimeWeaponIdle = gpGlobals->curtime + random->RandomFloat ( 10, 15 ); }
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; }
// --------------------------------------------------------------------------- // // // ROUTINE: TeamBalancer::BalanceTeamSize // // PURPOSE: balance team sizes by moving the lowest score player(s) from the larger team // // --------------------------------------------------------------------------- // bool TeamBalancer::BalanceTeamSize() { bool bMovedPlayer = false; uint32 nTeamSizes[2] = {0,0}; for (uint8 nTeam = 0;nTeam < 2;++nTeam) { CTeam* pTeam = CTeamMgr::Instance( ).GetTeam(nTeam); if (pTeam) { nTeamSizes[nTeam] = pTeam->GetNumPlayers(); } } //check to see if one team is larger by at least 2 people if (LTDIFF(nTeamSizes[0],nTeamSizes[1]) > 1) { uint8 nLargerTeam = ((nTeamSizes[0] < nTeamSizes[1]) ? 1 : 0); uint8 nSmallerTeam = (nLargerTeam + 1) % MAX_TEAMS; //make a list of players on the team PlayerScoreHistoryArray vecScores; ServerConnectionMgr::GameClientDataList& gameClientDataList = ServerConnectionMgr::Instance( ).GetGameClientDataList( ); ServerConnectionMgr::GameClientDataList::iterator iter = gameClientDataList.begin( ); for( ; iter != gameClientDataList.end( ); iter++ ) { GameClientData* pGameClientData = *iter; if( !pGameClientData->GetClient( )) continue; //if player is on the larger team, add him to our list if (nLargerTeam == pGameClientData->GetLastTeamId()) { PlayerScoreHistory pairScore; pairScore.first = g_pLTServer->GetClientID(pGameClientData->GetClient( )); pairScore.second = 0; CPlayerScore* pScore = pGameClientData->GetPlayerScore(); if (pScore) { pairScore.second = pScore->GetScore(); } vecScores.push_back(pairScore); } } //sort the player list from highest to lowest std::sort(vecScores.begin(),vecScores.end(),PlayerScoreHistoryCompare()); //while the teams are still unbalanced move lowest scoring players from the larger team to the smaller PlayerScoreHistoryArray::reverse_iterator scoreIter = vecScores.rbegin(); while (LTDIFF(nTeamSizes[nLargerTeam],nTeamSizes[nSmallerTeam]) > 1 && scoreIter != vecScores.rend()) { uint32 nID = scoreIter->first; GameClientData* pGameClientData = ServerConnectionMgr::Instance().GetGameClientDataByClientId(nID); if (pGameClientData) { pGameClientData->SetRequestedTeam(nSmallerTeam); CPlayerObj* pPlayer = (CPlayerObj*)g_pLTServer->HandleToObject(pGameClientData->GetPlayer()); if (pPlayer) { pPlayer->HandleTeamSwitchRequest(); } //shrink the larger team and grow the smaller nTeamSizes[nLargerTeam]--; nTeamSizes[nSmallerTeam]++; bMovedPlayer = true; } scoreIter++; } } if (bMovedPlayer) { CAutoMessage cClientMsg; cClientMsg.Writeuint8(MID_PLAYER_EVENT); cClientMsg.Writeuint8(kPEAutobalance); cClientMsg.Writebool( false ); //didn't do score balancing g_pLTServer->SendToClient(cClientMsg.Read(), NULL, MESSAGE_GUARANTEED); } return bMovedPlayer; }