Warp Cross Sim

Written by Kitsune
//Warp Cross-Sim Teleportation
//Warp from warpPos script by Keknehv Psaltery
//Full Script by Khalek Trescothick
//This Script is classified as open-source
//Do not remove this header
vector pos;
vector my_pos;
vector g_target;
vector save;
string sim;
string dest_sim;
integer c = 92805;
integer NeedToCrossSim = FALSE;
integer near_check = FALSE;
integer target = FALSE;
llWarp2Pos( vector d )
{
        if ( d.z > 768 )
        d.z = 768;
        integer s = (integer)(llVecMag(d-llGetPos())/10)+1;
        if ( s > 100 )
        s = 100;
        integer e = (integer)( llLog( s ) / llLog( 2 ) );
        list rules = [ PRIM_POSITION, d ];
        integer i;
        for ( i = 0 ; i < e ; ++i )
        rules += rules;
        integer r = s - (integer)llPow( 2, e );
        if ( r > 0 )
        rules += llList2List( rules, 0, r * 2 + 1 );
        llSetPrimitiveParams( rules );
}
default
{
        on_rez(integer rez)
        {
                llResetScript();
        }
        state_entry()
        {
                llListen(92805, "", "", "");
                llSitTarget(<0,0,0>,ZERO_ROTATION);
        }
        dataserver(key TID, string data)
        {
                g_target += (vector)data;
                vector G2 = g_target;
                G2.z = 200;
                save = llVecNorm(G2 - llGetRegionCorner());
                if(llRound(save.y*2)>0)
                save = <127,255,200>;
                else if(llRound(save.y*2)<0)
                save = <128,0,200>;
                else if(llRound(save.x*2)>0)
                save = <255,128,200>;
                else if(llRound(save.x*2)<0)
                save = <0,128,200>;
                if(llEdgeOfWorld(llGetPos(), llVecNorm(save - llGetPos())))
                {
                        save = llVecNorm(g_target - llGetRegionCorner());
                        if(llRound(save.x*2)>0)
                        save = <255,128,200>;
                        else if(llRound(save.x*2)<0)
                        save = <0,128,200>;
                        else if(llRound(save.y*2)>0)
                        save = <128,255,200>;
                        else if(llRound(save.y*2)<0)
                        save = <128,1,200>;
                        if(llEdgeOfWorld(llGetPos(), llVecNorm(save - llGetPos())))
                        {
                                llWhisper(0,"Pinpoint Error");
                                llUnSit(llAvatarOnSitTarget());
                                llSleep(1.0);
                                llDie();
                        }
                }
                NeedToCrossSim=TRUE;
                llWarp2Pos(save);
                llMessageLinked(-1,0,"done","");
        }
        link_message(integer prim,integer chan,string m, key id)
        {
                if(m == "done")
                {
                        if(NeedToCrossSim)
                        {
                                vector P = llGetPos();
                                if(P.x==0)
                                P.x = -3;
                                else if(P.x==255)
                                P.x = 258;
                                if(P.y==0)
                                P.y = -3;
                                else if(P.y==255)
                                P.y = 258;
                                llSleep(3.5);//Needed delay so you do not crash over sim borders!
                                llSetPos(P);
                                NeedToCrossSim = FALSE;
                                llSleep(4);
                        }
                        sim = llGetRegionName();
                        if(sim != dest_sim)
                        {
                                g_target.z = 200;
                                save = llVecNorm(g_target - llGetRegionCorner());
                                if(llRound(save.y*2)>0)
                                save = <128,255,200>;
                                else if(llRound(save.y*2)<0)
                                save = <128,0,200>;
                                else if(llRound(save.x*2)>0)
                                save = <255,128,200>;
                                else if(llRound(save.x*2)<0)
                                save = <0,128,200>;
                                if(llEdgeOfWorld(llGetPos(), llVecNorm(save - llGetPos())))
                                {
                                        save = llVecNorm(g_target - llGetRegionCorner());
                                        if(llRound(save.x*2)>0)
                                        save = <255,128,200>;
                                        else if(llRound(save.x*2)<0)
                                        save = <0,128,200>;
                                        else if(llRound(save.y*2)>0)
                                        save = <128,255,200>;
                                        else if(llRound(save.y*2)<0)
                                        save = <128,0,200>;
                                }
                                NeedToCrossSim = TRUE;
                                llWarp2Pos(save);
                                llMessageLinked(-1,0,"done","");
                        }
                        else if(sim == dest_sim)
                        {
                                NeedToCrossSim = FALSE;
                                llWarp2Pos(my_pos);
                                llSay(0,"Luccyy im hoomee");
                                llUnSit(llAvatarOnSitTarget());
                                llDie();
                        }
                }
                else
                {
                        pos = g_target - llGetRegionCorner();
                }
        }
        changed(integer change)
        {
                if(change & CHANGED_REGION)
                {
                        llMessageLinked(LINK_SET, 0, "done", "");
                }
        }
        listen(integer channel,string name,key id,string message)
        {
                if(message == message)
                {
                        list d = llParseString2List(message,["*"],[]);
                        list p = llCSV2List(llList2String(d,0));
                        float x = llList2Float(p,0);
                        float y = llList2Float(p,1);
                        float z = llList2Float(p,2);
                        pos = ;
                        my_pos = ;
                        llMessageLinked(LINK_SET, 0, "bu", NULL_KEY);
                        dest_sim = llList2String(d,1);
                        if(llGetSubString(dest_sim,0,0) == " ")
                        {
                                dest_sim = llGetSubString(dest_sim,1,-1);
                        }
                        if(llGetRegionName() == dest_sim)
                        {
                                llWarp2Pos(my_pos);
                        }
                        else
                        {
                                llRequestSimulatorData(dest_sim, DATA_SIM_POS);
                        }
                }
        }
}