diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/dod/dod_baserocket.cpp | |
| download | archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip | |
Diffstat (limited to 'game/server/dod/dod_baserocket.cpp')
| -rw-r--r-- | game/server/dod/dod_baserocket.cpp | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/game/server/dod/dod_baserocket.cpp b/game/server/dod/dod_baserocket.cpp new file mode 100644 index 0000000..c04f27c --- /dev/null +++ b/game/server/dod/dod_baserocket.cpp @@ -0,0 +1,294 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include "cbase.h" +#include "dod_baserocket.h" +#include "explode.h" +#include "dod_shareddefs.h" +#include "dod_gamerules.h" +#include "fx_dod_shared.h" + + +BEGIN_DATADESC( CDODBaseRocket ) + + // Function Pointers + DEFINE_FUNCTION( RocketTouch ), + + DEFINE_THINKFUNC( FlyThink ), + +END_DATADESC() + + +IMPLEMENT_SERVERCLASS_ST( CDODBaseRocket, DT_DODBaseRocket ) + SendPropVector( SENDINFO( m_vInitialVelocity ), + 20, // nbits + 0, // flags + -3000, // low value + 3000 // high value + ) +END_NETWORK_TABLE() + + +LINK_ENTITY_TO_CLASS( base_rocket, CDODBaseRocket ); + + +//----------------------------------------------------------------------------- +// Constructor +//----------------------------------------------------------------------------- +CDODBaseRocket::CDODBaseRocket() +{ +} + +CDODBaseRocket::~CDODBaseRocket() +{ +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDODBaseRocket::Precache( void ) +{ + PrecacheScriptSound( "Weapon_Bazooka.Shoot" ); + PrecacheParticleSystem( "rockettrail" ); +} + +ConVar mp_rocketdamage( "mp_rocketdamage", "150", FCVAR_GAMEDLL | FCVAR_CHEAT ); +ConVar mp_rocketradius( "mp_rocketradius", "200", FCVAR_GAMEDLL | FCVAR_CHEAT ); + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDODBaseRocket::Spawn( void ) +{ + Precache(); + + SetSolid( SOLID_BBOX ); + + Assert( GetModel() ); //derived classes must have set model + + UTIL_SetSize( this, -Vector(2,2,2), Vector(2,2,2) ); + + SetTouch( &CDODBaseRocket::RocketTouch ); + + SetMoveType( MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_CUSTOM ); + + m_takedamage = DAMAGE_NO; + SetGravity( 0.1 ); + SetDamage( mp_rocketdamage.GetFloat() ); + + AddFlag( FL_OBJECT ); + + SetCollisionGroup( COLLISION_GROUP_PROJECTILE ); + + EmitSound( "Weapon_Bazooka.Shoot" ); + + m_flCollideWithTeammatesTime = gpGlobals->curtime + 0.25; + m_bCollideWithTeammates = false; + + SetThink( &CDODBaseRocket::FlyThink ); + SetNextThink( gpGlobals->curtime ); +} + +unsigned int CDODBaseRocket::PhysicsSolidMaskForEntity( void ) const +{ + int teamContents = 0; + + if ( m_bCollideWithTeammates == false ) + { + // Only collide with the other team + teamContents = ( GetTeamNumber() == TEAM_ALLIES ) ? CONTENTS_TEAM1 : CONTENTS_TEAM2; + } + else + { + // Collide with both teams + teamContents = CONTENTS_TEAM1 | CONTENTS_TEAM2; + } + + return BaseClass::PhysicsSolidMaskForEntity() | CONTENTS_HITBOX | teamContents; +} + +//----------------------------------------------------------------------------- +// Purpose: Stops any kind of tracking and shoots dumb +//----------------------------------------------------------------------------- +void CDODBaseRocket::Fire( void ) +{ + SetThink( NULL ); + SetMoveType( MOVETYPE_FLY ); + + SetModel("models/weapons/w_missile.mdl"); + UTIL_SetSize( this, vec3_origin, vec3_origin ); + + EmitSound( "Weapon_Bazooka.Shoot" ); +} + +//----------------------------------------------------------------------------- +// The actual explosion +//----------------------------------------------------------------------------- +void CDODBaseRocket::DoExplosion( trace_t *pTrace ) +{ +/* + // Explode + ExplosionCreate( + GetAbsOrigin(), //DMG_ROCKET + GetAbsAngles(), + GetOwnerEntity(), + GetDamage(), //magnitude + mp_rocketradius.GetFloat(), //radius + SF_ENVEXPLOSION_NOSPARKS | SF_ENVEXPLOSION_NODLIGHTS | SF_ENVEXPLOSION_NOSMOKE, + 0.0f, //explosion force + this); //inflictor +*/ + + // Pull out of the wall a bit + if ( pTrace->fraction != 1.0 ) + { + SetAbsOrigin( pTrace->endpos + (pTrace->plane.normal * 0.6) ); + } + + // Explosion effect on client + Vector vecOrigin = GetAbsOrigin(); + CPVSFilter filter( vecOrigin ); + TE_DODExplosion( filter, 0.0f, vecOrigin, pTrace->plane.normal ); + + CTakeDamageInfo info( this, GetOwnerEntity(), vec3_origin, GetAbsOrigin(), GetDamage(), DMG_BLAST, 0 ); + RadiusDamage( info, vecOrigin, mp_rocketradius.GetFloat() /* GetDamageRadius() */, CLASS_NONE, NULL ); + + // stun players in a radius + const float flStunDamage = 75; + const float flRadius = 150; + + CTakeDamageInfo stunInfo( this, GetOwnerEntity(), vec3_origin, GetAbsOrigin(), flStunDamage, DMG_STUN ); + DODGameRules()->RadiusStun( stunInfo, GetAbsOrigin(), flRadius ); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDODBaseRocket::Explode( void ) +{ + // Don't explode against the skybox. Just pretend that + // the missile flies off into the distance. + const trace_t &tr = CBaseEntity::GetTouchTrace(); + const trace_t *p = &tr; + trace_t *newTrace = const_cast<trace_t*>(p); + + DoExplosion( newTrace ); + + if ( newTrace->m_pEnt && !newTrace->m_pEnt->IsPlayer() ) + UTIL_DecalTrace( newTrace, "Scorch" ); + + StopSound( "Weapon_Bazooka.Shoot" ); + UTIL_Remove( this ); +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *pOther - +//----------------------------------------------------------------------------- +void CDODBaseRocket::RocketTouch( CBaseEntity *pOther ) +{ + Assert( pOther ); + if ( !pOther->IsSolid() || pOther->IsSolidFlagSet(FSOLID_VOLUME_CONTENTS) ) + return; + + if ( pOther->GetCollisionGroup() == COLLISION_GROUP_WEAPON ) + return; + + // if we hit the skybox, just disappear + const trace_t &tr = CBaseEntity::GetTouchTrace(); + + const trace_t *p = &tr; + trace_t *newTrace = const_cast<trace_t*>(p); + + if( tr.surface.flags & SURF_SKY ) + { + UTIL_Remove( this ); + return; + } + + if( !pOther->IsPlayer() && pOther->m_takedamage == DAMAGE_YES ) + { + CTakeDamageInfo info; + info.SetAttacker( this ); + info.SetInflictor( this ); + info.SetDamage( 50 ); + info.SetDamageForce( vec3_origin ); // don't worry about this not having a damage force. + // It will explode on touch and impart its own forces + info.SetDamageType( DMG_CLUB ); + + Vector dir; + AngleVectors( GetAbsAngles(), &dir ); + + pOther->DispatchTraceAttack( info, dir, newTrace ); + ApplyMultiDamage(); + + if( pOther->IsAlive() ) + { + Explode(); + } + + // if it's not alive, continue flying + } + else + { + Explode(); + } +} + +void CDODBaseRocket::FlyThink( void ) +{ + QAngle angles; + + VectorAngles( GetAbsVelocity(), angles ); + + SetAbsAngles( angles ); + + if ( gpGlobals->curtime > m_flCollideWithTeammatesTime && m_bCollideWithTeammates == false ) + { + m_bCollideWithTeammates = true; + } + + SetNextThink( gpGlobals->curtime + 0.1f ); +} + + +//----------------------------------------------------------------------------- +// Purpose: +// +// Input : &vecOrigin - +// &vecAngles - +// NULL - +// +// Output : CDODBaseRocket +//----------------------------------------------------------------------------- +CDODBaseRocket *CDODBaseRocket::Create( const char *szClassname, const Vector &vecOrigin, const QAngle &vecAngles, CBaseEntity *pOwner = NULL ) +{ + CDODBaseRocket *pMissile = (CDODBaseRocket *) CBaseEntity::Create( szClassname, vecOrigin, vecAngles, pOwner ); + pMissile->SetOwnerEntity( pOwner ); + pMissile->Spawn(); + + Vector vecForward; + AngleVectors( vecAngles, &vecForward ); + + Vector vRocket = vecForward * 1300; + + pMissile->SetAbsVelocity( vRocket ); + pMissile->SetupInitialTransmittedGrenadeVelocity( vRocket ); + + pMissile->SetAbsAngles( vecAngles ); + + // remember what team we should be on + pMissile->ChangeTeam( pOwner->GetTeamNumber() ); + + return pMissile; +} + +void CDODBaseRocket::SetupInitialTransmittedGrenadeVelocity( const Vector &velocity ) +{ + m_vInitialVelocity = velocity; +} |