<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dark+Mole</id>
	<title>Second Life Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dark+Mole"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Dark_Mole"/>
	<updated>2026-07-24T17:14:59Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Viewer_URI_Name_Space&amp;diff=1195607</id>
		<title>Viewer URI Name Space</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Viewer_URI_Name_Space&amp;diff=1195607"/>
		<updated>2015-02-21T11:36:40Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: /* Syntax */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ProtocolNav}}&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The SL client supports links of the format secondlife://Region/123/45/67/, which have traditionally specified a region name and x/y/z location.  This means &amp;quot;run Second Life viewer and show Region on the world map&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The new URL scheme has 3 slashes, and allows direct control of the user interface and login.  For example, secondlife:///app/login&lt;br /&gt;
&lt;br /&gt;
Most secondlife:///app URLs only work from browser instances running inside Second Life because of a denial-of-service attack using secondlife:///app/teleport links to force repeated teleports.  SLURLs that work with external browsers include:&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;secondlife://&amp;lt;region name&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* secondlife:///app/login&lt;br /&gt;
&lt;br /&gt;
In chat, dialogs and other user interface elements, these URLs will be highlighted as clickable links, often with custom formatting including icons. The full functionality is available in Viewer 2.0 and up. Clickable links without formatting were available only in older versions&#039; chat and IM history.&lt;br /&gt;
&lt;br /&gt;
These links also may be known as &#039;&#039;Viewer URL Namespace&#039;&#039;, &#039;&#039;SLAPP URLs&#039;&#039; or &#039;&#039;Application SLURL&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Enclose your links in squared brackets, or they will in some cases (e.g. for ObjectIm - links) treat all text after the link as part of the link itself (which in most cases means, the text after the link will never display). Example:  &amp;amp;#91;secondlife&amp;amp;#58;&amp;amp;#47;&amp;amp;#47;&amp;amp;#47;app&amp;amp;#47;objectim&amp;amp;#47;190f571d-fdf1-8f6c-4e9d-973e9b5e0566?name=ObjectName&amp;amp;owner=c93c3129-2250-4c79-a5f7-8c755ca2707e&amp;amp;groupowned=true&amp;amp;slurl=Location&amp;amp;#47;128&amp;amp;#47;128&amp;amp;#47;27 ObjectName&amp;amp;#93;. In this case you will also need to ensure the object name has been escaped.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;secondlife:///&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
: &#039;&#039;&#039;&amp;lt;region_name&amp;gt;&#039;&#039;&#039; log in to this region or, if logged in, show information and offer teleport&lt;br /&gt;
:: &#039;&#039;&#039;/&amp;lt;local_x&amp;gt;&#039;&#039;&#039; optional X position, defaults to 128&lt;br /&gt;
::: &#039;&#039;&#039;/&amp;lt;local_y&amp;gt;&#039;&#039;&#039; optional Y position, defaults to 128&lt;br /&gt;
:::: &#039;&#039;&#039;/&amp;lt;local_z&amp;gt;&#039;&#039;&#039; optional Z position, defaults to 0&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;/app&#039;&#039;&#039;&lt;br /&gt;
:: &#039;&#039;&#039;/agent&#039;&#039;&#039;&lt;br /&gt;
::: &#039;&#039;&#039;/&amp;lt;agent_id&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:::: &#039;&#039;&#039;/about&#039;&#039;&#039; open agent&#039;s profile, with 2nd Life tab selected&lt;br /&gt;
:::: &#039;&#039;&#039;/inspect&#039;&#039;&#039; display info dialog for agent (2.0)&lt;br /&gt;
:::: &#039;&#039;&#039;/im&#039;&#039;&#039; start an IM session with the agent (2.0)&lt;br /&gt;
:::: &#039;&#039;&#039;/offerteleport&#039;&#039;&#039; display teleport offer dialog (2.0)&lt;br /&gt;
:::: &#039;&#039;&#039;/pay&#039;&#039;&#039; display pay resident dialog (2.0)&lt;br /&gt;
:::: &#039;&#039;&#039;/requestfriend&#039;&#039;&#039; display friendship offer dialog (2.0)&lt;br /&gt;
:::: &#039;&#039;&#039;/mute&#039;&#039;&#039; add to block list (2.0)&lt;br /&gt;
:::: &#039;&#039;&#039;/unmute&#039;&#039;&#039; remove from block list (2.0)&lt;br /&gt;
:::: &#039;&#039;&#039;/completename&#039;&#039;&#039; replace the URL with the avatar&#039;s display and user names,&lt;br /&gt;
:::::e.g., &amp;quot;hmm &amp;lt;nowiki&amp;gt;secondlife:///app/agent/eea40b5a-553d-4a07-b1ca-9f6e2f867814/complete&amp;lt;/nowiki&amp;gt; wow&amp;quot; in chat becomes &amp;quot;hmm Cerise (cerise.sorbet) wow&amp;quot; (2.4); see {{LSLGC|Avatar/Name}} for more details.&lt;br /&gt;
:::: &#039;&#039;&#039;/displayname&#039;&#039;&#039; replace the URL with the avatar&#039;s display name (2.4)&lt;br /&gt;
:::: &#039;&#039;&#039;/username&#039;&#039;&#039; replace the URL with the avatar&#039;s username e.g. &amp;quot;user.name&amp;quot; (2.4)&lt;br /&gt;
:: &#039;&#039;&#039;/appearance&#039;&#039;&#039;&lt;br /&gt;
::: &#039;&#039;&#039;/show&#039;&#039;&#039; display the sidebar appearance tab (2.0)&lt;br /&gt;
:: &#039;&#039;&#039;/balance&#039;&#039;&#039;&lt;br /&gt;
::: &#039;&#039;&#039;/request&#039;&#039;&#039; request a L$ balance update from the server (2.0)&lt;br /&gt;
:: &#039;&#039;&#039;/chat&#039;&#039;&#039;&lt;br /&gt;
::: &#039;&#039;&#039;/&amp;lt;channel&amp;gt;&#039;&#039;&#039; any channel number greater than 0 except [[DEBUG_CHANNEL]]&lt;br /&gt;
:::: &#039;&#039;&#039;/&amp;amp;lt;text&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:: &#039;&#039;&#039;/classified&#039;&#039;&#039;&lt;br /&gt;
::: &#039;&#039;&#039;/&amp;lt;classified_id&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:::: &#039;&#039;&#039;/about&#039;&#039;&#039; open floater describing classified&lt;br /&gt;
:: &#039;&#039;&#039;/event&#039;&#039;&#039;&lt;br /&gt;
::: &#039;&#039;&#039;/&amp;lt;event_id&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:::: &#039;&#039;&#039;/about&#039;&#039;&#039; open floater describing event&lt;br /&gt;
:: &#039;&#039;&#039;/group&#039;&#039;&#039;&lt;br /&gt;
::: &#039;&#039;&#039;/&amp;lt;group_id&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:::: &#039;&#039;&#039;/about&#039;&#039;&#039; open floater describing group&lt;br /&gt;
:::: &#039;&#039;&#039;/inspect&#039;&#039;&#039; display info dialog for group (2.0)&lt;br /&gt;
::: &#039;&#039;&#039;/create&#039;&#039;&#039; open the create group dialog (1.20)&lt;br /&gt;
::: &#039;&#039;&#039;/list&#039;&#039;&#039;&lt;br /&gt;
:::: &#039;&#039;&#039;/show&#039;&#039;&#039; open the list of groups to which user belongs (1.20)&lt;br /&gt;
:: &#039;&#039;&#039;/help&#039;&#039;&#039;&lt;br /&gt;
::: &#039;&#039;&#039;/&amp;lt;help_query&amp;gt;&#039;&#039;&#039; optional help topic (2.0)&lt;br /&gt;
:: &#039;&#039;&#039;/inventory&#039;&#039;&#039;&lt;br /&gt;
::: &#039;&#039;&#039;/&amp;lt;inventory_id&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:::: &#039;&#039;&#039;/select&#039;&#039;&#039; inventory offer (2.0)&lt;br /&gt;
::: &#039;&#039;&#039;/show&#039;&#039;&#039; open the inventory sidebar tab (2.0)&lt;br /&gt;
:: &#039;&#039;&#039;/login&#039;&#039;&#039; log in on launch. External and internal browsers.&lt;br /&gt;
::: see below for query parameters, of course, values are URL escaped&lt;br /&gt;
:: &#039;&#039;&#039;/maptrackavatar&#039;&#039;&#039;&lt;br /&gt;
::: &#039;&#039;&#039;/&amp;lt;friend_id&amp;gt;&#039;&#039;&#039; find a friend on the world map, requires permission (2.4)&lt;br /&gt;
:: &#039;&#039;&#039;/objectim&#039;&#039;&#039;&lt;br /&gt;
::: &#039;&#039;&#039;/&amp;lt;object_id&amp;gt;&#039;&#039;&#039; display an info dialog for the object sending this message (2.0)&lt;br /&gt;
:::: &#039;&#039;&#039;?name=&amp;lt;object_name&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:::: &#039;&#039;&#039;&amp;amp;owner=&amp;lt;owner_id&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:::: &#039;&#039;&#039;&amp;amp;groupowned=true&#039;&#039;&#039; (add if the object is deeded to a group)&lt;br /&gt;
:::: &#039;&#039;&#039;&amp;amp;slurl=&amp;lt;region&amp;gt;/&amp;lt;x&amp;gt;/&amp;lt;y&amp;gt;/&amp;lt;z&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:: &#039;&#039;&#039;/parcel&#039;&#039;&#039;&lt;br /&gt;
::: &#039;&#039;&#039;/&amp;lt;parcel_id&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:::: &#039;&#039;&#039;/about&#039;&#039;&#039; open floater describing place&lt;br /&gt;
:: &#039;&#039;&#039;&amp;lt;strike&amp;gt;/region&#039;&#039;&#039;&lt;br /&gt;
::: &#039;&#039;&#039;/&amp;lt;region_id&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:::: &#039;&#039;&#039;/about&#039;&#039;&#039; information from database about that region?  list of parcels?  covenant?&amp;lt;/strike&amp;gt;&lt;br /&gt;
:: &#039;&#039;&#039;/search&#039;&#039;&#039;&lt;br /&gt;
::: &#039;&#039;&#039;/&amp;lt;category&amp;gt;&#039;&#039;&#039; &amp;quot;all&amp;quot;, &amp;quot;people&amp;quot;, &amp;quot;places&amp;quot;, &amp;quot;events&amp;quot;, &amp;quot;groups&amp;quot;, &amp;quot;wiki&amp;quot;, &amp;quot;destinations&amp;quot;, &amp;quot;classifieds&amp;quot;&lt;br /&gt;
:::: &#039;&#039;&#039;/&amp;lt;search_term&amp;gt;&#039;&#039;&#039; open a search floater with matching results (2.0)&lt;br /&gt;
:: &#039;&#039;&#039;/sharewithavatar&#039;&#039;&#039;&lt;br /&gt;
::: &#039;&#039;&#039;/&amp;lt;agent_id&amp;gt;&#039;&#039;&#039; open an inventory share/IM window for agent (2.4)&lt;br /&gt;
:: &#039;&#039;&#039;/teleport&#039;&#039;&#039;&lt;br /&gt;
::: &#039;&#039;&#039;/&amp;lt;region_name&amp;gt;&#039;&#039;&#039; teleport instantly to this region, no dialog&lt;br /&gt;
:::: &#039;&#039;&#039;/&amp;lt;local_x&amp;gt;&#039;&#039;&#039; optional X position, defaults to 128&lt;br /&gt;
::::: &#039;&#039;&#039;/&amp;lt;local_y&amp;gt;&#039;&#039;&#039; optional Y position, defaults to 128&lt;br /&gt;
:::::: &#039;&#039;&#039;/&amp;lt;local_z&amp;gt;&#039;&#039;&#039; optional Z position, defaults to 0&lt;br /&gt;
:: &#039;&#039;&#039;/voicecallavatar&#039;&#039;&#039;&lt;br /&gt;
::: &#039;&#039;&#039;/&amp;lt;agent_id&amp;gt;&#039;&#039;&#039; start a private voice session (2.4)&lt;br /&gt;
:: &#039;&#039;&#039;/wear_folder&#039;&#039;&#039;&lt;br /&gt;
::: &#039;&#039;&#039;/?folder_id=&amp;lt;inventory_folder_uuid&amp;gt;&#039;&#039;&#039; replace outfit with contents of specified folder (2.6)&lt;br /&gt;
:: &#039;&#039;&#039;/worldmap&#039;&#039;&#039; open the map with this destination selected (2.0)&lt;br /&gt;
::: &#039;&#039;&#039;/&amp;lt;region_name&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:::: &#039;&#039;&#039;/&amp;lt;local_x&amp;gt;&#039;&#039;&#039; optional X position, defaults to 128&lt;br /&gt;
::::: &#039;&#039;&#039;/&amp;lt;local_y&amp;gt;&#039;&#039;&#039; optional Y position, defaults to 128&lt;br /&gt;
:::::: &#039;&#039;&#039;/&amp;lt;local_z&amp;gt;&#039;&#039;&#039; optional Z position, defaults to 0&lt;br /&gt;
&lt;br /&gt;
This could be extended to things like:&lt;br /&gt;
: &#039;&#039;&#039;/app/event/&amp;lt;event_id&amp;gt;/subscribe&#039;&#039;&#039; to register for notifications&lt;br /&gt;
: &#039;&#039;&#039;/app/parcel/&amp;lt;parcel_id&amp;gt;/teleport&#039;&#039;&#039; to teleport to a specific location&lt;br /&gt;
&lt;br /&gt;
== Login Query Parameters ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| first || the account first name&lt;br /&gt;
|-&lt;br /&gt;
| last || the account last name&lt;br /&gt;
|-&lt;br /&gt;
| session || the secure session id&lt;br /&gt;
|-&lt;br /&gt;
| location || login location, format TBD, optional&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string Who(key id)&lt;br /&gt;
{&lt;br /&gt;
    return &amp;quot;secondlife:///app/agent/&amp;quot; + (string)id + &amp;quot;/inspect&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        llSay(0, &amp;quot;Touched by &amp;quot; + Who(llDetectedKey(0)) + &amp;quot;.&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Name Spaces]]&lt;br /&gt;
[[Category:Search]]&lt;br /&gt;
[[Category:LSL Chat]]&lt;br /&gt;
[[Category:LSL_Dialog]]&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE&amp;diff=1173571</id>
		<title>CHARACTER TYPE</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE&amp;diff=1173571"/>
		<updated>2012-10-16T18:52:26Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Added path_update to the relevant events&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_TYPE&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=6&lt;br /&gt;
|desc=Used in combination with one of the character type flags. The default is [[CHARACTER_TYPE_NONE]], other options are [[CHARACTER_TYPE_A]], [[CHARACTER_TYPE_B]], [[CHARACTER_TYPE_C]] and [[CHARACTER_TYPE_D]]. Note that the character type is not used to describe the behavior of the [[Pathfinding]] object but is used to describe the kind of surface and terrain that it prefers to travel. For example, a cow designed for a field should use character type B, but sheep designed to be herded along a road should use character type C.&lt;br /&gt;
{{LSL_Constants/llCreateCharacter|}}&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_A}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_B}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_C}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_D}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_NONE}}|3={{#var:comment}}}}&lt;br /&gt;
|functions=[[llCreateCharacter]], [[llUpdateCharacter]]&lt;br /&gt;
|events=[[Path update|path_update]]&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=TRAVERSAL_TYPE&amp;diff=1173567</id>
		<title>TRAVERSAL TYPE</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=TRAVERSAL_TYPE&amp;diff=1173567"/>
		<updated>2012-10-16T10:01:57Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Initial draft of the page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=TRAVERSAL_TYPE&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=7&lt;br /&gt;
|desc=Used in combination with one of the traversal type flags. The default is [[TRAVERSAL_TYPE_SLOW]], other options are [[TRAVERSAL_TYPE_FAST]] and [[TRAVERSAL_TYPE_NONE]]. &lt;br /&gt;
{{LSL_Constants/llCreateCharacter|}}&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|TRAVERSAL_TYPE}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|TRAVERSAL_TYPE_FAST}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|TRAVERSAL_TYPE_SLOW}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|TRAVERSAL_TYPE_NONE}}|3={{#var:comment}}}}&lt;br /&gt;
|functions=[[llCreateCharacter]], [[llUpdateCharacter]]&lt;br /&gt;
|events=[[path_update]]&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_ORIENTATION&amp;diff=1173566</id>
		<title>CHARACTER ORIENTATION</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_ORIENTATION&amp;diff=1173566"/>
		<updated>2012-10-16T09:56:24Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Defined the associated constants.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_ORIENTATION&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=4&lt;br /&gt;
|desc=Constant used to indicate that the following argument is the orientation of the capsule for a [[Pathfinding]] character. This is used to help denote how to interpret the size of a character.&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_ORIENTATION}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|VERTICAL}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|HORIZONTAL}}|3={{#var:comment}}}}&lt;br /&gt;
|functions=[[llCreateCharacter]], [[llUpdateCharacter]]&lt;br /&gt;
|events=[[path_update]]&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=HORIZONTAL&amp;diff=1173565</id>
		<title>HORIZONTAL</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=HORIZONTAL&amp;diff=1173565"/>
		<updated>2012-10-16T09:55:42Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Added the character orientation constant to the list of constants.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=HORIZONTAL&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=1&lt;br /&gt;
|desc=Constant to indicate that the orientation of the capsule for a [[Pathfinding]] character is horizontal.&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_ORIENTATION}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|VERTICAL}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|HORIZONTAL}}|3={{#var:comment}}}}&lt;br /&gt;
|functions=[[llCreateCharacter]], [[llUpdateCharacter]]&lt;br /&gt;
|events=[[path_update]]&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=VERTICAL&amp;diff=1173564</id>
		<title>VERTICAL</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=VERTICAL&amp;diff=1173564"/>
		<updated>2012-10-16T09:55:09Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Added the character orientation constant to the list of constants.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=VERTICAL&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=0&lt;br /&gt;
|desc=Constant to indicate that the orientation of the capsule for a [[Pathfinding]] character is vertical.&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_ORIENTATION}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|VERTICAL}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|HORIZONTAL}}|3={{#var:comment}}}}&lt;br /&gt;
|functions=[[llCreateCharacter]], [[llUpdateCharacter]]&lt;br /&gt;
|events=[[path_update]]&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_ORIENTATION&amp;diff=1173563</id>
		<title>CHARACTER ORIENTATION</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_ORIENTATION&amp;diff=1173563"/>
		<updated>2012-10-16T09:53:47Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Initial draft of the page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_ORIENTATION&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=4&lt;br /&gt;
|desc=Constant used to indicate that the following argument is the orientation of the capsule for a [[Pathfinding]] character. This is used to help denote how to interpret the size of a character.&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
|functions=[[llCreateCharacter]], [[llUpdateCharacter]]&lt;br /&gt;
|events=[[path_update]]&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_LENGTH&amp;diff=1173562</id>
		<title>CHARACTER LENGTH</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_LENGTH&amp;diff=1173562"/>
		<updated>2012-10-16T09:52:25Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Added the path_update event to the relevant events.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_LENGTH&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=3&lt;br /&gt;
|desc=Constant used to indicate that the following argument is the length of the capsule for a [[Pathfinding]] character. This is used to help denote the size of the character.&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
|functions=[[llCreateCharacter]], [[llUpdateCharacter]]&lt;br /&gt;
|events=[[path_update]]&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_NONE&amp;diff=1173561</id>
		<title>CHARACTER TYPE NONE</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_NONE&amp;diff=1173561"/>
		<updated>2012-10-16T09:51:32Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Added the path_update event to the relevant events.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_TYPE_NONE&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=4&lt;br /&gt;
|desc=Used to set no specific character type.&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_A}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_B}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_C}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_D}}|3={{#var:comment}}}}&lt;br /&gt;
|functions&lt;br /&gt;
|events=[[path_update]]&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_D&amp;diff=1173560</id>
		<title>CHARACTER TYPE D</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_D&amp;diff=1173560"/>
		<updated>2012-10-16T09:51:16Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_TYPE_D&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=3&lt;br /&gt;
|desc=Used for character types that are not consistent with the A, B, or C type.&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_A}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_B}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_C}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_NONE}}|3={{#var:comment}}}}&lt;br /&gt;
|functions&lt;br /&gt;
|events=[[path_update]]&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_C&amp;diff=1173559</id>
		<title>CHARACTER TYPE C</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_C&amp;diff=1173559"/>
		<updated>2012-10-16T09:51:02Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Added the path_update event to the relevant events.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_TYPE_C&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=2&lt;br /&gt;
|desc=Used for mechanical character types or road going vehicles.&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_A}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_B}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_D}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_NONE}}|3={{#var:comment}}}}&lt;br /&gt;
|functions&lt;br /&gt;
|events=[[path_update]]&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_B&amp;diff=1173558</id>
		<title>CHARACTER TYPE B</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_B&amp;diff=1173558"/>
		<updated>2012-10-16T09:50:40Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Added the path_update event to the relevant events.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_TYPE_B&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=1&lt;br /&gt;
|desc=Used for character types that you prefer move in a way consistent with wild animals or off road vehicles.&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_A}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_C}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_D}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_NONE}}|3={{#var:comment}}}}&lt;br /&gt;
|functions&lt;br /&gt;
|events=[[path_update]]&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_A&amp;diff=1173557</id>
		<title>CHARACTER TYPE A</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_A&amp;diff=1173557"/>
		<updated>2012-10-16T09:50:15Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Added the path_update event to the relevant events.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_TYPE_A&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=0&lt;br /&gt;
|desc=Used for character types that you prefer move in a way consistent with humanoids.&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_B}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_C}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_D}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_NONE}}|3={{#var:comment}}}}&lt;br /&gt;
|functions&lt;br /&gt;
|events=[[path_update]]&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=HORIZONTAL&amp;diff=1173556</id>
		<title>HORIZONTAL</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=HORIZONTAL&amp;diff=1173556"/>
		<updated>2012-10-16T09:49:30Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Initial draft of the page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=HORIZONTAL&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=1&lt;br /&gt;
|desc=Constant to indicate that the orientation of the capsule for a [[Pathfinding]] character is horizontal.&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|VERTICAL}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|HORIZONTAL}}|3={{#var:comment}}}}&lt;br /&gt;
|functions=[[llCreateCharacter]], [[llUpdateCharacter]]&lt;br /&gt;
|events=[[path_update]]&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=VERTICAL&amp;diff=1173555</id>
		<title>VERTICAL</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=VERTICAL&amp;diff=1173555"/>
		<updated>2012-10-16T09:48:37Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Initial draft of the page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=VERTICAL&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=0&lt;br /&gt;
|desc=Constant to indicate that the orientation of the capsule for a [[Pathfinding]] character is vertical.&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|VERTICAL}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|HORIZONTAL}}|3={{#var:comment}}}}&lt;br /&gt;
|functions=[[llCreateCharacter]], [[llUpdateCharacter]]&lt;br /&gt;
|events=[[path_update]]&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_LENGTH&amp;diff=1173554</id>
		<title>CHARACTER LENGTH</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_LENGTH&amp;diff=1173554"/>
		<updated>2012-10-16T09:44:21Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Initial draft of the page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_LENGTH&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=3&lt;br /&gt;
|desc=Constant used to indicate that the following argument is the length of the capsule for a [[Pathfinding]] character. This is used to help denote the size of the character.&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
|functions=[[llCreateCharacter]], [[llUpdateCharacter]]&lt;br /&gt;
|events&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_RADIUS&amp;diff=1173553</id>
		<title>CHARACTER RADIUS</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_RADIUS&amp;diff=1173553"/>
		<updated>2012-10-16T09:43:29Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Initial draft of the page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_RADIUS&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=2&lt;br /&gt;
|desc=Constant used to indicate that the following argument is the radius of the capsule for a [[Pathfinding]] character. This is used to help denote the size of the character.&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
|functions=[[llCreateCharacter]], [[llUpdateCharacter]]&lt;br /&gt;
|events&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_DESIRED_SPEED&amp;diff=1173552</id>
		<title>CHARACTER DESIRED SPEED</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_DESIRED_SPEED&amp;diff=1173552"/>
		<updated>2012-10-16T09:42:17Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Initial draft of the page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_DESIRED_SPEED&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=1&lt;br /&gt;
|desc=Constant used to indicate that the following argument is the desired speed for a [[Pathfinding]] character.&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
|functions=[[llCreateCharacter]], [[llUpdateCharacter]]&lt;br /&gt;
|events&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE&amp;diff=1173551</id>
		<title>CHARACTER TYPE</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE&amp;diff=1173551"/>
		<updated>2012-10-16T09:33:31Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: changed the wording to be consistent with the description at http://community.secondlife.com/t5/Second-Life-Server/Pathfinding-FAQ/td-p/1672699&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_TYPE&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=6&lt;br /&gt;
|desc=Used in combination with one of the character type flags. The default is [[CHARACTER_TYPE_NONE]], other options are [[CHARACTER_TYPE_A]], [[CHARACTER_TYPE_B]], [[CHARACTER_TYPE_C]] and [[CHARACTER_TYPE_D]]. Note that the character type is not used to describe the behavior of the [[Pathfinding]] object but is used to describe the kind of surface and terrain that it prefers to travel. For example, a cow designed for a field should use character type B, but sheep designed to be herded along a road should use character type C.&lt;br /&gt;
{{LSL_Constants/llCreateCharacter|}}&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_A}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_B}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_C}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_D}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_NONE}}|3={{#var:comment}}}}&lt;br /&gt;
|functions=[[llCreateCharacter]], [[llUpdateCharacter]]&lt;br /&gt;
|events&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_D&amp;diff=1173550</id>
		<title>CHARACTER TYPE D</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_D&amp;diff=1173550"/>
		<updated>2012-10-16T09:25:44Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: changed the wording to be consistent with the description at http://community.secondlife.com/t5/Second-Life-Server/Pathfinding-FAQ/td-p/1672699&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_TYPE_D&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=3&lt;br /&gt;
|desc=Used for character types that are not consistent with the A, B, or C type.&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_A}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_B}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_C}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_NONE}}|3={{#var:comment}}}}&lt;br /&gt;
|functions&lt;br /&gt;
|events&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_C&amp;diff=1173549</id>
		<title>CHARACTER TYPE C</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_C&amp;diff=1173549"/>
		<updated>2012-10-16T09:24:07Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: changed the wording to be consistent with the description at http://community.secondlife.com/t5/Second-Life-Server/Pathfinding-FAQ/td-p/1672699&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_TYPE_C&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=2&lt;br /&gt;
|desc=Used for mechanical character types or road going vehicles.&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_A}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_B}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_D}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_NONE}}|3={{#var:comment}}}}&lt;br /&gt;
|functions&lt;br /&gt;
|events&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_B&amp;diff=1173548</id>
		<title>CHARACTER TYPE B</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_B&amp;diff=1173548"/>
		<updated>2012-10-16T09:23:21Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: changed the wording to be consistent with the description at http://community.secondlife.com/t5/Second-Life-Server/Pathfinding-FAQ/td-p/1672699&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_TYPE_B&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=1&lt;br /&gt;
|desc=Used for character types that you prefer move in a way consistent with wild animals or off road vehicles.&lt;br /&gt;
|examples&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_A}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_C}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_D}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CHARACTER_TYPE_NONE}}|3={{#var:comment}}}}&lt;br /&gt;
|functions&lt;br /&gt;
|events&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pathfinding_Simple_Roaming_Example_With_Evade_Pursue&amp;diff=1173318</id>
		<title>Pathfinding Simple Roaming Example With Evade Pursue</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pathfinding_Simple_Roaming_Example_With_Evade_Pursue&amp;diff=1173318"/>
		<updated>2012-10-11T12:10:06Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: moved the change to the default state in the changed event.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
A simple example is provided to use [[Pathfinding]] to have an object randomly roam around a small area is given below and randomly evade or pursue a person who touches it. The script is designed to have the object move around in a small area centered at the start location. The object will move back to its start position if anything goes wrong or a group member touches it. &lt;br /&gt;
&lt;br /&gt;
The script has five states. In the default state the object is not moving and can be placed in its start position. From the default state it can transition into the &#039;&#039;Roaming&#039;&#039; state by touching it as a member of the same group. In the &#039;&#039;Roaming&#039;&#039; state it will simply wander around in a small area centered at the start point. If anything goes wrong with the [[Pathfinding]] functions or a group member touches it, the script will transition into the &#039;&#039;TravelHome&#039;&#039; state. &lt;br /&gt;
&lt;br /&gt;
In the &#039;&#039;TravelHome&#039;&#039; state the script will attempt to move the object back to its start position using the [[Pathfinding]] functions. If anything goes wrong with the [[Pathfinding]] functions or a group member touches it, the script will delete the [[Pathfinding]] character and manually move the object back to its start position using the [[LlSetRegionPos|llSetRegionPos]] function. It will then transition back into the &#039;&#039;default&#039;&#039; state.&lt;br /&gt;
&lt;br /&gt;
If someone touches this object while it is roaming who is not in the same group there is a small chance that it will either evade or pursue the person. If the decision is to evade then the script transitions to the &#039;&#039;Evade_Agent&#039;&#039; state. If the decision is to chase the agent then the script transitions to the &#039;&#039;Chase_Agent&#039;&#039; state.&lt;br /&gt;
&lt;br /&gt;
This code is licensed under the [http://www.gnu.org/licenses/gpl.html|GNU General Public License]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* *****************************************************************&lt;br /&gt;
&lt;br /&gt;
   %%% Desc:   Simple example script to demonstrate pathfinding&lt;br /&gt;
   %%% Author: Dark Mole (contact via IM within Second Life)&lt;br /&gt;
   %%% File:   $HeadURL: simpleMoverWithChaseAndEvade.sl $&lt;br /&gt;
   %%% Date:   $Date: Thu Oct 11 04:44:14 2012 $&lt;br /&gt;
   %%% Revision: $Rev: .04 $&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
   Copyright 2012 Dark Mole (contact via IM in Second Life&lt;br /&gt;
&lt;br /&gt;
   This program is free software: you can redistribute it and/or&lt;br /&gt;
   modify it under the terms of the GNU General Public License as&lt;br /&gt;
   published by the Free Software Foundation, either version 3 of the&lt;br /&gt;
   License, or (at your option) any later version.&lt;br /&gt;
&lt;br /&gt;
   This program is distributed in the hope that it will be useful, but&lt;br /&gt;
   WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of&lt;br /&gt;
   MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU&lt;br /&gt;
   General Public License for more details.&lt;br /&gt;
&lt;br /&gt;
   You should have received a copy of the GNU General Public License&lt;br /&gt;
   along with this program.  If not, see&lt;br /&gt;
   &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   A copy of this script can be found at&lt;br /&gt;
   https://wiki.secondlife.com/wiki/Pathfinding_Simple_Roaming_Example_With_Evade_Pursue&lt;br /&gt;
&lt;br /&gt;
***************************************************************** */&lt;br /&gt;
&lt;br /&gt;
// Configuration variables.&lt;br /&gt;
// Things to change to impact the behavior of the system&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
float TIME_TO_WAIT_BEFORE_MOVING = 300.0; // number of seconds to wait&lt;br /&gt;
                                          // while in the default&lt;br /&gt;
                                          // state before it&lt;br /&gt;
                                          // automatically starts to&lt;br /&gt;
                                          // roam on its own. Note&lt;br /&gt;
                                          // that the first time this&lt;br /&gt;
                                          // thing rezzes this timer&lt;br /&gt;
                                          // is ignored.&lt;br /&gt;
&lt;br /&gt;
// Global Variables. (do not change unless you know what they do!)&lt;br /&gt;
&lt;br /&gt;
// Location related variables&lt;br /&gt;
&lt;br /&gt;
vector   home_position = &amp;lt;-1.0,0.0,0.0&amp;gt;;&lt;br /&gt;
rotation home_rotation = ZERO_ROTATION;&lt;br /&gt;
string   home_region   = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
vector wondering_radius = &amp;lt;5.0,5.0,20.0&amp;gt;; // how far I can roam around&lt;br /&gt;
list   wondering_parameters = &lt;br /&gt;
  [CHARACTER_MAX_SPEED,         1.0,        // parameters describing&lt;br /&gt;
   CHARACTER_DESIRED_SPEED,     0.2,       // how I can roam.&lt;br /&gt;
   CHARACTER_DESIRED_TURN_SPEED,0.02,&lt;br /&gt;
   CHARACTER_MAX_ACCEL,         0.5,&lt;br /&gt;
   CHARACTER_MAX_DECEL,         0.5,&lt;br /&gt;
   CHARACTER_ORIENTATION,       VERTICAL,&lt;br /&gt;
   TRAVERSAL_TYPE,              TRAVERSAL_TYPE_SLOW,&lt;br /&gt;
   CHARACTER_TYPE,              CHARACTER_TYPE_A, &lt;br /&gt;
   CHARACTER_MAX_TURN_RADIUS,   0.5];&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
list traveling_parameters = &lt;br /&gt;
  [CHARACTER_MAX_SPEED,         5.0,        // parameters describing&lt;br /&gt;
   CHARACTER_DESIRED_SPEED,     3.0,        // how I can roam when &lt;br /&gt;
   CHARACTER_DESIRED_TURN_SPEED,2.0,        // traveling..&lt;br /&gt;
   CHARACTER_MAX_ACCEL,         3.0,&lt;br /&gt;
   CHARACTER_MAX_DECEL,         3.0,&lt;br /&gt;
   CHARACTER_ORIENTATION,       VERTICAL,&lt;br /&gt;
   TRAVERSAL_TYPE,              TRAVERSAL_TYPE_SLOW,&lt;br /&gt;
   CHARACTER_TYPE,              CHARACTER_TYPE_A, &lt;br /&gt;
   CHARACTER_MAX_TURN_RADIUS,   1.5];&lt;br /&gt;
&lt;br /&gt;
list   chasing_parameters = &lt;br /&gt;
  [CHARACTER_MAX_SPEED,         15.0,       // parameters describing&lt;br /&gt;
   CHARACTER_DESIRED_SPEED,     10.0,      // how I can chase someone.&lt;br /&gt;
   CHARACTER_DESIRED_TURN_SPEED,8.0, &lt;br /&gt;
   CHARACTER_MAX_ACCEL,         7.5,&lt;br /&gt;
   CHARACTER_MAX_DECEL,         7.5,&lt;br /&gt;
   CHARACTER_ORIENTATION,       VERTICAL,&lt;br /&gt;
   TRAVERSAL_TYPE,              TRAVERSAL_TYPE_FAST,&lt;br /&gt;
   CHARACTER_TYPE,              CHARACTER_TYPE_A, &lt;br /&gt;
   CHARACTER_MAX_TURN_RADIUS,   0.8,&lt;br /&gt;
   CHARACTER_AVOIDANCE_MODE,    AVOID_DYNAMIC_OBSTACLES];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Variables associated with the state of the script&lt;br /&gt;
integer active_character = FALSE;&lt;br /&gt;
key     agentToChase     = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
// Helper functions &lt;br /&gt;
&lt;br /&gt;
/* *********************************************************&lt;br /&gt;
   forceMoveHome(integer resetScript)&lt;br /&gt;
&lt;br /&gt;
   Routine to force the object to go home. The option &amp;quot;resetScript&amp;quot; is&lt;br /&gt;
   to determine if the script should be reset when it is in the same&lt;br /&gt;
   region it started from.&lt;br /&gt;
&lt;br /&gt;
********************************************************* */&lt;br /&gt;
forceMoveHome(integer resetScript)&lt;br /&gt;
{&lt;br /&gt;
  // Stop and delete the character&lt;br /&gt;
  llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
  llDeleteCharacter();&lt;br /&gt;
  active_character = FALSE;&lt;br /&gt;
  if(home_region == llGetRegionName())&lt;br /&gt;
    {&lt;br /&gt;
      // I am in the same home region. Just move close to the start&lt;br /&gt;
      // point.&lt;br /&gt;
      llSetRegionPos(home_position);&lt;br /&gt;
      if(resetScript)&lt;br /&gt;
        {&lt;br /&gt;
          llSetPos(home_position);&lt;br /&gt;
          llSetRot(home_rotation);&lt;br /&gt;
          llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  else&lt;br /&gt;
    {&lt;br /&gt;
      llInstantMessage(llGetOwner(),&amp;quot;There is an error. &amp;quot; +&lt;br /&gt;
                       &amp;quot;I wondered away from my start region and cannot go back home.\n&amp;quot; +&lt;br /&gt;
                       &amp;quot;I am located in &amp;quot; + llGetRegionName() + &amp;quot; at &amp;quot; + &lt;br /&gt;
                       (string)llGetPos());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Primary (default) state.&lt;br /&gt;
// This is the initial state when the program resets.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object waits for a touch to get started. There is&lt;br /&gt;
// a random chance that it might start moving at any time step though.&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        if(home_position.x &amp;lt; 0.0)&lt;br /&gt;
          {&lt;br /&gt;
            // This is the first time to enter this state. Do a little&lt;br /&gt;
            // house cleaning to start the season.&lt;br /&gt;
&lt;br /&gt;
            // Add any parts to the different parameters that require any&lt;br /&gt;
            // calculations.&lt;br /&gt;
            wondering_parameters += &lt;br /&gt;
              [CHARACTER_AVOIDANCE_MODE, AVOID_CHARACTERS | AVOID_DYNAMIC_OBSTACLES];&lt;br /&gt;
            traveling_parameters += &lt;br /&gt;
              [CHARACTER_AVOIDANCE_MODE, AVOID_CHARACTERS | AVOID_DYNAMIC_OBSTACLES];&lt;br /&gt;
&lt;br /&gt;
            // Set the initial home position and orientation.&lt;br /&gt;
            home_position = llGetPos();&lt;br /&gt;
            home_rotation = llGetRot();&lt;br /&gt;
            home_region   = llGetRegionName();&lt;br /&gt;
            llOwnerSay(&amp;quot;Touch me to start moving. &amp;quot; +&lt;br /&gt;
                       &amp;quot;I will not move until you touch me the first time. &amp;quot; +&lt;br /&gt;
                       &amp;quot;After that it will become automatic.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if(home_region == llGetRegionName())&lt;br /&gt;
          {&lt;br /&gt;
            // I am in the same region I started out in. Make sure I&lt;br /&gt;
            // start at the last place and orientation when I left&lt;br /&gt;
            // this state.  Make sure that I move close to&lt;br /&gt;
            // home. (There is some fudge factor in the llSetRegionPos&lt;br /&gt;
            // command according to the wiki).&lt;br /&gt;
            llSetPos(home_position);&lt;br /&gt;
            llSetRot(home_rotation);&lt;br /&gt;
            llSetTimerEvent(TIME_TO_WAIT_BEFORE_MOVING);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        llDeleteCharacter(); // Clear and reset the character&lt;br /&gt;
                             // settings. You should always do this so&lt;br /&gt;
                             // that when an active object is taken&lt;br /&gt;
                             // into inventory it will be properly&lt;br /&gt;
                             // reset when rezzed again. (If not here&lt;br /&gt;
                             // then in the on_rez event.)&lt;br /&gt;
        active_character = FALSE;&lt;br /&gt;
&lt;br /&gt;
        llOwnerSay(&amp;quot;Stopped\nTouch me to have me wonder around.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llCreateCharacter(wondering_parameters);&lt;br /&gt;
        active_character = TRUE;&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
      } // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
           {&lt;br /&gt;
             // This person is in the same group. Assume the idiot can&lt;br /&gt;
             // be trusted.&lt;br /&gt;
             home_position = llGetPos();        // Define my start position&lt;br /&gt;
             home_rotation = llGetRot();        // and start orientation.&lt;br /&gt;
             state Roaming;&lt;br /&gt;
           }&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // I have waited to long without any interaction. Time to roam&lt;br /&gt;
        // because I am a ramblin&#039; object.&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end default state&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Roaming state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to start roaming.  I&lt;br /&gt;
// strongly prefer not to use all these states, but it makes for a&lt;br /&gt;
// much cleaner code in this case and a better demo.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object simply roams around for a while. &lt;br /&gt;
state Roaming&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the roaming parameters&lt;br /&gt;
        llUpdateCharacter(wondering_parameters);&lt;br /&gt;
        llWanderWithin(home_position, wondering_radius, []);&lt;br /&gt;
        llOwnerSay(&amp;quot;Roaming\nTouch me to have me go back home.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
      } // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
          {&lt;br /&gt;
            // Again, if the person is in the same group then let them&lt;br /&gt;
            // violate me by touching me.&lt;br /&gt;
            state TravelHome;&lt;br /&gt;
          }&lt;br /&gt;
        else if (llFrand(1.0) &amp;lt; 0.10)&lt;br /&gt;
          {&lt;br /&gt;
            // What the heck. Let&#039;s chase this person!&lt;br /&gt;
            agentToChase = llDetectedKey(0);&lt;br /&gt;
            state Chase_Agent;&lt;br /&gt;
          }&lt;br /&gt;
        else if (llFrand(1.0) &amp;lt; 0.10)&lt;br /&gt;
          {&lt;br /&gt;
            // What the heck. Run away! Run Away!&lt;br /&gt;
            agentToChase = llDetectedKey(0);&lt;br /&gt;
            state Evade_Agent;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
        if ((type == PU_SLOWDOWN_DISTANCE_REACHED) || &lt;br /&gt;
            (type == PU_GOAL_REACHED))&lt;br /&gt;
          {&lt;br /&gt;
            // While roaming this should not occur. if it does just restart???&lt;br /&gt;
            llWanderWithin(home_position, wondering_radius, []);            &lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else {&lt;br /&gt;
          // Something went wrong with the navmesh. Just go home and wait.&lt;br /&gt;
          state TravelHome;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state Roaming&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// TravelHome state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to go home.  I&lt;br /&gt;
// strongly prefer not to use all these states, but it makes for a&lt;br /&gt;
// much cleaner code in this case and a better demo.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object simply tries to go to the home&lt;br /&gt;
// position. If it does not make it in the alloted time the character&lt;br /&gt;
// is deleted, and it simply sets its position.&lt;br /&gt;
state TravelHome&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the traveling parameters and set a&lt;br /&gt;
        // timer to make sure something eventually happens here.&lt;br /&gt;
        llUpdateCharacter(traveling_parameters);&lt;br /&gt;
        llNavigateTo(home_position,[FORCE_DIRECT_PATH,TRUE]);&lt;br /&gt;
        llSetTimerEvent(120.0);&lt;br /&gt;
        llOwnerSay(&amp;quot;Going back home\nTouch me to force the issue.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
      }  // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        // force the issue&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
          {&lt;br /&gt;
            // trust in the authority invested in the people in my&lt;br /&gt;
            // group because blind trust always works out well.&lt;br /&gt;
            forceMoveHome(FALSE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // It took too long to get home.&lt;br /&gt;
        forceMoveHome(FALSE);&lt;br /&gt;
        state default;&lt;br /&gt;
      } // timer&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
        if (type == PU_SLOWDOWN_DISTANCE_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I am close to home. &lt;br /&gt;
            llSetTimerEvent(10.0);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if (type == PU_GOAL_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I have made it home.&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else &lt;br /&gt;
          {&lt;br /&gt;
            // Something went wrong. Just force the issue and go home.&lt;br /&gt;
            forceMoveHome(FALSE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state TravelHome&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Chase_Agent state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to chase the person who&lt;br /&gt;
// touched the object. Touch it again to go back to wandering.&lt;br /&gt;
//&lt;br /&gt;
state Chase_Agent&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the traveling parameters and set a&lt;br /&gt;
        // timer to make sure something eventually happens here.&lt;br /&gt;
&lt;br /&gt;
        // Get information about the person&lt;br /&gt;
        list agentInfo = llGetObjectDetails(agentToChase,[OBJECT_ROT]);&lt;br /&gt;
        if(llGetListLength(agentInfo)==0)&lt;br /&gt;
          {&lt;br /&gt;
            // well that was a bust. Cannot find this person. Just go&lt;br /&gt;
            // back to roaming.&lt;br /&gt;
            state Roaming;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        // I can locate the agent. Let&#039;s chase it down.&lt;br /&gt;
&lt;br /&gt;
        // Need to get the offset separately, because the z-component&lt;br /&gt;
        // will not be zero due to round off errors. The purse offset&lt;br /&gt;
        // has to have a zero z component.&lt;br /&gt;
        vector offset = &amp;lt;-1.0,0.0,0.0&amp;gt;*llList2Rot(agentInfo,0); &lt;br /&gt;
        llUpdateCharacter(chasing_parameters);&lt;br /&gt;
        llPursue(agentToChase,&lt;br /&gt;
                 [PURSUIT_OFFSET,        &amp;lt;offset.x,offset.y,0.0&amp;gt;,&lt;br /&gt;
                  REQUIRE_LINE_OF_SIGHT, FALSE,&lt;br /&gt;
                  PURSUIT_FUZZ_FACTOR,   0.8,&lt;br /&gt;
                  PURSUIT_INTERCEPT,     TRUE,&lt;br /&gt;
                  PURSUIT_GOAL_TOLERANCE,1.0]);&lt;br /&gt;
        llSetTimerEvent(120.0);&lt;br /&gt;
        llOwnerSay(&amp;quot;Chasing this person\nTouch me to stop chasing.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
      }  // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        // Stop chasing and go back to wandering mode&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // This is enough of this nonsense. I am tired. Start&lt;br /&gt;
        // wandering again.&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      } // timer&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
&lt;br /&gt;
        if (type == PU_SLOWDOWN_DISTANCE_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I am close to home. &lt;br /&gt;
            llSetTimerEvent(10.0);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if ((type == PU_GOAL_REACHED) || (type == PU_FAILURE_TARGET_GONE))&lt;br /&gt;
          {&lt;br /&gt;
            // I have found the agent or they are gone. Let&#039;s just put&lt;br /&gt;
            // an end to this.&lt;br /&gt;
            state Roaming;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else &lt;br /&gt;
          {&lt;br /&gt;
            // Something went wrong. Just end this now.&lt;br /&gt;
            state Roaming;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state Chase_Agent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Evade_Agent state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to run away from the&lt;br /&gt;
// person who touched the object. Touch it again to go back to&lt;br /&gt;
// wandering.&lt;br /&gt;
//&lt;br /&gt;
state Evade_Agent&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the traveling parameters and set a&lt;br /&gt;
        // timer to make sure something eventually happens here. Here&lt;br /&gt;
        // I just use the same settings as used to chase since they&lt;br /&gt;
        // seem okay. /me shrugs.&lt;br /&gt;
&lt;br /&gt;
        llUpdateCharacter(chasing_parameters);&lt;br /&gt;
        llEvade(agentToChase,[]);&lt;br /&gt;
        llSetTimerEvent(120.0);&lt;br /&gt;
        llOwnerSay(&amp;quot;Evading this person\nTouch me to stop chasing.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
      }  // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        // Stop evading and go back to wandering mode&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // This is enough of this nonsense. I am tired. Start&lt;br /&gt;
        // wandering again.&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      } // timer&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
&lt;br /&gt;
        if (type == PU_SLOWDOWN_DISTANCE_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I am close to home. &lt;br /&gt;
            llSetTimerEvent(10.0);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if ((type == PU_GOAL_REACHED) || (type == PU_FAILURE_TARGET_GONE))&lt;br /&gt;
          {&lt;br /&gt;
            // I have found the agent or they are gone. Let&#039;s just put&lt;br /&gt;
            // an end to this.&lt;br /&gt;
            state Roaming;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if ((type == PU_EVADE_HIDDEN) || (type == PU_EVADE_SPOTTED))&lt;br /&gt;
          {&lt;br /&gt;
            // I have been spotted. Oh noze.... panic seems like an&lt;br /&gt;
            // appropriate plan at this point.&lt;br /&gt;
            vector mySize = llGetScale();&lt;br /&gt;
            if(mySize.z*0.25 &amp;gt; 2.0)&lt;br /&gt;
              {&lt;br /&gt;
                // Cannot jump this high. Tone it down a bit&lt;br /&gt;
                mySize.z = 8.0;&lt;br /&gt;
              }&lt;br /&gt;
            llExecCharacterCmd(CHARACTER_CMD_JUMP,[mySize.z*0.25]);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else &lt;br /&gt;
          {&lt;br /&gt;
            // Something went wrong. Just end this now.&lt;br /&gt;
            state Roaming;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state Evade_Agent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pathfinding_Simple_Roaming_Example&amp;diff=1173317</id>
		<title>Pathfinding Simple Roaming Example</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pathfinding_Simple_Roaming_Example&amp;diff=1173317"/>
		<updated>2012-10-11T12:06:58Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: moved the change to the default state in the changed event.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A simple example is provided to use [[Pathfinding]] to have an object randomly roam around a small area is given below. The script is designed to have the object move around in a small area centered at the start location. The object will move back to its start position if anything goes wrong or a group member touches it. &lt;br /&gt;
&lt;br /&gt;
The script has three states. In the default state the object is not moving and can be placed in its start position. From the default state it can transition into the &#039;&#039;Roaming&#039;&#039; state by touching it as a member of the same group. In the &#039;&#039;Roaming&#039;&#039; state it will simply wander around in a small area centered at the start point. If anything goes wrong with the [[Pathfinding]] functions or a group member touches it, the script will transition into the &#039;&#039;TravelHome&#039;&#039; state. &lt;br /&gt;
&lt;br /&gt;
In the &#039;&#039;TravelHome&#039;&#039; state the script will attempt to move the object back to its start position using the [[Pathfinding]] functions. If anything goes wrong with the [[Pathfinding]] functions or a group member touches it, the script will delete the [[Pathfinding]] character and manually move the object back to its start position using the [[LlSetRegionPos|llSetRegionPos]] function. It will then transition back into the &#039;&#039;default&#039;&#039; state.&lt;br /&gt;
&lt;br /&gt;
This code is licensed under the [http://www.gnu.org/licenses/gpl.html GNU General Public License]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* *****************************************************************&lt;br /&gt;
&lt;br /&gt;
   %%% Desc:   Simple example script to demonstrate pathfinding&lt;br /&gt;
   %%% Author: Dark Mole (contact via IM within Second Life)&lt;br /&gt;
   %%% File:   $HeadURL: simpleMover.sl $&lt;br /&gt;
   %%% Date:   $Date: Thu Oct 11 04:44:14 2012 $&lt;br /&gt;
   %%% Revision: $Rev: .04 $&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
   Copyright 2012 Dark Mole (contact via IM in Second Life&lt;br /&gt;
&lt;br /&gt;
   This program is free software: you can redistribute it and/or&lt;br /&gt;
   modify it under the terms of the GNU General Public License as&lt;br /&gt;
   published by the Free Software Foundation, either version 3 of the&lt;br /&gt;
   License, or (at your option) any later version.&lt;br /&gt;
&lt;br /&gt;
   This program is distributed in the hope that it will be useful, but&lt;br /&gt;
   WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of&lt;br /&gt;
   MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU&lt;br /&gt;
   General Public License for more details.&lt;br /&gt;
&lt;br /&gt;
   You should have received a copy of the GNU General Public License&lt;br /&gt;
   along with this program.  If not, see&lt;br /&gt;
   &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   A copy of this script can be found at &lt;br /&gt;
   https://wiki.secondlife.com/wiki/Pathfinding_Simple_Roaming_Example&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
***************************************************************** */&lt;br /&gt;
&lt;br /&gt;
// Configuration variables.&lt;br /&gt;
// Things to change to impact the behavior of the system&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
float TIME_TO_WAIT_BEFORE_MOVING = 300.0; // number of seconds to wait&lt;br /&gt;
                                          // while in the default&lt;br /&gt;
                                          // state before it&lt;br /&gt;
                                          // automatically starts to&lt;br /&gt;
                                          // roam on its own. Note&lt;br /&gt;
                                          // that the first time this&lt;br /&gt;
                                          // thing rezzes this timer&lt;br /&gt;
                                          // is ignored.&lt;br /&gt;
&lt;br /&gt;
// Global Variables. (do not change unless you know what they do!)&lt;br /&gt;
&lt;br /&gt;
// Location related variables&lt;br /&gt;
&lt;br /&gt;
vector   home_position = &amp;lt;-1.0,0.0,0.0&amp;gt;;&lt;br /&gt;
rotation home_rotation = ZERO_ROTATION;&lt;br /&gt;
string   home_region   = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
vector wondering_radius = &amp;lt;5.0,5.0,20.0&amp;gt;; // how far I can roam around&lt;br /&gt;
list   wondering_parameters = &lt;br /&gt;
  [CHARACTER_MAX_SPEED,         1.0,        // parameters describing&lt;br /&gt;
   CHARACTER_DESIRED_SPEED,     0.2,       // how I can roam.&lt;br /&gt;
   CHARACTER_DESIRED_TURN_SPEED,0.02,&lt;br /&gt;
   CHARACTER_MAX_ACCEL,         0.5,&lt;br /&gt;
   CHARACTER_MAX_DECEL,         0.5,&lt;br /&gt;
   CHARACTER_ORIENTATION,       VERTICAL,&lt;br /&gt;
   TRAVERSAL_TYPE,              TRAVERSAL_TYPE_SLOW,&lt;br /&gt;
   CHARACTER_TYPE,              CHARACTER_TYPE_A, &lt;br /&gt;
   CHARACTER_MAX_TURN_RADIUS,   0.5];&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
list traveling_parameters = &lt;br /&gt;
  [CHARACTER_MAX_SPEED,         5.0,        // parameters describing&lt;br /&gt;
   CHARACTER_DESIRED_SPEED,     3.0,        // how I can roam when &lt;br /&gt;
   CHARACTER_DESIRED_TURN_SPEED,2.0,        // traveling..&lt;br /&gt;
   CHARACTER_MAX_ACCEL,         3.0,&lt;br /&gt;
   CHARACTER_MAX_DECEL,         3.0,&lt;br /&gt;
   CHARACTER_ORIENTATION,       VERTICAL,&lt;br /&gt;
   TRAVERSAL_TYPE,              TRAVERSAL_TYPE_SLOW,&lt;br /&gt;
   CHARACTER_TYPE,              CHARACTER_TYPE_A, &lt;br /&gt;
   CHARACTER_MAX_TURN_RADIUS,   1.5];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Variables associated with the state of the script&lt;br /&gt;
integer active_character = FALSE;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Helper functions &lt;br /&gt;
&lt;br /&gt;
/* *********************************************************&lt;br /&gt;
   forceMoveHome(integer resetScript)&lt;br /&gt;
&lt;br /&gt;
   Routine to force the object to go home. The option &amp;quot;resetScript&amp;quot; is&lt;br /&gt;
   to determine if the script should be reset when it is in the same&lt;br /&gt;
   region it started from.&lt;br /&gt;
&lt;br /&gt;
********************************************************* */&lt;br /&gt;
forceMoveHome(integer resetScript)&lt;br /&gt;
{&lt;br /&gt;
  // Stop and delete the character&lt;br /&gt;
  llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
  llDeleteCharacter();&lt;br /&gt;
  active_character = FALSE;&lt;br /&gt;
  if(home_region == llGetRegionName())&lt;br /&gt;
    {&lt;br /&gt;
      // I am in the same home region. Just move close to the start&lt;br /&gt;
      // point.&lt;br /&gt;
      llSetRegionPos(home_position);&lt;br /&gt;
      if(resetScript)&lt;br /&gt;
        {&lt;br /&gt;
          llSetPos(home_position);&lt;br /&gt;
          llSetRot(home_rotation);&lt;br /&gt;
          llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  else&lt;br /&gt;
    {&lt;br /&gt;
      llInstantMessage(llGetOwner(),&amp;quot;There is an error. &amp;quot; +&lt;br /&gt;
                       &amp;quot;I wondered away from my start region and cannot go back home.\n&amp;quot; +&lt;br /&gt;
                       &amp;quot;I am located in &amp;quot; + llGetRegionName() + &amp;quot; at &amp;quot; + &lt;br /&gt;
                       (string)llGetPos());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Primary (default) state.&lt;br /&gt;
// This is the initial state when the program resets.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object waits for a touch to get started. There is&lt;br /&gt;
// a random chance that it might start moving at any time step though.&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        if(home_position.x &amp;lt; 0.0)&lt;br /&gt;
          {&lt;br /&gt;
            // This is the first time to enter this state. Do a little&lt;br /&gt;
            // house cleaning to start the season.&lt;br /&gt;
&lt;br /&gt;
            // Add any parts to the different parameters that require any&lt;br /&gt;
            // calculations.&lt;br /&gt;
            wondering_parameters += &lt;br /&gt;
              [CHARACTER_AVOIDANCE_MODE, AVOID_CHARACTERS | AVOID_DYNAMIC_OBSTACLES];&lt;br /&gt;
            traveling_parameters += &lt;br /&gt;
              [CHARACTER_AVOIDANCE_MODE, AVOID_CHARACTERS | AVOID_DYNAMIC_OBSTACLES];&lt;br /&gt;
&lt;br /&gt;
            // Set the initial home position and orientation.&lt;br /&gt;
            home_position = llGetPos();&lt;br /&gt;
            home_rotation = llGetRot();&lt;br /&gt;
            home_region   = llGetRegionName();&lt;br /&gt;
            llOwnerSay(&amp;quot;Touch me to start moving. &amp;quot; +&lt;br /&gt;
                       &amp;quot;I will not move until you touch me the first time. &amp;quot; +&lt;br /&gt;
                       &amp;quot;After that it will become automatic.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if(home_region == llGetRegionName())&lt;br /&gt;
          {&lt;br /&gt;
            // I am in the same region I started out in. Make sure I&lt;br /&gt;
            // start at the last place and orientation when I left&lt;br /&gt;
            // this state.  Make sure that I move close to&lt;br /&gt;
            // home. (There is some fudge factor in the llSetRegionPos&lt;br /&gt;
            // command according to the wiki).&lt;br /&gt;
            llSetPos(home_position);&lt;br /&gt;
            llSetRot(home_rotation);&lt;br /&gt;
            llSetTimerEvent(TIME_TO_WAIT_BEFORE_MOVING);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        llDeleteCharacter(); // Clear and reset the character&lt;br /&gt;
                             // settings. You should always do this so&lt;br /&gt;
                             // that when an active object is taken&lt;br /&gt;
                             // into inventory it will be properly&lt;br /&gt;
                             // reset when rezzed again. (If not here&lt;br /&gt;
                             // then in the on_rez event.)&lt;br /&gt;
        active_character = FALSE;&lt;br /&gt;
&lt;br /&gt;
        llOwnerSay(&amp;quot;Stopped\nTouch me to have me wonder around.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llCreateCharacter(wondering_parameters);&lt;br /&gt;
        active_character = TRUE;&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
      } // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
           {&lt;br /&gt;
             // This person is in the same group. Assume the idiot can&lt;br /&gt;
             // be trusted.&lt;br /&gt;
             home_position = llGetPos();        // Define my start position&lt;br /&gt;
             home_rotation = llGetRot();        // and start orientation.&lt;br /&gt;
             state Roaming;&lt;br /&gt;
           }&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // I have waited to long without any interaction. Time to roam&lt;br /&gt;
        // because I am a ramblin&#039; object.&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end default state&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Roaming state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to start roaming.  I&lt;br /&gt;
// strongly prefer not to use all these states, but it makes for a&lt;br /&gt;
// much cleaner code in this case and a better demo.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object simply roams around for a while. &lt;br /&gt;
state Roaming&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the roaming parameters&lt;br /&gt;
        llUpdateCharacter(wondering_parameters);&lt;br /&gt;
        llWanderWithin(home_position, wondering_radius, []);&lt;br /&gt;
        llOwnerSay(&amp;quot;Roaming\nTouch me to have me go back home.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
      } // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
          {&lt;br /&gt;
            // Again, if the person is in the same group then let them&lt;br /&gt;
            // violate me by touching me.&lt;br /&gt;
            state TravelHome;&lt;br /&gt;
          }&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
        if ((type == PU_SLOWDOWN_DISTANCE_REACHED) || &lt;br /&gt;
            (type == PU_GOAL_REACHED))&lt;br /&gt;
          {&lt;br /&gt;
            // While roaming this should not occur. if it does just restart???&lt;br /&gt;
            llWanderWithin(home_position, wondering_radius, []);            &lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else {&lt;br /&gt;
          // Something went wrong with the navmesh. Just go home and wait.&lt;br /&gt;
          state TravelHome;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state Roaming&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// TravelHome state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to go home.  I&lt;br /&gt;
// strongly prefer not to use all these states, but it makes for a&lt;br /&gt;
// much cleaner code in this case and a better demo.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object simply tries to go to the home&lt;br /&gt;
// position. If it does not make it in the alloted time the character&lt;br /&gt;
// is deleted, and it simply sets its position.&lt;br /&gt;
state TravelHome&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the traveling parameters and set a&lt;br /&gt;
        // timer to make sure something eventually happens here.&lt;br /&gt;
        llUpdateCharacter(traveling_parameters);&lt;br /&gt;
        llNavigateTo(home_position,[FORCE_DIRECT_PATH,TRUE]);&lt;br /&gt;
        llSetTimerEvent(120.0);&lt;br /&gt;
        llOwnerSay(&amp;quot;Going back home\nTouch me to force the issue.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
      }  // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        // force the issue&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
          {&lt;br /&gt;
            // trust in the authority invested in the people in my&lt;br /&gt;
            // group because blind trust always works out well.&lt;br /&gt;
            forceMoveHome(FALSE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // It took too long to get home.&lt;br /&gt;
        forceMoveHome(FALSE);&lt;br /&gt;
        state default;&lt;br /&gt;
      } // timer&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
        if (type == PU_SLOWDOWN_DISTANCE_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I am close to home. &lt;br /&gt;
            llSetTimerEvent(10.0);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if (type == PU_GOAL_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I have made it home.&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else &lt;br /&gt;
          {&lt;br /&gt;
            // Something went wrong. Just force the issue and go home.&lt;br /&gt;
            forceMoveHome(FALSE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state TravelHome&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pathfinding_Simple_Roaming_Example_With_Evade_Pursue&amp;diff=1173316</id>
		<title>Pathfinding Simple Roaming Example With Evade Pursue</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pathfinding_Simple_Roaming_Example_With_Evade_Pursue&amp;diff=1173316"/>
		<updated>2012-10-11T09:31:12Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Removed an unecessary check in the move home state.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A simple example is provided to use [[Pathfinding]] to have an object randomly roam around a small area is given below and randomly evade or pursue a person who touches it. The script is designed to have the object move around in a small area centered at the start location. The object will move back to its start position if anything goes wrong or a group member touches it. &lt;br /&gt;
&lt;br /&gt;
The script has five states. In the default state the object is not moving and can be placed in its start position. From the default state it can transition into the &#039;&#039;Roaming&#039;&#039; state by touching it as a member of the same group. In the &#039;&#039;Roaming&#039;&#039; state it will simply wander around in a small area centered at the start point. If anything goes wrong with the [[Pathfinding]] functions or a group member touches it, the script will transition into the &#039;&#039;TravelHome&#039;&#039; state. &lt;br /&gt;
&lt;br /&gt;
In the &#039;&#039;TravelHome&#039;&#039; state the script will attempt to move the object back to its start position using the [[Pathfinding]] functions. If anything goes wrong with the [[Pathfinding]] functions or a group member touches it, the script will delete the [[Pathfinding]] character and manually move the object back to its start position using the [[LlSetRegionPos|llSetRegionPos]] function. It will then transition back into the &#039;&#039;default&#039;&#039; state.&lt;br /&gt;
&lt;br /&gt;
If someone touches this object while it is roaming who is not in the same group there is a small chance that it will either evade or pursue the person. If the decision is to evade then the script transitions to the &#039;&#039;Evade_Agent&#039;&#039; state. If the decision is to chase the agent then the script transitions to the &#039;&#039;Chase_Agent&#039;&#039; state.&lt;br /&gt;
&lt;br /&gt;
This code is licensed under the [http://www.gnu.org/licenses/gpl.html|GNU General Public License]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* *****************************************************************&lt;br /&gt;
&lt;br /&gt;
   %%% Desc:   Simple example script to demonstrate pathfinding&lt;br /&gt;
   %%% Author: Dark Mole (contact via IM within Second Life)&lt;br /&gt;
   %%% File:   $HeadURL: simpleMoverWithChaseAndEvade.sl $&lt;br /&gt;
   %%% Date:   $Date: Thu Oct 11 04:44:14 2012 $&lt;br /&gt;
   %%% Revision: $Rev: .04 $&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
   Copyright 2012 Dark Mole (contact via IM in Second Life&lt;br /&gt;
&lt;br /&gt;
   This program is free software: you can redistribute it and/or&lt;br /&gt;
   modify it under the terms of the GNU General Public License as&lt;br /&gt;
   published by the Free Software Foundation, either version 3 of the&lt;br /&gt;
   License, or (at your option) any later version.&lt;br /&gt;
&lt;br /&gt;
   This program is distributed in the hope that it will be useful, but&lt;br /&gt;
   WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of&lt;br /&gt;
   MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU&lt;br /&gt;
   General Public License for more details.&lt;br /&gt;
&lt;br /&gt;
   You should have received a copy of the GNU General Public License&lt;br /&gt;
   along with this program.  If not, see&lt;br /&gt;
   &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   A copy of this script can be found at&lt;br /&gt;
   https://wiki.secondlife.com/wiki/Pathfinding_Simple_Roaming_Example_With_Evade_Pursue&lt;br /&gt;
&lt;br /&gt;
***************************************************************** */&lt;br /&gt;
&lt;br /&gt;
// Configuration variables.&lt;br /&gt;
// Things to change to impact the behavior of the system&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
float TIME_TO_WAIT_BEFORE_MOVING = 300.0; // number of seconds to wait&lt;br /&gt;
                                          // while in the default&lt;br /&gt;
                                          // state before it&lt;br /&gt;
                                          // automatically starts to&lt;br /&gt;
                                          // roam on its own. Note&lt;br /&gt;
                                          // that the first time this&lt;br /&gt;
                                          // thing rezzes this timer&lt;br /&gt;
                                          // is ignored.&lt;br /&gt;
&lt;br /&gt;
// Global Variables. (do not change unless you know what they do!)&lt;br /&gt;
&lt;br /&gt;
// Location related variables&lt;br /&gt;
&lt;br /&gt;
vector   home_position = &amp;lt;-1.0,0.0,0.0&amp;gt;;&lt;br /&gt;
rotation home_rotation = ZERO_ROTATION;&lt;br /&gt;
string   home_region   = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
vector wondering_radius = &amp;lt;5.0,5.0,20.0&amp;gt;; // how far I can roam around&lt;br /&gt;
list   wondering_parameters = &lt;br /&gt;
  [CHARACTER_MAX_SPEED,         1.0,        // parameters describing&lt;br /&gt;
   CHARACTER_DESIRED_SPEED,     0.2,       // how I can roam.&lt;br /&gt;
   CHARACTER_DESIRED_TURN_SPEED,0.02,&lt;br /&gt;
   CHARACTER_MAX_ACCEL,         0.5,&lt;br /&gt;
   CHARACTER_MAX_DECEL,         0.5,&lt;br /&gt;
   CHARACTER_ORIENTATION,       VERTICAL,&lt;br /&gt;
   TRAVERSAL_TYPE,              TRAVERSAL_TYPE_SLOW,&lt;br /&gt;
   CHARACTER_TYPE,              CHARACTER_TYPE_A, &lt;br /&gt;
   CHARACTER_MAX_TURN_RADIUS,   0.5];&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
list traveling_parameters = &lt;br /&gt;
  [CHARACTER_MAX_SPEED,         5.0,        // parameters describing&lt;br /&gt;
   CHARACTER_DESIRED_SPEED,     3.0,        // how I can roam when &lt;br /&gt;
   CHARACTER_DESIRED_TURN_SPEED,2.0,        // traveling..&lt;br /&gt;
   CHARACTER_MAX_ACCEL,         3.0,&lt;br /&gt;
   CHARACTER_MAX_DECEL,         3.0,&lt;br /&gt;
   CHARACTER_ORIENTATION,       VERTICAL,&lt;br /&gt;
   TRAVERSAL_TYPE,              TRAVERSAL_TYPE_SLOW,&lt;br /&gt;
   CHARACTER_TYPE,              CHARACTER_TYPE_A, &lt;br /&gt;
   CHARACTER_MAX_TURN_RADIUS,   1.5];&lt;br /&gt;
&lt;br /&gt;
list   chasing_parameters = &lt;br /&gt;
  [CHARACTER_MAX_SPEED,         15.0,       // parameters describing&lt;br /&gt;
   CHARACTER_DESIRED_SPEED,     10.0,      // how I can chase someone.&lt;br /&gt;
   CHARACTER_DESIRED_TURN_SPEED,8.0, &lt;br /&gt;
   CHARACTER_MAX_ACCEL,         7.5,&lt;br /&gt;
   CHARACTER_MAX_DECEL,         7.5,&lt;br /&gt;
   CHARACTER_ORIENTATION,       VERTICAL,&lt;br /&gt;
   TRAVERSAL_TYPE,              TRAVERSAL_TYPE_FAST,&lt;br /&gt;
   CHARACTER_TYPE,              CHARACTER_TYPE_A, &lt;br /&gt;
   CHARACTER_MAX_TURN_RADIUS,   0.8,&lt;br /&gt;
   CHARACTER_AVOIDANCE_MODE,    AVOID_DYNAMIC_OBSTACLES];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Variables associated with the state of the script&lt;br /&gt;
integer active_character = FALSE;&lt;br /&gt;
key     agentToChase     = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
// Helper functions &lt;br /&gt;
&lt;br /&gt;
/* *********************************************************&lt;br /&gt;
   forceMoveHome(integer resetScript)&lt;br /&gt;
&lt;br /&gt;
   Routine to force the object to go home. The option &amp;quot;resetScript&amp;quot; is&lt;br /&gt;
   to determine if the script should be reset when it is in the same&lt;br /&gt;
   region it started from.&lt;br /&gt;
&lt;br /&gt;
********************************************************* */&lt;br /&gt;
forceMoveHome(integer resetScript)&lt;br /&gt;
{&lt;br /&gt;
  // Stop and delete the character&lt;br /&gt;
  llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
  llDeleteCharacter();&lt;br /&gt;
  active_character = FALSE;&lt;br /&gt;
  if(home_region == llGetRegionName())&lt;br /&gt;
    {&lt;br /&gt;
      // I am in the same home region. Just move close to the start&lt;br /&gt;
      // point.&lt;br /&gt;
      llSetRegionPos(home_position);&lt;br /&gt;
      if(resetScript)&lt;br /&gt;
        {&lt;br /&gt;
          llSetPos(home_position);&lt;br /&gt;
          llSetRot(home_rotation);&lt;br /&gt;
          llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  else&lt;br /&gt;
    {&lt;br /&gt;
      llInstantMessage(llGetOwner(),&amp;quot;There is an error. &amp;quot; +&lt;br /&gt;
                       &amp;quot;I wondered away from my start region and cannot go back home.\n&amp;quot; +&lt;br /&gt;
                       &amp;quot;I am located in &amp;quot; + llGetRegionName() + &amp;quot; at &amp;quot; + &lt;br /&gt;
                       (string)llGetPos());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Primary (default) state.&lt;br /&gt;
// This is the initial state when the program resets.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object waits for a touch to get started. There is&lt;br /&gt;
// a random chance that it might start moving at any time step though.&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        if(home_position.x &amp;lt; 0.0)&lt;br /&gt;
          {&lt;br /&gt;
            // This is the first time to enter this state. Do a little&lt;br /&gt;
            // house cleaning to start the season.&lt;br /&gt;
&lt;br /&gt;
            // Add any parts to the different parameters that require any&lt;br /&gt;
            // calculations.&lt;br /&gt;
            wondering_parameters += &lt;br /&gt;
              [CHARACTER_AVOIDANCE_MODE, AVOID_CHARACTERS | AVOID_DYNAMIC_OBSTACLES];&lt;br /&gt;
            traveling_parameters += &lt;br /&gt;
              [CHARACTER_AVOIDANCE_MODE, AVOID_CHARACTERS | AVOID_DYNAMIC_OBSTACLES];&lt;br /&gt;
&lt;br /&gt;
            // Set the initial home position and orientation.&lt;br /&gt;
            home_position = llGetPos();&lt;br /&gt;
            home_rotation = llGetRot();&lt;br /&gt;
            home_region   = llGetRegionName();&lt;br /&gt;
            llOwnerSay(&amp;quot;Touch me to start moving. &amp;quot; +&lt;br /&gt;
                       &amp;quot;I will not move until you touch me the first time. &amp;quot; +&lt;br /&gt;
                       &amp;quot;After that it will become automatic.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if(home_region == llGetRegionName())&lt;br /&gt;
          {&lt;br /&gt;
            // I am in the same region I started out in. Make sure I&lt;br /&gt;
            // start at the last place and orientation when I left&lt;br /&gt;
            // this state.  Make sure that I move close to&lt;br /&gt;
            // home. (There is some fudge factor in the llSetRegionPos&lt;br /&gt;
            // command according to the wiki).&lt;br /&gt;
            llSetPos(home_position);&lt;br /&gt;
            llSetRot(home_rotation);&lt;br /&gt;
            llSetTimerEvent(TIME_TO_WAIT_BEFORE_MOVING);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        llDeleteCharacter(); // Clear and reset the character&lt;br /&gt;
                             // settings. You should always do this so&lt;br /&gt;
                             // that when an active object is taken&lt;br /&gt;
                             // into inventory it will be properly&lt;br /&gt;
                             // reset when rezzed again. (If not here&lt;br /&gt;
                             // then in the on_rez event.)&lt;br /&gt;
        active_character = FALSE;&lt;br /&gt;
&lt;br /&gt;
        llOwnerSay(&amp;quot;Stopped\nTouch me to have me wonder around.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llCreateCharacter(wondering_parameters);&lt;br /&gt;
        active_character = TRUE;&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
      } // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
           {&lt;br /&gt;
             // This person is in the same group. Assume the idiot can&lt;br /&gt;
             // be trusted.&lt;br /&gt;
             home_position = llGetPos();        // Define my start position&lt;br /&gt;
             home_rotation = llGetRot();        // and start orientation.&lt;br /&gt;
             state Roaming;&lt;br /&gt;
           }&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // I have waited to long without any interaction. Time to roam&lt;br /&gt;
        // because I am a ramblin&#039; object.&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end default state&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Roaming state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to start roaming.  I&lt;br /&gt;
// strongly prefer not to use all these states, but it makes for a&lt;br /&gt;
// much cleaner code in this case and a better demo.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object simply roams around for a while. &lt;br /&gt;
state Roaming&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the roaming parameters&lt;br /&gt;
        llUpdateCharacter(wondering_parameters);&lt;br /&gt;
        llWanderWithin(home_position, wondering_radius, []);&lt;br /&gt;
        llOwnerSay(&amp;quot;Roaming\nTouch me to have me go back home.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
      } // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
        state default;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
          {&lt;br /&gt;
            // Again, if the person is in the same group then let them&lt;br /&gt;
            // violate me by touching me.&lt;br /&gt;
            state TravelHome;&lt;br /&gt;
          }&lt;br /&gt;
        else if (llFrand(1.0) &amp;lt; 0.10)&lt;br /&gt;
          {&lt;br /&gt;
            // What the heck. Let&#039;s chase this person!&lt;br /&gt;
            agentToChase = llDetectedKey(0);&lt;br /&gt;
            state Chase_Agent;&lt;br /&gt;
          }&lt;br /&gt;
        else if (llFrand(1.0) &amp;lt; 0.10)&lt;br /&gt;
          {&lt;br /&gt;
            // What the heck. Run away! Run Away!&lt;br /&gt;
            agentToChase = llDetectedKey(0);&lt;br /&gt;
            state Evade_Agent;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
        if ((type == PU_SLOWDOWN_DISTANCE_REACHED) || &lt;br /&gt;
            (type == PU_GOAL_REACHED))&lt;br /&gt;
          {&lt;br /&gt;
            // While roaming this should not occur. if it does just restart???&lt;br /&gt;
            llWanderWithin(home_position, wondering_radius, []);            &lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else {&lt;br /&gt;
          // Something went wrong with the navmesh. Just go home and wait.&lt;br /&gt;
          state TravelHome;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state Roaming&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// TravelHome state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to go home.  I&lt;br /&gt;
// strongly prefer not to use all these states, but it makes for a&lt;br /&gt;
// much cleaner code in this case and a better demo.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object simply tries to go to the home&lt;br /&gt;
// position. If it does not make it in the alloted time the character&lt;br /&gt;
// is deleted, and it simply sets its position.&lt;br /&gt;
state TravelHome&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the traveling parameters and set a&lt;br /&gt;
        // timer to make sure something eventually happens here.&lt;br /&gt;
        llUpdateCharacter(traveling_parameters);&lt;br /&gt;
        llNavigateTo(home_position,[FORCE_DIRECT_PATH,TRUE]);&lt;br /&gt;
        llSetTimerEvent(120.0);&lt;br /&gt;
        llOwnerSay(&amp;quot;Going back home\nTouch me to force the issue.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
      }  // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
        state default;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        // force the issue&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
          {&lt;br /&gt;
            // trust in the authority invested in the people in my&lt;br /&gt;
            // group because blind trust always works out well.&lt;br /&gt;
            forceMoveHome(FALSE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // It took too long to get home.&lt;br /&gt;
        forceMoveHome(FALSE);&lt;br /&gt;
        state default;&lt;br /&gt;
      } // timer&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
        if (type == PU_SLOWDOWN_DISTANCE_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I am close to home. &lt;br /&gt;
            llSetTimerEvent(10.0);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if (type == PU_GOAL_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I have made it home.&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else &lt;br /&gt;
          {&lt;br /&gt;
            // Something went wrong. Just force the issue and go home.&lt;br /&gt;
            forceMoveHome(FALSE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state TravelHome&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Chase_Agent state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to chase the person who&lt;br /&gt;
// touched the object. Touch it again to go back to wandering.&lt;br /&gt;
//&lt;br /&gt;
state Chase_Agent&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the traveling parameters and set a&lt;br /&gt;
        // timer to make sure something eventually happens here.&lt;br /&gt;
&lt;br /&gt;
        // Get information about the person&lt;br /&gt;
        list agentInfo = llGetObjectDetails(agentToChase,[OBJECT_ROT]);&lt;br /&gt;
        if(llGetListLength(agentInfo)==0)&lt;br /&gt;
          {&lt;br /&gt;
            // well that was a bust. Cannot find this person. Just go&lt;br /&gt;
            // back to roaming.&lt;br /&gt;
            state Roaming;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        // I can locate the agent. Let&#039;s chase it down.&lt;br /&gt;
&lt;br /&gt;
        // Need to get the offset separately, because the z-component&lt;br /&gt;
        // will not be zero due to round off errors. The purse offset&lt;br /&gt;
        // has to have a zero z component.&lt;br /&gt;
        vector offset = &amp;lt;-1.0,0.0,0.0&amp;gt;*llList2Rot(agentInfo,0); &lt;br /&gt;
        llUpdateCharacter(chasing_parameters);&lt;br /&gt;
        llPursue(agentToChase,&lt;br /&gt;
                 [PURSUIT_OFFSET,        &amp;lt;offset.x,offset.y,0.0&amp;gt;,&lt;br /&gt;
                  REQUIRE_LINE_OF_SIGHT, FALSE,&lt;br /&gt;
                  PURSUIT_FUZZ_FACTOR,   0.8,&lt;br /&gt;
                  PURSUIT_INTERCEPT,     TRUE,&lt;br /&gt;
                  PURSUIT_GOAL_TOLERANCE,1.0]);&lt;br /&gt;
        llSetTimerEvent(120.0);&lt;br /&gt;
        llOwnerSay(&amp;quot;Chasing this person\nTouch me to stop chasing.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
      }  // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
        state default;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        // Stop chasing and go back to wandering mode&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // This is enough of this nonsense. I am tired. Start&lt;br /&gt;
        // wandering again.&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      } // timer&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
&lt;br /&gt;
        if (type == PU_SLOWDOWN_DISTANCE_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I am close to home. &lt;br /&gt;
            llSetTimerEvent(10.0);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if ((type == PU_GOAL_REACHED) || (type == PU_FAILURE_TARGET_GONE))&lt;br /&gt;
          {&lt;br /&gt;
            // I have found the agent or they are gone. Let&#039;s just put&lt;br /&gt;
            // an end to this.&lt;br /&gt;
            state Roaming;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else &lt;br /&gt;
          {&lt;br /&gt;
            // Something went wrong. Just end this now.&lt;br /&gt;
            state Roaming;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state Chase_Agent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Evade_Agent state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to run away from the&lt;br /&gt;
// person who touched the object. Touch it again to go back to&lt;br /&gt;
// wandering.&lt;br /&gt;
//&lt;br /&gt;
state Evade_Agent&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the traveling parameters and set a&lt;br /&gt;
        // timer to make sure something eventually happens here. Here&lt;br /&gt;
        // I just use the same settings as used to chase since they&lt;br /&gt;
        // seem okay. /me shrugs.&lt;br /&gt;
&lt;br /&gt;
        llUpdateCharacter(chasing_parameters);&lt;br /&gt;
        llEvade(agentToChase,[]);&lt;br /&gt;
        llSetTimerEvent(120.0);&lt;br /&gt;
        llOwnerSay(&amp;quot;Evading this person\nTouch me to stop chasing.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
      }  // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
        state default;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        // Stop evading and go back to wandering mode&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // This is enough of this nonsense. I am tired. Start&lt;br /&gt;
        // wandering again.&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      } // timer&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
&lt;br /&gt;
        if (type == PU_SLOWDOWN_DISTANCE_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I am close to home. &lt;br /&gt;
            llSetTimerEvent(10.0);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if ((type == PU_GOAL_REACHED) || (type == PU_FAILURE_TARGET_GONE))&lt;br /&gt;
          {&lt;br /&gt;
            // I have found the agent or they are gone. Let&#039;s just put&lt;br /&gt;
            // an end to this.&lt;br /&gt;
            state Roaming;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if ((type == PU_EVADE_HIDDEN) || (type == PU_EVADE_SPOTTED))&lt;br /&gt;
          {&lt;br /&gt;
            // I have been spotted. Oh noze.... panic seems like an&lt;br /&gt;
            // appropriate plan at this point.&lt;br /&gt;
            vector mySize = llGetScale();&lt;br /&gt;
            if(mySize.z*0.25 &amp;gt; 2.0)&lt;br /&gt;
              {&lt;br /&gt;
                // Cannot jump this high. Tone it down a bit&lt;br /&gt;
                mySize.z = 8.0;&lt;br /&gt;
              }&lt;br /&gt;
            llExecCharacterCmd(CHARACTER_CMD_JUMP,[mySize.z*0.25]);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else &lt;br /&gt;
          {&lt;br /&gt;
            // Something went wrong. Just end this now.&lt;br /&gt;
            state Roaming;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state Evade_Agent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pathfinding_Simple_Roaming_Example&amp;diff=1173315</id>
		<title>Pathfinding Simple Roaming Example</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pathfinding_Simple_Roaming_Example&amp;diff=1173315"/>
		<updated>2012-10-11T09:28:51Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Removed an unecessary check in the move home state.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A simple example is provided to use [[Pathfinding]] to have an object randomly roam around a small area is given below. The script is designed to have the object move around in a small area centered at the start location. The object will move back to its start position if anything goes wrong or a group member touches it. &lt;br /&gt;
&lt;br /&gt;
The script has three states. In the default state the object is not moving and can be placed in its start position. From the default state it can transition into the &#039;&#039;Roaming&#039;&#039; state by touching it as a member of the same group. In the &#039;&#039;Roaming&#039;&#039; state it will simply wander around in a small area centered at the start point. If anything goes wrong with the [[Pathfinding]] functions or a group member touches it, the script will transition into the &#039;&#039;TravelHome&#039;&#039; state. &lt;br /&gt;
&lt;br /&gt;
In the &#039;&#039;TravelHome&#039;&#039; state the script will attempt to move the object back to its start position using the [[Pathfinding]] functions. If anything goes wrong with the [[Pathfinding]] functions or a group member touches it, the script will delete the [[Pathfinding]] character and manually move the object back to its start position using the [[LlSetRegionPos|llSetRegionPos]] function. It will then transition back into the &#039;&#039;default&#039;&#039; state.&lt;br /&gt;
&lt;br /&gt;
This code is licensed under the [http://www.gnu.org/licenses/gpl.html GNU General Public License]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* *****************************************************************&lt;br /&gt;
&lt;br /&gt;
   %%% Desc:   Simple example script to demonstrate pathfinding&lt;br /&gt;
   %%% Author: Dark Mole (contact via IM within Second Life)&lt;br /&gt;
   %%% File:   $HeadURL: simpleMover.sl $&lt;br /&gt;
   %%% Date:   $Date: Thu Oct 11 04:44:14 2012 $&lt;br /&gt;
   %%% Revision: $Rev: .04 $&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
   Copyright 2012 Dark Mole (contact via IM in Second Life&lt;br /&gt;
&lt;br /&gt;
   This program is free software: you can redistribute it and/or&lt;br /&gt;
   modify it under the terms of the GNU General Public License as&lt;br /&gt;
   published by the Free Software Foundation, either version 3 of the&lt;br /&gt;
   License, or (at your option) any later version.&lt;br /&gt;
&lt;br /&gt;
   This program is distributed in the hope that it will be useful, but&lt;br /&gt;
   WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of&lt;br /&gt;
   MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU&lt;br /&gt;
   General Public License for more details.&lt;br /&gt;
&lt;br /&gt;
   You should have received a copy of the GNU General Public License&lt;br /&gt;
   along with this program.  If not, see&lt;br /&gt;
   &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   A copy of this script can be found at &lt;br /&gt;
   https://wiki.secondlife.com/wiki/Pathfinding_Simple_Roaming_Example&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
***************************************************************** */&lt;br /&gt;
&lt;br /&gt;
// Configuration variables.&lt;br /&gt;
// Things to change to impact the behavior of the system&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
float TIME_TO_WAIT_BEFORE_MOVING = 300.0; // number of seconds to wait&lt;br /&gt;
                                          // while in the default&lt;br /&gt;
                                          // state before it&lt;br /&gt;
                                          // automatically starts to&lt;br /&gt;
                                          // roam on its own. Note&lt;br /&gt;
                                          // that the first time this&lt;br /&gt;
                                          // thing rezzes this timer&lt;br /&gt;
                                          // is ignored.&lt;br /&gt;
&lt;br /&gt;
// Global Variables. (do not change unless you know what they do!)&lt;br /&gt;
&lt;br /&gt;
// Location related variables&lt;br /&gt;
&lt;br /&gt;
vector   home_position = &amp;lt;-1.0,0.0,0.0&amp;gt;;&lt;br /&gt;
rotation home_rotation = ZERO_ROTATION;&lt;br /&gt;
string   home_region   = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
vector wondering_radius = &amp;lt;5.0,5.0,20.0&amp;gt;; // how far I can roam around&lt;br /&gt;
list   wondering_parameters = &lt;br /&gt;
  [CHARACTER_MAX_SPEED,         1.0,        // parameters describing&lt;br /&gt;
   CHARACTER_DESIRED_SPEED,     0.2,       // how I can roam.&lt;br /&gt;
   CHARACTER_DESIRED_TURN_SPEED,0.02,&lt;br /&gt;
   CHARACTER_MAX_ACCEL,         0.5,&lt;br /&gt;
   CHARACTER_MAX_DECEL,         0.5,&lt;br /&gt;
   CHARACTER_ORIENTATION,       VERTICAL,&lt;br /&gt;
   TRAVERSAL_TYPE,              TRAVERSAL_TYPE_SLOW,&lt;br /&gt;
   CHARACTER_TYPE,              CHARACTER_TYPE_A, &lt;br /&gt;
   CHARACTER_MAX_TURN_RADIUS,   0.5];&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
list traveling_parameters = &lt;br /&gt;
  [CHARACTER_MAX_SPEED,         5.0,        // parameters describing&lt;br /&gt;
   CHARACTER_DESIRED_SPEED,     3.0,        // how I can roam when &lt;br /&gt;
   CHARACTER_DESIRED_TURN_SPEED,2.0,        // traveling..&lt;br /&gt;
   CHARACTER_MAX_ACCEL,         3.0,&lt;br /&gt;
   CHARACTER_MAX_DECEL,         3.0,&lt;br /&gt;
   CHARACTER_ORIENTATION,       VERTICAL,&lt;br /&gt;
   TRAVERSAL_TYPE,              TRAVERSAL_TYPE_SLOW,&lt;br /&gt;
   CHARACTER_TYPE,              CHARACTER_TYPE_A, &lt;br /&gt;
   CHARACTER_MAX_TURN_RADIUS,   1.5];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Variables associated with the state of the script&lt;br /&gt;
integer active_character = FALSE;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Helper functions &lt;br /&gt;
&lt;br /&gt;
/* *********************************************************&lt;br /&gt;
   forceMoveHome(integer resetScript)&lt;br /&gt;
&lt;br /&gt;
   Routine to force the object to go home. The option &amp;quot;resetScript&amp;quot; is&lt;br /&gt;
   to determine if the script should be reset when it is in the same&lt;br /&gt;
   region it started from.&lt;br /&gt;
&lt;br /&gt;
********************************************************* */&lt;br /&gt;
forceMoveHome(integer resetScript)&lt;br /&gt;
{&lt;br /&gt;
  // Stop and delete the character&lt;br /&gt;
  llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
  llDeleteCharacter();&lt;br /&gt;
  active_character = FALSE;&lt;br /&gt;
  if(home_region == llGetRegionName())&lt;br /&gt;
    {&lt;br /&gt;
      // I am in the same home region. Just move close to the start&lt;br /&gt;
      // point.&lt;br /&gt;
      llSetRegionPos(home_position);&lt;br /&gt;
      if(resetScript)&lt;br /&gt;
        {&lt;br /&gt;
          llSetPos(home_position);&lt;br /&gt;
          llSetRot(home_rotation);&lt;br /&gt;
          llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  else&lt;br /&gt;
    {&lt;br /&gt;
      llInstantMessage(llGetOwner(),&amp;quot;There is an error. &amp;quot; +&lt;br /&gt;
                       &amp;quot;I wondered away from my start region and cannot go back home.\n&amp;quot; +&lt;br /&gt;
                       &amp;quot;I am located in &amp;quot; + llGetRegionName() + &amp;quot; at &amp;quot; + &lt;br /&gt;
                       (string)llGetPos());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Primary (default) state.&lt;br /&gt;
// This is the initial state when the program resets.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object waits for a touch to get started. There is&lt;br /&gt;
// a random chance that it might start moving at any time step though.&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        if(home_position.x &amp;lt; 0.0)&lt;br /&gt;
          {&lt;br /&gt;
            // This is the first time to enter this state. Do a little&lt;br /&gt;
            // house cleaning to start the season.&lt;br /&gt;
&lt;br /&gt;
            // Add any parts to the different parameters that require any&lt;br /&gt;
            // calculations.&lt;br /&gt;
            wondering_parameters += &lt;br /&gt;
              [CHARACTER_AVOIDANCE_MODE, AVOID_CHARACTERS | AVOID_DYNAMIC_OBSTACLES];&lt;br /&gt;
            traveling_parameters += &lt;br /&gt;
              [CHARACTER_AVOIDANCE_MODE, AVOID_CHARACTERS | AVOID_DYNAMIC_OBSTACLES];&lt;br /&gt;
&lt;br /&gt;
            // Set the initial home position and orientation.&lt;br /&gt;
            home_position = llGetPos();&lt;br /&gt;
            home_rotation = llGetRot();&lt;br /&gt;
            home_region   = llGetRegionName();&lt;br /&gt;
            llOwnerSay(&amp;quot;Touch me to start moving. &amp;quot; +&lt;br /&gt;
                       &amp;quot;I will not move until you touch me the first time. &amp;quot; +&lt;br /&gt;
                       &amp;quot;After that it will become automatic.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if(home_region == llGetRegionName())&lt;br /&gt;
          {&lt;br /&gt;
            // I am in the same region I started out in. Make sure I&lt;br /&gt;
            // start at the last place and orientation when I left&lt;br /&gt;
            // this state.  Make sure that I move close to&lt;br /&gt;
            // home. (There is some fudge factor in the llSetRegionPos&lt;br /&gt;
            // command according to the wiki).&lt;br /&gt;
            llSetPos(home_position);&lt;br /&gt;
            llSetRot(home_rotation);&lt;br /&gt;
            llSetTimerEvent(TIME_TO_WAIT_BEFORE_MOVING);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        llDeleteCharacter(); // Clear and reset the character&lt;br /&gt;
                             // settings. You should always do this so&lt;br /&gt;
                             // that when an active object is taken&lt;br /&gt;
                             // into inventory it will be properly&lt;br /&gt;
                             // reset when rezzed again. (If not here&lt;br /&gt;
                             // then in the on_rez event.)&lt;br /&gt;
        active_character = FALSE;&lt;br /&gt;
&lt;br /&gt;
        llOwnerSay(&amp;quot;Stopped\nTouch me to have me wonder around.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llCreateCharacter(wondering_parameters);&lt;br /&gt;
        active_character = TRUE;&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
      } // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
           {&lt;br /&gt;
             // This person is in the same group. Assume the idiot can&lt;br /&gt;
             // be trusted.&lt;br /&gt;
             home_position = llGetPos();        // Define my start position&lt;br /&gt;
             home_rotation = llGetRot();        // and start orientation.&lt;br /&gt;
             state Roaming;&lt;br /&gt;
           }&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // I have waited to long without any interaction. Time to roam&lt;br /&gt;
        // because I am a ramblin&#039; object.&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end default state&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Roaming state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to start roaming.  I&lt;br /&gt;
// strongly prefer not to use all these states, but it makes for a&lt;br /&gt;
// much cleaner code in this case and a better demo.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object simply roams around for a while. &lt;br /&gt;
state Roaming&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the roaming parameters&lt;br /&gt;
        llUpdateCharacter(wondering_parameters);&lt;br /&gt;
        llWanderWithin(home_position, wondering_radius, []);&lt;br /&gt;
        llOwnerSay(&amp;quot;Roaming\nTouch me to have me go back home.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
      } // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
        state default;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
          {&lt;br /&gt;
            // Again, if the person is in the same group then let them&lt;br /&gt;
            // violate me by touching me.&lt;br /&gt;
            state TravelHome;&lt;br /&gt;
          }&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
        if ((type == PU_SLOWDOWN_DISTANCE_REACHED) || &lt;br /&gt;
            (type == PU_GOAL_REACHED))&lt;br /&gt;
          {&lt;br /&gt;
            // While roaming this should not occur. if it does just restart???&lt;br /&gt;
            llWanderWithin(home_position, wondering_radius, []);            &lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else {&lt;br /&gt;
          // Something went wrong with the navmesh. Just go home and wait.&lt;br /&gt;
          state TravelHome;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state Roaming&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// TravelHome state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to go home.  I&lt;br /&gt;
// strongly prefer not to use all these states, but it makes for a&lt;br /&gt;
// much cleaner code in this case and a better demo.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object simply tries to go to the home&lt;br /&gt;
// position. If it does not make it in the alloted time the character&lt;br /&gt;
// is deleted, and it simply sets its position.&lt;br /&gt;
state TravelHome&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the traveling parameters and set a&lt;br /&gt;
        // timer to make sure something eventually happens here.&lt;br /&gt;
        llUpdateCharacter(traveling_parameters);&lt;br /&gt;
        llNavigateTo(home_position,[FORCE_DIRECT_PATH,TRUE]);&lt;br /&gt;
        llSetTimerEvent(120.0);&lt;br /&gt;
        llOwnerSay(&amp;quot;Going back home\nTouch me to force the issue.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
      }  // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
        state default;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        // force the issue&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
          {&lt;br /&gt;
            // trust in the authority invested in the people in my&lt;br /&gt;
            // group because blind trust always works out well.&lt;br /&gt;
            forceMoveHome(FALSE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // It took too long to get home.&lt;br /&gt;
        forceMoveHome(FALSE);&lt;br /&gt;
        state default;&lt;br /&gt;
      } // timer&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
        if (type == PU_SLOWDOWN_DISTANCE_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I am close to home. &lt;br /&gt;
            llSetTimerEvent(10.0);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if (type == PU_GOAL_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I have made it home.&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else &lt;br /&gt;
          {&lt;br /&gt;
            // Something went wrong. Just force the issue and go home.&lt;br /&gt;
            forceMoveHome(FALSE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state TravelHome&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pathfinding_Simple_Roaming_Example_With_Evade_Pursue&amp;diff=1173314</id>
		<title>Pathfinding Simple Roaming Example With Evade Pursue</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pathfinding_Simple_Roaming_Example_With_Evade_Pursue&amp;diff=1173314"/>
		<updated>2012-10-11T09:18:57Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Initial draft of a page to make a simple pathfinding script publicly available.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A simple example is provided to use [[Pathfinding]] to have an object randomly roam around a small area is given below and randomly evade or pursue a person who touches it. The script is designed to have the object move around in a small area centered at the start location. The object will move back to its start position if anything goes wrong or a group member touches it. &lt;br /&gt;
&lt;br /&gt;
The script has five states. In the default state the object is not moving and can be placed in its start position. From the default state it can transition into the &#039;&#039;Roaming&#039;&#039; state by touching it as a member of the same group. In the &#039;&#039;Roaming&#039;&#039; state it will simply wander around in a small area centered at the start point. If anything goes wrong with the [[Pathfinding]] functions or a group member touches it, the script will transition into the &#039;&#039;TravelHome&#039;&#039; state. &lt;br /&gt;
&lt;br /&gt;
In the &#039;&#039;TravelHome&#039;&#039; state the script will attempt to move the object back to its start position using the [[Pathfinding]] functions. If anything goes wrong with the [[Pathfinding]] functions or a group member touches it, the script will delete the [[Pathfinding]] character and manually move the object back to its start position using the [[LlSetRegionPos|llSetRegionPos]] function. It will then transition back into the &#039;&#039;default&#039;&#039; state.&lt;br /&gt;
&lt;br /&gt;
If someone touches this object while it is roaming who is not in the same group there is a small chance that it will either evade or pursue the person. If the decision is to evade then the script transitions to the &#039;&#039;Evade_Agent&#039;&#039; state. If the decision is to chase the agent then the script transitions to the &#039;&#039;Chase_Agent&#039;&#039; state.&lt;br /&gt;
&lt;br /&gt;
This code is licensed under the [http://www.gnu.org/licenses/gpl.html|GNU General Public License]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* *****************************************************************&lt;br /&gt;
&lt;br /&gt;
   %%% Desc:   Simple example script to demonstrate pathfinding&lt;br /&gt;
   %%% Author: Dark Mole (contact via IM within Second Life)&lt;br /&gt;
   %%% File:   $HeadURL: simpleMoverWithChaseAndEvade.sl $&lt;br /&gt;
   %%% Date:   $Date: Thu Oct 11 04:44:14 2012 $&lt;br /&gt;
   %%% Revision: $Rev: .04 $&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
   Copyright 2012 Dark Mole (contact via IM in Second Life&lt;br /&gt;
&lt;br /&gt;
   This program is free software: you can redistribute it and/or&lt;br /&gt;
   modify it under the terms of the GNU General Public License as&lt;br /&gt;
   published by the Free Software Foundation, either version 3 of the&lt;br /&gt;
   License, or (at your option) any later version.&lt;br /&gt;
&lt;br /&gt;
   This program is distributed in the hope that it will be useful, but&lt;br /&gt;
   WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of&lt;br /&gt;
   MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU&lt;br /&gt;
   General Public License for more details.&lt;br /&gt;
&lt;br /&gt;
   You should have received a copy of the GNU General Public License&lt;br /&gt;
   along with this program.  If not, see&lt;br /&gt;
   &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   A copy of this script can be found at&lt;br /&gt;
   https://wiki.secondlife.com/wiki/Pathfinding_Simple_Roaming_Example_With_Evade_Pursue&lt;br /&gt;
&lt;br /&gt;
***************************************************************** */&lt;br /&gt;
&lt;br /&gt;
// Configuration variables.&lt;br /&gt;
// Things to change to impact the behavior of the system&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
float TIME_TO_WAIT_BEFORE_MOVING = 300.0; // number of seconds to wait&lt;br /&gt;
                                          // while in the default&lt;br /&gt;
                                          // state before it&lt;br /&gt;
                                          // automatically starts to&lt;br /&gt;
                                          // roam on its own. Note&lt;br /&gt;
                                          // that the first time this&lt;br /&gt;
                                          // thing rezzes this timer&lt;br /&gt;
                                          // is ignored.&lt;br /&gt;
&lt;br /&gt;
// Global Variables. (do not change unless you know what they do!)&lt;br /&gt;
&lt;br /&gt;
// Location related variables&lt;br /&gt;
&lt;br /&gt;
vector   home_position = &amp;lt;-1.0,0.0,0.0&amp;gt;;&lt;br /&gt;
rotation home_rotation = ZERO_ROTATION;&lt;br /&gt;
string   home_region   = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
vector wondering_radius = &amp;lt;5.0,5.0,20.0&amp;gt;; // how far I can roam around&lt;br /&gt;
list   wondering_parameters = &lt;br /&gt;
  [CHARACTER_MAX_SPEED,         1.0,        // parameters describing&lt;br /&gt;
   CHARACTER_DESIRED_SPEED,     0.2,       // how I can roam.&lt;br /&gt;
   CHARACTER_DESIRED_TURN_SPEED,0.02,&lt;br /&gt;
   CHARACTER_MAX_ACCEL,         0.5,&lt;br /&gt;
   CHARACTER_MAX_DECEL,         0.5,&lt;br /&gt;
   CHARACTER_ORIENTATION,       VERTICAL,&lt;br /&gt;
   TRAVERSAL_TYPE,              TRAVERSAL_TYPE_SLOW,&lt;br /&gt;
   CHARACTER_TYPE,              CHARACTER_TYPE_A, &lt;br /&gt;
   CHARACTER_MAX_TURN_RADIUS,   0.5];&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
list traveling_parameters = &lt;br /&gt;
  [CHARACTER_MAX_SPEED,         5.0,        // parameters describing&lt;br /&gt;
   CHARACTER_DESIRED_SPEED,     3.0,        // how I can roam when &lt;br /&gt;
   CHARACTER_DESIRED_TURN_SPEED,2.0,        // traveling..&lt;br /&gt;
   CHARACTER_MAX_ACCEL,         3.0,&lt;br /&gt;
   CHARACTER_MAX_DECEL,         3.0,&lt;br /&gt;
   CHARACTER_ORIENTATION,       VERTICAL,&lt;br /&gt;
   TRAVERSAL_TYPE,              TRAVERSAL_TYPE_SLOW,&lt;br /&gt;
   CHARACTER_TYPE,              CHARACTER_TYPE_A, &lt;br /&gt;
   CHARACTER_MAX_TURN_RADIUS,   1.5];&lt;br /&gt;
&lt;br /&gt;
list   chasing_parameters = &lt;br /&gt;
  [CHARACTER_MAX_SPEED,         15.0,       // parameters describing&lt;br /&gt;
   CHARACTER_DESIRED_SPEED,     10.0,      // how I can chase someone.&lt;br /&gt;
   CHARACTER_DESIRED_TURN_SPEED,8.0, &lt;br /&gt;
   CHARACTER_MAX_ACCEL,         7.5,&lt;br /&gt;
   CHARACTER_MAX_DECEL,         7.5,&lt;br /&gt;
   CHARACTER_ORIENTATION,       VERTICAL,&lt;br /&gt;
   TRAVERSAL_TYPE,              TRAVERSAL_TYPE_FAST,&lt;br /&gt;
   CHARACTER_TYPE,              CHARACTER_TYPE_A, &lt;br /&gt;
   CHARACTER_MAX_TURN_RADIUS,   0.8,&lt;br /&gt;
   CHARACTER_AVOIDANCE_MODE,    AVOID_DYNAMIC_OBSTACLES];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Variables associated with the state of the script&lt;br /&gt;
integer active_character = FALSE;&lt;br /&gt;
key     agentToChase     = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
// Helper functions &lt;br /&gt;
&lt;br /&gt;
/* *********************************************************&lt;br /&gt;
   forceMoveHome(integer resetScript)&lt;br /&gt;
&lt;br /&gt;
   Routine to force the object to go home. The option &amp;quot;resetScript&amp;quot; is&lt;br /&gt;
   to determine if the script should be reset when it is in the same&lt;br /&gt;
   region it started from.&lt;br /&gt;
&lt;br /&gt;
********************************************************* */&lt;br /&gt;
forceMoveHome(integer resetScript)&lt;br /&gt;
{&lt;br /&gt;
  // Stop and delete the character&lt;br /&gt;
  llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
  llDeleteCharacter();&lt;br /&gt;
  active_character = FALSE;&lt;br /&gt;
  if(home_region == llGetRegionName())&lt;br /&gt;
    {&lt;br /&gt;
      // I am in the same home region. Just move close to the start&lt;br /&gt;
      // point.&lt;br /&gt;
      llSetRegionPos(home_position);&lt;br /&gt;
      if(resetScript)&lt;br /&gt;
        {&lt;br /&gt;
          llSetPos(home_position);&lt;br /&gt;
          llSetRot(home_rotation);&lt;br /&gt;
          llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  else&lt;br /&gt;
    {&lt;br /&gt;
      llInstantMessage(llGetOwner(),&amp;quot;There is an error. &amp;quot; +&lt;br /&gt;
                       &amp;quot;I wondered away from my start region and cannot go back home.\n&amp;quot; +&lt;br /&gt;
                       &amp;quot;I am located in &amp;quot; + llGetRegionName() + &amp;quot; at &amp;quot; + &lt;br /&gt;
                       (string)llGetPos());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Primary (default) state.&lt;br /&gt;
// This is the initial state when the program resets.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object waits for a touch to get started. There is&lt;br /&gt;
// a random chance that it might start moving at any time step though.&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        if(home_position.x &amp;lt; 0.0)&lt;br /&gt;
          {&lt;br /&gt;
            // This is the first time to enter this state. Do a little&lt;br /&gt;
            // house cleaning to start the season.&lt;br /&gt;
&lt;br /&gt;
            // Add any parts to the different parameters that require any&lt;br /&gt;
            // calculations.&lt;br /&gt;
            wondering_parameters += &lt;br /&gt;
              [CHARACTER_AVOIDANCE_MODE, AVOID_CHARACTERS | AVOID_DYNAMIC_OBSTACLES];&lt;br /&gt;
            traveling_parameters += &lt;br /&gt;
              [CHARACTER_AVOIDANCE_MODE, AVOID_CHARACTERS | AVOID_DYNAMIC_OBSTACLES];&lt;br /&gt;
&lt;br /&gt;
            // Set the initial home position and orientation.&lt;br /&gt;
            home_position = llGetPos();&lt;br /&gt;
            home_rotation = llGetRot();&lt;br /&gt;
            home_region   = llGetRegionName();&lt;br /&gt;
            llOwnerSay(&amp;quot;Touch me to start moving. &amp;quot; +&lt;br /&gt;
                       &amp;quot;I will not move until you touch me the first time. &amp;quot; +&lt;br /&gt;
                       &amp;quot;After that it will become automatic.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if(home_region == llGetRegionName())&lt;br /&gt;
          {&lt;br /&gt;
            // I am in the same region I started out in. Make sure I&lt;br /&gt;
            // start at the last place and orientation when I left&lt;br /&gt;
            // this state.  Make sure that I move close to&lt;br /&gt;
            // home. (There is some fudge factor in the llSetRegionPos&lt;br /&gt;
            // command according to the wiki).&lt;br /&gt;
            llSetPos(home_position);&lt;br /&gt;
            llSetRot(home_rotation);&lt;br /&gt;
            llSetTimerEvent(TIME_TO_WAIT_BEFORE_MOVING);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        llDeleteCharacter(); // Clear and reset the character&lt;br /&gt;
                             // settings. You should always do this so&lt;br /&gt;
                             // that when an active object is taken&lt;br /&gt;
                             // into inventory it will be properly&lt;br /&gt;
                             // reset when rezzed again. (If not here&lt;br /&gt;
                             // then in the on_rez event.)&lt;br /&gt;
        active_character = FALSE;&lt;br /&gt;
&lt;br /&gt;
        llOwnerSay(&amp;quot;Stopped\nTouch me to have me wonder around.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llCreateCharacter(wondering_parameters);&lt;br /&gt;
        active_character = TRUE;&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
      } // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
           {&lt;br /&gt;
             // This person is in the same group. Assume the idiot can&lt;br /&gt;
             // be trusted.&lt;br /&gt;
             home_position = llGetPos();        // Define my start position&lt;br /&gt;
             home_rotation = llGetRot();        // and start orientation.&lt;br /&gt;
             state Roaming;&lt;br /&gt;
           }&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // I have waited to long without any interaction. Time to roam&lt;br /&gt;
        // because I am a ramblin&#039; object.&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end default state&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Roaming state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to start roaming.  I&lt;br /&gt;
// strongly prefer not to use all these states, but it makes for a&lt;br /&gt;
// much cleaner code in this case and a better demo.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object simply roams around for a while. &lt;br /&gt;
state Roaming&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the roaming parameters&lt;br /&gt;
        llUpdateCharacter(wondering_parameters);&lt;br /&gt;
        llWanderWithin(home_position, wondering_radius, []);&lt;br /&gt;
        llOwnerSay(&amp;quot;Roaming\nTouch me to have me go back home.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
      } // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
        state default;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
          {&lt;br /&gt;
            // Again, if the person is in the same group then let them&lt;br /&gt;
            // violate me by touching me.&lt;br /&gt;
            state TravelHome;&lt;br /&gt;
          }&lt;br /&gt;
        else if (llFrand(1.0) &amp;lt; 0.10)&lt;br /&gt;
          {&lt;br /&gt;
            // What the heck. Let&#039;s chase this person!&lt;br /&gt;
            agentToChase = llDetectedKey(0);&lt;br /&gt;
            state Chase_Agent;&lt;br /&gt;
          }&lt;br /&gt;
        else if (llFrand(1.0) &amp;lt; 0.10)&lt;br /&gt;
          {&lt;br /&gt;
            // What the heck. Run away! Run Away!&lt;br /&gt;
            agentToChase = llDetectedKey(0);&lt;br /&gt;
            state Evade_Agent;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
        if ((type == PU_SLOWDOWN_DISTANCE_REACHED) || &lt;br /&gt;
            (type == PU_GOAL_REACHED))&lt;br /&gt;
          {&lt;br /&gt;
            // While roaming this should not occur. if it does just restart???&lt;br /&gt;
            llWanderWithin(home_position, wondering_radius, []);            &lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else {&lt;br /&gt;
          // Something went wrong with the navmesh. Just go home and wait.&lt;br /&gt;
          state TravelHome;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state Roaming&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// TravelHome state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to go home.  I&lt;br /&gt;
// strongly prefer not to use all these states, but it makes for a&lt;br /&gt;
// much cleaner code in this case and a better demo.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object simply tries to go to the home&lt;br /&gt;
// position. If it does not make it in the alloted time the character&lt;br /&gt;
// is deleted, and it simply sets its position.&lt;br /&gt;
state TravelHome&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the traveling parameters and set a&lt;br /&gt;
        // timer to make sure something eventually happens here.&lt;br /&gt;
        llUpdateCharacter(traveling_parameters);&lt;br /&gt;
        llNavigateTo(home_position,[FORCE_DIRECT_PATH,TRUE]);&lt;br /&gt;
        llSetTimerEvent(120.0);&lt;br /&gt;
        llOwnerSay(&amp;quot;Going back home\nTouch me to force the issue.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        if(active_character)&lt;br /&gt;
          {&lt;br /&gt;
            llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
          }&lt;br /&gt;
      }  // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
        state default;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        // force the issue&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
          {&lt;br /&gt;
            // trust in the authority invested in the people in my&lt;br /&gt;
            // group because blind trust always works out well.&lt;br /&gt;
            forceMoveHome(FALSE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // It took too long to get home.&lt;br /&gt;
        forceMoveHome(FALSE);&lt;br /&gt;
        state default;&lt;br /&gt;
      } // timer&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
        if (type == PU_SLOWDOWN_DISTANCE_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I am close to home. &lt;br /&gt;
            llSetTimerEvent(10.0);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if (type == PU_GOAL_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I have made it home.&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else &lt;br /&gt;
          {&lt;br /&gt;
            // Something went wrong. Just force the issue and go home.&lt;br /&gt;
            forceMoveHome(FALSE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state TravelHome&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Chase_Agent state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to chase the person who&lt;br /&gt;
// touched the object. Touch it again to go back to wandering.&lt;br /&gt;
//&lt;br /&gt;
state Chase_Agent&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the traveling parameters and set a&lt;br /&gt;
        // timer to make sure something eventually happens here.&lt;br /&gt;
&lt;br /&gt;
        // Get information about the person&lt;br /&gt;
        list agentInfo = llGetObjectDetails(agentToChase,[OBJECT_ROT]);&lt;br /&gt;
        if(llGetListLength(agentInfo)==0)&lt;br /&gt;
          {&lt;br /&gt;
            // well that was a bust. Cannot find this person. Just go&lt;br /&gt;
            // back to roaming.&lt;br /&gt;
            state Roaming;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        // I can locate the agent. Let&#039;s chase it down.&lt;br /&gt;
&lt;br /&gt;
        // Need to get the offset separately, because the z-component&lt;br /&gt;
        // will not be zero due to round off errors. The purse offset&lt;br /&gt;
        // has to have a zero z component.&lt;br /&gt;
        vector offset = &amp;lt;-1.0,0.0,0.0&amp;gt;*llList2Rot(agentInfo,0); &lt;br /&gt;
        llUpdateCharacter(chasing_parameters);&lt;br /&gt;
        llPursue(agentToChase,&lt;br /&gt;
                 [PURSUIT_OFFSET,        &amp;lt;offset.x,offset.y,0.0&amp;gt;,&lt;br /&gt;
                  REQUIRE_LINE_OF_SIGHT, FALSE,&lt;br /&gt;
                  PURSUIT_FUZZ_FACTOR,   0.8,&lt;br /&gt;
                  PURSUIT_INTERCEPT,     TRUE,&lt;br /&gt;
                  PURSUIT_GOAL_TOLERANCE,1.0]);&lt;br /&gt;
        llSetTimerEvent(120.0);&lt;br /&gt;
        llOwnerSay(&amp;quot;Chasing this person\nTouch me to stop chasing.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
      }  // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
        state default;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        // Stop chasing and go back to wandering mode&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // This is enough of this nonsense. I am tired. Start&lt;br /&gt;
        // wandering again.&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      } // timer&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
&lt;br /&gt;
        if (type == PU_SLOWDOWN_DISTANCE_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I am close to home. &lt;br /&gt;
            llSetTimerEvent(10.0);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if ((type == PU_GOAL_REACHED) || (type == PU_FAILURE_TARGET_GONE))&lt;br /&gt;
          {&lt;br /&gt;
            // I have found the agent or they are gone. Let&#039;s just put&lt;br /&gt;
            // an end to this.&lt;br /&gt;
            state Roaming;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else &lt;br /&gt;
          {&lt;br /&gt;
            // Something went wrong. Just end this now.&lt;br /&gt;
            state Roaming;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state Chase_Agent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Evade_Agent state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to run away from the&lt;br /&gt;
// person who touched the object. Touch it again to go back to&lt;br /&gt;
// wandering.&lt;br /&gt;
//&lt;br /&gt;
state Evade_Agent&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the traveling parameters and set a&lt;br /&gt;
        // timer to make sure something eventually happens here. Here&lt;br /&gt;
        // I just use the same settings as used to chase since they&lt;br /&gt;
        // seem okay. /me shrugs.&lt;br /&gt;
&lt;br /&gt;
        llUpdateCharacter(chasing_parameters);&lt;br /&gt;
        llEvade(agentToChase,[]);&lt;br /&gt;
        llSetTimerEvent(120.0);&lt;br /&gt;
        llOwnerSay(&amp;quot;Evading this person\nTouch me to stop chasing.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
      }  // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
        state default;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        // Stop evading and go back to wandering mode&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // This is enough of this nonsense. I am tired. Start&lt;br /&gt;
        // wandering again.&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      } // timer&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
&lt;br /&gt;
        if (type == PU_SLOWDOWN_DISTANCE_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I am close to home. &lt;br /&gt;
            llSetTimerEvent(10.0);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if ((type == PU_GOAL_REACHED) || (type == PU_FAILURE_TARGET_GONE))&lt;br /&gt;
          {&lt;br /&gt;
            // I have found the agent or they are gone. Let&#039;s just put&lt;br /&gt;
            // an end to this.&lt;br /&gt;
            state Roaming;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if ((type == PU_EVADE_HIDDEN) || (type == PU_EVADE_SPOTTED))&lt;br /&gt;
          {&lt;br /&gt;
            // I have been spotted. Oh noze.... panic seems like an&lt;br /&gt;
            // appropriate plan at this point.&lt;br /&gt;
            vector mySize = llGetScale();&lt;br /&gt;
            if(mySize.z*0.25 &amp;gt; 2.0)&lt;br /&gt;
              {&lt;br /&gt;
                // Cannot jump this high. Tone it down a bit&lt;br /&gt;
                mySize.z = 8.0;&lt;br /&gt;
              }&lt;br /&gt;
            llExecCharacterCmd(CHARACTER_CMD_JUMP,[mySize.z*0.25]);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else &lt;br /&gt;
          {&lt;br /&gt;
            // Something went wrong. Just end this now.&lt;br /&gt;
            state Roaming;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state Evade_Agent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pathfinding_Simple_Roaming_Example&amp;diff=1173313</id>
		<title>Pathfinding Simple Roaming Example</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pathfinding_Simple_Roaming_Example&amp;diff=1173313"/>
		<updated>2012-10-11T09:12:58Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Fixed the url to the GPL license details.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A simple example is provided to use [[Pathfinding]] to have an object randomly roam around a small area is given below. The script is designed to have the object move around in a small area centered at the start location. The object will move back to its start position if anything goes wrong or a group member touches it. &lt;br /&gt;
&lt;br /&gt;
The script has three states. In the default state the object is not moving and can be placed in its start position. From the default state it can transition into the &#039;&#039;Roaming&#039;&#039; state by touching it as a member of the same group. In the &#039;&#039;Roaming&#039;&#039; state it will simply wander around in a small area centered at the start point. If anything goes wrong with the [[Pathfinding]] functions or a group member touches it, the script will transition into the &#039;&#039;TravelHome&#039;&#039; state. &lt;br /&gt;
&lt;br /&gt;
In the &#039;&#039;TravelHome&#039;&#039; state the script will attempt to move the object back to its start position using the [[Pathfinding]] functions. If anything goes wrong with the [[Pathfinding]] functions or a group member touches it, the script will delete the [[Pathfinding]] character and manually move the object back to its start position using the [[LlSetRegionPos|llSetRegionPos]] function. It will then transition back into the &#039;&#039;default&#039;&#039; state.&lt;br /&gt;
&lt;br /&gt;
This code is licensed under the [http://www.gnu.org/licenses/gpl.html GNU General Public License]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* *****************************************************************&lt;br /&gt;
&lt;br /&gt;
   %%% Desc:   Simple example script to demonstrate pathfinding&lt;br /&gt;
   %%% Author: Dark Mole (contact via IM within Second Life)&lt;br /&gt;
   %%% File:   $HeadURL: simpleMover.sl $&lt;br /&gt;
   %%% Date:   $Date: Thu Oct 11 04:44:14 2012 $&lt;br /&gt;
   %%% Revision: $Rev: .04 $&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
   Copyright 2012 Dark Mole (contact via IM in Second Life&lt;br /&gt;
&lt;br /&gt;
   This program is free software: you can redistribute it and/or&lt;br /&gt;
   modify it under the terms of the GNU General Public License as&lt;br /&gt;
   published by the Free Software Foundation, either version 3 of the&lt;br /&gt;
   License, or (at your option) any later version.&lt;br /&gt;
&lt;br /&gt;
   This program is distributed in the hope that it will be useful, but&lt;br /&gt;
   WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of&lt;br /&gt;
   MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU&lt;br /&gt;
   General Public License for more details.&lt;br /&gt;
&lt;br /&gt;
   You should have received a copy of the GNU General Public License&lt;br /&gt;
   along with this program.  If not, see&lt;br /&gt;
   &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   A copy of this script can be found at &lt;br /&gt;
   https://wiki.secondlife.com/wiki/Pathfinding_Simple_Roaming_Example&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
***************************************************************** */&lt;br /&gt;
&lt;br /&gt;
// Configuration variables.&lt;br /&gt;
// Things to change to impact the behavior of the system&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
float TIME_TO_WAIT_BEFORE_MOVING = 300.0; // number of seconds to wait&lt;br /&gt;
                                          // while in the default&lt;br /&gt;
                                          // state before it&lt;br /&gt;
                                          // automatically starts to&lt;br /&gt;
                                          // roam on its own. Note&lt;br /&gt;
                                          // that the first time this&lt;br /&gt;
                                          // thing rezzes this timer&lt;br /&gt;
                                          // is ignored.&lt;br /&gt;
&lt;br /&gt;
// Global Variables. (do not change unless you know what they do!)&lt;br /&gt;
&lt;br /&gt;
// Location related variables&lt;br /&gt;
&lt;br /&gt;
vector   home_position = &amp;lt;-1.0,0.0,0.0&amp;gt;;&lt;br /&gt;
rotation home_rotation = ZERO_ROTATION;&lt;br /&gt;
string   home_region   = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
vector wondering_radius = &amp;lt;5.0,5.0,20.0&amp;gt;; // how far I can roam around&lt;br /&gt;
list   wondering_parameters = &lt;br /&gt;
  [CHARACTER_MAX_SPEED,         1.0,        // parameters describing&lt;br /&gt;
   CHARACTER_DESIRED_SPEED,     0.2,       // how I can roam.&lt;br /&gt;
   CHARACTER_DESIRED_TURN_SPEED,0.02,&lt;br /&gt;
   CHARACTER_MAX_ACCEL,         0.5,&lt;br /&gt;
   CHARACTER_MAX_DECEL,         0.5,&lt;br /&gt;
   CHARACTER_ORIENTATION,       VERTICAL,&lt;br /&gt;
   TRAVERSAL_TYPE,              TRAVERSAL_TYPE_SLOW,&lt;br /&gt;
   CHARACTER_TYPE,              CHARACTER_TYPE_A, &lt;br /&gt;
   CHARACTER_MAX_TURN_RADIUS,   0.5];&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
list traveling_parameters = &lt;br /&gt;
  [CHARACTER_MAX_SPEED,         5.0,        // parameters describing&lt;br /&gt;
   CHARACTER_DESIRED_SPEED,     3.0,        // how I can roam when &lt;br /&gt;
   CHARACTER_DESIRED_TURN_SPEED,2.0,        // traveling..&lt;br /&gt;
   CHARACTER_MAX_ACCEL,         3.0,&lt;br /&gt;
   CHARACTER_MAX_DECEL,         3.0,&lt;br /&gt;
   CHARACTER_ORIENTATION,       VERTICAL,&lt;br /&gt;
   TRAVERSAL_TYPE,              TRAVERSAL_TYPE_SLOW,&lt;br /&gt;
   CHARACTER_TYPE,              CHARACTER_TYPE_A, &lt;br /&gt;
   CHARACTER_MAX_TURN_RADIUS,   1.5];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Variables associated with the state of the script&lt;br /&gt;
integer active_character = FALSE;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Helper functions &lt;br /&gt;
&lt;br /&gt;
/* *********************************************************&lt;br /&gt;
   forceMoveHome(integer resetScript)&lt;br /&gt;
&lt;br /&gt;
   Routine to force the object to go home. The option &amp;quot;resetScript&amp;quot; is&lt;br /&gt;
   to determine if the script should be reset when it is in the same&lt;br /&gt;
   region it started from.&lt;br /&gt;
&lt;br /&gt;
********************************************************* */&lt;br /&gt;
forceMoveHome(integer resetScript)&lt;br /&gt;
{&lt;br /&gt;
  // Stop and delete the character&lt;br /&gt;
  llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
  llDeleteCharacter();&lt;br /&gt;
  active_character = FALSE;&lt;br /&gt;
  if(home_region == llGetRegionName())&lt;br /&gt;
    {&lt;br /&gt;
      // I am in the same home region. Just move close to the start&lt;br /&gt;
      // point.&lt;br /&gt;
      llSetRegionPos(home_position);&lt;br /&gt;
      if(resetScript)&lt;br /&gt;
        {&lt;br /&gt;
          llSetPos(home_position);&lt;br /&gt;
          llSetRot(home_rotation);&lt;br /&gt;
          llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  else&lt;br /&gt;
    {&lt;br /&gt;
      llInstantMessage(llGetOwner(),&amp;quot;There is an error. &amp;quot; +&lt;br /&gt;
                       &amp;quot;I wondered away from my start region and cannot go back home.\n&amp;quot; +&lt;br /&gt;
                       &amp;quot;I am located in &amp;quot; + llGetRegionName() + &amp;quot; at &amp;quot; + &lt;br /&gt;
                       (string)llGetPos());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Primary (default) state.&lt;br /&gt;
// This is the initial state when the program resets.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object waits for a touch to get started. There is&lt;br /&gt;
// a random chance that it might start moving at any time step though.&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        if(home_position.x &amp;lt; 0.0)&lt;br /&gt;
          {&lt;br /&gt;
            // This is the first time to enter this state. Do a little&lt;br /&gt;
            // house cleaning to start the season.&lt;br /&gt;
&lt;br /&gt;
            // Add any parts to the different parameters that require any&lt;br /&gt;
            // calculations.&lt;br /&gt;
            wondering_parameters += &lt;br /&gt;
              [CHARACTER_AVOIDANCE_MODE, AVOID_CHARACTERS | AVOID_DYNAMIC_OBSTACLES];&lt;br /&gt;
            traveling_parameters += &lt;br /&gt;
              [CHARACTER_AVOIDANCE_MODE, AVOID_CHARACTERS | AVOID_DYNAMIC_OBSTACLES];&lt;br /&gt;
&lt;br /&gt;
            // Set the initial home position and orientation.&lt;br /&gt;
            home_position = llGetPos();&lt;br /&gt;
            home_rotation = llGetRot();&lt;br /&gt;
            home_region   = llGetRegionName();&lt;br /&gt;
            llOwnerSay(&amp;quot;Touch me to start moving. &amp;quot; +&lt;br /&gt;
                       &amp;quot;I will not move until you touch me the first time. &amp;quot; +&lt;br /&gt;
                       &amp;quot;After that it will become automatic.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if(home_region == llGetRegionName())&lt;br /&gt;
          {&lt;br /&gt;
            // I am in the same region I started out in. Make sure I&lt;br /&gt;
            // start at the last place and orientation when I left&lt;br /&gt;
            // this state.  Make sure that I move close to&lt;br /&gt;
            // home. (There is some fudge factor in the llSetRegionPos&lt;br /&gt;
            // command according to the wiki).&lt;br /&gt;
            llSetPos(home_position);&lt;br /&gt;
            llSetRot(home_rotation);&lt;br /&gt;
            llSetTimerEvent(TIME_TO_WAIT_BEFORE_MOVING);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        llDeleteCharacter(); // Clear and reset the character&lt;br /&gt;
                             // settings. You should always do this so&lt;br /&gt;
                             // that when an active object is taken&lt;br /&gt;
                             // into inventory it will be properly&lt;br /&gt;
                             // reset when rezzed again. (If not here&lt;br /&gt;
                             // then in the on_rez event.)&lt;br /&gt;
        active_character = FALSE;&lt;br /&gt;
&lt;br /&gt;
        llOwnerSay(&amp;quot;Stopped\nTouch me to have me wonder around.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llCreateCharacter(wondering_parameters);&lt;br /&gt;
        active_character = TRUE;&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
      } // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
           {&lt;br /&gt;
             // This person is in the same group. Assume the idiot can&lt;br /&gt;
             // be trusted.&lt;br /&gt;
             home_position = llGetPos();        // Define my start position&lt;br /&gt;
             home_rotation = llGetRot();        // and start orientation.&lt;br /&gt;
             state Roaming;&lt;br /&gt;
           }&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // I have waited to long without any interaction. Time to roam&lt;br /&gt;
        // because I am a ramblin&#039; object.&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end default state&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Roaming state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to start roaming.  I&lt;br /&gt;
// strongly prefer not to use all these states, but it makes for a&lt;br /&gt;
// much cleaner code in this case and a better demo.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object simply roams around for a while. &lt;br /&gt;
state Roaming&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the roaming parameters&lt;br /&gt;
        llUpdateCharacter(wondering_parameters);&lt;br /&gt;
        llWanderWithin(home_position, wondering_radius, []);&lt;br /&gt;
        llOwnerSay(&amp;quot;Roaming\nTouch me to have me go back home.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
      } // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
        state default;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
          {&lt;br /&gt;
            // Again, if the person is in the same group then let them&lt;br /&gt;
            // violate me by touching me.&lt;br /&gt;
            state TravelHome;&lt;br /&gt;
          }&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
        if ((type == PU_SLOWDOWN_DISTANCE_REACHED) || &lt;br /&gt;
            (type == PU_GOAL_REACHED))&lt;br /&gt;
          {&lt;br /&gt;
            // While roaming this should not occur. if it does just restart???&lt;br /&gt;
            llWanderWithin(home_position, wondering_radius, []);            &lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else {&lt;br /&gt;
          // Something went wrong with the navmesh. Just go home and wait.&lt;br /&gt;
          state TravelHome;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state Roaming&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// TravelHome state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to go home.  I&lt;br /&gt;
// strongly prefer not to use all these states, but it makes for a&lt;br /&gt;
// much cleaner code in this case and a better demo.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object simply tries to go to the home&lt;br /&gt;
// position. If it does not make it in the alloted time the character&lt;br /&gt;
// is deleted, and it simply sets its position.&lt;br /&gt;
state TravelHome&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the traveling parameters and set a&lt;br /&gt;
        // timer to make sure something eventually happens here.&lt;br /&gt;
        llUpdateCharacter(traveling_parameters);&lt;br /&gt;
        llNavigateTo(home_position,[FORCE_DIRECT_PATH,TRUE]);&lt;br /&gt;
        llSetTimerEvent(120.0);&lt;br /&gt;
        llOwnerSay(&amp;quot;Going back home\nTouch me to force the issue.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        if(active_character)&lt;br /&gt;
          {&lt;br /&gt;
            llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
          }&lt;br /&gt;
      }  // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
        state default;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        // force the issue&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
          {&lt;br /&gt;
            // trust in the authority invested in the people in my&lt;br /&gt;
            // group because blind trust always works out well.&lt;br /&gt;
            forceMoveHome(FALSE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // It took too long to get home.&lt;br /&gt;
        forceMoveHome(FALSE);&lt;br /&gt;
        state default;&lt;br /&gt;
      } // timer&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
        if (type == PU_SLOWDOWN_DISTANCE_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I am close to home. &lt;br /&gt;
            llSetTimerEvent(10.0);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if (type == PU_GOAL_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I have made it home.&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else &lt;br /&gt;
          {&lt;br /&gt;
            // Something went wrong. Just force the issue and go home.&lt;br /&gt;
            forceMoveHome(FALSE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state TravelHome&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pathfinding_Simple_Roaming_Example&amp;diff=1173312</id>
		<title>Pathfinding Simple Roaming Example</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pathfinding_Simple_Roaming_Example&amp;diff=1173312"/>
		<updated>2012-10-11T09:11:16Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Initial draft of a page to make a simple pathfinding script publicly available.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A simple example is provided to use [[Pathfinding]] to have an object randomly roam around a small area is given below. The script is designed to have the object move around in a small area centered at the start location. The object will move back to its start position if anything goes wrong or a group member touches it. &lt;br /&gt;
&lt;br /&gt;
The script has three states. In the default state the object is not moving and can be placed in its start position. From the default state it can transition into the &#039;&#039;Roaming&#039;&#039; state by touching it as a member of the same group. In the &#039;&#039;Roaming&#039;&#039; state it will simply wander around in a small area centered at the start point. If anything goes wrong with the [[Pathfinding]] functions or a group member touches it, the script will transition into the &#039;&#039;TravelHome&#039;&#039; state. &lt;br /&gt;
&lt;br /&gt;
In the &#039;&#039;TravelHome&#039;&#039; state the script will attempt to move the object back to its start position using the [[Pathfinding]] functions. If anything goes wrong with the [[Pathfinding]] functions or a group member touches it, the script will delete the [[Pathfinding]] character and manually move the object back to its start position using the [[LlSetRegionPos|llSetRegionPos]] function. It will then transition back into the &#039;&#039;default&#039;&#039; state.&lt;br /&gt;
&lt;br /&gt;
This code is licensed under the [[http://www.gnu.org/licenses/gpl.html|GNU General Public License]]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* *****************************************************************&lt;br /&gt;
&lt;br /&gt;
   %%% Desc:   Simple example script to demonstrate pathfinding&lt;br /&gt;
   %%% Author: Dark Mole (contact via IM within Second Life)&lt;br /&gt;
   %%% File:   $HeadURL: simpleMover.sl $&lt;br /&gt;
   %%% Date:   $Date: Thu Oct 11 04:44:14 2012 $&lt;br /&gt;
   %%% Revision: $Rev: .04 $&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
   Copyright 2012 Dark Mole (contact via IM in Second Life&lt;br /&gt;
&lt;br /&gt;
   This program is free software: you can redistribute it and/or&lt;br /&gt;
   modify it under the terms of the GNU General Public License as&lt;br /&gt;
   published by the Free Software Foundation, either version 3 of the&lt;br /&gt;
   License, or (at your option) any later version.&lt;br /&gt;
&lt;br /&gt;
   This program is distributed in the hope that it will be useful, but&lt;br /&gt;
   WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of&lt;br /&gt;
   MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU&lt;br /&gt;
   General Public License for more details.&lt;br /&gt;
&lt;br /&gt;
   You should have received a copy of the GNU General Public License&lt;br /&gt;
   along with this program.  If not, see&lt;br /&gt;
   &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   A copy of this script can be found at &lt;br /&gt;
   https://wiki.secondlife.com/wiki/Pathfinding_Simple_Roaming_Example&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
***************************************************************** */&lt;br /&gt;
&lt;br /&gt;
// Configuration variables.&lt;br /&gt;
// Things to change to impact the behavior of the system&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
float TIME_TO_WAIT_BEFORE_MOVING = 300.0; // number of seconds to wait&lt;br /&gt;
                                          // while in the default&lt;br /&gt;
                                          // state before it&lt;br /&gt;
                                          // automatically starts to&lt;br /&gt;
                                          // roam on its own. Note&lt;br /&gt;
                                          // that the first time this&lt;br /&gt;
                                          // thing rezzes this timer&lt;br /&gt;
                                          // is ignored.&lt;br /&gt;
&lt;br /&gt;
// Global Variables. (do not change unless you know what they do!)&lt;br /&gt;
&lt;br /&gt;
// Location related variables&lt;br /&gt;
&lt;br /&gt;
vector   home_position = &amp;lt;-1.0,0.0,0.0&amp;gt;;&lt;br /&gt;
rotation home_rotation = ZERO_ROTATION;&lt;br /&gt;
string   home_region   = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
vector wondering_radius = &amp;lt;5.0,5.0,20.0&amp;gt;; // how far I can roam around&lt;br /&gt;
list   wondering_parameters = &lt;br /&gt;
  [CHARACTER_MAX_SPEED,         1.0,        // parameters describing&lt;br /&gt;
   CHARACTER_DESIRED_SPEED,     0.2,       // how I can roam.&lt;br /&gt;
   CHARACTER_DESIRED_TURN_SPEED,0.02,&lt;br /&gt;
   CHARACTER_MAX_ACCEL,         0.5,&lt;br /&gt;
   CHARACTER_MAX_DECEL,         0.5,&lt;br /&gt;
   CHARACTER_ORIENTATION,       VERTICAL,&lt;br /&gt;
   TRAVERSAL_TYPE,              TRAVERSAL_TYPE_SLOW,&lt;br /&gt;
   CHARACTER_TYPE,              CHARACTER_TYPE_A, &lt;br /&gt;
   CHARACTER_MAX_TURN_RADIUS,   0.5];&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
list traveling_parameters = &lt;br /&gt;
  [CHARACTER_MAX_SPEED,         5.0,        // parameters describing&lt;br /&gt;
   CHARACTER_DESIRED_SPEED,     3.0,        // how I can roam when &lt;br /&gt;
   CHARACTER_DESIRED_TURN_SPEED,2.0,        // traveling..&lt;br /&gt;
   CHARACTER_MAX_ACCEL,         3.0,&lt;br /&gt;
   CHARACTER_MAX_DECEL,         3.0,&lt;br /&gt;
   CHARACTER_ORIENTATION,       VERTICAL,&lt;br /&gt;
   TRAVERSAL_TYPE,              TRAVERSAL_TYPE_SLOW,&lt;br /&gt;
   CHARACTER_TYPE,              CHARACTER_TYPE_A, &lt;br /&gt;
   CHARACTER_MAX_TURN_RADIUS,   1.5];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Variables associated with the state of the script&lt;br /&gt;
integer active_character = FALSE;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Helper functions &lt;br /&gt;
&lt;br /&gt;
/* *********************************************************&lt;br /&gt;
   forceMoveHome(integer resetScript)&lt;br /&gt;
&lt;br /&gt;
   Routine to force the object to go home. The option &amp;quot;resetScript&amp;quot; is&lt;br /&gt;
   to determine if the script should be reset when it is in the same&lt;br /&gt;
   region it started from.&lt;br /&gt;
&lt;br /&gt;
********************************************************* */&lt;br /&gt;
forceMoveHome(integer resetScript)&lt;br /&gt;
{&lt;br /&gt;
  // Stop and delete the character&lt;br /&gt;
  llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
  llDeleteCharacter();&lt;br /&gt;
  active_character = FALSE;&lt;br /&gt;
  if(home_region == llGetRegionName())&lt;br /&gt;
    {&lt;br /&gt;
      // I am in the same home region. Just move close to the start&lt;br /&gt;
      // point.&lt;br /&gt;
      llSetRegionPos(home_position);&lt;br /&gt;
      if(resetScript)&lt;br /&gt;
        {&lt;br /&gt;
          llSetPos(home_position);&lt;br /&gt;
          llSetRot(home_rotation);&lt;br /&gt;
          llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  else&lt;br /&gt;
    {&lt;br /&gt;
      llInstantMessage(llGetOwner(),&amp;quot;There is an error. &amp;quot; +&lt;br /&gt;
                       &amp;quot;I wondered away from my start region and cannot go back home.\n&amp;quot; +&lt;br /&gt;
                       &amp;quot;I am located in &amp;quot; + llGetRegionName() + &amp;quot; at &amp;quot; + &lt;br /&gt;
                       (string)llGetPos());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Primary (default) state.&lt;br /&gt;
// This is the initial state when the program resets.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object waits for a touch to get started. There is&lt;br /&gt;
// a random chance that it might start moving at any time step though.&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        if(home_position.x &amp;lt; 0.0)&lt;br /&gt;
          {&lt;br /&gt;
            // This is the first time to enter this state. Do a little&lt;br /&gt;
            // house cleaning to start the season.&lt;br /&gt;
&lt;br /&gt;
            // Add any parts to the different parameters that require any&lt;br /&gt;
            // calculations.&lt;br /&gt;
            wondering_parameters += &lt;br /&gt;
              [CHARACTER_AVOIDANCE_MODE, AVOID_CHARACTERS | AVOID_DYNAMIC_OBSTACLES];&lt;br /&gt;
            traveling_parameters += &lt;br /&gt;
              [CHARACTER_AVOIDANCE_MODE, AVOID_CHARACTERS | AVOID_DYNAMIC_OBSTACLES];&lt;br /&gt;
&lt;br /&gt;
            // Set the initial home position and orientation.&lt;br /&gt;
            home_position = llGetPos();&lt;br /&gt;
            home_rotation = llGetRot();&lt;br /&gt;
            home_region   = llGetRegionName();&lt;br /&gt;
            llOwnerSay(&amp;quot;Touch me to start moving. &amp;quot; +&lt;br /&gt;
                       &amp;quot;I will not move until you touch me the first time. &amp;quot; +&lt;br /&gt;
                       &amp;quot;After that it will become automatic.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if(home_region == llGetRegionName())&lt;br /&gt;
          {&lt;br /&gt;
            // I am in the same region I started out in. Make sure I&lt;br /&gt;
            // start at the last place and orientation when I left&lt;br /&gt;
            // this state.  Make sure that I move close to&lt;br /&gt;
            // home. (There is some fudge factor in the llSetRegionPos&lt;br /&gt;
            // command according to the wiki).&lt;br /&gt;
            llSetPos(home_position);&lt;br /&gt;
            llSetRot(home_rotation);&lt;br /&gt;
            llSetTimerEvent(TIME_TO_WAIT_BEFORE_MOVING);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        llDeleteCharacter(); // Clear and reset the character&lt;br /&gt;
                             // settings. You should always do this so&lt;br /&gt;
                             // that when an active object is taken&lt;br /&gt;
                             // into inventory it will be properly&lt;br /&gt;
                             // reset when rezzed again. (If not here&lt;br /&gt;
                             // then in the on_rez event.)&lt;br /&gt;
        active_character = FALSE;&lt;br /&gt;
&lt;br /&gt;
        llOwnerSay(&amp;quot;Stopped\nTouch me to have me wonder around.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llCreateCharacter(wondering_parameters);&lt;br /&gt;
        active_character = TRUE;&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
      } // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
           {&lt;br /&gt;
             // This person is in the same group. Assume the idiot can&lt;br /&gt;
             // be trusted.&lt;br /&gt;
             home_position = llGetPos();        // Define my start position&lt;br /&gt;
             home_rotation = llGetRot();        // and start orientation.&lt;br /&gt;
             state Roaming;&lt;br /&gt;
           }&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // I have waited to long without any interaction. Time to roam&lt;br /&gt;
        // because I am a ramblin&#039; object.&lt;br /&gt;
        state Roaming;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end default state&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Roaming state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to start roaming.  I&lt;br /&gt;
// strongly prefer not to use all these states, but it makes for a&lt;br /&gt;
// much cleaner code in this case and a better demo.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object simply roams around for a while. &lt;br /&gt;
state Roaming&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the roaming parameters&lt;br /&gt;
        llUpdateCharacter(wondering_parameters);&lt;br /&gt;
        llWanderWithin(home_position, wondering_radius, []);&lt;br /&gt;
        llOwnerSay(&amp;quot;Roaming\nTouch me to have me go back home.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
      } // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
        state default;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
          {&lt;br /&gt;
            // Again, if the person is in the same group then let them&lt;br /&gt;
            // violate me by touching me.&lt;br /&gt;
            state TravelHome;&lt;br /&gt;
          }&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
        if ((type == PU_SLOWDOWN_DISTANCE_REACHED) || &lt;br /&gt;
            (type == PU_GOAL_REACHED))&lt;br /&gt;
          {&lt;br /&gt;
            // While roaming this should not occur. if it does just restart???&lt;br /&gt;
            llWanderWithin(home_position, wondering_radius, []);            &lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else {&lt;br /&gt;
          // Something went wrong with the navmesh. Just go home and wait.&lt;br /&gt;
          state TravelHome;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state Roaming&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// TravelHome state.  &lt;br /&gt;
//&lt;br /&gt;
// This is the state when the program decides to go home.  I&lt;br /&gt;
// strongly prefer not to use all these states, but it makes for a&lt;br /&gt;
// much cleaner code in this case and a better demo.&lt;br /&gt;
//&lt;br /&gt;
// In this state the object simply tries to go to the home&lt;br /&gt;
// position. If it does not make it in the alloted time the character&lt;br /&gt;
// is deleted, and it simply sets its position.&lt;br /&gt;
state TravelHome&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
      {&lt;br /&gt;
        // Set the character to the traveling parameters and set a&lt;br /&gt;
        // timer to make sure something eventually happens here.&lt;br /&gt;
        llUpdateCharacter(traveling_parameters);&lt;br /&gt;
        llNavigateTo(home_position,[FORCE_DIRECT_PATH,TRUE]);&lt;br /&gt;
        llSetTimerEvent(120.0);&lt;br /&gt;
        llOwnerSay(&amp;quot;Going back home\nTouch me to force the issue.&amp;quot;);&lt;br /&gt;
      } // state_entry&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
      {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        if(active_character)&lt;br /&gt;
          {&lt;br /&gt;
            llExecCharacterCmd(CHARACTER_CMD_SMOOTH_STOP,[]);&lt;br /&gt;
          }&lt;br /&gt;
      }  // state_exit&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
      {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
      }  // on_rez&lt;br /&gt;
&lt;br /&gt;
    changed( integer change)&lt;br /&gt;
      {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION_START)&lt;br /&gt;
          {&lt;br /&gt;
            // The simulator this thing is on has reset&lt;br /&gt;
            forceMoveHome(TRUE);&lt;br /&gt;
          }&lt;br /&gt;
        state default;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
      {&lt;br /&gt;
        // force the issue&lt;br /&gt;
        if(llDetectedGroup(0))&lt;br /&gt;
          {&lt;br /&gt;
            // trust in the authority invested in the people in my&lt;br /&gt;
            // group because blind trust always works out well.&lt;br /&gt;
            forceMoveHome(FALSE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
      } // touch_start&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
      {&lt;br /&gt;
        // It took too long to get home.&lt;br /&gt;
        forceMoveHome(FALSE);&lt;br /&gt;
        state default;&lt;br /&gt;
      } // timer&lt;br /&gt;
&lt;br /&gt;
    path_update(integer type, list reserved)&lt;br /&gt;
      {&lt;br /&gt;
        if (type == PU_SLOWDOWN_DISTANCE_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I am close to home. &lt;br /&gt;
            llSetTimerEvent(10.0);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else if (type == PU_GOAL_REACHED)&lt;br /&gt;
          {&lt;br /&gt;
            // I have made it home.&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
        else &lt;br /&gt;
          {&lt;br /&gt;
            // Something went wrong. Just force the issue and go home.&lt;br /&gt;
            forceMoveHome(FALSE);&lt;br /&gt;
            state default;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
      } // end path_update event&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // end state TravelHome&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_A&amp;diff=1173268</id>
		<title>CHARACTER TYPE A</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_A&amp;diff=1173268"/>
		<updated>2012-10-09T10:07:47Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Added to the description.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_TYPE_A&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=0&lt;br /&gt;
|desc=Used for character types that you prefer move in a way consistent with humanoids or animals.&lt;br /&gt;
|examples&lt;br /&gt;
|functions&lt;br /&gt;
|events&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_A&amp;diff=1173267</id>
		<title>CHARACTER TYPE A</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_A&amp;diff=1173267"/>
		<updated>2012-10-09T10:03:27Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Changed category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Pathfinding Character}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_TYPE_A&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=0&lt;br /&gt;
|desc&lt;br /&gt;
|examples&lt;br /&gt;
|functions&lt;br /&gt;
|events&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_A&amp;diff=1173266</id>
		<title>CHARACTER TYPE A</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CHARACTER_TYPE_A&amp;diff=1173266"/>
		<updated>2012-10-09T10:02:41Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Initial draft of the page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Constant/Attachment}}{{LSL Constant&lt;br /&gt;
|name=CHARACTER_TYPE_A&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=0&lt;br /&gt;
|desc&lt;br /&gt;
|examples&lt;br /&gt;
|functions&lt;br /&gt;
|events&lt;br /&gt;
|cat1=Pathfinding&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|self&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pathfinding_in_Second_Life&amp;diff=1173219</id>
		<title>Pathfinding in Second Life</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pathfinding_in_Second_Life&amp;diff=1173219"/>
		<updated>2012-10-08T10:03:17Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: /* LSL functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathfinding Nav}}&lt;br /&gt;
__TOC__&lt;br /&gt;
{{Multi-lang}}&lt;br /&gt;
== Overview ==&lt;br /&gt;
At a high level, pathfinding provides tools and functions to enable smoother and smarter movement behavior for non-avatar entities in Second Life (for example, monsters in a game, rats in a haunted house, wisps in a fantasy forest).  We refer to these entities as &#039;&#039;characters&#039;&#039;; in gaming terminology, they are sometimes called &#039;&#039;NPCs&#039;&#039; (non-player characters) or &#039;&#039;mobs&#039;&#039; (mobile objects).&lt;br /&gt;
&lt;br /&gt;
Up till now, content creators had to use resource-intensive scripting workarounds to emulate intelligent character movement.  With the addition of pathfinding, content creators will have a much easier and better performing way of creating characters that can move around in the world. Characters can use LSL functions to avoid obstacles, move around corners, climb inclines, and move across region boundaries: things that were very difficult or even impossible before. Pathfinding will also enable new gameplay mechanics, such as creating food that attracts monsters.&lt;br /&gt;
&lt;br /&gt;
{{KBnote|Pathfinding is not an animation system.  It does not provide a way to animate a biped or quadruped in conjunction with the new movement functionality.  You must use existing methods to animate characters. Nevertheless, pathfinding enables more dynamic movement and provides a better system for controlling character movement than was previously possible.  For more information on creating animations, see [[Animation]].}}&lt;br /&gt;
&lt;br /&gt;
=== User group ===&lt;br /&gt;
The Pathfinding user group meets Thursdays at 4pm in the center of [http://slurl.com/secondlife/PathTest1/128/128/23/?&amp;amp;title=PathTest1 Pathtest1] on the Aditi test grid.&lt;br /&gt;
&lt;br /&gt;
Transcripts:&lt;br /&gt;
* [[Pathfinding_in_Second_Life/2012-06-07|2012-06-07]]&lt;br /&gt;
* [[Pathfinding_in_Second_Life/2012-05-31|2012-05-31]]&lt;br /&gt;
* [[Pathfinding_in_Second_Life/2012-05-17|2012-05-17]]&lt;br /&gt;
* [[Pathfinding_in_Second_Life/2012-05-10|2012-05-10]]&lt;br /&gt;
* [[Pathfinding_in_Second_Life/2012-05-03|2012-05-03]]&lt;br /&gt;
* [[Pathfinding_in_Second_Life/2012-04-19|2012-04-19]]&lt;br /&gt;
&lt;br /&gt;
=== LSL functions ===&lt;br /&gt;
The pathfinding LSL functions enable you to create characters that dynamically avoid obstacles while performing typical behaviors you might want in a game or other virtual experience, including: &lt;br /&gt;
* &#039;&#039;&#039;Create&#039;&#039;&#039; - Initialize an object to prepare it for using pathfinding functions. [[LlCreateCharacter]]&lt;br /&gt;
* &#039;&#039;&#039;Delete&#039;&#039;&#039; - Stop the object from responding to pathfinding functions. [[LlDeleteCharacter]]&lt;br /&gt;
* &#039;&#039;&#039;Evade&#039;&#039;&#039; - Run away from a specified object or avatar.  See [[llEvade]].&lt;br /&gt;
* &#039;&#039;&#039;Flee&#039;&#039;&#039; - Attempt to get a specified distance from a specified location.  See [[llFleeFrom]].&lt;br /&gt;
* &#039;&#039;&#039;Navigate&#039;&#039;&#039; - Move to a specific location. See [[llNavigateTo]].&lt;br /&gt;
* &#039;&#039;&#039;Patrol&#039;&#039;&#039; - Move through a path defined by a set of &amp;quot;patrol points.&amp;quot; See [[llPatrolPoints]].&lt;br /&gt;
* &#039;&#039;&#039;Pursue&#039;&#039;&#039; - Chase a specified object or avatar. See [[llPursue]].&lt;br /&gt;
* &#039;&#039;&#039;Update&#039;&#039;&#039; - Update or change the parameters associated with a character. See [[LlUpdateCharacter]].&lt;br /&gt;
* &#039;&#039;&#039;Wander&#039;&#039;&#039; - Randomly move around a specified distance from a specified central point.  See [[llWanderWithin]].&lt;br /&gt;
* &#039;&#039;&#039;ExecCharacterCmd&#039;&#039;&#039; - Miscellaneous character-related functions such as stopping and jumping. See [[llExecCharacterCmd]].&lt;br /&gt;
* &#039;&#039;&#039;GetStaticPath&#039;&#039;&#039; - The only function which can be used on &#039;&#039;&#039;non&#039;&#039;&#039;-characters and on regions with dynamic pathfinding disabled. Returns a path to the goal. See [[llGetStaticPath]]&lt;br /&gt;
&lt;br /&gt;
For more details, see [[Pathfinding LSL Functions]].&lt;br /&gt;
&lt;br /&gt;
=== LSL events ===&lt;br /&gt;
&lt;br /&gt;
The following event is designed to react when the various pathfinding event are triggered for an active pathfinding character:&lt;br /&gt;
&lt;br /&gt;
* [[path_update]] - Triggered when a pathfinding event occurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Alpha release information ==&lt;br /&gt;
* [[Pathfinding/Alpha release notes]] - Restrictions, known issues, and tips on how to test the alpha version of Pathfinding on the Aditi test grid.&lt;br /&gt;
* [[Preview_Grid#How_do_I_log_in_to_Aditi.3F|How do I log into the Aditi test grid?]] - This test is being run on the Aditi test grid; for more information, read this article about Aditi and how you can log in.&lt;br /&gt;
* [[Pathfinding_Tools_in_the_Second_Life_Viewer]] - New tools in the Second Life Viewer to help you manage your Pathfinding characters and their environment.  Not yet publicly available.&lt;br /&gt;
* [[Pathfinding_Quick_Start_Guide]] - How to get your region up and running smoothly with Pathfinding.&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pathfinding_in_Second_Life&amp;diff=1173218</id>
		<title>Pathfinding in Second Life</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pathfinding_in_Second_Life&amp;diff=1173218"/>
		<updated>2012-10-08T09:21:40Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathfinding Nav}}&lt;br /&gt;
__TOC__&lt;br /&gt;
{{Multi-lang}}&lt;br /&gt;
== Overview ==&lt;br /&gt;
At a high level, pathfinding provides tools and functions to enable smoother and smarter movement behavior for non-avatar entities in Second Life (for example, monsters in a game, rats in a haunted house, wisps in a fantasy forest).  We refer to these entities as &#039;&#039;characters&#039;&#039;; in gaming terminology, they are sometimes called &#039;&#039;NPCs&#039;&#039; (non-player characters) or &#039;&#039;mobs&#039;&#039; (mobile objects).&lt;br /&gt;
&lt;br /&gt;
Up till now, content creators had to use resource-intensive scripting workarounds to emulate intelligent character movement.  With the addition of pathfinding, content creators will have a much easier and better performing way of creating characters that can move around in the world. Characters can use LSL functions to avoid obstacles, move around corners, climb inclines, and move across region boundaries: things that were very difficult or even impossible before. Pathfinding will also enable new gameplay mechanics, such as creating food that attracts monsters.&lt;br /&gt;
&lt;br /&gt;
{{KBnote|Pathfinding is not an animation system.  It does not provide a way to animate a biped or quadruped in conjunction with the new movement functionality.  You must use existing methods to animate characters. Nevertheless, pathfinding enables more dynamic movement and provides a better system for controlling character movement than was previously possible.  For more information on creating animations, see [[Animation]].}}&lt;br /&gt;
&lt;br /&gt;
=== User group ===&lt;br /&gt;
The Pathfinding user group meets Thursdays at 4pm in the center of [http://slurl.com/secondlife/PathTest1/128/128/23/?&amp;amp;title=PathTest1 Pathtest1] on the Aditi test grid.&lt;br /&gt;
&lt;br /&gt;
Transcripts:&lt;br /&gt;
* [[Pathfinding_in_Second_Life/2012-06-07|2012-06-07]]&lt;br /&gt;
* [[Pathfinding_in_Second_Life/2012-05-31|2012-05-31]]&lt;br /&gt;
* [[Pathfinding_in_Second_Life/2012-05-17|2012-05-17]]&lt;br /&gt;
* [[Pathfinding_in_Second_Life/2012-05-10|2012-05-10]]&lt;br /&gt;
* [[Pathfinding_in_Second_Life/2012-05-03|2012-05-03]]&lt;br /&gt;
* [[Pathfinding_in_Second_Life/2012-04-19|2012-04-19]]&lt;br /&gt;
&lt;br /&gt;
=== LSL functions ===&lt;br /&gt;
The pathfinding LSL functions enable you to create characters that dynamically avoid obstacles while performing typical behaviors you might want in a game or other virtual experience, including: &lt;br /&gt;
* &#039;&#039;&#039;Create&#039;&#039;&#039; - Initialize an object to prepare it for using pathfinding functions. [[LlCreateCharacter]]&lt;br /&gt;
* &#039;&#039;&#039;Delete&#039;&#039;&#039; - Stop the object from responding to pathfinding functions. [[LlDeleteCharacter]]&lt;br /&gt;
* &#039;&#039;&#039;Evade&#039;&#039;&#039; - Run away from a specified object or avatar.  See [[llEvade]].&lt;br /&gt;
* &#039;&#039;&#039;Flee&#039;&#039;&#039; - Attempt to get a specified distance from a specified location.  See [[llFleeFrom]].&lt;br /&gt;
* &#039;&#039;&#039;Navigate&#039;&#039;&#039; - Move to a specific location. See [[llNavigateTo]].&lt;br /&gt;
* &#039;&#039;&#039;Patrol&#039;&#039;&#039; - Move through a path defined by a set of &amp;quot;patrol points.&amp;quot; See [[llPatrolPoints]].&lt;br /&gt;
* &#039;&#039;&#039;Pursue&#039;&#039;&#039; - Chase a specified object or avatar. See [[llPursue]].&lt;br /&gt;
* &#039;&#039;&#039;Wander&#039;&#039;&#039; - Randomly move around a specified distance from a specified central point.  See [[llWanderWithin]].&lt;br /&gt;
* &#039;&#039;&#039;ExecCharacterCmd&#039;&#039;&#039; - Miscellaneous character-related functions such as stopping and jumping. See [[llExecCharacterCmd]].&lt;br /&gt;
* &#039;&#039;&#039;GetStaticPath&#039;&#039;&#039; - The only function which can be used on &#039;&#039;&#039;non&#039;&#039;&#039;-characters and on regions with dynamic pathfinding disabled. Returns a path to the goal. See [[llGetStaticPath]]&lt;br /&gt;
&lt;br /&gt;
For more details, see [[Pathfinding LSL Functions]].&lt;br /&gt;
&lt;br /&gt;
=== LSL events ===&lt;br /&gt;
&lt;br /&gt;
The following event is designed to react when the various pathfinding event are triggered for an active pathfinding character:&lt;br /&gt;
&lt;br /&gt;
* [[path_update]] - Triggered when a pathfinding event occurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Alpha release information ==&lt;br /&gt;
* [[Pathfinding/Alpha release notes]] - Restrictions, known issues, and tips on how to test the alpha version of Pathfinding on the Aditi test grid.&lt;br /&gt;
* [[Preview_Grid#How_do_I_log_in_to_Aditi.3F|How do I log into the Aditi test grid?]] - This test is being run on the Aditi test grid; for more information, read this article about Aditi and how you can log in.&lt;br /&gt;
* [[Pathfinding_Tools_in_the_Second_Life_Viewer]] - New tools in the Second Life Viewer to help you manage your Pathfinding characters and their environment.  Not yet publicly available.&lt;br /&gt;
* [[Pathfinding_Quick_Start_Guide]] - How to get your region up and running smoothly with Pathfinding.&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Dark_Mole&amp;diff=1173010</id>
		<title>User talk:Dark Mole</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Dark_Mole&amp;diff=1173010"/>
		<updated>2012-10-02T17:49:03Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Initial edit for this page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nobody is talking about Dark Mole.&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Dark_Mole&amp;diff=1173009</id>
		<title>User:Dark Mole</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Dark_Mole&amp;diff=1173009"/>
		<updated>2012-10-02T17:48:24Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Initial edit for this page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the page for Dark Mole.&lt;br /&gt;
&lt;br /&gt;
Please add your favorite stories about Dark Mole below or he will have to start making stuff up.&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pathfinding_in_Second_Life&amp;diff=1173008</id>
		<title>Pathfinding in Second Life</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pathfinding_in_Second_Life&amp;diff=1173008"/>
		<updated>2012-10-02T17:03:10Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: /* LSL functions */  moved a misplaced space.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathfinding Nav}}&lt;br /&gt;
__TOC__&lt;br /&gt;
{{Multi-lang}}&lt;br /&gt;
== Overview ==&lt;br /&gt;
At a high level, pathfinding provides tools and functions to enable smoother and smarter movement behavior for non-avatar entities in Second Life (for example, monsters in a game, rats in a haunted house, wisps in a fantasy forest).  We refer to these entities as &#039;&#039;characters&#039;&#039;; in gaming terminology, they are sometimes called &#039;&#039;NPCs&#039;&#039; (non-player characters) or &#039;&#039;mobs&#039;&#039; (mobile objects).&lt;br /&gt;
&lt;br /&gt;
Up till now, content creators had to use resource-intensive scripting workarounds to emulate intelligent character movement.  With the addition of pathfinding, content creators will have a much easier and better performing way of creating characters that can move around in the world. Characters can use LSL functions to avoid obstacles, move around corners, climb inclines, and move across region boundaries: things that were very difficult or even impossible before. Pathfinding will also enable new gameplay mechanics, such as creating food that attracts monsters.&lt;br /&gt;
&lt;br /&gt;
{{KBnote|Pathfinding is not an animation system.  It does not provide a way to animate a biped or quadruped in conjunction with the new movement functionality.  You must use existing methods to animate characters. Nevertheless, pathfinding enables more dynamic movement and provides a better system for controlling character movement than was previously possible.  For more information on creating animations, see [[Animation]].}}&lt;br /&gt;
&lt;br /&gt;
=== User group ===&lt;br /&gt;
The Pathfinding user group meets Thursdays at 4pm in the center of [http://slurl.com/secondlife/PathTest1/128/128/23/?&amp;amp;title=PathTest1 Pathtest1] on the Aditi test grid.&lt;br /&gt;
&lt;br /&gt;
Transcripts:&lt;br /&gt;
* [[Pathfinding_in_Second_Life/2012-06-07|2012-06-07]]&lt;br /&gt;
* [[Pathfinding_in_Second_Life/2012-05-31|2012-05-31]]&lt;br /&gt;
* [[Pathfinding_in_Second_Life/2012-05-17|2012-05-17]]&lt;br /&gt;
* [[Pathfinding_in_Second_Life/2012-05-10|2012-05-10]]&lt;br /&gt;
* [[Pathfinding_in_Second_Life/2012-05-03|2012-05-03]]&lt;br /&gt;
* [[Pathfinding_in_Second_Life/2012-04-19|2012-04-19]]&lt;br /&gt;
&lt;br /&gt;
=== LSL functions ===&lt;br /&gt;
The pathfinding LSL functions enable you to create characters that dynamically avoid obstacles while performing typical behaviors you might want in a game or other virtual experience, including: &lt;br /&gt;
* &#039;&#039;&#039;Create&#039;&#039;&#039; - Initialize an object to prepare it for using pathfinding functions. [[LlCreateCharacter]]&lt;br /&gt;
* &#039;&#039;&#039;Delete&#039;&#039;&#039; - Stop the object from responding to pathfinding functions. [[LlDeleteCharacter]]&lt;br /&gt;
* &#039;&#039;&#039;Evade&#039;&#039;&#039; - Run away from a specified object or avatar.  See [[llEvade]].&lt;br /&gt;
* &#039;&#039;&#039;Flee&#039;&#039;&#039; - Attempt to get a specified distance from a specified location.  See [[llFleeFrom]].&lt;br /&gt;
* &#039;&#039;&#039;Navigate&#039;&#039;&#039; - Move to a specific location. See [[llNavigateTo]].&lt;br /&gt;
* &#039;&#039;&#039;Patrol&#039;&#039;&#039; - Move through a path defined by a set of &amp;quot;patrol points.&amp;quot; See [[llPatrolPoints]].&lt;br /&gt;
* &#039;&#039;&#039;Pursue&#039;&#039;&#039; - Chase a specified object or avatar. See [[llPursue]].&lt;br /&gt;
* &#039;&#039;&#039;Wander&#039;&#039;&#039; - Randomly move around a specified distance from a specified central point.  See [[llWanderWithin]].&lt;br /&gt;
* &#039;&#039;&#039;ExecCharacterCmd&#039;&#039;&#039; - Miscellaneous character-related functions such as stopping and jumping. See [[llExecCharacterCmd]].&lt;br /&gt;
* &#039;&#039;&#039;GetStaticPath&#039;&#039;&#039; - The only function which can be used on &#039;&#039;&#039;non&#039;&#039;&#039;-characters and on regions with dynamic pathfinding disabled. Returns a path to the goal. See [[llGetStaticPath]]&lt;br /&gt;
&lt;br /&gt;
For more details, see [[Pathfinding LSL Functions]].&lt;br /&gt;
&lt;br /&gt;
== Alpha release information ==&lt;br /&gt;
* [[Pathfinding/Alpha release notes]] - Restrictions, known issues, and tips on how to test the alpha version of Pathfinding on the Aditi test grid.&lt;br /&gt;
* [[Preview_Grid#How_do_I_log_in_to_Aditi.3F|How do I log into the Aditi test grid?]] - This test is being run on the Aditi test grid; for more information, read this article about Aditi and how you can log in.&lt;br /&gt;
* [[Pathfinding_Tools_in_the_Second_Life_Viewer]] - New tools in the Second Life Viewer to help you manage your Pathfinding characters and their environment.  Not yet publicly available.&lt;br /&gt;
* [[Pathfinding_Quick_Start_Guide]] - How to get your region up and running smoothly with Pathfinding.&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pathfinding_Tools_in_the_Second_Life_Viewer&amp;diff=1173007</id>
		<title>Pathfinding Tools in the Second Life Viewer</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pathfinding_Tools_in_the_Second_Life_Viewer&amp;diff=1173007"/>
		<updated>2012-10-02T17:01:39Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathfinding Nav}}&lt;br /&gt;
__TOC__&lt;br /&gt;
== Introduction ==&lt;br /&gt;
For pathfinding, each region has a navigation mesh, commonly referred to as a &amp;quot;&#039;&#039;&#039;navmesh&#039;&#039;&#039;&amp;quot;.  The &#039;&#039;&#039;navmesh&#039;&#039;&#039; is a representation of the region&#039;s geometry generated and used by the physics simulator to determine paths for the pathfinding characters.  The navmesh may be in one of the following three states:&lt;br /&gt;
&lt;br /&gt;
* Up-to-date&lt;br /&gt;
* Has pending changes&lt;br /&gt;
* Building &#039;&#039;(a.k.a. rebaking)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The navmesh will transition through these states according to the following diagram:&lt;br /&gt;
&lt;br /&gt;
[[File:Navmesh_transitions.png|alt=Second Life Pathfinding NavMesh Transitions|Second Life Pathfinding NavMesh Transitions]]&lt;br /&gt;
&lt;br /&gt;
Six new elements have been added to the SL Viewer interface to communicate the navmesh state for the current region.  These new elements are:&lt;br /&gt;
&lt;br /&gt;
* icon representations of the pathfinding region state for the SLURL bar&lt;br /&gt;
* a &amp;quot;Rebake region&amp;quot; button that appears above the lower toolbar&lt;br /&gt;
* a right-click context menu option addition&lt;br /&gt;
* an additional field on the Build floater&lt;br /&gt;
* an additional field on the Object Profile floater&lt;br /&gt;
* additional simulator metrics on the Statistics floater &lt;br /&gt;
&lt;br /&gt;
In addition to these new elements, three new floaters allow users to more efficiently create, visualize, test, and debug pathfinding-enabled characters.  These tools are not required to create pathfinding behaviors but are particularly useful to builders and experienced creators in Second Life.  These new floaters are:&lt;br /&gt;
&lt;br /&gt;
* Pathfinding linksets&lt;br /&gt;
* Pathfinding characters&lt;br /&gt;
* Pathfinding view / test&lt;br /&gt;
&lt;br /&gt;
== Pathfinding UI Elements ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that other residents editing pathfinding objects on the same region may create pending changes to the navmesh.&#039;&#039;&#039; When this occurs, all residents on the same region and with build rights will see the appropriate SLURL bar icons and rebake region button.&lt;br /&gt;
&lt;br /&gt;
=== Pathfinding Icons in SLURL Bar ===&lt;br /&gt;
&lt;br /&gt;
The SLURL bar indicates the three pathfinding states of the current region.&lt;br /&gt;
# &#039;&#039;&#039;Navmesh is up-to-date&#039;&#039;&#039; The current region&#039;s navmesh is up-to-date.  No icon is shown as this is the expected default state. &amp;lt;br&amp;gt; [[File:Pathfinding-clean-region-1.png|alt=Second Life URL Bar with Up-to-Date NavMesh Icon|Second Life URL Bar with Up-to-Date NavMesh Icon]]&lt;br /&gt;
# &#039;&#039;&#039;Navmesh has pending changes&#039;&#039;&#039; The region has pending changes that have not yet been baked into the navmesh.  A pathfinding icon with a construction symbol is shown. &amp;lt;br&amp;gt; [[File:Pathfinding-dirty-region-1.png|alt=Second Life URL Bar with Pending Changes Icon|Second Life URL Bar with Pending Changes Icon]]&lt;br /&gt;
# &#039;&#039;&#039;Dynamic pathfinding is disabled&#039;&#039;&#039; The region has dynamic pathfinding disabled.  Pathfinding characters will not work as expected.  A pathfinding icon with a disabled symbol is shown.&amp;lt;br&amp;gt; [[File:Pathfinding-disabled-region-1.png|alt=Second Life URL Bar with Pathfinding Disabled Icon|Second Life URL Bar with Pathfinding Disabled Icon]]&lt;br /&gt;
&lt;br /&gt;
=== Rebake Region Button ===&lt;br /&gt;
&lt;br /&gt;
When a region has pending changes, the appropriate icon will be shown in the SLURL bar, as described above.  In addition, if the user has build rights for any parcel on the current region, the user will also be able to see a &amp;quot;Rebake region&amp;quot; button that displays above the lower toolbar.&lt;br /&gt;
&lt;br /&gt;
[[File:Rebake-button-1.png|alt=Second Life Rebake Region button that allows permitted users to rebake pathfinding changes into the navmesh]]&lt;br /&gt;
&lt;br /&gt;
When the user clicks this button, a request is sent to the region to rebake the navmesh for the current region.  As rebaking a region may be a time intensive process, the button will change to indicate &amp;quot;Region is rebaking&amp;quot; during this server process.  After the rebaking is complete, this button on the viewer will vanish.&lt;br /&gt;
&lt;br /&gt;
[[File:Rebaking-button-1.png|alt=Second Life Region is Rebaking button that indicates that the current region is rebaking its navmesh]]&lt;br /&gt;
&lt;br /&gt;
=== Right-click context menu behavior ===&lt;br /&gt;
&lt;br /&gt;
When right-clicking on an object in-world, pathfinding-specific menu options may be included in the pop-up context menu.&lt;br /&gt;
&lt;br /&gt;
If the user right-clicks on a &#039;&#039;&#039;linkset&#039;&#039;&#039; object in-world, a menu option &amp;quot;Show in linksets&amp;quot; will allow the user to open the Pathfinding Linksets floater with the current object selected.&lt;br /&gt;
&lt;br /&gt;
[[File:Right-click-show-in-linksets-1.png|alt=Second Life Context Menu with Show in Linksets floater menu option]]&lt;br /&gt;
&lt;br /&gt;
If the user right-clicks on a pathfinding &#039;&#039;&#039;character&#039;&#039;&#039; object in-world, a menu option &amp;quot;Show in characters&amp;quot; will allow the user to open the Pathfinding Characters floater with the current object selected.&lt;br /&gt;
&lt;br /&gt;
[[File:Right-click-show-in-characters-1.png|alt=Second Life Context Menu with Show in Characters floater menu option]]&lt;br /&gt;
&lt;br /&gt;
=== Additional field on the Build floater ===&lt;br /&gt;
&lt;br /&gt;
The Build floater has also been updated with an additional field indicating the pathfinding attributes of the current object.&lt;br /&gt;
&lt;br /&gt;
The following image is a screenshot of the Build floater with a &#039;&#039;character&#039;&#039; object selected.&lt;br /&gt;
&lt;br /&gt;
[[File:Build-floater-character-1.png|alt=Build floater with pathfinding attribute character|Build floater with pathfinding attribute character]]&lt;br /&gt;
&lt;br /&gt;
The following image is a screenshot of the Build floater with an object that &#039;&#039;affects navmesh&#039;&#039; selected.  This object could be a &#039;&#039;walkable&#039;&#039;, &#039;&#039;static obstacle&#039;&#039;, &#039;&#039;material volume&#039;&#039;, or &#039;&#039;exclusion volume&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[File:Build-floater-affects-navmesh-1.png|alt=Build floater with pathfinding attribute affects navmesh|Build floater with pathfinding attribute affects navmesh]]&lt;br /&gt;
&lt;br /&gt;
{{KBwarning|For linksets that do affect the navmesh, it will be impossible to modify the object across the region boundary.  The user and the object affecting a navmesh must be in the same region to enable modification of the object.  This will be indicated on the General tab of the Build floater as illustrated in the following screenshot.}}&lt;br /&gt;
[[File:Build-floater-region-boundary-1.png|alt=Build floater indicating that the user cannot modify object across a region boundary|Build floater indicating that the user cannot modify object across a region boundary]]&lt;br /&gt;
&lt;br /&gt;
=== Additional field on the Object Profile floater ===&lt;br /&gt;
&lt;br /&gt;
Similar to the afore-described Build floater, the Object Profile floater has also been updated with an additional field indicating the pathfinding attributes of the current object.&lt;br /&gt;
&lt;br /&gt;
The following image is a screenshot of the Object Profile floater with an &#039;&#039;affects navmesh&#039;&#039; object selected.&lt;br /&gt;
&lt;br /&gt;
[[File:Object-profile-1.png|alt=Object Profile floater with pathfinding attribute affects navmesh|Object Profile floater with pathfinding attribute affects navmesh]]&lt;br /&gt;
&lt;br /&gt;
=== Additional simulator metrics on the Statistics floater ===&lt;br /&gt;
&lt;br /&gt;
For advanced users, additional simulator metrics have been added to the Statistics floater.  The Statistics floater, available from the main menu Advanced &amp;amp;gt; Performance Tools &amp;amp;gt; Statistics Bar, has the following 3 additional fields reporting statistics from the simulator regarding pathfinding activity:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AI Step Time&#039;&#039;&#039; - The average time spent during each frame computing character AI events.&lt;br /&gt;
* &#039;&#039;&#039;Skipped Silhouette Steps&#039;&#039;&#039; - The number of steps that are skipped per second in computing the influence of objects of type &#039;&#039;Movable Obstacles&#039;&#039; on the navmesh.  A high value here means that objects on the region are marked as &#039;&#039;Movable Obstacles&#039;&#039; and could be contributing to improper pathfinding behavior on the region.  To lower this value, set all objects that do not move to either type &#039;&#039;Walkable&#039;&#039; or &#039;&#039;Static Obstacle&#039;&#039;, and optimize any &#039;&#039;Movable Obstacle&#039;&#039; shapes to meet the [[Good_Building_Practices|Good Building Practices Guide]].&lt;br /&gt;
* &#039;&#039;&#039;Characters Updated&#039;&#039;&#039; - The average percentage of characters updated during each frame.  A low value here means that character AI computations are taking too long during each frame, and thus some character updates are skipped during subsequent frames.  This could be contributing to improper pathfinding behavior on the region.  To increase this value, decrease the number of characters on the region, and optimize any &#039;&#039;Movable Obstacle&#039;&#039; shapes to meet the [[Good_Building_Practices|Good Building Practices Guide]].  Note that the Pathfinding Characters floater (described below) may also be used to determine which characters on the region are contributing the most to the region&#039;s CPU time.&lt;br /&gt;
&lt;br /&gt;
[[File:Pathfinding-stats-2.png|alt=Simulator Statistics floater with additional pathfinding statistics|Simulator Statistics floater with additional pathfinding statistics]]&lt;br /&gt;
&lt;br /&gt;
== Pathfinding Floaters == &lt;br /&gt;
&lt;br /&gt;
These three pathfinding floaters may all be accessed through the Build-&amp;gt;Pathfinding menu in the Project Viewer - Pathfinding.&lt;br /&gt;
&lt;br /&gt;
[[File:Build-menu-pf-selected-1.png|alt=Second Life Build Menu with new Pathfinding menu items|SL Build -&amp;gt; Pathfinding Menu]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pathfinding Linksets Floater ===&lt;br /&gt;
&lt;br /&gt;
==== Overview ====&lt;br /&gt;
&lt;br /&gt;
The intent of the Pathfinding Linksets floater is to give advanced users and builders the ability to customize an area to achieve interesting effects with pathfinding-enabled characters. It can be initiated using the Build-&amp;gt;Pathfinding-&amp;gt;LinkSets options in the viewer menu.&lt;br /&gt;
&lt;br /&gt;
The floater displays information for all linksets within the current region for which the user has the ability to alter.  The table reports useful information including&lt;br /&gt;
* Linkset Name&lt;br /&gt;
* Description&lt;br /&gt;
* Owner&lt;br /&gt;
* Whether the object is Scripted&lt;br /&gt;
* Land Impact&lt;br /&gt;
* Distance from the resident&#039;s avatar&lt;br /&gt;
* Linkset Use&lt;br /&gt;
** Potential values&lt;br /&gt;
*** Walkable&lt;br /&gt;
*** Static Obstacle&lt;br /&gt;
*** Movable Obstacle&lt;br /&gt;
*** Material Volume&lt;br /&gt;
*** Exclusion Volume&lt;br /&gt;
*** Movable Phantom&lt;br /&gt;
* Walkability Coefficients&lt;br /&gt;
** Character Type A &#039;&#039;(example use: humanoid)&#039;&#039;&lt;br /&gt;
** Character Type B &#039;&#039;(example use: creature)&#039;&#039;&lt;br /&gt;
** Character Type C &#039;&#039;(example use: mechanical)&#039;&#039;&lt;br /&gt;
** Character Type D &#039;&#039;(example use: other)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Additionally, selecting any linksets within the floater will also select the object(s) within the Viewer.&lt;br /&gt;
&lt;br /&gt;
[[File:Linksets-floater-3.png|alt=Pathfinding Linksets floater|Pathfinding Linksets]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Controls ====&lt;br /&gt;
&lt;br /&gt;
{{:Viewerhelp:Pathfinding linksets}}&lt;br /&gt;
&lt;br /&gt;
==== Example use ====&lt;br /&gt;
&lt;br /&gt;
The advanced users and builders will use the Pathfinding Linksets floater to customize areas to create interesting effects for pathfinding-enabled characters.&lt;br /&gt;
&lt;br /&gt;
For instance, imagine the scenario of a builder constructing a single room in a pathfinding-enabled house.  For the single room, the builder would use the following types as follows:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Linkset Use !! Description&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;200&amp;quot; align=&amp;quot;center&amp;quot; | Walkable || align=&amp;quot;left&amp;quot; | The floor linkset would be set to be &amp;lt;b&amp;gt;Walkable&amp;lt;/b&amp;gt; to allow characters to move across the floor.&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;200&amp;quot; align=&amp;quot;center&amp;quot; | Static Obstacle || align=&amp;quot;left&amp;quot; | A desk linkset in the room would be set to be &amp;lt;b&amp;gt;Static Obstacle&amp;lt;/b&amp;gt; to block characters from walking through or across the object.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;NOTE&amp;lt;/b&amp;gt; Any object that should block character movement and that does not move should be marked as Static Obstacle to improve performance of pathfinding characters.&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;200&amp;quot; align=&amp;quot;center&amp;quot; | Movable Obstacle || align=&amp;quot;left&amp;quot; |  A door linkset in the room would be set to be &amp;lt;b&amp;gt;Movable Obstacle&amp;lt;/b&amp;gt;.  This will still block characters but, in contrast to Static Obstacles, Movable Obstacles will allow the linkset itself to move.  In the case of the door, this will allow the door to open and close, but will still prevent characters from walking through the door.&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;200&amp;quot; align=&amp;quot;center&amp;quot; | Material Volume || align=&amp;quot;left&amp;quot; |  &amp;lt;b&amp;gt;Material Volumes&amp;lt;/b&amp;gt; are phantom objects that can be used to affect the walkability coefficients of intersecting objects.  Imagine that the builder applied a texture to the floor.  Also, imagine that the floor texture includes small throw rug in the middle of the room.  (The builder did not want to create a separate object for the rug, so is using a texture on the floor to give the appearance of a rug).  The builder can then create a Material Volume object intersecting the floor at the location of the rug.  Then, by setting a lower walkability coefficient for the Material Volume, the builder will create the affect of slowing down characters as the characters traverse across the painted rug area.&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;200&amp;quot; align=&amp;quot;center&amp;quot; | Exclusion Volume || align=&amp;quot;left&amp;quot; |  &amp;lt;b&amp;gt;Exclusion Volumes&amp;lt;/b&amp;gt; are phantom objects that can be used to create areas where characters are prevented from moving.  For instance, the builder can use an Exclusion Volume to create a section of the room where avatars would be able to move, but characters would be blocked from following.&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;200&amp;quot; align=&amp;quot;center&amp;quot; | Movable Phantom || align=&amp;quot;left&amp;quot; |  &amp;lt;b&amp;gt;Movable Phantoms&amp;lt;/b&amp;gt; are phantom objects that have no affect on pathfinding-enabled characters.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
In addition to linkset use attributes, builders can achieve additional effects by modifying the walkability coefficients for linksets.  The walkability coefficients are values, ranging from 0% to 100%, that affect a characters speed.  A walkability coefficient of 50% will reduce a character&#039;s speed by half while the character is traversing across the linkset.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pathfinding Characters Floater ===&lt;br /&gt;
&lt;br /&gt;
==== Overview ====&lt;br /&gt;
The intent of Pathfinding Characters floater is primarily for users to locate characters moving throughout a region and to identify the CPU cost of characters affecting the performance of a region. It can be initiated using the Build-&amp;gt;Pathfinding-&amp;gt;Characters options in the viewer menu.&lt;br /&gt;
&lt;br /&gt;
The floater displays information for all characters within the current region for which the user has the ability to manipulate.  The table reports useful information including&lt;br /&gt;
* Character Name&lt;br /&gt;
* Description&lt;br /&gt;
* Owner&lt;br /&gt;
* CPU Time&lt;br /&gt;
* Altitude&lt;br /&gt;
&lt;br /&gt;
[[File:Characters-floater-1.png|alt=Pathfinding Characters floater|Pathfinding Characters]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== Controls ====&lt;br /&gt;
&lt;br /&gt;
{{:Viewerhelp:Pathfinding characters}}&lt;br /&gt;
&lt;br /&gt;
==== Example use ====&lt;br /&gt;
# If a region owner has created a pathfinding-enabled character but is unable to find the character within the region, the Characters floater can be used to locate and select the character.&lt;br /&gt;
# Additionally, the Pathfinding Characters floater reports the CPU time cost for each character within the region.  This functionality can be used by advanced users to identify which characters are impacting performance the most.&lt;br /&gt;
&lt;br /&gt;
=== Pathfinding View/Test Floater ===&lt;br /&gt;
&lt;br /&gt;
==== Overview ====&lt;br /&gt;
&lt;br /&gt;
The intent of the Pathfinding View/Test floater is for advanced users who are building pathfinding-enabled objects and characters. It can be initiated using the Build-&amp;gt;Pathfinding-&amp;gt;View/Test options in the viewer menu.&lt;br /&gt;
&lt;br /&gt;
This floater consists of 3 basic areas.&lt;br /&gt;
&lt;br /&gt;
# Status area (illustrating both the Viewer and Simulator status of the region&#039;s navmesh)&lt;br /&gt;
# View tab Controls&lt;br /&gt;
# Test Path tab Controls&lt;br /&gt;
&lt;br /&gt;
The following image is a screenshot of the Pathfinding View/Test floater with the navmesh displayed.&lt;br /&gt;
&lt;br /&gt;
[[File:View-nav-mesh-1.png|alt=Pathfinding View/Test floater with the navmesh displayed|Pathfinding View/Test with navmesh displayed]]&lt;br /&gt;
&lt;br /&gt;
The following image is a screenshot of the Pathfinding View/Test floater with the pathfinding object types displayed.&lt;br /&gt;
&lt;br /&gt;
[[File:View-pf-types-1.png|alt=Pathfinding View/Test floater with the pathfinding object types displayed|Pathfinding View/Test with the pathfinding object types displayed]]&lt;br /&gt;
&lt;br /&gt;
The following image is a screenshot of the Pathfinding View/Test floater with a test path displayed.&lt;br /&gt;
&lt;br /&gt;
[[File:View-test-path-1.png|alt=Pathfinding View/Test floater with a test path displayed|Pathfinding View/Test with a test path displayed]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== Controls ====&lt;br /&gt;
&lt;br /&gt;
{{:Viewerhelp:Pathfinding edit and test}}&lt;br /&gt;
&lt;br /&gt;
==== Example Use ====&lt;br /&gt;
&lt;br /&gt;
# The advanced user will use the Visualization controls to visualize how the navmesh and related permanent objects have been generated.  By seeing this visualization of how the physics engine interprets the navigation information, the advanced user can understand how to better customize the pathfinding-enabled objects to obtain the desired behaviors of characters.&lt;br /&gt;
# The advanced user will use the Test Tab to visualize how a test character would choose the path between selected start and end points.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Known Issues ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-style:solid;border-width:2px 0 2px 0px;&amp;quot; &lt;br /&gt;
! style=&amp;quot;border-style:solid;border-width:0 0 1px 0&amp;quot; width=&amp;quot;130&amp;quot; | JIRA&lt;br /&gt;
! style=&amp;quot;border-style:solid;border-width:0 0 1px 0&amp;quot; width=&amp;quot;300&amp;quot; | Summary&lt;br /&gt;
! style=&amp;quot;border-style:solid;border-width:0 0 1px 0&amp;quot; width=&amp;quot;550&amp;quot; | Hardware&lt;br /&gt;
! style=&amp;quot;border-style:solid;border-width:0 0 1px 0&amp;quot; width=&amp;quot;100&amp;quot; | Fixed in Version&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | [https://jira.secondlife.com/browse/MAINT-1291 MAINT-1291]&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | Enable Debug GL crashes the viewer to the desktop&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | Mac Pro running 10.7.4 with AMD Radeon HD5770 &amp;lt;br&amp;gt; iMac running Mac OS X Lion 10.7.4 (11E53) with AMD Radeon HD 6770M (512 MB) &amp;lt;br&amp;gt; PC Clone running XP Pro with GeForce2 Ultra&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | [https://jira.secondlife.com/browse/PATH-572 PATH-572]&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | Underwater &#039;Walkables&#039; shapes are reflected about the water plane&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | [https://jira.secondlife.com/browse/PATH-659 PATH-659]&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | navmesh being drawn over worn flexi prims and under avatar&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | [https://jira.secondlife.com/browse/PATH-790 PATH-790]&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | Physics capsule rendering of character shapes is broken after zooming&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | [https://jira.secondlife.com/browse/PATH-812 PATH-812]&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | Show capsules option creates black capsule instead of blue&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | ATI Radeon X300 Video card &amp;lt;br&amp;gt; ATI Radeon X600 Video card&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | [https://jira.secondlife.com/browse/PATH-821 PATH-821]&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | Toshiba Satellite L645 laptop displays black environment&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | Toshiba Satellite L645 laptop with AMD Radeon HD 4200 Mobile graphics&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | [https://jira.secondlife.com/browse/PATH-822 PATH-822]&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | Configuration with ATI Radeon 7500 can launch Viewer, serious GFx issues&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | AMD Athlon64 3000+ with ATI Radeon 7500 video card&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | [https://jira.secondlife.com/browse/PATH-851 PATH-851]&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | Crash in the beta viewer relating to LLLoginInstance&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; |&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | [https://jira.secondlife.com/browse/PATH-857 PATH-857] &amp;lt;br&amp;gt; [https://jira.secondlife.com/browse/VWR-29500 VWR-29500]&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | Shadows not operational under Second Life Beta 3.4.0.262596&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | Mac OS X 10.7.4 with ATI Radeon X1600 OpenGL Engine video card &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Issues Fixed during Beta ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-style:solid;border-width:2px 0 2px 0px;&amp;quot; &lt;br /&gt;
! style=&amp;quot;border-style:solid;border-width:0 0 1px 0&amp;quot; width=&amp;quot;130&amp;quot; | JIRA&lt;br /&gt;
! style=&amp;quot;border-style:solid;border-width:0 0 1px 0&amp;quot; width=&amp;quot;300&amp;quot; | Summary&lt;br /&gt;
! style=&amp;quot;border-style:solid;border-width:0 0 1px 0&amp;quot; width=&amp;quot;550&amp;quot; | Hardware&lt;br /&gt;
! style=&amp;quot;border-style:solid;border-width:0 0 1px 0&amp;quot; width=&amp;quot;100&amp;quot; | Fixed in Version&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/PATH-814 PATH-814]&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;Sony VAIO PCG-71211 laptop displays black environment&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;Sony VAIO PCG-71211 with AMD Radeon HD5650M Mobile graphics&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | 3.4.0 (262596)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/PATH-826 PATH-826]&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;Random crash while wearing a mesh avatar and dropping objects in-world&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | 3.4.0 (262596)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/MAINT-1413 MAINT-1413] &amp;lt;br&amp;gt; [https://jira.secondlife.com/browse/VWR-29491 VWR-29491]&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;&amp;quot;Weights Of Selected&amp;quot; never gives any results after pathfinding tools were merged in.&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | 3.4.0 (263727)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/MAINT-1414 MAINT-1414] &amp;lt;br&amp;gt; [https://jira.secondlife.com/browse/VWR-29497 VWR-29497]&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;User is not able to specify color of object with unchecked &#039;Apply now&#039; chechbox&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | 3.4.0 (263727)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/MAINT-1425 MAINT-1425]&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;viewer spams the log with &amp;quot;LLViewerParcelMgr::requestParcelMediaURLFilter: can&#039;t get ParcelMediaURLFilterList cap&amp;quot; while editing an object&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | 3.4.0 (263727)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/MAINT-1426 MAINT-1426]&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;Texture repeats/meter reset before you can click Apply button&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | 3.4.0 (263727)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/PATH-643 PATH-643] &amp;lt;br&amp;gt; [https://jira.secondlife.com/browse/PATHBUG-174 PATHBUG-174]&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;Changes in Preferences dialog stops work of Pathfinding View/Test functionality&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | 3.4.0 (263727)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/PATH-842 PATH-842] &amp;lt;br&amp;gt; [https://jira.secondlife.com/browse/VWR-29431 VWR-29431] &amp;lt;br&amp;gt; [https://jira.secondlife.com/browse/MAINT-1362 MAINT-1362]&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;TargetOmega object&#039;s rotation resets if it changes color in 3.4.0 (262596) Beta&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | 3.4.0 (263727)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/PATH-849 PATH-849]&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;Crash in the beta viewer relating to pathfinding&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | 3.4.0 (263727)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/PATH-852 PATH-852]&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;Custom cursors fail on mac and linux&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | 3.4.0 (263727)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/PATH-854 PATH-854]&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;Add support in the viewer to display the Scripted column on the linksets floater&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | 3.4.0 (263727)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/PATH-856 PATH-856]&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;As a user, I want to see a notification when I am toggling the phantom flag on a linkset through the Pathfinding Linkset floater&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | 3.4.0 (263727)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/MAINT-1480 MAINT-1480]&amp;lt;/del&amp;gt; &amp;lt;br&amp;gt; &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/VWR-29562 VWR-29562]&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;llSetRot does not clear TargetOmega rotation&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | 3.4.0 (264601)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/MAINT-1506 MAINT-1506]&amp;lt;/del&amp;gt; &amp;lt;br&amp;gt; &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/VWR-29644 VWR-29644]&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;Keyframe Motion leads the Second Life Beta Viewer - version 3.4.0 (264194) to unexpected results.&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | 3.4.0 (264601)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/PATH-864 PATH-864]&amp;lt;/del&amp;gt; &amp;lt;br&amp;gt; &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/PATHBUG-184 PATHBUG-184]&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;Allow the Linkset floater to shrink smaller than actually&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | 3.4.0 (264601)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/MAINT-1561 MAINT-1561]&amp;lt;/del&amp;gt; &amp;lt;br&amp;gt; &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/BUG-86 BUG-86]&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;Pendulum motion is incorrect after world view is out of focus&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | 3.4.0 (264785)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/PATH-880 PATH-880]&amp;lt;/del&amp;gt; &amp;lt;br&amp;gt; &amp;lt;del&amp;gt;[https://jira.secondlife.com/browse/PATHBUG-189 PATHBUG-189]&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &amp;lt;del&amp;gt;Characters Waking Sideways and Backwards&amp;lt;/del&amp;gt;&lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | &lt;br /&gt;
| style=&amp;quot;border-style:solid;border-width:0 0 1px 0;border-color:rgb(200,200,200)&amp;quot; | 3.4.0 (264785)&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:Smart_Scripting&amp;diff=1170685</id>
		<title>Talk:Smart Scripting</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:Smart_Scripting&amp;diff=1170685"/>
		<updated>2012-07-17T19:56:07Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What are we expected to put here? It is so vague that I have no idea where to start. Smart scripting means writing out a plan, thinking carefully about it, and editing the plan. Eventually you implement your plan.&lt;br /&gt;
&lt;br /&gt;
Another question: if we write something up can we have it checked by Lindens familiar with the LSO and mono VM&#039;s. When it comes to scripting there is more superstition then real data out there.&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:Smart_Scripting&amp;diff=1168958</id>
		<title>Talk:Smart Scripting</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:Smart_Scripting&amp;diff=1168958"/>
		<updated>2012-06-12T17:52:10Z</updated>

		<summary type="html">&lt;p&gt;Dark Mole: Created page with &amp;quot;What are we expected to put here? It is so vague that I have no idea where to start. Smart scripting means writing out a plan, thinking carefully about it, and editing the plan. …&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What are we expected to put here? It is so vague that I have no idea where to start. Smart scripting means writing out a plan, thinking carefully about it, and editing the plan. Eventually you implement your plan.&lt;/div&gt;</summary>
		<author><name>Dark Mole</name></author>
	</entry>
</feed>