mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-12 03:39:10 +00:00
1
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
//========= 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 );
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user