AntiDelay Node

From Second Life Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Almost every function in Second Life has a delay associated with it. Ranging from 20 seconds to .2 seconds - delays can get on anyones' nerves. Even the most basic scripters know the easy way to get around this is to have a script and use llMessageLinked to tell it to do something. Below is a more advanced version of that code - that allows for one script to handle almost any type of function with a delay.

How To Use: Use llMessageLinked - the integer is -123, the string is the list of arguments seperated by "~~~", and the key is the name of the function.

default
{
    touch_start(integer num_detected)
    {
        string ownerKeyAsString = (string)llGetOwner();

        llMessageLinked(LINK_SET, -123,
            ownerKeyAsString + "~~~This is a dialog~~~With, Three, Options~~~0", "dialog");
    }
}
default
{
    touch_start(integer num_detected)
    {
        vector currentPosition = llGetPos();
        vector targetPosition =  <128, 128, 300>;

        float vectorDistance = ( llVecDist(currentPosition, targetPosition) / 5) + 1;

        integer index;
        do
        {
            llMessageLinked(LINK_SET, -123, (string)vectorDistance, "setpos");
        }
        while (++index < vectorDistance);
    }
}

And now for the full and complete power of this code *drum roll*. Only 2 scripts are needed for the following code to work.

default
{
    touch_start(integer num_detected)
    {
        string ownerKeyAsString = (string)llGetOwner();
        float sleepPeriodInSeconds = 1.0;

        llMessageLinked(LINK_SET, -123, ownerKeyAsString + "~~~This is a dialog~~~With, Three, Options~~~0", "dialog");
        llMessageLinked(LINK_SET, -123, "youemail@theaddress.com~~~Subj~~~Body", "email");

        llSleep(sleepPeriodInSeconds);

        llMessageLinked(LINK_SET, -123, ownerKeyAsString + "~~~This is a dialog~~~With, Three, Options~~~0", "dialog");

        llSleep(sleepPeriodInSeconds);

        llMessageLinked(LINK_SET, -123, "youemail@theaddress.com~~~Subj~~~Body", "email");
        
    }
}

The code to make it all work:


AntiDelay Node Manager:

list l;

list functions = ["email", "loadurl", "teleportagenthome", "remoteloadscriptpin",
                    "remotedatareply", "giveinventorylist", "setparcelmusicurl", "instantmessage",
                    "preloadsound", "mapdestination", "dialog", "createlink",
                    "setpos", "setrot", "settexture", "rezobject"];

list delays = [20000, 10000, 5000, 3000,
                3000, 2000, 2000, 1000,
                1000, 1000, 1000, 1000,
                200, 200, 200, 100];

integer count = 1;

integer time()
{
    string stamp = llGetTimestamp();

    return (integer) llGetSubString(stamp, 11, 12) * 3600000 +
           (integer) llGetSubString(stamp, 14, 15) * 60000 +
           llRound((float)llGetSubString(stamp, 17, -2) * 1000000.0)/1000;
}

integer nextFreeScript()
{
    integer curTime = llList2Integer(l, i) - time();

    integer index;
    do
    {
        if (timeLeft <= 0)
//      {
            return index;
//      }
    }
    while (++index < llGetListLength(l));

    return -1;
}

default
{
    state_entry()
    {
        llMessageLinked(LINK_SET, -112, "", "");

        llSleep(1.0);

        llMessageLinked(LINK_SET, -111, "", "");
    }

    link_message(integer sender_num, integer num, string str, key id)
    {
        if (num == -2)
        {
            llMessageLinked(LINK_SET, (integer)str, (string)count, "");

            ++count;

            l += [time()];

            llSetTimerEvent(6.0);
        }
    }

    timer()
    {
        state run;
    }
}

state run
{
//  state_entry()
//  {
//      ;
//  }

    link_message(integer sender_num, integer num, string str, key id)
    {
        if (num == -123)
        {
            llOwnerSay("A");

            integer d = llList2Integer(delays, llListFindList(functions, [(string)id]));
            integer ii = nextFreeScript();

            l = llListReplaceList(l, [time() + d], ii, ii);

            llMessageLinked(LINK_SET, ii + 1, str, id);
        }
    }
}


AntiDelay Node:

integer myId;

default
{
    link_message(integer sender_num, integer num, string str, key id)
    {
        if (num == -111)
        {
            myId = (integer)llFrand(0x7FFFFFFF);

            llSleep(llFrand(5.0));

            llMessageLinked(LINK_SET, -2, (string)myId, "");
        }
        else if (num == myId && myId)
        {
            myId = (integer)str;
            state run;
        }
    }
}

state run
{
    link_message(integer sender_num, integer num, string str, key id)
    {
        list params = llParseString2List(str, ["~~~"], []);

        if (num == -112)
        {
            llResetScript();
            return;
        }

        if (num != myId || !myId)
            return;

        string lowerId = llToLower( (string)id );
        string firstParam = llList2String(params, 0);
        string secondParam = llList2String(params, 1);
        string thirdParam = llList2String(params, 2);
        string fourthParam = llList2String(params, 3);
        string fifthParam = llList2String(params, 4);

        if (lowerId == "email")
        {
            llEmail(firstParam, secondParam, thirdParam);
        }
        else if (lowerId == "loadurl")
        {
            llLoadURL((key)firstParam, secondParam, thirdParam);
        }
        else if (lowerId == "teleportagenthome")
        {
            llTeleportAgentHome((key)firstParam);
        }
        else if (lowerId == "remoteloadscriptpin")
        {
            llRemoteLoadScriptPin((key)firstParam, secondParam,
                (integer)thirdParam,
                (integer)fourthParam,
                (integer)fifthParam);
        }
        else if (lowerId == "remotedatareply")
        {
            llRemoteDataReply((key)firstParam, (key)secondParam,
                thirdParam, (integer)fourthParam);
        }
        else if (lowerId == "giveinventorylist")
        {
            llGiveInventoryList((key)firstParam,
                secondParam, llCSV2List(thirdParam));
        }
        else if (lowerId == "setparcelmusicurl")
        {
            llSetParcelMusicURL(firstParam);
        }
        else if (lowerId == "instantmessage")
        {
            llInstantMessage((key)firstParam, secondParam);
        }
        else if (lowerId == "preloadsound")
        {
            llPreloadSound(firstParam);
        }
        else if (lowerId == "mapdestination")
        {
            llMapDestination(firstParam,
                (vector)secondParam,
                (vector)thirdParam);
        }
        else if (lowerId == "dialog")
        {
            llDialog((key)firstParam, secondParam,
                llCSV2List(thirdParam), (integer)fourthParam);
        }
        else if (lowerId == "createlink")
        {
            llCreateLink((key)firstParam, (integer)secondParam);
        }
        else if (lowerId == "setpos")
        {
            llSetPos((vector)firstParam);
        }
        else if (lowerId == "setrot")
        {
            llSetRot((rotation)firstParam);
        }
        else if (lowerId == "settexture")
        {
            llSetTexture(firstParam, (integer)secondParam);
        }
        else if (lowerId == "rezobject")
        {
            llRezObject(firstParam, (vector)secondParam, (vector)thirdParam,
                (rotation)fourthParam, (integer)fifthParam);
        }
    }
}