diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/portal/func_portal_detector.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/server/portal/func_portal_detector.cpp')
| -rw-r--r-- | game/server/portal/func_portal_detector.cpp | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/game/server/portal/func_portal_detector.cpp b/game/server/portal/func_portal_detector.cpp new file mode 100644 index 0000000..660da49 --- /dev/null +++ b/game/server/portal/func_portal_detector.cpp @@ -0,0 +1,139 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: A volume in which no portal can be placed. Keeps a global list loaded in from the map +// and provides an interface with which prop_portal can get this list and avoid successfully +// creating portals wholly or partially inside the volume. +// +// $NoKeywords: $ +//======================================================================================// + +#include "cbase.h" +#include "func_portal_detector.h" +#include "prop_portal_shared.h" +#include "portal_shareddefs.h" +#include "portal_util_shared.h" + + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +// Spawnflags +#define SF_START_INACTIVE 0x01 + + +LINK_ENTITY_TO_CLASS( func_portal_detector, CFuncPortalDetector ); + +BEGIN_DATADESC( CFuncPortalDetector ) + + DEFINE_FIELD( m_bActive, FIELD_BOOLEAN ), + DEFINE_KEYFIELD( m_iLinkageGroupID, FIELD_INTEGER, "LinkageGroupID" ), + + // Inputs + DEFINE_INPUTFUNC( FIELD_VOID, "Disable", InputDisable ), + DEFINE_INPUTFUNC( FIELD_VOID, "Enable", InputEnable ), + DEFINE_INPUTFUNC( FIELD_VOID, "Toggle", InputToggle ), + + DEFINE_OUTPUT( m_OnStartTouchPortal1, "OnStartTouchPortal1" ), + DEFINE_OUTPUT( m_OnStartTouchPortal2, "OnStartTouchPortal2" ), + DEFINE_OUTPUT( m_OnStartTouchLinkedPortal, "OnStartTouchLinkedPortal" ), + DEFINE_OUTPUT( m_OnStartTouchBothLinkedPortals, "OnStartTouchBothLinkedPortals" ), + + DEFINE_FUNCTION( IsActive ), + +END_DATADESC() + + +void CFuncPortalDetector::Spawn() +{ + BaseClass::Spawn(); + + if ( m_spawnflags & SF_START_INACTIVE ) + { + m_bActive = false; + } + else + { + m_bActive = true; + } + + // Bind to our model, cause we need the extents for bounds checking + SetModel( STRING( GetModelName() ) ); + SetRenderMode( kRenderNone ); // Don't draw + SetSolid( SOLID_VPHYSICS ); // we may want slanted walls, so we'll use OBB + AddSolidFlags( FSOLID_NOT_SOLID ); +} + +void CFuncPortalDetector::OnActivate( void ) +{ + Vector vMin, vMax; + CollisionProp()->WorldSpaceAABB( &vMin, &vMax ); + + Vector vBoxCenter = ( vMin + vMax ) * 0.5f; + Vector vBoxExtents = ( vMax - vMin ) * 0.5f; + + bool bTouchedPortal1 = false; + bool bTouchedPortal2 = false; + + int iPortalCount = CProp_Portal_Shared::AllPortals.Count(); + if( iPortalCount != 0 ) + { + CProp_Portal **pPortals = CProp_Portal_Shared::AllPortals.Base(); + for( int i = 0; i != iPortalCount; ++i ) + { + CProp_Portal *pTempPortal = pPortals[i]; + + //require that it's active and/or linked? + + if( pTempPortal->GetLinkageGroup() == m_iLinkageGroupID && UTIL_IsBoxIntersectingPortal( vBoxCenter, vBoxExtents, pTempPortal ) ) + { + if( pTempPortal->IsPortal2() ) + { + m_OnStartTouchPortal2.FireOutput( pTempPortal, this ); + + if ( pTempPortal->IsActivedAndLinked() ) + { + bTouchedPortal2 = true; + m_OnStartTouchLinkedPortal.FireOutput( pTempPortal, this ); + } + } + else + { + m_OnStartTouchPortal1.FireOutput( pTempPortal, this ); + + if ( pTempPortal->IsActivedAndLinked() ) + { + bTouchedPortal1 = true; + m_OnStartTouchLinkedPortal.FireOutput( pTempPortal, this ); + } + } + } + } + } + + if ( bTouchedPortal1 && bTouchedPortal2 ) + { + m_OnStartTouchBothLinkedPortals.FireOutput( this, this ); + } +} + +void CFuncPortalDetector::InputDisable( inputdata_t &inputdata ) +{ + m_bActive = false; +} + +void CFuncPortalDetector::InputEnable( inputdata_t &inputdata ) +{ + m_bActive = true; + + OnActivate(); +} + +void CFuncPortalDetector::InputToggle( inputdata_t &inputdata ) +{ + m_bActive = !m_bActive; + + if ( m_bActive ) + { + OnActivate(); + } +} |