summaryrefslogtreecommitdiff
path: root/game/server/info_camera_link.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/info_camera_link.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/server/info_camera_link.cpp')
-rw-r--r--game/server/info_camera_link.cpp183
1 files changed, 183 insertions, 0 deletions
diff --git a/game/server/info_camera_link.cpp b/game/server/info_camera_link.cpp
new file mode 100644
index 0000000..bdc8a8c
--- /dev/null
+++ b/game/server/info_camera_link.cpp
@@ -0,0 +1,183 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "cbase.h"
+
+#include "info_camera_link.h"
+#include "point_camera.h"
+#include "utllinkedlist.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+
+//-----------------------------------------------------------------------------
+// Link between entities and cameras
+//-----------------------------------------------------------------------------
+class CInfoCameraLink : public CLogicalEntity
+{
+ DECLARE_CLASS( CInfoCameraLink, CLogicalEntity );
+ DECLARE_DATADESC();
+
+public:
+ CInfoCameraLink();
+ ~CInfoCameraLink();
+
+ virtual void Activate();
+
+private:
+ void InputSetCamera(inputdata_t &inputdata);
+ void InputSetTargetEntity(inputdata_t &inputdata);
+ void SetCameraByName(const char *szName);
+
+ CHandle<CPointCamera> m_hCamera;
+ EHANDLE m_hTargetEntity;
+ string_t m_strPointCamera;
+
+ friend CBaseEntity *CreateInfoCameraLink( CBaseEntity *pTarget, CPointCamera *pCamera );
+ friend void PointCameraSetupVisibility( CBaseEntity *pPlayer, int area, unsigned char *pvs, int pvssize );
+};
+
+
+//-----------------------------------------------------------------------------
+// List of all info camera links
+//-----------------------------------------------------------------------------
+CUtlFixedLinkedList<CInfoCameraLink *> g_InfoCameraLinkList;
+
+
+//-----------------------------------------------------------------------------
+// Save/load
+//-----------------------------------------------------------------------------
+BEGIN_DATADESC( CInfoCameraLink )
+
+ DEFINE_KEYFIELD( m_strPointCamera, FIELD_STRING, "PointCamera" ),
+
+ DEFINE_FIELD( m_hCamera, FIELD_EHANDLE ),
+ DEFINE_FIELD( m_hTargetEntity, FIELD_EHANDLE ),
+
+ // Outputs
+ DEFINE_INPUTFUNC( FIELD_STRING, "SetCamera", InputSetCamera ),
+
+END_DATADESC()
+
+
+LINK_ENTITY_TO_CLASS( info_camera_link, CInfoCameraLink );
+
+
+//-----------------------------------------------------------------------------
+// Constructor, destructor
+//-----------------------------------------------------------------------------
+CInfoCameraLink::CInfoCameraLink()
+{
+ g_InfoCameraLinkList.AddToTail( this );
+}
+
+CInfoCameraLink::~CInfoCameraLink()
+{
+ g_InfoCameraLinkList.FindAndRemove( this );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Called after all entities have spawned and after a load game.
+//-----------------------------------------------------------------------------
+void CInfoCameraLink::Activate()
+{
+ BaseClass::Activate();
+
+ // Checks necessary to prevent interference with CreateInfoCameraLink
+ if ( !m_hCamera )
+ {
+ SetCameraByName( STRING(m_strPointCamera) );
+ }
+
+ if ( !m_hTargetEntity )
+ {
+ m_hTargetEntity = gEntList.FindEntityByName( NULL, STRING(m_target) );
+ }
+}
+
+void CInfoCameraLink::SetCameraByName(const char *szName)
+{
+ CBaseEntity *pBaseEnt = gEntList.FindEntityByName( NULL, szName );
+ if( pBaseEnt )
+ {
+ m_hCamera = dynamic_cast<CPointCamera *>( pBaseEnt );
+ if ( m_hCamera )
+ {
+ // Keep the camera name consistent for save/load
+ m_strPointCamera = MAKE_STRING( szName );
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CInfoCameraLink::InputSetCamera(inputdata_t &inputdata)
+{
+ SetCameraByName( inputdata.value.String() );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CBaseEntity *CreateInfoCameraLink( CBaseEntity *pTarget, CPointCamera *pCamera )
+{
+ CInfoCameraLink *pInfoCameraLink = (CInfoCameraLink*)CreateEntityByName( "info_camera_link" );
+ if ( !pInfoCameraLink )
+ return NULL;
+
+ pInfoCameraLink->m_hCamera = pCamera;
+ pInfoCameraLink->m_hTargetEntity = pTarget;
+ pInfoCameraLink->Spawn();
+ return pInfoCameraLink;
+}
+
+
+//-----------------------------------------------------------------------------
+// Sets up visibility
+//-----------------------------------------------------------------------------
+void PointCameraSetupVisibility( CBaseEntity *pPlayer, int area, unsigned char *pvs, int pvssize )
+{
+ for ( CPointCamera *pCameraEnt = GetPointCameraList(); pCameraEnt != NULL; pCameraEnt = pCameraEnt->m_pNext )
+ {
+ pCameraEnt->SetActive( false );
+ }
+
+ int nNext;
+ for ( int i = g_InfoCameraLinkList.Head(); i != g_InfoCameraLinkList.InvalidIndex(); i = nNext )
+ {
+ nNext = g_InfoCameraLinkList.Next( i );
+
+ CBaseEntity *pTargetEnt = g_InfoCameraLinkList[i]->m_hTargetEntity;
+ if ( !pTargetEnt )
+ {
+ UTIL_Remove( g_InfoCameraLinkList[i] );
+ continue;
+ }
+
+ // Don't bother if it's not visible
+ if ( pTargetEnt->IsEffectActive( EF_NODRAW ) )
+ continue;
+
+ if ( !pTargetEnt->NetworkProp()->IsInPVS( pPlayer->edict(), pvs, pvssize ) )
+ continue;
+
+ if ( engine->CheckAreasConnected( area, pTargetEnt->NetworkProp()->AreaNum() ) )
+ {
+ CPointCamera *pCameraEnt = g_InfoCameraLinkList[i]->m_hCamera;
+ if ( pCameraEnt )
+ {
+ engine->AddOriginToPVS( pCameraEnt->GetAbsOrigin() );
+ pCameraEnt->SetActive( true );
+ }
+ }
+ }
+}
+