CHandle: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
(this just in: apparently not actually that slow)
(cleanup)
Line 3: Line 3:
'''CHandle''' is a C++ class that represents a 32-bit ID (entindex + serial number) unique to every past and present entity in a game. It is used to refer to entities where [[pointer]]s and [[entity index]]es are unsafe; mainly across the client/server divide and after restoring a saved game.
'''CHandle''' is a C++ class that represents a 32-bit ID (entindex + serial number) unique to every past and present entity in a game. It is used to refer to entities where [[pointer]]s and [[entity index]]es are unsafe; mainly across the client/server divide and after restoring a saved game.


{{tip|CHandles are slower to access than pointers. If you do create any pointers, and are supporting saved games, remember to repopulate them in <code>[[Restore()]]</code>!}}
{{tip|CHandles are slower to access than pointers. If you create pointers for access purposes and are supporting saved games, remember to repopulate them in <code>[[Restore()]]</code>!}}


== Usage ==
== Usage ==
Line 9: Line 9:
  CHandle<YourStoredClass> hMyHandle;
  CHandle<YourStoredClass> hMyHandle;


A CHandle is broadly similar to a pointer, but as it is a standard C++ class extra syntax is needed in some places:
A CHandle is broadly similar to a pointer, but as it is a custom C++ class, and not a built-in feature, extra syntax is needed in some places:


* You must assign a pointer to an object, not the object itself
* You must assign a pointer to the object, not the object itself.
* <code>Get()</code> or a cast is required access the class it is storing
* The <code>CHandle</code>'s <code>Get()</code> function, or a cast, is required access the class it is storing.
* <code>IsValid()</code> is required to check whether a value is stored
* <code>IsValid()</code> is used to check whether a value is stored.
* To invalidate, call <code>Term()</code> or assign <code>INVALID_EHANDLE_INDEX</code>.
* To invalidate, call <code>Term()</code> or assign <code>INVALID_EHANDLE_INDEX</code>.


Line 34: Line 34:
== See Also ==
== See Also ==


* [[Pointer]]
* [[Accessing other entities]]
* [[Entity index]]
* [[Entity index]]
* [[Networking_Entities#Networking_entities|Networking Entities]]
* [[Networking Entities#Networking_entities|Networking Entities]]


[[Category:Variables]]
[[Category:Variables]]

Revision as of 05:37, 31 July 2009

CHandle is a C++ class that represents a 32-bit ID (entindex + serial number) unique to every past and present entity in a game. It is used to refer to entities where pointers and entity indexes are unsafe; mainly across the client/server divide and after restoring a saved game.

Tip.pngTip:CHandles are slower to access than pointers. If you create pointers for access purposes and are supporting saved games, remember to repopulate them in Restore()!

Usage

CHandle<YourStoredClass> hMyHandle;

A CHandle is broadly similar to a pointer, but as it is a custom C++ class, and not a built-in feature, extra syntax is needed in some places:

  • You must assign a pointer to the object, not the object itself.
  • The CHandle's Get() function, or a cast, is required access the class it is storing.
  • IsValid() is used to check whether a value is stored.
  • To invalidate, call Term() or assign INVALID_EHANDLE_INDEX.

EHANDLE

CHandle is often used through the EHANDLE typedef, which is shorthand for CHandle<C_BaseEntity>. If you want to store a particular class it's better to declare a more specific CHandle manually (see previous section).

Example

// Create a pointer to an entity
CBasePlayer* pPlayer = gEntList.FindEntityByClassname( NULL, "player" );
 
// Store it (twice, for demonstration purposes)
EHANDLE hPlayer = pPlayer;
CHandle<CBasePlayer> hPlayer_ = pPlayer;
 
// Convert the EHANDLE back to a CBasePlayer pointer
pPlayer = dynamic_cast<CBasePlayer*>( hPlayer.Get() );

See Also