No Limit Teleporter
De DigiWiki.
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); }