void SendProxy_EHandleToInt( const SendProp *pProp, const void *pStruct, const void *pVarData, DVariant *pOut, int iElement, int objectID) { CBaseHandle *pHandle = (CBaseHandle*)pVarData; if ( pHandle && pHandle->Get() ) { int iSerialNum = pHandle->GetSerialNumber() & (1 << NUM_NETWORKED_EHANDLE_SERIAL_NUMBER_BITS) - 1; pOut->m_Int = pHandle->GetEntryIndex() | (iSerialNum << MAX_EDICT_BITS); } else { pOut->m_Int = INVALID_NETWORKED_EHANDLE_VALUE; } }
IServerEntity *CServerTools::GetIServerEntity( IClientEntity *pClientEntity ) { if ( pClientEntity == NULL ) return NULL; CBaseHandle ehandle = pClientEntity->GetRefEHandle(); if ( ehandle.GetEntryIndex() >= MAX_EDICTS ) return NULL; // the first MAX_EDICTS entities are networked, the rest are client or server only #if 0 // this fails, since the server entities have extra bits in their serial numbers, // since 20 bits are reserved for serial numbers, except for networked entities, which are restricted to 10 // Brian believes that everything should just restrict itself to 10 to make things simpler, // so if/when he changes NUM_SERIAL_NUM_BITS to 10, we can switch back to this simpler code IServerNetworkable *pNet = gEntList.GetServerNetworkable( ehandle ); if ( pNet == NULL ) return NULL; CBaseEntity *pServerEnt = pNet->GetBaseEntity(); return pServerEnt; #else IHandleEntity *pEnt = gEntList.LookupEntityByNetworkIndex( ehandle.GetEntryIndex() ); if ( pEnt == NULL ) return NULL; CBaseHandle h = gEntList.GetNetworkableHandle( ehandle.GetEntryIndex() ); const int mask = ( 1 << NUM_NETWORKED_EHANDLE_SERIAL_NUMBER_BITS ) - 1; if ( !h.IsValid() || ( ( h.GetSerialNumber() & mask ) != ( ehandle.GetSerialNumber() & mask ) ) ) return NULL; IServerUnknown *pUnk = static_cast< IServerUnknown* >( pEnt ); return pUnk->GetBaseEntity(); #endif }
//----------------------------------------------------------------------------- // Returns an index from the given IntHandle. //----------------------------------------------------------------------------- bool IndexFromIntHandle( unsigned int iEntityHandle, unsigned int& output ) { if (iEntityHandle == (int) INVALID_EHANDLE_INDEX) return false; CBaseHandle hBaseHandle(iEntityHandle); unsigned int iEntityIndex; if (!IndexFromBaseHandle(hBaseHandle, iEntityIndex)) return false; edict_t* pEdict; if (!EdictFromIndex(iEntityIndex, pEdict)) return false; CBaseHandle hTestHandle; if (!BaseHandleFromEdict(pEdict, hTestHandle)) return false; if (!hTestHandle.IsValid() || hBaseHandle.GetSerialNumber() != hTestHandle.GetSerialNumber()) return false; output = iEntityIndex; return true; }