270 lines
8.2 KiB
C++
270 lines
8.2 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=============================================================================//
|
|
|
|
#include "cbase.h"
|
|
#include "EntityOutput.h"
|
|
#include "EntityList.h"
|
|
#include "info_vehicle_bay.h"
|
|
#include "tf_obj.h"
|
|
#include "tf_player.h"
|
|
#include "info_act.h"
|
|
|
|
extern ConVar tf_fastbuild;
|
|
|
|
BEGIN_DATADESC( CInfoVehicleBay )
|
|
END_DATADESC()
|
|
|
|
LINK_ENTITY_TO_CLASS( info_vehicle_bay, CInfoVehicleBay );
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CInfoVehicleBay::Spawn( void )
|
|
{
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Vehicle bays have 1 build point
|
|
//-----------------------------------------------------------------------------
|
|
int CInfoVehicleBay::GetNumBuildPoints( void ) const
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Return true if the specified object type can be built on this point
|
|
//-----------------------------------------------------------------------------
|
|
bool CInfoVehicleBay::CanBuildObjectOnBuildPoint( int iPoint, int iObjectType )
|
|
{
|
|
ASSERT( iPoint <= GetNumBuildPoints() );
|
|
|
|
// Don't allow building if there's another vehicle in the way
|
|
|
|
|
|
// Only vehicles can be built here
|
|
return ( iObjectType >= OBJ_BATTERING_RAM );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
bool CInfoVehicleBay::GetBuildPoint( int iPoint, Vector &vecOrigin, QAngle &vecAngles )
|
|
{
|
|
ASSERT( iPoint <= GetNumBuildPoints() );
|
|
|
|
vecOrigin = GetAbsOrigin();
|
|
vecAngles = GetAbsAngles();
|
|
return true;
|
|
}
|
|
|
|
int CInfoVehicleBay::GetBuildPointAttachmentIndex( int iPoint ) const
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CInfoVehicleBay::SetObjectOnBuildPoint( int iPoint, CBaseObject *pObject )
|
|
{
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
int CInfoVehicleBay::GetNumObjectsOnMe( void )
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
CBaseEntity *CInfoVehicleBay::GetFirstObjectOnMe( void )
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
CBaseObject *CInfoVehicleBay::GetObjectOfTypeOnMe( int iObjectType )
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
int CInfoVehicleBay::FindObjectOnBuildPoint( CBaseObject *pObject )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CInfoVehicleBay::GetExitPoint( CBaseEntity *pPlayer, int iPoint, Vector *pAbsOrigin, QAngle *pAbsAngles )
|
|
{
|
|
Assert(0);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CInfoVehicleBay::RemoveAllObjects( void )
|
|
{
|
|
}
|
|
|
|
//===================================================================================================================
|
|
// Vehicle Bay VGui Screen
|
|
//===================================================================================================================
|
|
BEGIN_DATADESC( CVGuiScreenVehicleBay )
|
|
// outputs
|
|
DEFINE_OUTPUT( m_OnStartedBuild, "OnStartedBuild" ),
|
|
DEFINE_OUTPUT( m_OnFinishedBuild, "OnFinishedBuild" ),
|
|
DEFINE_OUTPUT( m_OnReadyToBuildAgain, "OnReadyToBuildAgain" ),
|
|
|
|
// functions
|
|
DEFINE_FUNCTION( BayThink ),
|
|
END_DATADESC()
|
|
|
|
LINK_ENTITY_TO_CLASS( vgui_screen_vehicle_bay, CVGuiScreenVehicleBay );
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CVGuiScreenVehicleBay::Activate( void )
|
|
{
|
|
BaseClass::Activate();
|
|
|
|
// Make sure we have a buildpoint specified
|
|
CBaseEntity *pBuildPoint = gEntList.FindEntityByName( NULL, m_target );
|
|
if ( !pBuildPoint )
|
|
{
|
|
Msg("ERROR: vgui_screen_vehicle_bay with no buildpoint as its target.\n" );
|
|
UTIL_Remove( this );
|
|
return;
|
|
}
|
|
|
|
Vector vecOrigin = pBuildPoint->GetAbsOrigin();
|
|
QAngle vecAngles = pBuildPoint->GetAbsAngles();
|
|
SetBuildPoint( vecOrigin, vecAngles );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CVGuiScreenVehicleBay::SetBuildPoint( Vector &vecOrigin, QAngle &vecAngles )
|
|
{
|
|
m_vecBuildPointOrigin = vecOrigin;
|
|
m_vecBuildPointAngles = vecAngles;
|
|
m_bBayIsClear = false;
|
|
|
|
// Start checking to see when I'm clear again
|
|
SetThink( BayThink );
|
|
SetNextThink( gpGlobals->curtime + 0.1f );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CVGuiScreenVehicleBay::BuildVehicle( CBaseTFPlayer *pPlayer, int iObjectType )
|
|
{
|
|
if ( !IsObjectAVehicle(iObjectType) )
|
|
return;
|
|
Assert( m_vecBuildPointOrigin != vec3_origin );
|
|
|
|
// Can't build if the game hasn't started
|
|
if ( !tf_fastbuild.GetInt() && CurrentActIsAWaitingAct() )
|
|
{
|
|
ClientPrint( pPlayer, HUD_PRINTCENTER, "Can't build until the game's started.\n" );
|
|
return;
|
|
}
|
|
|
|
// Try and spawn the object
|
|
CBaseEntity *pEntity = CreateEntityByName( GetObjectInfo(iObjectType)->m_pClassName );
|
|
if ( !pEntity )
|
|
return;
|
|
|
|
if ( !m_bBayIsClear )
|
|
{
|
|
ClientPrint( pPlayer, HUD_PRINTCENTER, "Vehicle bay isn't clear.\n" );
|
|
return;
|
|
}
|
|
|
|
pEntity->SetAbsOrigin( m_vecBuildPointOrigin );
|
|
pEntity->SetAbsAngles( m_vecBuildPointAngles );
|
|
|
|
CBaseObject *pObject = dynamic_cast<CBaseObject*>(pEntity);
|
|
if ( pObject )
|
|
pObject->AdjustInitialBuildAngles();
|
|
|
|
pEntity->Spawn();
|
|
|
|
// If it's an object, finish setting it up
|
|
if ( !pObject )
|
|
return;
|
|
|
|
pObject->StartPlacement( pPlayer );
|
|
pObject->SetVehicleBay( this );
|
|
|
|
// StartBuilding will return false if the player couldn't afford the vehicle
|
|
if ( !pObject->StartBuilding( pPlayer ) )
|
|
return;
|
|
|
|
// Fire our started-building output
|
|
m_OnStartedBuild.FireOutput( pPlayer, this );
|
|
|
|
m_bBayIsClear = false;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CVGuiScreenVehicleBay::FinishedBuildVehicle( CBaseObject *pObject )
|
|
{
|
|
m_OnFinishedBuild.FireOutput( pObject->GetBuilder(), this );
|
|
|
|
// Start checking to see when I'm clear again
|
|
SetThink( BayThink );
|
|
SetNextThink( gpGlobals->curtime + 0.3 );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Check to see if we're clear enough to allow another vehicle to be built here
|
|
//-----------------------------------------------------------------------------
|
|
void CVGuiScreenVehicleBay::BayThink( void )
|
|
{
|
|
// Get a list of entities around our buildpoint
|
|
CBaseEntity *pListOfNearbyEntities[100];
|
|
int iNumberOfNearbyEntities = UTIL_EntitiesInSphere( pListOfNearbyEntities, 100, m_vecBuildPointOrigin, 128, 0 );
|
|
for ( int i = 0; i < iNumberOfNearbyEntities; i++ )
|
|
{
|
|
CBaseEntity *pEntity = pListOfNearbyEntities[i];
|
|
if ( pEntity->IsSolid( ) )
|
|
{
|
|
// Ignore shields..
|
|
if ( pEntity->GetCollisionGroup() == TFCOLLISION_GROUP_SHIELD )
|
|
continue;
|
|
// Ignore func brushes
|
|
if ( pEntity->GetMoveType() == MOVETYPE_PUSH )
|
|
continue;
|
|
|
|
//NDebugOverlay::EntityBounds( pEntity, 0,255,0,8, 0.1 );
|
|
|
|
// Check again soon
|
|
SetNextThink( gpGlobals->curtime + 1 );
|
|
return;
|
|
}
|
|
}
|
|
|
|
// We're clear
|
|
m_bBayIsClear = true;
|
|
SetThink( NULL );
|
|
|
|
m_OnReadyToBuildAgain.FireOutput( this, this );
|
|
} |