diff options
Diffstat (limited to 'game/server/tf2/info_buildpoint.cpp')
| -rw-r--r-- | game/server/tf2/info_buildpoint.cpp | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/game/server/tf2/info_buildpoint.cpp b/game/server/tf2/info_buildpoint.cpp new file mode 100644 index 0000000..961b4ff --- /dev/null +++ b/game/server/tf2/info_buildpoint.cpp @@ -0,0 +1,217 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Map entity that allows players to build objects on it +// +// $NoKeywords: $ +//=============================================================================// +#include "cbase.h" +#include "EntityOutput.h" +#include "EntityList.h" +#include "tf_team.h" +#include "baseentity.h" +#include "info_buildpoint.h" +#include "tf_gamerules.h" + +// Spawnflags +const int SF_BUILDPOINT_ALLOW_ALL_GUNS = 0x01; // Allow all manned guns to be built on this point +const int SF_BUILDPOINT_ALLOW_VEHICLES = 0x02; // Allow all vehicles to be built on this point + +BEGIN_DATADESC( CInfoBuildPoint ) + + // keys + DEFINE_KEYFIELD_NOT_SAVED( m_iszAllowedObject, FIELD_STRING, "AllowedObject" ), + +END_DATADESC() + +LINK_ENTITY_TO_CLASS( info_buildpoint, CInfoBuildPoint ); + +// List of buildpoints +CUtlVector<CInfoBuildPoint*> g_MapDefinedBuildPoints; + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CInfoBuildPoint::Spawn( void ) +{ + g_MapDefinedBuildPoints.AddToTail( this ); + + m_iAllowedObjectType = -1; + if ( m_iszAllowedObject != NULL_STRING ) + { + for ( int i = 0; i < OBJ_LAST; i++ ) + { + if ( !Q_strcmp( STRING(m_iszAllowedObject), GetObjectInfo(i)->m_pClassName ) ) + { + m_iAllowedObjectType = i; + break; + } + } + } + + BaseClass::Spawn(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CInfoBuildPoint::UpdateOnRemove( void ) +{ + g_MapDefinedBuildPoints.FindAndRemove( this ); + BaseClass::UpdateOnRemove(); +} + +//----------------------------------------------------------------------------- +// Purpose: Tell me how many build points you have +//----------------------------------------------------------------------------- +int CInfoBuildPoint::GetNumBuildPoints( void ) const +{ + return 1; +} + +//----------------------------------------------------------------------------- +// Purpose: Give me the origin & angles of the specified build point +//----------------------------------------------------------------------------- +bool CInfoBuildPoint::GetBuildPoint( int iPoint, Vector &vecOrigin, QAngle &vecAngles ) +{ + ASSERT( iPoint <= GetNumBuildPoints() ); + + vecOrigin = GetAbsOrigin(); + vecAngles = GetAbsAngles(); + return true; +} + +int CInfoBuildPoint::GetBuildPointAttachmentIndex( int iPoint ) const +{ + return 0; +} + +//----------------------------------------------------------------------------- +// Purpose: Can I build the specified object on the specified build point? +//----------------------------------------------------------------------------- +bool CInfoBuildPoint::CanBuildObjectOnBuildPoint( int iPoint, int iObjectType ) +{ + ASSERT( iPoint <= GetNumBuildPoints() ); + if ( m_hObjectBuiltOnMe ) + return false; + + // Manned guns? + if ( m_spawnflags & SF_BUILDPOINT_ALLOW_ALL_GUNS ) + { + if ( (iObjectType == OBJ_MANNED_PLASMAGUN) || + (iObjectType == OBJ_MANNED_MISSILELAUNCHER) || + (iObjectType == OBJ_MANNED_SHIELD) || + (iObjectType == OBJ_SENTRYGUN_PLASMA) ) + return true; + } + + // Vehicles + if ( m_spawnflags & SF_BUILDPOINT_ALLOW_VEHICLES ) + { + if ( IsObjectAVehicle(iObjectType) ) + return true; + } + + // Check our unique + if ( m_iAllowedObjectType >= 0 && m_iAllowedObjectType == iObjectType ) + return true; + + return false; +} + +//----------------------------------------------------------------------------- +// Purpose: I've finished building the specified object on the specified build point +//----------------------------------------------------------------------------- +void CInfoBuildPoint::SetObjectOnBuildPoint( int iPoint, CBaseObject *pObject ) +{ + ASSERT( iPoint <= GetNumBuildPoints() ); + m_hObjectBuiltOnMe = pObject; +} + +//----------------------------------------------------------------------------- +// Purpose: Get the number of objects build on this entity +//----------------------------------------------------------------------------- +int CInfoBuildPoint::GetNumObjectsOnMe( void ) +{ + if ( m_hObjectBuiltOnMe ) + return 1; + + return 0; +} + +//----------------------------------------------------------------------------- +// Purpose: Get the first object that's built on me +//----------------------------------------------------------------------------- +CBaseEntity *CInfoBuildPoint::GetFirstObjectOnMe( void ) +{ + return m_hObjectBuiltOnMe; +} + +//----------------------------------------------------------------------------- +// Purpose: Get the first object of type, return NULL if no such type available +//----------------------------------------------------------------------------- +CBaseObject *CInfoBuildPoint::GetObjectOfTypeOnMe( int iObjectType ) +{ + if ( m_hObjectBuiltOnMe ) + { + if ( m_hObjectBuiltOnMe->ObjectType() == iObjectType ) + return m_hObjectBuiltOnMe; + } + + return NULL; +} + +//----------------------------------------------------------------------------- +// Purpose: Remove all objects built on me +//----------------------------------------------------------------------------- +void CInfoBuildPoint::RemoveAllObjects( void ) +{ + UTIL_Remove( m_hObjectBuiltOnMe ); +} + +//----------------------------------------------------------------------------- +// Purpose: Return the maximum distance that this entity's build points can be snapped to +//----------------------------------------------------------------------------- +float CInfoBuildPoint::GetMaxSnapDistance( int iPoint ) +{ + return 64; +} + +//----------------------------------------------------------------------------- +// Purpose: Return true if it's possible that build points on this entity may move in local space (i.e. due to animation) +//----------------------------------------------------------------------------- +bool CInfoBuildPoint::ShouldCheckForMovement( void ) +{ + return false; +} + +//----------------------------------------------------------------------------- +// Purpose: I've finished building the specified object on the specified build point +//----------------------------------------------------------------------------- +int CInfoBuildPoint::FindObjectOnBuildPoint( CBaseObject *pObject ) +{ + return 1; +} + +//----------------------------------------------------------------------------- +// Purpose: Returns an exit point for a vehicle built on a build point... +//----------------------------------------------------------------------------- +void CInfoBuildPoint::GetExitPoint( CBaseEntity *pPlayer, int iPoint, Vector *pAbsOrigin, QAngle *pAbsAngles ) +{ + // FIXME: In future, we may well want to use specific exit attachments here... + GetBuildPoint( iPoint, *pAbsOrigin, *pAbsAngles ); + + // Move back along the forward direction a bit... + Vector vecForward; + AngleVectors( *pAbsAngles, &vecForward ); + *pAbsOrigin -= vecForward * 60; + + // Now select a good spot to drop onto + Vector vNewPos; + if ( !EntityPlacementTest(pPlayer, *pAbsOrigin, vNewPos, true) ) + { + Warning("Can't find valid place to exit object.\n"); + return; + } + + *pAbsOrigin = vNewPos; +} |