From 016e58e354e11825510e1c4bc534e275168577bc Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Tue, 9 Sep 2014 21:53:27 +0100 Subject: *test* --- OpenSim/Framework/ChildAgentDataUpdate.cs | 36 ++++++++++++++++++++++ .../Scenes/Animation/MovementAnimationOverrides.cs | 17 ++++++++++ OpenSim/Region/Framework/Scenes/ScenePresence.cs | 6 +++- 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/OpenSim/Framework/ChildAgentDataUpdate.cs b/OpenSim/Framework/ChildAgentDataUpdate.cs index 91df64d..538e1b5 100644 --- a/OpenSim/Framework/ChildAgentDataUpdate.cs +++ b/OpenSim/Framework/ChildAgentDataUpdate.cs @@ -349,6 +349,8 @@ namespace OpenSim.Framework public List AttachmentObjects; public List AttachmentObjectStates; + public Dictionary MovementAnimationOverRides = new Dictionary(); + public virtual OSDMap Pack() { // m_log.InfoFormat("[CHILDAGENTDATAUPDATE] Pack data"); @@ -417,6 +419,21 @@ namespace OpenSim.Framework args["animation_state"] = AnimState.PackUpdateMessage(); } + if (MovementAnimationOverRides.Count > 0) + { + OSDArray AOs = new OSDArray(MovementAnimationOverRides.Count); + { + foreach (KeyValuePair kvp in MovementAnimationOverRides) + { + OSDMap ao = new OSDMap(2); + ao["state"] = OSD.FromString(kvp.Key); + ao["uuid"] = OSD.FromUUID(kvp.Value); + AOs.Add(ao); + } + } + args["movementAO"] = AOs; + } + if (Appearance != null) args["packed_appearance"] = Appearance.Pack(); @@ -640,6 +657,25 @@ namespace OpenSim.Framework } } + MovementAnimationOverRides.Clear(); + + if (args["movementAO"] != null && args["movementAO"].Type == OSDType.Array) + { + OSDArray AOs = (OSDArray)(args["movementAO"]); + int count = AOs.Count; + + for (int i = 0; i < count; i++) + { + OSDMap ao = (OSDMap)AOs[i]; + if (ao["state"] != null && ao["uuid"] != null) + { + string state = ao["state"].AsString(); + UUID id = ao["uuid"].AsUUID(); + MovementAnimationOverRides[state] = id; + } + } + } + //if ((args["agent_textures"] != null) && (args["agent_textures"]).Type == OSDType.Array) //{ // OSDArray textures = (OSDArray)(args["agent_textures"]); diff --git a/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs b/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs index db4003e..31fdb2c 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs @@ -80,5 +80,22 @@ namespace OpenSim.Region.Framework.Scenes return UUID.Zero; } + + public Dictionary CloneAOPairs() + { + lock (m_overrides) + { + return new Dictionary(m_overrides); + } + } + + public void CopyAOPairsFrom(Dictionary src) + { + lock (m_overrides) + { + m_overrides.Clear(); + m_overrides = new Dictionary(src); + } + } } } diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index b6eb4e4..7c515d5 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -4212,6 +4212,8 @@ namespace OpenSim.Region.Framework.Scenes cAgent.DefaultAnim = Animator.Animations.DefaultAnimation; cAgent.AnimState = Animator.Animations.ImplicitDefaultAnimation; + cAgent.MovementAnimationOverRides = Overrides.CloneAOPairs(); + if (Scene.AttachmentsModule != null) Scene.AttachmentsModule.CopyAttachments(this, cAgent); } @@ -4282,7 +4284,9 @@ namespace OpenSim.Region.Framework.Scenes catch { } Animator.ResetAnimations(); - + + Overrides.CopyAOPairsFrom(cAgent.MovementAnimationOverRides); + // FIXME: Why is this null check necessary? Where are the cases where we get a null Anims object? if (cAgent.DefaultAnim != null) Animator.Animations.SetDefaultAnimation(cAgent.DefaultAnim.AnimID, cAgent.DefaultAnim.SequenceNum, UUID.Zero); -- cgit v1.1