diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index e10af1fcc0..33dc85fb11 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -3049,7 +3049,20 @@ namespace OpenSim.Region.Framework.Scenes /// null if no child part with that linknum or child part public SceneObjectPart GetLinkNumPart(int linknum) { - SceneObjectPart[] parts = m_parts.GetArray(); + if (linknum < 0) + return null; + if (linknum < 2) + return RootPart; + + Span parts = m_parts.GetArray().AsSpan(); + SceneObjectPart sop; + if (linknum <= parts.Length) + { + sop = parts[linknum - 1]; + if (sop.LinkNum == linknum) + return sop; + } + for (int i = 0; i < parts.Length; i++) { if (parts[i].LinkNum == linknum) @@ -5268,6 +5281,18 @@ namespace OpenSim.Region.Framework.Scenes return m_sittingAvatars.Count; } + public ScenePresence GetLinkSitingAvatar(int linknumber) + { + lock(m_parts) + linknumber -= (m_parts.Count + 1); + if(linknumber >= 0) + { + lock (m_sittingAvatars) + return linknumber > m_sittingAvatars.Count ? null : m_sittingAvatars[linknumber]; + } + return null; + } + public override string ToString() { return $"{Name} {UUID} ({AbsolutePosition})";