Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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

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 );
}