Reply
Honored Resident
sunandfun
Posts: 3
0 Kudos

sexgen Ultra 600 - re-open dialog box after a pose choice

Hi all,

i own a mythical sex gen 600.  Currently the dialog menu closes after the pose is selected and then one has to re open the dialog menu each time and navigate back through the options back to where you were.  I would like to modify the scripts so that the dialog box auto re-open after the selection of a pose in the same position where it was.

I've tryied to modify BedMaster v5.0 and ~MenuMaster v5.01 scripts withouth success :smileysad:

Is there any lsl expert out there who ever tryied or knows whether is definitively not possible (too complicate)

Thank you

PS - i'll post the scripts in separate message

Honored Resident
sunandfun
Posts: 3
0 Kudos

Re: sexgen Ultra 600 - re-open dialog box after a pose choice

Reply to sunandfun - view message

~TouchMaster v5.0

integer gnTouchState;
key gkToucher;

default
{
    state_entry()
    {
        gnTouchState = 0;
    }

    touch_start(integer num_detected)
    {
        if (gnTouchState == 1)
        {
            gnTouchState = 2;
            llSetTimerEvent(0.0);
            llMessageLinked(LINK_THIS, 1402, "", llDetectedKey(0));
        }
    }

    touch_end(integer num_detected)
    {
        if (gnTouchState == 0)
        {
            gnTouchState = 1;
            gkToucher = llDetectedKey(0);
            llSetTimerEvent(0.6);
        }
        else
            gnTouchState = 0;
    }

    timer()
    {
        if (gnTouchState == 1)
        {
            gnTouchState = 0;
            llSetTimerEvent(0);
            llMessageLinked(LINK_THIS, 1401, "", gkToucher);
        }
    }

    on_rez(integer start_param)
    {
        llResetScript();
    }
}

 BedMaster v5.0

//------------------------------------------------------------------------
//
//  Link Msgs
//  =========
//     1 + nBall    Start Anim
//    11 + nBall    Stop Anim
//    21 + nBall    Sitter
//    31 + nBall    Face anim
//   201            Faster
//   202            Slower
//   301            Anim data req
//   302            Anim list req
//   303 -  349     Anim list
//   400 -  407     Anim Data response
//   411 -  412     BallPos Override
//   418            Anim Data End Override
//   419            Anim Data End
//   503            SavePos cmd
//   504            Send cmd
//   510 + nBall    BallPos Scanned
//   701            Texture cmd
//   801            Channel used
//   802            Base Pos/Rot
//   810            Dataslave Number
//   811            Menu Plugin
//   812            Other Plugin
//   901            Anims read
//  1101            (touched)
//  1102            *Move* cmd
//  1103            *Swap* cmd
//  1104            -None- cmd
//  1105            *EndMove* cmd
//  1201            !Cyber
//  1202            Block Facials
//  1203            Allow Facials
//  1204            Taken over
//  1205            Balls in use
//  1401            Touched
//  1402            Double click
//  1420            Menu cat/grp
//  1421            Menu anim
//  1422            No Menu
//  1423            Menu ready
//  1601            ?
//  1700 - 1739     DataStore Start
//  9002            Email address
//
//  Channels:
//  989             Sitter/Anim info
//  10*key + 1000   Maintenance dialog
//  10*key + 1001   Menu dialog
//  10*key + 1002   Cyber dialog
//  10*key + 1003   ToBall
//  10*key + 1004   FromBall
//  10*key + 1005   HUD/Attachment talk
//  10*key + 1006   Rezzed Toys talk
//
//------------------------------------------------------------------------

integer gnChnDialog;
integer gnChnToBall;
integer gnChnFromBall;

integer gnCmdDiaOffset;

integer gnListen1;
integer gnListen2;

integer gnMaxBalls = 4;
list glsBallNames = [ "~~Pink Ball", "~~Blue Ball", "~~Green Ball", "~~Yellow Ball" ];
integer gabOccupied;
integer gnOccupied;
integer gnMaxDataStore;

integer gnCountBall;
integer gnSpeeds;
integer gnMenuSpace;

integer gnBallOffset;
integer gnCurrSpeed;
integer gnCurrCountBall;

vector gvOffset;
vector gvBasePos;
rotation gvBaseRot;
vector gvLocBasePos;
rotation gvLocBaseRot;
list glvCurrPos;
list glrCurrRot;

integer gbIsDemo;
integer gbMoving;
integer gnMoveBall;
integer gbHasCyber;
integer gbHasMemory;
integer gbFacialBlocked;
integer gbPosOverridden;
integer gbRotOverridden;
integer gbOvertaken;

key gkToucher;
integer gnTouchState;
integer gnDiaMode;
integer DIA_MODE_SYS = 1;
integer DIA_MODE_MOVEBALL = 2;

// Anim Data

integer gnCmdCnt;
list glvCmd_Ball_Pos;
list glrCmd_Ball_Rot;
list glsCmd_Ball_Pose;
list glsCmd_Ball_Anim;
list glnCmd_Ball_NFace;
list glnCmd_Ball_ixFace;
list glsCmd_Ball_Face;
list glnCmd_Ball_FacePct;

integer KeyToNum(string sKey)
{
    // i.e. f80d8877-8b9e-d96c-0ec1-7fe7640f4f36
    return (integer)("0x" + llGetSubString(sKey, -4, -1));
}

ActivateNew()
{
    vector vBase;
    rotation rBase;
    vector vCurrPos;
    vector vNewPos;
    rotation rNewRot;
    string sNewAnim;

    gnCurrSpeed = 0;
    llSetTimerEvent(0.0);

//llOwnerSay("New anim balls " + (string)gnCurrCountBall + "=>" + (string)gnCountBall + ", overtaken=" + (string)gbOvertaken);
    llMessageLinked(LINK_ALL_OTHERS, 1204, (string)gnCountBall, NULL_KEY);
    vBase = gvBasePos;
    rBase = gvBaseRot;
    if (vBase == ZERO_VECTOR)
    {
        vBase = llGetRootPosition();
        rBase = llGetRootRotation();
    }
    integer nBall;
    for (nBall = gnCountBall; nBall < gnCurrCountBall; ++nBall)
    {
        llMessageLinked(LINK_THIS, 11 + nBall, "", NULL_KEY);        // stop anim
        llMessageLinked(LINK_THIS, 21 + nBall, "", NULL_KEY);        // no sitter
        llSay(gnChnToBall, "Ball" + (string)(nBall + 1) + "|Derez");
        SetOccupied(nBall + 1, 0);
    }
    for (nBall = 0; nBall < gnCountBall; ++nBall)
    {
        integer nBallIndex = (nBall + gnBallOffset) % gnCountBall;
        vCurrPos = llList2Vector(glvCurrPos, nBall);
        vNewPos = llList2Vector(glvCmd_Ball_Pos, nBallIndex) + gvOffset;
        if (vNewPos == gvOffset) vNewPos = <0.0, 0.0, 1.5>;      // should not happen
        rNewRot = llList2Rot(glrCmd_Ball_Rot, nBallIndex);
        if (nBall >= gnCurrCountBall)      // not rezzed
        {
            llRezObject(llList2String(glsBallNames, nBall), llGetPos() + <0.0, 0.0, 1.0>, ZERO_VECTOR,
                ZERO_ROTATION, gnChnToBall);
            llSleep(0.5);
        }
        rotation rCurrRot = llList2Rot(glrCurrRot, nBall);
//llOwnerSay("channel" + (string)gnChnToBall + ": Ball" + (String)(nBall + 1) + "|Pos|" + (string)(vBase + vNewPos * rBase) + "|" + (string)(rNewRot * rBase));
        llWhisper(gnChnToBall, "Ball" + (string)(nBall + 1) + "|Pos|" + (string)(vBase + vNewPos * rBase) +
            "|" + (string)(rNewRot * rBase));
        glvCurrPos = llListReplaceList(glvCurrPos, [ vNewPos ], nBall, nBall);
        glrCurrRot = llListReplaceList(glrCurrRot, [ rNewRot ], nBall, nBall);
        string sPose = llList2String(glsCmd_Ball_Pose, nBallIndex);
        if ((gnOccupied < 2) && (sPose != ""))
        {
            sNewAnim = sPose;
        }
        else
        {
            sNewAnim = llList2String(glsCmd_Ball_Anim, nBallIndex * gnSpeeds);
            if (llList2Integer(glnCmd_Ball_NFace, nBallIndex) > 0)
                llSetTimerEvent(2.0);
        }
        llMessageLinked(LINK_THIS, nBall+1, sNewAnim, NULL_KEY);
//llWhisper(0, "Ball " + (string)(nBall + 1) + ": anim " + sNewAnim);
    }
    llMessageLinked(LINK_SET, 1205, (string)gnOccupied, NULL_KEY);
    gbOvertaken = FALSE;
    gnCurrCountBall = gnCountBall;
}

integer HasInv(integer nType, string sName)
{
    integer L = llStringLength(sName) - 1;
    integer N = llGetInventoryNumber(nType);
    integer i;
    for (i=0; i<N; ++i)
        if (llGetSubString(llGetInventoryName(nType, i), 0, L) == sName)
            return TRUE;
    return FALSE;
}

SetOccupied(integer nIndex, integer nValue)
{
    if (nValue > 0)
        gabOccupied = gabOccupied | (1 << nIndex);
    else
        gabOccupied = gabOccupied & ~(1 << nIndex);
    gnOccupied = 0;
    integer i;
    for (i=0; i<8; ++i)
    {
        if (gabOccupied & (1 << i))
            ++gnOccupied;
    }
    llMessageLinked(LINK_SET, 1205, (string)gnOccupied, NULL_KEY);
//llWhisper(0, "Occupied map=" + (string)gabOccupied + ", count=" + (string)gnOccupied);
}

ShowMaintainDlg()
{
    gnListen2 = llListen(gnChnDialog, "", gkToucher, "");
    gnDiaMode = DIA_MODE_SYS;
    list lsOptions = [ "Save", "AutoOn", "AutoOff", "Send" ];
    string sText = "Maintenance Menu\n\nSave=Save Ballpositions\nAutoOn=Set autohide on\nAutoOff=Set autohide off\nSend=Send Positions";
    if (HasInv(INVENTORY_SCRIPT, "~TexMaster"))
    {
        sText += "\nTexture = Select cover texture";
        lsOptions += [ "Texture" ];
    }
    llDialog(gkToucher, sText, lsOptions, gnChnDialog);
}

ShowCmdDlg()
{
    gbPosOverridden = FALSE;
    gbRotOverridden = FALSE;
    llMessageLinked(LINK_THIS, 1101, (string)gnCurrCountBall + " " + (string)gbMoving, gkToucher);        // show menu
    // return; qui non va Nik 
}

StartBallMove()
{
    list lsOptions = [];
    integer i;
    gkToucher = llGetOwner();
    for (i=0; i<gnCurrCountBall; ++i)
        lsOptions += [ llGetSubString(llList2String(glsBallNames, i), 2, -1) ];
    if (gnListen2 == 0) gnListen2 = llListen(gnChnDialog, "", gkToucher, "");
    gnDiaMode = DIA_MODE_MOVEBALL;
    llDialog(gkToucher, "Select a ball", lsOptions, gnChnDialog);
}

default
{
    state_entry()
    {
        llSay(0, "Reading configuration, please wait for the ready message");
        gbIsDemo = (llGetSubString(llGetScriptName(), -5, -1) == " Demo");
        gbMoving = FALSE;
        gbFacialBlocked = FALSE;
        gbOvertaken = FALSE;
        gnCurrSpeed = 0;
        gnCurrCountBall = 0;
        gnCmdDiaOffset = 0;
        gvBasePos = ZERO_VECTOR;
        gvBaseRot = ZERO_ROTATION;
        gvLocBasePos = ZERO_VECTOR;
        gvLocBaseRot = ZERO_ROTATION;
        gvOffset = (vector)llGetObjectDesc();
        glvCurrPos = [];
        glrCurrRot = [];
        gnTouchState = 0;
        gabOccupied = 0;
        gnCmdCnt = 0;
        llSetRemoteScriptAccessPin(5783201);
        key kRoot = llGetLinkKey(LINK_ROOT);
        if (llGetNumberOfPrims() == 1) kRoot = llGetKey();
        gnChnDialog = 10 * KeyToNum(kRoot) + 1000;
        gnChnToBall = gnChnDialog + 3;
//llOwnerSay("listening on channel " + (string)gnChnToBall);
//        gnChnToBall = 30000 + llFloor(llFrand(10000));
        gnChnFromBall = gnChnDialog + 4;
        gnListen1 = llListen(gnChnFromBall, "", NULL_KEY, "");
        gbHasCyber = HasInv(INVENTORY_SCRIPT, "~CyberMaster");
        gbHasMemory = HasInv(INVENTORY_SCRIPT, "~MemoryMaster");
        llMessageLinked(LINK_SET, 801, (string)gnChnDialog, NULL_KEY);
        llSay(gnChnToBall, "Ball1|Derez");
        llSay(gnChnToBall, "Ball2|Derez");
        llSay(gnChnToBall, "Ball3|Derez");
        llSay(gnChnToBall, "Ball4|Derez");
        gnMaxDataStore = -1;
        integer nNoteCount = llGetInventoryNumber(INVENTORY_NOTECARD);
        integer i;
        for (i=0; i<nNoteCount; ++i)
        {
            string sName = llGetInventoryName(INVENTORY_NOTECARD, i);
            if (llGetSubString(sName, 0, 6) == "!Config")
            {
                ++gnMaxDataStore;
                string sScript = "~DataStore v5.0";
                if (gnMaxDataStore > 0) sScript += " " + (string)gnMaxDataStore;
                llSetScriptState(sScript, TRUE);
                llMessageLinked(LINK_THIS, 1700 + gnMaxDataStore, sName, NULL_KEY);
            }
        }
        for (i=gnMaxDataStore+1; i<40; ++i)
        {
            llSetScriptState("~DataStore v5.0 " + (string)i, FALSE);
        }
        llMessageLinked(LINK_SET, 302, "0", (key)"0");
    }

    timer()
    {
        if (gbFacialBlocked) return;
        integer nBall;
        for (nBall = 0; nBall < gnCountBall; ++nBall)
        {
            integer nBallIndex = (nBall + gnBallOffset) % gnCountBall;
            integer nF = llList2Integer(glnCmd_Ball_NFace, nBallIndex);
            integer ixF = llList2Integer(glnCmd_Ball_ixFace, nBallIndex);
            integer nPct = (integer) llFrand(100.0);
            integer iF;
            for (iF=0; iF<nF; ++iF)
            {
                nPct -= llList2Integer(glnCmd_Ball_FacePct, ixF + iF);
                if (nPct <= 0)
                {
                    string sFace = llList2String(glsCmd_Ball_Face, ixF + iF);
                    llMessageLinked(LINK_THIS, 31 + nBall, sFace, NULL_KEY);
                    iF = 999;
                }
            }
        }
    }

    listen (integer channel, string name, key id, string message)
    {
//llOwnerSay("Heard " + message);
        if ((channel == gnChnDialog) && (id == gkToucher))
        {
            if (gnDiaMode == DIA_MODE_SYS)
            {
                llListenRemove(gnListen2);
                gnListen2 = 0;
                if (message == "Send")
                {
                    llMessageLinked(LINK_THIS, 504, "", NULL_KEY);
                }
                else if (message == "Save")
                {
                    llSensor("", NULL_KEY, SCRIPTED, 8.0, 2 * PI);
                }
                else if (message == "AutoOn")
                {
                    integer i;
                    for (i=0; i<gnCurrCountBall; ++i)
                    {
                        llWhisper(gnChnToBall, "Ball" + (string)(i + 1) + "|Auto|On");
                    }
                }
                else if (message == "AutoOff")
                {
                    integer i;
                    for (i=0; i<gnCurrCountBall; ++i)
                    {
                        llWhisper(gnChnToBall, "Ball" + (string)(i + 1) + "|Auto|Off");
                    }
                }
                else if (message == "Texture")
                {
                    llMessageLinked(LINK_THIS, 701, "", NULL_KEY);
                }
            }
            else if (gnDiaMode == DIA_MODE_MOVEBALL)
            {
                llListenRemove(gnListen2);
                gnListen2 = 0;
                integer i;
                for (i=0; i<gnCurrCountBall; ++i)
                {
                    if (message == llGetSubString(llList2String(glsBallNames, i), 2, -1))
                    {
                        gbMoving = TRUE;
                        gnMoveBall = i;
                        llWhisper(gnChnToBall, "Ball" + (string)(gnMoveBall + 1) + "|Move");
                    }
                }
            }
        }
        else    // message from ball or rug
        {
            //Ball1|Sit|b85e0cdf-4fb2-4383-8b0f-7ff15d01c427
            if (llGetSubString(message, 0, 3) == "Ball")
            {
                integer n = (integer)llGetSubString(message, 4, 4);
                if (n > gnCurrCountBall) return;
                if (llGetSubString(message, 5, 9) == "|Sit|")
                {
                    key kNew = (key)llGetSubString(message, 10, -1);
                    if (kNew != NULL_KEY)
                    {
//llSay(0, "glnCmd_Ball_ixAnim=" + llList2CSV(glnCmd_Ball_ixAnim));
//llSay(0, "glnCmd_Ball_NPose=" + llList2CSV(glnCmd_Ball_NPose));
//llSay(0, "glnCmd_Ball_ixPose=" + llList2CSV(glnCmd_Ball_ixPose));
//llSay(0, "glsCmd_Ball_Pose=" + llList2CSV(glsCmd_Ball_Pose));
//llSay(0, "glsCmd_Ball_Anim=" + llList2CSV(glsCmd_Ball_Anim));
                        SetOccupied(n, 1);
                        llMessageLinked(LINK_THIS, 20 + n, "", kNew);
                        if (gbOvertaken) return;
                        string sNewAnim;
                        string sPose = llList2String(glsCmd_Ball_Pose, n - 1);
                        if ((gnOccupied < 2) && (sPose != ""))
                        {
                            sNewAnim = sPose;
                            llSetTimerEvent(0.0);
                        }
                        else
                        {
                            integer nBallIndex = (n - 1 + gnBallOffset) % gnCurrCountBall;
                            sNewAnim = llList2String(glsCmd_Ball_Anim, nBallIndex * gnSpeeds + gnCurrSpeed);
                            if (llList2Integer(glnCmd_Ball_NFace, n - 1) > 0)
                                llSetTimerEvent(2.0);
                        }
//llWhisper(0, "Sit ball " + (string)n + ": anim " + sNewAnim);
                        llMessageLinked(LINK_THIS, n, sNewAnim, NULL_KEY);
                        if (gnOccupied == 2)
                        {
                            integer i;
                            for (i=1; i<=gnCurrCountBall; ++i)
                            {
                                if ((i != n) && ((gabOccupied & (1 << i)) != 0))
                                {
                                    if (llList2String(glsCmd_Ball_Pose, i - 1) != "")
                                    {
                                        integer nBallIndex = (i - 1 + gnBallOffset) % gnCurrCountBall;
                                        sNewAnim = llList2String(glsCmd_Ball_Anim, nBallIndex * gnSpeeds + gnCurrSpeed);
                                        llMessageLinked(LINK_THIS, i, sNewAnim, NULL_KEY);
//llWhisper(0, "Sit other ball " + (string)i + ": anim " + sNewAnim);
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        SetOccupied(n, 0);
                        llMessageLinked(LINK_THIS, 10 + n, "", NULL_KEY);
                        llMessageLinked(LINK_THIS, 20 + n, "", NULL_KEY);
                        if ((gnOccupied == 1) && (!gbOvertaken))
                        {
                            integer i;
                            for (i=1; i<=gnCurrCountBall; ++i)
                            {
                                if ((gabOccupied & (1 << i)) != 0)
                                {
                                    string sNewAnim = llList2String(glsCmd_Ball_Pose, i - 1);
                                    if (sNewAnim != "")
                                        llMessageLinked(LINK_THIS, i, sNewAnim, NULL_KEY);
                                }
                            }
                        }
                    }
                }
            }
            else if (llGetSubString(message, 0, 5) == "Remote")
            {
                list lsMsg = llParseStringKeepNulls(message, [ "|" ], []);
                if (llList2String(lsMsg, 1) == "Click")
                {
                    gvBasePos = (vector)llList2String(lsMsg, 3);
                    gvBaseRot = (rotation)llList2String(lsMsg, 4);
//llOwnerSay("gvBasePos=" + (string)gvBasePos);
//                    if (gnCurrCountBall > 0) ActivateNew();
                    llMessageLinked(LINK_SET, 1401, "", (key)llList2String(lsMsg, 2));
                }
                else if (llList2String(lsMsg, 1) == "Dclick")
                {
                    llMessageLinked(LINK_SET, 1402, "", (key)llList2String(lsMsg, 2));
                }
                else if (llList2String(lsMsg, 1) == "Pos")
                {
                    gvLocBasePos = (vector)llList2String(lsMsg, 2);
                    gvBasePos = gvLocBasePos;
                    gvLocBaseRot = (rotation)llList2String(lsMsg, 3);
                    gvBaseRot = gvLocBaseRot;
                    llMessageLinked(LINK_SET, 802, llList2String(lsMsg, 2), (key)llList2String(lsMsg, 3));
                    if (gnCurrCountBall > 0) ActivateNew();
                }
            }
        }
    }

    touch_start(integer num_detected)
    {
        gvBasePos = gvLocBasePos;
        gvBaseRot = gvLocBaseRot;
    }

    link_message(integer sender_num, integer num, string str, key id)
    {
//llWhisper(0, "Master got LinkMsg " + (string)num + ": " + str);
//        llSleep(0.1);
        if (num < 400)
        {
            if ((num == 201) || (num == 202))
            {
                if (num == 201)
                {
                    if (gnCurrSpeed < gnSpeeds - 1) ++gnCurrSpeed;
                }
                else
                {
                    if (gnCurrSpeed > 0) --gnCurrSpeed;
                }
                integer i;
                for (i=0; i<gnCurrCountBall; ++i)
                {
                    integer nBallIndex = (i + gnBallOffset) % gnCurrCountBall;
                    string sNewAnim = llList2String(glsCmd_Ball_Anim, nBallIndex * gnSpeeds + gnCurrSpeed);
                    llMessageLinked(LINK_THIS, i + 1, sNewAnim, NULL_KEY);
//llWhisper(0, "Speed change (" + (string)gnCurrSpeed + ") ball " + (string)i + ": ixball=" + (string)gnIndexBall + ",anim " + sNewAnim);
                }
            }
            else if ((num >= 303) && (num <= 349))
            {
                list lsCmd = llParseString2List(str, [ "~" ], []);
                gnCmdCnt += llGetListLength(lsCmd);
                integer nNext = num - 302;
//            llSay(0, "Updatepack animations loaded");
                if (nNext <= gnMaxDataStore)
                    llMessageLinked(LINK_SET, 302, (string)nNext, (key)((string)gnCmdCnt));
                else
                    llMessageLinked(LINK_THIS, 901, (string)gnCmdCnt, NULL_KEY);
            }
        }
        else if (num < 1000)
        {
            if (num == 400)
            {
                list lData = llParseString2List(str, [ "," ], []);
                gnCountBall = llList2Integer(lData, 0);
                gnSpeeds = llList2Integer(lData, 1);
            }
            else if ((num == 401) || (num == 411))
            {
                if ((num == 401) && (gbPosOverridden)) return;
                if (num == 411) gbPosOverridden = TRUE;
                glvCmd_Ball_Pos = [];
                list lsNew = llParseString2List(str, [ "~" ], []);
                integer i;
                for (i=0; i<llGetListLength(lsNew); ++i)
                    glvCmd_Ball_Pos += [ (vector)llList2String(lsNew, i) ];
            }
            else if ((num == 402) || (num == 412))
            {
                if ((num == 402) && (gbRotOverridden)) return;
                if (num == 412) gbRotOverridden = TRUE;
                glrCmd_Ball_Rot = [];
                list lsNew = llParseString2List(str, [ "~" ], []);
                integer i;
                for (i=0; i<llGetListLength(lsNew); ++i)
                    glrCmd_Ball_Rot += [ (rotation)llList2String(lsNew, i) ];
            }
            else if (num == 403)
            {
                glsCmd_Ball_Pose = llParseString2List(str, [ "~" ], []);
            }
            else if (num == 404)
            {
                glsCmd_Ball_Anim = llParseString2List(str, [ "~" ], []);
            }
            else if (num == 405)
            {
                glnCmd_Ball_NFace = llParseString2List(str, [ "~" ], []);
                glnCmd_Ball_ixFace = [ ];
                integer nCnt = 0;
                integer nMax = llGetListLength(glnCmd_Ball_NFace);
                integer i;
                for (i=0; i<nMax; ++i)
                {
                    glnCmd_Ball_ixFace += [ nCnt ];
                    nCnt += llList2Integer(glnCmd_Ball_NFace, i);
                }
            }
            else if (num == 406)
            {
                glsCmd_Ball_Face = llParseString2List(str, [ "~" ], []);
            }
            else if (num == 407)
            {
                glnCmd_Ball_FacePct = llParseString2List(str, [ "~" ], []);
            }
            else if ((num == 418) || ((num == 419) && (!gbHasMemory)))
            {
                gnBallOffset = 0;
                ActivateNew();
            }
//            else if (num == 810)
//            {
//                integer n = (integer)str;
//                if (n > gnMaxDataStore) gnMaxDataStore = n;
//            }
        }
        else
        {
            if (num == 1102)   // *Move*
            {
                StartBallMove();
            }
            else if (num == 1103)   // *Swap*
            {
                ++gnBallOffset;
                ActivateNew();
            }
            else if (num == 1104)   // -None-
            {
                llMessageLinked(LINK_THIS, 301, "9999", NULL_KEY);
                gnCountBall = 0;
                ActivateNew();
            }
            else if (num == 1105)   // *EndMove*
            {
                gbMoving = FALSE;
                llWhisper(gnChnToBall, "Ball" + (string)(gnMoveBall + 1) + "|EndMove");
                llSensor("", NULL_KEY, SCRIPTED, 8.0, 2 * PI);
            }
            else if (num == 1202)   // No Facials
            {
                gbFacialBlocked = TRUE;
            }
            else if (num == 1203)   // Allow Facials
            {
                gbFacialBlocked = FALSE;
            }
            else if (num == 1204)   // Taken over
            {
                if (!gbOvertaken)
                {
                    integer nBall;
                    for (nBall = 0; nBall < gnCurrCountBall; ++nBall)
                    {
                        llMessageLinked(LINK_THIS, 11 + nBall, "", NULL_KEY);        // stop anim
                    }
                    gbOvertaken = TRUE;
                }
                gnCurrCountBall = (integer)str;
            }
            else if (num == 1402)   // maintenance menu
            {
                if ((gbIsDemo) || (id == llGetOwner()))
                {
                    gkToucher = id;
                    ShowMaintainDlg();
                }
            }
        }
    }

    sensor(integer total_number)
    {
//        integer nIndexBall = llList2Integer(glnCmd_Ball_ixBall, gnCmd);
        integer i;
        list lfDist = [];
        list lvPos = [];
        list lrRot = [];
        for (i=0; i<gnMaxBalls; ++i)
        {
            lfDist += [ 9.9 ];
            lvPos += [ ZERO_VECTOR ];
            lrRot += [ ZERO_ROTATION ];
        }
        for (i=0; i<total_number; ++i)
        {
            string sName = llDetectedName(i);
            integer n = llListFindList(glsBallNames, [ sName ]);
            if (n >= 0)
            {
                vector vTgt = (llDetectedPos(i) - llGetPos() - gvOffset)  / llGetRot();
                rotation rTgt = llDetectedRot(i) / llGetRot();
                float fDist = llVecMag(vTgt);
                if (fDist < llList2Float(lfDist, n))
                {
                    lfDist = llListReplaceList(lfDist, [ fDist ], n, n);
                    lvPos = llListReplaceList(lvPos, [ vTgt ], n, n);
                    lrRot = llListReplaceList(lrRot, [ rTgt ], n, n);
                }
            }
        }
        for (i=0; i<gnCurrCountBall; ++i)
        {
            if (llList2Float(lfDist, i) < 9.0)
            {
                llMessageLinked(LINK_THIS, 510+i, (string)llList2Vector(lvPos, i), (key)((string)llList2Rot(lrRot, i)));
            }
        }
//        llMessageLinked(LINK_THIS, 503, "", NULL_KEY);
    }

    on_rez(integer start_param)
    {
        llResetScript();
    }
}

 ~MenuMaster v5.01

integer gnChnDialog;
integer gnHUDChannel;
integer gnTouchNum;

integer gnState;
integer STATE_INIT = 0;
integer STATE_RUN = 1;
integer gbIs2Go;

key gkToucher;
list glCatGrpAnim;
string gsCurrCat;
integer gnCatIndex;
integer gnGrpIndex;
integer gnAnimIndex;
integer gbErrorReported;
integer gnCurrAnim;
string gsCurrAnim;

integer gnCurrLvl;
integer gnTopLvl;
integer gbHasLvl1;
integer gnCmdDiaOffset;

integer gnCurrCountBall;
integer gbMoving;
integer gnListen2;

integer gnMenuSpace;
list glsPlugins;
list glnPluginLink;
list glsOptions;

integer HasInv(integer nType, string sName)
{
    integer L = llStringLength(sName) - 1;
    integer N = llGetInventoryNumber(nType);
    integer i;
    for (i=0; i<N; ++i)
        if (llGetSubString(llGetInventoryName(nType, i), 0, L) == sName)
            return TRUE;
    return FALSE;
}

Increment(integer n)
{
    glCatGrpAnim = llListReplaceList(glCatGrpAnim, [ llList2Integer(glCatGrpAnim, n) + 1 ], n, n);
}

integer GetCatSize(integer nCatIndex)
{
    return (2 * llList2Integer(glCatGrpAnim, nCatIndex + 1) + llList2Integer(glCatGrpAnim, nCatIndex + 2) + 3);
//    integer n = nCatIndex + 3;
//    integer nGrp = llList2Integer(glCatGrpAnim, nCatIndex + 1);
//    integer i;
//    for (i=0; i<nGrp; ++i)
//        n += (llList2Integer(glCatGrpAnim, n+1) + 2);
//    return n + nCatIndex;
}

SayReady()
{
    if (gbIs2Go)
        llOwnerSay("/me is ready to be used (" + (string)llGetFreeMemory() + " bytes free)");
    else
        llSay(0, "/me is ready to be used (" + (string)llGetFreeMemory() + " bytes free)");
}

ShowCmdDlg()
{
    if (gnListen2 != 0) llListenRemove(gnListen2);
    gnListen2 = llListen(gnChnDialog, "", gkToucher, "");
    glsOptions = [];
    if (gnCurrCountBall != 0)
    {
        if (gkToucher == llGetOwner())
        {
            if (gbMoving)
                glsOptions += [ "*EndMove*" ];
            else
                glsOptions += [ "*Move*" ];
        }
        glsOptions += [ "*Swap*", "-None-" ];
    }
    glsOptions += glsPlugins;
    if (gnCurrLvl > gnTopLvl)
        glsOptions += [ "-Level Up-" ];
    gnMenuSpace = 12 - llGetListLength(glsOptions);
//llOwnerSay("Menu lvl " + (string)gnCurrLvl);
    if (gnCurrLvl == 0)
    {
        integer i = 0;
        integer nSkip = gnCmdDiaOffset;
        while (i < llGetListLength(glCatGrpAnim))
        {
            if (nSkip > 0)
                --nSkip;
            else
                glsOptions += llList2List(glCatGrpAnim, i, i);
            i += (2 * llList2Integer(glCatGrpAnim, i+1) + llList2Integer(glCatGrpAnim, i+2) + 3);
        }
        if ((gnCmdDiaOffset == 0) && (gnMenuSpace + llGetListLength(glsOptions) <= 13))     // one cat
        {
            gnCurrLvl = 1;
            gnTopLvl = 1;
            gnCatIndex = 0;
            ShowCmdDlg();
            return;
        }
        gnTopLvl = 0;
    }
    else if (gnCurrLvl == 1)
    {
//llOwnerSay("gnCatIndex=" + (string)gnCatIndex);
        integer i = gnCatIndex + 3;
        integer n = llList2Integer(glCatGrpAnim, gnCatIndex+1);
        gbHasLvl1 = (n > 1);
        if (!gbHasLvl1)     // one group
        {
            gnCurrLvl = 2;
            if (gnTopLvl == 1) gnTopLvl = 2;
            gnGrpIndex = gnCatIndex + 3;
            ShowCmdDlg();
            return;
        }
        integer nSkip = gnCmdDiaOffset;
        integer j;
        for (j=0; j<n; ++j)
        {
            string sGrp = llList2String(glCatGrpAnim, i);
            if (sGrp == "") sGrp = "*";
            if (nSkip > 0)
                --nSkip;
            else
                glsOptions += [ sGrp ];
            i += (llList2Integer(glCatGrpAnim, i+1) + 2);
        }
    }
    else
    {
        integer nMax = llList2Integer(glCatGrpAnim, gnGrpIndex+1);
        if (gnCmdDiaOffset >= nMax)
            gnCmdDiaOffset = 0;
        if (nMax > gnMenuSpace)
        {
            glsOptions += [ "-More-" ];
            --gnMenuSpace;
        }
        if (nMax > gnCmdDiaOffset+gnMenuSpace) nMax = gnCmdDiaOffset+gnMenuSpace;
        llMessageLinked(LINK_THIS, 1430, llDumpList2String(
            llList2List(glCatGrpAnim, gnGrpIndex+gnCmdDiaOffset+2, gnGrpIndex+nMax+1), ","), NULL_KEY);
        return;
    }
    if (llGetListLength(glsOptions) > 12)     // too many
    {
        glsOptions = llList2List(glsOptions, 0, 11 - gnMenuSpace) + [ "-More-" ] + llList2List(glsOptions, 12 - gnMenuSpace, 10);
    }
    string sText = "Select an animation";
    if (gnCurrCountBall != 0)
        sText += "\nCurrent anim: " + gsCurrAnim;
    llDialog(gkToucher, sText, glsOptions, gnChnDialog);
}

default
{
    state_entry()
    {
        gnState = STATE_INIT;
        gbErrorReported = FALSE;
        gbIs2Go = (llGetSubString(llGetObjectName(), 0, 8) == "SexGen2Go");
        if (HasInv(INVENTORY_SCRIPT, "~MenuAccess"))
            gnTouchNum = 1403;
        else
            gnTouchNum = 1401;
        glCatGrpAnim = [];
        gsCurrCat = "";
        glsPlugins = [];
        glnPluginLink = [];
    }

    listen (integer channel, string name, key id, string message)
    {
        if (((channel == gnChnDialog) && (id == gkToucher)) || (channel == gnHUDChannel))
        {
            if (llGetSubString(message, 0, 0) == "[")
            {
                integer n = llSubStringIndex(message, "]");
                if (n > 0)
                {
                    gkToucher = (key)llGetSubString(message, 1, n - 1);
                    message = llGetSubString(message, n + 1, -1);
                }
            }
            if (message == "-More-")
            {
                gnCmdDiaOffset += gnMenuSpace;
                ShowCmdDlg();
                return;
            }
            llListenRemove(gnListen2);
            gnListen2 = 0;
            if (message == "*Move*")
            {
                gbMoving = TRUE;
                llMessageLinked(LINK_THIS, 1102, "", NULL_KEY);
                return;
            }
            if (message == "*EndMove*")
            {
                gbMoving = FALSE;
                llMessageLinked(LINK_THIS, 1105, "", NULL_KEY);
                return;
            }
            if (message == "*Swap*")
            {
                llMessageLinked(LINK_THIS, 1103, "", NULL_KEY);
                return;
            }
            if (message == "!Menu")
            {
                if (gnState == STATE_RUN)
                {
                    gnCurrLvl = 0;
                    gnCmdDiaOffset = 0;
                    ShowCmdDlg();
                }
                return;
            }
            if (message == "-Level Up-")
            {
                --gnCurrLvl;
                if ((gnCurrLvl == 1) && (!gbHasLvl1)) gnCurrLvl = 0;
                gnCmdDiaOffset = 0;
                ShowCmdDlg();
                return;
            }
            if (message == "-None-")
            {
                gnCurrCountBall = 0;
                llMessageLinked(LINK_SET, 1104, "", NULL_KEY);
                return;
            }
//            if (message == "?MDATA?")
//            {
//                llSay(gnHUDChannel, "MDATA1|" + (string)gnCurrCountBall + "|" + (string)gbHasCyber +
//                    "|" + (string)llGetListLength(glsAnims));
//                integer i;
//                for (i=0; i<llGetListLength(glsAnims); i+=15)
//                    llSay(gnHUDChannel, "MDATA2|" + llDumpList2String(llList2List(glsAnims, i, i+14), "|"));
//                for (i=0; i<llGetListLength(glCatGrpAnim); i+=15)
//                    llSay(gnHUDChannel, "MDATA3|" + llDumpList2String(llList2List(glCatGrpAnim, i, i+14), "|"));
//                llSay(gnHUDChannel, "MDATA9");
//                return;
//            }
            integer n = llListFindList(glsPlugins, [ message ]);
            if (n >= 0)
            {
                llMessageLinked(LINK_THIS, llList2Integer(glnPluginLink, n), (string)gnCurrCountBall, gkToucher);
                return;
            }
            n = llListFindList(glCatGrpAnim, [ message ]);
            if (n >= 0)
            {
                if (gnCurrLvl == 0)
                {
                    gnCurrLvl = 1;
                    gnCatIndex = n;
                }
                else if (gnCurrLvl == 1)
                {
                    gnCurrLvl = 2;
                    gnGrpIndex = n;
                }
                gnCmdDiaOffset = 0;
                ShowCmdDlg();
                return;
            }
            gsCurrAnim = message;
            n = llListFindList(glsOptions, [ gsCurrAnim ]);
            if (n >= 0)
            {
//llOwnerSay("Options: " + llDumpList2String(glsOptions, ", ") + "; anim = " + gsCurrAnim + " => " + (string)n);
                n -= (12 - gnMenuSpace);
                gnCurrAnim = llList2Integer(glCatGrpAnim, gnGrpIndex+gnCmdDiaOffset+2+n);
//llOwnerSay("Index = " + (string)n + ", anim index = " + (string)gnCurrAnim);
//llWhisper(0, "Selected anim " + (string)n);
                llMessageLinked(LINK_THIS, 301, (string)gnCurrAnim, NULL_KEY);
                return;
            }
//llOwnerSay("Unknown cmd " + message);
        }
    }

    link_message(integer sender_num, integer num, string str, key id)
    {
//llOwnerSay("Got linkmsg " + (string)num + ", Touch=" + (string)gnTouchNum);
        if (num == gnTouchNum)
        {
            gkToucher = id;
            if (gnState != STATE_RUN)
                llOwnerSay("Please wait, the menu isn't ready yet");
            else
            {
                gnCurrLvl = 0;
                gnCmdDiaOffset = 0;
                ShowCmdDlg();
            }
        }
        else if (num == 400)
        {
            list lData = llParseString2List(str, [ "," ], []);
            gnCurrCountBall = llList2Integer(lData, 0);
        }
        else if (num == 801)
        {
            gnChnDialog = (integer)str + 1;
            gnHUDChannel = gnChnDialog + 4;
            llListen(gnHUDChannel, "", NULL_KEY, "");
        }
        else if (num == 811)
        {
            glsPlugins += [ str ];
            glnPluginLink += [ (integer)((string)id) ];
        }
        else if (num == 1204)   // Taken over
        {
            gnCurrCountBall = (integer)str;
        }
        else if (num == 1205)   // Balls occupied
        {
            if ((integer)str == 0)
                llSetTimerEvent(600.0);
            else
                llSetTimerEvent(0.0);
        }
        else if (num == 1420)
        {
            if (str != gsCurrCat)
            {
                gnCatIndex = llListFindList(glCatGrpAnim, [ str ]);
                if (gnCatIndex == -1)    // new cat
                {
                    gnCatIndex = llGetListLength(glCatGrpAnim);
                    glCatGrpAnim += [ str, 0, 0 ];
                }
                gsCurrCat = str;
            }
//            else if ((string)id == llList2String(glCatGrpAnim, gnGrpIndex))
//            {
//                return;
//            }
            integer n = GetCatSize(gnCatIndex);
            if (n > 3)
                gnGrpIndex = llListFindList(llList2List(glCatGrpAnim, gnCatIndex + 3, gnCatIndex + n - 1), [ (string)id ]);
            else
                gnGrpIndex = -1;
            integer bNewGrp = (gnGrpIndex == -1);
            if (bNewGrp)
                gnGrpIndex = gnCatIndex + n;
            else
                gnGrpIndex += (gnCatIndex + 3);
            gnAnimIndex = gnGrpIndex + 2;
            if (bNewGrp)
            {
                Increment(gnCatIndex + 1);
                glCatGrpAnim = llListInsertList(glCatGrpAnim, [ (string)id, 0 ], gnGrpIndex);
            }
            else
            {
                gnAnimIndex += llList2Integer(glCatGrpAnim, gnGrpIndex + 1);
            }
//llOwnerSay(str + " & " + (string)id + " => " + llDumpList2String(glCatGrpAnim, ","));
//llOwnerSay("Cat=" + (string)gnCatIndex + ", Grp=" + (string)gnGrpIndex + ", Anim=" + (string)gnAnimIndex);
        }
        else if (num == 1421)
        {
            Increment(gnCatIndex + 2);
            Increment(gnGrpIndex + 1);
            glCatGrpAnim = llListInsertList(glCatGrpAnim, [ (integer)str ], gnAnimIndex);
            ++gnAnimIndex;
        }
        else if (num == 1422)
        {
            integer n = (integer)str;
            glCatGrpAnim = [ "*", 1, n, "*", n ];
            integer i;
            for (i=0; i<n; ++i)
                glCatGrpAnim += [ i ];
        }
        else if (num == 1423)
        {
            gnState = STATE_RUN;
            SayReady();
        }
        else if (num == 1431)
        {
//llOwnerSay("Option list = " + llDumpList2String(glsOptions, ", "));
//llOwnerSay("Anim list = " + str);
            glsOptions += llParseString2List(str, [ "," ], []);
            string sText = "Select an animation";
            if (gnCurrCountBall != 0)
                sText += "\nCurrent anim: " + gsCurrAnim;
            llDialog(gkToucher, sText, glsOptions, gnChnDialog);
        }
        else if (num == 1504)
        {
            list lsMissing = llParseString2List(str, [ "," ], []);
            integer n = llGetListLength(lsMissing);
            if (n > 0)
            {
                glCatGrpAnim += [ "Unlisted", 1, n, "*", n ] + lsMissing;
            }
        }
    }

    timer()
    {
        llSetTimerEvent(0.0);
        gnCurrCountBall = 0;
        llMessageLinked(LINK_SET, 1104, "", NULL_KEY);
    }

    on_rez(integer start_param)
    {
        llResetScript();
    }
}

 

Innula Zenovka
Posts: 7,040
Registered: ‎06-02-2009
0 Kudos

Re: sexgen Ultra 600 - re-open dialog box after a pose choice

Reply to sunandfun - view message

I've not tested this, but, off the top of my head, I think that you need to make a small change to the end of the listen event in the third script,  ~MenuMaster v5.01.

Down around line 288, 

		if (n >= 0)
			{
				//llOwnerSay("Options: " + llDumpList2String(glsOptions, ", ") + "; anim = " + gsCurrAnim + " => " + (string)n);
				n -= (12 - gnMenuSpace);
				gnCurrAnim = llList2Integer(glCatGrpAnim, gnGrpIndex+gnCmdDiaOffset+2+n);
				//llOwnerSay("Index = " + (string)n + ", anim index = " + (string)gnCurrAnim);
				//llWhisper(0, "Selected anim " + (string)n);
				llMessageLinked(LINK_THIS, 301, (string)gnCurrAnim, NULL_KEY);
				return;
			}

 I think you need to change it to,

if (n >= 0)
			{
				//llOwnerSay("Options: " + llDumpList2String(glsOptions, ", ") + "; anim = " + gsCurrAnim + " => " + (string)n);
				n -= (12 - gnMenuSpace);
				gnCurrAnim = llList2Integer(glCatGrpAnim, gnGrpIndex+gnCmdDiaOffset+2+n);
				//llOwnerSay("Index = " + (string)n + ", anim index = " + (string)gnCurrAnim);
				//llWhisper(0, "Selected anim " + (string)n);
				llMessageLinked(LINK_THIS, 301, (string)gnCurrAnim, NULL_KEY);
				ShowCmdDlg();// <== added this to try to get the menu back
				return;
			}

 If that doesn't work, I am not sure what else to suggest (other than try to contact whoever made the script) since I don't have time to analyse the scripts in great detail, but that looks worth a try, at least on the face of it.

Honored Resident
sunandfun
Posts: 3
0 Kudos

Re: sexgen Ultra 600 - re-open dialog box after a pose choice

[ Edited ]

Reply to sunandfun - view message

ty very much Innula

Actually i solved adding a ShowCmdDlg(); after the 1421 (Menu anim) condition in 3rd script and is workin fine

Wanted to inform earlier but my account was locked


Tks again :smileyhappy: