void CLeech::Spawn( void ) { Precache(); SET_MODEL(ENT(pev), "models/leech.mdl"); // Just for fun // SET_MODEL(ENT(pev), "models/icky.mdl"); // UTIL_SetSize( pev, g_vecZero, g_vecZero ); UTIL_SetSize( pev, Vector(-1,-1,0), Vector(1,1,2)); // Don't push the minz down too much or the water check will fail because this entity is really point-sized pev->solid = SOLID_SLIDEBOX; pev->movetype = MOVETYPE_FLY; SetBits(pev->flags, FL_SWIM); pev->health = gSkillData.leechHealth; m_flFieldOfView = -0.5; // 180 degree FOV m_flDistLook = 750; MonsterInit(); SetThink( &CLeech::SwimThink ); SetUse( NULL ); SetTouch( NULL ); pev->view_ofs = g_vecZero; m_flTurning = 0; m_fPathBlocked = FALSE; SetActivity( ACT_SWIM ); SetState( MONSTERSTATE_IDLE ); m_stateTime = gpGlobals->time + RANDOM_FLOAT( 1, 5 ); }
void CShambler :: MonsterPain( CBaseEntity *pAttacker, float flDamage ) { if( pev->owner ) { // remove lightning (if present) CBaseEntity *pLightning = CBaseEntity::Instance( pev->owner ); if( pLightning ) UTIL_Remove( pLightning ); pev->owner = NULL; } EMIT_SOUND( edict(), CHAN_VOICE, "shambler/shurt2.wav", 1.0, ATTN_NORM ); if( pev->health <= 0 ) return; // allready dying, don't go into pain frame if (RANDOM_FLOAT( 0.0f, 1.0f ) * 400 > flDamage ) return; // didn't flinch if (pev->pain_finished > gpGlobals->time) return; pev->pain_finished = gpGlobals->time + 2; m_iAIState = STATE_PAIN; SetActivity( ACT_BIG_FLINCH ); }
//--------------------------------------------------------- //--------------------------------------------------------- void CZombie::SetZombieModel( void ) { Hull_t lastHull = GetHullType(); if ( m_fIsTorso ) { SetModel( "models/zombie/classic_torso.mdl" ); SetHullType( HULL_TINY ); } else { SetModel( "models/zombie/classic.mdl" ); SetHullType( HULL_HUMAN ); } SetBodygroup( ZOMBIE_BODYGROUP_HEADCRAB, !m_fIsHeadless ); SetHullSizeNormal( true ); SetDefaultEyeOffset(); SetActivity( ACT_IDLE ); // hull changed size, notify vphysics // UNDONE: Solve this generally, systematically so other // NPCs can change size if ( lastHull != GetHullType() ) { if ( VPhysicsGetObject() ) { SetupVPhysicsHull(); } } }
void CHellKnight :: MonsterMeleeAttack( void ) { m_iAIState = STATE_ATTACK; EMIT_SOUND( edict(), CHAN_WEAPON, "hknight/slash1.wav", 1.0, ATTN_NORM ); SetActivity( ACT_MELEE_ATTACK1 ); m_flMonsterSpeed = 0; }
//========================================================= // Spawn //========================================================= void CRoach :: Spawn() { Precache( ); SET_MODEL(ENT(pev), "models/roach.mdl"); UTIL_SetSize( pev, Vector( -1, -1, 0 ), Vector( 1, 1, 2 ) ); pev->solid = SOLID_SLIDEBOX; pev->movetype = MOVETYPE_STEP; m_bloodColor = BLOOD_COLOR_YELLOW; pev->effects = 0; pev->health = 1; m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result ) m_MonsterState = MONSTERSTATE_NONE; this->pev->classname = ALLOC_STRING(kRoachClassName); MonsterInit(); SetActivity ( ACT_IDLE ); pev->view_ofs = Vector ( 0, 0, 1 );// position of the eyes relative to monster's origin. pev->takedamage = DAMAGE_YES; m_fLightHacked = FALSE; m_flLastLightLevel = -1; m_iMode = ROACH_IDLE; m_flNextSmellTime = gpGlobals->time; }
void QUA_helicopter::SetActivity(Activity NewActivity) { int sequence; if (m_Activity == NewActivity) { return; } else { sequence = SelectHeaviestSequence( NewActivity ); //int sequence = this->LookupSequence("Idle01"); if ( sequence != ACTIVITY_NOT_AVAILABLE ) { m_Activity=NewActivity; SetSequence( sequence ); SetActivity(NewActivity); SetCycle( 0 ); ResetSequenceInfo( ); if(NewActivity==ACT_MELEE_ATTACK1) { SetPlaybackRate(2.0f); } else { SetPlaybackRate(1.0f); } //m_Activity=NewActivity; } else { return; } } }
//========================================================= // Killed. //========================================================= void CBarnacle :: Killed( entvars_t *pevAttacker, int iGib ) { CBaseMonster *pVictim; pev->solid = SOLID_NOT; pev->takedamage = DAMAGE_NO; if ( m_hEnemy != NULL ) { pVictim = m_hEnemy->MyMonsterPointer(); if ( pVictim ) { pVictim->BarnacleVictimReleased(); } } // CGib::SpawnRandomGibs( pev, 4, 1 ); switch ( RANDOM_LONG ( 0, 1 ) ) { case 0: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_die1.wav", 1, ATTN_NORM ); break; case 1: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_die3.wav", 1, ATTN_NORM ); break; } SetActivity ( ACT_DIESIMPLE ); SetBoneController( 0, 0 ); StudioFrameAdvance( 0.1 ); SetNextThink( 0.1 ); SetThink(&CBarnacle :: WaitTillDead ); }
void CLeech::DeadThink( void ) { if ( m_fSequenceFinished ) { if ( m_Activity == ACT_DIEFORWARD ) { SetThink( NULL ); StopAnimation(); return; } else if ( pev->flags & FL_ONGROUND ) { pev->solid = SOLID_NOT; SetActivity(ACT_DIEFORWARD); } } StudioFrameAdvance(); pev->nextthink = gpGlobals->time + 0.1; // Apply damage velocity, but keep out of the walls if ( pev->velocity.x != 0 || pev->velocity.y != 0 ) { TraceResult tr; // Look 0.5 seconds ahead UTIL_TraceLine(pev->origin, pev->origin + pev->velocity * 0.5, missile, edict(), &tr); if (tr.flFraction != 1.0) { pev->velocity.x = 0; pev->velocity.y = 0; } } }
void CZombie::SetZombieModel( void ) { Hull_t lastHull = GetHullType(); if(m_iZombieType == ZOMBIE_BISOU) SetModel( "models/zombie/Bisounours.mdl" ); else SetModel( "models/zombie/classic.mdl" ); SetHullType( HULL_HUMAN ); //Commenté en attendant de trouver à quoi ça sert //SetBodygroup( ZOMBIE_BODYGROUP_HEADCRAB, !m_fIsHeadless ); SetHullSizeNormal( true ); SetDefaultEyeOffset(); SetActivity( ACT_IDLE ); // hull changed size, notify vphysics // UNDONE: Solve this generally, systematically so other // NPCs can change size if ( lastHull != GetHullType() ) if ( VPhysicsGetObject() ) SetupVPhysicsHull(); }
AIMoveResult_t CAI_Motor::MoveJumpStop() { SetSmoothedVelocity( Vector(0,0,0) ); if (GetOuter()->GetActivity() == ACT_GLIDE) { float flTime = GetOuter()->GetGroundChangeTime(); GetOuter()->AddStepDiscontinuity( flTime, GetAbsOrigin(), GetAbsAngles() ); if ( SelectWeightedSequence( ACT_LAND ) == ACT_INVALID ) return AIMR_CHANGE_TYPE; SetActivity( ACT_LAND ); // FIXME: find out why the client doesn't interpolate immediatly after sequence change // GetOuter()->SetCycle( flTime - gpGlobals->curtime ); } if (GetOuter()->GetActivity() != ACT_LAND || GetOuter()->IsActivityFinished()) { return AIMR_CHANGE_TYPE; } SetMoveInterval( 0 ); SetGravity( 1.0f ); return AIMR_OK; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CObjectTeleporter::FinishedBuilding( void ) { BaseClass::FinishedBuilding(); SetActivity( ACT_OBJ_RUNNING ); SetPlaybackRate( 0.0f ); }
void CHostage::RePosition(void) { pev->health = pev->max_health; pev->movetype = MOVETYPE_STEP; pev->solid = SOLID_SLIDEBOX; pev->takedamage = DAMAGE_YES; pev->deadflag = DEAD_NO; pev->velocity = Vector(0, 0, 0); pev->angles = m_vStartAngles; pev->effects &= ~EF_NODRAW; m_hTargetEnt = NULL; m_hStoppedTargetEnt = NULL; m_bTouched = FALSE; m_bRescueMe = FALSE; m_vOldPos = Vector(9999, 9999, 9999); m_flNextRadarTime = 0; UTIL_SetOrigin(pev, m_vStart); UTIL_SetSize(pev, VEC_HOSTAGE_HULL_MIN, VEC_HOSTAGE_HULL_MAX); DROP_TO_FLOOR(ENT(pev)); SetActivity(ACT_IDLE); SetThink(&CHostage::IdleThink); pev->nextthink = gpGlobals->time + RANDOM_FLOAT(0.1, 0.2); m_fHasPath = FALSE; nTargetNode = -1; m_flLastPathCheck = -1; m_flPathAcquired = -1; m_flPathCheckInterval = 0.1; m_flNextFullThink = gpGlobals->time + RANDOM_FLOAT(0.1, 0.2); }
void CASW_Weapon_Minigun::UpdateSpinningBarrel() { if (GetSequenceActivity(GetSequence()) != ACT_VM_PRIMARYATTACK) { SetActivity(ACT_VM_PRIMARYATTACK, 0); } m_flPlaybackRate = GetSpinRate(); if ( GetSpinRate() > 0.0f ) { if( !m_pBarrelSpinSound ) { CPASAttenuationFilter filter( this ); m_pBarrelSpinSound = CSoundEnvelopeController::GetController().SoundCreate( filter, entindex(), "ASW_Minigun.Spin" ); CSoundEnvelopeController::GetController().Play( m_pBarrelSpinSound, 0.0, 100 ); } CSoundEnvelopeController::GetController().SoundChangeVolume( m_pBarrelSpinSound, MIN( 1.0f, m_flPlaybackRate * 3.0f ), 0.0f ); CSoundEnvelopeController::GetController().SoundChangePitch( m_pBarrelSpinSound, asw_minigun_pitch_min.GetFloat() + ( GetSpinRate() * ( asw_minigun_pitch_max.GetFloat() - asw_minigun_pitch_min.GetFloat() ) ), 0.0f ); } else { if ( m_pBarrelSpinSound ) { CSoundEnvelopeController::GetController().SoundDestroy( m_pBarrelSpinSound ); m_pBarrelSpinSound = NULL; } } }
//========================================================= // Start - player enters the pvs, so get things going. //========================================================= void CFlockingFlyer :: Start( void ) { pev->nextthink = gpGlobals->time + 0.1; if ( IsLeader() ) { SetThink( &CFlockingFlyer::FlockLeaderThink ); } else { SetThink( &CFlockingFlyer::FlockFollowerThink ); } /* Vector vecTakeOff; vecTakeOff = Vector ( 0 , 0 , 0 ); vecTakeOff.z = 50 + RANDOM_FLOAT ( 0, 100 ); vecTakeOff.x = 20 - RANDOM_FLOAT ( 0, 40); vecTakeOff.y = 20 - RANDOM_FLOAT ( 0, 40); pev->velocity = vecTakeOff; pev->speed = pev->velocity.Length(); pev->sequence = 0; */ SetActivity ( ACT_FLY ); ResetSequenceInfo( ); BoidAdvanceFrame( ); pev->speed = AFLOCK_FLY_SPEED;// no delay! }
//========================================================= // Spawn //========================================================= void CBarnacle :: Spawn() { Precache( ); if (pev->model) SET_MODEL(ENT(pev), STRING(pev->model)); //LRC else SET_MODEL(ENT(pev), "models/barnacle.mdl"); UTIL_SetSize( pev, Vector(-16, -16, -32), Vector(16, 16, 0) ); pev->solid = SOLID_SLIDEBOX; pev->movetype = MOVETYPE_NONE; pev->takedamage = DAMAGE_AIM; m_bloodColor = BLOOD_COLOR_RED; pev->effects = EF_INVLIGHT; // take light from the ceiling pev->health = 25; m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result ) m_MonsterState = MONSTERSTATE_NONE; m_flKillVictimTime = 0; m_cGibs = 0; m_fLiftingPrey = FALSE; m_flTongueAdj = -100; InitBoneControllers(); SetActivity ( ACT_IDLE ); SetThink(&CBarnacle :: BarnacleThink ); SetNextThink( 0.5 ); UTIL_SetOrigin ( this, pev->origin ); }
void CShalrath :: MonsterMissileAttack( void ) { // don't launch more than 5 missiles at one time if( pev->impulse > 5 ) return; m_iAIState = STATE_ATTACK; SetActivity( ACT_MELEE_ATTACK1 ); }
void CXenTree :: Attack( void ) { if ( GetActivity() == ACT_IDLE ) { SetActivity( ACT_MELEE_ATTACK1 ); pev->framerate = RANDOM_FLOAT( 1.0, 1.4 ); EMIT_SOUND_ARRAY_DYN( CHAN_WEAPON, pAttackMissSounds ); } }
//------------------------------------------------------------------------------ // Purpose: // Input : // Output : //------------------------------------------------------------------------------ void CAI_ASW_MeleeBehavior::HullAttack( float flDistance, float flDamage, float flForce, CUtlSymbol &AttackHitSound, CUtlSymbol &AttackMissSound ) { Vector vecForceDir; CBaseEntity *pHurt = GetOuter()->CheckTraceHullAttack( flDistance, -Vector( 16.0f, 16.0f, 32.0f ), Vector( 16.0f, 16.0f, 32.0f ), flDamage, DMG_SLASH, flForce ); if ( pHurt ) { SetBehaviorParam( m_StatusParm, 1 ); // Play a random attack hit sound if ( AttackHitSound != UTL_INVAL_SYMBOL ) { GetOuter()->EmitSound( GetSymbolText( AttackHitSound ) ); } // change our sequence to one with the hit in it if ( !m_bSecondaryMelee && ( GetActivity() == ACT_MELEE_ATTACK1 ) ) { if ( GetOuter()->HaveSequenceForActivity( (Activity) ACT_MELEE_ATTACK1_HIT ) ) { SetActivity( (Activity) ACT_MELEE_ATTACK1_HIT ); } } else if ( m_bSecondaryMelee && ( GetActivity() == ACT_MELEE_ATTACK2 ) ) { if ( GetOuter()->HaveSequenceForActivity( (Activity) ACT_MELEE_ATTACK2_HIT ) ) { SetActivity( (Activity) ACT_MELEE_ATTACK2_HIT ); } } if ( m_bKnockdown && pHurt->Classify() == CLASS_ASW_MARINE ) { CASW_Marine *pMarine = static_cast<CASW_Marine*>( pHurt ); Vector vecImpulse = ( GetOuter()->BodyDirection2D() * m_flKnockdownSpeed ) + Vector( 0, 0, m_flKnockdownLift ); pMarine->Knockdown( GetOuter(), vecImpulse ); } } else { // Play a miss sound. GetOuter()->EmitSound( GetSymbolText( AttackMissSound ) ); SetBehaviorParam( m_StatusParm, 0 ); } }
void CAI_Motor::MoveJumpStart( const Vector &velocity ) { SetSmoothedVelocity( velocity ); SetGravity( 1.0 ); RemoveEntFlag( FL_ONGROUND ); SetActivity( ACT_JUMP ); SetIdealYawAndUpdate( velocity ); }
void CASW_Parasite::IdleInEgg(bool b) { if (b) { SetActivity((Activity) ACT_ASW_EGG_IDLE); SetIdealActivity((Activity) ACT_ASW_EGG_IDLE); SetContextThink( &CASW_Parasite::RunAnimation, gpGlobals->curtime + 0.1f, s_pParasiteAnimThink ); } m_bDoEggIdle = b; }
void CShalrath :: MonsterPain( CBaseEntity *pAttacker, float flDamage ) { if( pev->pain_finished > gpGlobals->time ) return; EMIT_SOUND( edict(), CHAN_VOICE, "shalrath/pain.wav", 1.0, ATTN_NORM ); m_iAIState = STATE_PAIN; SetActivity( ACT_BIG_FLINCH ); pev->pain_finished = gpGlobals->time + 3; }
void CXenPLight :: Touch( CBaseEntity *pOther ) { if ( pOther->IsPlayer() ) { pev->dmgtime = gpGlobals->time + XEN_PLANT_HIDE_TIME; if ( GetActivity() == ACT_IDLE || GetActivity() == ACT_STAND ) { SetActivity( ACT_CROUCH ); } } }
void COgre :: MonsterPain( CBaseEntity *pAttacker, float flDamage ) { if( pev->pain_finished > gpGlobals->time ) return; m_iAIState = STATE_PAIN; SetActivity( ACT_BIG_FLINCH ); EMIT_SOUND( edict(), CHAN_VOICE, "ogre/ogpain1.wav", 1.0, ATTN_NORM ); pev->pain_finished = gpGlobals->time + SequenceDuration() + RANDOM_FLOAT( 0.5f, 1.0f ); }
void CAI_Motor::MoveJumpStart( const Vector &velocity ) { // take the npc off the ground and throw them in the air SetSmoothedVelocity( velocity ); SetGravity( GetOuter()->GetJumpGravity() ); SetGroundEntity( NULL ); SetActivity( ACT_JUMP ); SetIdealYawAndUpdate( velocity ); }
void CNPC_Zombine::SetZombieModel( void ) { SetModel( "models/zombie/zombie_soldier.mdl" ); SetHullType( HULL_HUMAN ); SetBodygroup( ZOMBIE_BODYGROUP_HEADCRAB, !m_fIsHeadless ); SetHullSizeNormal( true ); SetDefaultEyeOffset(); SetActivity( ACT_IDLE ); }
void CASW_Weapon_Autogun::ReachedEndOfSequence() { BaseClass::ReachedEndOfSequence(); if (gpGlobals->curtime - m_flLastMuzzleFlashTime > 1.0) // 0.3 is the real firing time, but spin for a bit longer { if (GetSequenceActivity(GetSequence()) != ACT_VM_IDLE) { SetActivity(ACT_VM_IDLE, 0); } } }
void CWalkerMiniStrider::UpdateCrouch() { float dt = GetTimeDelta(); m_flCrouchTimer -= dt; if ( m_flCrouchTimer <= 0 ) { if ( m_State == STATE_CROUCHING ) { m_State = STATE_CROUCHED; SetActivity( ACT_CROUCHIDLE ); } else if ( m_State == STATE_UNCROUCHING ) { EnableWalkMode( true ); m_State = STATE_NORMAL; SetActivity( ACT_IDLE ); } } }
void CWalkerMiniStrider::UnCrouch() { if ( m_State == STATE_CROUCHING || m_State == STATE_UNCROUCHING || m_State == STATE_NORMAL ) return; SetActivity( ACT_STAND ); m_flCrouchTimer = SequenceDuration(); m_State = STATE_UNCROUCHING; }
//========================================================= // Forzar a un NPC a disparar. //========================================================= void CWeaponAlyxGun::Operator_ForceNPCFire(CBaseCombatCharacter *pOperator, bool bSecondary) { // Ensure we have enough rounds in the clip m_iClip1++; // HACK: We need the gun to fire its muzzle flash if ( bSecondary == false ) SetActivity( ACT_RANGE_ATTACK_PISTOL, 0.0f ); FireNPCPrimaryAttack(pOperator, true); }
void CWalkerMiniStrider::Crouch() { if ( m_State == STATE_CROUCHING || m_State == STATE_CROUCHED ) return; // Disable the base class's walking functionality while we're crouched. EnableWalkMode( false ); SetActivity( ACT_CROUCH ); m_flCrouchTimer = SequenceDuration(); m_State = STATE_CROUCHING; }