<?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=Richardjrn+Weatherwax</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=Richardjrn+Weatherwax"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Richardjrn_Weatherwax"/>
	<updated>2026-06-27T15:44:12Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Triangle_Button&amp;diff=1180979</id>
		<title>Triangle Button</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Triangle_Button&amp;diff=1180979"/>
		<updated>2013-08-28T00:06:06Z</updated>

		<summary type="html">&lt;p&gt;Richardjrn Weatherwax: /* Triangle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anchor|Triangle}}&lt;br /&gt;
==Triangle==&lt;br /&gt;
This is a function to tell if a point is within a 2d triangle.&amp;lt;br/&amp;gt;&lt;br /&gt;
Code converted from http://www.blackpawn.com/texts/pointinpoly/ to LSL by Richardjrn Weatherwax&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Converted to LSL by Richardjrn Weatherwax from http://www.blackpawn.com/texts/pointinpoly/&lt;br /&gt;
//Done on request of Ezri Fairy (snow.gravois)&lt;br /&gt;
&lt;br /&gt;
vector pointA = &amp;lt;0.17810, 0.36214, 0.00000&amp;gt;;&lt;br /&gt;
vector pointB = &amp;lt;0.81144, 0.38803, 0.00000&amp;gt;;&lt;br /&gt;
vector pointC = &amp;lt;0.50132, 0.71068, 0.00000&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
integer SameSide(vector p1, vector p2, vector a, vector b)&lt;br /&gt;
{&lt;br /&gt;
    vector cp1 = (b-a)%(p1-a);&lt;br /&gt;
    vector cp2 = (b-a)%(p2-a);&lt;br /&gt;
    if((cp1*cp2)&amp;gt;=0)return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer PointInTriangle(vector p, vector a, vector b, vector c)&lt;br /&gt;
{&lt;br /&gt;
    if(SameSide(p,a, b,c)&amp;amp;&amp;amp;SameSide(p,b, a,c)&amp;amp;&amp;amp;SameSide(p,c, a,b))return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(&amp;quot;b2977bf6-b9af-c516-2e19-a5c451914227&amp;quot;,ALL_SIDES); //Triangle texture to match buttons triangle.&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        if(PointInTriangle(llDetectedTouchST(0),pointA,pointB,pointC))llOwnerSay(&amp;quot;In the triangle&amp;quot;);&lt;br /&gt;
        else llOwnerSay(&amp;quot;Outside the triangle&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hexagon==&lt;br /&gt;
{{Anchor|Hexagon}}An expansion for a hexagon [[File:Hexagon_Labeled.jpeg|thumb|The hexagon with its points labeled]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Converted to LSL by Richardjrn Weatherwax from http://www.blackpawn.com/texts/pointinpoly/&lt;br /&gt;
//Done on request of Ezri Fairy (snow.gravois)&lt;br /&gt;
&lt;br /&gt;
vector pointA = &amp;lt;0.34309, 0.74541, 0.00000&amp;gt;;&lt;br /&gt;
vector pointB = &amp;lt;0.71578, 0.72976, 0.00000&amp;gt;;&lt;br /&gt;
vector pointC = &amp;lt;0.85278, 0.50606, 0.00000&amp;gt;;&lt;br /&gt;
vector pointD = &amp;lt;0.69276, 0.25484, 0.00000&amp;gt;;&lt;br /&gt;
vector pointE = &amp;lt;0.44234, 0.31546, 0.00000&amp;gt;;&lt;br /&gt;
vector pointF = &amp;lt;0.33040, 0.46631, 0.00000&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
integer SameSide(vector p1, vector p2, vector a, vector b)&lt;br /&gt;
{&lt;br /&gt;
    vector cp1 = (b-a)%(p1-a);&lt;br /&gt;
    vector cp2 = (b-a)%(p2-a);&lt;br /&gt;
    if((cp1*cp2)&amp;gt;=0)return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer PointInHex(vector p, vector a, vector b, vector c, vector d, vector e, vector f)&lt;br /&gt;
{&lt;br /&gt;
    if(SameSide(p,c, a,b)&amp;amp;&amp;amp;SameSide(p,d, b,c)&amp;amp;&amp;amp;SameSide(p,e, c,d)&amp;amp;&amp;amp;SameSide(p,f, d,e)&amp;amp;&amp;amp;SameSide(p,a, e,f)&amp;amp;&amp;amp;SameSide(p,b, f,a))return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(&amp;quot;bac72ce8-d6f6-4360-6e24-4652b3ab9f24&amp;quot;,ALL_SIDES); //Hexagon texture to match buttons Hexagon.&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        if(PointInHex(llDetectedTouchST(0),pointA,pointB,pointC,pointD,pointE,pointF))llOwnerSay(&amp;quot;In the hexagon&amp;quot;);&lt;br /&gt;
        else llOwnerSay(&amp;quot;Outside the hexagon&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Richardjrn Weatherwax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Triangle_Button&amp;diff=1180978</id>
		<title>Triangle Button</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Triangle_Button&amp;diff=1180978"/>
		<updated>2013-08-27T23:59:13Z</updated>

		<summary type="html">&lt;p&gt;Richardjrn Weatherwax: /* Triangle */ fixed broken URL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anchor|Triangle}}&lt;br /&gt;
==Triangle==&lt;br /&gt;
This is a function to tell if a point is within a 2d triangle.&lt;br /&gt;
Code converted from http://www.blackpawn.com/texts/pointinpoly/ to LSL by Richardjrn Weatherwax&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Converted to LSL by Richardjrn Weatherwax from http://www.blackpawn.com/texts/pointinpoly/&lt;br /&gt;
//Done on request of Ezri Fairy (snow.gravois)&lt;br /&gt;
&lt;br /&gt;
vector pointA = &amp;lt;0.17810, 0.36214, 0.00000&amp;gt;;&lt;br /&gt;
vector pointB = &amp;lt;0.81144, 0.38803, 0.00000&amp;gt;;&lt;br /&gt;
vector pointC = &amp;lt;0.50132, 0.71068, 0.00000&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
integer SameSide(vector p1, vector p2, vector a, vector b)&lt;br /&gt;
{&lt;br /&gt;
    vector cp1 = (b-a)%(p1-a);&lt;br /&gt;
    vector cp2 = (b-a)%(p2-a);&lt;br /&gt;
    if((cp1*cp2)&amp;gt;=0)return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer PointInTriangle(vector p, vector a, vector b, vector c)&lt;br /&gt;
{&lt;br /&gt;
    if(SameSide(p,a, b,c)&amp;amp;&amp;amp;SameSide(p,b, a,c)&amp;amp;&amp;amp;SameSide(p,c, a,b))return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(&amp;quot;b2977bf6-b9af-c516-2e19-a5c451914227&amp;quot;,ALL_SIDES); //Triangle texture to match buttons triangle.&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        if(PointInTriangle(llDetectedTouchST(0),pointA,pointB,pointC))llOwnerSay(&amp;quot;In the triangle&amp;quot;);&lt;br /&gt;
        else llOwnerSay(&amp;quot;Outside the triangle&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hexagon==&lt;br /&gt;
{{Anchor|Hexagon}}An expansion for a hexagon [[File:Hexagon_Labeled.jpeg|thumb|The hexagon with its points labeled]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Converted to LSL by Richardjrn Weatherwax from http://www.blackpawn.com/texts/pointinpoly/&lt;br /&gt;
//Done on request of Ezri Fairy (snow.gravois)&lt;br /&gt;
&lt;br /&gt;
vector pointA = &amp;lt;0.34309, 0.74541, 0.00000&amp;gt;;&lt;br /&gt;
vector pointB = &amp;lt;0.71578, 0.72976, 0.00000&amp;gt;;&lt;br /&gt;
vector pointC = &amp;lt;0.85278, 0.50606, 0.00000&amp;gt;;&lt;br /&gt;
vector pointD = &amp;lt;0.69276, 0.25484, 0.00000&amp;gt;;&lt;br /&gt;
vector pointE = &amp;lt;0.44234, 0.31546, 0.00000&amp;gt;;&lt;br /&gt;
vector pointF = &amp;lt;0.33040, 0.46631, 0.00000&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
integer SameSide(vector p1, vector p2, vector a, vector b)&lt;br /&gt;
{&lt;br /&gt;
    vector cp1 = (b-a)%(p1-a);&lt;br /&gt;
    vector cp2 = (b-a)%(p2-a);&lt;br /&gt;
    if((cp1*cp2)&amp;gt;=0)return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer PointInHex(vector p, vector a, vector b, vector c, vector d, vector e, vector f)&lt;br /&gt;
{&lt;br /&gt;
    if(SameSide(p,c, a,b)&amp;amp;&amp;amp;SameSide(p,d, b,c)&amp;amp;&amp;amp;SameSide(p,e, c,d)&amp;amp;&amp;amp;SameSide(p,f, d,e)&amp;amp;&amp;amp;SameSide(p,a, e,f)&amp;amp;&amp;amp;SameSide(p,b, f,a))return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(&amp;quot;bac72ce8-d6f6-4360-6e24-4652b3ab9f24&amp;quot;,ALL_SIDES); //Hexagon texture to match buttons Hexagon.&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        if(PointInHex(llDetectedTouchST(0),pointA,pointB,pointC,pointD,pointE,pointF))llOwnerSay(&amp;quot;In the hexagon&amp;quot;);&lt;br /&gt;
        else llOwnerSay(&amp;quot;Outside the hexagon&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Richardjrn Weatherwax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Triangle_Button&amp;diff=1180977</id>
		<title>Triangle Button</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Triangle_Button&amp;diff=1180977"/>
		<updated>2013-08-27T23:58:46Z</updated>

		<summary type="html">&lt;p&gt;Richardjrn Weatherwax: Added tags&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anchor|Triangle}}&lt;br /&gt;
==Triangle==&lt;br /&gt;
This is a function to tell if a point is within a 2d triangle.&lt;br /&gt;
Code converted from http://www.blackpawn.com/texts/pointinpoly/to LSL by Richardjrn Weatherwax&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Converted to LSL by Richardjrn Weatherwax from http://www.blackpawn.com/texts/pointinpoly/&lt;br /&gt;
//Done on request of Ezri Fairy (snow.gravois)&lt;br /&gt;
&lt;br /&gt;
vector pointA = &amp;lt;0.17810, 0.36214, 0.00000&amp;gt;;&lt;br /&gt;
vector pointB = &amp;lt;0.81144, 0.38803, 0.00000&amp;gt;;&lt;br /&gt;
vector pointC = &amp;lt;0.50132, 0.71068, 0.00000&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
integer SameSide(vector p1, vector p2, vector a, vector b)&lt;br /&gt;
{&lt;br /&gt;
    vector cp1 = (b-a)%(p1-a);&lt;br /&gt;
    vector cp2 = (b-a)%(p2-a);&lt;br /&gt;
    if((cp1*cp2)&amp;gt;=0)return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer PointInTriangle(vector p, vector a, vector b, vector c)&lt;br /&gt;
{&lt;br /&gt;
    if(SameSide(p,a, b,c)&amp;amp;&amp;amp;SameSide(p,b, a,c)&amp;amp;&amp;amp;SameSide(p,c, a,b))return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(&amp;quot;b2977bf6-b9af-c516-2e19-a5c451914227&amp;quot;,ALL_SIDES); //Triangle texture to match buttons triangle.&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        if(PointInTriangle(llDetectedTouchST(0),pointA,pointB,pointC))llOwnerSay(&amp;quot;In the triangle&amp;quot;);&lt;br /&gt;
        else llOwnerSay(&amp;quot;Outside the triangle&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
==Hexagon==&lt;br /&gt;
{{Anchor|Hexagon}}An expansion for a hexagon [[File:Hexagon_Labeled.jpeg|thumb|The hexagon with its points labeled]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Converted to LSL by Richardjrn Weatherwax from http://www.blackpawn.com/texts/pointinpoly/&lt;br /&gt;
//Done on request of Ezri Fairy (snow.gravois)&lt;br /&gt;
&lt;br /&gt;
vector pointA = &amp;lt;0.34309, 0.74541, 0.00000&amp;gt;;&lt;br /&gt;
vector pointB = &amp;lt;0.71578, 0.72976, 0.00000&amp;gt;;&lt;br /&gt;
vector pointC = &amp;lt;0.85278, 0.50606, 0.00000&amp;gt;;&lt;br /&gt;
vector pointD = &amp;lt;0.69276, 0.25484, 0.00000&amp;gt;;&lt;br /&gt;
vector pointE = &amp;lt;0.44234, 0.31546, 0.00000&amp;gt;;&lt;br /&gt;
vector pointF = &amp;lt;0.33040, 0.46631, 0.00000&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
integer SameSide(vector p1, vector p2, vector a, vector b)&lt;br /&gt;
{&lt;br /&gt;
    vector cp1 = (b-a)%(p1-a);&lt;br /&gt;
    vector cp2 = (b-a)%(p2-a);&lt;br /&gt;
    if((cp1*cp2)&amp;gt;=0)return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer PointInHex(vector p, vector a, vector b, vector c, vector d, vector e, vector f)&lt;br /&gt;
{&lt;br /&gt;
    if(SameSide(p,c, a,b)&amp;amp;&amp;amp;SameSide(p,d, b,c)&amp;amp;&amp;amp;SameSide(p,e, c,d)&amp;amp;&amp;amp;SameSide(p,f, d,e)&amp;amp;&amp;amp;SameSide(p,a, e,f)&amp;amp;&amp;amp;SameSide(p,b, f,a))return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(&amp;quot;bac72ce8-d6f6-4360-6e24-4652b3ab9f24&amp;quot;,ALL_SIDES); //Hexagon texture to match buttons Hexagon.&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        if(PointInHex(llDetectedTouchST(0),pointA,pointB,pointC,pointD,pointE,pointF))llOwnerSay(&amp;quot;In the hexagon&amp;quot;);&lt;br /&gt;
        else llOwnerSay(&amp;quot;Outside the hexagon&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Richardjrn Weatherwax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Triangle_Button&amp;diff=1180976</id>
		<title>Triangle Button</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Triangle_Button&amp;diff=1180976"/>
		<updated>2013-08-27T23:49:08Z</updated>

		<summary type="html">&lt;p&gt;Richardjrn Weatherwax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Anchor|Triangle}}&lt;br /&gt;
This is a function to tell if a point is within a 2d triangle.&lt;br /&gt;
Code converted from http://www.blackpawn.com/texts/pointinpoly/to LSL by Richardjrn Weatherwax&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Converted to LSL by Richardjrn Weatherwax from http://www.blackpawn.com/texts/pointinpoly/&lt;br /&gt;
//Done on request of Ezri Fairy (snow.gravois)&lt;br /&gt;
&lt;br /&gt;
vector pointA = &amp;lt;0.17810, 0.36214, 0.00000&amp;gt;;&lt;br /&gt;
vector pointB = &amp;lt;0.81144, 0.38803, 0.00000&amp;gt;;&lt;br /&gt;
vector pointC = &amp;lt;0.50132, 0.71068, 0.00000&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
integer SameSide(vector p1, vector p2, vector a, vector b)&lt;br /&gt;
{&lt;br /&gt;
    vector cp1 = (b-a)%(p1-a);&lt;br /&gt;
    vector cp2 = (b-a)%(p2-a);&lt;br /&gt;
    if((cp1*cp2)&amp;gt;=0)return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer PointInTriangle(vector p, vector a, vector b, vector c)&lt;br /&gt;
{&lt;br /&gt;
    if(SameSide(p,a, b,c)&amp;amp;&amp;amp;SameSide(p,b, a,c)&amp;amp;&amp;amp;SameSide(p,c, a,b))return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(&amp;quot;b2977bf6-b9af-c516-2e19-a5c451914227&amp;quot;,ALL_SIDES); //Triangle texture to match buttons triangle.&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        if(PointInTriangle(llDetectedTouchST(0),pointA,pointB,pointC))llOwnerSay(&amp;quot;In the triangle&amp;quot;);&lt;br /&gt;
        else llOwnerSay(&amp;quot;Outside the triangle&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Anchor|Hexagon}}An expansion for a hexagon [[File:Hexagon_Labeled.jpeg|thumb|The hexagon with its points labeled]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Converted to LSL by Richardjrn Weatherwax from http://www.blackpawn.com/texts/pointinpoly/&lt;br /&gt;
//Done on request of Ezri Fairy (snow.gravois)&lt;br /&gt;
&lt;br /&gt;
vector pointA = &amp;lt;0.34309, 0.74541, 0.00000&amp;gt;;&lt;br /&gt;
vector pointB = &amp;lt;0.71578, 0.72976, 0.00000&amp;gt;;&lt;br /&gt;
vector pointC = &amp;lt;0.85278, 0.50606, 0.00000&amp;gt;;&lt;br /&gt;
vector pointD = &amp;lt;0.69276, 0.25484, 0.00000&amp;gt;;&lt;br /&gt;
vector pointE = &amp;lt;0.44234, 0.31546, 0.00000&amp;gt;;&lt;br /&gt;
vector pointF = &amp;lt;0.33040, 0.46631, 0.00000&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
integer SameSide(vector p1, vector p2, vector a, vector b)&lt;br /&gt;
{&lt;br /&gt;
    vector cp1 = (b-a)%(p1-a);&lt;br /&gt;
    vector cp2 = (b-a)%(p2-a);&lt;br /&gt;
    if((cp1*cp2)&amp;gt;=0)return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer PointInHex(vector p, vector a, vector b, vector c, vector d, vector e, vector f)&lt;br /&gt;
{&lt;br /&gt;
    if(SameSide(p,c, a,b)&amp;amp;&amp;amp;SameSide(p,d, b,c)&amp;amp;&amp;amp;SameSide(p,e, c,d)&amp;amp;&amp;amp;SameSide(p,f, d,e)&amp;amp;&amp;amp;SameSide(p,a, e,f)&amp;amp;&amp;amp;SameSide(p,b, f,a))return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(&amp;quot;bac72ce8-d6f6-4360-6e24-4652b3ab9f24&amp;quot;,ALL_SIDES); //Hexagon texture to match buttons Hexagon.&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        if(PointInHex(llDetectedTouchST(0),pointA,pointB,pointC,pointD,pointE,pointF))llOwnerSay(&amp;quot;In the hexagon&amp;quot;);&lt;br /&gt;
        else llOwnerSay(&amp;quot;Outside the hexagon&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Richardjrn Weatherwax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Triangle_Button&amp;diff=1180975</id>
		<title>Triangle Button</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Triangle_Button&amp;diff=1180975"/>
		<updated>2013-08-27T23:44:21Z</updated>

		<summary type="html">&lt;p&gt;Richardjrn Weatherwax: Moved the image.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a function to tell if a point is within a 2d triangle.&lt;br /&gt;
Code converted from http://www.blackpawn.com/texts/pointinpoly/to LSL by Richardjrn Weatherwax&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Converted to LSL by Richardjrn Weatherwax from http://www.blackpawn.com/texts/pointinpoly/&lt;br /&gt;
//Done on request of Ezri Fairy (snow.gravois)&lt;br /&gt;
&lt;br /&gt;
vector pointA = &amp;lt;0.17810, 0.36214, 0.00000&amp;gt;;&lt;br /&gt;
vector pointB = &amp;lt;0.81144, 0.38803, 0.00000&amp;gt;;&lt;br /&gt;
vector pointC = &amp;lt;0.50132, 0.71068, 0.00000&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
integer SameSide(vector p1, vector p2, vector a, vector b)&lt;br /&gt;
{&lt;br /&gt;
    vector cp1 = (b-a)%(p1-a);&lt;br /&gt;
    vector cp2 = (b-a)%(p2-a);&lt;br /&gt;
    if((cp1*cp2)&amp;gt;=0)return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer PointInTriangle(vector p, vector a, vector b, vector c)&lt;br /&gt;
{&lt;br /&gt;
    if(SameSide(p,a, b,c)&amp;amp;&amp;amp;SameSide(p,b, a,c)&amp;amp;&amp;amp;SameSide(p,c, a,b))return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(&amp;quot;b2977bf6-b9af-c516-2e19-a5c451914227&amp;quot;,ALL_SIDES); //Triangle texture to match buttons triangle.&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        if(PointInTriangle(llDetectedTouchST(0),pointA,pointB,pointC))llOwnerSay(&amp;quot;In the triangle&amp;quot;);&lt;br /&gt;
        else llOwnerSay(&amp;quot;Outside the triangle&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An expansion for a hexagon [[File:Hexagon_Labeled.jpeg|thumb|The hexagon with its points labeled]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Converted to LSL by Richardjrn Weatherwax from http://www.blackpawn.com/texts/pointinpoly/&lt;br /&gt;
//Done on request of Ezri Fairy (snow.gravois)&lt;br /&gt;
&lt;br /&gt;
vector pointA = &amp;lt;0.34309, 0.74541, 0.00000&amp;gt;;&lt;br /&gt;
vector pointB = &amp;lt;0.71578, 0.72976, 0.00000&amp;gt;;&lt;br /&gt;
vector pointC = &amp;lt;0.85278, 0.50606, 0.00000&amp;gt;;&lt;br /&gt;
vector pointD = &amp;lt;0.69276, 0.25484, 0.00000&amp;gt;;&lt;br /&gt;
vector pointE = &amp;lt;0.44234, 0.31546, 0.00000&amp;gt;;&lt;br /&gt;
vector pointF = &amp;lt;0.33040, 0.46631, 0.00000&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
integer SameSide(vector p1, vector p2, vector a, vector b)&lt;br /&gt;
{&lt;br /&gt;
    vector cp1 = (b-a)%(p1-a);&lt;br /&gt;
    vector cp2 = (b-a)%(p2-a);&lt;br /&gt;
    if((cp1*cp2)&amp;gt;=0)return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer PointInHex(vector p, vector a, vector b, vector c, vector d, vector e, vector f)&lt;br /&gt;
{&lt;br /&gt;
    if(SameSide(p,c, a,b)&amp;amp;&amp;amp;SameSide(p,d, b,c)&amp;amp;&amp;amp;SameSide(p,e, c,d)&amp;amp;&amp;amp;SameSide(p,f, d,e)&amp;amp;&amp;amp;SameSide(p,a, e,f)&amp;amp;&amp;amp;SameSide(p,b, f,a))return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(&amp;quot;bac72ce8-d6f6-4360-6e24-4652b3ab9f24&amp;quot;,ALL_SIDES); //Hexagon texture to match buttons Hexagon.&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        if(PointInHex(llDetectedTouchST(0),pointA,pointB,pointC,pointD,pointE,pointF))llOwnerSay(&amp;quot;In the hexagon&amp;quot;);&lt;br /&gt;
        else llOwnerSay(&amp;quot;Outside the hexagon&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Richardjrn Weatherwax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Triangle_Button&amp;diff=1180974</id>
		<title>Triangle Button</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Triangle_Button&amp;diff=1180974"/>
		<updated>2013-08-27T23:43:54Z</updated>

		<summary type="html">&lt;p&gt;Richardjrn Weatherwax: added hexagon example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a function to tell if a point is within a 2d triangle.&lt;br /&gt;
Code converted from http://www.blackpawn.com/texts/pointinpoly/to LSL by Richardjrn Weatherwax&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Converted to LSL by Richardjrn Weatherwax from http://www.blackpawn.com/texts/pointinpoly/&lt;br /&gt;
//Done on request of Ezri Fairy (snow.gravois)&lt;br /&gt;
&lt;br /&gt;
vector pointA = &amp;lt;0.17810, 0.36214, 0.00000&amp;gt;;&lt;br /&gt;
vector pointB = &amp;lt;0.81144, 0.38803, 0.00000&amp;gt;;&lt;br /&gt;
vector pointC = &amp;lt;0.50132, 0.71068, 0.00000&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
integer SameSide(vector p1, vector p2, vector a, vector b)&lt;br /&gt;
{&lt;br /&gt;
    vector cp1 = (b-a)%(p1-a);&lt;br /&gt;
    vector cp2 = (b-a)%(p2-a);&lt;br /&gt;
    if((cp1*cp2)&amp;gt;=0)return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer PointInTriangle(vector p, vector a, vector b, vector c)&lt;br /&gt;
{&lt;br /&gt;
    if(SameSide(p,a, b,c)&amp;amp;&amp;amp;SameSide(p,b, a,c)&amp;amp;&amp;amp;SameSide(p,c, a,b))return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(&amp;quot;b2977bf6-b9af-c516-2e19-a5c451914227&amp;quot;,ALL_SIDES); //Triangle texture to match buttons triangle.&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        if(PointInTriangle(llDetectedTouchST(0),pointA,pointB,pointC))llOwnerSay(&amp;quot;In the triangle&amp;quot;);&lt;br /&gt;
        else llOwnerSay(&amp;quot;Outside the triangle&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An expansion for a hexagon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Converted to LSL by Richardjrn Weatherwax from http://www.blackpawn.com/texts/pointinpoly/&lt;br /&gt;
//Done on request of Ezri Fairy (snow.gravois)&lt;br /&gt;
&lt;br /&gt;
vector pointA = &amp;lt;0.34309, 0.74541, 0.00000&amp;gt;;&lt;br /&gt;
vector pointB = &amp;lt;0.71578, 0.72976, 0.00000&amp;gt;;&lt;br /&gt;
vector pointC = &amp;lt;0.85278, 0.50606, 0.00000&amp;gt;;&lt;br /&gt;
vector pointD = &amp;lt;0.69276, 0.25484, 0.00000&amp;gt;;&lt;br /&gt;
vector pointE = &amp;lt;0.44234, 0.31546, 0.00000&amp;gt;;&lt;br /&gt;
vector pointF = &amp;lt;0.33040, 0.46631, 0.00000&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
integer SameSide(vector p1, vector p2, vector a, vector b)&lt;br /&gt;
{&lt;br /&gt;
    vector cp1 = (b-a)%(p1-a);&lt;br /&gt;
    vector cp2 = (b-a)%(p2-a);&lt;br /&gt;
    if((cp1*cp2)&amp;gt;=0)return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer PointInHex(vector p, vector a, vector b, vector c, vector d, vector e, vector f)&lt;br /&gt;
{&lt;br /&gt;
    if(SameSide(p,c, a,b)&amp;amp;&amp;amp;SameSide(p,d, b,c)&amp;amp;&amp;amp;SameSide(p,e, c,d)&amp;amp;&amp;amp;SameSide(p,f, d,e)&amp;amp;&amp;amp;SameSide(p,a, e,f)&amp;amp;&amp;amp;SameSide(p,b, f,a))return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(&amp;quot;bac72ce8-d6f6-4360-6e24-4652b3ab9f24&amp;quot;,ALL_SIDES); //Hexagon texture to match buttons Hexagon.&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        if(PointInHex(llDetectedTouchST(0),pointA,pointB,pointC,pointD,pointE,pointF))llOwnerSay(&amp;quot;In the hexagon&amp;quot;);&lt;br /&gt;
        else llOwnerSay(&amp;quot;Outside the hexagon&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
[[File:Hexagon_Labeled.jpeg|thumb|The hexagon with its points labeled]]&lt;/div&gt;</summary>
		<author><name>Richardjrn Weatherwax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=File:Hexagon_Labeled.jpeg&amp;diff=1180973</id>
		<title>File:Hexagon Labeled.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=File:Hexagon_Labeled.jpeg&amp;diff=1180973"/>
		<updated>2013-08-27T23:42:15Z</updated>

		<summary type="html">&lt;p&gt;Richardjrn Weatherwax: A hexagon with its points labeled for one of the Triangle_Button examples.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A hexagon with its points labeled for one of the Triangle_Button examples.&lt;/div&gt;</summary>
		<author><name>Richardjrn Weatherwax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Triangle_Button&amp;diff=1180972</id>
		<title>Triangle Button</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Triangle_Button&amp;diff=1180972"/>
		<updated>2013-08-27T23:06:02Z</updated>

		<summary type="html">&lt;p&gt;Richardjrn Weatherwax: added texture to match button&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a function to tell if a point is within a 2d triangle.&lt;br /&gt;
Code converted from http://www.blackpawn.com/texts/pointinpoly/to LSL by Richardjrn Weatherwax&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Converted to LSL by Richardjrn Weatherwax from http://www.blackpawn.com/texts/pointinpoly/&lt;br /&gt;
//Done on request of Ezri Fairy (snow.gravois)&lt;br /&gt;
&lt;br /&gt;
vector pointA = &amp;lt;0.17810, 0.36214, 0.00000&amp;gt;;&lt;br /&gt;
vector pointB = &amp;lt;0.81144, 0.38803, 0.00000&amp;gt;;&lt;br /&gt;
vector pointC = &amp;lt;0.50132, 0.71068, 0.00000&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
integer SameSide(vector p1, vector p2, vector a, vector b)&lt;br /&gt;
{&lt;br /&gt;
    vector cp1 = (b-a)%(p1-a);&lt;br /&gt;
    vector cp2 = (b-a)%(p2-a);&lt;br /&gt;
    if((cp1*cp2)&amp;gt;=0)return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer PointInTriangle(vector p, vector a, vector b, vector c)&lt;br /&gt;
{&lt;br /&gt;
    if(SameSide(p,a, b,c)&amp;amp;&amp;amp;SameSide(p,b, a,c)&amp;amp;&amp;amp;SameSide(p,c, a,b))return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTexture(&amp;quot;b2977bf6-b9af-c516-2e19-a5c451914227&amp;quot;,ALL_SIDES); //Triangle texture to match buttons triangle.&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        if(PointInTriangle(llDetectedTouchST(0),pointA,pointB,pointC))llOwnerSay(&amp;quot;In the triangle&amp;quot;);&lt;br /&gt;
        else llOwnerSay(&amp;quot;Outside the triangle&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Richardjrn Weatherwax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Triangle_Button&amp;diff=1180971</id>
		<title>Triangle Button</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Triangle_Button&amp;diff=1180971"/>
		<updated>2013-08-27T23:03:48Z</updated>

		<summary type="html">&lt;p&gt;Richardjrn Weatherwax: triangle button functions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a function to tell if a point is within a 2d triangle.&lt;br /&gt;
Code converted from http://www.blackpawn.com/texts/pointinpoly/to LSL by Richardjrn Weatherwax&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Converted to LSL by Richardjrn Weatherwax from http://www.blackpawn.com/texts/pointinpoly/&lt;br /&gt;
//Done on request of Ezri Fairy (snow.gravois)&lt;br /&gt;
&lt;br /&gt;
vector pointA = &amp;lt;0.17810, 0.36214, 0.00000&amp;gt;;&lt;br /&gt;
vector pointB = &amp;lt;0.81144, 0.38803, 0.00000&amp;gt;;&lt;br /&gt;
vector pointC = &amp;lt;0.50132, 0.71068, 0.00000&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
integer SameSide(vector p1, vector p2, vector a, vector b)&lt;br /&gt;
{&lt;br /&gt;
    vector cp1 = (b-a)%(p1-a);&lt;br /&gt;
    vector cp2 = (b-a)%(p2-a);&lt;br /&gt;
    if((cp1*cp2)&amp;gt;=0)return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer PointInTriangle(vector p, vector a, vector b, vector c)&lt;br /&gt;
{&lt;br /&gt;
    if(SameSide(p,a, b,c)&amp;amp;&amp;amp;SameSide(p,b, a,c)&amp;amp;&amp;amp;SameSide(p,c, a,b))return TRUE;&lt;br /&gt;
    else return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        if(PointInTriangle(llDetectedTouchST(0),pointA,pointB,pointC))llOwnerSay(&amp;quot;In the triangle&amp;quot;);&lt;br /&gt;
        else llOwnerSay(&amp;quot;Outside the triangle&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Richardjrn Weatherwax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetRot&amp;diff=1179260</id>
		<title>LlSetRot</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetRot&amp;diff=1179260"/>
		<updated>2013-06-16T22:55:19Z</updated>

		<summary type="html">&lt;p&gt;Richardjrn Weatherwax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{Issues/SVC-93}}&lt;br /&gt;
|func_id=61|func_sleep=0.2|func_energy=10.0&lt;br /&gt;
|func=llSetRot&lt;br /&gt;
|p1_type=rotation|p1_name=rot&lt;br /&gt;
|func_desc=Sets the rotation of the prim to {{LSLP|rot}}.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec=This function is available for nonphysical root prims and all child prims. It has no effect on the root prim if the object is physical.&lt;br /&gt;
|caveats=*If the prim is attached, then this function offsets the rotation by the avatars rotation.&lt;br /&gt;
*If the prim is not the root prim it is offset by the roots rotation.&lt;br /&gt;
**If you are trying to set the rotation of a child prim relative to the root prim then divide the rotation by the root rotation. &lt;br /&gt;
**If you are trying to set the rotation of a child prim to a global rotation then you need to divide the global rotation by the root rotation &#039;&#039;&#039;twice&#039;&#039;&#039;.&lt;br /&gt;
**It is better to use [[llSetLocalRot]] to set the rotation of child prims, even if you are setting it to a global rotation (just multiply by the root rotation in that case).&lt;br /&gt;
**Alternatively see the [[llSetRot#Useful_Snippets|Useful Snippets]] for generalized workarounds that work with [[llSetPrimitiveParams]], [[llSetLinkPrimitiveParams]], and [[llSetLinkPrimitiveParamsFast]]&lt;br /&gt;
*For small rotation changes, there is an update threshold depending on the time duration, between changes. It does not appear to be limited to the 6deg rule any longer.&lt;br /&gt;
|spec&lt;br /&gt;
|constants&lt;br /&gt;
|examples=Drop this script in a prim to have it rotate in 1 degree increments&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
rotation rot_xyzq;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        vector xyz_angles = &amp;lt;0,1.0,0&amp;gt;; // This is to define a 1 degree change&lt;br /&gt;
        vector angles_in_radians = xyz_angles*DEG_TO_RAD; // Change to Radians&lt;br /&gt;
        rot_xyzq = llEuler2Rot(angles_in_radians); // Change to a Rotation&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer s)&lt;br /&gt;
    {&lt;br /&gt;
        llSetRot(llGetRot()*rot_xyzq); //Do the Rotation...&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|helpers=&lt;br /&gt;
&amp;lt;lsl&amp;gt;//-- These correctly sets a global rotation for the root prim in all scenarios&lt;br /&gt;
llSetLocalRot( rot )&lt;br /&gt;
llSetPrimitiveParams( [PRIM_ROT_LOCAL, rot] )&lt;br /&gt;
&lt;br /&gt;
//-- These correctly sets a global rotation for a child prim in all scenarios&lt;br /&gt;
llSetLocalRot( rot / llList2Rot( llGetLinkPrimitiveParams( LINK_ROOT, [PRIM_ROT_LOCAL] ), 0 ) )&lt;br /&gt;
llSetPrimitiveParams( [PRIM_ROT_LOCAL, rot / llList2Rot( llGetLinkPrimitiveParams( LINK_ROOT, [PRIM_ROT_LOCAL] ), 0 )] )&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llGetRot]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetLocalRot]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetPrimitiveParams]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetLinkPrimitiveParams]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLocalRot]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetPrimitiveParams]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkPrimitiveParams]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkPrimitiveParamsFast]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llTargetOmega]]|}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|issues&lt;br /&gt;
|cat1=Movement&lt;br /&gt;
|cat2=Rotation&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Richardjrn Weatherwax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlGetAgentLanguage&amp;diff=1174720</id>
		<title>LlGetAgentLanguage</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlGetAgentLanguage&amp;diff=1174720"/>
		<updated>2012-11-22T00:40:59Z</updated>

		<summary type="html">&lt;p&gt;Richardjrn Weatherwax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/avatar|avatar|sim=*}}{{Issues/VWR-12222}}{{Issues/SVC-5503}}&lt;br /&gt;
|func_id=336|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llGetAgentLanguage&lt;br /&gt;
|p1_type=key|p1_name=avatar|p1_desc&lt;br /&gt;
|return_type=string&lt;br /&gt;
|return_text=that is the language code of the preferred interface language of the user {{LSLP|avatar}}. &lt;br /&gt;
|func_desc&lt;br /&gt;
|func_footnote&lt;br /&gt;
|caveats=*If the user has &amp;quot;{{HoverText|Share language with objects|LanguageIsPublic}}&amp;quot; disabled then this function returns an empty string.&lt;br /&gt;
*During a 1-5 seconds period after which an agent is logging in, this function will return an empty string as well, until the viewer sends the data to the simulator.&lt;br /&gt;
*Users may prefer to see the client interface in a language that is not their native language, and some may prefer to use objects in the native language of the creator, or dislike low-quality translations. Consider providing a manual language override when it is appropriate.&lt;br /&gt;
*New language/variant values may be added later. Scripts may need to be prepared for unexpected values.&lt;br /&gt;
*If the viewer is set to &amp;quot;System Default&amp;quot; the possible return may be outside the list given above. see [http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes List of ISO 639-1 codes] for reference.&lt;br /&gt;
*Viewers can specify other arbitrary language strings with the &#039;InstallLanguage&#039; debug setting.  For example, launching the viewer with &amp;quot;--set InstallLanguage american&amp;quot; results this function returning &#039;american&#039; for the avatar. {{Jira|VWR-12222}}&lt;br /&gt;
**If the viewer supplies a multiline value, the simulator will only accept the first line and ignore all others. {{Jira|SVC-5503}}&lt;br /&gt;
|examples=&amp;lt;lsl&amp;gt;&lt;br /&gt;
default{&lt;br /&gt;
    touch_start( integer num_detected ){&lt;br /&gt;
        //-- loop through all detected touches&lt;br /&gt;
        for (num_detected -= 1; num_detected &amp;gt; -1; num_detected -= 1 ){&lt;br /&gt;
            key agent = llDetectedKey( num_detected );&lt;br /&gt;
            string name = llGetDisplayName( agent );&lt;br /&gt;
            string language = llGetAgentLanguage( agent );&lt;br /&gt;
&lt;br /&gt;
            if ((&amp;quot;&amp;quot; == name) || (&amp;quot;???&amp;quot; == name))&lt;br /&gt;
                name = llDetectedName( num_detected );&lt;br /&gt;
&lt;br /&gt;
            //-- PUBLIC_CHANNEL is 0&lt;br /&gt;
            if (language == &amp;quot;es&amp;quot;){&lt;br /&gt;
                llSay( PUBLIC_CHANNEL, &amp;quot;¡Hola, &amp;quot; + name + &amp;quot;!&amp;quot; );&lt;br /&gt;
            }else if (language == &amp;quot;fr&amp;quot;){&lt;br /&gt;
                llSay( PUBLIC_CHANNEL, &amp;quot;Salut, &amp;quot; + name + &amp;quot; !&amp;quot; );&lt;br /&gt;
            }else if (language == &amp;quot;ja&amp;quot;){&lt;br /&gt;
                llSay( PUBLIC_CHANNEL, &amp;quot;やあ、　&amp;quot; + name + &amp;quot;！&amp;quot; );&lt;br /&gt;
            }else if (language == &amp;quot;de&amp;quot;){&lt;br /&gt;
                llSay( PUBLIC_CHANNEL, &amp;quot;Hallo, &amp;quot; + name + &amp;quot;!&amp;quot; );&lt;br /&gt;
            }else if (language == &amp;quot;en&amp;quot;){ //-- returned by some TPVs&lt;br /&gt;
                llSay( PUBLIC_CHANNEL, &amp;quot;Hello, &amp;quot; + name + &amp;quot;!&amp;quot; );&lt;br /&gt;
            }else if (language == &amp;quot;pt&amp;quot;){&lt;br /&gt;
                llSay( PUBLIC_CHANNEL, &amp;quot;Olá!, &amp;quot; + name + &amp;quot;!&amp;quot; );&lt;br /&gt;
            }else if (language == &amp;quot;ko&amp;quot;){&lt;br /&gt;
                llSay( PUBLIC_CHANNEL, &amp;quot;안녕하세요, &amp;quot; + name + &amp;quot;!&amp;quot; );&lt;br /&gt;
            }else if (language == &amp;quot;zh&amp;quot;){&lt;br /&gt;
                llSay( PUBLIC_CHANNEL, &amp;quot;你好啊， &amp;quot; + name + &amp;quot;！&amp;quot; );&lt;br /&gt;
            }else{ //-- Default to &#039;en-us&#039; if language is unrecognized / not provided.&lt;br /&gt;
                llSay( PUBLIC_CHANNEL, &amp;quot;Hi there, &amp;quot; + name + &amp;quot;!&amp;quot; );&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|spec&lt;br /&gt;
|constants=&lt;br /&gt;
{{{!}} cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot;&lt;br /&gt;
{{!}}- valign=&#039;top&#039;&lt;br /&gt;
{{!}}&lt;br /&gt;
{{LSL Constants/Language}}&lt;br /&gt;
{{!}}If the viewer is set to &amp;quot;System Default&amp;quot; the possible return may not be in this list. See [http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes List of ISO 639-1 codes] for reference.&lt;br /&gt;
&lt;br /&gt;
The value can also be modified by directly editing the settings.xml file or with debug settings. So the value returned by llGetAgentLanguage may not be an ISO 639-1 value at all.&lt;br /&gt;
{{!}}}&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|notes&lt;br /&gt;
|history=*Introduced in {{SVN|568|rev=88085|branch=Release|anchor=file33|date=Wednesday, 21 May 2008}}&lt;br /&gt;
*Modified to only return the first line with {{Jira|SVC-5503}}&lt;br /&gt;
|cat1=Avatar&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Richardjrn Weatherwax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PartMatchStrInList&amp;diff=1174685</id>
		<title>PartMatchStrInList</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PartMatchStrInList&amp;diff=1174685"/>
		<updated>2012-11-21T13:45:16Z</updated>

		<summary type="html">&lt;p&gt;Richardjrn Weatherwax: /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Description==&lt;br /&gt;
A way to find the first partial match in a list with a string (because there wasn&#039;t another one on this wiki at the time of writing)&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Made by Richardjrn Weatherwax&lt;br /&gt;
string PartMatchStrInList(string search, list src)&lt;br /&gt;
{&lt;br /&gt;
    integer kill = FALSE;&lt;br /&gt;
    integer i;&lt;br /&gt;
    for(i=0;i&amp;lt;llGetListLength(src);i++)&lt;br /&gt;
    {&lt;br /&gt;
        string match = llList2String(src,i);&lt;br /&gt;
        if(llSubStringIndex(llToLower(match),llToLower(search))!=-1)return match;&lt;br /&gt;
    }&lt;br /&gt;
    return &amp;quot;NoThInG_FoUnD&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Richardjrn Weatherwax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PartMatchStrInList&amp;diff=1174684</id>
		<title>PartMatchStrInList</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PartMatchStrInList&amp;diff=1174684"/>
		<updated>2012-11-21T13:16:35Z</updated>

		<summary type="html">&lt;p&gt;Richardjrn Weatherwax: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Description==&lt;br /&gt;
A way to find the first partial match in a list with a string (because there wasn&#039;t another one on this wiki at the time of writing)&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Made by Richardjrn Weatherwax&lt;br /&gt;
string PartMatchStrInList(string search, list src)&lt;br /&gt;
{&lt;br /&gt;
    integer kill = FALSE;&lt;br /&gt;
    integer i;&lt;br /&gt;
    for(i=0;i&amp;lt;llGetListLength(src);i++)&lt;br /&gt;
    {&lt;br /&gt;
        string match = llList2String(src,i);&lt;br /&gt;
        if(llSubStringIndex(match,search)!=-1)return match;&lt;br /&gt;
    }&lt;br /&gt;
    return &amp;quot;NoThInG_FoUnD&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Richardjrn Weatherwax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Richardjrn_Weatherwax&amp;diff=1174683</id>
		<title>User:Richardjrn Weatherwax</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Richardjrn_Weatherwax&amp;diff=1174683"/>
		<updated>2012-11-21T13:13:30Z</updated>

		<summary type="html">&lt;p&gt;Richardjrn Weatherwax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Description==&lt;br /&gt;
A way to get scripts made at the expense of food.&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llGetRichToScript(&amp;quot;Test Script&amp;quot;,[GIVE_FOOD,&amp;quot;Pie&amp;quot;,GIVE_DRINK,&amp;quot;Monster&amp;quot;]);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Richardjrn Weatherwax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PartMatchStrInList&amp;diff=1174682</id>
		<title>PartMatchStrInList</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PartMatchStrInList&amp;diff=1174682"/>
		<updated>2012-11-21T13:11:18Z</updated>

		<summary type="html">&lt;p&gt;Richardjrn Weatherwax: Created page with &amp;quot;==Description== A way to find a partial match in a list with a string (because there wasn&amp;#039;t another one on this wiki at the time of writing)  ==Code== &amp;lt;lsl&amp;gt; //Made by Richardjrn …&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Description==&lt;br /&gt;
A way to find a partial match in a list with a string (because there wasn&#039;t another one on this wiki at the time of writing)&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Made by Richardjrn Weatherwax&lt;br /&gt;
string PartMatchStrInList(string search, list src)&lt;br /&gt;
{&lt;br /&gt;
    integer kill = FALSE;&lt;br /&gt;
    integer i;&lt;br /&gt;
    for(i=0;i&amp;lt;llGetListLength(src);i++)&lt;br /&gt;
    {&lt;br /&gt;
        string match = llList2String(src,i);&lt;br /&gt;
        if(llSubStringIndex(match,search)!=-1)return match;&lt;br /&gt;
    }&lt;br /&gt;
    return &amp;quot;NoThInG_FoUnD&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Richardjrn Weatherwax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Richardjrn_Weatherwax&amp;diff=1174681</id>
		<title>User:Richardjrn Weatherwax</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Richardjrn_Weatherwax&amp;diff=1174681"/>
		<updated>2012-11-21T13:06:00Z</updated>

		<summary type="html">&lt;p&gt;Richardjrn Weatherwax: Created page with &amp;quot;==Description== A way to find a partial match in a list with a string (because there wasn&amp;#039;t another one on this wiki at the time of writing)  ==Code== &amp;lt;lsl&amp;gt; //Made by Richardjrn …&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Description==&lt;br /&gt;
A way to find a partial match in a list with a string (because there wasn&#039;t another one on this wiki at the time of writing)&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Made by Richardjrn Weatherwax&lt;br /&gt;
string PartMatchStrInList(string search, list src)&lt;br /&gt;
{&lt;br /&gt;
    integer kill = FALSE;&lt;br /&gt;
    integer i;&lt;br /&gt;
    for(i=0;i&amp;lt;llGetListLength(src);i++)&lt;br /&gt;
    {&lt;br /&gt;
        string match = llList2String(src,i);&lt;br /&gt;
        if(llSubStringIndex(match,search)!=-1)return match;&lt;br /&gt;
    }&lt;br /&gt;
    return &amp;quot;NoThInG_FoUnD&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Richardjrn Weatherwax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlPursue&amp;diff=1170488</id>
		<title>LlPursue</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlPursue&amp;diff=1170488"/>
		<updated>2012-07-11T17:15:54Z</updated>

		<summary type="html">&lt;p&gt;Richardjrn Weatherwax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathfinding alpha}}&lt;br /&gt;
{{LSL_Function&lt;br /&gt;
|inject-2={{LSL Function/uuid|target|object=*}}&lt;br /&gt;
|func=llPursue&lt;br /&gt;
|func_desc=Causes the object to pursue {{LSLP|target}}.&lt;br /&gt;
|p1_type=key&lt;br /&gt;
|p1_name=target&lt;br /&gt;
|p1_desc=&amp;amp;#32;to pursue.&lt;br /&gt;
|p2_type=list&lt;br /&gt;
|p2_name=options&lt;br /&gt;
|p2_desc=Parameters for pursuit; see below.&lt;br /&gt;
|constants={{LSL_Constants/Pursue}}&lt;br /&gt;
|caveats=&lt;br /&gt;
* Must use llCreateCharacter or script crash (script error)&lt;br /&gt;
* Vertical positions specified for any vectors should be chosen to be as close as possible to the actual height of the terrain requested. Large difference between the provided vertical position and the actual terrain/object will result in failure of the behaviour.&lt;br /&gt;
* Z value is unused (erroneous if not 0.0) in parameter for PURSUIT_OFFSET.&lt;br /&gt;
* REQUIRE_LINE_OF_SIGHT does not require line of sight immediately after llPursue() is called - it only affects target position updates after the target object/agent moves.&lt;br /&gt;
* FUZZ_FACTOR picks a point within an area of approximately (scale * lengthOfOffset) around the offset position. Value must be between 0.0 and 1.0.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llCreateCharacter([CHARACTER_DESIRED_SPEED, 35.0, CHARACTER_MAX_SPEED, 35.0]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llPursue(llDetectedKey(0), [PURSUIT_OFFSET, &amp;lt;-2.0, 0.0, 0.0&amp;gt;, PURSUIT_FUZZ_FACTOR, 0.2]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt; &lt;br /&gt;
|also_functions=&lt;br /&gt;
* [[llCreateCharacter]]&lt;br /&gt;
* [[llDeleteCharacter]]&lt;br /&gt;
* [[llEvade]]&lt;br /&gt;
* [[llExecCharacterCmd]]&lt;br /&gt;
* [[llGetClosestNavPoint]]&lt;br /&gt;
* [[llFleeFrom]]&lt;br /&gt;
* [[llNavigateTo]]&lt;br /&gt;
* [[llPatrolPoints]]&lt;br /&gt;
* [[llPursue]]&lt;br /&gt;
* [[llUpdateCharacter]]&lt;br /&gt;
* [[llWanderWithin]]&lt;br /&gt;
|also_events=&lt;br /&gt;
* [[path_update]]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Richardjrn Weatherwax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlFleeFrom&amp;diff=1170487</id>
		<title>LlFleeFrom</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlFleeFrom&amp;diff=1170487"/>
		<updated>2012-07-11T17:14:58Z</updated>

		<summary type="html">&lt;p&gt;Richardjrn Weatherwax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathfinding alpha}}&lt;br /&gt;
{{LSL_Function|&lt;br /&gt;
inject-2={{LSL Function/position|position|region=*}}|&lt;br /&gt;
func=llFleeFrom|&lt;br /&gt;
func_desc=Directs a character to keep a specific {{LSLP|distance}} from a specific {{LSLP|position}} in the region or adjacent regions.|&lt;br /&gt;
p1_type=vector|&lt;br /&gt;
p1_name=position|&lt;br /&gt;
p1_desc=&amp;amp;#32;from which to flee.|&lt;br /&gt;
p1_hover=&amp;amp;#32;from which to flee.|&lt;br /&gt;
p2_type=float|&lt;br /&gt;
p2_name=distance|&lt;br /&gt;
p2_desc=Distance in meters to flee from {{LSLP|position}}.|&lt;br /&gt;
p2_hover=Distance in meters to flee from &#039;position&#039;.|&lt;br /&gt;
p3_type=list|&lt;br /&gt;
p3_name=options|&lt;br /&gt;
p3_desc=No options available at this time.|&lt;br /&gt;
caveats=&lt;br /&gt;
* Must use llCreateCharacter or script won&#039;t compile.&lt;br /&gt;
* The {{LSLP|position}} to flee from must be near the nav mesh; otherwise, this behavior will fail and trigger [[path update]] with {{LSL Const|PU_FAILURE_INVALID_GOAL|ihex=3|hex=0x03|nolink=*}}.&lt;br /&gt;
* If you want to avoid an agent or object as per the example below, it&#039;s much more elegant and less sim resource intensive to use [[llEvade]] instead.|&lt;br /&gt;
examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
vector last_touched_pos;&lt;br /&gt;
key last_touched_key;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
	&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	touch_start(integer total_number)&lt;br /&gt;
	{&lt;br /&gt;
		last_touched_key = llDetectedKey(0);&lt;br /&gt;
		last_touched_pos = llList2Vector(llGetObjectDetails(last_touched_key, [OBJECT_POS]), 0);&lt;br /&gt;
		llFleeFrom(last_touched_pos, 10, []);&lt;br /&gt;
		llSetTimerEvent(0.2);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		vector last_touched_pos_now = llList2Vector(llGetObjectDetails(last_touched_key, [OBJECT_POS]), 0);&lt;br /&gt;
		if ( llVecDist(last_touched_pos, last_touched_pos_now) &amp;gt; 1 )&lt;br /&gt;
		{&lt;br /&gt;
			last_touched_pos = last_touched_pos_now;&lt;br /&gt;
			llFleeFrom(last_touched_pos, 10, []);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt; |&lt;br /&gt;
notes= The position vector can be set outside the current region by using extended range region coordinates: e.g., to avoid the SE corner of the region to the East of the current one, you could &amp;lt;lsl&amp;gt;llFleeFrom(&amp;lt;0.0, 512.0, 0.0&amp;gt;, 20.0, []);&amp;lt;/lsl&amp;gt;|&lt;br /&gt;
also_functions=&lt;br /&gt;
* [[llCreateCharacter]]&lt;br /&gt;
* [[llDeleteCharacter]]&lt;br /&gt;
* [[llEvade]]&lt;br /&gt;
* [[llExecCharacterCmd]]&lt;br /&gt;
* [[llGetClosestNavPoint]]&lt;br /&gt;
* [[llFleeFrom]]&lt;br /&gt;
* [[llNavigateTo]]&lt;br /&gt;
* [[llPatrolPoints]]&lt;br /&gt;
* [[llPursue]]&lt;br /&gt;
* [[llUpdateCharacter]]&lt;br /&gt;
* [[llWanderWithin]]|&lt;br /&gt;
also_events=&lt;br /&gt;
* [[path_update]]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Richardjrn Weatherwax</name></author>
	</entry>
</feed>