From 408f23c985a133c4177e0df964bfdc58df90a67f Mon Sep 17 00:00:00 2001 From: onefang Date: Mon, 6 Sep 2021 22:16:23 +1000 Subject: Emotes! --- 1AOor2.lsl | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 158 insertions(+), 5 deletions(-) diff --git a/1AOor2.lsl b/1AOor2.lsl index e167cd6..26cc845 100644 --- a/1AOor2.lsl +++ b/1AOor2.lsl @@ -658,9 +658,77 @@ d("RLV command requested " + llList2String(dt, 0)); addEvent(llList2Float(dt, 1), "RLV " + llDumpList2String(llList2List(dt, 2, -1), "|")); } else if ("URL" == cmd) + else if ("BUILTINS" == cmd) { - URL = data; -d("New URL " + URL); + integer l = llGetListLength(ANIMATIONS); + integer i; + string opts = ""; + string cmds = ""; + for (i = 0; i < l; i++) + { + string anim = llList2String(ANIMATIONS, i); + opts += anim + "|"; + cmds += "SINGLE_POSE " + anim + "," + anim + "|"; + } + dynamicMenu(id, menu, menu, "Choose a built in animation: ", + llGetSubString(opts, 0, -2), llGetSubString(cmds, 0, -2), 2); + return FALSE; + } + else if ("OTHERS" == cmd) + { + integer l = llGetListLength(leftOvers); + integer i; + string anim; + + if (0 == l) + { + i = llGetInventoryNumber(INVENTORY_ANIMATION); + while (i-- > 0) + { + integer j; + integer left = TRUE; + + anim = llGetInventoryName(INVENTORY_ANIMATION, i); + if (-1 == llListFindList(usedAnims, [anim])) + { + leftOvers += (list) anim; + l++; + } + } + } + leftOvers = llListSort(leftOvers, 1, TRUE); + if (0 != l) + { + string opts = ""; + string cmds = ""; + for (i = 0; i < l; i++) + { + anim = llList2String(leftOvers, i); + opts += anim + "|"; + cmds += "SINGLE_POSE " + anim + "," + anim + "|"; + } + dynamicMenu(id, menu, "", "Choose a pose: ", + llGetSubString(opts, 0, -2), llGetSubString(cmds, 0, -2), 2); + return FALSE; + } + else + s("No left over poses."); + } + else if ("SINGLE_POSE" == cmd) + { + list p = llParseStringKeepNulls(data, [","], []); + if ("" != Posed) + animEnd(Owner, Posed); + Posed = llList2String(p, 1); + animSwitch(Owner, Posed); + } + else if ("STOP_ALL" == cmd) + { + nextPose = ""; + Posed = ""; + Pose = ""; + State = ""; + stopAnims(Owner); } else if ("▲" == cmd) { @@ -779,14 +847,22 @@ list AOspeedNames = list flyStates; list initialStates; // "Taking Off", "hover_up", list ANIMATIONS; +list usedAnims; +list leftOvers; -integer checkAnim(string a) +integer checkAnim(string a, integer add) { - if (("" != a) && (NULL_KEY == llGetInventoryKey(a)) && (-1 == llListFindList(ANIMATIONS, [a]))) + if (("" != a) && (INVENTORY_ANIMATION != llGetInventoryType(a)) + && (-1 == llListFindList(ANIMATIONS, [a]))) { - s(Owner, "Missing animation - " + a + "!"); + S("Missing animation - " + a + "!"); return FALSE; } + if (add) + { + if (-1 == llListFindList(usedAnims, [a])) + usedAnims += [a]; + } return TRUE; } @@ -887,6 +963,82 @@ readPos(list cards) integer findPose(string name) {return listFindString(Poses, name, psSTRIDE);} +list splitEmote(string anim) +{ + integer p = llSubStringIndex(anim, "::"); + + if (-1 != p) + return [llGetSubString(anim, 0, p - 1), llGetSubString(anim, p + 2, -1)]; + else + return [anim, ""]; +} + +list collectEmotes(string anim) +{ + list anims = []; + list emotes = []; + list nA = llParseStringKeepNulls(anim, ["|"], []); + integer m = llGetListLength(nA); + integer j; + for (j = 0; j < m; ++j) + { + list an = llCSV2List(llList2String(nA, j)); + integer n = llGetListLength(an); + integer k; + string anms = ""; + string emts = ""; + for (k = 0; k < n; ++k) + { + list ae = splitEmote(llList2String(an, k)); + string a = llList2String(ae, 0); + string e = llList2String(ae, 1); + integer er = FALSE; + + // Coz LSL doesn't short circuit, and we don't want to checkAnim("~") + if ("~" == a) + er = TRUE; + else if (checkAnim(a, TRUE)) + er = TRUE; + if (er) + { + anms += "," + a; + if ("" != e) + emts += "," + e; + } + } + anims += [llGetSubString(anms, 1, -1)]; + emotes += [llGetSubString(emts, 1, -1)]; + } + return [llDumpList2String(anims, "|"), llDumpList2String(emotes, "|")]; +} + +doEmote(string pose, integer f) +{ + integer i = findPose(pose); + + if (-1 != i) + { + list e = llParseStringKeepNulls(llList2String(Poses, i + psEMOTE), ["|"], []); + if ([] != e) + { + string em = llList2String(e, llList2Integer(Avs, f + aNUM)); + if ("" != em) + { + // NOTE - this one is splitting emote::time + list s = splitEmote(em); + string t = llList2String(s, 1); + key k = llList2Key(Avs, f + aKEY); + + animEnd(k , llList2Key(s, 0)); + animBegin(k , llList2Key(s, 0)); + if ("" == t) + t = "1.0"; + addEvent((float) t, "EMOTE " + k); + } + } + } +} + savePose(string name, string anim, string exp, string posRot) { integer f = findPose(name); @@ -902,6 +1054,7 @@ savePose(string name, string anim, string exp, string posRot) Poses = llListReplaceList(Poses, [name, anim, exp, posRot], f, f + psSTRIDE - 1); else Poses += [name, anim, exp, posRot]; + Poses = llListReplaceList(Poses, collectEmotes(anim), f + psANIM, f + psEMOTE); } list reportPose() -- cgit v1.1