EHANDLE: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
(Well, it i the contrary: ¨hPlayer = pPlayer assignes the eHandle to the pPlayer pointer and vice-versa. If I am wrong, correct again.)
No edit summary
Line 1: Line 1:
{{stub}}
Entities in the Source Engine are created and deleted all the time. Each time a new entity is instantiated, the engine looks up an unused entity-index and assigns this to the new entity. Once the entity is destroyed, its entity index becomes available again and may be reused for a different entity.


A common way to address a specific entity is by its entity index ( <code>CBaseEntity::entindex()</code> ). Each time a new entity is instantiated, the engine looks up an unused entity index and assigns it to the new entity. Once the entity object is destroyed, its entity index becomes available again and may be reused for a different entity. Therefore the entity index is not a good way to reference a specific entity over longer times. A better and safer way is to use an '''EHANDLE''' (or '''CBaseHandle''') to keep track of entity instances. An EHANDLE encapsulate a 32-bit ID that is unique for an entity instance during the whole game and can be used on both server and client to refer to entity objects (An EHANDLE is a combination of an entity index and an increasing serial number). An EHANDLE can be transformed to CBaseEntity and vice versa just by using its overloaded operators. If an EHANDLE resolves to <code>NULL</code>, the entity object is not valid anymore.
It's often nessary to keep track of an entity. This done mostly with pointers and entindex (index of the entity). However, when the entity is destroyed, using the pointer crashes (because it still points to a non-NULL location) and the entindex is not suitable because it may point to an other entity.


A better and safer way is to use an '''EHANDLE''' (or '''CBaseHandle''') to keep track of entities. An EHANDLE encapsulate a 32-bit ID that is unique for an entity instance during the whole game and can be used on both server and client to refer to entity objects (An EHANDLE is a combination of an entity index and an increasing serial number). An EHANDLE can be transformed to CBaseEntity and vice versa just by using its overloaded operators. If an EHANDLE resolves to <code>NULL</code>, the entity is not valid anymore.
== Example ==
<pre>
<pre>
// find a player, if no player is available pPlayer and hPlayer are NULL
// Find a player, if no player is available pPlayer and hPlayer are NULL
EHANDLE hPlayer = gEntList.FindEntityByClassname( NULL, "player" );
CBasePlayer* pPlayer = gEntList.FindEntityByClassname( NULL, "player" );
CBasePlayer *pPlayer = hPlayer; // convert entity pointer to EHANDLE
 
hPlayer = pPlayer; // convert EHANDLE into entity pointer
// Store it in a EHANDLE
EHANDLE hPlayer = pPlayer;
 
// Convert back to CBasePlayer
pPlayer = dynamic_cast<CBasePlayer*>((CBaseEntity*)hPlayer);
</pre>
</pre>
EHANDLEs must always be converted to the class CBaseEntity first, before casting to a derived class.


==Related content==
==Related content==

Revision as of 07:54, 23 August 2006

Entities in the Source Engine are created and deleted all the time. Each time a new entity is instantiated, the engine looks up an unused entity-index and assigns this to the new entity. Once the entity is destroyed, its entity index becomes available again and may be reused for a different entity.

It's often nessary to keep track of an entity. This done mostly with pointers and entindex (index of the entity). However, when the entity is destroyed, using the pointer crashes (because it still points to a non-NULL location) and the entindex is not suitable because it may point to an other entity.

A better and safer way is to use an EHANDLE (or CBaseHandle) to keep track of entities. An EHANDLE encapsulate a 32-bit ID that is unique for an entity instance during the whole game and can be used on both server and client to refer to entity objects (An EHANDLE is a combination of an entity index and an increasing serial number). An EHANDLE can be transformed to CBaseEntity and vice versa just by using its overloaded operators. If an EHANDLE resolves to NULL, the entity is not valid anymore.

Example

// Find a player, if no player is available pPlayer and hPlayer are NULL
CBasePlayer* pPlayer = gEntList.FindEntityByClassname( NULL, "player" );

// Store it in a EHANDLE
EHANDLE hPlayer = pPlayer;

// Convert back to CBasePlayer
pPlayer = dynamic_cast<CBasePlayer*>((CBaseEntity*)hPlayer);

EHANDLEs must always be converted to the class CBaseEntity first, before casting to a derived class.

Related content

Networking Entities