hl2_src-leak-2017/src/game/shared/tfc/nailgun_nail.cpp

153 lines
3.5 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "cbase.h"
#include "nailgun_nail.h"
#define NAILGUN_MODEL "models/nail.mdl"
LINK_ENTITY_TO_CLASS( tf_nailgun_nail, CTFNailgunNail );
PRECACHE_REGISTER( tf_nailgun_nail );
BEGIN_DATADESC( CTFNailgunNail )
DEFINE_FUNCTION( NailTouch )
END_DATADESC()
CTFNailgunNail *CTFNailgunNail::CreateNail(
bool fSendClientNail,
Vector vecOrigin,
QAngle vecAngles,
CBaseEntity *pOwner,
CBaseEntity *pLauncher,
bool fMakeClientNail )
{
CTFNailgunNail *pNail = (CTFNailgunNail*)CreateEntityByName( "tf_nailgun_nail" );
if ( !pNail )
return NULL;
pNail->SetAbsOrigin( vecOrigin );
pNail->SetAbsAngles( vecAngles );
pNail->SetOwnerEntity( pOwner );
pNail->Spawn();
pNail->SetTouch( &CTFNailgunNail::NailTouch );
pNail->m_iDamage = 9;
/*
if ( fMakeClientNail )
{
edict_t *pOwner;
int indexOwner;
// don't send to clients.
pNail->pev->effects |= EF_NODRAW;
pOwner = ENT( pNail->pev->owner );
indexOwner = ENTINDEX(pOwner);
if ( fSendClientNail )
UTIL_ClientProjectile( pNail->pev->origin, pNail->pev->velocity, g_sModelIndexNail, indexOwner, 6 );
}
*/
return pNail;
}
CTFNailgunNail *CTFNailgunNail::CreateSuperNail( Vector vecOrigin, QAngle vecAngles, CBaseEntity *pOwner, CBaseEntity *pLauncher )
{
// Super nails simply do more damage
CTFNailgunNail *pNail = CreateNail( false, vecOrigin, vecAngles, pOwner, pLauncher, true );
pNail->m_iDamage = 13;
return pNail;
}
//=========================================================
// CTFNailgunNail::Spawn
//
// Creates an nail entity on the server that is invisible
// so that it won't be sent to clients. At the same time sends a
// tiny message that creates a flying nail entity on all
// clients. (sjb)
//=========================================================
void CTFNailgunNail::Spawn()
{
// motor
SetMoveType( MOVETYPE_FLYGRAVITY );
SetSolid( SOLID_BBOX );
SetModel( NAILGUN_MODEL );
SetSize( Vector( 0, 0, 0), Vector(0, 0, 0) );
Vector vForward;
AngleVectors( GetAbsAngles(), &vForward );
SetAbsVelocity( vForward * 1000 );
SetGravity( 0.5 );
SetNextThink( gpGlobals->curtime + 6 );
SetThink( &CTFNailgunNail::SUB_Remove );
}
void CTFNailgunNail::Precache()
{
PrecacheModel( NAILGUN_MODEL );
BaseClass::Precache();
}
void CTFNailgunNail::NailTouch( CBaseEntity *pOther )
{
// Damage person hit by the nail
CBaseEntity *pevOwner = GetOwnerEntity();
if ( !pevOwner || !pOther )
{
UTIL_Remove( this );
return;
}
// Nails don't touch each other.
if ( dynamic_cast< CTFNailgunNail* >( pOther ) == NULL )
{
Vector vVelNorm = GetAbsVelocity();
VectorNormalize( vVelNorm );
Vector vDamageForce = vVelNorm;
Vector vDamagePosition = GetAbsOrigin();
int iStartHealth = pOther->GetHealth();
CTakeDamageInfo info( this, pevOwner, vDamageForce, vDamagePosition, m_iDamage, DMG_SLASH );
pOther->TakeDamage( info );
// Did they take the damage?
if ( pOther->GetHealth() < iStartHealth )
{
SpawnBlood( GetAbsOrigin(), GetAbsVelocity(), pOther->BloodColor(), m_iDamage );
}
// Do an impact trace in case we hit the world.
trace_t tr;
UTIL_TraceLine(
GetAbsOrigin() - vVelNorm * 30,
GetAbsOrigin() + vVelNorm * 50,
MASK_SOLID_BRUSHONLY,
pevOwner,
COLLISION_GROUP_DEBRIS,
&tr );
if ( tr.fraction < 1 )
{
UTIL_ImpactTrace( &tr, DMG_SLASH );
}
UTIL_Remove( this );
}
}