summaryrefslogtreecommitdiff
path: root/game/server/portal/func_noportal_volume.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/portal/func_noportal_volume.cpp')
-rw-r--r--game/server/portal/func_noportal_volume.cpp130
1 files changed, 130 insertions, 0 deletions
diff --git a/game/server/portal/func_noportal_volume.cpp b/game/server/portal/func_noportal_volume.cpp
new file mode 100644
index 0000000..1e23bfa
--- /dev/null
+++ b/game/server/portal/func_noportal_volume.cpp
@@ -0,0 +1,130 @@
+//========= 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_noportal_volume.h"
+#include "prop_portal_shared.h"
+#include "portal_shareddefs.h"
+#include "portal_util_shared.h"
+#include "collisionutils.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+// Spawnflags
+#define SF_START_INACTIVE 0x01
+
+CEntityClassList<CFuncNoPortalVolume> g_FuncNoPortalVolumeList;
+template <> CFuncNoPortalVolume *CEntityClassList<CFuncNoPortalVolume>::m_pClassList = NULL;
+
+CFuncNoPortalVolume* GetNoPortalVolumeList()
+{
+ return g_FuncNoPortalVolumeList.m_pClassList;
+}
+
+
+LINK_ENTITY_TO_CLASS( func_noportal_volume, CFuncNoPortalVolume );
+
+BEGIN_DATADESC( CFuncNoPortalVolume )
+
+ DEFINE_FIELD( m_bActive, FIELD_BOOLEAN ),
+ DEFINE_FIELD( m_iListIndex, FIELD_INTEGER ),
+ // No need to save this, its rebuilt on construct
+ //DEFINE_FIELD( m_pNext, FIELD_CLASSPTR ),
+
+ // Inputs
+ DEFINE_INPUTFUNC( FIELD_VOID, "Deactivate", InputDeactivate ),
+ DEFINE_INPUTFUNC( FIELD_VOID, "Activate", InputActivate ),
+ DEFINE_INPUTFUNC( FIELD_VOID, "Toggle", InputToggle ),
+
+ DEFINE_FUNCTION( GetIndex ),
+ DEFINE_FUNCTION( IsActive ),
+
+END_DATADESC()
+
+
+CFuncNoPortalVolume::CFuncNoPortalVolume()
+{
+ m_bActive = true;
+
+ // Add me to the global list
+ g_FuncNoPortalVolumeList.Insert( this );
+}
+
+CFuncNoPortalVolume::~CFuncNoPortalVolume()
+{
+ g_FuncNoPortalVolumeList.Remove( this );
+}
+
+
+void CFuncNoPortalVolume::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 CFuncNoPortalVolume::OnActivate( void )
+{
+ if ( !GetCollideable() )
+ return;
+
+ 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];
+ if( pTempPortal->m_bActivated &&
+ IsOBBIntersectingOBB( pTempPortal->GetAbsOrigin(), pTempPortal->GetAbsAngles(), CProp_Portal_Shared::vLocalMins, CProp_Portal_Shared::vLocalMaxs,
+ GetAbsOrigin(), GetCollideable()->GetCollisionAngles(), GetCollideable()->OBBMins(), GetCollideable()->OBBMaxs() ) )
+ {
+ pTempPortal->DoFizzleEffect( PORTAL_FIZZLE_KILLED, false );
+ pTempPortal->Fizzle();
+ }
+ }
+ }
+}
+
+void CFuncNoPortalVolume::InputActivate( inputdata_t &inputdata )
+{
+ m_bActive = true;
+
+ OnActivate();
+}
+
+void CFuncNoPortalVolume::InputDeactivate( inputdata_t &inputdata )
+{
+ m_bActive = false;
+}
+
+void CFuncNoPortalVolume::InputToggle( inputdata_t &inputdata )
+{
+ m_bActive = !m_bActive;
+
+ if ( m_bActive )
+ {
+ OnActivate();
+ }
+}
+