From 2408ce790af9adfcd3236a32246304f89e9c6576 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 15 Jul 2021 22:05:04 +0100 Subject: [PATCH] mantis 8908: use the prim idea of running animations, (by name or by key) on llStopObjectAnimation(), ignoring the prim inventory (unlike sl?) --- .../Framework/Scenes/SceneObjectPart.cs | 37 +++++++++++++++++++ .../Shared/Api/Implementation/LSL_Api.cs | 6 +-- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 0ea04a636a..53c71aa474 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -5770,6 +5770,43 @@ namespace OpenSim.Region.Framework.Scenes return false; } + public bool RemoveAnimation(string anim) + { + if (ParentGroup == null || ParentGroup.IsDeleted || ParentGroup.inTransit || string.IsNullOrWhiteSpace(anim)) + return false; + + lock (animsLock) + { + if (Animations == null || Animations.Count == 0) + return false; + + if (!UUID.TryParse(anim, out UUID animId)) + { + if (AnimationsNames == null || AnimationsNames.Count == 0) + return false; + + foreach (KeyValuePair kvp in AnimationsNames) + { + if (anim.Equals(kvp.Value, StringComparison.InvariantCultureIgnoreCase)) + { + animId = kvp.Key; + break; + } + } + } + + if (Animations.ContainsKey(animId)) + { + Animations.Remove(animId); + if (AnimationsNames != null) + AnimationsNames.Remove(animId); + ScheduleUpdate(PrimUpdateFlags.Animations); + return true; + } + } + return false; + } + public int ClearObjectAnimations() { int ret = 0; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 0c0ca40c25..9de2c8ca78 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -4192,11 +4192,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llStopObjectAnimation(string anim) { - UUID animID = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, anim, AssetType.Animation); - if (animID == UUID.Zero) - animID = DefaultAvatarAnimations.GetDefaultAnimation(anim); - if (animID != UUID.Zero) - m_host.RemoveAnimation(animID); + m_host.RemoveAnimation(anim); } public LSL_List llGetObjectAnimationNames()