<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/index.php?action=history&amp;feed=atom&amp;title=User%3AClarknova_Helvetic%2FSit_TP_Positioner</id>
	<title>User:Clarknova Helvetic/Sit TP Positioner - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/index.php?action=history&amp;feed=atom&amp;title=User%3AClarknova_Helvetic%2FSit_TP_Positioner"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Clarknova_Helvetic/Sit_TP_Positioner&amp;action=history"/>
	<updated>2026-04-08T17:38:50Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Clarknova_Helvetic/Sit_TP_Positioner&amp;diff=51115&amp;oldid=prev</id>
		<title>Clarknova Helvetic: updated to add sensor fallback</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Clarknova_Helvetic/Sit_TP_Positioner&amp;diff=51115&amp;oldid=prev"/>
		<updated>2008-01-25T03:36:12Z</updated>

		<summary type="html">&lt;p&gt;updated to add sensor fallback&lt;/p&gt;
&lt;a href=&quot;https://wiki.secondlife.com/w/index.php?title=User:Clarknova_Helvetic/Sit_TP_Positioner&amp;amp;diff=51115&amp;amp;oldid=50846&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Clarknova Helvetic</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Clarknova_Helvetic/Sit_TP_Positioner&amp;diff=50846&amp;oldid=prev</id>
		<title>Clarknova Helvetic: /* Target setter - drag &#039;n drop */ asdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Clarknova_Helvetic/Sit_TP_Positioner&amp;diff=50846&amp;oldid=prev"/>
		<updated>2008-01-24T07:35:22Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Target setter - drag &amp;#039;n drop: &lt;/span&gt; asdf&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:35, 24 January 2008&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l193&quot;&gt;Line 193:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 193:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Target setter &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;- &lt;/del&gt;drag &#039;n drop ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Target setter &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(&lt;/ins&gt;drag &#039;n drop&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;) &lt;/ins&gt;==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This script does the same thing as the one above.  The difference is that once you drag the script in your chair it sets the target and deletes from prim inventory.  Fire &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;n &lt;/del&gt;forget.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This script does the same thing as the one above.  The difference is that once you drag the script in your chair it sets the target and deletes from prim inventory.  Fire &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;and &lt;/ins&gt;forget.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;lsl&amp;gt;// Sit target system by Lex Neva. Please distribute willy-nilly.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;lsl&amp;gt;// Sit target system by Lex Neva. Please distribute willy-nilly.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Clarknova Helvetic</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Clarknova_Helvetic/Sit_TP_Positioner&amp;diff=50835&amp;oldid=prev</id>
		<title>Clarknova Helvetic: article created</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Clarknova_Helvetic/Sit_TP_Positioner&amp;diff=50835&amp;oldid=prev"/>
		<updated>2008-01-24T07:21:21Z</updated>

		<summary type="html">&lt;p&gt;article created&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;This set of scripts is for making perfect sit targets.  It was first written by Lex Neva and heavily abused by me to adapt it for 300m sit-teleport support.  You can use it for a sit target just 2cm away, or for from one region corner to the other.&lt;br /&gt;
&lt;br /&gt;
== Helper script ==&lt;br /&gt;
&lt;br /&gt;
To get started drop the following script into a new prim.  It&amp;#039;s your Helper prim.  You sit on it and edit it to where you want your av to be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;// Sit target system by Lex Neva. Please distribute willy-nilly.&lt;br /&gt;
// http://forums.secondlife.com/showthread.php?t=153278&amp;amp;highlight=target&lt;br /&gt;
&lt;br /&gt;
// Helper prim script&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Support for Teleport-range setting shoehorned in by Clarknova Helvetic&lt;br /&gt;
// https://wiki.secondlife.com/w/index.php?title=User:Clarknova_Helvetic/Sit_TP_Positioner&amp;amp;action=submit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Generate a private chat channel based on key, JUSSSSSST in case  &lt;br /&gt;
// two people are using a sit positioner in the same sim.&lt;br /&gt;
integer channel;&lt;br /&gt;
integer genChannel(key k , integer mod, integer pin)&lt;br /&gt;
{  // NOTE : mod must = 1 or 2  ,  pin must be  &amp;gt;=  || &amp;lt; 500,000&lt;br /&gt;
    float a = (float)(&amp;quot;0x&amp;quot;+llGetSubString( (string)k, mod,-1));       &lt;br /&gt;
    integer b =  llRound( llFabs(a) - a*2 + pin );          &lt;br /&gt;
    return b;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer p) { llResetScript(); }&lt;br /&gt;
    &lt;br /&gt;
    state_entry() {&lt;br /&gt;
        &lt;br /&gt;
        // This ugly part turns our prim into a purple ball.&lt;br /&gt;
        llSetPrimitiveParams([PRIM_TYPE,3,0,&amp;lt;0.000000, 1.000000, 0.000000&amp;gt;,0.000000,&amp;lt;0.000000, 0.000000, 0.000000&amp;gt;,&amp;lt;0.000000, 1.000000, 0.000000&amp;gt; , PRIM_POINT_LIGHT,0,&amp;lt;1.000000, 1.000000, 1.000000&amp;gt;,1.000000,10.000000,0.750000 , PRIM_COLOR,0,&amp;lt;0.729412, 0.160784, 0.717647&amp;gt;,1.000000 , PRIM_BUMP_SHINY,0,1,0 ]);&lt;br /&gt;
        llSetPrimitiveParams([PRIM_ROTATION,&amp;lt;0.000000, 0.000000, 0.000000, 1.000000&amp;gt; , PRIM_TEXTURE,0,&amp;quot;5748decc-f629-461c-9a36-a35a221fe21f&amp;quot;,&amp;lt;1.000000, 1.000000, 0.000000&amp;gt;,&amp;lt;0.000000, 0.000000, 0.000000&amp;gt;,0.000000 , PRIM_SIZE,&amp;lt;0.250000, 0.250000, 0.250000&amp;gt; ]);&lt;br /&gt;
        // Ugly all done :)&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        llParticleSystem([]);&lt;br /&gt;
        llSitTarget(&amp;lt;0,0,1&amp;gt;, ZERO_ROTATION);&lt;br /&gt;
        channel = genChannel(llGetOwner() , 2 , 300 );&lt;br /&gt;
        &lt;br /&gt;
        llListen( channel , &amp;quot;&amp;quot; , NULL_KEY , &amp;quot;Where are you?&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen(integer chan , string name , key id , string msg )&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        ////// Some neat particles to show the link line  :)&lt;br /&gt;
        //&lt;br /&gt;
        //  Calculate the lifespan of the particles so they don&amp;#039;t move to fast&lt;br /&gt;
        vector start_scale = &amp;lt;.2,.4,.0&amp;gt;; vector end_scale = &amp;lt;.25,.45,.0&amp;gt;;&lt;br /&gt;
        float part_age =  .3 * (llVecDist(llList2Vector(llGetObjectDetails(id,[OBJECT_POS]),0),llGetPos()));&lt;br /&gt;
        if (part_age &amp;gt; 30.) { &lt;br /&gt;
        vector mod = &amp;lt; 0., (part_age / 30.), 0.&amp;gt;; part_age = 30.; start_scale = start_scale + mod; end_scale = end_scale + mod; }&lt;br /&gt;
        //  Generate the particles&lt;br /&gt;
        llParticleSystem([2,1.0,4,1.0,1,&amp;lt;0.847059, 0.301961, 0.835294&amp;gt;,3,&amp;lt;0.729412, 0.160784, 0.717647&amp;gt;,5,start_scale,6,end_scale,19,0.0,7,part_age,13,0.0,15,10,9,2,8,&amp;lt;75.0,0.0,0.0&amp;gt;,0,483,20,id]);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //// Tell our object where we are&lt;br /&gt;
        llRegionSay(channel , (string)llGetRot() + &amp;quot;@&amp;quot; + (string)llGetPos()  ); &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    changed(integer change) {&lt;br /&gt;
        if (llAvatarOnSitTarget() != NULL_KEY)&lt;br /&gt;
            llRequestPermissions(llAvatarOnSitTarget(), PERMISSION_TRIGGER_ANIMATION);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    run_time_permissions(integer perm) {&lt;br /&gt;
        string anim = llGetInventoryName(INVENTORY_ANIMATION, 0);&lt;br /&gt;
        if (anim != &amp;quot;&amp;quot;) {&lt;br /&gt;
            llStopAnimation(&amp;quot;sit&amp;quot;);&lt;br /&gt;
            llStopAnimation(&amp;quot;sit_generic&amp;quot;);&lt;br /&gt;
            llStopAnimation(&amp;quot;sit_female&amp;quot;);&lt;br /&gt;
            llStartAnimation(anim);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you actually read that you&amp;#039;ll see that you can also stick an animation in the helper prim and it&amp;#039;ll play it while you sit.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Target Setter (on touch) ==&lt;br /&gt;
&lt;br /&gt;
Next drop this script into your chair or teleport pad or whatever.  Then touch.  It sets the sit target of the prim to be exactly where your av is sitting on the helper.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;// Sit target system by Lex Neva. Please distribute willy-nilly.&lt;br /&gt;
// http://forums.secondlife.com/showthread.php?t=153278&amp;amp;highlight=target&lt;br /&gt;
&lt;br /&gt;
// Sit target setting script.   Sets on touch.&lt;br /&gt;
&lt;br /&gt;
// Support for Teleport-range setting shoehorned in by Clarknova Helvetic&lt;br /&gt;
// https://wiki.secondlife.com/w/index.php?title=User:Clarknova_Helvetic/Sit_TP_Positioner&amp;amp;action=submit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Generate a private chat channel based on key, JUSSSSSST in case  &lt;br /&gt;
// two people are using a sit positioner in the same sim.&lt;br /&gt;
integer channel;&lt;br /&gt;
integer genChannel(key k , integer mod, integer pin)&lt;br /&gt;
{  // NOTE : mod must = 1 or 2  ,  pin must be  &amp;gt;= 1  or &amp;lt; 500,000&lt;br /&gt;
    float a = (float)(&amp;quot;0x&amp;quot;+llGetSubString( (string)k, mod,-1));       &lt;br /&gt;
    integer b =  llRound( llFabs(a) - a*2 + pin );          &lt;br /&gt;
    return b;&lt;br /&gt;
}&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;
integer i;&lt;br /&gt;
    for (i = 0 ; i &amp;lt; total_number ; ++i )&lt;br /&gt;
    {&lt;br /&gt;
        if (llDetectedKey(i) == llGetOwner())   &lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;Querying Sit Target Helper...&amp;quot;);&lt;br /&gt;
            channel = genChannel(llGetOwner() , 2 , 300 );&lt;br /&gt;
            llListen( channel , &amp;quot;&amp;quot; , NULL_KEY , &amp;quot;&amp;quot;);&lt;br /&gt;
            llRegionSay(channel,&amp;quot;Where are you?&amp;quot;);&lt;br /&gt;
            llSetTimerEvent( 10. );&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
listen(integer chan , string name , key id , string msg )&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    integer at = llSubStringIndex( msg, &amp;quot;@&amp;quot; );&lt;br /&gt;
    &lt;br /&gt;
    rotation helper_rot = (rotation)(llGetSubString(msg, 0, at - 1));&lt;br /&gt;
    vector helper_pos = (vector)(llGetSubString(msg, at + 1,-1));&lt;br /&gt;
&lt;br /&gt;
    vector my_pos = llGetPos();&lt;br /&gt;
    rotation my_rot = llGetRot();&lt;br /&gt;
    &lt;br /&gt;
    float distance = llVecDist(my_pos,helper_pos);&lt;br /&gt;
    &lt;br /&gt;
    vector target_pos = ZERO_VECTOR;&lt;br /&gt;
    &lt;br /&gt;
    if ( distance &amp;gt; 300.) {&lt;br /&gt;
    llOwnerSay(&amp;quot;Sit target is &amp;quot; + (string)(distance - 300.) + &amp;quot;m too far away! \n( if you lost your Helper it&amp;#039;s at &amp;quot; + (string)helper_pos +&amp;quot; )&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    else {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    // calculate where the avatar actually is&lt;br /&gt;
    vector avatar_pos = helper_pos + &amp;lt;0,0,1&amp;gt; * helper_rot; // due to helper&amp;#039;s sit target&lt;br /&gt;
    avatar_pos = avatar_pos - &amp;lt;0,0,0.186&amp;gt; + &amp;lt;0,0,0.4&amp;gt; * helper_rot; // correct for a bug in llSitTarget(), for helper sit target&lt;br /&gt;
&lt;br /&gt;
    target_pos = (avatar_pos - my_pos) / my_rot;&lt;br /&gt;
    target_pos = target_pos + &amp;lt;0,0,0.186&amp;gt;/my_rot - &amp;lt;0,0,0.4&amp;gt;; // correct for the bug again, this time in my sit target&lt;br /&gt;
    rotation target_rot = helper_rot / my_rot;&lt;br /&gt;
    &lt;br /&gt;
    llSitTarget(target_pos, target_rot);&lt;br /&gt;
    llOwnerSay(&amp;quot;llSitTarget(&amp;quot; + (string)target_pos + &amp;quot;, &amp;quot; + (string)target_rot + &amp;quot;);&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    }&lt;br /&gt;
    llSetTimerEvent(0.);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
changed(integer change) {&lt;br /&gt;
if (llAvatarOnSitTarget() != NULL_KEY)&lt;br /&gt;
llRequestPermissions(llAvatarOnSitTarget(), PERMISSION_TRIGGER_ANIMATION);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
run_time_permissions(integer perm) {&lt;br /&gt;
string anim = llGetInventoryName(INVENTORY_ANIMATION, 0);&lt;br /&gt;
if (anim != &amp;quot;&amp;quot;) {&lt;br /&gt;
llStopAnimation(&amp;quot;sit&amp;quot;);&lt;br /&gt;
llStopAnimation(&amp;quot;sit_generic&amp;quot;);&lt;br /&gt;
llStopAnimation(&amp;quot;sit_female&amp;quot;);&lt;br /&gt;
llStartAnimation(anim);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
    timer() { llOwnerSay(&amp;quot;Query timed out.  You sure your Helper is in the same sim? \n Anyway, try again.&amp;quot;);  }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If successful, particles will flow from your Helper to the chair prim.  If your target is too far away, or not in the same region, you&amp;#039;ll be warned instead.&lt;br /&gt;
&lt;br /&gt;
Adjust and touch as many times as you need.  Remember to remove the script when done. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Target setter - drag &amp;#039;n drop ==&lt;br /&gt;
&lt;br /&gt;
This script does the same thing as the one above.  The difference is that once you drag the script in your chair it sets the target and deletes from prim inventory.  Fire &amp;#039;n forget.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;// Sit target system by Lex Neva. Please distribute willy-nilly.&lt;br /&gt;
// http://forums.secondlife.com/showthread.php?t=153278&amp;amp;highlight=target&lt;br /&gt;
&lt;br /&gt;
// Sit target setting script.   Drag -n- drop version.&lt;br /&gt;
&lt;br /&gt;
// Support for Teleport-range setting shoehorned in by Clarknova Helvetic  &lt;br /&gt;
// Drag &amp;#039;n drop adaptation also by CH.  I like doing things this way :)&lt;br /&gt;
// https://wiki.secondlife.com/w/index.php?title=User:Clarknova_Helvetic/Sit_TP_Positioner&amp;amp;action=submit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Generate a private chat channel based on key, JUSSSSSST in case  &lt;br /&gt;
// two people are using a sit positioner in the same sim.&lt;br /&gt;
integer channel;&lt;br /&gt;
integer genChannel(key k , integer mod, integer pin)&lt;br /&gt;
{  // NOTE : mod must = 1 or 2  ,  pin must be  &amp;gt;= 1  or &amp;lt; 500,000&lt;br /&gt;
    float a = (float)(&amp;quot;0x&amp;quot;+llGetSubString( (string)k, mod,-1));       &lt;br /&gt;
    integer b =  llRound( llFabs(a) - a*2 + pin );          &lt;br /&gt;
    return b;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
state_entry() {&lt;br /&gt;
llSitTarget(ZERO_VECTOR,ZERO_ROTATION);&lt;br /&gt;
llOwnerSay(&amp;quot;Querying Sit Target Helper...&amp;quot;);&lt;br /&gt;
channel = genChannel(llGetOwner() , 2 , 300 );&lt;br /&gt;
llListen( channel , &amp;quot;&amp;quot; , NULL_KEY , &amp;quot;&amp;quot;);&lt;br /&gt;
llRegionSay(channel,&amp;quot;Where are you?&amp;quot;);&lt;br /&gt;
llSetTimerEvent( 10. );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
listen(integer chan , string name , key id , string msg )&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    integer at = llSubStringIndex( msg, &amp;quot;@&amp;quot; );&lt;br /&gt;
    &lt;br /&gt;
    rotation helper_rot = (rotation)(llGetSubString(msg, 0, at - 1));&lt;br /&gt;
    vector helper_pos = (vector)(llGetSubString(msg, at + 1,-1));&lt;br /&gt;
&lt;br /&gt;
    vector my_pos = llGetPos();&lt;br /&gt;
    rotation my_rot = llGetRot();&lt;br /&gt;
    &lt;br /&gt;
    float distance = llVecDist(my_pos,helper_pos);&lt;br /&gt;
    &lt;br /&gt;
    vector target_pos = ZERO_VECTOR;&lt;br /&gt;
    &lt;br /&gt;
    if ( distance &amp;gt; 300.) {&lt;br /&gt;
    llOwnerSay(&amp;quot;Sit target is &amp;quot; + (string)(distance - 300.) + &amp;quot;m too far away! \n( if you lost your Helper it&amp;#039;s at &amp;quot; + (string)helper_pos +&amp;quot; )&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    else {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    // calculate where the avatar actually is&lt;br /&gt;
    vector avatar_pos = helper_pos + &amp;lt;0,0,1&amp;gt; * helper_rot; // due to helper&amp;#039;s sit target&lt;br /&gt;
    avatar_pos = avatar_pos - &amp;lt;0,0,0.186&amp;gt; + &amp;lt;0,0,0.4&amp;gt; * helper_rot; // correct for a bug in llSitTarget(), for helper sit target&lt;br /&gt;
&lt;br /&gt;
    target_pos = (avatar_pos - my_pos) / my_rot;&lt;br /&gt;
    target_pos = target_pos + &amp;lt;0,0,0.186&amp;gt;/my_rot - &amp;lt;0,0,0.4&amp;gt;; // correct for the bug again, this time in my sit target&lt;br /&gt;
    rotation target_rot = helper_rot / my_rot;&lt;br /&gt;
    &lt;br /&gt;
    llSitTarget(target_pos, target_rot);&lt;br /&gt;
    llOwnerSay(&amp;quot;llSitTarget(&amp;quot; + (string)target_pos + &amp;quot;, &amp;quot; + (string)target_rot + &amp;quot;);&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    llRemoveInventory(llGetScriptName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
changed(integer change) {&lt;br /&gt;
if (llAvatarOnSitTarget() != NULL_KEY)&lt;br /&gt;
llRequestPermissions(llAvatarOnSitTarget(), PERMISSION_TRIGGER_ANIMATION);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
run_time_permissions(integer perm) {&lt;br /&gt;
string anim = llGetInventoryName(INVENTORY_ANIMATION, 0);&lt;br /&gt;
if (anim != &amp;quot;&amp;quot;) {&lt;br /&gt;
llStopAnimation(&amp;quot;sit&amp;quot;);&lt;br /&gt;
llStopAnimation(&amp;quot;sit_generic&amp;quot;);&lt;br /&gt;
llStopAnimation(&amp;quot;sit_female&amp;quot;);&lt;br /&gt;
llStartAnimation(anim);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
    timer() { llOwnerSay(&amp;quot;Query timed out.  You sure your Helper is in the same sim? \n Anyway, try again.&amp;quot;); llRemoveInventory(llGetScriptName()); }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Clarknova Helvetic</name></author>
	</entry>
</feed>