diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs
index 759059f252..673810e8b1 100644
--- a/OpenSim/Framework/IClientAPI.cs
+++ b/OpenSim/Framework/IClientAPI.cs
@@ -794,7 +794,7 @@ namespace OpenSim.Framework
///
void SendKillObject(ulong regionHandle, uint localID);
- void SendAnimations(UUID[] animID, int[] seqs, UUID sourceAgentId);
+ void SendAnimations(UUID[] animID, int[] seqs, UUID sourceAgentId, UUID[] objectIDs);
void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args);
void SendChatMessage(string message, byte type, Vector3 fromPos, string fromName, UUID fromAgentID, byte source,
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index dd0f6ac6a4..3565e5a3c9 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -2493,15 +2493,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
OutPacket(avp, ThrottleOutPacketType.Task);
}
- public void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId)
+ public void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs)
{
//m_log.DebugFormat("[CLIENT]: Sending animations to {0}", Name);
AvatarAnimationPacket ani = (AvatarAnimationPacket)PacketPool.Instance.GetPacket(PacketType.AvatarAnimation);
// TODO: don't create new blocks if recycling an old packet
- ani.AnimationSourceList = new AvatarAnimationPacket.AnimationSourceListBlock[1];
- ani.AnimationSourceList[0] = new AvatarAnimationPacket.AnimationSourceListBlock();
- ani.AnimationSourceList[0].ObjectID = sourceAgentId;
+ ani.AnimationSourceList = new AvatarAnimationPacket.AnimationSourceListBlock[animations.Length];
ani.Sender = new AvatarAnimationPacket.SenderBlock();
ani.Sender.ID = sourceAgentId;
ani.AnimationList = new AvatarAnimationPacket.AnimationListBlock[animations.Length];
@@ -2511,6 +2509,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
ani.AnimationList[i] = new AvatarAnimationPacket.AnimationListBlock();
ani.AnimationList[i].AnimID = animations[i];
ani.AnimationList[i].AnimSequenceID = seqs[i];
+
+ ani.AnimationSourceList[i] = new AvatarAnimationPacket.AnimationSourceListBlock();
+ ani.AnimationSourceList[i].ObjectID = objectIDs[i];
+ if (objectIDs[i] == UUID.Zero)
+ ani.AnimationSourceList[i].ObjectID = sourceAgentId;
}
ani.Header.Reliable = false;
OutPacket(ani, ThrottleOutPacketType.Task);
diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
index 1ee4424cbf..4e11759f27 100644
--- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
+++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
@@ -393,7 +393,7 @@ namespace OpenSim.Region.Examples.SimpleModule
}
- public virtual void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId)
+ public virtual void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs)
{
}
diff --git a/OpenSim/Region/Framework/Scenes/Animation.cs b/OpenSim/Region/Framework/Scenes/Animation.cs
index cb0afa7514..6f0681c42b 100644
--- a/OpenSim/Region/Framework/Scenes/Animation.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation.cs
@@ -45,14 +45,22 @@ namespace OpenSim.Region.Framework.Scenes
set { sequenceNum = value; }
}
+ private UUID objectID;
+ public UUID ObjectID
+ {
+ get { return objectID; }
+ set { objectID = value; }
+ }
+
public Animation()
{
}
- public Animation(UUID animID, int sequenceNum)
+ public Animation(UUID animID, int sequenceNum, UUID objectID)
{
this.animID = animID;
this.sequenceNum = sequenceNum;
+ this.objectID = objectID;
}
}
}
diff --git a/OpenSim/Region/Framework/Scenes/AnimationSet.cs b/OpenSim/Region/Framework/Scenes/AnimationSet.cs
index 49bcda861a..864e599d4b 100644
--- a/OpenSim/Region/Framework/Scenes/AnimationSet.cs
+++ b/OpenSim/Region/Framework/Scenes/AnimationSet.cs
@@ -60,13 +60,13 @@ namespace OpenSim.Region.Framework.Scenes
return false;
}
- public bool Add(UUID animID, int sequenceNum)
+ public bool Add(UUID animID, int sequenceNum, UUID objectID)
{
lock (m_animations)
{
if (!HasAnimation(animID))
{
- m_animations.Add(new Animation(animID, sequenceNum));
+ m_animations.Add(new Animation(animID, sequenceNum, objectID));
return true;
}
}
@@ -106,11 +106,11 @@ namespace OpenSim.Region.Framework.Scenes
/// The default animation is reserved for "main" animations
/// that are mutually exclusive, e.g. flying and sitting.
///
- public bool SetDefaultAnimation(UUID animID, int sequenceNum)
+ public bool SetDefaultAnimation(UUID animID, int sequenceNum, UUID objectID)
{
if (m_defaultAnimation.AnimID != animID)
{
- m_defaultAnimation = new Animation(animID, sequenceNum);
+ m_defaultAnimation = new Animation(animID, sequenceNum, objectID);
return true;
}
return false;
@@ -118,27 +118,28 @@ namespace OpenSim.Region.Framework.Scenes
protected bool ResetDefaultAnimation()
{
- return TrySetDefaultAnimation("STAND", 1);
+ return TrySetDefaultAnimation("STAND", 1, UUID.Zero);
}
///
/// Set the animation as the default animation if it's known
///
- public bool TrySetDefaultAnimation(string anim, int sequenceNum)
+ public bool TrySetDefaultAnimation(string anim, int sequenceNum, UUID objectID)
{
if (Animations.AnimsUUID.ContainsKey(anim))
{
- return SetDefaultAnimation(Animations.AnimsUUID[anim], sequenceNum);
+ return SetDefaultAnimation(Animations.AnimsUUID[anim], sequenceNum, objectID);
}
return false;
}
- public void GetArrays(out UUID[] animIDs, out int[] sequenceNums)
+ public void GetArrays(out UUID[] animIDs, out int[] sequenceNums, out UUID[] objectIDs)
{
lock (m_animations)
{
animIDs = new UUID[m_animations.Count + 1];
sequenceNums = new int[m_animations.Count + 1];
+ objectIDs = new UUID[m_animations.Count + 1];
animIDs[0] = m_defaultAnimation.AnimID;
sequenceNums[0] = m_defaultAnimation.SequenceNum;
@@ -147,6 +148,7 @@ namespace OpenSim.Region.Framework.Scenes
{
animIDs[i + 1] = m_animations[i].AnimID;
sequenceNums[i + 1] = m_animations[i].SequenceNum;
+ objectIDs[i + i] = m_animations[i].ObjectID;
}
}
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index fc3166a5be..a488f59101 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1754,18 +1754,18 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- public void AddAnimation(UUID animID)
+ public void AddAnimation(UUID animID, UUID objectID)
{
if (m_isChildAgent)
return;
- if (m_animations.Add(animID, m_controllingClient.NextAnimationSequenceNumber))
+ if (m_animations.Add(animID, m_controllingClient.NextAnimationSequenceNumber, objectID))
{
SendAnimPack();
}
}
- public void AddAnimation(string name)
+ public void AddAnimation(string name, UUID objectID)
{
if (m_isChildAgent)
return;
@@ -1774,7 +1774,7 @@ namespace OpenSim.Region.Framework.Scenes
if (animID == UUID.Zero)
return;
- AddAnimation(animID);
+ AddAnimation(animID, objectID);
}
public void RemoveAnimation(UUID animID)
@@ -1804,13 +1804,14 @@ namespace OpenSim.Region.Framework.Scenes
{
UUID[] animIDs;
int[] sequenceNums;
- m_animations.GetArrays( out animIDs, out sequenceNums );
+ UUID[] objectIDs;
+ m_animations.GetArrays( out animIDs, out sequenceNums, out objectIDs);
return animIDs;
}
public void HandleStartAnim(IClientAPI remoteClient, UUID animID)
{
- AddAnimation(animID);
+ AddAnimation(animID, UUID.Zero);
}
public void HandleStopAnim(IClientAPI remoteClient, UUID animID)
@@ -1826,7 +1827,7 @@ namespace OpenSim.Region.Framework.Scenes
{
//m_log.DebugFormat("Updating movement animation to {0}", anim);
- if (m_animations.TrySetDefaultAnimation(anim, m_controllingClient.NextAnimationSequenceNumber))
+ if (m_animations.TrySetDefaultAnimation(anim, m_controllingClient.NextAnimationSequenceNumber, UUID.Zero))
{
SendAnimPack();
}
@@ -2284,13 +2285,13 @@ namespace OpenSim.Region.Framework.Scenes
///
///
///
- public void SendAnimPack(UUID[] animations, int[] seqs)
+ public void SendAnimPack(UUID[] animations, int[] seqs, UUID[] objectIDs)
{
if (m_isChildAgent)
return;
m_scene.Broadcast(
- delegate(IClientAPI client) { client.SendAnimations(animations, seqs, m_controllingClient.AgentId); });
+ delegate(IClientAPI client) { client.SendAnimations(animations, seqs, m_controllingClient.AgentId, objectIDs); });
}
public void SendAnimPackToClient(IClientAPI client)
@@ -2299,10 +2300,11 @@ namespace OpenSim.Region.Framework.Scenes
return;
UUID[] animIDs;
int[] sequenceNums;
+ UUID[] objectIDs;
- m_animations.GetArrays(out animIDs, out sequenceNums);
+ m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
- client.SendAnimations(animIDs, sequenceNums, m_controllingClient.AgentId);
+ client.SendAnimations(animIDs, sequenceNums, m_controllingClient.AgentId, objectIDs);
}
///
@@ -2317,10 +2319,11 @@ namespace OpenSim.Region.Framework.Scenes
UUID[] animIDs;
int[] sequenceNums;
+ UUID[] objectIDs;
- m_animations.GetArrays(out animIDs, out sequenceNums);
+ m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
- SendAnimPack(animIDs, sequenceNums);
+ SendAnimPack(animIDs, sequenceNums, objectIDs);
}
#endregion
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
index 91518e243e..c84ede8194 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
@@ -482,7 +482,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
}
- public virtual void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId)
+ public virtual void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs)
{
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index e5f097f02a..5f6ea16c8f 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2854,9 +2854,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// Do NOT try to parse UUID, animations cannot be triggered by ID
UUID animID=InventoryKey(anim, (int)AssetType.Animation);
if (animID == UUID.Zero)
- presence.AddAnimation(anim);
+ presence.AddAnimation(anim, m_host.UUID);
else
- presence.AddAnimation(animID);
+ presence.AddAnimation(animID, m_host.UUID);
}
}
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index eeef58bbac..564648bfac 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -559,7 +559,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (World.Entities.ContainsKey((UUID)avatar) && World.Entities[avatarID] is ScenePresence)
{
ScenePresence target = (ScenePresence)World.Entities[avatarID];
- target.AddAnimation(animation);
+ target.AddAnimation(animation, m_host.UUID);
}
}
diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs
index 2463b3b39b..373ee134ae 100644
--- a/OpenSim/Tests/Common/Mock/TestClient.cs
+++ b/OpenSim/Tests/Common/Mock/TestClient.cs
@@ -443,7 +443,7 @@ namespace OpenSim.Tests.Common.Mock
}
- public virtual void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId)
+ public virtual void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs)
{
}