diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index ea37803525..9274fe2996 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -784,41 +784,41 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api switch (linkType) { - case ScriptBaseClass.LINK_SET: - return new List(part.ParentGroup.Parts); + case ScriptBaseClass.LINK_SET: + return new List(part.ParentGroup.Parts); - case ScriptBaseClass.LINK_ROOT: - ret.Add(part.ParentGroup.RootPart); - return ret; - - case ScriptBaseClass.LINK_ALL_OTHERS: - ret = new List(part.ParentGroup.Parts); - - if (ret.Contains(part)) - ret.Remove(part); - - return ret; - - case ScriptBaseClass.LINK_ALL_CHILDREN: - ret = new List(part.ParentGroup.Parts); - - if (ret.Contains(part.ParentGroup.RootPart)) - ret.Remove(part.ParentGroup.RootPart); - return ret; - - case ScriptBaseClass.LINK_THIS: - ret.Add(part); - return ret; - - default: - if (linkType < 0) + case ScriptBaseClass.LINK_ROOT: + ret.Add(part.ParentGroup.RootPart); return ret; - SceneObjectPart target = part.ParentGroup.GetLinkNumPart(linkType); - if (target == null) + case ScriptBaseClass.LINK_ALL_OTHERS: + ret = new List(part.ParentGroup.Parts); + + if (ret.Contains(part)) + ret.Remove(part); + + return ret; + + case ScriptBaseClass.LINK_ALL_CHILDREN: + ret = new List(part.ParentGroup.Parts); + + if (ret.Contains(part.ParentGroup.RootPart)) + ret.Remove(part.ParentGroup.RootPart); + return ret; + + case ScriptBaseClass.LINK_THIS: + ret.Add(part); + return ret; + + default: + if (linkType < 0) + return ret; + + SceneObjectPart target = part.ParentGroup.GetLinkNumPart(linkType); + if (target == null) + return ret; + ret.Add(target); return ret; - ret.Add(target); - return ret; } } @@ -3139,6 +3139,34 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_SoundModule.SendSound(m_host.UUID, soundID, volume, false, 0, false, false); } + public void llLinkPlaySound(LSL_Integer linknumber, string sound, double volume) + { + if (m_SoundModule == null) + return; + if (m_host.ParentGroup == null || m_host.ParentGroup.IsDeleted) + return; + + SceneObjectPart sop; + if (linknumber = ScriptBaseClass.LINK_THIS) + sop = m_host; + else if (linknumber < 0) + return; + else if (linknumber < 2) + sop = m_host.ParentGroup.RootPart; + else + sop = m_host.ParentGroup.GetLinkNumPart(linknumber); + + if(sop == null) + return; + + UUID soundID = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound, AssetType.Sound); + if (soundID.IsZero()) + return; + + // send the sound, once, to all clients in range + m_SoundModule.SendSound(sop.UUID, soundID, volume, false, 0, false, false); + } + public void llLoopSound(string sound, double volume) { @@ -3213,6 +3241,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_SoundModule.StopSound(m_host.UUID); } + public void llLinkStopSound(LSL_Integer linknumber) + { + if (m_SoundModule != null) + { + foreach(SceneObjectPart sop in GetLinkParts(linknumber)) + m_SoundModule.StopSound(sop.UUID); + } + } + public void llPreloadSound(string sound) { @@ -6685,6 +6722,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api ScriptSleep(m_sleepMsOnAdjustSoundVolume); } + public void llLinkAdjustSoundVolume(LSL_Integer linknumber, LSL_Float volume) + { + List parts = GetLinkParts(linknumber); + foreach (SceneObjectPart part in parts) + { + part.AdjustSoundGain(volume); + } + ScriptSleep(m_sleepMsOnAdjustSoundVolume); + } + public void llSetSoundRadius(double radius) { m_host.SoundRadius = radius; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs index 66562915c3..caef7b1f7c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs @@ -487,5 +487,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_Integer llOrd(LSL_String s, LSL_Integer index); LSL_Integer llHash(LSL_String s); LSL_String llReplaceSubString(LSL_String src, LSL_String pattern, LSL_String replacement, int count); + + void llLinkAdjustSoundVolume(LSL_Integer linknumber, LSL_Float volume); + void llLinkStopSound(LSL_Integer linknumber); + void llLinkPlaySound(LSL_Integer linknumber, string sound, double volume); } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs index c7ccfb2b39..2ac54e6724 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs @@ -2214,5 +2214,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase { return m_LSL_Functions.llReplaceSubString(src, pattern, replacement, count); } + + public void llLinkAdjustSoundVolume(LSL_Integer linknumber, LSL_Float volume) + { + m_LSL_Functions.llLinkAdjustSoundVolume(linknumber, volume); + } + + public void llLinkStopSound(LSL_Integer linknumber) + { + m_LSL_Functions.llLinkStopSound(linknumber); + } + + public void llLinkPlaySound(LSL_Integer linknumber, string sound, double volume) + { + m_LSL_Functions.llLinkPlaySound(linknumber, sound, volume); + } } }