aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authoronefang2021-09-06 22:06:21 +1000
committeronefang2021-09-06 22:06:21 +1000
commit0b836920b9197ae78d0740c5985f036118e58008 (patch)
tree8dfb724b534e976c2db7f847b991126415a7e306
parentRip it a new one. Er replace Sitters "structure" with Avs. (diff)
download1ring-0b836920b9197ae78d0740c5985f036118e58008.zip
1ring-0b836920b9197ae78d0740c5985f036118e58008.tar.gz
1ring-0b836920b9197ae78d0740c5985f036118e58008.tar.bz2
1ring-0b836920b9197ae78d0740c5985f036118e58008.tar.xz
Rip it a new one, the other side.
-rw-r--r--1AOor2.lsl275
1 files 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)
101 return k; 101 return k;
102} 102}
103 103
104animBegin(key u, string a){if (doAnim) osAvatarPlayAnimation(u, a); else llStartAnimation(a);} 104animBegin(key u, string a){if (doAnim) osAvatarPlayAnimation(u, a); else llStartAnimation(a); /*s("START " + llKey2Name(u) + " " + a);*/}
105animEnd(key u, string a){if (doAnim) osAvatarStopAnimation(u, a); else llStopAnimation(a);} 105animEnd (key u, string a){if (doAnim) osAvatarStopAnimation(u, a); else llStopAnimation (a); /*s("STOP " + llKey2Name(u) + " " + a);*/}
106speed(key u, float s){if (doSpeed) osSetSpeed(u, s);} 106speed(key u, float s){if (doSpeed) osSetSpeed(u, s);}
107animSwitch(key u, string anim)
108{
109 integer f = findAvatar(u);
110 if (-1 != f)
111 {
112 string a = llList2String(Avs, f + aANIM);
113//s("animSwitch " + a + " -> " + anim);
114 if ("" != a) animEnd(u, a);
115 if (("" != anim) && (checkAnim(anim, FALSE))) animBegin(u, anim);
116 Avs = llListReplaceList(Avs, [anim], f + aANIM, f + aANIM);
117 }
118}
107 119
108integer listFindString(list lst, string name, integer stride) 120integer listFindString(list lst, string name, integer stride)
109{ 121{
@@ -411,8 +423,14 @@ integer doThing(key id, string button, string fr, string cmd, string data, integ
411 else if ("SYNC" == cmd) 423 else if ("SYNC" == cmd)
412 { 424 {
413 if ("R" != data) 425 if ("R" != data)
414 vAnim = data; 426 nextPose = data;
415 checkAO(); 427 else
428 {
429 Pose = "";
430 State = "";
431 }
432 if ("" == Posed) // Coz we don't want the checkAO regular SYNC R to break us out of the pose.
433 checkSitters(TRUE);
416 } 434 }
417 else if ("POSE" == cmd) 435 else if ("POSE" == cmd)
418 { 436 {
@@ -550,6 +568,13 @@ integer doThing(key id, string button, string fr, string cmd, string data, integ
550d("SIT_DONE for " + llKey2Name(data)); 568d("SIT_DONE for " + llKey2Name(data));
551 if(data == Stalkee) 569 if(data == Stalkee)
552 { 570 {
571 if ("" != Posed)
572 {
573 s("Stopping pose " + Posed);
574// animEnd(Owner, Posed);
575 Posed = "";
576 animSwitch(Owner, Posed);
577 }
553 llOwnerSay("@sit:" + TheirKey + "=force"); 578 llOwnerSay("@sit:" + TheirKey + "=force");
554 s("Switching AO to 1AOor2 couples object."); 579 s("Switching AO to 1AOor2 couples object.");
555 Controller = Owner; 580 Controller = Owner;
@@ -700,6 +725,11 @@ integer psANIM = 1; // | separated animations.
700integer psEMOTE = 2; // | separated emotions and timers list. 725integer psEMOTE = 2; // | separated emotions and timers list.
701integer psPOSROT= 3; // | separated position and rotation pairs. 726integer psPOSROT= 3; // | separated position and rotation pairs.
702integer psSTRIDE= 4; 727integer psSTRIDE= 4;
728string Posed; // Single pose, overrides AO.
729string Pose; // Couples pose name.
730string State; // AO state name.
731string nextPose; // Couples pose name.
732string nextState; // AO state name.
703 733
704// Smiler 734// Smiler
705integer SmileCounter = 0; 735integer SmileCounter = 0;
@@ -715,7 +745,6 @@ list Smiles =
715// Couples 745// Couples
716list Whats; 746list Whats;
717string What; 747string What;
718string Pose;
719key Stalkee; 748key Stalkee;
720integer PIN; 749integer PIN;
721key Leader = NULL_KEY; 750key Leader = NULL_KEY;
@@ -760,12 +789,19 @@ newPose(key id, string p, list ps)
760 integer l = llGetListLength(Avs); 789 integer l = llGetListLength(Avs);
761 if (-1 != f) 790 if (-1 != f)
762 { 791 {
763 setSetting(id, "AO", "0", fINT); 792 if (NULL_KEY != id)
764 Pose = p; 793 setSetting(id, "AO", "0", fINT);
765 Poses = llListReplaceList(Poses, llDumpList2String(ps, "|"), f + psANIM, f + psANIM); 794 nextPose = p;
766 for (f = 0; f < l; f += pSTRIDE) 795 string anims = llDumpList2String(ps, "|");
767 updateSitter(llList2Key(Sitters, f + pKEY)); 796 Poses = llListReplaceList(Poses, collectEmotes(anims), f + psANIM, f + psEMOTE);
768 checkAO(); 797 if (NULL_KEY != id)
798 {
799 for (f = 0; f < l; f += aSTRIDE)
800 {
801 updateAvatar(llList2Key(Avs, f + aKEY));
802 }
803 checkAO();
804 }
769 } 805 }
770} 806}
771 807
@@ -947,8 +983,8 @@ doControl(key id, integer level, integer edge)
947// integer end = ~level & edge; 983// integer end = ~level & edge;
948 integer held = level & ~edge; 984 integer held = level & ~edge;
949// integer untouched = ~(level | edge); 985// integer untouched = ~(level | edge);
950// llSay(0, "doControl " + llKey2Name(id) + " " + llList2CSV([level, edge, start, end, held, untouched])); 986// d(0, "doControl " + llKey2Name(id) + " " + llList2CSV([level, edge, start, end, held, untouched]));
951 integer f = findSitter(id); 987 integer f = findAvatar(id);
952 if (-1 != f) 988 if (-1 != f)
953 { 989 {
954 integer a = ("" != llList2Key(Avs, f + aADJ)); 990 integer a = ("" != llList2Key(Avs, f + aADJ));
@@ -990,7 +1026,6 @@ doControl(key id, integer level, integer edge)
990float SPEED = 3.8; 1026float SPEED = 3.8;
991float ROTAT = 8.0; 1027float ROTAT = 8.0;
992float Smooth = 0.2; // 0.2 is good. 1028float Smooth = 0.2; // 0.2 is good.
993string vAnim;
994updateControls() 1029updateControls()
995{ 1030{
996 if (Attached) return; 1031 if (Attached) return;
@@ -1103,7 +1138,12 @@ updateAvatar(key id)
1103 integer num = llList2Integer(Avs, f + aNUM); 1138 integer num = llList2Integer(Avs, f + aNUM);
1104 vector pos = position; 1139 vector pos = position;
1105 rotation rot = llEuler2Rot(rotat * DEG_TO_RAD); 1140 rotation rot = llEuler2Rot(rotat * DEG_TO_RAD);
1106 integer i = findPose(Pose); 1141 integer i;
1142
1143 if ("" != nextPose)
1144 i = findPose(nextPose);
1145 else
1146 i = findPose(Pose);
1107 if (-1 != i) 1147 if (-1 != i)
1108 { 1148 {
1109 string prn = llList2String(llParseStringKeepNulls(llList2String(Poses, i + psPOSROT), ["|"], []), num); 1149 string prn = llList2String(llParseStringKeepNulls(llList2String(Poses, i + psPOSROT), ["|"], []), num);
@@ -1225,7 +1265,7 @@ updateVehicle(integer keys, integer mode, float move, float rotate)
1225 vector gp = pos; 1265 vector gp = pos;
1226 vector rotvec = llRot2Euler(llGetRot()); 1266 vector rotvec = llRot2Euler(llGetRot());
1227 if (Attached || (0.0 == LeaderOffset)) return; 1267 if (Attached || (0.0 == LeaderOffset)) return;
1228 vAnim = "Standing"; 1268 nextState = "Standing";
1229 if (0.0 < vTHEN) 1269 if (0.0 < vTHEN)
1230 { 1270 {
1231 if (3.0 > (llGetTimeOfDay() - vTHEN)) 1271 if (3.0 > (llGetTimeOfDay() - vTHEN))
@@ -1237,30 +1277,30 @@ updateVehicle(integer keys, integer mode, float move, float rotate)
1237 } 1277 }
1238 if (vUP == vMODE) 1278 if (vUP == vMODE)
1239 { 1279 {
1240 if (vNONE == mode) vAnim = "Hovering"; 1280 if (vNONE == mode) nextState = "Hovering";
1241 else if (vFWD == mode) 1281 else if (vFWD == mode)
1242 { 1282 {
1243 vAnim = "Flying"; 1283 nextState = "Flying";
1244 pos += (<(llCos(rotvec.z)) * move, (llSin(rotvec.z)) * move, 0.0>); 1284 pos += (<(llCos(rotvec.z)) * move, (llSin(rotvec.z)) * move, 0.0>);
1245 } 1285 }
1246 else if (vUP == mode) 1286 else if (vUP == mode)
1247 { 1287 {
1248 pos += (<0.0, 0.0, move>); 1288 pos += (<0.0, 0.0, move>);
1249 if (0.0 < move) vAnim = "Hovering Up"; 1289 if (0.0 < move) nextState = "Hovering Up";
1250 else vAnim = "Hovering Down"; 1290 else nextState = "Hovering Down";
1251 } 1291 }
1252 if (cast(gp, pos, move / Smooth) > (pos.z - LeaderOffset)) 1292 if (cast(gp, pos, move / Smooth) > (pos.z - LeaderOffset))
1253 { 1293 {
1254 vAnim = "Soft Landing"; vMODE = vFWD; 1294 nextState = "Soft Landing"; vMODE = vFWD;
1255 vTHEN = llGetTimeOfDay(); addEvent(3.0, "SYNC Standing"); 1295 vTHEN = llGetTimeOfDay(); addEvent(3.0, "SYNC Standing");
1256 } 1296 }
1257 } 1297 }
1258 else if (vFALL == vMODE) 1298 else if (vFALL == vMODE)
1259 { 1299 {
1260 vAnim = "Falling"; pos.z -= 1.0; 1300 nextState = "Falling"; pos.z -= 1.0;
1261 if (cast(gp, pos, move / Smooth) > (pos.z - LeaderOffset)) 1301 if (cast(gp, pos, move / Smooth) > (pos.z - LeaderOffset))
1262 { 1302 {
1263 vAnim = "Standing Up"; vMODE = vFWD; 1303 nextState = "Standing Up"; vMODE = vFWD;
1264 vTHEN = llGetTimeOfDay(); addEvent(3.0, "SYNC Standing"); 1304 vTHEN = llGetTimeOfDay(); addEvent(3.0, "SYNC Standing");
1265 } 1305 }
1266 } 1306 }
@@ -1282,37 +1322,37 @@ updateVehicle(integer keys, integer mode, float move, float rotate)
1282 } 1322 }
1283 else pos.z = ground + LeaderOffset; 1323 else pos.z = ground + LeaderOffset;
1284 } 1324 }
1285 if (vMODE == vFALL) vAnim = "Falling"; 1325 if (vMODE == vFALL) nextState = "Falling";
1286 else if (vCROUCH == vMODE) 1326 else if (vCROUCH == vMODE)
1287 { 1327 {
1288 if (0.0 == move) vAnim = "Crouching"; 1328 if (0.0 == move) nextState = "Crouching";
1289 else vAnim = "CrouchWalking"; 1329 else nextState = "CrouchWalking";
1290 } 1330 }
1291 else if (vGROUND == vMODE) 1331 else if (vGROUND == vMODE)
1292 vAnim = "Sitting on Ground"; 1332 nextState = "Sitting on Ground";
1293 else 1333 else
1294 { 1334 {
1295 if (0.0 != rotate) 1335 if (0.0 != rotate)
1296 { 1336 {
1297 if (0.0 < rotate) vAnim = "Turning Left"; 1337 if (0.0 < rotate) nextState = "Turning Left";
1298 else vAnim = "Turning Right"; 1338 else nextState = "Turning Right";
1299 } 1339 }
1300 if (0.0 == move) vAnim = "Standing"; 1340 if (0.0 == move) nextState = "Standing";
1301 else vAnim = "Walking"; 1341 else nextState = "Walking";
1302 } 1342 }
1303 } 1343 }
1304 else if (vUP == mode) 1344 else if (vUP == mode)
1305 { 1345 {
1306 if (keys & CONTROL_UP) 1346 if (keys & CONTROL_UP)
1307 { 1347 {
1308 if (vGROUND == vMODE) {vAnim = "Crouching"; vMODE = vCROUCH;} 1348 if (vGROUND == vMODE) {nextState = "Crouching"; vMODE = vCROUCH;}
1309 else if (vCROUCH == vMODE) {vAnim = "Standing"; vMODE = vFWD;} 1349 else if (vCROUCH == vMODE) {nextState = "Standing"; vMODE = vFWD;}
1310 else {pos += (<0.0, 0.0, move>); vMODE = vUP;} 1350 else {pos += (<0.0, 0.0, move>); vMODE = vUP;}
1311 } 1351 }
1312 else 1352 else
1313 { 1353 {
1314 if (vCROUCH == vMODE) {vAnim = "Sitting on Ground"; vMODE = vGROUND;} 1354 if (vCROUCH == vMODE) {nextState = "Sitting on Ground"; vMODE = vGROUND;}
1315 else if (0.0 > move) {vAnim = "Crouching"; vMODE = vCROUCH;} 1355 else if (0.0 > move) {nextState = "Crouching"; vMODE = vCROUCH;}
1316 else {pos += (<0.0, 0.0, move>); vMODE = vUP;} 1356 else {pos += (<0.0, 0.0, move>); vMODE = vUP;}
1317 } 1357 }
1318 } 1358 }
@@ -1389,10 +1429,41 @@ updateVehicle(integer keys, integer mode, float move, float rotate)
1389newLeader(key id) 1429newLeader(key id)
1390{ 1430{
1391 Leader = id; 1431 Leader = id;
1392 vector bb = llGetAgentSize(Leader); LeaderOffset = (bb.z + 0.3) / 2; 1432 if (NULL_KEY != id)
1433 {
1434 vector bb = llGetAgentSize(Leader); LeaderOffset = (bb.z + 0.3) / 2;
1435
1436 integer l = llGetListLength(Avs);
1437 integer i;
1438 integer oldLdr = -1;
1439 integer newLdr = -1;
1440 integer ldr = 0;
1441
1442 if (Swapped)
1443 ldr = 1;
1444 for (i = 0; i < l; i += aSTRIDE)
1445 {
1446 if (llList2Integer(Avs, i + aNUM) == ldr)
1447 oldLdr = i;
1448 if (llList2Key(Avs, i + aKEY) == id)
1449 newLdr = i;
1450 }
1451 if (oldLdr != newLdr)
1452 {
1453 Avs = llListReplaceList(Avs, [ldr], newLdr + aNUM, newLdr + aNUM);
1454 Avs = llListReplaceList(Avs, [newLdr / aSTRIDE], oldLdr + aNUM, oldLdr + aNUM);
1455 }
1456d("newLeader " + llKey2Name(Leader) + ", offset " + (string) LeaderOffset + "\n" + llDumpList2String(Avs, "|"));
1457 }
1458 else
1459 {
1460 Leader = id;
1461 LeaderOffset = 0.0;
1462d("newLeader NONE, offset " + (string) LeaderOffset);
1463 }
1464 Pose = "";
1465 State = "";
1393 updateVehicle(0, vNONE, 0.0, 0.0); 1466 updateVehicle(0, vNONE, 0.0, 0.0);
1394 checkAO();
1395d("newLeader " + llKey2Name(Leader) + ", offset " + (string) LeaderOffset);
1396} 1467}
1397 1468
1398oldController(key t) 1469oldController(key t)
@@ -1525,7 +1596,6 @@ checkSitters(integer del)
1525 return; 1596 return;
1526} 1597}
1527 1598
1528stopAnims(key avatar)
1529{ 1599{
1530 if (NULL_KEY != avatar) 1600 if (NULL_KEY != avatar)
1531 { 1601 {
@@ -1613,26 +1683,12 @@ integer loadCard(string card, integer casperMode)
1613 return FALSE; 1683 return FALSE;
1614} 1684}
1615 1685
1616list isPoseAO(integer f)
1617{
1618 if ("" != Pose)
1619 {
1620 integer p = findPose(Pose);
1621 if (-1 != p)
1622 {
1623 list ps = llParseStringKeepNulls(llList2String(Poses, p + psANIM), ["|"], []);
1624 if ("~" != llList2String(ps, f / pSTRIDE))
1625 return ps;
1626 }
1627 }
1628 return [];
1629}
1630
1631checkAO() 1686checkAO()
1632{ 1687{
1633 string newAnim; 1688 string newAnim;
1634 integer fast; integer i; integer f; float dpth; 1689 string oldAnim = State;
1635 integer l = llGetListLength(Avs); 1690 integer l = llGetListLength(Avs);
1691 integer fast = 0; integer i; integer f; float dpth;
1636 if (NULL_KEY != TheirKey) return; 1692 if (NULL_KEY != TheirKey) return;
1637 1693
1638// doAnim = (integer) getSetting("osAnim"); 1694// doAnim = (integer) getSetting("osAnim");
@@ -1640,30 +1696,41 @@ checkAO()
1640 if (Attached) 1696 if (Attached)
1641 { 1697 {
1642// if (llGetAgentInfo(Owner) & AGENT_ALWAYS_RUN) fast = 1; else fast = 0; 1698// if (llGetAgentInfo(Owner) & AGENT_ALWAYS_RUN) fast = 1; else fast = 0;
1643 newAnim = llGetAnimation(Owner); 1699 nextState = llGetAnimation(Owner);
1644 vAnim = newAnim;
1645 } 1700 }
1646 else
1647 {
1648// TODO - when updateControls() figures out fast mode, use that. 1701// TODO - when updateControls() figures out fast mode, use that.
1649 newAnim = vAnim; 1702 newAnim = nextState;
1703 if ("" != Posed)
1704 {
1705 s("Stopping pose " + Posed);
1706 Posed = "";
1707 animSwitch(Owner, Posed);
1708// Posed = "";
1650 } 1709 }
1651 if (("" == Pose) && ("0" == getSetting("AO"))) 1710 if (("0" == getSetting("AO")))
1652 { 1711 {
1653 stopAnims(Owner); 1712 if ("" == nextPose)
1654 AOspeed = 1.0; 1713 {
1655 speed(Owner, 1.0); 1714// stopAnims(Owner);
1656 return; 1715 AOspeed = 1.0;
1716 speed(Owner, 1.0);
1717 return;
1718 }
1719 }
1720 if ("" != nextPose)
1721 {
1722 oldAnim = Pose;
1723 newAnim = nextPose;
1657 } 1724 }
1658 string oldAnim = newAnim; 1725
1659//d("checkAO() " + newAnim); 1726//S("checkAO() " + oldAnim + " -> " + newAnim);
1660 AOspeed = 0.0; 1727 AOspeed = 0.0;
1661 integer flying = llListFindList(flyStates, [vAnim]); 1728 integer flying = llListFindList(flyStates, [nextState]);
1662 if (-1 != flying) 1729 if (-1 != flying)
1663 { 1730 {
1664 float water = llWater(ZERO_VECTOR); 1731 float water = llWater(ZERO_VECTOR);
1665 float ground = llGround(ZERO_VECTOR); 1732 float ground = llGround(ZERO_VECTOR);
1666 integer fly = ("Flying" == vAnim); 1733 integer fly = ("Flying" == nextState);
1667// if (fly && !fast) newAnim = "FlyingSlow"; 1734// if (fly && !fast) newAnim = "FlyingSlow";
1668 if (water > ground) // First check if we can even be under water. 1735 if (water > ground) // First check if we can even be under water.
1669 { 1736 {
@@ -1686,7 +1753,7 @@ checkAO()
1686 velocity.x = 0.0; velocity.y = 0.0; 1753 velocity.x = 0.0; velocity.y = 0.0;
1687 if (10 > velocity.z) velocity.z = 10; 1754 if (10 > velocity.z) velocity.z = 10;
1688 velocity.z *= -4; 1755 velocity.z *= -4;
1689 if ("Swimming Up" == alias("~" +vAnim)) 1756 if ("Swimming Up" == alias("~" +nextState))
1690 { 1757 {
1691 Bobbing++; 1758 Bobbing++;
1692 if (3 < Bobbing) 1759 if (3 < Bobbing)
@@ -1725,7 +1792,13 @@ checkAO()
1725 AOspeed = AOspeed * (float) getSetting("speed"); 1792 AOspeed = AOspeed * (float) getSetting("speed");
1726 if (0.0 < AOspeed) speed(Owner, AOspeed + ((AOspeed / 2) * (fast + (2 * (integer) getSetting("super"))))); 1793 if (0.0 < AOspeed) speed(Owner, AOspeed + ((AOspeed / 2) * (fast + (2 * (integer) getSetting("super")))));
1727 else AOspeed = 1.0; 1794 else AOspeed = 1.0;
1728 for (f = 0; f < l; f += pSTRIDE) 1795 integer p;
1796 if ("" != nextPose)
1797 p = findPose(nextPose);
1798 else
1799 p = findPose("AO_" + nextState);
1800 Pose = nextPose;
1801 for (f = 0; f < l; f += aSTRIDE)
1729 { 1802 {
1730 string old = oldAnim; 1803 string old = oldAnim;
1731 string new = newAnim; 1804 string new = newAnim;
@@ -1748,37 +1821,38 @@ checkAO()
1748 else 1821 else
1749 anims = [llList2String(anims, num)]; 1822 anims = [llList2String(anims, num)];
1750 } 1823 }
1751//d("checkAO " + llKey2Name(id) + " " + anim + " -> " + newAnim + " @ " + (string) AOspeed + " " + Pose); 1824//s("checkA1 " + llKey2Name(id) + " " + old + " -> " + new + " @ " + nextPose + " \n" +
1752 if (newAnim != anim) 1825//llDumpList2String(anims, "|"));
1826 if (new != old)
1753 { 1827 {
1754 g = listFindString(states, newAnim, 2); 1828 // Ignore sits, since 99.99% of the time what they are sitting on supplies an animation.
1755 if (-1 != g) 1829 if ((("Sitting" == nextState) && Attached))
1830 ;
1831 else
1756 { 1832 {
1757 stopMe(id, f); 1833 // If there's more than one, randomly switch between them at random times.
1758 // Ignore sits, since 99.99% of the time what they are sitting on supplies an animation. 1834 i = llGetListLength(anims);
1759 if ((("Sitting" == vAnim) && Attached) || ("" == llList2String(states, g + 1))) 1835 if (1 < i) addEvent(20.0 + llFrand(20.0), "SYNC R");
1760 ; 1836 i = (integer) llFrand((float) i);
1761 else 1837 // ZHAO II also allows multiple anims in one set, comma separated. Good idea.
1762 { 1838// anims = llCSV2List(llList2String(newAnims, i));
1763 list newAnims = llParseString2List(llList2String(states, g + 1), ["|"], []); 1839//S("ANIMS " + llKey2Name(id) + " " + new + " -> " + llList2String(newAnims, i));
1764 // If there's more than one, randomly switch between them at random times. 1840// for (i = llGetListLength(anims) - 1; i >= 0; --i)
1765 i = llGetListLength(newAnims); 1841// {
1766 if (1 < i) addEvent(20.0 + llFrand(20.0), "SYNC R"); 1842 string a = llList2String(anims, i);
1767 i = (integer) llFrand((float) i); 1843//S("ANIMS " + llKey2Name(id) + " " + new + " -> " + a);
1768 // ZHAO II also allows multiple anims in one set, comma separated. Good idea. 1844 animSwitch(id, a);
1769 anims = llCSV2List(llList2String(newAnims, i)); 1845 doEmote(Pose, f);
1770//d("ANIMS " + llKey2Name(id) + " " + newAnim + " -> " + llList2String(newAnims, i)); 1846// }
1771 for (i = llGetListLength(anims) - 1; i >= 0; --i)
1772 {
1773 string a = llList2String(anims, i);
1774 if (checkAnim(a)) animBegin(id, a);
1775 }
1776 }
1777 } 1847 }
1778 Avs = llListReplaceList(Avs, [new], f + aSTATE, f + aSTATE); 1848 Avs = llListReplaceList(Avs, [new], f + aSTATE, f + aSTATE);
1779 } 1849 }
1780 } 1850 }
1781 if (("" == Pose) || ("Swimming Up" == vAnim)) addEvent(Tick * dpth, "checkAO"); 1851 if ("" != Pose)
1852 State = nextPose;
1853 else
1854 State = nextState;
1855 if (("" == Pose) || ("Swimming Up" == State)) addEvent(Tick * dpth, "checkAO");
1782} 1856}
1783 1857
1784stopAnims(key avatar) 1858stopAnims(key avatar)
@@ -1838,9 +1912,12 @@ laterInit()
1838 loadCard("AOConfig", TRUE); // Casper AOs are less common. 1912 loadCard("AOConfig", TRUE); // Casper AOs are less common.
1839 if (Attached) 1913 if (Attached)
1840 { 1914 {
1841 d("AO mode."); 1915 s("AO mode.");
1842 Sitters = [Owner, -1, "", "", "", "", llGetListLength(Distances) / 3, 0]; 1916 if ("Sitting" != llGetAnimation(Owner))
1843 Pose = ""; 1917 stopAnims(Owner);
1918 Avs = [Owner, 0, -1, "", "", "", llGetListLength(Distances) / 3, 0];
1919 nextPose = "";
1920 nextState = "";
1844 checkAO(); 1921 checkAO();
1845 } 1922 }
1846 else 1923 else