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.
304 lines
9.3 KiB
304 lines
9.3 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose: Siege Tower Vehicle
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
|
||
|
#include "cbase.h"
|
||
|
#include "tf_vehicle_siege_tower.h"
|
||
|
#include "engine/IEngineSound.h"
|
||
|
#include "VGuiScreen.h"
|
||
|
#include "ammodef.h"
|
||
|
#include "in_buttons.h"
|
||
|
|
||
|
#define SIEGE_TOWER_MINS Vector(-30, -50, -10)
|
||
|
#define SIEGE_TOWER_MAXS Vector( 30, 50, 55)
|
||
|
#define SIEGE_TOWER_MODEL "models/objects/vehicle_siege_tower.mdl"
|
||
|
#define SIEGE_TOWER_LADDER_MODEL "models/objects/vehicle_siege_ladder.mdl"
|
||
|
#define SIEGE_TOWER_PLATFORM_MODEL "models/objects/vehicle_siege_plat.mdl"
|
||
|
|
||
|
IMPLEMENT_SERVERCLASS_ST( CVehicleSiegeTower, DT_VehicleSiegeTower )
|
||
|
END_SEND_TABLE();
|
||
|
|
||
|
LINK_ENTITY_TO_CLASS( vehicle_siege_tower, CVehicleSiegeTower );
|
||
|
PRECACHE_REGISTER( vehicle_siege_tower );
|
||
|
|
||
|
IMPLEMENT_SERVERCLASS_ST( CObjectSiegeLadder, DT_ObjectSiegeLadder )
|
||
|
END_SEND_TABLE();
|
||
|
|
||
|
LINK_ENTITY_TO_CLASS( obj_siege_ladder, CObjectSiegeLadder );
|
||
|
PRECACHE_REGISTER( obj_siege_ladder );
|
||
|
|
||
|
IMPLEMENT_SERVERCLASS_ST( CObjectSiegePlatform, DT_ObjectSiegePlatform )
|
||
|
END_SEND_TABLE();
|
||
|
|
||
|
LINK_ENTITY_TO_CLASS( obj_siege_platform, CObjectSiegePlatform );
|
||
|
PRECACHE_REGISTER( obj_siege_platform );
|
||
|
|
||
|
// CVars
|
||
|
ConVar vehicle_siege_tower_health( "vehicle_siege_tower_health","600", FCVAR_NONE, "Siege tower health" );
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CVehicleSiegeTower::CVehicleSiegeTower()
|
||
|
{
|
||
|
m_hLadder = NULL;
|
||
|
m_hPlatform = NULL;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CVehicleSiegeTower::Precache()
|
||
|
{
|
||
|
PrecacheModel( SIEGE_TOWER_MODEL );
|
||
|
|
||
|
PrecacheVGuiScreen( "screen_vehicle_siege_tower" );
|
||
|
PrecacheVGuiScreen( "screen_vulnerable_point" );
|
||
|
|
||
|
BaseClass::Precache();
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CVehicleSiegeTower::Spawn()
|
||
|
{
|
||
|
SetModel( SIEGE_TOWER_MODEL );
|
||
|
|
||
|
// This size is used for placement only...
|
||
|
UTIL_SetSize( this, SIEGE_TOWER_MINS, SIEGE_TOWER_MAXS );
|
||
|
m_takedamage = DAMAGE_YES;
|
||
|
m_iHealth = vehicle_siege_tower_health.GetInt();
|
||
|
|
||
|
SetType( OBJ_SIEGE_TOWER );
|
||
|
SetMaxPassengerCount( 4 );
|
||
|
|
||
|
BaseClass::Spawn();
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Gets info about the control panels
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CVehicleSiegeTower::GetControlPanelInfo( int nPanelIndex, const char *&pPanelName )
|
||
|
{
|
||
|
//pPanelName = "screen_vehicle_siege_tower";
|
||
|
pPanelName = "screen_vulnerable_point";
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Here's where we deal with weapons, ladders, etc.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CVehicleSiegeTower::OnItemPostFrame( CBaseTFPlayer *pDriver )
|
||
|
{
|
||
|
// I can't do anything if I'm not active
|
||
|
if ( !ShouldBeActive() )
|
||
|
return;
|
||
|
|
||
|
if ( GetPassengerRole( pDriver ) != VEHICLE_ROLE_DRIVER )
|
||
|
return;
|
||
|
|
||
|
if ( !IsDeployed() && ( pDriver->m_afButtonPressed & IN_ATTACK ) )
|
||
|
{
|
||
|
InternalDeploy();
|
||
|
}
|
||
|
else if ( IsDeployed() && ( pDriver->m_afButtonPressed & IN_ATTACK ) )
|
||
|
{
|
||
|
InternalUnDeploy();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CVehicleSiegeTower::InternalDeploy( void )
|
||
|
{
|
||
|
// Deploy
|
||
|
if ( !Deploy() )
|
||
|
return;
|
||
|
|
||
|
InputTurnOff( inputdata_t() );
|
||
|
|
||
|
// Create the ladder.
|
||
|
Vector vecOrigin;
|
||
|
QAngle vecAngle;
|
||
|
GetAttachment( "ladder", vecOrigin, vecAngle );
|
||
|
CreateLadder( vecOrigin, vecAngle );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CVehicleSiegeTower::InternalUnDeploy( void )
|
||
|
{
|
||
|
// Undeploy
|
||
|
UnDeploy();
|
||
|
InputTurnOn( inputdata_t() );
|
||
|
|
||
|
// Destory the ladder.
|
||
|
DestroyLadder();
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CVehicleSiegeTower::CreateLadder( const Vector &vecOrigin, const QAngle &vecAngles )
|
||
|
{
|
||
|
// NOTE: This ladder and platform code is a total hack to test vehicles with. This
|
||
|
// is not the correct way to handle this problem at all.
|
||
|
m_hLadder = CObjectSiegeLadder::Create( vecOrigin, vecAngles, this );
|
||
|
m_hPlatform = CObjectSiegePlatform::Create( vecOrigin, vecAngles, this );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CVehicleSiegeTower::DestroyLadder( void )
|
||
|
{
|
||
|
if ( m_hLadder.Get() )
|
||
|
{
|
||
|
UTIL_Remove( m_hLadder );
|
||
|
m_hLadder = NULL;
|
||
|
}
|
||
|
|
||
|
if ( m_hPlatform.Get() )
|
||
|
{
|
||
|
UTIL_Remove( m_hPlatform );
|
||
|
m_hPlatform = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//------------------------------------------------------------------------------
|
||
|
void CVehicleSiegeTower::Killed( void )
|
||
|
{
|
||
|
DestroyLadder();
|
||
|
BaseClass::Killed();
|
||
|
}
|
||
|
|
||
|
//==============================================================================
|
||
|
//
|
||
|
// Object Siege Ladder
|
||
|
//
|
||
|
|
||
|
//------------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//------------------------------------------------------------------------------
|
||
|
CObjectSiegeLadder::CObjectSiegeLadder()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CObjectSiegeLadder *CObjectSiegeLadder::Create( const Vector &vOrigin, const QAngle &vAngles, CBaseEntity *pParent )
|
||
|
{
|
||
|
CObjectSiegeLadder *pLadder = static_cast<CObjectSiegeLadder*>( CBaseObject::Create( "obj_siege_ladder", vOrigin, vAngles ) );
|
||
|
if ( pLadder )
|
||
|
{
|
||
|
pLadder->m_hTower = pParent;
|
||
|
}
|
||
|
|
||
|
return pLadder;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CObjectSiegeLadder::Spawn()
|
||
|
{
|
||
|
Precache();
|
||
|
SetModel( SIEGE_TOWER_LADDER_MODEL );
|
||
|
SetSolid( SOLID_VPHYSICS );
|
||
|
m_takedamage = DAMAGE_NO;
|
||
|
|
||
|
BaseClass::Spawn();
|
||
|
|
||
|
CollisionProp()->SetSurroundingBoundsType( USE_BEST_COLLISION_BOUNDS );
|
||
|
IPhysicsObject *pPhysics = VPhysicsInitStatic();
|
||
|
if ( pPhysics )
|
||
|
{
|
||
|
pPhysics->EnableMotion( false );
|
||
|
}
|
||
|
SetCollisionGroup( TFCOLLISION_GROUP_OBJECT_SOLIDTOPLAYERMOVEMENT );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CObjectSiegeLadder::Precache()
|
||
|
{
|
||
|
PrecacheModel( SIEGE_TOWER_LADDER_MODEL );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Pass all damage back to the siege tower
|
||
|
//-----------------------------------------------------------------------------
|
||
|
int CObjectSiegeLadder::OnTakeDamage( const CTakeDamageInfo &info )
|
||
|
{
|
||
|
return m_hTower->OnTakeDamage( info );
|
||
|
}
|
||
|
|
||
|
//==============================================================================
|
||
|
//
|
||
|
// Object Siege Platform
|
||
|
//
|
||
|
|
||
|
//------------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//------------------------------------------------------------------------------
|
||
|
CObjectSiegePlatform::CObjectSiegePlatform()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CObjectSiegePlatform *CObjectSiegePlatform::Create( const Vector &vOrigin, const QAngle &vAngles, CBaseEntity *pParent )
|
||
|
{
|
||
|
CObjectSiegePlatform *pPlatform = static_cast<CObjectSiegePlatform*>( CBaseObject::Create( "obj_siege_platform", vOrigin, vAngles ) );
|
||
|
if ( pPlatform )
|
||
|
{
|
||
|
pPlatform->m_hTower = pParent;
|
||
|
}
|
||
|
|
||
|
return pPlatform;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CObjectSiegePlatform::Spawn()
|
||
|
{
|
||
|
Precache();
|
||
|
SetModel( SIEGE_TOWER_PLATFORM_MODEL );
|
||
|
SetSolid( SOLID_VPHYSICS );
|
||
|
m_takedamage = DAMAGE_NO;
|
||
|
|
||
|
BaseClass::Spawn();
|
||
|
CollisionProp()->SetSurroundingBoundsType( USE_BEST_COLLISION_BOUNDS );
|
||
|
IPhysicsObject *pPhysics = VPhysicsInitStatic();
|
||
|
if ( pPhysics )
|
||
|
{
|
||
|
pPhysics->EnableMotion( false );
|
||
|
}
|
||
|
SetCollisionGroup( TFCOLLISION_GROUP_OBJECT_SOLIDTOPLAYERMOVEMENT );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CObjectSiegePlatform::Precache()
|
||
|
{
|
||
|
PrecacheModel( SIEGE_TOWER_PLATFORM_MODEL );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Pass all damage back to the siege tower
|
||
|
//-----------------------------------------------------------------------------
|
||
|
int CObjectSiegePlatform::OnTakeDamage( const CTakeDamageInfo &info )
|
||
|
{
|
||
|
return m_hTower->OnTakeDamage( info );
|
||
|
}
|