let viewer filters on inventory offer work

This commit is contained in:
UbitUmarov
2020-08-21 18:44:19 +01:00
parent a7a63a25ca
commit a38624baab
2 changed files with 110 additions and 13 deletions

View File

@@ -673,6 +673,12 @@ namespace OpenSim.Region.Framework.Scenes
return null;
}
if (item.AssetType == (int)AssetType.Link || item.AssetType == (int)AssetType.LinkFolder)
{
message = "inventory links not supported.";
return null;
}
if (item.Owner != senderId)
{
m_log.WarnFormat(
@@ -889,6 +895,16 @@ namespace OpenSim.Region.Framework.Scenes
return itemCopy;
}
private readonly HashSet<short> denyGiveFolderTypes = new HashSet<short>()
{
(short)FolderType.Trash,
(short)FolderType.LostAndFound,
(short)FolderType.CurrentOutfit,
(short)FolderType.Inbox,
(short)FolderType.Outbox,
(short)FolderType.Suitcase,
(short)FolderType.Root
};
/// <summary>
/// Give an entire inventory folder from one user to another. The entire contents (including all descendent
/// folders) is given.
@@ -908,11 +924,15 @@ namespace OpenSim.Region.Framework.Scenes
{
//// Retrieve the folder from the sender
InventoryFolderBase folder = InventoryService.GetFolder(senderId, folderId);
if (null == folder)
if (folder == null)
{
m_log.ErrorFormat(
"[AGENT INVENTORY]: Could not find inventory folder {0} to give", folderId);
m_log.ErrorFormat("[AGENT INVENTORY]: Could not find inventory folder {0} to give", folderId);
return null;
}
if (denyGiveFolderTypes.Contains(folder.Type))
{
m_log.ErrorFormat("[AGENT INVENTORY]: can not give inventory folder {0}", folderId);
return null;
}
@@ -929,19 +949,14 @@ namespace OpenSim.Region.Framework.Scenes
}
UUID newFolderId = UUID.Random();
InventoryFolderBase newFolder
= new InventoryFolderBase(
InventoryFolderBase newFolder = new InventoryFolderBase(
newFolderId, folder.Name, recipientId, folder.Type, recipientParentFolderId, folder.Version);
InventoryService.AddFolder(newFolder);
// Give all the subfolders
InventoryCollection contents = InventoryService.GetFolderContent(senderId, folderId);
foreach (InventoryFolderBase childFolder in contents.Folders)
{
GiveInventoryFolder(client, recipientId, senderId, childFolder.ID, newFolder.ID);
}
// Give all the items
// Give all the items (first, this is recursive call)
foreach (InventoryItemBase item in contents.Items)
{
string message;
@@ -951,6 +966,79 @@ namespace OpenSim.Region.Framework.Scenes
client.SendAgentAlertMessage(message, false);
}
}
contents.Items = null;
foreach (InventoryFolderBase childFolder in contents.Folders)
{
GiveInventoryFolder(client, recipientId, senderId, childFolder.ID, newFolder.ID);
}
return newFolder;
}
public virtual InventoryFolderBase GiveInventoryFolder(IClientAPI client,
UUID recipientId, UUID senderId, UUID folderId, UUID recipientParentFolderId, Dictionary<UUID, AssetType> ids)
{
//// Retrieve the folder from the sender
InventoryFolderBase folder = InventoryService.GetFolder(senderId, folderId);
if (folder == null)
{
m_log.ErrorFormat("[AGENT INVENTORY]: Could not find inventory folder {0} to give", folderId);
return null;
}
if(!ids.Remove(folder.ID))
return null;
if (denyGiveFolderTypes.Contains(folder.Type))
{
m_log.ErrorFormat("[AGENT INVENTORY]: can not give inventory folder {0}", folderId);
return null;
}
if (recipientParentFolderId == UUID.Zero)
{
InventoryFolderBase recipientRootFolder = InventoryService.GetRootFolder(recipientId);
if (recipientRootFolder != null)
recipientParentFolderId = recipientRootFolder.ID;
else
{
m_log.WarnFormat("[AGENT INVENTORY]: Unable to find root folder for receiving agent");
return null;
}
}
UUID newFolderId = UUID.Random();
InventoryFolderBase newFolder = new InventoryFolderBase(
newFolderId, folder.Name, recipientId, folder.Type, recipientParentFolderId, folder.Version);
InventoryService.AddFolder(newFolder);
InventoryCollection contents = InventoryService.GetFolderContent(senderId, folderId);
if(client == null)
{
foreach (InventoryItemBase item in contents.Items)
{
if (ids.Remove(item.ID))
GiveInventoryItem(recipientId, senderId, item.ID, newFolder.ID, out string message);
}
}
else
{
foreach (InventoryItemBase item in contents.Items)
{
if (ids.Remove(item.ID))
{
if (GiveInventoryItem(recipientId, senderId, item.ID, newFolder.ID, out string message) == null)
client.SendAgentAlertMessage(message, false);
}
}
}
contents.Items = null;
foreach (InventoryFolderBase childFolder in contents.Folders)
{
GiveInventoryFolder(client, recipientId, senderId, childFolder.ID, newFolder.ID);
}
return newFolder;
}