<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.frictionalgames.com/page?action=history&amp;feed=atom&amp;title=HPL3%2FScripting%2FScripting_Guide%2FObject_Handles</id>
	<title>HPL3/Scripting/Scripting Guide/Object Handles - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.frictionalgames.com/page?action=history&amp;feed=atom&amp;title=HPL3%2FScripting%2FScripting_Guide%2FObject_Handles"/>
	<link rel="alternate" type="text/html" href="https://wiki.frictionalgames.com/page?title=HPL3/Scripting/Scripting_Guide/Object_Handles&amp;action=history"/>
	<updated>2026-08-04T06:06:22Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>https://wiki.frictionalgames.com/page?title=HPL3/Scripting/Scripting_Guide/Object_Handles&amp;diff=7044&amp;oldid=prev</id>
		<title>TiMan: Created page with &quot;{{Hpl3ScriptingGuideMenuAdvanced}} {{shortPageTitle}} {| style=&quot;border:0px;&quot; cellspacing=&quot;0&quot; |- valign=&quot;top&quot; | style=&quot;padding-right:0.2em&quot; | An '''object handle''' is a variab...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.frictionalgames.com/page?title=HPL3/Scripting/Scripting_Guide/Object_Handles&amp;diff=7044&amp;oldid=prev"/>
		<updated>2026-07-30T08:01:48Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;{{Hpl3ScriptingGuideMenuAdvanced}} {{shortPageTitle}} {| style=&amp;quot;border:0px;&amp;quot; cellspacing=&amp;quot;0&amp;quot; |- valign=&amp;quot;top&amp;quot; | style=&amp;quot;padding-right:0.2em&amp;quot; | An &amp;#039;&amp;#039;&amp;#039;object handle&amp;#039;&amp;#039;&amp;#039; is a variab...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Hpl3ScriptingGuideMenuAdvanced}}&lt;br /&gt;
{{shortPageTitle}}&lt;br /&gt;
{| style=&amp;quot;border:0px;&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding-right:0.2em&amp;quot; |&lt;br /&gt;
An '''object handle''' is a variable that refers to an existing object instead of containing a separate copy of that object. Handles are used throughout HPL3: functions such as &amp;lt;code&amp;gt;Map_GetEntity&amp;lt;/code&amp;gt; return handles, and many engine methods accept handles as parameters.&lt;br /&gt;
&lt;br /&gt;
The handle symbol is &amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;. It is written after the object type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
iLuxEntity@ pEntity;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The variable above does not yet refer to an entity. An uninitialized handle is &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{note|This page describes AngelScript object handles. HPL3 also has the &amp;lt;code&amp;gt;tID&amp;lt;/code&amp;gt; type, which is commonly used to remember engine-owned objects safely across updates and save/load. Object handles and IDs are related, but they are not the same thing.}}&lt;br /&gt;
| style=&amp;quot;width:0.1%&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retrieving an object ==&lt;br /&gt;
&lt;br /&gt;
Most HPL3 objects are retrieved from an API or helper function rather than constructed directly. The function's return type shows whether it returns a handle. For example, &amp;lt;code&amp;gt;Map_GetEntity&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;iLuxEntity@&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void MoveEntity()&lt;br /&gt;
{&lt;br /&gt;
	iLuxEntity@ pEntity = Map_GetEntity(&amp;quot;MyEntity&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	if(pEntity is null)&lt;br /&gt;
	{&lt;br /&gt;
		cLux_AddDebugMessage(&amp;quot;Could not find MyEntity&amp;quot;);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	pEntity.SetPosition(cVector3f(55, 5, 25));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The compiler can infer that the returned object should be assigned to the handle, so the extra handle symbol is not required during initialization.&lt;br /&gt;
&lt;br /&gt;
Once a handle refers to an object, its members are accessed with the normal member access operator (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;). AngelScript automatically accesses the object to which the handle refers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
tString sName = pEntity.GetName();&lt;br /&gt;
cVector3f vPosition = pEntity.GetPosition();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Null handles ==&lt;br /&gt;
&lt;br /&gt;
The special value &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; means that a handle does not refer to an object. A handle can be null because:&lt;br /&gt;
&lt;br /&gt;
* it has not been assigned yet;&lt;br /&gt;
* a lookup function did not find a matching object;&lt;br /&gt;
* a cast failed;&lt;br /&gt;
* an HPL3-owned object was destroyed or became unavailable; or&lt;br /&gt;
* the handle was deliberately cleared.&lt;br /&gt;
&lt;br /&gt;
Use the identity operators &amp;lt;code&amp;gt;is&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;!is&amp;lt;/code&amp;gt; when checking handles:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
if(pEntity is null)&lt;br /&gt;
{&lt;br /&gt;
	// The handle is empty.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(pEntity !is null)&lt;br /&gt;
{&lt;br /&gt;
	// The handle currently refers to an object.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{warning|Do not access members through a null handle. Always check the result of a lookup when failure is possible. A missing map object, an incorrect name, or an incompatible cast can otherwise cause a script warning or runtime error.}}&lt;br /&gt;
&lt;br /&gt;
== Handle assignment ==&lt;br /&gt;
&lt;br /&gt;
More than one handle can refer to the same object. Changing the object through either handle changes that same underlying object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
iLuxEntity@ pFirst = Map_GetEntity(&amp;quot;MyEntity&amp;quot;);&lt;br /&gt;
iLuxEntity@ pSecond;&lt;br /&gt;
&lt;br /&gt;
@pSecond = @pFirst;&lt;br /&gt;
&lt;br /&gt;
if(pSecond !is null)&lt;br /&gt;
	pSecond.SetActive(false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt; placed before an expression means &amp;quot;use the handle itself.&amp;quot; It makes it explicit that &amp;lt;code&amp;gt;pSecond&amp;lt;/code&amp;gt; should be rebound to the same object as &amp;lt;code&amp;gt;pFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The compiler can infer handle assignment in many contexts:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
iLuxEntity@ pEntity = Map_GetEntity(&amp;quot;MyEntity&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For later reassignment, using the explicit form makes the intention clear:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
@pEntity = Map_GetEntity(&amp;quot;OtherEntity&amp;quot;);&lt;br /&gt;
@pEntity = null;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This distinction matters because an ordinary &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; expression can mean &amp;quot;assign to the referenced object&amp;quot; for types that implement an assignment operator, while &amp;lt;code&amp;gt;@=&amp;lt;/code&amp;gt; always rebinds the handle.&lt;br /&gt;
&lt;br /&gt;
== Comparing handles ==&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;is&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;!is&amp;lt;/code&amp;gt; to test whether two handles refer to the exact same object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
iLuxEntity@ pFirst = Map_GetEntity(&amp;quot;FirstEntity&amp;quot;);&lt;br /&gt;
iLuxEntity@ pSecond = Map_GetEntity(&amp;quot;SecondEntity&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
if(pFirst is pSecond)&lt;br /&gt;
{&lt;br /&gt;
	// Both handles refer to the same object.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The operators &amp;lt;code&amp;gt;==&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; may perform a value comparison defined by the object's class. They should not be used when the intention is to compare object identity.&lt;br /&gt;
&lt;br /&gt;
== Handles in functions ==&lt;br /&gt;
&lt;br /&gt;
Handles can be used as function parameters and return values:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void MoveTo(iLuxEntity@ apEntity, const cVector3f &amp;amp;in avPosition)&lt;br /&gt;
{&lt;br /&gt;
	if(apEntity is null)&lt;br /&gt;
		return;&lt;br /&gt;
&lt;br /&gt;
	apEntity.SetPosition(avPosition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
iLuxEntity@ FindEntity(const tString &amp;amp;in asName)&lt;br /&gt;
{&lt;br /&gt;
	iLuxEntity@ pEntity = Map_GetEntity(asName);&lt;br /&gt;
&lt;br /&gt;
	if(pEntity is null)&lt;br /&gt;
		return null;&lt;br /&gt;
&lt;br /&gt;
	return pEntity;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A handle parameter gives the function access to the same underlying object. The function can therefore call methods which change that object.&lt;br /&gt;
&lt;br /&gt;
The handle itself is passed by value. Rebinding the parameter to another object does not rebind the caller's handle. Passing the handle variable by reference is only required when the function must change which object the caller's handle refers to.&lt;br /&gt;
&lt;br /&gt;
== Handles, inheritance, and casting ==&lt;br /&gt;
&lt;br /&gt;
A handle to a base class or interface can refer to a compatible derived object. HPL3 uses this frequently; for example, &amp;lt;code&amp;gt;Map_GetEntity&amp;lt;/code&amp;gt; returns the base type &amp;lt;code&amp;gt;iLuxEntity@&amp;lt;/code&amp;gt;, while the actual object may be a prop, area, agent, or another entity type.&lt;br /&gt;
&lt;br /&gt;
When functionality from a more specific type is needed, cast the handle and check the result:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
iLuxEntity@ pEntity = Map_GetEntity(&amp;quot;MyProp&amp;quot;);&lt;br /&gt;
cLuxProp@ pProp = cast&amp;lt;cLuxProp&amp;gt;(pEntity);&lt;br /&gt;
&lt;br /&gt;
if(pProp is null)&lt;br /&gt;
{&lt;br /&gt;
	cLux_AddDebugMessage(&amp;quot;MyProp is not a compatible prop&amp;quot;);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Use cLuxProp-specific methods here.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An incompatible cast returns a null handle. See [[HPL3/Scripting/Scripting Guide/Type Casting|Type Casting]] for more information.&lt;br /&gt;
&lt;br /&gt;
== Handles in arrays ==&lt;br /&gt;
&lt;br /&gt;
An array may store object handles:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
array&amp;lt;iLuxEntity@&amp;gt; vEntities;&lt;br /&gt;
Map_GetEntityArray(&amp;quot;Lamp_*&amp;quot;, vEntities);&lt;br /&gt;
&lt;br /&gt;
for(uint i = 0; i &amp;lt; vEntities.length(); ++i)&lt;br /&gt;
{&lt;br /&gt;
	iLuxEntity@ pEntity = vEntities[i];&lt;br /&gt;
&lt;br /&gt;
	if(pEntity !is null)&lt;br /&gt;
		pEntity.SetActive(false);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each element in &amp;lt;code&amp;gt;array&amp;amp;lt;iLuxEntity@&amp;amp;gt;&amp;lt;/code&amp;gt; is a handle to an entity. Copying one of its elements creates another handle to the same entity; it does not copy the entity.&lt;br /&gt;
&lt;br /&gt;
Do not confuse an ''array of handles'' with a ''handle to an array'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
array&amp;lt;iLuxEntity@&amp;gt; vEntities; // An array whose elements are entity handles.&lt;br /&gt;
array&amp;lt;tString&amp;gt;@ pNames;       // A handle which can refer to an array object.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A handle to an array can be useful when several variables should operate on the same array rather than on separate copies.&lt;br /&gt;
&lt;br /&gt;
== Object lifetime in HPL3 ==&lt;br /&gt;
&lt;br /&gt;
For script-declared reference types, AngelScript keeps track of handles to an object. The object can remain alive while a valid handle still refers to it, and releasing the final handle allows it to be destroyed.&lt;br /&gt;
&lt;br /&gt;
HPL3 also exposes objects owned by the engine, such as entities, physics bodies, lights, particle systems, textures, GUI objects, and world objects. Their lifetime is controlled by the relevant HPL3 subsystem. A script handle to one of these objects must not be assumed to keep it alive. It may become invalid when, for example:&lt;br /&gt;
&lt;br /&gt;
* the object is destroyed;&lt;br /&gt;
* the map or entity data is reloaded;&lt;br /&gt;
* the player leaves the map;&lt;br /&gt;
* a temporary particle system or sound removes itself; or&lt;br /&gt;
* a resource is explicitly destroyed.&lt;br /&gt;
&lt;br /&gt;
Use engine handles as short-lived access variables, and reacquire objects when their lifetime may have changed.&lt;br /&gt;
&lt;br /&gt;
When explicitly destroying a resource, clear stored handles to it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
if(pTexture !is null)&lt;br /&gt;
{&lt;br /&gt;
	cResources_DestroyTexture(pTexture);&lt;br /&gt;
	@pTexture = null;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{warning|A non-null check proves only that the handle currently contains a reference. It is not a permanent guarantee that an HPL3-owned object will remain valid after the engine destroys or reloads it.}}&lt;br /&gt;
&lt;br /&gt;
== Persistent references and &amp;lt;code&amp;gt;tID&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Do not rely on a raw handle to an HPL3-owned map or world object as persistent saved state. The shipped game scripts normally store the object's &amp;lt;code&amp;gt;tID&amp;lt;/code&amp;gt;, then retrieve a temporary handle when the object is needed:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
class cTargetData&lt;br /&gt;
{&lt;br /&gt;
	tID mTargetID = tID_Invalid;&lt;br /&gt;
&lt;br /&gt;
	void SetTarget(iLuxEntity@ apEntity)&lt;br /&gt;
	{&lt;br /&gt;
		mTargetID = apEntity is null ? tID_Invalid : apEntity.GetID();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	iLuxEntity@ GetTarget()&lt;br /&gt;
	{&lt;br /&gt;
		if(mTargetID == tID_Invalid)&lt;br /&gt;
			return null;&lt;br /&gt;
&lt;br /&gt;
		return cLux_ID_Entity(mTargetID);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	void Update()&lt;br /&gt;
	{&lt;br /&gt;
		iLuxEntity@ pTarget = GetTarget();&lt;br /&gt;
&lt;br /&gt;
		if(pTarget is null)&lt;br /&gt;
		{&lt;br /&gt;
			mTargetID = tID_Invalid;&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Use pTarget only after validating it.&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The typed &amp;lt;code&amp;gt;cLux_ID_*&amp;lt;/code&amp;gt; functions return null if the ID cannot be resolved as the requested type. For example, &amp;lt;code&amp;gt;cLux_ID_Entity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cLux_ID_Body&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cLux_ID_Light&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;cLux_ID_Prop&amp;lt;/code&amp;gt; each return a corresponding object handle.&lt;br /&gt;
&lt;br /&gt;
Raw engine handles stored as class fields are generally transient. In classes which participate in HPL3's save system, mark such fields &amp;lt;code&amp;gt;[nosave]&amp;lt;/code&amp;gt; and reconstruct them when required:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
[nosave] iPhysicsBody@ mpBody = null;&lt;br /&gt;
tID mBodyID = tID_Invalid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tip|A useful rule is: use a local object handle while working with an object now; store a &amp;lt;code&amp;gt;tID&amp;lt;/code&amp;gt; when the reference must survive over time or through save/load.}}&lt;br /&gt;
&lt;br /&gt;
== Common mistakes ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mistake&lt;br /&gt;
! Correct approach&lt;br /&gt;
|-&lt;br /&gt;
| Calling a method immediately after a lookup which may fail.&lt;br /&gt;
| Store the returned handle and check it with &amp;lt;code&amp;gt;is null&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Using &amp;lt;code&amp;gt;== null&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;!= null&amp;lt;/code&amp;gt;.&lt;br /&gt;
| Use &amp;lt;code&amp;gt;is null&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;!is null&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Expecting a second handle to contain a copy of the object.&lt;br /&gt;
| Both handles refer to the same object; create a new instance if an independent object is required.&lt;br /&gt;
|-&lt;br /&gt;
| Using an ordinary assignment when the intention is to rebind a handle.&lt;br /&gt;
| Use explicit handle assignment, such as &amp;lt;code&amp;gt;@pTarget = @pOther;&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Keeping a raw handle to an engine-owned object as saved or long-lived state.&lt;br /&gt;
| Store its &amp;lt;code&amp;gt;tID&amp;lt;/code&amp;gt;, resolve it when needed, and validate the returned handle.&lt;br /&gt;
|-&lt;br /&gt;
| Assuming a successful base-to-derived cast.&lt;br /&gt;
| Check the resulting handle for &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Confusing &amp;lt;code&amp;gt;array&amp;amp;lt;Type@&amp;amp;gt;&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;array&amp;amp;lt;Type&amp;amp;gt;@&amp;lt;/code&amp;gt;.&lt;br /&gt;
| The first is an array of handles; the second is a handle to an array.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[HPL3/Scripting/Scripting Guide/Object Instances vs Object Handles|Object Instances vs Object Handles]]&lt;br /&gt;
* [[HPL3/Scripting/Scripting Guide/Type Casting|Type Casting]]&lt;br /&gt;
* [[HPL3/Scripting/ID Handles|ID Handles]]&lt;br /&gt;
* [[HPL3/Scripting/AngelScript Fundamentals/Chapter 8 - Classes|Classes - AngelScript]]&lt;br /&gt;
&lt;br /&gt;
{{NavBar|HPL3/Scripting/Scripting Guide/Working with Classes|Working with Classes|HPL3/Scripting/HPL3 Scripting Guide|HPL3 Scripting Guide|HPL3/Scripting/Scripting Guide/Object Instances vs Object Handles|Object Instances vs Object Handles}}&lt;br /&gt;
&lt;br /&gt;
[[Category:HPL3 Scripting]]&lt;br /&gt;
[[Category:English]]&lt;/div&gt;</summary>
		<author><name>TiMan</name></author>
		
	</entry>
</feed>