mirror of
https://github.com/opensim/opensim.git
synced 2026-08-04 08:06:27 +08:00
let viewer filters on inventory offer work
This commit is contained in:
@@ -187,11 +187,20 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
||||
return;
|
||||
}
|
||||
|
||||
m_log.DebugFormat(
|
||||
"[INVENTORY TRANSFER]: offering folder {0} to agent {1}'s inventory",
|
||||
Dictionary<UUID,AssetType> ids = new Dictionary<UUID, AssetType>();
|
||||
ids[folderID] = assetType;
|
||||
|
||||
if (im.binaryBucket.Length >= 34 && im.binaryBucket.Length % 17 == 0)
|
||||
{
|
||||
byte[] iddata = im.binaryBucket;
|
||||
for (int i = 17; i < im.binaryBucket.Length - 17; i += 17)
|
||||
ids[new UUID(iddata, i + 1)] = (AssetType)im.binaryBucket[i];
|
||||
}
|
||||
|
||||
m_log.DebugFormat("[INVENTORY TRANSFER]: offering folder {0} to agent {1}'s inventory",
|
||||
folderID, recipientID);
|
||||
|
||||
InventoryFolderBase folderCopy = scene.GiveInventoryFolder(client, recipientID, agentID, folderID, UUID.Zero);
|
||||
InventoryFolderBase folderCopy = scene.GiveInventoryFolder(client, recipientID, agentID, folderID, UUID.Zero, ids);
|
||||
|
||||
if (folderCopy == null)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user