summaryrefslogtreecommitdiff
path: root/game/server/tf2/info_vehicle_bay.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/tf2/info_vehicle_bay.cpp')
-rw-r--r--game/server/tf2/info_vehicle_bay.cpp270
1 files changed, 270 insertions, 0 deletions
diff --git a/game/server/tf2/info_vehicle_bay.cpp b/game/server/tf2/info_vehicle_bay.cpp
new file mode 100644
index 0000000..30737b9
--- /dev/null
+++ b/game/server/tf2/info_vehicle_bay.cpp
@@ -0,0 +1,270 @@
+//========= 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 );
+} \ No newline at end of file