diff options
Diffstat (limited to 'game/server/tf/tf_obj_catapult.cpp')
| -rw-r--r-- | game/server/tf/tf_obj_catapult.cpp | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/game/server/tf/tf_obj_catapult.cpp b/game/server/tf/tf_obj_catapult.cpp new file mode 100644 index 0000000..e24d233 --- /dev/null +++ b/game/server/tf/tf_obj_catapult.cpp @@ -0,0 +1,205 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// +// +//============================================================================= +#include "cbase.h" +#include "tf_obj_catapult.h" +#include "tf_player.h" +#include "mathlib/mathlib.h" +#include "in_buttons.h" + +#ifdef STAGING_ONLY + +#define CATAPULT_THINK_CONTEXT "CatapultContext" + +#define CATAPULT_MODEL "models/buildables/teleporter_light.mdl" + +const Vector CATAPULT_MINS = Vector( -24, -24, 0 ); +const Vector CATAPULT_MAXS = Vector( 24, 24, 12 ); + +ConVar tf_engineer_catapult_force( "tf_engineer_catapult_force", "1000" ); +ConVar tf_engineer_catapult_delay( "tf_engineer_catapult_delay", "0" ); + + +//IMPLEMENT_SERVERCLASS_ST( CObjectCatapult, DT_ObjectCatapult ) +//END_SEND_TABLE() + +BEGIN_DATADESC( CObjectCatapult ) + DEFINE_THINKFUNC( CatapultThink ), +END_DATADESC() + +PRECACHE_REGISTER( obj_catapult ); + +LINK_ENTITY_TO_CLASS( obj_catapult, CObjectCatapult ); + + +CObjectCatapult::CObjectCatapult() +{ + int iHealth = GetMaxHealthForCurrentLevel(); + + SetMaxHealth( iHealth ); + SetHealth( iHealth ); + UseClientSideAnimation(); + + SetType( OBJ_CATAPULT ); +} + + +void CObjectCatapult::Spawn() +{ + SetSolid( SOLID_BBOX ); + + SetModel( CATAPULT_MODEL ); + int nBodyDir = FindBodygroupByName( "teleporter_direction" ); + if ( nBodyDir != -1 ) + { + SetBodygroup( nBodyDir, 0 ); + } + + UTIL_SetSize( this, CATAPULT_MINS, CATAPULT_MAXS ); + + BaseClass::Spawn(); + + // HACK: Spin this building 180. The temp model is backwards + RotateBuildAngles(); + RotateBuildAngles(); + + UpdateDesiredBuildRotation( 5.f ); +} + + +void CObjectCatapult::Precache() +{ + BaseClass::Precache(); + + PrecacheModel( CATAPULT_MODEL ); +} + + +void CObjectCatapult::CatapultThink() +{ + if ( IsCarried() ) + return; + + SetContextThink( &CObjectCatapult::CatapultThink, gpGlobals->curtime + 0.1f, CATAPULT_THINK_CONTEXT ); + + const float flJumpDelay = tf_engineer_catapult_delay.GetFloat(); + for ( int i=0; i<m_jumpers.Count(); ) + { + const Jumper_t& jumper = m_jumpers[i]; + + // Cleanup + if( !jumper.m_hJumper ) + { + m_jumpers.Remove(i); + continue; + } + + CTFPlayer *pPlayer = ToTFPlayer( jumper.m_hJumper ); + if ( !pPlayer ) + { + m_jumpers.Remove( i ); + continue; + } + + //pPlayer->m_nButtons |= IN_DUCK; + if ( jumper.flTouchTime + flJumpDelay < gpGlobals->curtime || ( pPlayer->m_nButtons & IN_DUCK ) ) + { + Launch( jumper.m_hJumper ); + m_jumpers.Remove(i); + } + else + { + ++i; + } + } +} + + +void CObjectCatapult::OnGoActive() +{ + BaseClass::OnGoActive(); + + SetContextThink( &CObjectCatapult::CatapultThink, gpGlobals->curtime + 0.1, CATAPULT_THINK_CONTEXT ); + + int nBodyDir = FindBodygroupByName( "teleporter_direction" ); + if ( nBodyDir != -1 ) + { + SetBodygroup( nBodyDir, 1 ); + } + +} + + +bool CObjectCatapult::IsPlacementPosValid( void ) +{ + bool bResult = BaseClass::IsPlacementPosValid(); + + if ( !bResult ) + { + return false; + } + + // m_vecBuildOrigin is the proposed build origin + + // start above the teleporter position + Vector vecTestPos = m_vecBuildOrigin; + vecTestPos.z += CATAPULT_MAXS.z; + + // make sure we can fit a player on top in this pos + trace_t tr; + UTIL_TraceHull( vecTestPos, vecTestPos, VEC_HULL_MIN, VEC_HULL_MAX, MASK_SOLID | CONTENTS_PLAYERCLIP, this, COLLISION_GROUP_PLAYER_MOVEMENT, &tr ); + + return ( tr.fraction >= 1.0 ); +} + + +void CObjectCatapult::StartTouch( CBaseEntity *pOther ) +{ + BaseClass::StartTouch( pOther ); + + if ( pOther->IsPlayer() ) + { + int index = m_jumpers.AddToTail(); + Jumper_t& jumper = m_jumpers[index]; + jumper.m_hJumper = pOther; + jumper.flTouchTime = gpGlobals->curtime; + } +} + + +void CObjectCatapult::EndTouch( CBaseEntity *pOther ) +{ + BaseClass::EndTouch( pOther ); + + for ( int i=0; i<m_jumpers.Count(); ++i ) + { + if ( m_jumpers[i].m_hJumper == pOther ) + { + m_jumpers.Remove(i); + return; + } + } +} + + +void CObjectCatapult::Launch( CBaseEntity* pEnt ) +{ + CTFPlayer *pPlayer = ToTFPlayer( pEnt ); + if ( !pPlayer ) + return; + + //Vector vForward; + //QAngle qEyeAngle = pEnt->EyeAngles(); + //AngleVectors( pEnt->EyeAngles(), &vForward ); + //vForward.NormalizeInPlace(); + //vForward.z += 2.0f; + //vForward.NormalizeInPlace(); + + + //pPlayer->ApplyAirBlastImpulse( tf_engineer_catapult_force.GetFloat() * vForward ); + pPlayer->m_Shared.AddCond( TF_COND_SPEED_BOOST, 5.0f ); +} + +#endif // STAGING_ONLY
\ No newline at end of file |