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})";