Animations are started in the wrong order when an agent's camera comes into range after the animations are started.
tracked
SungAli Resident
When an agent teleports into, or otherwise enters, an area where other's avatars are already playing animations, animations are started for the entering viewer in reverse order, from newest to oldest. This has the effect of having the older animations override newer animations with the same priority, whereas those already present will see the newer animations override the older ones with the same priority.
Log In
SungAli Resident
Okay, Neither the HUD nor script actions are involved. In my previous post, I picked the wrong sit animation from inventory (fox_sit3). Using these animations, the newest Bento version of fox_actionsit4 and an older pre-bento mesh fox_dance_hop (that doesn't animate my tail), with the AO HUD detached and playing both from Inventory I get the following results: Played in either order, agents present at the time the animations are started see the second animation started override the first. The first animation continues to animate body parts not affected by the second animation (head when sitting second, tail when dancing second). An agent entering after the animations are started always sees the sit animation overriding the dance animation no matter in which order they were started. (I _thought_ that I'd checked order more thoroughly before making the initial report and determined that it was reversal of starting order, but evidently I erred.) The order for starting animations on new agent entry now appears to be fixed, at least for this particular pair of animations. ... Similarly, fox_sit3 and fox_dance_hop override each other as expected for agents present when they are started. However in this case it appears that fox_dance_hop always overrides fox_sit3 for an agent entering after they are started. ... Copying and renaming fox_sit3 to fox_asit3, does not change this behavior, so whatever the order is, it is evidently not lexical by name. I don't have access to UUIDs to see if the order is by UUID. (Previous tests indicate to me that copying and renaming an animation in inventory does not change the UUID as a renamed copy played from inventory will still be stopped by the HUD when some action would have triggered stopping the animation if it had been started from the HUD.)
SungAli Resident
Just double checked. When I turn the HUD (TWI Fox AO HUD) off and play both animations from inventory, whether ground sitting or not, the problem does NOT occur, animations are played in the proper order. Evidently the problem is in some way associated with HUD actions and therefore may be a problem in some way associated with the HUD's scripts, though I have no reason to believe that the HUD does anything so peculiar as detecting new agents and responding with an animation action. I will see if I can narrow the problem down by removing the TWI HUD and making a simple HUD script that just play animations in various ways and if I can reproduce the problem with a simple script, I will post it here together with any details that I learn.
SungAli Resident
Sorry for not responding to your Needs Info request, Maestro. I missed the notification. The problem seems to happen for me with any equal priority animations. For instance if I sit, triggering a sit animation from my AO HUD, then play a dance animation that the HUD doesn't know about from inventory, I see myself dancing but with my tail still curled aside from the sit: https://i.imgur.com/kkl6LfM.png However an alt entering after I start the animations sees me sitting, but with my head turned down and bobbing from the dance animation. https://i.imgur.com/55JLROA.png
Maestro Linden
tracked
I still haven't been able to reproduce this bug. Keeping it around to see if we get more reports corroborating it. This bug may be specific to certain animations - if so we need info about what those animations are.
Maestro Linden
needs info
Maestro Linden
SungAli Resident : Since we seem to be getting different results, can you describe the precise sequence of events you're doing to trigger this bug? If so, are you able to reproduce it with the same test script that I have?
Maestro Linden
Here's the other scenario I tried. In this case, UserA plays both animations while UserB cannot see them (either based on UserB facing away from them or not being connected to UserA's region at all). I'm seeing correct behavior in this scenario as well - when UserB finally does see UserA, UserA's avatar appears in the correct animation state (agreeing with what UserA sees).
- UserA: Rez the 'animation test' script, and accept animation permission when prompted
- UserB: Visit the same region as UserA at approximately 50m distance, with the avatar and camera facing away from UserA
- UserA: After a few minutes (waiting for UserB's interest list to update?), type '/1 bow' in chat, to trigger the 'aim_l_bow' = 46bb4359-de38-4ed8-6a22-f1f52fe8f506 animation
- UserB receives this incoming AvatarAnimation message arrives about UserA; note that 46bb.. is present:
IN AvatarAnimation [RELIABLE]
# ID: 13512
[Sender]
ID = e1a51880-d7b5-4c00-800d-91664f5b84c0
[AnimationList]
AnimID = 2408fe9e-df1d-1d7d-f4ff-1384fa7b350f
AnimSequenceID = 3162
[AnimationList]
AnimID = 370f3a20-6ca6-9971-848c-9a01bc42ae3c
AnimSequenceID = 4278
[AnimationList]
AnimID = 46bb4359-de38-4ed8-6a22-f1f52fe8f506
AnimSequenceID = 4280
[AnimationSourceList]
ObjectID = 00000000-0000-0000-0000-000000000000
[PhysicalAvatarEventList]
TypeData =| None
#TypeData = b''
- UserA: Observe that your avatar is animating with 'aim_l_bow'
- UserA: Type '/1 bazooka' in chat, to trigger the 'aim_r_bazooka' = b5b4a67d-0aee-30d2-72cd-77b333e932ef animation
- UserB receives this incoming AvatarAnimation message arrives about UserA; note that 46bb.. is present with the same AnimSequenceID as before and that b5b4.. is now present:
IN AvatarAnimation [RELIABLE]
# ID: 13716
[Sender]
ID = e1a51880-d7b5-4c00-800d-91664f5b84c0
[AnimationList]
AnimID = 2408fe9e-df1d-1d7d-f4ff-1384fa7b350f
AnimSequenceID = 3162
[AnimationList]
AnimID = 46bb4359-de38-4ed8-6a22-f1f52fe8f506
AnimSequenceID = 4280
[AnimationList]
AnimID = b5b4a67d-0aee-30d2-72cd-77b333e932ef
AnimSequenceID = 4294
[AnimationSourceList]
ObjectID = 00000000-0000-0000-0000-000000000000
[PhysicalAvatarEventList]
TypeData =| None
#TypeData = b''
- UserA: Observe that your avatar is animating with 'aim_r_bazooka'
Maestro Linden
(continuing from parent comment)
- UserB: Turn around and approaches UserA
- UserB: Observe that UserA is playing the 'aim_r_bazooka' animation - which agrees with UserA's viewer
- UserA: Say '/1 stop' to stop both animations
- UserB receives this incoming AvatarAnimation message arrives about UserA; note that both 46bb.. and b5b4.. animations are absent:
IN AvatarAnimation [RELIABLE]
# ID: 14901
[Sender]
ID = e1a51880-d7b5-4c00-800d-91664f5b84c0
[AnimationList]
AnimID = 2408fe9e-df1d-1d7d-f4ff-1384fa7b350f
AnimSequenceID = 3162
[AnimationList]
AnimID = 42b46214-4b44-79ae-deb8-0df61424ff4b
AnimSequenceID = 4418
[AnimationSourceList]
ObjectID = 00000000-0000-0000-0000-000000000000
[PhysicalAvatarEventList]
TypeData =| None
#TypeData = b''
- Both users see UserA playing the basic 'standing' animation.
- UserB: Teleport to a region far away from UserA
- Wait a few minutes for UserA's viewer to disconnect
- UserA: Type '/1 bow' and '/1 bazooka' to return to the '2 animations state'. Observe that the 'aim_r_bazooka' animation is active on the avatar
- UserA: Teleport back to UserB's location
18: UserB receives this incoming AvatarAnimation message arrives about UserA; note that both 46bb.. and b5b4.. animations are present
IN AvatarAnimation [RELIABLE]
# ID: 4383
[Sender]
ID = e1a51880-d7b5-4c00-800d-91664f5b84c0
[AnimationList]
AnimID = 2408fe9e-df1d-1d7d-f4ff-1384fa7b350f
AnimSequenceID = 3162
[AnimationList]
AnimID = 46bb4359-de38-4ed8-6a22-f1f52fe8f506
AnimSequenceID = 5246
[AnimationList]
AnimID = b5b4a67d-0aee-30d2-72cd-77b333e932ef
AnimSequenceID = 5248
[AnimationSourceList]
ObjectID = 00000000-0000-0000-0000-000000000000
[PhysicalAvatarEventList]
TypeData =| None
#TypeData = b''
19: UserB: Observe that UserA is playing the 'aim_r_bazooka' animation - which agrees with UserA's viewer
Maestro Linden
First, here's what I see what happens when UserA plays some animations while UserB watches, then UserB leaves and returns (first to a far-away region, then to another location within the same region and back). The results in this case are as expected - both users see UserA playing the same animation in all cases.
- UserA and UserB: visit the same location
- UserA: rez the 'animation test' script, and accepts animation permission when prompted
- UserA: type '/1 bow' in chat, to trigger the 'aim_l_bow' = 46bb4359-de38-4ed8-6a22-f1f52fe8f506 animation
- UserB receives this incoming AvatarAnimation message arrives about UserA:
IN AvatarAnimation [RELIABLE]
# ID: 3961
[Sender]
ID = e1a51880-d7b5-4c00-800d-91664f5b84c0
[AnimationList]
AnimID = 15468e00-3400-bb66-cecc-646d7c14458e
AnimSequenceID = 3164
[AnimationList]
AnimID = 2408fe9e-df1d-1d7d-f4ff-1384fa7b350f
AnimSequenceID = 3162
[AnimationList]
AnimID = 46bb4359-de38-4ed8-6a22-f1f52fe8f506
AnimSequenceID = 3170
[AnimationSourceList]
ObjectID = 00000000-0000-0000-0000-000000000000
[PhysicalAvatarEventList]
TypeData =| None
#TypeData = b''
- UserA, UserB: observe that UserA is animating with 'aim_l_bow'
- UserA: type '/1 bazooka' in chat, to trigger the 'aim_r_bazooka' = b5b4a67d-0aee-30d2-72cd-77b333e932ef animation
- UserB receives this incoming AvatarAnimation message arrives about UserA:
IN AvatarAnimation [RELIABLE]
# ID: 3979
[Sender]
ID = e1a51880-d7b5-4c00-800d-91664f5b84c0
[AnimationList]
AnimID = 15468e00-3400-bb66-cecc-646d7c14458e
AnimSequenceID = 3164
[AnimationList]
AnimID = 2408fe9e-df1d-1d7d-f4ff-1384fa7b350f
AnimSequenceID = 3162
[AnimationList]
AnimID = 46bb4359-de38-4ed8-6a22-f1f52fe8f506
AnimSequenceID = 3170
[AnimationList]
AnimID = b5b4a67d-0aee-30d2-72cd-77b333e932ef
AnimSequenceID = 3174
[AnimationSourceList]
ObjectID = 00000000-0000-0000-0000-000000000000
[PhysicalAvatarEventList]
TypeData =| None
#TypeData = b''
- UserA, UserB: observe that UserA is animating with 'aim_r_bazooka'
- UserB: Teleport to a far away region, then waits a few minutes to disconnect from the original simulator
Maestro Linden
(continuing from parent comment..)
- UserB: Teleport back to UserA's location
- UserB receives this incoming AvatarAnimation message arrives about UserA. Both 46bb4359-de38-4ed8-6a22-f1f52fe8f506 and b5b4a67d-0aee-30d2-72cd-77b333e932ef animations are present, and have the same AnimSequenceID as what was sent in step (6):
IN AvatarAnimation [RELIABLE]
# ID: 1098
[Sender]
ID = e1a51880-d7b5-4c00-800d-91664f5b84c0
[AnimationList]
AnimID = 2408fe9e-df1d-1d7d-f4ff-1384fa7b350f
AnimSequenceID = 3162
[AnimationList]
AnimID = 46bb4359-de38-4ed8-6a22-f1f52fe8f506
AnimSequenceID = 3170
[AnimationList]
AnimID = b5b4a67d-0aee-30d2-72cd-77b333e932ef
AnimSequenceID = 3174
[AnimationList]
AnimID = f22fed8b-a5ed-2c93-64d5-bdd8b93c889f
AnimSequenceID = 3300
[AnimationSourceList]
ObjectID = 00000000-0000-0000-0000-000000000000
[PhysicalAvatarEventList]
TypeData =| None
#TypeData = b''
- UserA, UserB: observe that UserA is animating with 'aim_r_bazooka'
- UserB: Walk ~50m away from UserA, with the avatar and camera facing away from UserA, then wait a few minutes
- UserB: walk back to UserA and face them
- UserB receives this incoming AvatarAnimation message arrives about UserA. Both 46bb4359-de38-4ed8-6a22-f1f52fe8f506 and b5b4a67d-0aee-30d2-72cd-77b333e932ef animations are present, and have the same AnimSequenceID as what was sent in steps (6) and (10):
IN AvatarAnimation [RELIABLE]
# ID: 5436
[Sender]
ID = e1a51880-d7b5-4c00-800d-91664f5b84c0
[AnimationList]
AnimID = 2408fe9e-df1d-1d7d-f4ff-1384fa7b350f
AnimSequenceID = 3162
[AnimationList]
AnimID = 42b46214-4b44-79ae-deb8-0df61424ff4b
AnimSequenceID = 3706
[AnimationList]
AnimID = 46bb4359-de38-4ed8-6a22-f1f52fe8f506
AnimSequenceID = 3170
[AnimationList]
AnimID = b5b4a67d-0aee-30d2-72cd-77b333e932ef
AnimSequenceID = 3174
[AnimationSourceList]
ObjectID = 00000000-0000-0000-0000-000000000000
[PhysicalAvatarEventList]
TypeData =| None
#TypeData = b''
- UserA, UserB: observe that UserA is animating with 'aim_r_bazooka'
- UserA: Say '/1 stop' to stop both animations the script had triggered
Maestro Linden
(continuing from parent comment..)
- UserB receives this incoming AvatarAnimation message arrives about UserA. It correctly shows that neither animation 46bb.. or b5b4.. is playing:
IN AvatarAnimation [RELIABLE]
# ID: 6587
[Sender]
ID = e1a51880-d7b5-4c00-800d-91664f5b84c0
[AnimationList]
AnimID = 2408fe9e-df1d-1d7d-f4ff-1384fa7b350f
AnimSequenceID = 3162
[AnimationList]
AnimID = 42b46214-4b44-79ae-deb8-0df61424ff4b
AnimSequenceID = 3836
[AnimationSourceList]
ObjectID = 00000000-0000-0000-0000-000000000000
[PhysicalAvatarEventList]
TypeData =| None
#TypeData = b''
- UserA, UserB: observe that UserA is animating with the basic 'standing' animation
Maestro Linden
'animation test' LSL Test script I used - it plays either 'aim_l_bow' or 'aim_r_bazooka' animations based on chat commands, and will stop both animations based on a chat command. Both animations are priority 2 and animate the arms, so there is some conflict between them.
/*
Animation Test
Trigger or stop certain animations based on chat commands.
Uses 2 animations from https://wiki.secondlife.com/wiki/Internal_Animations
*/
showCurrentAnimations()
{
llSetText("Animations playing:\n" + llDumpList2String(llGetAnimationList(llGetOwner()), "\n"),
<1,1,1>, 1);
}
// use a private channel for commands to avoid interference with 'typing' animation
integer listenChannel = 1;
default
{
state_entry()
{
string msg = "Accept animation permissions to proceed";
llOwnerSay(msg);
llSetText(msg, <1,0,0>, 1);
llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION);
}
run_time_permissions(integer perm)
{
if( !(perm & PERMISSION_TRIGGER_ANIMATION) )
{
llOwnerSay("Aborting - permission not granted.");
return;
}
llOwnerSay("Got Animation Permissions."
+ "\nSay /'" + (string)listenChannel + " bow' to start animation aim_l_bow, 46bb4359-de38-4ed8-6a22-f1f52fe8f506"
+ "\nSay /'" + (string)listenChannel + " bazooka' to start animation aim_r_bazooka, b5b4a67d-0aee-30d2-72cd-77b333e932ef"
+ "\nSay /'" + (string)listenChannel + " stop' to stop both animations");
llListen(listenChannel, "", llGetOwner(), "");
showCurrentAnimations();
}
listen(integer channel, string name, key id, string msg)
{
msg = llToLower(llStringTrim(msg, STRING_TRIM));
if(msg == "bow")
{
llOwnerSay("Starting animation 'aim_l_bow' = 46bb4359-de38-4ed8-6a22-f1f52fe8f506");
llStartAnimation("aim_l_bow");
}
else if(msg == "bazooka")
{
llOwnerSay("Starting animation 'aim_r_bazooka' = b5b4a67d-0aee-30d2-72cd-77b333e932ef");
llStartAnimation("aim_r_bazooka");
}
else if(msg == "stop")
{
llOwnerSay("Stopping animations 'aim_l_bow' and 'aim_r_bazooka'");
llStopAnimation("aim_l_bow");
llStopAnimation("aim_r_bazooka");
}
llSleep(0.1);
showCurrentAnimations();
}
}
Maestro Linden
Hi SungAli Resident, I'm having trouble reproducing this with Second Life Release 7.1.13.14343205944 (64bit) on server 2025-03-14.13862207703.
I set up a test script that plays two competing internal animations, which both animate the arms with priority 2, and compared the animations observed on the animating "UserA" avatar's viewer vs an observing "UserB" avatar's viewer. The two scenarios I looked at were:
1) UserA starting both animations, then UserB going 'far away' (either within the same sim or to a distant sim, then TP'ing back after a few minutes) before returning.
2) UserB going 'far away', then UserA starting the animations, then UserB returning
In addition to looking at how the 2 viewers animated UserA, I looked at the incoming 'AvatarAnimation' messages about UserA coming from the simulator to UserB's viewer using a tool called Hippolyzer.
In all cases I'm seeing congruency between what UserA's viewer shows and what UserB's viewer shows. I'm detailing both scenarios in separate comments to get around canny's character limit.
Load More
→