Talk:WarpPos

From Second Life Wiki
Revision as of 23:26, 14 January 2010 by Ppaatt Lynagh (talk | contribs) (Move the See Also out of the middle (where it landed after chat growth) to near the top)
Jump to navigation Jump to search

Undocumented?

Is this going to be changed in the future? TxMasterG Ping 18:50, 30 March 2007 (PDT)

See Also

People interested in this exploit may also find posJump to be of interest. A much more efficient method of tricking an object into jumping to some arbitrary position.

Untested?

For moving about a sandbox, this works fine, and that's all I wanted from it ... but I see 2006-05 quote suggesting we could learn more with more test ... and I notice that sitting on an object that moves this way into random positions does seem to confuse the client and/or the server. In prticular, moving to off-world positions leaves the client thinking the agent is still on the object, but then errors start cropping up, things like can't save the edited script because the object is somehow lost to the server while yet existing in the client ...

Script run-time error: Stack-Heap Collision

I do now see "Script run-time error": "Stack-Heap Collision" when I try to jump too far, for example:

<lsl> default {

   state_entry()
   {
       llOwnerSay("state_entry");
       vector here = llGetPos();
       warpPos(<here.x, here.y,  200>);
       warpPos(<here.x, here.y, 3000>); // Script run-time error: Stack-Heap Collision
       warpPos(<here.x, here.y,  200>);
   }

} </lsl>

My Server: Second Life Server 1.24.10.106829

My Client: Second Life 1.21.6 (99587) Oct 14 2008 17:42:25 (Second Life Release)

-- Ppaatt Lynagh 05:25, 1 January 2009 (UTC)

Buggy!

Wow, this thing has one huge bug, which will lead to a stack-heap collision even over a small distance. Appending the "rules" list to itself for the number of jumps is wrong. You need a prototype list to append to the actual rules list. -- Deanfred Brandeis

I think you have LSL confused with a real programing language, LSL operations are pass by value, you aren't appending it to itself you are appending a copy of it to itself. The only stack-heap collision issues arise from not having enough memory available to build the list. The method used here is the most efficient. Strife Onizuka 11:19, 9 April 2007 (PDT)
What about calling the warppos function again using (0.5 * (target + llGetPos())) as new target if the number of jumps is too high ? " if (jumps > 100 ) warppos(0.5 * (destpos + llGetPos())); " That would recursively divide the distance in digestible chunks between large list allocations. I'm not able to test it just yet, will keep you informed.--Jesrad Seraph 03:04, 20 April 2007 (PDT)

The code no longer appears to be the most efficient when compiled as Mono. When compiled as Mono, I no longer see any memory advantage at all to using the code: rules = (rules=[]) + rules + rules; in comparison to the code: rules+=rules; However I seem to be able to get += to double lists in under 60% of the time in my tests. I'm not suggesting changing the code in the article at the moment (because the advantage of the current code to people *not* compiling in Mono is pretty critical, and the benefit to people compiling under Mono isn't exactly huge.) --Tatiana Niven 16:00, 29 August 2008 (AEST) :P

Why Not Simplify

Here's a variation that works better at my desk:

<lsl> list lwCopies(list copy, integer count) {

   if(count <= 0)
   {
       return [];
   }
   else
   {
       list copies = copy;
       integer length = 1;
       while(length < count)
       {
           copies = (copies + copies);
           length *= 2; // Overflows when count large
       }
       return llList2List(copies, 0, (llGetListLength(copy) * count) - 1 );
   }

}

lwSetCloserPos(vector there) {

   list command = [PRIM_POSITION, there];
   float distance = llVecDist(llGetPos(), there);
   if(1000.0 < distance) { distance = 1000.0; } // Script run-time error/ Stack-Heap Collision if too far away
   llSetPrimitiveParams(lwCopies(command, 1 + (integer)(distance / 10.0)));

}

lwSetFarPos(vector there) {

   float distance = llVecDist(llGetPos(), there);
   integer tries = (1 + (integer)(distance / 1000.0));
   while(tries--)
   {
       lwSetCloserPos(there);
   }

}

default {

   state_entry()
   {
       llOwnerSay("state_entry");
       vector here = llGetPos();
       lwSetFarPos(<here.x, here.y, 3000>);
       lwSetFarPos(<here.x, here.y,  200>);
   }

} </lsl>

I'd love to hear what kinds of tests run better with the less simple code posted in the page?

-- Ppaatt Lynagh 05:39, 1 January 2009 (UTC)

Wrapping lwSetFarPos around lwSetCloserPos may well be exactly what Jesrad Seraph meant to suggest above ... and Tatiana Niven might have opinions on the best form of { copies = (copies + copies); } ... -- Ppaatt Lynagh 05:58, 1 January 2009 (UTC)

WarpPos, PosJump or FarPos for SL Vehicles

I've been searching a long while for a new and quicker method of getting around in SL. I usually frequent racing SIMs, using Motorcycle or Vehicle Scripts that have limitations in speed or speed being physics or jump limits i hear about, although i'm sure using ---Pos if possible, can it be modified to use as a for example, Drag Racing Vehicle. I usually, top out at a certain speeds, rumor is that only certain speeds such as 500mph or around 600mph can be reached with the other scripts currently found in SL .... ---Pos sounds really exciting...

if not can it be possible to at least mold ----Pos as a kind of auto set home and return... i can't mention the amount of times Racers fall off of sims or go off course or get stuck in a spot, wall, etc and Pos offers a real quick return to a set position while sitting, to return you and vehicle to a desired coordinate either via chat or a gesture on a channel the script will listen to...

1. Pos Vehicle Script
2. Pos Vehicle return to position

Pos... with no limits i'm sure the bar will be raised... ///

...is it out there already?
...are either of these possibilities achievable?
...and how soon can i be breaking speed records... :)
??