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.
125 lines
3.2 KiB
125 lines
3.2 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
// |
|
//=============================================================================// |
|
|
|
#include "cbase.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
// In this test, the server makes an entity (call it A) that has an EHANDLE to another |
|
// entity (call it B). Intitially, A is sent to the client but B is not. Later, |
|
// the server decides to send B to the client too. At that point, without resending A's EHANDLE, |
|
// the client's EHANDLE should access B. |
|
|
|
#if defined( GAME_DLL ) |
|
|
|
// ------------------------------------------------------------------------------------ // |
|
// The main entity class (class A). |
|
// ------------------------------------------------------------------------------------ // |
|
class CHandleTest : public CBaseEntity |
|
{ |
|
public: |
|
DECLARE_CLASS( CHandleTest, CBaseEntity ); |
|
DECLARE_SERVERCLASS(); |
|
|
|
CHandleTest() |
|
{ |
|
m_bSendHandle = false; |
|
} |
|
|
|
virtual int UpdateTransmitState() |
|
{ |
|
// ALWAYS transmit to all clients. |
|
return SetTransmitState( FL_EDICT_ALWAYS ); |
|
} |
|
|
|
virtual void SetTransmit( CCheckTransmitInfo *pInfo, bool bAlways ) |
|
{ |
|
if ( pInfo->m_pTransmitEdict->Get( entindex() ) ) |
|
return; |
|
|
|
BaseClass::SetTransmit( pInfo, bAlways ); |
|
|
|
// Force the thing we're pointing at to be sent too? |
|
if ( m_bSendHandle ) |
|
m_Handle->SetTransmit( pInfo, bAlways ); |
|
} |
|
|
|
CNetworkHandle( CBaseEntity, m_Handle ); |
|
CNetworkVar( bool, m_bSendHandle ); |
|
}; |
|
|
|
IMPLEMENT_SERVERCLASS_ST( CHandleTest, DT_HandleTest ) |
|
SendPropEHandle( SENDINFO( m_Handle ) ), |
|
SendPropInt( SENDINFO( m_bSendHandle ) ) |
|
END_SEND_TABLE() |
|
|
|
LINK_ENTITY_TO_CLASS( handle_test, CHandleTest ); |
|
|
|
|
|
// ------------------------------------------------------------------------------------ // |
|
// The class pointed to by the handle. |
|
// ------------------------------------------------------------------------------------ // |
|
class CHandleDummy : public CBaseEntity |
|
{ |
|
DECLARE_CLASS( CHandleDummy, CBaseEntity ); |
|
public: |
|
}; |
|
LINK_ENTITY_TO_CLASS( handle_dummy, CHandleDummy ); |
|
|
|
CHandle<CHandleTest> g_HandleTest; |
|
|
|
// The test runs this command. |
|
void CC_Test_EHandle() |
|
{ |
|
if ( g_HandleTest.Get() ) |
|
{ |
|
g_HandleTest->m_bSendHandle = !g_HandleTest->m_bSendHandle; |
|
} |
|
else |
|
{ |
|
CHandleTest *pHolder = CREATE_ENTITY( CHandleTest, "handle_test" ); |
|
pHolder->m_Handle = CREATE_ENTITY( CHandleDummy, "handle_dummy" ); |
|
pHolder->Spawn(); |
|
g_HandleTest = pHolder; |
|
Msg( "Created EHANDLE test entity. Run this command again to transmit the second ent.\n" ); |
|
} |
|
} |
|
ConCommand Test_EHandle( "Test_EHandle", CC_Test_EHandle, 0, FCVAR_CHEAT ); |
|
|
|
|
|
#else |
|
|
|
class C_HandleTest : public C_BaseEntity |
|
{ |
|
public: |
|
DECLARE_CLASS( C_HandleTest, C_BaseEntity ); |
|
DECLARE_CLIENTCLASS(); |
|
|
|
C_HandleTest() |
|
{ |
|
} |
|
|
|
virtual void OnDataChanged( DataUpdateType_t type ) |
|
{ |
|
Msg( "m_bSendHandle: %d, m_Handle.Get: 0x%p\n", m_bSendHandle, m_Handle.Get() ); |
|
} |
|
|
|
EHANDLE m_Handle; |
|
bool m_bSendHandle; |
|
}; |
|
|
|
IMPLEMENT_CLIENTCLASS_DT( C_HandleTest, DT_HandleTest, CHandleTest ) |
|
RecvPropEHandle( RECVINFO( m_Handle ) ), |
|
RecvPropInt( RECVINFO( m_bSendHandle ) ) |
|
END_RECV_TABLE() |
|
|
|
|
|
#endif |
|
|
|
|
|
|