You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
205 lines
4.2 KiB
205 lines
4.2 KiB
//========= 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
|