You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
5.2 KiB
183 lines
5.2 KiB
//========= 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 ); |
|
} |
|
} |
|
} |
|
} |
|
|
|
|