Difference between revisions of "No Limit Teleporter"

From Second Life Wiki
Jump to navigation Jump to search
m (<lsl> tag to <source>)
(3 intermediate revisions by one other user not shown)
Line 7: Line 7:
[+] Set stapos (end of script) to the object position (where to back when the destination is reach).<br>
[+] Set stapos (end of script) to the object position (where to back when the destination is reach).<br>
[+] Set dest (end of script) to the object destination.<br>
[+] Set dest (end of script) to the object destination.<br>
;)


<lsl>
 
<source lang="lsl2">
//Leave that here
//Leave that here
//Script created by Morgam Biedermann
//Script created by Morgam Biedermann
Line 47: Line 47:
         teleport(<141,19,505>);
         teleport(<141,19,505>);
     }
     }
}</lsl>
}
<b>
</source>
The above example is a really bad approach to use for many reasons. Not least of which is that lag is precisely what it *will* generate.
The above example is a really bad approach to use for many reasons. Not least of which is that lag is precisely what it *will* generate.<br>
A much more efficient solution involves using warpPos or similar solutions instead of self referential functions with llSetPos() loops.
<br>
</b>
An equivalency check that respects SLs somewhat wiggly precision system, and isn't trying to match a movement to EXACTLY 6 decimal places of precision is needed.<br>
Bad, but less evil.
<source lang="lsl2">
<lsl>
if(llGetPos() != dest)
//is bad
</source>
<source lang="lsl2">
if(llVecDist(llGetPos(),dest)<0.001)
//is MUCH better
</source>
ie:
<source lang="lsl2">
teleports(vector dest)
teleports(vector dest)
{
{
Line 59: Line 67:
// This an inherently bad approach; given 6 decimal places on 3 floats in a vector its  
// This an inherently bad approach; given 6 decimal places on 3 floats in a vector its  
// very UNlikely the equivalency will be precisely equal even if its VERY close, this  
// very UNlikely the equivalency will be precisely equal even if its VERY close, this  
// will be come especially evident at high altitude. It'll look  like its stopped,  
// will become especially evident at high altitude. It'll look  like its stopped,  
// but the llSetPos() will be still thrashing away. Possibly for quite some time/forever.
// but the llSetPos() will be still thrashing away. Possibly for quite some time/forever.
//
//
// the below will stop in a timely manner.
// the below will stop in a timely manner.
     if(llVecDist(llGetPos(),dest) <= 0.01)
     if(llVecDist(llGetPos(),dest) <= 0.001)
     {  llSetPos(dest); //corrected variable
     {  llSetPos(dest); //corrected variable
         teleports(dest); //corrected variable
         teleports(dest); //corrected variable
     }
     }
}
}
</lsl>
</source>
<br>
And a system that has a user function call itself from within itself is probably not good.
<br>
This is MUCH Better. [MUST be compiled in MONO]
MUCH Better. [MUST be compiled in MONO]
<source lang="lsl2">
<lsl>
teleports(vector dest)
teleports(vector dest)
{  list l=[PRIM_POSITION,dest];
{  list l=[PRIM_POSITION,dest];
Line 78: Line 85:
     llSetPrimitiveParams(l);
     llSetPrimitiveParams(l);
}
}
</lsl>
</source>

Revision as of 00:23, 25 January 2015

Simple Teleporter - No Limitation


Zero - Lag
You can do anything, change the code and all more... To use:
[+] Set stapos (end of script) to the object position (where to back when the destination is reach).
[+] Set dest (end of script) to the object destination.


//Leave that here
//Script created by Morgam Biedermann
vector posnow;
vector stapos;
rotation rotnow;
teleport(vector dest)
{
    if(llGetPos() != dest)
    {
        llSetPos(dest);
        teleport(dest);
    }
    else
    {
        llUnSit(llAvatarOnSitTarget());
        teleports(stapos);
    }
}
teleports(vector dest)
{
    if(llGetPos() != stapos)
    {
        llSetPos(stapos);
        teleports(stapos);
    }
}
default
{
    state_entry()
    {
        stapos = <141,19,30>;
    }
    touch_start(integer vez)
    {
        if(llDetectedKey(0) == llGetOwner())
        teleport(<141,19,505>);
    }
}

The above example is a really bad approach to use for many reasons. Not least of which is that lag is precisely what it *will* generate.

An equivalency check that respects SLs somewhat wiggly precision system, and isn't trying to match a movement to EXACTLY 6 decimal places of precision is needed.

if(llGetPos() != dest)
//is bad
if(llVecDist(llGetPos(),dest)<0.001)
//is MUCH better

ie:

teleports(vector dest)
{
//    if(llGetPos() != stapos) 
// This an inherently bad approach; given 6 decimal places on 3 floats in a vector its 
// very UNlikely the equivalency will be precisely equal even if its VERY close, this 
// will become especially evident at high altitude. It'll look  like its stopped, 
// but the llSetPos() will be still thrashing away. Possibly for quite some time/forever.
//
// the below will stop in a timely manner.
    if(llVecDist(llGetPos(),dest) <= 0.001)
    {   llSetPos(dest); //corrected variable
        teleports(dest); //corrected variable
    }
}

And a system that has a user function call itself from within itself is probably not good. This is MUCH Better. [MUST be compiled in MONO]

teleports(vector dest)
{   list l=[PRIM_POSITION,dest];
    l+=l;l+=l;l+=l;l+=l;l+=l;l+=l;l+=l;l+=l;l+=l;
    llSetPrimitiveParams(l);
}