CBaseEntity *CMomentumPlayer::FindNextObserverTarget(bool bReverse) { int startIndex = GetNextObserverSearchStartPoint(bReverse); int currentIndex = startIndex; int iDir = bReverse ? -1 : 1; do { CBaseEntity * nextTarget = UTIL_EntityByIndex(currentIndex); if (IsValidObserverTarget(nextTarget)) { return nextTarget; // found next valid player } currentIndex += iDir; // Loop through the entities if (currentIndex > gEntList.NumberOfEntities()) currentIndex = 1; else if (currentIndex < 1) currentIndex = gEntList.NumberOfEntities(); } while (currentIndex != startIndex); return nullptr; }
CBaseEntity *GetEntityFromMouseCommand( int idx ) { if( idx == -1 || idx >= MAX_EDICTS ) return NULL; if( idx == 0 ) return GetWorldEntity(); return UTIL_EntityByIndex( idx ); }
void FireGameEvent_Internal( IGameEvent *event ) { if ( 0 == Q_strcmp( event->GetName(), "flare_ignite_npc" ) ) { CBaseEntity *pEntityIgnited = UTIL_EntityByIndex( event->GetInt( "entindex" ) ); // was it a zombie that got set on fire? if ( pEntityIgnited && ( ( pEntityIgnited->ClassMatches( "npc_zombie" ) ) || ( pEntityIgnited->ClassMatches( "npc_zombine" ) ) || ( pEntityIgnited->ClassMatches( "npc_fastzombie" ) ) || ( pEntityIgnited->ClassMatches( "npc_poisonzombie" ) ) ) ) { IncrementCount(); } } }
void FireGameEvent_Internal( IGameEvent *event ) { if ( 0 == Q_strcmp( event->GetName(), "physgun_pickup" ) ) { // was the object picked up a frag grenade? CBaseEntity *pEntityPickedUp = UTIL_EntityByIndex( event->GetInt( "entindex" ) ); if ( pEntityPickedUp && pEntityPickedUp->ClassMatches( "npc_grenade_frag" ) ) { // get the grenade object CBaseGrenade *pGrenade = dynamic_cast<CBaseGrenade *>( pEntityPickedUp ); if ( pGrenade ) { // was the original thrower a zombine? CBaseEntity *pOriginalThrower = pGrenade->GetOriginalThrower(); if ( pOriginalThrower && pOriginalThrower->ClassMatches( "npc_zombine" ) ) { IncrementCount(); } } } } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool CHL2WarsPlayer::ClientCommand( const CCommand &args ) { // FIXME: Most commands do not check the number of args. // (Although this doesn't really matter since an arg out of range is just an empty string...). if( GetControlledUnit() && GetControlledUnit()->GetIUnit() ) { if( GetControlledUnit()->GetIUnit()->ClientCommand( args ) ) return true; } if( !V_stricmp( args[0], "player_clearselection" ) ) { ClearSelection(); return true; } else if( !V_stricmp( args[0], "player_addunit" ) ) { for( int i = 1; i < args.ArgC(); i++ ) { #ifdef CLIENTSENDEHANDLE long iEncodedEHandle = atol(args[i]); int iSerialNum = (iEncodedEHandle >> MAX_EDICT_BITS); int iEntryIndex = iEncodedEHandle & ~(iSerialNum << MAX_EDICT_BITS); EHANDLE pEnt( iEntryIndex, iSerialNum ); #else CBaseEntity *pEnt = UTIL_EntityByIndex( atoi(args[i]) ); #endif // CLIENTSENDEHANDLE //DevMsg( "player_addunit: selecting ent #%d\n", atoi(args[i]) ); if( pEnt && pEnt->IsAlive() && pEnt->GetIUnit() ) pEnt->GetIUnit()->Select(this); else DevMsg( "player_addunit: tried to select an invalid unit (#%d)\n", atoi(args[i]) ); } return true; } else if( !V_stricmp( args[0], "player_removeunit" ) )
void CC4::PrimaryAttack() { bool PlaceBomb = false; CCSPlayer *pPlayer = GetPlayerOwner(); if ( !pPlayer ) return; int onGround = FBitSet( pPlayer->GetFlags(), FL_ONGROUND ); CBaseEntity *groundEntity = (onGround) ? pPlayer->GetGroundEntity() : NULL; if ( groundEntity ) { // Don't let us stand on players, breakables, or pushaway physics objects to plant if ( groundEntity->IsPlayer() || IsPushableEntity( groundEntity ) || #ifndef CLIENT_DLL IsBreakableEntity( groundEntity ) || #endif // !CLIENT_DLL IsPushAwayEntity( groundEntity ) ) { onGround = false; } } if( m_bStartedArming == false && m_bBombPlanted == false ) { if( pPlayer->m_bInBombZone && onGround ) { m_bStartedArming = true; m_fArmedTime = gpGlobals->curtime + WEAPON_C4_ARM_TIME; m_bBombPlacedAnimation = false; #if !defined( CLIENT_DLL ) // init the beep flags int i; for( i=0;i<NUM_BEEPS;i++ ) m_bPlayedArmingBeeps[i] = false; // freeze the player in place while planting pPlayer->SetMaxSpeed( 1 ); // player "arming bomb" animation pPlayer->SetAnimation( PLAYER_ATTACK1 ); pPlayer->SetNextAttack( gpGlobals->curtime ); IGameEvent * event = gameeventmanager->CreateEvent( "bomb_beginplant" ); if( event ) { event->SetInt("userid", pPlayer->GetUserID() ); event->SetInt("site", pPlayer->m_iBombSiteIndex ); event->SetInt( "priority", 8 ); gameeventmanager->FireEvent( event ); } #endif SendWeaponAnim( ACT_VM_PRIMARYATTACK ); FX_PlantBomb( pPlayer->entindex(), pPlayer->Weapon_ShootPosition() ); } 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 ); IGameEvent * event = gameeventmanager->CreateEvent( "bomb_abortplant" ); if( event ) { event->SetInt("userid", pPlayer->GetUserID() ); event->SetInt("site", pPlayer->m_iBombSiteIndex ); event->SetInt( "priority", 8 ); gameeventmanager->FireEvent( event ); } #endif if(m_bBombPlacedAnimation == true) //this means the placement animation is canceled { SendWeaponAnim( ACT_VM_DRAW ); } else { SendWeaponAnim( ACT_VM_IDLE ); } return; } else { #ifndef CLIENT_DLL PlayArmingBeeps(); #endif 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( ACT_VM_SECONDARYATTACK ); #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 ) CPlantedC4 *pC4 = CPlantedC4::ShootSatchelCharge( pPlayer, pPlayer->GetAbsOrigin(), pPlayer->GetAbsAngles() ); if ( pC4 ) { pC4->SetBombSiteIndex( pPlayer->m_iBombSiteIndex ); trace_t tr; UTIL_TraceEntity( pC4, GetAbsOrigin(), GetAbsOrigin() + Vector(0,0,-200), MASK_SOLID, this, COLLISION_GROUP_NONE, &tr ); pC4->SetAbsOrigin( tr.endpos ); CBombTarget *pBombTarget = (CBombTarget*)UTIL_EntityByIndex( pPlayer->m_iBombSiteIndex ); if ( pBombTarget ) { CBaseEntity *pAttachPoint = gEntList.FindEntityByName( NULL, pBombTarget->GetBombMountTarget() ); if ( pAttachPoint ) { pC4->SetAbsOrigin( pAttachPoint->GetAbsOrigin() ); pC4->SetAbsAngles( pAttachPoint->GetAbsAngles() ); pC4->SetParent( pAttachPoint ); } variant_t emptyVariant; pBombTarget->AcceptInput( "BombPlanted", pC4, pC4, emptyVariant, 0 ); } } IGameEvent * event = gameeventmanager->CreateEvent( "bomb_planted" ); if( event ) { event->SetInt("userid", pPlayer->GetUserID() ); event->SetInt("site", pPlayer->m_iBombSiteIndex ); event->SetInt("posx", pPlayer->GetAbsOrigin().x ); event->SetInt("posy", pPlayer->GetAbsOrigin().y ); event->SetInt( "priority", 8 ); gameeventmanager->FireEvent( event ); } // Fire a beep event also so the bots have a chance to hear the bomb event = gameeventmanager->CreateEvent( "bomb_beep" ); if ( event ) { event->SetInt( "entindex", entindex() ); gameeventmanager->FireEvent( event ); } pPlayer->SetProgressBarTime( 0 ); CSGameRules()->m_bBombDropped = false; CSGameRules()->m_bBombPlanted = true; // Play the plant sound. Vector plantPosition = pPlayer->GetAbsOrigin() + Vector( 0, 0, 5 ); CPASAttenuationFilter filter( plantPosition ); EmitSound( filter, entindex(), "c4.plant" ); // release the player from being frozen pPlayer->ResetMaxSpeed(); // No more c4! pPlayer->Weapon_Drop( this, NULL, NULL ); UTIL_Remove( this ); #endif //don't allow the planting to start over again next frame. m_bBombPlanted = true; 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(); IGameEvent * event = gameeventmanager->CreateEvent( "bomb_abortplant" ); if( event ) { event->SetInt("userid", pPlayer->GetUserID() ); event->SetInt("site", pPlayer->m_iBombSiteIndex ); event->SetInt( "priority", 8 ); gameeventmanager->FireEvent( event ); } #endif m_flNextPrimaryAttack = gpGlobals->curtime + 1.0; return; } } m_flNextPrimaryAttack = gpGlobals->curtime + 0.3; SetWeaponIdleTime( gpGlobals->curtime + SharedRandomFloat("C4IdleTime", 10, 15 ) ); }
void CTeamTrainWatcher::FireGameEvent( IGameEvent *event ) { if ( IsDisabled() || !m_bHandleTrainMovement ) return; const char *pszEventName = event->GetName(); if ( FStrEq( pszEventName, "path_track_passed" ) ) { int iIndex = event->GetInt( "index" ); CPathTrack *pNode = dynamic_cast< CPathTrack* >( UTIL_EntityByIndex( iIndex ) ); if ( pNode ) { bool bHandleEvent = false; CPathTrack *pTempNode = m_hStartNode.Get(); // is this a node in the track we're watching? while ( pTempNode ) { if ( pTempNode == pNode ) { bHandleEvent = true; break; } pTempNode = pTempNode->GetNext(); } if ( bHandleEvent ) { // If we're receding and we've hit a node but the next node (going backwards) is disabled // the train is going to stop (like at the base of a downhill section) when we start forward // again we won't pass this node again so don't change our hill state based on this node. if ( m_bReceding ) { if ( pNode->GetPrevious() && pNode->GetPrevious()->IsDisabled() ) { return; } } int iHillType = pNode->GetHillType(); bool bUpdate = ( m_iCurrentHillType != iHillType ); if ( !bUpdate ) { // the hill settings are the same, but are we leaving an uphill or downhill segment? if ( m_iCurrentHillType != HILL_TYPE_NONE ) { // let's peek at the next node CPathTrack *pNextNode = pNode->GetNext(); if ( m_flCurrentSpeed < 0 ) { // we're going backwards pNextNode = pNode->GetPrevious(); } if ( pNextNode ) { int iNextHillType = pNextNode->GetHillType(); if ( m_iCurrentHillType != iNextHillType ) { // we're leaving an uphill or downhill segment...so reset our state until we pass the next node bUpdate = true; iHillType = HILL_TYPE_NONE; } } } } if ( bUpdate ) { m_iCurrentHillType = iHillType; HandleTrainMovement(); } } } } }