From 5376d0a97bb367c354d96b0bd7a78a2ae6225280 Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Tue, 9 Sep 2014 03:31:04 +0200 Subject: [PATCH 1/5] Also check standard anim names --- .../Shared/Api/Implementation/LSL_Api.cs | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index f4809a79ab..29e526d243 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -13510,11 +13510,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (presence == null) return; - UUID animID = ScriptUtils.GetAssetIdFromItemName(m_host, anim, (int)AssetType.Animation); - if (animID == UUID.Zero) + UUID animID; + if (animState == anim) { - llShout(ScriptBaseClass.DEBUG_CHANNEL, "Animation not found"); - return; + animID = UUID.Zero; + } + else if (MovementAnimationsForLSL.ContainsKey(anim)) + { + animID = DefaultAvatarAnimations.AnimsUUID[MovementAnimationsForLSL[anim]]; + } + else + { + animID = ScriptUtils.GetAssetIdFromItemName(m_host, anim, (int)AssetType.Animation); + if (animID == UUID.Zero) + { + llShout(ScriptBaseClass.DEBUG_CHANNEL, "Animation not found"); + return; + } } presence.SetAnimationOverride(state, animID); From 18023169e79584cd3ddb4f544f9d485edc9e1b85 Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Tue, 9 Sep 2014 04:12:10 +0200 Subject: [PATCH 2/5] Actually do the overriding --- .../Framework/Scenes/Animation/ScenePresenceAnimator.cs | 8 +++++++- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 7 +++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index fdadd32726..3cb8f598e8 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs @@ -196,7 +196,13 @@ namespace OpenSim.Region.Framework.Scenes.Animation // "[SCENE PRESENCE ANIMATOR]: Setting movement animation {0} for {1}", // anim, m_scenePresence.Name); - if (m_animations.TrySetDefaultAnimation( + UUID overridenAnim = m_scenePresence.Overrides.GetOverriddenAnimation(anim); + if (overridenAnim != UUID.Zero) + { + m_animations.SetDefaultAnimation(overridenAnim, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, m_scenePresence.UUID); + ret = true; + } + else if (m_animations.TrySetDefaultAnimation( anim, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, m_scenePresence.UUID)) { // m_log.DebugFormat( diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 4d5f747c99..8f6b41b5ca 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -239,6 +239,11 @@ namespace OpenSim.Region.Framework.Scenes /// public ScenePresenceAnimator Animator { get; private set; } + /// + /// Server Side Animation Override + /// + public MovementAnimationOverrides Overrides { get; private set; } + /// /// Attachments recorded on this avatar. /// @@ -967,6 +972,7 @@ namespace OpenSim.Region.Framework.Scenes IsLoggingIn = false; m_sendCoarseLocationsMethod = SendCoarseLocationsDefault; Animator = new ScenePresenceAnimator(this); + Overrides = new MovementAnimationOverrides(); PresenceType = type; DrawDistance = world.DefaultDrawDistance; RegionHandle = world.RegionInfo.RegionHandle; @@ -6007,6 +6013,7 @@ namespace OpenSim.Region.Framework.Scenes public void SetAnimationOverride(string animState, UUID animID) { + Overrides.SetOverride(animState, animID); } } } From d2324b64c719f429e11b3946936341343d70d750 Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Tue, 9 Sep 2014 04:12:58 +0200 Subject: [PATCH 3/5] Add missing file --- .../Animation/MovementAnimationOverrides.cs | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs diff --git a/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs b/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs new file mode 100644 index 0000000000..04dccc8e25 --- /dev/null +++ b/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs @@ -0,0 +1,76 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Xml; +using System.Collections.Generic; +using System.Reflection; +using System.Threading; +using System.Timers; +using Timer = System.Timers.Timer; +using OpenMetaverse; +using log4net; +using Nini.Config; +using OpenSim.Framework; +using OpenSim.Framework.Client; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes.Animation; +using OpenSim.Region.Framework.Scenes.Types; +using OpenSim.Region.Physics.Manager; +using GridRegion = OpenSim.Services.Interfaces.GridRegion; +using OpenSim.Services.Interfaces; +using TeleportFlags = OpenSim.Framework.Constants.TeleportFlags; + +namespace OpenSim.Region.Framework.Scenes +{ + public class MovementAnimationOverrides + { + private Dictionary m_overrides = new Dictionary(); + public void SetOverride(string state, UUID animID) + { + if (animID == UUID.Zero) + { + m_overrides.Remove(state); + return; + } + + lock (m_overrides) + m_overrides[state] = animID; + } + + public UUID GetOverriddenAnimation(string state) + { + lock (m_overrides) + { + if (m_overrides.ContainsKey(state)) + return m_overrides[state]; + } + + return UUID.Zero; + } + } +} From aa84ad369caf922534e85b5d2da12d716d6696f6 Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Tue, 9 Sep 2014 04:35:08 +0200 Subject: [PATCH 4/5] Add some forgotten calls --- .../Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index 3cb8f598e8..9fd5e645d5 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs @@ -200,6 +200,8 @@ namespace OpenSim.Region.Framework.Scenes.Animation if (overridenAnim != UUID.Zero) { m_animations.SetDefaultAnimation(overridenAnim, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, m_scenePresence.UUID); + m_scenePresence.SendScriptEventToAttachments("changed", new Object[] { (int)Changed.ANIMATION}); + SendAnimPack(); ret = true; } else if (m_animations.TrySetDefaultAnimation( From 347c5b3070f7ce6ecc2a617e09fd02e4616061ba Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Tue, 9 Sep 2014 05:20:53 +0200 Subject: [PATCH 5/5] Add perms check --- .../Framework/Scenes/Animation/MovementAnimationOverrides.cs | 5 +++++ .../Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 3 +++ 2 files changed, 8 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs b/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs index 04dccc8e25..f77d29a2a0 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs @@ -49,6 +49,9 @@ namespace OpenSim.Region.Framework.Scenes { public class MovementAnimationOverrides { + private static readonly ILog m_log = + LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private Dictionary m_overrides = new Dictionary(); public void SetOverride(string state, UUID animID) { @@ -58,6 +61,8 @@ namespace OpenSim.Region.Framework.Scenes return; } + m_log.DebugFormat("Setting override for {0} to {1}", state, animID); + lock (m_overrides) m_overrides[state] = animID; } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 29e526d243..1536959749 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -13497,7 +13497,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } if (m_item.PermsGranter == UUID.Zero) + { + llShout(ScriptBaseClass.DEBUG_CHANNEL, "No permission to override animations"); return; + } if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_OVERRIDE_ANIMATIONS) == 0) {