refactor: split out some rez code into a separate CreateItemForObject() method
parent
66a62678e5
commit
52d9230392
|
@ -274,154 +274,22 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
foreach (SceneObjectGroup objectGroup in objlist)
|
foreach (SceneObjectGroup objectGroup in objlist)
|
||||||
objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID];
|
objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID];
|
||||||
|
|
||||||
// Get the user info of the item destination
|
InventoryItemBase item = CreateItemForObject(action, remoteClient, objlist[0], folderID);
|
||||||
//
|
if (item == null)
|
||||||
UUID userID = UUID.Zero;
|
|
||||||
|
|
||||||
if (action == DeRezAction.Take || action == DeRezAction.TakeCopy ||
|
|
||||||
action == DeRezAction.SaveToExistingUserInventoryItem)
|
|
||||||
{
|
|
||||||
// Take or take copy require a taker
|
|
||||||
// Saving changes requires a local user
|
|
||||||
//
|
|
||||||
if (remoteClient == null)
|
|
||||||
return UUID.Zero;
|
return UUID.Zero;
|
||||||
|
|
||||||
userID = remoteClient.AgentId;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// All returns / deletes go to the object owner
|
|
||||||
//
|
|
||||||
userID = objlist[0].RootPart.OwnerID;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (userID == UUID.Zero) // Can't proceed
|
|
||||||
{
|
|
||||||
return UUID.Zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we're returning someone's item, it goes back to the
|
|
||||||
// owner's Lost And Found folder.
|
|
||||||
// Delete is treated like return in this case
|
|
||||||
// Deleting your own items makes them go to trash
|
|
||||||
//
|
|
||||||
|
|
||||||
InventoryFolderBase folder = null;
|
|
||||||
InventoryItemBase item = null;
|
|
||||||
|
|
||||||
if (DeRezAction.SaveToExistingUserInventoryItem == action)
|
|
||||||
{
|
|
||||||
item = new InventoryItemBase(objlist[0].RootPart.FromUserInventoryItemID, userID);
|
|
||||||
item = m_Scene.InventoryService.GetItem(item);
|
|
||||||
|
|
||||||
//item = userInfo.RootFolder.FindItem(
|
|
||||||
// objectGroup.RootPart.FromUserInventoryItemID);
|
|
||||||
|
|
||||||
if (null == item)
|
|
||||||
{
|
|
||||||
m_log.DebugFormat(
|
|
||||||
"[AGENT INVENTORY]: Object {0} {1} scheduled for save to inventory has already been deleted.",
|
|
||||||
objlist[0].Name, objlist[0].UUID);
|
|
||||||
return UUID.Zero;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Folder magic
|
|
||||||
//
|
|
||||||
if (action == DeRezAction.Delete)
|
|
||||||
{
|
|
||||||
// Deleting someone else's item
|
|
||||||
//
|
|
||||||
if (remoteClient == null ||
|
|
||||||
objlist[0].OwnerID != remoteClient.AgentId)
|
|
||||||
{
|
|
||||||
|
|
||||||
folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (action == DeRezAction.Return)
|
|
||||||
{
|
|
||||||
|
|
||||||
// Dump to lost + found unconditionally
|
|
||||||
//
|
|
||||||
folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (folderID == UUID.Zero && folder == null)
|
|
||||||
{
|
|
||||||
if (action == DeRezAction.Delete)
|
|
||||||
{
|
|
||||||
// Deletes go to trash by default
|
|
||||||
//
|
|
||||||
folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (remoteClient == null ||
|
|
||||||
objlist[0].OwnerID != remoteClient.AgentId)
|
|
||||||
{
|
|
||||||
// Taking copy of another person's item. Take to
|
|
||||||
// Objects folder.
|
|
||||||
folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.Object);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Catch all. Use lost & found
|
|
||||||
//
|
|
||||||
|
|
||||||
folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Override and put into where it came from, if it came
|
|
||||||
// from anywhere in inventory
|
|
||||||
//
|
|
||||||
if (action == DeRezAction.Take || action == DeRezAction.TakeCopy)
|
|
||||||
{
|
|
||||||
if (objlist[0].RootPart.FromFolderID != UUID.Zero)
|
|
||||||
{
|
|
||||||
InventoryFolderBase f = new InventoryFolderBase(objlist[0].RootPart.FromFolderID, userID);
|
|
||||||
folder = m_Scene.InventoryService.GetFolder(f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (folder == null) // None of the above
|
|
||||||
{
|
|
||||||
folder = new InventoryFolderBase(folderID);
|
|
||||||
|
|
||||||
if (folder == null) // Nowhere to put it
|
|
||||||
{
|
|
||||||
return UUID.Zero;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
item = new InventoryItemBase();
|
|
||||||
// Can't know creator is the same, so null it in inventory
|
// Can't know creator is the same, so null it in inventory
|
||||||
if (objlist.Count > 1)
|
|
||||||
item.CreatorId = UUID.Zero.ToString();
|
|
||||||
else
|
|
||||||
item.CreatorId = objlist[0].RootPart.CreatorID.ToString();
|
|
||||||
item.ID = UUID.Random();
|
|
||||||
item.InvType = (int)InventoryType.Object;
|
|
||||||
item.Folder = folder.ID;
|
|
||||||
item.Owner = userID;
|
|
||||||
if (objlist.Count > 1)
|
if (objlist.Count > 1)
|
||||||
{
|
{
|
||||||
|
item.CreatorId = UUID.Zero.ToString();
|
||||||
item.Flags = (uint)InventoryItemFlags.ObjectHasMultipleItems;
|
item.Flags = (uint)InventoryItemFlags.ObjectHasMultipleItems;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
item.CreatorId = objlist[0].RootPart.CreatorID.ToString();
|
||||||
item.SaleType = objlist[0].RootPart.ObjectSaleType;
|
item.SaleType = objlist[0].RootPart.ObjectSaleType;
|
||||||
item.SalePrice = objlist[0].RootPart.SalePrice;
|
item.SalePrice = objlist[0].RootPart.SalePrice;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
AssetBase asset = CreateAsset(
|
AssetBase asset = CreateAsset(
|
||||||
objlist[0].GetPartName(objlist[0].RootPart.LocalId),
|
objlist[0].GetPartName(objlist[0].RootPart.LocalId),
|
||||||
|
@ -505,9 +373,157 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return assetID;
|
return assetID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an item using details for the given scene object.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="action"></param>
|
||||||
|
/// <param name="remoteClient"></param>
|
||||||
|
/// <param name="so"></param>
|
||||||
|
/// <param name="folderID"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
protected InventoryItemBase CreateItemForObject(
|
||||||
|
DeRezAction action, IClientAPI remoteClient, SceneObjectGroup so, UUID folderID)
|
||||||
|
{
|
||||||
|
// Get the user info of the item destination
|
||||||
|
//
|
||||||
|
UUID userID = UUID.Zero;
|
||||||
|
|
||||||
|
if (action == DeRezAction.Take || action == DeRezAction.TakeCopy ||
|
||||||
|
action == DeRezAction.SaveToExistingUserInventoryItem)
|
||||||
|
{
|
||||||
|
// Take or take copy require a taker
|
||||||
|
// Saving changes requires a local user
|
||||||
|
//
|
||||||
|
if (remoteClient == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
userID = remoteClient.AgentId;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// All returns / deletes go to the object owner
|
||||||
|
//
|
||||||
|
userID = so.RootPart.OwnerID;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (userID == UUID.Zero) // Can't proceed
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we're returning someone's item, it goes back to the
|
||||||
|
// owner's Lost And Found folder.
|
||||||
|
// Delete is treated like return in this case
|
||||||
|
// Deleting your own items makes them go to trash
|
||||||
|
//
|
||||||
|
|
||||||
|
InventoryFolderBase folder = null;
|
||||||
|
InventoryItemBase item = null;
|
||||||
|
|
||||||
|
if (DeRezAction.SaveToExistingUserInventoryItem == action)
|
||||||
|
{
|
||||||
|
item = new InventoryItemBase(so.RootPart.FromUserInventoryItemID, userID);
|
||||||
|
item = m_Scene.InventoryService.GetItem(item);
|
||||||
|
|
||||||
|
//item = userInfo.RootFolder.FindItem(
|
||||||
|
// objectGroup.RootPart.FromUserInventoryItemID);
|
||||||
|
|
||||||
|
if (null == item)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"[AGENT INVENTORY]: Object {0} {1} scheduled for save to inventory has already been deleted.",
|
||||||
|
so.Name, so.UUID);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Folder magic
|
||||||
|
//
|
||||||
|
if (action == DeRezAction.Delete)
|
||||||
|
{
|
||||||
|
// Deleting someone else's item
|
||||||
|
//
|
||||||
|
if (remoteClient == null ||
|
||||||
|
so.OwnerID != remoteClient.AgentId)
|
||||||
|
{
|
||||||
|
folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (action == DeRezAction.Return)
|
||||||
|
{
|
||||||
|
// Dump to lost + found unconditionally
|
||||||
|
//
|
||||||
|
folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (folderID == UUID.Zero && folder == null)
|
||||||
|
{
|
||||||
|
if (action == DeRezAction.Delete)
|
||||||
|
{
|
||||||
|
// Deletes go to trash by default
|
||||||
|
//
|
||||||
|
folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (remoteClient == null || so.OwnerID != remoteClient.AgentId)
|
||||||
|
{
|
||||||
|
// Taking copy of another person's item. Take to
|
||||||
|
// Objects folder.
|
||||||
|
folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.Object);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Catch all. Use lost & found
|
||||||
|
//
|
||||||
|
|
||||||
|
folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Override and put into where it came from, if it came
|
||||||
|
// from anywhere in inventory
|
||||||
|
//
|
||||||
|
if (action == DeRezAction.Take || action == DeRezAction.TakeCopy)
|
||||||
|
{
|
||||||
|
if (so.RootPart.FromFolderID != UUID.Zero)
|
||||||
|
{
|
||||||
|
InventoryFolderBase f = new InventoryFolderBase(so.RootPart.FromFolderID, userID);
|
||||||
|
folder = m_Scene.InventoryService.GetFolder(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (folder == null) // None of the above
|
||||||
|
{
|
||||||
|
folder = new InventoryFolderBase(folderID);
|
||||||
|
|
||||||
|
if (folder == null) // Nowhere to put it
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
item = new InventoryItemBase();
|
||||||
|
item.ID = UUID.Random();
|
||||||
|
item.InvType = (int)InventoryType.Object;
|
||||||
|
item.Folder = folder.ID;
|
||||||
|
item.Owner = userID;
|
||||||
|
}
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Rez an object into the scene from the user's inventory
|
/// Rez an object into the scene from the user's inventory
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
Loading…
Reference in New Issue