From c1163cb3ff907a91205b8de553430b0cdfabe375 Mon Sep 17 00:00:00 2001 From: onefang Date: Mon, 6 Sep 2021 21:58:36 +1000 Subject: Rip it a new one. Er replace Sitters "structure" with Avs. --- 1AOor2.lsl | 286 ++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 149 insertions(+), 137 deletions(-) diff --git a/1AOor2.lsl b/1AOor2.lsl index b3518f3..5427f27 100644 --- a/1AOor2.lsl +++ b/1AOor2.lsl @@ -309,7 +309,7 @@ integer doThing(key id, string button, string fr, string cmd, string data, integ if (-1 != set) setSetting(id, fr + cmd, data, fINT); else S("Unknown setting '" + cmd); } if ((fr != (ScriptName + ".") && ("*." != fr))) return TRUE; - integer st = findSitter(id); + integer av = findAvatar(id); integer f; string menu; f = llSubStringIndex(button, "->"); @@ -355,37 +355,37 @@ integer doThing(key id, string button, string fr, string cmd, string data, integ } else if ("LESS_-" == cmd) { - integer distance = llList2Integer(Sitters, st + pDIST); + integer distance = llList2Integer(Avs, av + aDIST); --distance; if (0 > distance) distance = 0; - Sitters = llListReplaceList(Sitters, [distance], st + pDIST, st + pDIST); + Avs = llListReplaceList(Avs, [distance], av + aDIST, av + aDIST); showMenu(id); return FALSE; } else if ("MORE_+" == cmd) { - integer distance = llList2Integer(Sitters, st + pDIST); + integer distance = llList2Integer(Avs, av + aDIST); ++distance; if (llGetListLength(Distances) <= distance) distance = llGetListLength(Distances) - 1; - Sitters = llListReplaceList(Sitters, [distance], st + pDIST, st + pDIST); + Avs = llListReplaceList(Avs, [distance], av + aDIST, av + aDIST); showMenu(id); return FALSE; } else if ("NEXT_AVATAR" == cmd) { - key them = llList2Key(Sitters, st + pADJ); - integer t = findSitter(them); + key them = llList2Key(Avs, av + aADJ); + integer t = findAvatar(them); if (-1 != t) { - t += pSTRIDE; - if (llGetListLength(Sitters) <= t) + t += aSTRIDE; + if (llGetListLength(Avs) <= t) t = -1; } else t = 0; if (-1 != t) - Sitters = llListReplaceList(Sitters, [llList2Key(Sitters, t + pKEY)], st + pADJ, st + pADJ); + Avs = llListReplaceList(Avs, [llList2Key(Avs, t + aKEY)], av + aADJ, av + aADJ); else - Sitters = llListReplaceList(Sitters, [ScriptKey], st + pADJ, st + pADJ); + Avs = llListReplaceList(Avs, [ScriptKey], av + aADJ, av + aADJ); showMenu(id); return FALSE; } @@ -395,27 +395,21 @@ integer doThing(key id, string button, string fr, string cmd, string data, integ { integer i = llSubStringIndex(cmd, "_"); if (-1 != i) cmd = llGetSubString(cmd, 0, i - 1) + " " + llGetSubString(cmd, i + 1, -1); - adjust(id, llList2Float(Distances, llList2Integer(Sitters, st + pDIST)), llToLower(cmd)); + adjust(id, llList2Float(Distances, llList2Integer(Avs, av + aDIST)), llToLower(cmd)); } else if ("AO" == cmd) { if ("0" != data) { - integer l = llGetListLength(Sitters); - Pose = ""; - for (f = 0; f < l; f += pSTRIDE) - updateSitter(llList2Key(Sitters, f + pKEY)); + integer l = llGetListLength(Avs); + nextState = ""; + for (f = 0; f < l; f += aSTRIDE) + updateAvatar(llList2Key(Avs, f + aKEY)); } checkAO(); } else if ("SYNC" == cmd) { - integer l = llGetListLength(Sitters); - for (f = 0; f < l; f += pSTRIDE) - { - if (("R" != data) || (0 == llGetListLength(isPoseAO(f)))) - Sitters = llListReplaceList(Sitters, [""], f + pSTATE, f + pSTATE); - } if ("R" != data) vAnim = data; checkAO(); @@ -643,11 +637,11 @@ d("New URL " + URL); Chosen = -1; else { - if (-1 != st) + if (-1 != av) { - if ("" != llList2Key(Sitters, st + pADJ)) + if ("" != llList2Key(Avs, av + aADJ)) { - Sitters = llListReplaceList(Sitters, [""], st + pADJ, st + pADJ); + Avs = llListReplaceList(Avs, [""], av + aADJ, av + aADJ); s(id, "Switched out of adjusting mode."); addEvent(Tick * Smooth, "Keys"); } @@ -689,17 +683,17 @@ string HoverText = "loveness"; string Sit0Text = "carry them"; string Sit1Text = "be carried"; -// DrivableBox -list Sitters = []; -integer pKEY = 0; // Key of the sitter. -integer pLINK = 1; // The "prim" link the sitter is. -integer pSTATE = 2; // The current AOstate for this person. -integer pNEW = 3; // New state for this person. -integer pANIMS = 4; // Current set of animations for this person. -integer pADJ = 5; // Key of who they are adjusting, "" means not adjusting, NULL_KEY will mean adjust all. -integer pDIST = 6; // For the adjusting this person is doing, not for who they are adjusting. -integer pKEYS = 7; // KeysLevel for this sitter. -integer pSTRIDE = 8; +// DrivableBox and AO +list Avs = []; +integer aKEY = 0; // Key of the avatar. +integer aNUM = 1; // Number of the sitter, index into Poses[].psANIM and Poses[].psPOSROT +integer aLINK = 2; // The "prim" link the avatar is. +integer aSTATE = 3; // AO / Pose state for this person. +integer aANIM = 4; // Current animation for this avatar. +integer aADJ = 5; // Key of who they are adjusting, "" means not adjusting, NULL_KEY will mean adjust all. +integer aDIST = 6; // For the adjusting this avatar is doing, not for who they are adjusting. Index into Distances[]. +integer aKEYS = 7; // KeysLevel for this avatar. Mostly needed for held down keys I think? +integer aSTRIDE = 8; list Poses; // List of poses. integer psNAME = 0; // Name of pose. integer psANIM = 1; // | separated animations. @@ -763,7 +757,7 @@ integer checkAnim(string a) newPose(key id, string p, list ps) { integer f = findPose(p); - integer l = llGetListLength(Sitters); + integer l = llGetListLength(Avs); if (-1 != f) { setSetting(id, "AO", "0", fINT); @@ -775,7 +769,7 @@ newPose(key id, string p, list ps) } } -integer findSitter(key id) {return listFindString(Sitters, id, pSTRIDE);} +integer findAvatar(key id) {return listFindString(Avs, id, aSTRIDE);} string prStr(string str) { @@ -957,7 +951,7 @@ doControl(key id, integer level, integer edge) integer f = findSitter(id); if (-1 != f) { - integer a = ("" != llList2Key(Sitters, f + pADJ)); + integer a = ("" != llList2Key(Avs, f + aADJ)); if ((held == (CONTROL_BACK | CONTROL_FWD)) || (held == (CONTROL_DOWN | CONTROL_UP)) || (held == (CONTROL_LEFT | CONTROL_RIGHT)) || @@ -969,7 +963,7 @@ doControl(key id, integer level, integer edge) { if (a) { - Sitters = llListReplaceList(Sitters, [""], f + pADJ, f + pADJ); + Avs = llListReplaceList(Avs, [""], f + aADJ, f + aADJ); s(id, "Switched out of adjusting mode."); addEvent(Tick * Smooth, "Keys"); } @@ -985,7 +979,7 @@ doControl(key id, integer level, integer edge) HeldKeys = 0; level = 0; } - Sitters = llListReplaceList(Sitters, [level], f + pKEYS, f + pKEYS); + Avs = llListReplaceList(Avs, [level], f + aKEYS, f + aKEYS); if (0 != edge) ControlTime = llGetTimeOfDay(); if (level != LevelKeys) updateControls(); @@ -1001,13 +995,13 @@ updateControls() { if (Attached) return; integer mode = vNONE; integer reverse = 1; float speed = 0.0; float rot = 0.0; - integer l = llGetListLength(Sitters); integer i; + integer l = llGetListLength(Avs); integer i; integer keys; - for (i = l - pSTRIDE; i >= 0; i -= pSTRIDE) + for (i = l - aSTRIDE; i >= 0; i -= aSTRIDE) { - key k = llList2Key(Sitters, i + pKEY); - keys = llList2Integer(Sitters, i + pKEYS); - if ("" == llList2Key(Sitters, i + pADJ)) + key k = llList2Key(Avs, i + aKEY); + keys = llList2Integer(Avs, i + aKEYS); + if ("" == llList2Key(Avs, i + aADJ)) { if (keys & (CONTROL_DOWN |CONTROL_UP)) mode = vUP; if (keys & (CONTROL_BACK | CONTROL_FWD)) mode = vFWD; @@ -1024,7 +1018,7 @@ updateControls() } else { - float d = llList2Float(Distances, llList2Integer(Sitters, i + pDIST)); + float d = llList2Float(Distances, llList2Integer(Avs, i + aDIST)); if (keys & CONTROL_FWD) adjust(k, d, "forward"); if (keys & CONTROL_BACK) adjust(k, d, "backwards"); if (keys & CONTROL_LEFT) adjust(k, d, "left"); @@ -1044,7 +1038,7 @@ updateControls() adjust(key id, float dist, string direction) { - integer f = findSitter(id); + integer f = findAvatar(id); integer i = -1; list p; i = findPose(Pose); @@ -1054,27 +1048,28 @@ adjust(key id, float dist, string direction) return; if (-1 != f) { - key them = llList2Key(Sitters, f + pADJ); + key them = llList2Key(Avs, f + aADJ); integer l; integer t; if (ScriptKey == them) { t = 0; - l = llGetListLength(Sitters); + l = llGetListLength(Avs); } else { - t = findSitter(them); - l = t + pSTRIDE; + t = findAvatar(them); + l = t + aSTRIDE; } if (-1 != t) { if (("turn left" == direction) || ("turn right" == direction)) dist = dist * 90.0; - for (; t < l; t += pSTRIDE) + for (; t < l; t += aSTRIDE) { - them = llList2Key(Sitters, t + pKEY); - integer lnk = llList2Integer(Sitters, t + pLINK); + them = llList2Key(Avs, t + aKEY); + integer num = llList2Integer(Avs, t + aNUM); + integer lnk = llList2Integer(Avs, t + aLINK); if (-1 == lnk) return; - string prn = llList2String(p, t / pSTRIDE); + string prn = llList2String(p, num); integer ix = llSubStringIndex(prn, ">"); vector pos = (vector) llGetSubString(prn, 0, ix); vector rot = (vector) llGetSubString(prn, ix + 1, -1); @@ -1086,9 +1081,9 @@ adjust(key id, float dist, string direction) else if ("down" == direction) pos.z = pos.z - dist; else if ("turn left" == direction) rot.z = rot.z + (dist); else if ("turn right" == direction) rot.z = rot.z - (dist); - p = llListReplaceList(p, [vround(pos, rot)], t / pSTRIDE, t / pSTRIDE); + p = llListReplaceList(p, [vround(pos, rot)], num, num); Poses = llListReplaceList(Poses, [llDumpList2String(p, "|")], i + psPOSROT, i + psPOSROT); - updateSitter(them); + updateAvatar(them); s(id, llKey2Name(id) + " adjusts " + llKey2Name(them) + " by " + (string) dist + " " + direction); if (id != them) s(them, llKey2Name(id) + " adjusts " + llKey2Name(them) + " by " + (string)dist + " " + direction); @@ -1097,20 +1092,21 @@ adjust(key id, float dist, string direction) } } -updateSitter(key id) +updateAvatar(key id) { // Written by Strife Onizuka, size adjustment provided by Talarus Luan // Using this while the object is moving may give unpredictable results. - integer f = findSitter(id); + integer f = findAvatar(id); if (-1 != f) { - integer lnk = llList2Integer(Sitters, f + pLINK); + integer lnk = llList2Integer(Avs, f + aLINK); if (-1 == lnk) return; + integer num = llList2Integer(Avs, f + aNUM); vector pos = position; rotation rot = llEuler2Rot(rotat * DEG_TO_RAD); integer i = findPose(Pose); if (-1 != i) { - string prn = llList2String(llParseStringKeepNulls(llList2String(Poses, i + psPOSROT), ["|"], []), f / pSTRIDE); + string prn = llList2String(llParseStringKeepNulls(llList2String(Poses, i + psPOSROT), ["|"], []), num); integer ix = llSubStringIndex(prn, ">"); // TODO - might be wrong, coz rotations are hard, m'kay. pos = (vector) llGetSubString(prn, 0, ix); @@ -1143,16 +1139,16 @@ updateSitter(key id) showMenu(key id) { - integer f = findSitter(id); + integer f = findAvatar(id); if (-1 != f) { - key them = llList2Key(Sitters, f + pADJ); + key them = llList2Key(Avs, f + aADJ); string name; - integer distance = llList2Integer(Sitters, f + pDIST); + integer distance = llList2Integer(Avs, f + aDIST); if ("" == them) { them = id; - Sitters = llListReplaceList(Sitters, [them], f + pADJ, f + pADJ); + Avs = llListReplaceList(Avs, [them], f + aADJ, f + aADJ); s(id, "Switched to adjusting mode. Click '▲ Exit' on the adjusting menu to switch back to moving."); } if (ScriptKey == them) @@ -1341,20 +1337,20 @@ updateVehicle(integer keys, integer mode, float move, float rotate) else if (0.0 > cr.y) {if (-0.3 > cr.y) cr.y = -1.0; else cr.y = 0.0;} } isEdge = llEdgeOfWorld(gp, cr); - integer l = llGetListLength(Sitters); + integer l = llGetListLength(Avs); integer i; - for (i = 0; i < l; i += pSTRIDE) + for (i = 0; i < l; i += aSTRIDE) { - key a = llList2Key(Sitters, i); - key t = llList2Key(Sitters, i + pADJ); + key a = llList2Key(Avs, i + aKEY); + key t = llList2Key(Avs, i + aADJ); if (isEdge) { - Sitters = llListReplaceList(Sitters, [a], i + pADJ, i + pADJ); + Avs = llListReplaceList(Avs, [a], i + aADJ, i + aADJ); adjust(a, move, "forward"); - Sitters = llListReplaceList(Sitters, [t], i + pADJ, i + pADJ); + Avs = llListReplaceList(Avs, [t], i + aADJ, i + aADJ); } else - llSetLinkPrimitiveParamsFast(llList2Integer(Sitters, i + pLINK), + llSetLinkPrimitiveParamsFast(llList2Integer(Avs, i + aLINK), [PRIM_POS_LOCAL, <-1.0, 0.0, -0.0001>]); } } @@ -1430,55 +1426,65 @@ checkSitters(integer del) integer lnk; for (lnk = llGetObjectPrimCount(llGetKey()) + 1; lnk <= l; ++lnk) new += [llGetLinkKey(lnk), lnk]; - l = llGetListLength(Sitters); - for (lnk = 0; lnk < l; lnk += pSTRIDE) + l = llGetListLength(Avs); + if (0 != l) { - key t = llList2Key(Sitters, lnk + pKEY); - if (NULL_KEY != t) + for (lnk = 0; lnk < l; lnk += aSTRIDE) { - integer j = listFindString(new, t, 2); - - if (-1 == j) // old sitter that left + key t = llList2Key(Avs, lnk + aKEY); + if (NULL_KEY != t) { - d("unsit " + llKey2Name(t)); - stopMe(t, lnk); - oldController(t); - Sitters = llListReplaceList(Sitters, [NULL_KEY], lnk + pKEY, lnk + pKEY); + integer j = listFindString(new, t, 2); + + if (-1 == j) // old sitter that left + { + d("unsit " + llKey2Name(t)); + stopAnims(t); + oldController(t); + Avs = llListReplaceList(Avs, [NULL_KEY, -1, -1], lnk + aKEY, lnk + aLINK); + } + else // old sitter that is still here + { + Avs = llListReplaceList(Avs, [llList2Integer(new, j + 1)], lnk + aLINK, lnk + aLINK); + new = llListReplaceList(new, [], j, j + 1); + } } - else // old sitter that is still here - new = llListReplaceList(new, [], j, j + 1); } } - l = llGetListLength(new) / 2; + l = llGetListLength(new); for (lnk = 0; lnk < l; lnk +=2) { key t = llList2Key(new, lnk); - list n = [t, llList2Integer(new, lnk + 1), "", "", "", "", llGetListLength(Distances) / 3, 0]; + list n = [t, -1, llList2Integer(new, lnk + 1), "", "", "", llGetListLength(Distances) / 3, 0]; list gndr = llGetObjectDetails(t, [OBJECT_BODY_SHAPE_TYPE]); stopAnims(t); - integer f = findSitter(NULL_KEY); + integer f = findAvatar(NULL_KEY); if (-1 != f) // new sitter replaces old - Sitters = llListReplaceList(Sitters, n, f, f + pSTRIDE - 1); + Avs = llListReplaceList(Avs, n, f, f + aSTRIDE - 1); else // new sitter added on end - Sitters += n; + Avs += n; if (NULL_KEY != BossKey) sendPrim(BossKey, "SIT_DONE", [t]); - d("sat " + llKey2Name(t) + ", " + llList2String(gndr, 0) + " male @ " + (f / pSTRIDE)); + d("sat " + llKey2Name(t) + ", " + llList2String(gndr, 0) + " male @ " + (f / aSTRIDE)); } // Wearer is the default leader, unless anyone is taller. - l = llGetListLength(Sitters); - integer m = l / pSTRIDE; - integer ldr = findSitter(Owner); + l = llGetListLength(Avs); + integer m = l / aSTRIDE; + integer ldr = findAvatar(Owner); float max = 0.0; if (-1 != ldr) { vector s = llGetAgentSize(Owner); max = s.z; } - for (lnk = 0; lnk < l; lnk += pSTRIDE) + Controller = NULL_KEY; + for (lnk = 0; lnk < l; lnk += aSTRIDE) { - key t = llList2Key(Sitters, lnk + pKEY); + key t = llList2Key(Avs, lnk + aKEY); vector s = llGetAgentSize(t); + Avs = llListReplaceList(Avs, [lnk / aSTRIDE], lnk + aNUM, lnk + aNUM); + if ((NULL_KEY == Controller) && (Owner != t)) + Controller = t; if (s.z > max) { max = s.z; @@ -1486,29 +1492,19 @@ checkSitters(integer del) } if (NULL_KEY == t) --m; } - if ((0 != ldr) && (0 != llGetListLength(Sitters))) - { - list s = llList2List(Sitters, ldr, ldr + pSTRIDE - 1); - Sitters = s + llListReplaceList(Sitters, [], ldr, ldr + pSTRIDE - 1); - } - newLeader(llList2Key(Sitters, pKEY)); - llSitTarget(position, llEuler2Rot(rotat * DEG_TO_RAD)); - Controller = NULL_KEY; - for (lnk = 0; lnk < l; lnk += pSTRIDE) - { - updateSitter(llList2Key(Sitters, lnk + pKEY)); - key t = llList2Key(Sitters, lnk + pKEY); - if ((NULL_KEY == Controller) && (Owner != t)) - Controller = t; - } if (NULL_KEY != Controller) { d("checkSitters() requesting camera and controls from " + llKey2Name(Controller)); llRequestPermissions(Controller, PERMISSION_CONTROL_CAMERA | PERMISSION_TAKE_CONTROLS); } - llSetSitText(Sit0Text); llSetTouchText("menu"); llSetClickAction(CLICK_ACTION_SIT); - llSetText(HoverText, <1.0, 1.0, 1.0>, 1.0); - if (0 == m) + if (-1 != ldr) + newLeader(llList2Key(Avs, ldr + aKEY)); + else + checkAO(); +//for (lnk = 0; lnk < l; lnk += aSTRIDE) +// S(llKey2Name(llList2Key(Avs, lnk + aKEY)) + " is number " + llList2String(Avs, lnk + aNUM)); + for (lnk = 0; lnk < l; lnk += aSTRIDE) + updateAvatar(llList2Key(Avs, lnk + aKEY)); { if (del) { @@ -1635,8 +1631,8 @@ list isPoseAO(integer f) checkAO() { string newAnim; - integer l = llGetListLength(Sitters); integer fast; integer i; integer f; float dpth; + integer l = llGetListLength(Avs); if (NULL_KEY != TheirKey) return; // doAnim = (integer) getSetting("osAnim"); @@ -1731,16 +1727,26 @@ checkAO() else AOspeed = 1.0; for (f = 0; f < l; f += pSTRIDE) { - string anim = llList2String(Sitters, f + pSTATE); - list anims = llCSV2List(llList2String(Sitters, f + pANIMS)); - integer g; - list states = States; - key id = llList2Key(Sitters, f + pKEY); - list ps = isPoseAO(f); - if (0 != llGetListLength(ps)) + string old = oldAnim; + string new = newAnim; + list anims = llParseString2List(llList2String(Poses, p + psANIM), ["|"], []); + key id = llList2Key(Avs, f + aKEY); + integer num = llList2Integer(Avs, f + aNUM); +//s("checkAO " + llKey2Name(id) + " " + old + " -> " + new + " @ " + nextPose + " \n" + +//llDumpList2String(anims, "|")); + + if ("" != nextPose) { - states = [Pose, llList2String(ps, f / pSTRIDE)]; - newAnim = Pose; + if ("~" == llList2String(anims, num)) + { +//s("POSE " + llKey2Name(id) + " nextState = " + nextState); + integer q = findPose("AO_" + nextState); + anims = llParseString2List(llList2String(Poses, q + psANIM), ["|"], []); + old = llList2String(Avs, f + aSTATE); + new = nextState; + } + else + anims = [llList2String(anims, num)]; } //d("checkAO " + llKey2Name(id) + " " + anim + " -> " + newAnim + " @ " + (string) AOspeed + " " + Pose); if (newAnim != anim) @@ -1769,21 +1775,27 @@ checkAO() } } } - anim = newAnim; + Avs = llListReplaceList(Avs, [new], f + aSTATE, f + aSTATE); } - Sitters = llListReplaceList(Sitters, [anim, anim, llDumpList2String(anims, ",")], f + pSTATE, f + pANIMS); - newAnim = oldAnim; } if (("" == Pose) || ("Swimming Up" == vAnim)) addEvent(Tick * dpth, "checkAO"); } -stopMe(key id, integer f) +stopAnims(key avatar) { - list anims = llCSV2List(llList2String(Sitters, f + pANIMS)); - integer i; -//d("stopMe " + llKey2Name(id) + " " + llList2String(Sitters, f + pANIMS)); - for (i = llGetListLength(anims) - 1; i >= 0; --i) - animEnd(id, llList2String(anims, i)); + if (NULL_KEY != avatar) + { + list anims = llGetAnimationList(avatar); + integer l = llGetListLength(anims); + integer i; + for (i = 0; i < l; i++) + { + string anim = llList2Key(anims, i); + if (anim != "") + animEnd(avatar, anim); + } + animSwitch(avatar, ""); + } } checkLag() @@ -1856,10 +1868,10 @@ laterInit() die() { - integer l = llGetListLength(Sitters); + integer l = llGetListLength(Avs); integer f; - for (f = 0; f < l; f += pSTRIDE) - stopMe(llList2Key(Sitters, f + pKEY), f); + for (f = 0; f < l; f += aSTRIDE) + stopAnims(llList2Key(Avs, f + aKEY)); d("Deleting myself."); sendPrim(BossKey, "DIE_DONE", []); if (PERM_COPY & llGetObjectPermMask(MASK_OWNER)) llDie(); -- cgit v1.1