//--------------------------------------------------------- //--------------------------------------------------------- void CFastZombie::LeapAttackTouch( CBaseEntity *pOther ) { // Stop the zombie and knock the player back Vector vecNewVelocity( 0, 0, GetAbsVelocity().z ); SetAbsVelocity( vecNewVelocity ); Vector forward; AngleVectors( GetLocalAngles(), &forward ); QAngle qaPunch( 15, random->RandomInt(-5,5), random->RandomInt(-5,5) ); ClawAttack( 50, 5, qaPunch, forward * 500 ); SetTouch( NULL ); }
//----------------------------------------------------------------------------- // Purpose: Catches the monster-specific events that occur when tagged animation // frames are played. // Input : pEvent - //----------------------------------------------------------------------------- void CNPC_Monster::HandleAnimEvent( animevent_t *pEvent ) { QAngle pAng; Vector vecDir; if ( pEvent->event == AE_ZOMBIE_ATTACK_RIGHT ) { Vector right, forward; AngleVectors( GetLocalAngles(), &forward, &right, NULL ); right = right * 100; forward = forward * 200; pAng = QAngle(-15, -20, -10); vecDir = (right + forward); ClawAttack(GetClawAttackRange(), m_iDamage[0], pAng, vecDir, ZOMBIE_BLOOD_RIGHT_HAND); return; } if ( pEvent->event == AE_ZOMBIE_ATTACK_LEFT ) { Vector right, forward; AngleVectors( GetLocalAngles(), &forward, &right, NULL ); right = right * -100; forward = forward * 200; vecDir = (right + forward); pAng = QAngle(-15, 20, -10); ClawAttack(GetClawAttackRange(), m_iDamage[0], pAng, vecDir, ZOMBIE_BLOOD_LEFT_HAND); return; } if ( pEvent->event == AE_ZOMBIE_ATTACK_BOTH ) { Vector forward; QAngle qaPunch( 45, random->RandomInt(-5,5), random->RandomInt(-5,5) ); AngleVectors( GetLocalAngles(), &forward ); forward = forward * 200; ClawAttack( GetClawAttackRange(), m_iDamage[1], qaPunch, forward, ZOMBIE_BLOOD_BOTH_HANDS ); return; } BaseClass::HandleAnimEvent( pEvent ); }
//----------------------------------------------------------------------------- // Purpose: Catches the monster-specific events that occur when tagged animation // frames are played. // Input : pEvent - //----------------------------------------------------------------------------- void CNPC_PoisonZombie::HandleAnimEvent( animevent_t *pEvent ) { if ( pEvent->event == AE_ZOMBIE_POISON_PICKUP_CRAB ) { EnableCrab( m_nThrowCrab, false ); SetBodygroup( ZOMBIE_BODYGROUP_THROW, 1 ); return; } if ( pEvent->event == AE_ZOMBIE_POISON_THROW_WARN_SOUND ) { BreatheOffShort(); EmitSound( "NPC_PoisonZombie.ThrowWarn" ); return; } if ( pEvent->event == AE_ZOMBIE_POISON_THROW_SOUND ) { BreatheOffShort(); EmitSound( "NPC_PoisonZombie.Throw" ); return; } if ( pEvent->event == AE_ZOMBIE_POISON_THROW_CRAB ) { SetBodygroup( ZOMBIE_BODYGROUP_THROW, 0 ); CBlackHeadcrab *pCrab = (CBlackHeadcrab *)CreateNoSpawn( GetHeadcrabClassname(), EyePosition(), vec3_angle, this ); pCrab->AddSpawnFlags( SF_NPC_FALL_TO_GROUND ); // Fade if our parent is supposed to if ( HasSpawnFlags( SF_NPC_FADE_CORPSE ) ) { pCrab->AddSpawnFlags( SF_NPC_FADE_CORPSE ); } // make me the crab's owner to avoid collision issues pCrab->SetOwnerEntity( this ); pCrab->Spawn(); pCrab->SetLocalAngles( GetLocalAngles() ); pCrab->SetActivity( ACT_RANGE_ATTACK1 ); pCrab->SetNextThink( gpGlobals->curtime ); pCrab->PhysicsSimulate(); pCrab->GetMotor()->SetIdealYaw( GetAbsAngles().y ); if ( IsOnFire() ) { pCrab->Ignite( 100.0 ); } CBaseEntity *pEnemy = GetEnemy(); if ( pEnemy ) { Vector vecEnemyEyePos = pEnemy->EyePosition(); pCrab->ThrowAt( vecEnemyEyePos ); } if (m_nCrabCount == 0) { CapabilitiesRemove( bits_CAP_INNATE_RANGE_ATTACK1 | bits_CAP_INNATE_RANGE_ATTACK2 ); } m_flNextCrabThrowTime = gpGlobals->curtime + random->RandomInt( ZOMBIE_THROW_MIN_DELAY, ZOMBIE_THROW_MAX_DELAY ); return; } if ( pEvent->event == AE_ZOMBIE_POISON_SPIT ) { Vector forward; QAngle qaPunch( 45, random->RandomInt(-5, 5), random->RandomInt(-5, 5) ); AngleVectors( GetLocalAngles(), &forward ); forward = forward * 200; ClawAttack( GetClawAttackRange(), sk_zombie_poison_dmg_spit.GetFloat(), qaPunch, forward, ZOMBIE_BLOOD_BITE ); return; } BaseClass::HandleAnimEvent( pEvent ); }