I got the codes
Code:
// Gets the flags for this projectile from a C_BaseEntity*
// If it returns 0, it is not a projectile.
int CAirblast::ProjFlags(C_BaseEntity *pProj)
{
switch (GetClassID(pProj))
{
case CIDCTFStunBall: return ABF_STUNBALL;
case CIDCTFProjectile_Rocket: return ABF_ROCKET;
case CIDCTFGrenadePipebombProjectile:
{
dt_TFProjectile_Pipebomb dtProj(pProj);
if ( dtProj.iType()==PROJ_GRENADE )
return (dtProj.bTouched())?ABF_BOUNCED:ABF_GRENADE;
else
return ABF_STICKY;
}
case CIDCTFProjectile_Arrow: return ABF_ARROW;
case CIDCTFProjectile_Flare: return ABF_FLARE;
case CIDCTFProjectile_Jar: return ABF_JARATE;
}
return 0; // Not a projectile
}
// Fires a simple ray and if it gets close enough it is considered visible.
bool CAirblast::IsVisible(Vector &vPlayer, Vector &vProj)
{
if ( !g_pEngineTrace ) return true;
trace_t pTrace;
Ray_t pRay;
pRay.Init(vPlayer,vProj);
CTraceAirblast traceFilter;
g_pEngineTrace->TraceRay( pRay, MASK_AIRBLAST, &traceFilter, &pTrace );
return pTrace.fraction>=0.99f;
}
// FOV test, you have to write your own CalcAngles(), ClampAngles() and InFov().
bool CAirblast::IsInFov(Vector &vPlayer, Vector &vProj)
{
QAngle qPlayer, qProj, qDiff;
g_pEngine->GetViewAngles(qPlayer);
CalcAngles(vPlayer, vProj, qProj);
qDiff = qPlayer-qProj;
ClampAngles(qDiff);
Msg("Diff = %f, %f\n", qDiff.x, qDiff.y);
return InFov(qDiff, 30.0f);
}
// Filter test, checks if the entity is not of your team and checks the flags of this projectile
bool CAirblast::CProjFilter::Test(IClientEntity *ient)
{
C_BaseEntity *pEnt = static_cast<C_BaseEntity*>(ient);
return ((ProjFlags(pEnt)&m_fFlags) && pEnt->GetTeamNumber()!=m_iTeam);
}
// CTraceFilter, simple stuff.
bool CAirblast::CTraceAirblast::ShouldHitEntity(IHandleEntity *pHandleEntity, int contentsMask)
{
C_BaseEntity *pEnt = static_cast<C_BaseEntity*>(pHandleEntity);
return !( GetClassID(pEnt)==CIDCTFPlayer || GetClassID(pEnt)==CIDCFuncRespawnRoomVisualizer );
}