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/client/c_physmagnet.cpp | |
| download | archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip | |
Diffstat (limited to 'game/client/c_physmagnet.cpp')
| -rw-r--r-- | game/client/c_physmagnet.cpp | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/game/client/c_physmagnet.cpp b/game/client/c_physmagnet.cpp new file mode 100644 index 0000000..08a0f00 --- /dev/null +++ b/game/client/c_physmagnet.cpp @@ -0,0 +1,134 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// +#include "cbase.h" +#include "c_baseentity.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class C_PhysMagnet : public C_BaseAnimating +{ + DECLARE_CLASS( C_PhysMagnet, C_BaseAnimating ); +public: + DECLARE_CLIENTCLASS(); + + C_PhysMagnet(); + virtual ~C_PhysMagnet(); + + void PostDataUpdate( DataUpdateType_t updateType ); + bool GetShadowCastDirection( Vector *pDirection, ShadowType_t shadowType ) const; + +public: + // Data received from the server + CUtlVector< int > m_aAttachedObjectsFromServer; + + // Private list of entities on the magnet + CUtlVector< EHANDLE > m_aAttachedObjects; +}; + +//----------------------------------------------------------------------------- +// Purpose: RecvProxy that converts the Magnet's attached object entindexes to handles +//----------------------------------------------------------------------------- +void RecvProxy_MagnetAttachedObjectList( const CRecvProxyData *pData, void *pStruct, void *pOut ) +{ + C_PhysMagnet *pMagnet = (C_PhysMagnet*)pOut; + pMagnet->m_aAttachedObjectsFromServer[pData->m_iElement] = pData->m_Value.m_Int; +} + + +void RecvProxyArrayLength_MagnetAttachedArray( void *pStruct, int objectID, int currentArrayLength ) +{ + C_PhysMagnet *pMagnet = (C_PhysMagnet*)pStruct; + + if ( pMagnet->m_aAttachedObjectsFromServer.Size() != currentArrayLength ) + pMagnet->m_aAttachedObjectsFromServer.SetSize( currentArrayLength ); +} + +IMPLEMENT_CLIENTCLASS_DT(C_PhysMagnet, DT_PhysMagnet, CPhysMagnet) + + // ROBIN: Disabled because we don't need it anymore + /* + RecvPropArray2( + RecvProxyArrayLength_MagnetAttachedArray, + RecvPropInt( "magnetattached_array_element", 0, SIZEOF_IGNORE, 0, RecvProxy_MagnetAttachedObjectList ), + 128, + 0, + "magnetattached_array" + ) + */ + +END_RECV_TABLE() + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +C_PhysMagnet::C_PhysMagnet() +{ +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +C_PhysMagnet::~C_PhysMagnet() +{ +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void C_PhysMagnet::PostDataUpdate( DataUpdateType_t updateType ) +{ + BaseClass::PostDataUpdate( updateType ); + + /* + // First, detect any entities removed from the magnet and restore their shadows + int iCount = m_aAttachedObjects.Count(); + int iServerCount = m_aAttachedObjectsFromServer.Count(); + for ( int i = 0; i < iCount; i++ ) + { + int iEntIndex = m_aAttachedObjects[i]->entindex(); + for ( int j = 0; j < iServerCount; j++ ) + { + if ( iEntIndex == m_aAttachedObjectsFromServer[j] ) + break; + } + + if ( j == iServerCount ) + { + // Ok, a previously attached object is no longer attached + m_aAttachedObjects[i]->SetShadowUseOtherEntity( NULL ); + m_aAttachedObjects.Remove(i); + } + } + + // Make sure newly attached entities have vertical shadows too + for ( i = 0; i < iServerCount; i++ ) + { + C_BaseEntity *pEntity = cl_entitylist->GetEnt( m_aAttachedObjectsFromServer[i] ); + if ( m_aAttachedObjects.Find( pEntity ) == m_aAttachedObjects.InvalidIndex() ) + { + pEntity->SetShadowUseOtherEntity( this ); + m_aAttachedObjects.AddToTail( pEntity ); + } + } + */ +} + +//----------------------------------------------------------------------------- +// Purpose: Return a per-entity shadow cast direction +//----------------------------------------------------------------------------- +bool C_PhysMagnet::GetShadowCastDirection( Vector *pDirection, ShadowType_t shadowType ) const +{ + // Magnets shadow is more vertical than others + //Vector vecDown = g_pClientShadowMgr->GetShadowDirection() - Vector(0,0,1); + //VectorNormalize( vecDown ); + //*pDirection = vecDown; + *pDirection = Vector(0,0,-1); + return true; +}
\ No newline at end of file |