aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authoronefang2021-09-06 21:58:36 +1000
committeronefang2021-09-06 21:58:36 +1000
commitc1163cb3ff907a91205b8de553430b0cdfabe375 (patch)
tree946214e8a07c498d30938674152da80a1ad05fc6
parentMove auto prefix generation until after the configured prefix might have been... (diff)
download1ring-c1163cb3ff907a91205b8de553430b0cdfabe375.zip
1ring-c1163cb3ff907a91205b8de553430b0cdfabe375.tar.gz
1ring-c1163cb3ff907a91205b8de553430b0cdfabe375.tar.bz2
1ring-c1163cb3ff907a91205b8de553430b0cdfabe375.tar.xz
Rip it a new one. Er replace Sitters "structure" with Avs.
-rw-r--r--1AOor2.lsl286
1 files 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
309 if (-1 != set) setSetting(id, fr + cmd, data, fINT); else S("Unknown setting '" + cmd); 309 if (-1 != set) setSetting(id, fr + cmd, data, fINT); else S("Unknown setting '" + cmd);
310 } 310 }
311 if ((fr != (ScriptName + ".") && ("*." != fr))) return TRUE; 311 if ((fr != (ScriptName + ".") && ("*." != fr))) return TRUE;
312 integer st = findSitter(id); 312 integer av = findAvatar(id);
313 integer f; 313 integer f;
314 string menu; 314 string menu;
315 f = llSubStringIndex(button, "->"); 315 f = llSubStringIndex(button, "->");
@@ -355,37 +355,37 @@ integer doThing(key id, string button, string fr, string cmd, string data, integ
355 } 355 }
356 else if ("LESS_-" == cmd) 356 else if ("LESS_-" == cmd)
357 { 357 {
358 integer distance = llList2Integer(Sitters, st + pDIST); 358 integer distance = llList2Integer(Avs, av + aDIST);
359 --distance; 359 --distance;
360 if (0 > distance) distance = 0; 360 if (0 > distance) distance = 0;
361 Sitters = llListReplaceList(Sitters, [distance], st + pDIST, st + pDIST); 361 Avs = llListReplaceList(Avs, [distance], av + aDIST, av + aDIST);
362 showMenu(id); 362 showMenu(id);
363 return FALSE; 363 return FALSE;
364 } 364 }
365 else if ("MORE_+" == cmd) 365 else if ("MORE_+" == cmd)
366 { 366 {
367 integer distance = llList2Integer(Sitters, st + pDIST); 367 integer distance = llList2Integer(Avs, av + aDIST);
368 ++distance; 368 ++distance;
369 if (llGetListLength(Distances) <= distance) distance = llGetListLength(Distances) - 1; 369 if (llGetListLength(Distances) <= distance) distance = llGetListLength(Distances) - 1;
370 Sitters = llListReplaceList(Sitters, [distance], st + pDIST, st + pDIST); 370 Avs = llListReplaceList(Avs, [distance], av + aDIST, av + aDIST);
371 showMenu(id); 371 showMenu(id);
372 return FALSE; 372 return FALSE;
373 } 373 }
374 else if ("NEXT_AVATAR" == cmd) 374 else if ("NEXT_AVATAR" == cmd)
375 { 375 {
376 key them = llList2Key(Sitters, st + pADJ); 376 key them = llList2Key(Avs, av + aADJ);
377 integer t = findSitter(them); 377 integer t = findAvatar(them);
378 if (-1 != t) 378 if (-1 != t)
379 { 379 {
380 t += pSTRIDE; 380 t += aSTRIDE;
381 if (llGetListLength(Sitters) <= t) 381 if (llGetListLength(Avs) <= t)
382 t = -1; 382 t = -1;
383 } 383 }
384 else t = 0; 384 else t = 0;
385 if (-1 != t) 385 if (-1 != t)
386 Sitters = llListReplaceList(Sitters, [llList2Key(Sitters, t + pKEY)], st + pADJ, st + pADJ); 386 Avs = llListReplaceList(Avs, [llList2Key(Avs, t + aKEY)], av + aADJ, av + aADJ);
387 else 387 else
388 Sitters = llListReplaceList(Sitters, [ScriptKey], st + pADJ, st + pADJ); 388 Avs = llListReplaceList(Avs, [ScriptKey], av + aADJ, av + aADJ);
389 showMenu(id); 389 showMenu(id);
390 return FALSE; 390 return FALSE;
391 } 391 }
@@ -395,27 +395,21 @@ integer doThing(key id, string button, string fr, string cmd, string data, integ
395 { 395 {
396 integer i = llSubStringIndex(cmd, "_"); 396 integer i = llSubStringIndex(cmd, "_");
397 if (-1 != i) cmd = llGetSubString(cmd, 0, i - 1) + " " + llGetSubString(cmd, i + 1, -1); 397 if (-1 != i) cmd = llGetSubString(cmd, 0, i - 1) + " " + llGetSubString(cmd, i + 1, -1);
398 adjust(id, llList2Float(Distances, llList2Integer(Sitters, st + pDIST)), llToLower(cmd)); 398 adjust(id, llList2Float(Distances, llList2Integer(Avs, av + aDIST)), llToLower(cmd));
399 } 399 }
400 else if ("AO" == cmd) 400 else if ("AO" == cmd)
401 { 401 {
402 if ("0" != data) 402 if ("0" != data)
403 { 403 {
404 integer l = llGetListLength(Sitters); 404 integer l = llGetListLength(Avs);
405 Pose = ""; 405 nextState = "";
406 for (f = 0; f < l; f += pSTRIDE) 406 for (f = 0; f < l; f += aSTRIDE)
407 updateSitter(llList2Key(Sitters, f + pKEY)); 407 updateAvatar(llList2Key(Avs, f + aKEY));
408 } 408 }
409 checkAO(); 409 checkAO();
410 } 410 }
411 else if ("SYNC" == cmd) 411 else if ("SYNC" == cmd)
412 { 412 {
413 integer l = llGetListLength(Sitters);
414 for (f = 0; f < l; f += pSTRIDE)
415 {
416 if (("R" != data) || (0 == llGetListLength(isPoseAO(f))))
417 Sitters = llListReplaceList(Sitters, [""], f + pSTATE, f + pSTATE);
418 }
419 if ("R" != data) 413 if ("R" != data)
420 vAnim = data; 414 vAnim = data;
421 checkAO(); 415 checkAO();
@@ -643,11 +637,11 @@ d("New URL " + URL);
643 Chosen = -1; 637 Chosen = -1;
644 else 638 else
645 { 639 {
646 if (-1 != st) 640 if (-1 != av)
647 { 641 {
648 if ("" != llList2Key(Sitters, st + pADJ)) 642 if ("" != llList2Key(Avs, av + aADJ))
649 { 643 {
650 Sitters = llListReplaceList(Sitters, [""], st + pADJ, st + pADJ); 644 Avs = llListReplaceList(Avs, [""], av + aADJ, av + aADJ);
651 s(id, "Switched out of adjusting mode."); 645 s(id, "Switched out of adjusting mode.");
652 addEvent(Tick * Smooth, "Keys"); 646 addEvent(Tick * Smooth, "Keys");
653 } 647 }
@@ -689,17 +683,17 @@ string HoverText = "loveness";
689string Sit0Text = "carry them"; 683string Sit0Text = "carry them";
690string Sit1Text = "be carried"; 684string Sit1Text = "be carried";
691 685
692// DrivableBox 686// DrivableBox and AO
693list Sitters = []; 687list Avs = [];
694integer pKEY = 0; // Key of the sitter. 688integer aKEY = 0; // Key of the avatar.
695integer pLINK = 1; // The "prim" link the sitter is. 689integer aNUM = 1; // Number of the sitter, index into Poses[].psANIM and Poses[].psPOSROT
696integer pSTATE = 2; // The current AOstate for this person. 690integer aLINK = 2; // The "prim" link the avatar is.
697integer pNEW = 3; // New state for this person. 691integer aSTATE = 3; // AO / Pose state for this person.
698integer pANIMS = 4; // Current set of animations for this person. 692integer aANIM = 4; // Current animation for this avatar.
699integer pADJ = 5; // Key of who they are adjusting, "" means not adjusting, NULL_KEY will mean adjust all. 693integer aADJ = 5; // Key of who they are adjusting, "" means not adjusting, NULL_KEY will mean adjust all.
700integer pDIST = 6; // For the adjusting this person is doing, not for who they are adjusting. 694integer aDIST = 6; // For the adjusting this avatar is doing, not for who they are adjusting. Index into Distances[].
701integer pKEYS = 7; // KeysLevel for this sitter. 695integer aKEYS = 7; // KeysLevel for this avatar. Mostly needed for held down keys I think?
702integer pSTRIDE = 8; 696integer aSTRIDE = 8;
703list Poses; // List of poses. 697list Poses; // List of poses.
704integer psNAME = 0; // Name of pose. 698integer psNAME = 0; // Name of pose.
705integer psANIM = 1; // | separated animations. 699integer psANIM = 1; // | separated animations.
@@ -763,7 +757,7 @@ integer checkAnim(string a)
763newPose(key id, string p, list ps) 757newPose(key id, string p, list ps)
764{ 758{
765 integer f = findPose(p); 759 integer f = findPose(p);
766 integer l = llGetListLength(Sitters); 760 integer l = llGetListLength(Avs);
767 if (-1 != f) 761 if (-1 != f)
768 { 762 {
769 setSetting(id, "AO", "0", fINT); 763 setSetting(id, "AO", "0", fINT);
@@ -775,7 +769,7 @@ newPose(key id, string p, list ps)
775 } 769 }
776} 770}
777 771
778integer findSitter(key id) {return listFindString(Sitters, id, pSTRIDE);} 772integer findAvatar(key id) {return listFindString(Avs, id, aSTRIDE);}
779 773
780string prStr(string str) 774string prStr(string str)
781{ 775{
@@ -957,7 +951,7 @@ doControl(key id, integer level, integer edge)
957 integer f = findSitter(id); 951 integer f = findSitter(id);
958 if (-1 != f) 952 if (-1 != f)
959 { 953 {
960 integer a = ("" != llList2Key(Sitters, f + pADJ)); 954 integer a = ("" != llList2Key(Avs, f + aADJ));
961 if ((held == (CONTROL_BACK | CONTROL_FWD)) || 955 if ((held == (CONTROL_BACK | CONTROL_FWD)) ||
962 (held == (CONTROL_DOWN | CONTROL_UP)) || 956 (held == (CONTROL_DOWN | CONTROL_UP)) ||
963 (held == (CONTROL_LEFT | CONTROL_RIGHT)) || 957 (held == (CONTROL_LEFT | CONTROL_RIGHT)) ||
@@ -969,7 +963,7 @@ doControl(key id, integer level, integer edge)
969 { 963 {
970 if (a) 964 if (a)
971 { 965 {
972 Sitters = llListReplaceList(Sitters, [""], f + pADJ, f + pADJ); 966 Avs = llListReplaceList(Avs, [""], f + aADJ, f + aADJ);
973 s(id, "Switched out of adjusting mode."); 967 s(id, "Switched out of adjusting mode.");
974 addEvent(Tick * Smooth, "Keys"); 968 addEvent(Tick * Smooth, "Keys");
975 } 969 }
@@ -985,7 +979,7 @@ doControl(key id, integer level, integer edge)
985 HeldKeys = 0; 979 HeldKeys = 0;
986 level = 0; 980 level = 0;
987 } 981 }
988 Sitters = llListReplaceList(Sitters, [level], f + pKEYS, f + pKEYS); 982 Avs = llListReplaceList(Avs, [level], f + aKEYS, f + aKEYS);
989 if (0 != edge) ControlTime = llGetTimeOfDay(); 983 if (0 != edge) ControlTime = llGetTimeOfDay();
990 if (level != LevelKeys) 984 if (level != LevelKeys)
991 updateControls(); 985 updateControls();
@@ -1001,13 +995,13 @@ updateControls()
1001{ 995{
1002 if (Attached) return; 996 if (Attached) return;
1003 integer mode = vNONE; integer reverse = 1; float speed = 0.0; float rot = 0.0; 997 integer mode = vNONE; integer reverse = 1; float speed = 0.0; float rot = 0.0;
1004 integer l = llGetListLength(Sitters); integer i; 998 integer l = llGetListLength(Avs); integer i;
1005 integer keys; 999 integer keys;
1006 for (i = l - pSTRIDE; i >= 0; i -= pSTRIDE) 1000 for (i = l - aSTRIDE; i >= 0; i -= aSTRIDE)
1007 { 1001 {
1008 key k = llList2Key(Sitters, i + pKEY); 1002 key k = llList2Key(Avs, i + aKEY);
1009 keys = llList2Integer(Sitters, i + pKEYS); 1003 keys = llList2Integer(Avs, i + aKEYS);
1010 if ("" == llList2Key(Sitters, i + pADJ)) 1004 if ("" == llList2Key(Avs, i + aADJ))
1011 { 1005 {
1012 if (keys & (CONTROL_DOWN |CONTROL_UP)) mode = vUP; 1006 if (keys & (CONTROL_DOWN |CONTROL_UP)) mode = vUP;
1013 if (keys & (CONTROL_BACK | CONTROL_FWD)) mode = vFWD; 1007 if (keys & (CONTROL_BACK | CONTROL_FWD)) mode = vFWD;
@@ -1024,7 +1018,7 @@ updateControls()
1024 } 1018 }
1025 else 1019 else
1026 { 1020 {
1027 float d = llList2Float(Distances, llList2Integer(Sitters, i + pDIST)); 1021 float d = llList2Float(Distances, llList2Integer(Avs, i + aDIST));
1028 if (keys & CONTROL_FWD) adjust(k, d, "forward"); 1022 if (keys & CONTROL_FWD) adjust(k, d, "forward");
1029 if (keys & CONTROL_BACK) adjust(k, d, "backwards"); 1023 if (keys & CONTROL_BACK) adjust(k, d, "backwards");
1030 if (keys & CONTROL_LEFT) adjust(k, d, "left"); 1024 if (keys & CONTROL_LEFT) adjust(k, d, "left");
@@ -1044,7 +1038,7 @@ updateControls()
1044 1038
1045adjust(key id, float dist, string direction) 1039adjust(key id, float dist, string direction)
1046{ 1040{
1047 integer f = findSitter(id); 1041 integer f = findAvatar(id);
1048 integer i = -1; 1042 integer i = -1;
1049 list p; 1043 list p;
1050 i = findPose(Pose); 1044 i = findPose(Pose);
@@ -1054,27 +1048,28 @@ adjust(key id, float dist, string direction)
1054 return; 1048 return;
1055 if (-1 != f) 1049 if (-1 != f)
1056 { 1050 {
1057 key them = llList2Key(Sitters, f + pADJ); 1051 key them = llList2Key(Avs, f + aADJ);
1058 integer l; integer t; 1052 integer l; integer t;
1059 if (ScriptKey == them) 1053 if (ScriptKey == them)
1060 { 1054 {
1061 t = 0; 1055 t = 0;
1062 l = llGetListLength(Sitters); 1056 l = llGetListLength(Avs);
1063 } 1057 }
1064 else 1058 else
1065 { 1059 {
1066 t = findSitter(them); 1060 t = findAvatar(them);
1067 l = t + pSTRIDE; 1061 l = t + aSTRIDE;
1068 } 1062 }
1069 if (-1 != t) 1063 if (-1 != t)
1070 { 1064 {
1071 if (("turn left" == direction) || ("turn right" == direction)) dist = dist * 90.0; 1065 if (("turn left" == direction) || ("turn right" == direction)) dist = dist * 90.0;
1072 for (; t < l; t += pSTRIDE) 1066 for (; t < l; t += aSTRIDE)
1073 { 1067 {
1074 them = llList2Key(Sitters, t + pKEY); 1068 them = llList2Key(Avs, t + aKEY);
1075 integer lnk = llList2Integer(Sitters, t + pLINK); 1069 integer num = llList2Integer(Avs, t + aNUM);
1070 integer lnk = llList2Integer(Avs, t + aLINK);
1076 if (-1 == lnk) return; 1071 if (-1 == lnk) return;
1077 string prn = llList2String(p, t / pSTRIDE); 1072 string prn = llList2String(p, num);
1078 integer ix = llSubStringIndex(prn, ">"); 1073 integer ix = llSubStringIndex(prn, ">");
1079 vector pos = (vector) llGetSubString(prn, 0, ix); 1074 vector pos = (vector) llGetSubString(prn, 0, ix);
1080 vector rot = (vector) llGetSubString(prn, ix + 1, -1); 1075 vector rot = (vector) llGetSubString(prn, ix + 1, -1);
@@ -1086,9 +1081,9 @@ adjust(key id, float dist, string direction)
1086 else if ("down" == direction) pos.z = pos.z - dist; 1081 else if ("down" == direction) pos.z = pos.z - dist;
1087 else if ("turn left" == direction) rot.z = rot.z + (dist); 1082 else if ("turn left" == direction) rot.z = rot.z + (dist);
1088 else if ("turn right" == direction) rot.z = rot.z - (dist); 1083 else if ("turn right" == direction) rot.z = rot.z - (dist);
1089 p = llListReplaceList(p, [vround(pos, rot)], t / pSTRIDE, t / pSTRIDE); 1084 p = llListReplaceList(p, [vround(pos, rot)], num, num);
1090 Poses = llListReplaceList(Poses, [llDumpList2String(p, "|")], i + psPOSROT, i + psPOSROT); 1085 Poses = llListReplaceList(Poses, [llDumpList2String(p, "|")], i + psPOSROT, i + psPOSROT);
1091 updateSitter(them); 1086 updateAvatar(them);
1092 s(id, llKey2Name(id) + " adjusts " + llKey2Name(them) + " by " + (string) dist + " " + direction); 1087 s(id, llKey2Name(id) + " adjusts " + llKey2Name(them) + " by " + (string) dist + " " + direction);
1093 if (id != them) 1088 if (id != them)
1094 s(them, llKey2Name(id) + " adjusts " + llKey2Name(them) + " by " + (string)dist + " " + direction); 1089 s(them, llKey2Name(id) + " adjusts " + llKey2Name(them) + " by " + (string)dist + " " + direction);
@@ -1097,20 +1092,21 @@ adjust(key id, float dist, string direction)
1097 } 1092 }
1098} 1093}
1099 1094
1100updateSitter(key id) 1095updateAvatar(key id)
1101{ // Written by Strife Onizuka, size adjustment provided by Talarus Luan 1096{ // Written by Strife Onizuka, size adjustment provided by Talarus Luan
1102 // Using this while the object is moving may give unpredictable results. 1097 // Using this while the object is moving may give unpredictable results.
1103 integer f = findSitter(id); 1098 integer f = findAvatar(id);
1104 if (-1 != f) 1099 if (-1 != f)
1105 { 1100 {
1106 integer lnk = llList2Integer(Sitters, f + pLINK); 1101 integer lnk = llList2Integer(Avs, f + aLINK);
1107 if (-1 == lnk) return; 1102 if (-1 == lnk) return;
1103 integer num = llList2Integer(Avs, f + aNUM);
1108 vector pos = position; 1104 vector pos = position;
1109 rotation rot = llEuler2Rot(rotat * DEG_TO_RAD); 1105 rotation rot = llEuler2Rot(rotat * DEG_TO_RAD);
1110 integer i = findPose(Pose); 1106 integer i = findPose(Pose);
1111 if (-1 != i) 1107 if (-1 != i)
1112 { 1108 {
1113 string prn = llList2String(llParseStringKeepNulls(llList2String(Poses, i + psPOSROT), ["|"], []), f / pSTRIDE); 1109 string prn = llList2String(llParseStringKeepNulls(llList2String(Poses, i + psPOSROT), ["|"], []), num);
1114 integer ix = llSubStringIndex(prn, ">"); 1110 integer ix = llSubStringIndex(prn, ">");
1115// TODO - might be wrong, coz rotations are hard, m'kay. 1111// TODO - might be wrong, coz rotations are hard, m'kay.
1116 pos = (vector) llGetSubString(prn, 0, ix); 1112 pos = (vector) llGetSubString(prn, 0, ix);
@@ -1143,16 +1139,16 @@ updateSitter(key id)
1143 1139
1144showMenu(key id) 1140showMenu(key id)
1145{ 1141{
1146 integer f = findSitter(id); 1142 integer f = findAvatar(id);
1147 if (-1 != f) 1143 if (-1 != f)
1148 { 1144 {
1149 key them = llList2Key(Sitters, f + pADJ); 1145 key them = llList2Key(Avs, f + aADJ);
1150 string name; 1146 string name;
1151 integer distance = llList2Integer(Sitters, f + pDIST); 1147 integer distance = llList2Integer(Avs, f + aDIST);
1152 if ("" == them) 1148 if ("" == them)
1153 { 1149 {
1154 them = id; 1150 them = id;
1155 Sitters = llListReplaceList(Sitters, [them], f + pADJ, f + pADJ); 1151 Avs = llListReplaceList(Avs, [them], f + aADJ, f + aADJ);
1156 s(id, "Switched to adjusting mode. Click 'â–² Exit' on the adjusting menu to switch back to moving."); 1152 s(id, "Switched to adjusting mode. Click 'â–² Exit' on the adjusting menu to switch back to moving.");
1157 } 1153 }
1158 if (ScriptKey == them) 1154 if (ScriptKey == them)
@@ -1341,20 +1337,20 @@ updateVehicle(integer keys, integer mode, float move, float rotate)
1341 else if (0.0 > cr.y) {if (-0.3 > cr.y) cr.y = -1.0; else cr.y = 0.0;} 1337 else if (0.0 > cr.y) {if (-0.3 > cr.y) cr.y = -1.0; else cr.y = 0.0;}
1342 } 1338 }
1343 isEdge = llEdgeOfWorld(gp, cr); 1339 isEdge = llEdgeOfWorld(gp, cr);
1344 integer l = llGetListLength(Sitters); 1340 integer l = llGetListLength(Avs);
1345 integer i; 1341 integer i;
1346 for (i = 0; i < l; i += pSTRIDE) 1342 for (i = 0; i < l; i += aSTRIDE)
1347 { 1343 {
1348 key a = llList2Key(Sitters, i); 1344 key a = llList2Key(Avs, i + aKEY);
1349 key t = llList2Key(Sitters, i + pADJ); 1345 key t = llList2Key(Avs, i + aADJ);
1350 if (isEdge) 1346 if (isEdge)
1351 { 1347 {
1352 Sitters = llListReplaceList(Sitters, [a], i + pADJ, i + pADJ); 1348 Avs = llListReplaceList(Avs, [a], i + aADJ, i + aADJ);
1353 adjust(a, move, "forward"); 1349 adjust(a, move, "forward");
1354 Sitters = llListReplaceList(Sitters, [t], i + pADJ, i + pADJ); 1350 Avs = llListReplaceList(Avs, [t], i + aADJ, i + aADJ);
1355 } 1351 }
1356 else 1352 else
1357 llSetLinkPrimitiveParamsFast(llList2Integer(Sitters, i + pLINK), 1353 llSetLinkPrimitiveParamsFast(llList2Integer(Avs, i + aLINK),
1358 [PRIM_POS_LOCAL, <-1.0, 0.0, -0.0001>]); 1354 [PRIM_POS_LOCAL, <-1.0, 0.0, -0.0001>]);
1359 } 1355 }
1360 } 1356 }
@@ -1430,55 +1426,65 @@ checkSitters(integer del)
1430 integer lnk; 1426 integer lnk;
1431 for (lnk = llGetObjectPrimCount(llGetKey()) + 1; lnk <= l; ++lnk) 1427 for (lnk = llGetObjectPrimCount(llGetKey()) + 1; lnk <= l; ++lnk)
1432 new += [llGetLinkKey(lnk), lnk]; 1428 new += [llGetLinkKey(lnk), lnk];
1433 l = llGetListLength(Sitters); 1429 l = llGetListLength(Avs);
1434 for (lnk = 0; lnk < l; lnk += pSTRIDE) 1430 if (0 != l)
1435 { 1431 {
1436 key t = llList2Key(Sitters, lnk + pKEY); 1432 for (lnk = 0; lnk < l; lnk += aSTRIDE)
1437 if (NULL_KEY != t)
1438 { 1433 {
1439 integer j = listFindString(new, t, 2); 1434 key t = llList2Key(Avs, lnk + aKEY);
1440 1435 if (NULL_KEY != t)
1441 if (-1 == j) // old sitter that left
1442 { 1436 {
1443 d("unsit " + llKey2Name(t)); 1437 integer j = listFindString(new, t, 2);
1444 stopMe(t, lnk); 1438
1445 oldController(t); 1439 if (-1 == j) // old sitter that left
1446 Sitters = llListReplaceList(Sitters, [NULL_KEY], lnk + pKEY, lnk + pKEY); 1440 {
1441 d("unsit " + llKey2Name(t));
1442 stopAnims(t);
1443 oldController(t);
1444 Avs = llListReplaceList(Avs, [NULL_KEY, -1, -1], lnk + aKEY, lnk + aLINK);
1445 }
1446 else // old sitter that is still here
1447 {
1448 Avs = llListReplaceList(Avs, [llList2Integer(new, j + 1)], lnk + aLINK, lnk + aLINK);
1449 new = llListReplaceList(new, [], j, j + 1);
1450 }
1447 } 1451 }
1448 else // old sitter that is still here
1449 new = llListReplaceList(new, [], j, j + 1);
1450 } 1452 }
1451 } 1453 }
1452 l = llGetListLength(new) / 2; 1454 l = llGetListLength(new);
1453 for (lnk = 0; lnk < l; lnk +=2) 1455 for (lnk = 0; lnk < l; lnk +=2)
1454 { 1456 {
1455 key t = llList2Key(new, lnk); 1457 key t = llList2Key(new, lnk);
1456 list n = [t, llList2Integer(new, lnk + 1), "", "", "", "", llGetListLength(Distances) / 3, 0]; 1458 list n = [t, -1, llList2Integer(new, lnk + 1), "", "", "", llGetListLength(Distances) / 3, 0];
1457 list gndr = llGetObjectDetails(t, [OBJECT_BODY_SHAPE_TYPE]); 1459 list gndr = llGetObjectDetails(t, [OBJECT_BODY_SHAPE_TYPE]);
1458 stopAnims(t); 1460 stopAnims(t);
1459 integer f = findSitter(NULL_KEY); 1461 integer f = findAvatar(NULL_KEY);
1460 if (-1 != f) // new sitter replaces old 1462 if (-1 != f) // new sitter replaces old
1461 Sitters = llListReplaceList(Sitters, n, f, f + pSTRIDE - 1); 1463 Avs = llListReplaceList(Avs, n, f, f + aSTRIDE - 1);
1462 else // new sitter added on end 1464 else // new sitter added on end
1463 Sitters += n; 1465 Avs += n;
1464 if (NULL_KEY != BossKey) sendPrim(BossKey, "SIT_DONE", [t]); 1466 if (NULL_KEY != BossKey) sendPrim(BossKey, "SIT_DONE", [t]);
1465 d("sat " + llKey2Name(t) + ", " + llList2String(gndr, 0) + " male @ " + (f / pSTRIDE)); 1467 d("sat " + llKey2Name(t) + ", " + llList2String(gndr, 0) + " male @ " + (f / aSTRIDE));
1466 } 1468 }
1467 1469
1468 // Wearer is the default leader, unless anyone is taller. 1470 // Wearer is the default leader, unless anyone is taller.
1469 l = llGetListLength(Sitters); 1471 l = llGetListLength(Avs);
1470 integer m = l / pSTRIDE; 1472 integer m = l / aSTRIDE;
1471 integer ldr = findSitter(Owner); 1473 integer ldr = findAvatar(Owner);
1472 float max = 0.0; 1474 float max = 0.0;
1473 if (-1 != ldr) 1475 if (-1 != ldr)
1474 { 1476 {
1475 vector s = llGetAgentSize(Owner); 1477 vector s = llGetAgentSize(Owner);
1476 max = s.z; 1478 max = s.z;
1477 } 1479 }
1478 for (lnk = 0; lnk < l; lnk += pSTRIDE) 1480 Controller = NULL_KEY;
1481 for (lnk = 0; lnk < l; lnk += aSTRIDE)
1479 { 1482 {
1480 key t = llList2Key(Sitters, lnk + pKEY); 1483 key t = llList2Key(Avs, lnk + aKEY);
1481 vector s = llGetAgentSize(t); 1484 vector s = llGetAgentSize(t);
1485 Avs = llListReplaceList(Avs, [lnk / aSTRIDE], lnk + aNUM, lnk + aNUM);
1486 if ((NULL_KEY == Controller) && (Owner != t))
1487 Controller = t;
1482 if (s.z > max) 1488 if (s.z > max)
1483 { 1489 {
1484 max = s.z; 1490 max = s.z;
@@ -1486,29 +1492,19 @@ checkSitters(integer del)
1486 } 1492 }
1487 if (NULL_KEY == t) --m; 1493 if (NULL_KEY == t) --m;
1488 } 1494 }
1489 if ((0 != ldr) && (0 != llGetListLength(Sitters)))
1490 {
1491 list s = llList2List(Sitters, ldr, ldr + pSTRIDE - 1);
1492 Sitters = s + llListReplaceList(Sitters, [], ldr, ldr + pSTRIDE - 1);
1493 }
1494 newLeader(llList2Key(Sitters, pKEY));
1495 llSitTarget(position, llEuler2Rot(rotat * DEG_TO_RAD));
1496 Controller = NULL_KEY;
1497 for (lnk = 0; lnk < l; lnk += pSTRIDE)
1498 {
1499 updateSitter(llList2Key(Sitters, lnk + pKEY));
1500 key t = llList2Key(Sitters, lnk + pKEY);
1501 if ((NULL_KEY == Controller) && (Owner != t))
1502 Controller = t;
1503 }
1504 if (NULL_KEY != Controller) 1495 if (NULL_KEY != Controller)
1505 { 1496 {
1506 d("checkSitters() requesting camera and controls from " + llKey2Name(Controller)); 1497 d("checkSitters() requesting camera and controls from " + llKey2Name(Controller));
1507 llRequestPermissions(Controller, PERMISSION_CONTROL_CAMERA | PERMISSION_TAKE_CONTROLS); 1498 llRequestPermissions(Controller, PERMISSION_CONTROL_CAMERA | PERMISSION_TAKE_CONTROLS);
1508 } 1499 }
1509 llSetSitText(Sit0Text); llSetTouchText("menu"); llSetClickAction(CLICK_ACTION_SIT); 1500 if (-1 != ldr)
1510 llSetText(HoverText, <1.0, 1.0, 1.0>, 1.0); 1501 newLeader(llList2Key(Avs, ldr + aKEY));
1511 if (0 == m) 1502 else
1503 checkAO();
1504//for (lnk = 0; lnk < l; lnk += aSTRIDE)
1505// S(llKey2Name(llList2Key(Avs, lnk + aKEY)) + " is number " + llList2String(Avs, lnk + aNUM));
1506 for (lnk = 0; lnk < l; lnk += aSTRIDE)
1507 updateAvatar(llList2Key(Avs, lnk + aKEY));
1512 { 1508 {
1513 if (del) 1509 if (del)
1514 { 1510 {
@@ -1635,8 +1631,8 @@ list isPoseAO(integer f)
1635checkAO() 1631checkAO()
1636{ 1632{
1637 string newAnim; 1633 string newAnim;
1638 integer l = llGetListLength(Sitters);
1639 integer fast; integer i; integer f; float dpth; 1634 integer fast; integer i; integer f; float dpth;
1635 integer l = llGetListLength(Avs);
1640 if (NULL_KEY != TheirKey) return; 1636 if (NULL_KEY != TheirKey) return;
1641 1637
1642// doAnim = (integer) getSetting("osAnim"); 1638// doAnim = (integer) getSetting("osAnim");
@@ -1731,16 +1727,26 @@ checkAO()
1731 else AOspeed = 1.0; 1727 else AOspeed = 1.0;
1732 for (f = 0; f < l; f += pSTRIDE) 1728 for (f = 0; f < l; f += pSTRIDE)
1733 { 1729 {
1734 string anim = llList2String(Sitters, f + pSTATE); 1730 string old = oldAnim;
1735 list anims = llCSV2List(llList2String(Sitters, f + pANIMS)); 1731 string new = newAnim;
1736 integer g; 1732 list anims = llParseString2List(llList2String(Poses, p + psANIM), ["|"], []);
1737 list states = States; 1733 key id = llList2Key(Avs, f + aKEY);
1738 key id = llList2Key(Sitters, f + pKEY); 1734 integer num = llList2Integer(Avs, f + aNUM);
1739 list ps = isPoseAO(f); 1735//s("checkAO " + llKey2Name(id) + " " + old + " -> " + new + " @ " + nextPose + " \n" +
1740 if (0 != llGetListLength(ps)) 1736//llDumpList2String(anims, "|"));
1737
1738 if ("" != nextPose)
1741 { 1739 {
1742 states = [Pose, llList2String(ps, f / pSTRIDE)]; 1740 if ("~" == llList2String(anims, num))
1743 newAnim = Pose; 1741 {
1742//s("POSE " + llKey2Name(id) + " nextState = " + nextState);
1743 integer q = findPose("AO_" + nextState);
1744 anims = llParseString2List(llList2String(Poses, q + psANIM), ["|"], []);
1745 old = llList2String(Avs, f + aSTATE);
1746 new = nextState;
1747 }
1748 else
1749 anims = [llList2String(anims, num)];
1744 } 1750 }
1745//d("checkAO " + llKey2Name(id) + " " + anim + " -> " + newAnim + " @ " + (string) AOspeed + " " + Pose); 1751//d("checkAO " + llKey2Name(id) + " " + anim + " -> " + newAnim + " @ " + (string) AOspeed + " " + Pose);
1746 if (newAnim != anim) 1752 if (newAnim != anim)
@@ -1769,21 +1775,27 @@ checkAO()
1769 } 1775 }
1770 } 1776 }
1771 } 1777 }
1772 anim = newAnim; 1778 Avs = llListReplaceList(Avs, [new], f + aSTATE, f + aSTATE);
1773 } 1779 }
1774 Sitters = llListReplaceList(Sitters, [anim, anim, llDumpList2String(anims, ",")], f + pSTATE, f + pANIMS);
1775 newAnim = oldAnim;
1776 } 1780 }
1777 if (("" == Pose) || ("Swimming Up" == vAnim)) addEvent(Tick * dpth, "checkAO"); 1781 if (("" == Pose) || ("Swimming Up" == vAnim)) addEvent(Tick * dpth, "checkAO");
1778} 1782}
1779 1783
1780stopMe(key id, integer f) 1784stopAnims(key avatar)
1781{ 1785{
1782 list anims = llCSV2List(llList2String(Sitters, f + pANIMS)); 1786 if (NULL_KEY != avatar)
1783 integer i; 1787 {
1784//d("stopMe " + llKey2Name(id) + " " + llList2String(Sitters, f + pANIMS)); 1788 list anims = llGetAnimationList(avatar);
1785 for (i = llGetListLength(anims) - 1; i >= 0; --i) 1789 integer l = llGetListLength(anims);
1786 animEnd(id, llList2String(anims, i)); 1790 integer i;
1791 for (i = 0; i < l; i++)
1792 {
1793 string anim = llList2Key(anims, i);
1794 if (anim != "")
1795 animEnd(avatar, anim);
1796 }
1797 animSwitch(avatar, "");
1798 }
1787} 1799}
1788 1800
1789checkLag() 1801checkLag()
@@ -1856,10 +1868,10 @@ laterInit()
1856 1868
1857die() 1869die()
1858{ 1870{
1859 integer l = llGetListLength(Sitters); 1871 integer l = llGetListLength(Avs);
1860 integer f; 1872 integer f;
1861 for (f = 0; f < l; f += pSTRIDE) 1873 for (f = 0; f < l; f += aSTRIDE)
1862 stopMe(llList2Key(Sitters, f + pKEY), f); 1874 stopAnims(llList2Key(Avs, f + aKEY));
1863 d("Deleting myself."); 1875 d("Deleting myself.");
1864 sendPrim(BossKey, "DIE_DONE", []); 1876 sendPrim(BossKey, "DIE_DONE", []);
1865 if (PERM_COPY & llGetObjectPermMask(MASK_OWNER)) llDie(); 1877 if (PERM_COPY & llGetObjectPermMask(MASK_OWNER)) llDie();