From 0b836920b9197ae78d0740c5985f036118e58008 Mon Sep 17 00:00:00 2001 From: onefang Date: Mon, 6 Sep 2021 22:06:21 +1000 Subject: Rip it a new one, the other side. --- 1AOor2.lsl | 275 +++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 176 insertions(+), 99 deletions(-) diff --git a/1AOor2.lsl b/1AOor2.lsl index 5427f27..2910faa 100644 --- a/1AOor2.lsl +++ b/1AOor2.lsl @@ -101,9 +101,21 @@ string inKey2Name(key k) return k; } -animBegin(key u, string a){if (doAnim) osAvatarPlayAnimation(u, a); else llStartAnimation(a);} -animEnd(key u, string a){if (doAnim) osAvatarStopAnimation(u, a); else llStopAnimation(a);} +animBegin(key u, string a){if (doAnim) osAvatarPlayAnimation(u, a); else llStartAnimation(a); /*s("START " + llKey2Name(u) + " " + a);*/} +animEnd (key u, string a){if (doAnim) osAvatarStopAnimation(u, a); else llStopAnimation (a); /*s("STOP " + llKey2Name(u) + " " + a);*/} speed(key u, float s){if (doSpeed) osSetSpeed(u, s);} +animSwitch(key u, string anim) +{ + integer f = findAvatar(u); + if (-1 != f) + { + string a = llList2String(Avs, f + aANIM); +//s("animSwitch " + a + " -> " + anim); + if ("" != a) animEnd(u, a); + if (("" != anim) && (checkAnim(anim, FALSE))) animBegin(u, anim); + Avs = llListReplaceList(Avs, [anim], f + aANIM, f + aANIM); + } +} integer listFindString(list lst, string name, integer stride) { @@ -411,8 +423,14 @@ integer doThing(key id, string button, string fr, string cmd, string data, integ else if ("SYNC" == cmd) { if ("R" != data) - vAnim = data; - checkAO(); + nextPose = data; + else + { + Pose = ""; + State = ""; + } + if ("" == Posed) // Coz we don't want the checkAO regular SYNC R to break us out of the pose. + checkSitters(TRUE); } else if ("POSE" == cmd) { @@ -550,6 +568,13 @@ integer doThing(key id, string button, string fr, string cmd, string data, integ d("SIT_DONE for " + llKey2Name(data)); if(data == Stalkee) { + if ("" != Posed) + { + s("Stopping pose " + Posed); +// animEnd(Owner, Posed); + Posed = ""; + animSwitch(Owner, Posed); + } llOwnerSay("@sit:" + TheirKey + "=force"); s("Switching AO to 1AOor2 couples object."); Controller = Owner; @@ -700,6 +725,11 @@ integer psANIM = 1; // | separated animations. integer psEMOTE = 2; // | separated emotions and timers list. integer psPOSROT= 3; // | separated position and rotation pairs. integer psSTRIDE= 4; +string Posed; // Single pose, overrides AO. +string Pose; // Couples pose name. +string State; // AO state name. +string nextPose; // Couples pose name. +string nextState; // AO state name. // Smiler integer SmileCounter = 0; @@ -715,7 +745,6 @@ list Smiles = // Couples list Whats; string What; -string Pose; key Stalkee; integer PIN; key Leader = NULL_KEY; @@ -760,12 +789,19 @@ newPose(key id, string p, list ps) integer l = llGetListLength(Avs); if (-1 != f) { - setSetting(id, "AO", "0", fINT); - Pose = p; - Poses = llListReplaceList(Poses, llDumpList2String(ps, "|"), f + psANIM, f + psANIM); - for (f = 0; f < l; f += pSTRIDE) - updateSitter(llList2Key(Sitters, f + pKEY)); - checkAO(); + if (NULL_KEY != id) + setSetting(id, "AO", "0", fINT); + nextPose = p; + string anims = llDumpList2String(ps, "|"); + Poses = llListReplaceList(Poses, collectEmotes(anims), f + psANIM, f + psEMOTE); + if (NULL_KEY != id) + { + for (f = 0; f < l; f += aSTRIDE) + { + updateAvatar(llList2Key(Avs, f + aKEY)); + } + checkAO(); + } } } @@ -947,8 +983,8 @@ doControl(key id, integer level, integer edge) // integer end = ~level & edge; integer held = level & ~edge; // integer untouched = ~(level | edge); -// llSay(0, "doControl " + llKey2Name(id) + " " + llList2CSV([level, edge, start, end, held, untouched])); - integer f = findSitter(id); +// d(0, "doControl " + llKey2Name(id) + " " + llList2CSV([level, edge, start, end, held, untouched])); + integer f = findAvatar(id); if (-1 != f) { integer a = ("" != llList2Key(Avs, f + aADJ)); @@ -990,7 +1026,6 @@ doControl(key id, integer level, integer edge) float SPEED = 3.8; float ROTAT = 8.0; float Smooth = 0.2; // 0.2 is good. -string vAnim; updateControls() { if (Attached) return; @@ -1103,7 +1138,12 @@ updateAvatar(key id) integer num = llList2Integer(Avs, f + aNUM); vector pos = position; rotation rot = llEuler2Rot(rotat * DEG_TO_RAD); - integer i = findPose(Pose); + integer i; + + if ("" != nextPose) + i = findPose(nextPose); + else + i = findPose(Pose); if (-1 != i) { string prn = llList2String(llParseStringKeepNulls(llList2String(Poses, i + psPOSROT), ["|"], []), num); @@ -1225,7 +1265,7 @@ updateVehicle(integer keys, integer mode, float move, float rotate) vector gp = pos; vector rotvec = llRot2Euler(llGetRot()); if (Attached || (0.0 == LeaderOffset)) return; - vAnim = "Standing"; + nextState = "Standing"; if (0.0 < vTHEN) { if (3.0 > (llGetTimeOfDay() - vTHEN)) @@ -1237,30 +1277,30 @@ updateVehicle(integer keys, integer mode, float move, float rotate) } if (vUP == vMODE) { - if (vNONE == mode) vAnim = "Hovering"; + if (vNONE == mode) nextState = "Hovering"; else if (vFWD == mode) { - vAnim = "Flying"; + nextState = "Flying"; pos += (<(llCos(rotvec.z)) * move, (llSin(rotvec.z)) * move, 0.0>); } else if (vUP == mode) { pos += (<0.0, 0.0, move>); - if (0.0 < move) vAnim = "Hovering Up"; - else vAnim = "Hovering Down"; + if (0.0 < move) nextState = "Hovering Up"; + else nextState = "Hovering Down"; } if (cast(gp, pos, move / Smooth) > (pos.z - LeaderOffset)) { - vAnim = "Soft Landing"; vMODE = vFWD; + nextState = "Soft Landing"; vMODE = vFWD; vTHEN = llGetTimeOfDay(); addEvent(3.0, "SYNC Standing"); } } else if (vFALL == vMODE) { - vAnim = "Falling"; pos.z -= 1.0; + nextState = "Falling"; pos.z -= 1.0; if (cast(gp, pos, move / Smooth) > (pos.z - LeaderOffset)) { - vAnim = "Standing Up"; vMODE = vFWD; + nextState = "Standing Up"; vMODE = vFWD; vTHEN = llGetTimeOfDay(); addEvent(3.0, "SYNC Standing"); } } @@ -1282,37 +1322,37 @@ updateVehicle(integer keys, integer mode, float move, float rotate) } else pos.z = ground + LeaderOffset; } - if (vMODE == vFALL) vAnim = "Falling"; + if (vMODE == vFALL) nextState = "Falling"; else if (vCROUCH == vMODE) { - if (0.0 == move) vAnim = "Crouching"; - else vAnim = "CrouchWalking"; + if (0.0 == move) nextState = "Crouching"; + else nextState = "CrouchWalking"; } else if (vGROUND == vMODE) - vAnim = "Sitting on Ground"; + nextState = "Sitting on Ground"; else { if (0.0 != rotate) { - if (0.0 < rotate) vAnim = "Turning Left"; - else vAnim = "Turning Right"; + if (0.0 < rotate) nextState = "Turning Left"; + else nextState = "Turning Right"; } - if (0.0 == move) vAnim = "Standing"; - else vAnim = "Walking"; + if (0.0 == move) nextState = "Standing"; + else nextState = "Walking"; } } else if (vUP == mode) { if (keys & CONTROL_UP) { - if (vGROUND == vMODE) {vAnim = "Crouching"; vMODE = vCROUCH;} - else if (vCROUCH == vMODE) {vAnim = "Standing"; vMODE = vFWD;} + if (vGROUND == vMODE) {nextState = "Crouching"; vMODE = vCROUCH;} + else if (vCROUCH == vMODE) {nextState = "Standing"; vMODE = vFWD;} else {pos += (<0.0, 0.0, move>); vMODE = vUP;} } else { - if (vCROUCH == vMODE) {vAnim = "Sitting on Ground"; vMODE = vGROUND;} - else if (0.0 > move) {vAnim = "Crouching"; vMODE = vCROUCH;} + if (vCROUCH == vMODE) {nextState = "Sitting on Ground"; vMODE = vGROUND;} + else if (0.0 > move) {nextState = "Crouching"; vMODE = vCROUCH;} else {pos += (<0.0, 0.0, move>); vMODE = vUP;} } } @@ -1389,10 +1429,41 @@ updateVehicle(integer keys, integer mode, float move, float rotate) newLeader(key id) { Leader = id; - vector bb = llGetAgentSize(Leader); LeaderOffset = (bb.z + 0.3) / 2; + if (NULL_KEY != id) + { + vector bb = llGetAgentSize(Leader); LeaderOffset = (bb.z + 0.3) / 2; + + integer l = llGetListLength(Avs); + integer i; + integer oldLdr = -1; + integer newLdr = -1; + integer ldr = 0; + + if (Swapped) + ldr = 1; + for (i = 0; i < l; i += aSTRIDE) + { + if (llList2Integer(Avs, i + aNUM) == ldr) + oldLdr = i; + if (llList2Key(Avs, i + aKEY) == id) + newLdr = i; + } + if (oldLdr != newLdr) + { + Avs = llListReplaceList(Avs, [ldr], newLdr + aNUM, newLdr + aNUM); + Avs = llListReplaceList(Avs, [newLdr / aSTRIDE], oldLdr + aNUM, oldLdr + aNUM); + } +d("newLeader " + llKey2Name(Leader) + ", offset " + (string) LeaderOffset + "\n" + llDumpList2String(Avs, "|")); + } + else + { + Leader = id; + LeaderOffset = 0.0; +d("newLeader NONE, offset " + (string) LeaderOffset); + } + Pose = ""; + State = ""; updateVehicle(0, vNONE, 0.0, 0.0); - checkAO(); -d("newLeader " + llKey2Name(Leader) + ", offset " + (string) LeaderOffset); } oldController(key t) @@ -1525,7 +1596,6 @@ checkSitters(integer del) return; } -stopAnims(key avatar) { if (NULL_KEY != avatar) { @@ -1613,26 +1683,12 @@ integer loadCard(string card, integer casperMode) return FALSE; } -list isPoseAO(integer f) -{ - if ("" != Pose) - { - integer p = findPose(Pose); - if (-1 != p) - { - list ps = llParseStringKeepNulls(llList2String(Poses, p + psANIM), ["|"], []); - if ("~" != llList2String(ps, f / pSTRIDE)) - return ps; - } - } - return []; -} - checkAO() { string newAnim; - integer fast; integer i; integer f; float dpth; + string oldAnim = State; integer l = llGetListLength(Avs); + integer fast = 0; integer i; integer f; float dpth; if (NULL_KEY != TheirKey) return; // doAnim = (integer) getSetting("osAnim"); @@ -1640,30 +1696,41 @@ checkAO() if (Attached) { // if (llGetAgentInfo(Owner) & AGENT_ALWAYS_RUN) fast = 1; else fast = 0; - newAnim = llGetAnimation(Owner); - vAnim = newAnim; + nextState = llGetAnimation(Owner); } - else - { // TODO - when updateControls() figures out fast mode, use that. - newAnim = vAnim; + newAnim = nextState; + if ("" != Posed) + { + s("Stopping pose " + Posed); + Posed = ""; + animSwitch(Owner, Posed); +// Posed = ""; } - if (("" == Pose) && ("0" == getSetting("AO"))) + if (("0" == getSetting("AO"))) { - stopAnims(Owner); - AOspeed = 1.0; - speed(Owner, 1.0); - return; + if ("" == nextPose) + { +// stopAnims(Owner); + AOspeed = 1.0; + speed(Owner, 1.0); + return; + } + } + if ("" != nextPose) + { + oldAnim = Pose; + newAnim = nextPose; } - string oldAnim = newAnim; -//d("checkAO() " + newAnim); + +//S("checkAO() " + oldAnim + " -> " + newAnim); AOspeed = 0.0; - integer flying = llListFindList(flyStates, [vAnim]); + integer flying = llListFindList(flyStates, [nextState]); if (-1 != flying) { float water = llWater(ZERO_VECTOR); float ground = llGround(ZERO_VECTOR); - integer fly = ("Flying" == vAnim); + integer fly = ("Flying" == nextState); // if (fly && !fast) newAnim = "FlyingSlow"; if (water > ground) // First check if we can even be under water. { @@ -1686,7 +1753,7 @@ checkAO() velocity.x = 0.0; velocity.y = 0.0; if (10 > velocity.z) velocity.z = 10; velocity.z *= -4; - if ("Swimming Up" == alias("~" +vAnim)) + if ("Swimming Up" == alias("~" +nextState)) { Bobbing++; if (3 < Bobbing) @@ -1725,7 +1792,13 @@ checkAO() AOspeed = AOspeed * (float) getSetting("speed"); if (0.0 < AOspeed) speed(Owner, AOspeed + ((AOspeed / 2) * (fast + (2 * (integer) getSetting("super"))))); else AOspeed = 1.0; - for (f = 0; f < l; f += pSTRIDE) + integer p; + if ("" != nextPose) + p = findPose(nextPose); + else + p = findPose("AO_" + nextState); + Pose = nextPose; + for (f = 0; f < l; f += aSTRIDE) { string old = oldAnim; string new = newAnim; @@ -1748,37 +1821,38 @@ checkAO() else anims = [llList2String(anims, num)]; } -//d("checkAO " + llKey2Name(id) + " " + anim + " -> " + newAnim + " @ " + (string) AOspeed + " " + Pose); - if (newAnim != anim) +//s("checkA1 " + llKey2Name(id) + " " + old + " -> " + new + " @ " + nextPose + " \n" + +//llDumpList2String(anims, "|")); + if (new != old) { - g = listFindString(states, newAnim, 2); - if (-1 != g) + // Ignore sits, since 99.99% of the time what they are sitting on supplies an animation. + if ((("Sitting" == nextState) && Attached)) + ; + else { - stopMe(id, f); - // Ignore sits, since 99.99% of the time what they are sitting on supplies an animation. - if ((("Sitting" == vAnim) && Attached) || ("" == llList2String(states, g + 1))) - ; - else - { - list newAnims = llParseString2List(llList2String(states, g + 1), ["|"], []); - // If there's more than one, randomly switch between them at random times. - i = llGetListLength(newAnims); - if (1 < i) addEvent(20.0 + llFrand(20.0), "SYNC R"); - i = (integer) llFrand((float) i); - // ZHAO II also allows multiple anims in one set, comma separated. Good idea. - anims = llCSV2List(llList2String(newAnims, i)); -//d("ANIMS " + llKey2Name(id) + " " + newAnim + " -> " + llList2String(newAnims, i)); - for (i = llGetListLength(anims) - 1; i >= 0; --i) - { - string a = llList2String(anims, i); - if (checkAnim(a)) animBegin(id, a); - } - } + // If there's more than one, randomly switch between them at random times. + i = llGetListLength(anims); + if (1 < i) addEvent(20.0 + llFrand(20.0), "SYNC R"); + i = (integer) llFrand((float) i); + // ZHAO II also allows multiple anims in one set, comma separated. Good idea. +// anims = llCSV2List(llList2String(newAnims, i)); +//S("ANIMS " + llKey2Name(id) + " " + new + " -> " + llList2String(newAnims, i)); +// for (i = llGetListLength(anims) - 1; i >= 0; --i) +// { + string a = llList2String(anims, i); +//S("ANIMS " + llKey2Name(id) + " " + new + " -> " + a); + animSwitch(id, a); + doEmote(Pose, f); +// } } Avs = llListReplaceList(Avs, [new], f + aSTATE, f + aSTATE); } } - if (("" == Pose) || ("Swimming Up" == vAnim)) addEvent(Tick * dpth, "checkAO"); + if ("" != Pose) + State = nextPose; + else + State = nextState; + if (("" == Pose) || ("Swimming Up" == State)) addEvent(Tick * dpth, "checkAO"); } stopAnims(key avatar) @@ -1838,9 +1912,12 @@ laterInit() loadCard("AOConfig", TRUE); // Casper AOs are less common. if (Attached) { - d("AO mode."); - Sitters = [Owner, -1, "", "", "", "", llGetListLength(Distances) / 3, 0]; - Pose = ""; + s("AO mode."); + if ("Sitting" != llGetAnimation(Owner)) + stopAnims(Owner); + Avs = [Owner, 0, -1, "", "", "", llGetListLength(Distances) / 3, 0]; + nextPose = ""; + nextState = ""; checkAO(); } else -- cgit v1.1