diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index cc1d0ebee4..8c1a14a92d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -655,14 +655,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } public List GetLinkAvatars(int linkType) + { + if (m_host == null) + return new List(); + + return GetLinkAvatars(linkType, m_host.ParentGroup); + + } + + public List GetLinkAvatars(int linkType, SceneObjectGroup sog) { List ret = new List(); - if (m_host == null || m_host.ParentGroup == null || m_host.ParentGroup.IsDeleted) + if (sog == null || sog.IsDeleted) return ret; - // List avs = m_host.ParentGroup.GetLinkedAvatars(); - // this needs check - List avs = m_host.ParentGroup.GetSittingAvatars(); + List avs = sog.GetSittingAvatars(); switch (linkType) { case ScriptBaseClass.LINK_SET: @@ -684,15 +691,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (linkType < 0) return ret; - int partCount = m_host.ParentGroup.GetPartCount(); + int partCount = sog.GetPartCount(); - if (linkType <= partCount) + linkType -= partCount; + if (linkType <= 0) { return ret; } else { - linkType = linkType - partCount; if (linkType > avs.Count) { return ret; @@ -4638,28 +4645,70 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Key llGetLinkKey(int linknum) { - if(linknum < 0) + if (linknum < 0) { if (linknum == ScriptBaseClass.LINK_THIS) return m_host.UUID.ToString(); return ScriptBaseClass.NULL_KEY; } + SceneObjectGroup sog = m_host.ParentGroup; if (linknum < 2) - return m_host.ParentGroup.RootPart.UUID.ToString(); + return sog.RootPart.UUID.ToString(); - SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknum); + SceneObjectPart part = sog.GetLinkNumPart(linknum); if (part != null) { return part.UUID.ToString(); } else { - if (linknum > m_host.ParentGroup.PrimCount) + if (linknum > sog.PrimCount) { - linknum -= m_host.ParentGroup.PrimCount + 1; + linknum -= sog.PrimCount + 1; - List avatars = GetLinkAvatars(ScriptBaseClass.LINK_SET); + List avatars = GetLinkAvatars(ScriptBaseClass.LINK_SET, sog); + if (avatars.Count > linknum) + { + return avatars[linknum].UUID.ToString(); + } + } + return ScriptBaseClass.NULL_KEY; + } + } + + public LSL_Key llObjectGetLinkKey(LSL_Key objectid, int linknum) + { + if(!UUID.TryParse(objectid, out UUID oID)) + return ScriptBaseClass.NULL_KEY; + + if (!World.TryGetSceneObjectPart(oID, out SceneObjectPart sop)) + return ScriptBaseClass.NULL_KEY; + + if (linknum < 0) + { + if (linknum == ScriptBaseClass.LINK_THIS) + return sop.UUID.ToString(); + return ScriptBaseClass.NULL_KEY; + } + + SceneObjectGroup sog = sop.ParentGroup; + + if (linknum < 2) + return sog.RootPart.UUID.ToString(); + + SceneObjectPart part = sog.GetLinkNumPart(linknum); + if (part != null) + { + return part.UUID.ToString(); + } + else + { + if (linknum > sog.PrimCount) + { + linknum -= sog.PrimCount + 1; + + List avatars = GetLinkAvatars(ScriptBaseClass.LINK_SET, sog); if (avatars.Count > linknum) { return avatars[linknum].UUID.ToString(); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs index 8fbce4deb0..d0514faf3b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs @@ -153,6 +153,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_Key llGetKey(); LSL_Key llGetLandOwnerAt(LSL_Vector pos); LSL_Key llGetLinkKey(int linknum); + LSL_Key llObjectGetLinkKey(LSL_Key objectid, int linknum); LSL_String llGetLinkName(int linknum); LSL_Integer llGetLinkNumber(); LSL_Integer llGetLinkNumberOfSides(int link); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs index 151daf1232..54a6947e05 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs @@ -563,6 +563,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llGetLinkKey(linknum); } + public LSL_Key llObjectGetLinkKey(LSL_Key objectid, int linknum) + { + return m_LSL_Functions.llObjectGetLinkKey(objectid, linknum); ; + } + public LSL_String llGetLinkName(int linknum) { return m_LSL_Functions.llGetLinkName(linknum);