add llObjectGetLinkKey(...)

This commit is contained in:
UbitUmarov
2022-10-22 13:19:13 +01:00
parent e5fd020b97
commit 016ff2fb11
3 changed files with 68 additions and 13 deletions

View File

@@ -655,14 +655,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
public List<ScenePresence> GetLinkAvatars(int linkType)
{
if (m_host == null)
return new List<ScenePresence>();
return GetLinkAvatars(linkType, m_host.ParentGroup);
}
public List<ScenePresence> GetLinkAvatars(int linkType, SceneObjectGroup sog)
{
List<ScenePresence> ret = new List<ScenePresence>();
if (m_host == null || m_host.ParentGroup == null || m_host.ParentGroup.IsDeleted)
if (sog == null || sog.IsDeleted)
return ret;
// List<ScenePresence> avs = m_host.ParentGroup.GetLinkedAvatars();
// this needs check
List<ScenePresence> avs = m_host.ParentGroup.GetSittingAvatars();
List<ScenePresence> 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<ScenePresence> avatars = GetLinkAvatars(ScriptBaseClass.LINK_SET);
List<ScenePresence> 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<ScenePresence> avatars = GetLinkAvatars(ScriptBaseClass.LINK_SET, sog);
if (avatars.Count > linknum)
{
return avatars[linknum].UUID.ToString();

View File

@@ -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);

View File

@@ -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);