//--------------------------------------------------------- //--------------------------------------------------------- void CNPC_Assassin::HandleAnimEvent( animevent_t *pEvent ) { if ( pEvent->event == AE_ASSASIN_FIRE_PISTOL_RIGHT ) { FirePistol( 0 ); return; } if ( pEvent->event == AE_ASSASIN_FIRE_PISTOL_LEFT ) { FirePistol( 1 ); return; } if ( pEvent->event == AE_ASSASIN_KICK_HIT ) { Vector attackDir = BodyDirection2D(); Vector attackPos = WorldSpaceCenter() + ( attackDir * 64.0f ); trace_t tr; UTIL_TraceHull( WorldSpaceCenter(), attackPos, -Vector(8,8,8), Vector(8,8,8), MASK_SHOT_HULL, this, COLLISION_GROUP_NONE, &tr ); if ( ( tr.m_pEnt != NULL ) && ( tr.DidHitWorld() == false ) ) { if ( tr.m_pEnt->m_takedamage != DAMAGE_NO ) { CTakeDamageInfo info( this, this, 5, DMG_CLUB ); CalculateMeleeDamageForce( &info, (tr.endpos - tr.startpos), tr.endpos ); tr.m_pEnt->TakeDamage( info ); CBasePlayer *pPlayer = ToBasePlayer( tr.m_pEnt ); if ( pPlayer != NULL ) { //Kick the player angles pPlayer->ViewPunch( QAngle( -30, 40, 10 ) ); } EmitSound( "Zombie.AttackHit" ); //EmitSound( "Assassin.AttackHit" ); } } else { EmitSound( "Assassin.AttackMiss" ); //EmitSound( "Assassin.AttackMiss" ); } return; } BaseClass::HandleAnimEvent( pEvent ); }
void CHL1NPCTalker::SetHeadDirection( const Vector &vTargetPos, float flInterval) { #ifdef TALKER_LOOK // Draw line in body, head, and eye directions Vector vEyePos = EyePosition(); Vector vHeadDir = HeadDirection3D(); Vector vBodyDir = BodyDirection2D(); //UNDONE <<TODO>> // currently eye dir just returns head dir, so use vTargetPos for now //Vector vEyeDir; w //EyeDirection3D(&vEyeDir); NDebugOverlay::Line( vEyePos, vEyePos+(50*vHeadDir), 255, 0, 0, false, 0.1 ); NDebugOverlay::Line( vEyePos, vEyePos+(50*vBodyDir), 0, 255, 0, false, 0.1 ); NDebugOverlay::Line( vEyePos, vTargetPos, 0, 0, 255, false, 0.1 ); #endif }
//----------------------------------------------------------------------------- // Purpose: // Input : flDot - // flDist - // Output : int //----------------------------------------------------------------------------- int CNPC_Bug_Warrior::MeleeAttack1Conditions( float flDot, float flDist ) { if ( ( gpGlobals->curtime - m_flLastAttackTime ) < 1.0f ) return 0; #if 0 float flPrDist, flPrDot; Vector vecPrPos; Vector2D vec2DPrDir; //Get our likely position in one second UTIL_GetPredictedPosition( GetEnemy(), 0.5f, &vecPrPos ); flPrDist = ( vecPrPos - GetAbsOrigin() ).Length(); vec2DPrDir = ( vecPrPos - GetAbsOrigin() ).AsVector2D(); Vector vecBodyDir; BodyDirection2D( &vecBodyDir ); Vector2D vec2DBodyDir = vecBodyDir.AsVector2D(); flPrDot = DotProduct2D (vec2DPrDir, vec2DBodyDir ); if ( flPrDist > BUG_WARRIOR_MELEE1_RANGE ) return COND_TOO_FAR_TO_ATTACK; if ( flPrDot < 0.5f ) return COND_NOT_FACING_ATTACK; #else if ( flDist > BUG_WARRIOR_MELEE1_RANGE ) return COND_TOO_FAR_TO_ATTACK; if ( flDot < 0.5f ) return COND_NOT_FACING_ATTACK; #endif return COND_CAN_MELEE_ATTACK1; }
void CSDKPlayer::ThrowActiveWeapon( void ) { CWeaponSDKBase *pWeapon = (CWeaponSDKBase *)GetActiveWeapon(); if( pWeapon && pWeapon->CanWeaponBeDropped() ) { QAngle gunAngles; VectorAngles( BodyDirection2D(), gunAngles ); Vector vecForward; AngleVectors( gunAngles, &vecForward, NULL, NULL ); float flDiameter = sqrt( CollisionProp()->OBBSize().x * CollisionProp()->OBBSize().x + CollisionProp()->OBBSize().y * CollisionProp()->OBBSize().y ); pWeapon->Holster(NULL); SwitchToNextBestWeapon( pWeapon ); SDKThrowWeapon( pWeapon, vecForward, gunAngles, flDiameter ); } }