//------------------------------------------------------------------------------ //------------------------------------------------------------------------------ void CNPC_Monk::PainSound( const CTakeDamageInfo &info ) { if (IsOnFire()) return; SpeakIfAllowed( TLK_WOUND ); }
//----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void CNPC_Monk::OnKilledNPC( CBaseCombatCharacter *pKilled ) { if ( !pKilled ) { return; } if ( pKilled->Classify() == CLASS_ZOMBIE ) { // Don't speak if the gun is empty, cause grigori will want to speak while he's reloading. if ( GetActiveWeapon() ) { if ( GetActiveWeapon()->UsesPrimaryAmmo() && !GetActiveWeapon()->HasPrimaryAmmo() ) { // Gun is empty. I'm about to reload. if( m_iNumZombies >= 2 ) { // Don't talk about killing a single zombie if there are more coming. // the reload behavior will say "come to me, children", etc. return; } } } if( m_iNumZombies == 1 || random->RandomInt( 1, 3 ) == 1 ) { SpeakIfAllowed( TLK_ENEMY_DEAD ); } } }
void CNPC_Monk::StartTask( const Task_t *pTask ) { switch( pTask->iTask ) { case TASK_RELOAD: { if ( GetActiveWeapon() && GetActiveWeapon()->HasPrimaryAmmo() ) { // Don't reload if you have done so while moving (See BACK_AWAY_AND_RELOAD schedule). TaskComplete(); return; } if( m_iNumZombies >= 2 && random->RandomInt( 1, 3 ) == 1 ) { SpeakIfAllowed( TLK_ATTACKING ); } Activity reloadGesture = TranslateActivity( ACT_GESTURE_RELOAD ); if ( reloadGesture != ACT_INVALID && IsPlayingGesture( reloadGesture ) ) { ResetIdealActivity( ACT_IDLE ); return; } BaseClass::StartTask( pTask ); } break; default: BaseClass::StartTask( pTask ); break; } }
//----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void CNPC_Barney::UseFunc( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { m_bDontUseSemaphore = true; SpeakIfAllowed( TLK_USE ); m_bDontUseSemaphore = false; m_OnPlayerUse.FireOutput( pActivator, pCaller ); }
//----------------------------------------------------------------------------- // Purpose: Find a nearby friend to stare at //----------------------------------------------------------------------------- int CNPCSimpleTalker::FIdleStare( void ) { // Don't idly speak if our speech filter is preventing us if ( GetSpeechFilter() && GetSpeechFilter()->GetIdleModifier() == 0 ) return true; SpeakIfAllowed( TLK_STARE ); SetSpeechTarget( FindNearestFriend( true ) ); return true; }
int CNPC_Monk::SelectSchedule() { if( HasCondition( COND_HEAR_DANGER ) ) { SpeakIfAllowed( TLK_DANGER ); return SCHED_TAKE_COVER_FROM_BEST_SOUND; } if ( HasCondition( COND_TALKER_PLAYER_DEAD ) && !m_bMournedPlayer && IsOkToSpeak() ) { m_bMournedPlayer = true; Speak( TLK_IDLE ); } if( !BehaviorSelectSchedule() ) { if ( HasCondition ( COND_NO_PRIMARY_AMMO ) ) { return SCHED_HIDE_AND_RELOAD; } } return BaseClass::SelectSchedule(); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool CBaseMultiplayerPlayer::SpeakConceptIfAllowed( int iConcept, const char *modifiers, char *pszOutResponseChosen, size_t bufsize, IRecipientFilter *filter ) { // Save the current concept. m_iCurrentConcept = iConcept; return SpeakIfAllowed( g_pszMPConcepts[iConcept], SPEECH_PRIORITY_NORMAL, modifiers, pszOutResponseChosen, bufsize, filter ); }
//----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void CNPC_Monk::GatherConditions() { BaseClass::GatherConditions(); // Build my zombie danger index! m_iNumZombies = 0; m_iDangerousZombies = 0; AISightIter_t iter; CBaseEntity *pSightEnt; pSightEnt = GetSenses()->GetFirstSeenEntity( &iter ); while( pSightEnt ) { if( pSightEnt->Classify() == CLASS_ZOMBIE && pSightEnt->IsAlive() ) { // Is this zombie coming for me? CAI_BaseNPC *pZombie = dynamic_cast<CAI_BaseNPC*>(pSightEnt); if( pZombie && pZombie->GetEnemy() == this ) { m_iNumZombies++; // if this zombie is close enough to attack, add him to the zombie danger! float flDist; flDist = (pZombie->GetAbsOrigin() - GetAbsOrigin()).Length2DSqr(); if( flDist <= 128.0f * 128.0f ) { m_iDangerousZombies++; } } } pSightEnt = GetSenses()->GetNextSeenEntity( &iter ); } if( m_iDangerousZombies >= 3 || (GetEnemy() && GetHealth() < 25) ) { // I see many zombies, or I'm quite injured. SpeakIfAllowed( TLK_HELP_ME ); } // NOTE!!!!!! This code assumes grigori is using annabelle! ClearCondition(COND_LOW_PRIMARY_AMMO); if ( GetActiveWeapon() ) { if ( GetActiveWeapon()->UsesPrimaryAmmo() ) { if (!GetActiveWeapon()->HasPrimaryAmmo() ) { SetCondition(COND_NO_PRIMARY_AMMO); } else if ( m_NPCState != NPC_STATE_COMBAT && GetActiveWeapon()->UsesClipsForAmmo1() && GetActiveWeapon()->Clip1() < 2 ) { // Don't send a low ammo message unless we're not in combat. SetCondition(COND_LOW_PRIMARY_AMMO); } } } }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------ void CNPC_Monk::PainSound( const CTakeDamageInfo &info ) { SpeakIfAllowed( TLK_WOUND ); }
//----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void CAI_PlayerAlly::OnKilledNPC( CBaseCombatCharacter *pKilled ) { SpeakIfAllowed( TLK_ENEMY_DEAD ); }