From efb9b7014e928aa9be8200d18248518bb503ad7c Mon Sep 17 00:00:00 2001
From: Melanie
Date: Thu, 4 Oct 2012 15:20:04 +0200
Subject: Allow default animation to be stopped to be replaced with another
 one. Fixes Mantis #6327

---
 .../Framework/Scenes/Animation/AnimationSet.cs     | 27 ++++++++++++++--------
 .../Scenes/Animation/ScenePresenceAnimator.cs      | 18 ++++++++++-----
 2 files changed, 29 insertions(+), 16 deletions(-)

diff --git a/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs b/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs
index 33041e9..ad421ee 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs
@@ -87,7 +87,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
             {
                 if (m_defaultAnimation.AnimID == animID)
                 {
-                    ResetDefaultAnimation();
+                    m_defaultAnimation = new OpenSim.Framework.Animation(UUID.Zero, 1, UUID.Zero);
                 }
                 else if (HasAnimation(animID))
                 {
@@ -149,19 +149,26 @@ namespace OpenSim.Region.Framework.Scenes.Animation
         {
             lock (m_animations)
             {
-                animIDs = new UUID[m_animations.Count + 1];
-                sequenceNums = new int[m_animations.Count + 1];
-                objectIDs = new UUID[m_animations.Count + 1];
+                int defaultSize = 0;
+                if (m_defaultAnimation.AnimID != UUID.Zero)
+                    defaultSize++;
 
-                animIDs[0] = m_defaultAnimation.AnimID;
-                sequenceNums[0] = m_defaultAnimation.SequenceNum;
-                objectIDs[0] = m_defaultAnimation.ObjectID;
+                animIDs = new UUID[m_animations.Count + defaultSize];
+                sequenceNums = new int[m_animations.Count + defaultSize];
+                objectIDs = new UUID[m_animations.Count + defaultSize];
+
+                if (m_defaultAnimation.AnimID != UUID.Zero)
+                {
+                    animIDs[0] = m_defaultAnimation.AnimID;
+                    sequenceNums[0] = m_defaultAnimation.SequenceNum;
+                    objectIDs[0] = m_defaultAnimation.ObjectID;
+                }
 
                 for (int i = 0; i < m_animations.Count; ++i)
                 {
-                    animIDs[i + 1] = m_animations[i].AnimID;
-                    sequenceNums[i + 1] = m_animations[i].SequenceNum;
-                    objectIDs[i + 1] = m_animations[i].ObjectID;
+                    animIDs[i + defaultSize] = m_animations[i].AnimID;
+                    sequenceNums[i + defaultSize] = m_animations[i].SequenceNum;
+                    objectIDs[i + defaultSize] = m_animations[i].ObjectID;
                 }
             }
         }
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
index 50a176b..9458079 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
@@ -424,13 +424,19 @@ namespace OpenSim.Region.Framework.Scenes.Animation
         {
             lock (m_animations)
             {
-                CurrentMovementAnimation = DetermineMovementAnimation();
+                string newMovementAnimation = DetermineMovementAnimation();
+                if (CurrentMovementAnimation != newMovementAnimation)
+                {
+                    CurrentMovementAnimation = DetermineMovementAnimation();
 
-//                m_log.DebugFormat(
-//                    "[SCENE PRESENCE ANIMATOR]: Determined animation {0} for {1} in UpdateMovementAnimations()",
-//                    CurrentMovementAnimation, m_scenePresence.Name);
+//                    m_log.DebugFormat(
+//                        "[SCENE PRESENCE ANIMATOR]: Determined animation {0} for {1} in UpdateMovementAnimations()",
+//                        CurrentMovementAnimation, m_scenePresence.Name);
 
-                TrySetMovementAnimation(CurrentMovementAnimation);
+                    // Only set it if it's actually changed, give a script
+                    // a chance to stop a default animation
+                    TrySetMovementAnimation(CurrentMovementAnimation);
+                }
             }
         }
 
@@ -552,4 +558,4 @@ namespace OpenSim.Region.Framework.Scenes.Animation
             SendAnimPack(animIDs, sequenceNums, objectIDs);
         }
     }
-}
\ No newline at end of file
+}
-- 
cgit v1.1


From d5ea203f934416c4c703ca899c7981b2f5ee550c Mon Sep 17 00:00:00 2001
From: Melanie
Date: Fri, 5 Oct 2012 00:15:55 +0200
Subject: Fix threading in remote asset connector

---
 .../Connectors/Asset/AssetServicesConnector.cs     | 37 ++++++++++++----------
 1 file changed, 21 insertions(+), 16 deletions(-)

diff --git a/OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs b/OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs
index 9d6d9ad..7f32ad3 100644
--- a/OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs
+++ b/OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs
@@ -295,25 +295,30 @@ namespace OpenSim.Services.Connectors
                 bool success = false;
                 try
                 {
-                    AsynchronousRestObjectRequester.MakeRequest<int, AssetBase>("GET", uri, 0,
-                        delegate(AssetBase a)
-                        {
-                            if (m_Cache != null)
-                                m_Cache.Cache(a);
+                    AssetBase a = SynchronousRestObjectRequester.MakeRequest<int, AssetBase>("GET", uri, 0, 30);
+                    if (a != null)
+                    {
+                        if (m_Cache != null)
+                            m_Cache.Cache(a);
 
-                            List<AssetRetrievedEx> handlers;
-                            lock (m_AssetHandlers)
+                        List<AssetRetrievedEx> handlers;
+                        lock (m_AssetHandlers)
+                        {
+                            handlers = m_AssetHandlers[id];
+                            m_AssetHandlers.Remove(id);
+                        }
+                        foreach (AssetRetrievedEx h in handlers)
+                        {
+                            Util.FireAndForget(x =>
                             {
-                                handlers = m_AssetHandlers[id];
-                                m_AssetHandlers.Remove(id);
-                            }
-                            foreach (AssetRetrievedEx h in handlers)
                                 h.Invoke(a);
-                            if (handlers != null)
-                                handlers.Clear();
-                        }, 30);
+                            });
+                        }
+                        if (handlers != null)
+                            handlers.Clear();
                     
-                    success = true;
+                        success = true;
+                    }
                 }
                 finally
                 {
@@ -326,7 +331,7 @@ namespace OpenSim.Services.Connectors
                             m_AssetHandlers.Remove(id);
                         }
                         if (handlers != null)
-                        handlers.Clear();
+                            handlers.Clear();
                     }
                 }
             }
-- 
cgit v1.1