This commit is contained in:
UbitUmarov
2024-02-21 14:12:15 +00:00
4 changed files with 328 additions and 1 deletions

View File

@@ -161,6 +161,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
protected ISoundModule m_SoundModule = null;
protected IEnvironmentModule m_envModule = null;
protected IGroupsModule m_groupsModule = null;
protected IMessageTransferModule m_TransferModule = null;
public void Initialize(IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item)
{
//private init
@@ -172,6 +173,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_SoundModule = m_ScriptEngine.World.RequestModuleInterface<ISoundModule>();
m_envModule = m_ScriptEngine.World.RequestModuleInterface<IEnvironmentModule>();
m_groupsModule = m_ScriptEngine.World.RequestModuleInterface<IGroupsModule>();
m_TransferModule = m_ScriptEngine.World.RequestModuleInterface<IMessageTransferModule>();
//private init
lock (m_OSSLLock)
@@ -2135,7 +2137,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
private void MessageObject(UUID objUUID, string message)
{
object[] resobj = new object[] { new LSL_Types.LSLString(m_host.UUID.ToString()), new LSL_Types.LSLString(message) };
object[] resobj = new object[] { new LSL_String(m_host.UUID.ToString()), new LSL_String(message) };
SceneObjectPart sceneOP = World.GetSceneObjectPart(objUUID);
@@ -5505,6 +5507,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return (item is null) ? LSL_String.Empty : item.Name;
}
public LSL_String osGetLinkInventoryName(LSL_Integer linkNumber, LSL_Key itemId)
{
if(linkNumber <= 1)
return LSL_String.Empty;
TaskInventoryItem item = null;
SceneObjectPart part = GetSingleLinkPart(linkNumber);
if(part == null)
return LSL_String.Empty;
if (UUID.TryParse(itemId, out UUID itemID))
item = part.Inventory.GetInventoryItem(itemID);
return (item is null) ? LSL_String.Empty : item.Name;
}
public LSL_String osGetInventoryDesc(LSL_String itemNameorid)
{
TaskInventoryItem item;
@@ -5516,6 +5534,203 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return (item == null) ? LSL_String.Empty : item.Description;
}
public LSL_String osGetLinkInventoryDesc(LSL_Integer linkNumber, LSL_String itemNameorid)
{
if(linkNumber <= 1)
return LSL_String.Empty;
TaskInventoryItem item;
SceneObjectPart part = GetSingleLinkPart(linkNumber);
if(part == null)
return LSL_String.Empty;
if (UUID.TryParse(itemNameorid, out UUID itemID))
item = part.Inventory.GetInventoryItem(itemID);
else
item = part.Inventory.GetInventoryItem(itemNameorid);
return (item == null) ? LSL_String.Empty : item.Description;
}
public LSL_Key osGetLinkInventoryKey(LSL_Integer linkNumber, LSL_String name)
{
if(linkNumber <= 1)
return LSL_String.NullKey;
SceneObjectPart part = GetSingleLinkPart(linkNumber);
if(part == null)
return LSL_String.NullKey;
TaskInventoryItem item = part.Inventory.GetInventoryItem(name);
if (item is null)
return LSL_String.NullKey;
if ((item.CurrentPermissions
& (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify))
== (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify))
{
return new LSL_Key(item.ItemID.ToString());
}
return LSL_String.NullKey;
}
public LSL_List osGetInventoryKeys(LSL_Integer type)
{
LSL_List ret = new();
m_host.TaskInventory.LockItemsForRead(true);
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
{
if (inv.Value.Type == type || type == -1)
ret.Add(inv.Value.ItemID.ToString());
}
m_host.TaskInventory.LockItemsForRead(false);
return ret;
}
public LSL_List osGetLinkInventoryKeys(LSL_Integer linkNumber, LSL_Integer type)
{
LSL_List ret = new();
if(linkNumber <= 1)
return ret;
SceneObjectPart part = GetSingleLinkPart(linkNumber);
if(part == null)
return ret;
part.TaskInventory.LockItemsForRead(true);
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in part.TaskInventory)
{
if (inv.Value.Type == type || type == -1)
ret.Add(inv.Value.ItemID.ToString());
}
part.TaskInventory.LockItemsForRead(false);
return ret;
}
public LSL_List osGetInventoryNames(LSL_Integer type)
{
LSL_List ret = new();
m_host.TaskInventory.LockItemsForRead(true);
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
{
if (inv.Value.Type == type || type == -1)
ret.Add(inv.Value.Name);
}
m_host.TaskInventory.LockItemsForRead(false);
return ret;
}
public LSL_List osGetLinkInventoryNames(LSL_Integer linkNumber, LSL_Integer type)
{
LSL_List ret = new();
if(linkNumber <= 1)
return ret;
SceneObjectPart part = GetSingleLinkPart(linkNumber);
if(part == null)
return ret;
part.TaskInventory.LockItemsForRead(true);
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in part.TaskInventory)
{
if (inv.Value.Type == type || type == -1)
ret.Add(inv.Value.Name);
}
part.TaskInventory.LockItemsForRead(false);
return ret;
}
///<summary>
/// Give a specified item from a child prim inventory
/// to a destination (object or avatar).
///</summary>
///<param name="linkNumber">The link number of the child prim.</param>
///<param name="destination">The UUID of the destination avatar or object.</param>
///<param name="inventory">The name of the item to give.</param>
public void osGiveLinkInventory(LSL_Integer linkNumber, LSL_Key destination, LSL_String inventory)
{
if(linkNumber <= 1)
return;
if (!UUID.TryParse(destination, out UUID destId) || destId.IsZero())
return;
SceneObjectPart part = GetSingleLinkPart(linkNumber);
if(part == null)
return;
UUID inventoryID = ScriptUtils.GetAssetIdFromKeyOrItemName(part, inventory);
if (inventoryID.IsZero())
return;
TaskInventoryItem item = part.Inventory.GetInventoryItem(inventory);
if (item == null)
return;
UUID objId = item.ItemID;
// check if destination is an object
if (World.GetSceneObjectPart(destId) != null)
{
// destination is an object
World.MoveTaskInventoryItem(destId, part, objId);
}
else
{
ScenePresence presence = World.GetScenePresence(destId);
if (presence == null)
{
UserAccount account = World.UserAccountService.GetUserAccount(World.RegionInfo.ScopeID, destId);
if (account == null)
{
GridUserInfo info = World.GridUserService.GetGridUserInfo(destId.ToString());
if(info == null || info.Online == false)
return;
}
}
// destination is an avatar
InventoryItemBase agentItem = World.MoveTaskInventoryItem(destId, UUID.Zero, part, objId, out string message);
if (agentItem == null)
{
m_LSL_Api.llSay(0, message);
return;
}
byte[] bucket = new byte[1];
bucket[0] = (byte)item.Type;
GridInstantMessage msg = new GridInstantMessage(World,
m_host.OwnerID, m_host.Name, destId,
(byte)InstantMessageDialog.TaskInventoryOffered,
m_host.OwnerID.Equals(m_host.GroupID), "'"+item.Name+"'. ("+m_host.Name+" is located at "+
World.RegionInfo.RegionName + " "+ m_host.AbsolutePosition.ToString() + ")",
agentItem.ID, true, m_host.AbsolutePosition,
bucket, true);
if (World.TryGetScenePresence(destId, out ScenePresence sp)){
sp.ControllingClient.SendInstantMessage(msg);
}
else{
m_TransferModule?.SendInstantMessage(msg, delegate(bool success) {});
}
//This delay should only occur when giving inventory to avatars.
ScriptSleep(3000);
}
}
public LSL_Key osGetLastChangedEventKey()
{
DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, 0);

View File

@@ -561,8 +561,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
LSL_Integer osApproxEquals(rotation ra, rotation rb, LSL_Float margin);
LSL_Key osGetInventoryLastOwner(LSL_String itemNameOrId);
LSL_Key osGetInventoryItemKey(LSL_String name);
LSL_Key osGetLinkInventoryKey(LSL_Integer linkNumber, LSL_String name);
LSL_String osGetInventoryName(LSL_Key itemId);
LSL_String osGetLinkInventoryName(LSL_Integer linkNumber, LSL_Key itemId);
LSL_String osGetInventoryDesc(LSL_String itemNameOrId);
LSL_String osGetLinkInventoryDesc(LSL_Integer linkNumber, LSL_String itemNameorid);
LSL_List osGetInventoryKeys(LSL_Integer type);
LSL_List osGetLinkInventoryKeys(LSL_Integer linkNumber, LSL_Integer type);
LSL_List osGetInventoryNames(LSL_Integer type);
LSL_List osGetLinkInventoryNames(LSL_Integer linkNumber, LSL_Integer type);
void osGiveLinkInventory(LSL_Integer linkNumber, LSL_Key destination, LSL_String inventory);
LSL_Key osGetLastChangedEventKey();
LSL_Float osGetPSTWallclock();
LSL_Rotation osSlerp(LSL_Rotation a, LSL_Rotation b, LSL_Float amount);

View File

@@ -1460,18 +1460,67 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
return m_OSSL_Functions.osGetInventoryItemKey(name);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public LSL_Key osGetLinkInventoryKey(LSL_Integer linkNumber, LSL_String name)
{
return m_OSSL_Functions.osGetLinkInventoryKey(linkNumber, name);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public LSL_List osGetInventoryKeys(LSL_Integer type)
{
return m_OSSL_Functions.osGetInventoryKeys(type);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public LSL_List osGetLinkInventoryKeys(LSL_Integer linkNumber, LSL_Integer type)
{
return m_OSSL_Functions.osGetLinkInventoryKeys(linkNumber, type);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public LSL_String osGetInventoryName(LSL_Key itemId)
{
return m_OSSL_Functions.osGetInventoryName(itemId);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public LSL_String osGetLinkInventoryName(LSL_Integer linkNumber, LSL_Key itemId)
{
return m_OSSL_Functions.osGetLinkInventoryName(linkNumber, itemId);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public LSL_List osGetInventoryNames(LSL_Integer type)
{
return m_OSSL_Functions.osGetInventoryNames(type);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public LSL_List osGetLinkInventoryNames(LSL_Integer linkNumber, LSL_Integer type)
{
return m_OSSL_Functions.osGetLinkInventoryNames(linkNumber, type);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public LSL_String osGetInventoryDesc(LSL_String itemNameOrId)
{
return m_OSSL_Functions.osGetInventoryDesc(itemNameOrId);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public LSL_String osGetLinkInventoryDesc(LSL_Integer linkNumber, LSL_String itemNameOrId)
{
return m_OSSL_Functions.osGetLinkInventoryDesc(linkNumber, itemNameOrId);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void osGiveLinkInventory(LSL_Integer linkNumber, LSL_Key destination, LSL_String inventory)
{
m_OSSL_Functions.osGiveLinkInventory(linkNumber, destination, inventory);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public LSL_Key osGetLastChangedEventKey()
{

View File

@@ -7303,6 +7303,14 @@ fc2639fd-5d16-66bf-d8ab-2e4d754c816d
<map><key>itemNameOrId</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osGetLinkInventoryDesc</key>
<map>
<key>return</key><string>string</string>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>itemNameOrId</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osGetInventoryItemKey</key>
<map>
<key>return</key><string>key</string>
@@ -7310,6 +7318,21 @@ fc2639fd-5d16-66bf-d8ab-2e4d754c816d
<map><key>name</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osGetLinkInventoryKey</key>
<map>
<key>return</key><string>key</string>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>name</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osGetInventoryKeys</key>
<map>
<key>return</key><string>list</string>
<key>arguments</key><array>
<map><key>type</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>osGetInventoryLastOwner</key>
<map>
<key>return</key><string>key</string>
@@ -7324,6 +7347,38 @@ fc2639fd-5d16-66bf-d8ab-2e4d754c816d
<map><key>itemId</key><map><key>type</key><string>key</string></map></map>
</array>
</map>
<key>osGetLinkInventoryName</key>
<map>
<key>return</key><string>string</string>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>itemId</key><map><key>type</key><string>key</string></map></map>
</array>
</map>
<key>osGetLinkInventoryNames</key>
<map>
<key>return</key><string>list</string>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>type</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>osGetLinkInventoryKeys</key>
<map>
<key>return</key><string>list</string>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>type</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>osGiveLinkInventory</key>
<map>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>destination</key><map><key>type</key><string>key</string></map></map>
<map><key>inventory</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osGetLastChangedEventKey</key>
<map>
<key>return</key><string>key</string>