diff options
author | onefang | 2021-09-06 22:06:21 +1000 |
---|---|---|
committer | onefang | 2021-09-06 22:06:21 +1000 |
commit | 0b836920b9197ae78d0740c5985f036118e58008 (patch) | |
tree | 8dfb724b534e976c2db7f847b991126415a7e306 | |
parent | Rip it a new one. Er replace Sitters "structure" with Avs. (diff) | |
download | 1ring-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.lsl | 275 |
1 files changed, 176 insertions, 99 deletions
@@ -101,9 +101,21 @@ string inKey2Name(key k) | |||
101 | return k; | 101 | return k; |
102 | } | 102 | } |
103 | 103 | ||
104 | animBegin(key u, string a){if (doAnim) osAvatarPlayAnimation(u, a); else llStartAnimation(a);} | 104 | animBegin(key u, string a){if (doAnim) osAvatarPlayAnimation(u, a); else llStartAnimation(a); /*s("START " + llKey2Name(u) + " " + a);*/} |
105 | animEnd(key u, string a){if (doAnim) osAvatarStopAnimation(u, a); else llStopAnimation(a);} | 105 | animEnd (key u, string a){if (doAnim) osAvatarStopAnimation(u, a); else llStopAnimation (a); /*s("STOP " + llKey2Name(u) + " " + a);*/} |
106 | speed(key u, float s){if (doSpeed) osSetSpeed(u, s);} | 106 | speed(key u, float s){if (doSpeed) osSetSpeed(u, s);} |
107 | animSwitch(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 | ||
108 | integer listFindString(list lst, string name, integer stride) | 120 | integer 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 | |||
550 | d("SIT_DONE for " + llKey2Name(data)); | 568 | d("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. | |||
700 | integer psEMOTE = 2; // | separated emotions and timers list. | 725 | integer psEMOTE = 2; // | separated emotions and timers list. |
701 | integer psPOSROT= 3; // | separated position and rotation pairs. | 726 | integer psPOSROT= 3; // | separated position and rotation pairs. |
702 | integer psSTRIDE= 4; | 727 | integer psSTRIDE= 4; |
728 | string Posed; // Single pose, overrides AO. | ||
729 | string Pose; // Couples pose name. | ||
730 | string State; // AO state name. | ||
731 | string nextPose; // Couples pose name. | ||
732 | string nextState; // AO state name. | ||
703 | 733 | ||
704 | // Smiler | 734 | // Smiler |
705 | integer SmileCounter = 0; | 735 | integer SmileCounter = 0; |
@@ -715,7 +745,6 @@ list Smiles = | |||
715 | // Couples | 745 | // Couples |
716 | list Whats; | 746 | list Whats; |
717 | string What; | 747 | string What; |
718 | string Pose; | ||
719 | key Stalkee; | 748 | key Stalkee; |
720 | integer PIN; | 749 | integer PIN; |
721 | key Leader = NULL_KEY; | 750 | key 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) | |||
990 | float SPEED = 3.8; | 1026 | float SPEED = 3.8; |
991 | float ROTAT = 8.0; | 1027 | float ROTAT = 8.0; |
992 | float Smooth = 0.2; // 0.2 is good. | 1028 | float Smooth = 0.2; // 0.2 is good. |
993 | string vAnim; | ||
994 | updateControls() | 1029 | updateControls() |
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) | |||
1389 | newLeader(key id) | 1429 | newLeader(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 | } | ||
1456 | d("newLeader " + llKey2Name(Leader) + ", offset " + (string) LeaderOffset + "\n" + llDumpList2String(Avs, "|")); | ||
1457 | } | ||
1458 | else | ||
1459 | { | ||
1460 | Leader = id; | ||
1461 | LeaderOffset = 0.0; | ||
1462 | d("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(); | ||
1395 | d("newLeader " + llKey2Name(Leader) + ", offset " + (string) LeaderOffset); | ||
1396 | } | 1467 | } |
1397 | 1468 | ||
1398 | oldController(key t) | 1469 | oldController(key t) |
@@ -1525,7 +1596,6 @@ checkSitters(integer del) | |||
1525 | return; | 1596 | return; |
1526 | } | 1597 | } |
1527 | 1598 | ||
1528 | stopAnims(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 | ||
1616 | list 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 | |||
1631 | checkAO() | 1686 | checkAO() |
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 | ||
1784 | stopAnims(key avatar) | 1858 | stopAnims(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 |