//========================================================= // Deathnotice. //========================================================= void CTeamplayRules::DeathNotice( CBasePlayer *pVictim, const CTakeDamageInfo &info ) { if ( m_DisableDeathMessages ) return; CBaseEntity *pKiller = info.GetAttacker(); if ( pVictim && pKiller && pKiller->IsPlayer() ) { CBasePlayer *pk = (CBasePlayer*)pKiller; if ( pk ) { if ( (pk != pVictim) && (PlayerRelationship( pVictim, pk ) == GR_TEAMMATE) ) { IGameEvent * event = gameeventmanager->CreateEvent( "player_death" ); if ( event ) { event->SetInt("killer", pk->GetUserID() ); event->SetInt("victim", pVictim->GetUserID() ); event->SetInt("priority", 7 ); // HLTV event priority, not transmitted gameeventmanager->FireEvent( event ); } return; } } } BaseClass::DeathNotice( pVictim, info ); }
//========================================================= // Deathnotice. //========================================================= void CHalfLifeTeamplay::DeathNotice( CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pevInflictor ) { if ( m_DisableDeathMessages ) return; if ( pVictim && pKiller && pKiller->flags & FL_CLIENT ) { CBasePlayer *pk = (CBasePlayer*) CBaseEntity::Instance( pKiller ); if ( pk ) { if ( (pk != pVictim) && (PlayerRelationship( pVictim, pk ) == GR_TEAMMATE) ) { MESSAGE_BEGIN( MSG_ALL, gmsgDeathMsg ); WRITE_BYTE( ENTINDEX(ENT(pKiller)) ); // the killer WRITE_BYTE( ENTINDEX(pVictim->edict()) ); // the victim WRITE_STRING( "teammate" ); // flag this as a teammate kill MESSAGE_END(); return; } } } CHalfLifeMultiplay::DeathNotice( pVictim, pKiller, pevInflictor ); }
//========================================================= // Deathnotice. //========================================================= void CTeamplayRules::DeathNotice( CBasePlayer *pVictim, const CTakeDamageInfo &info ) { if ( m_DisableDeathMessages ) return; CBaseEntity *pKiller = info.GetAttacker(); if ( pVictim && pKiller && pKiller->GetFlags() & FL_CLIENT ) { CBasePlayer *pk = (CBasePlayer*)pKiller; if ( pk ) { if ( (pk != pVictim) && (PlayerRelationship( pVictim, pk ) == GR_TEAMMATE) ) { CRelieableBroadcastRecipientFilter filter; // TODO we are sending this message twice ?? in BaseClass::DeathNotice too. UserMessageBegin( filter, "DeathMsg" ); WRITE_BYTE( pKiller->entindex() ); // the killer WRITE_BYTE( pVictim->entindex() ); // the victim WRITE_STRING( "teammate" ); // flag this as a teammate kill MessageEnd(); return; } } } BaseClass::DeathNotice( pVictim, info ); }
// checks if the spot is clear of players bool CSDKGameRules::IsSpawnPointValid( CBaseEntity *pSpot, CBasePlayer *pPlayer ) { if ( !pSpot->IsTriggered( pPlayer ) ) { return false; } // Check if it is disabled by Enable/Disable CSpawnPoint *pSpawnPoint = dynamic_cast< CSpawnPoint * >( pSpot ); if ( pSpawnPoint ) { if ( pSpawnPoint->IsDisabled() ) { return false; } } for (int i = 0; i < gpGlobals->maxClients; i++) { CBasePlayer *pOtherPlayer = UTIL_PlayerByIndex( i ); if (!pOtherPlayer) continue; if (PlayerRelationship(pPlayer, pOtherPlayer) == GR_TEAMMATE) continue; if ((pSpot->GetAbsOrigin() - pOtherPlayer->GetAbsOrigin()).LengthSqr() > 512*512) continue; CSDKPlayer* pOtherSDKPlayer = ToSDKPlayer(pOtherPlayer); trace_t tr; UTIL_TraceLine( pSpot->WorldSpaceCenter(), pOtherSDKPlayer->WorldSpaceCenter(), MASK_VISIBLE_AND_NPCS, pPlayer, COLLISION_GROUP_NONE, &tr ); if (tr.m_pEnt == pOtherPlayer) return false; } CBaseEntity* pGrenade = gEntList.FindEntityByClassname( NULL, "weapon_grenade" ); while (pGrenade) { if ((pSpot->GetAbsOrigin() - pGrenade->GetAbsOrigin()).LengthSqr() < 500*500) return false; pGrenade = gEntList.FindEntityByClassname( pGrenade, "weapon_grenade" ); } Vector mins = GetViewVectors()->m_vHullMin; Vector maxs = GetViewVectors()->m_vHullMax; Vector vTestMins = pSpot->GetAbsOrigin() + mins; Vector vTestMaxs = pSpot->GetAbsOrigin() + maxs; // First test the starting origin. return UTIL_IsSpaceEmpty( pPlayer, vTestMins, vTestMaxs ); }
//========================================================= //========================================================= bool CTeamplayRules::ShouldAutoAim( CBasePlayer *pPlayer, edict_t *target ) { // always autoaim, unless target is a teammate CBaseEntity *pTgt = CBaseEntity::Instance( target ); if ( pTgt && pTgt->IsPlayer() ) { if ( PlayerRelationship( pPlayer, pTgt ) == GR_TEAMMATE ) return false; // don't autoaim at teammates } return BaseClass::ShouldAutoAim( pPlayer, target ); }
//========================================================= //========================================================= BOOL CHalfLifeTeamplay::ShouldAutoAim( CBasePlayer *pPlayer, edict_t *target ) { // always autoaim, unless target is a teammate CBaseEntity *pTgt = CBaseEntity::Instance( target ); if ( pTgt && pTgt->IsPlayer() ) { if ( PlayerRelationship( pPlayer, pTgt ) == GR_TEAMMATE ) return FALSE; // don't autoaim at teammates } return CHalfLifeMultiplay::ShouldAutoAim( pPlayer, target ); }
//========================================================= //========================================================= int CTeamplayRules::IPointsForKill( CBasePlayer *pAttacker, CBasePlayer *pKilled ) { if ( !pKilled ) return 0; if ( !pAttacker ) return 1; if ( pAttacker != pKilled && PlayerRelationship( pAttacker, pKilled ) == GR_TEAMMATE ) return -1; return 1; }
bool CTeamplayRules::FPlayerCanTakeDamage( CBasePlayer *pPlayer, CBaseEntity *pAttacker ) { if ( pAttacker && PlayerRelationship( pPlayer, pAttacker ) == GR_TEAMMATE ) { // my teammate hit me. if ( (friendlyfire.GetInt() == 0) && (pAttacker != pPlayer) ) { // friendly fire is off, and this hit came from someone other than myself, then don't get hurt return false; } } return BaseClass::FPlayerCanTakeDamage( pPlayer, pAttacker ); }
BOOL CHalfLifeTeamplay::FPlayerCanTakeDamage( CBasePlayer *pPlayer, CBaseEntity *pAttacker ) { if ( pAttacker && PlayerRelationship( pPlayer, pAttacker ) == GR_TEAMMATE ) { // my teammate hit me. if ( (friendlyfire.value == 0) && (pAttacker != pPlayer) ) { // friendly fire is off, and this hit came from someone other than myself, then don't get hurt return FALSE; } } return CHalfLifeMultiplay::FPlayerCanTakeDamage( pPlayer, pAttacker ); }
//========================================================= //========================================================= bool CSingleplayRules::PlayerCanHearChat( CBasePlayer *pListener, CBasePlayer *pSpeaker ) { return ( PlayerRelationship( pListener, pSpeaker ) == GR_TEAMMATE ); }