From a32060180fd6e24c7188b24769e294146133d9a0 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 8 Mar 2019 19:14:09 +0000 Subject: agent animation object ids are only for self avatar --- .../Region/ClientStack/Linden/UDP/LLClientView.cs | 50 +++++++++++++++++----- 1 file changed, 40 insertions(+), 10 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index fb876de..6ec87ab 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -3833,24 +3833,54 @@ namespace OpenSim.Region.ClientStack.LindenUDP AvatarAnimationPacket ani = (AvatarAnimationPacket)PacketPool.Instance.GetPacket(PacketType.AvatarAnimation); // TODO: don't create new blocks if recycling an old packet - ani.AnimationSourceList = new AvatarAnimationPacket.AnimationSourceListBlock[animations.Length]; ani.Sender = new AvatarAnimationPacket.SenderBlock(); ani.Sender.ID = sourceAgentId; ani.AnimationList = new AvatarAnimationPacket.AnimationListBlock[animations.Length]; ani.PhysicalAvatarEventList = new AvatarAnimationPacket.PhysicalAvatarEventListBlock[0]; - for (int i = 0; i < animations.Length; ++i) + //self animations + if (sourceAgentId == AgentId) { - ani.AnimationList[i] = new AvatarAnimationPacket.AnimationListBlock(); - ani.AnimationList[i].AnimID = animations[i]; - ani.AnimationList[i].AnimSequenceID = seqs[i]; + List withobjects = new List(animations.Length); + List noobjects = new List(animations.Length); + for(int i = 0; i < animations.Length; ++i) + { + if(objectIDs[i] == sourceAgentId || objectIDs[i] == UUID.Zero) + noobjects.Add(i); + else + withobjects.Add(i); + } - ani.AnimationSourceList[i] = new AvatarAnimationPacket.AnimationSourceListBlock(); - if (objectIDs[i].Equals(sourceAgentId)) - ani.AnimationSourceList[i].ObjectID = UUID.Zero; - else - ani.AnimationSourceList[i].ObjectID = objectIDs[i]; + ani.AnimationSourceList = new AvatarAnimationPacket.AnimationSourceListBlock[withobjects.Count]; + int k = 0; + foreach (int i in withobjects) + { + ani.AnimationList[k] = new AvatarAnimationPacket.AnimationListBlock(); + ani.AnimationList[k].AnimID = animations[i]; + ani.AnimationList[k].AnimSequenceID = seqs[i]; + ani.AnimationSourceList[k] = new AvatarAnimationPacket.AnimationSourceListBlock(); + ani.AnimationSourceList[k].ObjectID = objectIDs[i]; + k++; + } + foreach (int i in noobjects) + { + ani.AnimationList[k] = new AvatarAnimationPacket.AnimationListBlock(); + ani.AnimationList[k].AnimID = animations[i]; + ani.AnimationList[k].AnimSequenceID = seqs[i]; + k++; + } + } + else + { + ani.AnimationSourceList = new AvatarAnimationPacket.AnimationSourceListBlock[0]; + for (int i = 0; i < animations.Length; ++i) + { + ani.AnimationList[i] = new AvatarAnimationPacket.AnimationListBlock(); + ani.AnimationList[i].AnimID = animations[i]; + ani.AnimationList[i].AnimSequenceID = seqs[i]; + } } + OutPacket(ani, ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority); } -- cgit v1.1