Mantis#1594. Thank you, Melanie for a patch that:

Fixes:
- Wearable icon and name sreset to default on copy/paste
- Cache is not updated when renaming/moving folders
- Partial refactor to make inventory less dependen on AssetBase having a "Name" field
- Add llGiveInventoryList() function
0.6.0-stable
Charles Krinke 2008-06-26 02:46:29 +00:00
parent 76e24d02ad
commit 1cd6b71b60
4 changed files with 192 additions and 68 deletions

View File

@ -380,6 +380,13 @@ namespace OpenSim.Framework.Communications.Cache
baseFolder.Version = RootFolder.Version; baseFolder.Version = RootFolder.Version;
m_commsManager.InventoryService.UpdateFolder(baseFolder); m_commsManager.InventoryService.UpdateFolder(baseFolder);
InventoryFolderImpl folder=RootFolder.FindFolder(folderID);
if(folder != null)
{
folder.Name = name;
folder.ParentID = parentID;
}
} }
else else
{ {
@ -416,6 +423,10 @@ namespace OpenSim.Framework.Communications.Cache
m_commsManager.InventoryService.MoveFolder(baseFolder); m_commsManager.InventoryService.MoveFolder(baseFolder);
InventoryFolderImpl folder=RootFolder.FindFolder(folderID);
if(folder != null)
folder.ParentID = parentID;
return true; return true;
} }
else else

View File

@ -88,6 +88,36 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
public void AddInventoryItem(LLUUID AgentID, InventoryItemBase item)
{
CachedUserInfo userInfo
= CommsManager.UserProfileCacheService.GetUserDetails(AgentID);
if (userInfo != null)
{
userInfo.AddItem(item);
int userlevel = 0;
if (ExternalChecks.ExternalChecksCanBeGodLike(AgentID))
{
userlevel = 1;
}
if (m_regInfo.MasterAvatarAssignedUUID == AgentID)
{
userlevel = 2;
}
EventManager.TriggerOnNewInventoryItemUploadComplete(AgentID, item.AssetID, item.Name, userlevel);
}
else
{
m_log.ErrorFormat(
"[AGENT INVENTORY]: Agent {1} was not found for add of item {2} {3}",
AgentID, item.Name, item.ID);
return;
}
}
/// <summary> /// <summary>
/// Add an inventory item to an avatar's inventory. /// Add an inventory item to an avatar's inventory.
/// </summary> /// </summary>
@ -101,48 +131,9 @@ namespace OpenSim.Region.Environment.Scenes
if (userInfo != null) if (userInfo != null)
{ {
userInfo.AddItem(item); AddInventoryItem(remoteClient.AgentId, item);
remoteClient.SendInventoryItemCreateUpdate(item); remoteClient.SendInventoryItemCreateUpdate(item);
int userlevel = 0;
if (ExternalChecks.ExternalChecksCanBeGodLike(remoteClient.AgentId))
{
userlevel = 1;
}
if (m_regInfo.MasterAvatarAssignedUUID == remoteClient.AgentId)
{
userlevel = 2;
}
EventManager.TriggerOnNewInventoryItemUploadComplete(remoteClient.AgentId, item.AssetID, item.Name, userlevel);
} }
else
{
m_log.ErrorFormat(
"[AGENT INVENTORY]: Agent {0} {1} was not found for add of item {2} {3}",
remoteClient.Name, remoteClient.AgentId, item.Name, item.ID);
return;
}
}
/// <summary>
/// <see>AddInventoryItem(LLUUID, InventoryItemBase)</see>
/// </summary>
/// <param name="avatarId">The ID of the avatar</param>
/// <param name="item">The item. This structure contains all the item metadata, including the folder
/// in which the item is to be placed.</param>
public void AddInventoryItem(LLUUID avatarId, InventoryItemBase item)
{
ScenePresence avatar;
if (!TryGetAvatar(avatarId, out avatar))
{
m_log.ErrorFormat(
"[AGENT INVENTORY]: Could not find avatar {0} to add inventory item", avatarId);
return;
}
AddInventoryItem(avatar.ControllingClient, item);
} }
/// <summary> /// <summary>
@ -517,13 +508,13 @@ namespace OpenSim.Region.Environment.Scenes
if (remoteClient.AgentId == oldAgentID) if (remoteClient.AgentId == oldAgentID)
{ {
CreateNewInventoryItem( CreateNewInventoryItem(
remoteClient, newFolderID, callbackID, asset, (sbyte)item.InvType, remoteClient, newFolderID, item.Name, item.Flags, callbackID, asset, (sbyte)item.InvType,
item.BasePermissions, item.CurrentPermissions, item.EveryOnePermissions, item.NextPermissions); item.BasePermissions, item.CurrentPermissions, item.EveryOnePermissions, item.NextPermissions);
} }
else else
{ {
CreateNewInventoryItem( CreateNewInventoryItem(
remoteClient, newFolderID, callbackID, asset, (sbyte)item.InvType, remoteClient, newFolderID, item.Name, item.Flags, callbackID, asset, (sbyte)item.InvType,
item.NextPermissions, item.NextPermissions, item.EveryOnePermissions & item.NextPermissions, item.NextPermissions); item.NextPermissions, item.NextPermissions, item.EveryOnePermissions & item.NextPermissions, item.NextPermissions);
} }
} }
@ -619,11 +610,11 @@ namespace OpenSim.Region.Environment.Scenes
/// <param name="asset"></param> /// <param name="asset"></param>
/// <param name="invType"></param> /// <param name="invType"></param>
/// <param name="nextOwnerMask"></param> /// <param name="nextOwnerMask"></param>
private void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID folderID, uint callbackID, private void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID folderID, string name, uint flags, uint callbackID,
AssetBase asset, sbyte invType, uint nextOwnerMask) AssetBase asset, sbyte invType, uint nextOwnerMask)
{ {
CreateNewInventoryItem( CreateNewInventoryItem(
remoteClient, folderID, callbackID, asset, invType, remoteClient, folderID, name, flags, callbackID, asset, invType,
(uint)PermissionMask.All, (uint)PermissionMask.All, 0, nextOwnerMask); (uint)PermissionMask.All, (uint)PermissionMask.All, 0, nextOwnerMask);
} }
@ -637,7 +628,7 @@ namespace OpenSim.Region.Environment.Scenes
/// <param name="invType"></param> /// <param name="invType"></param>
/// <param name="nextOwnerMask"></param> /// <param name="nextOwnerMask"></param>
private void CreateNewInventoryItem( private void CreateNewInventoryItem(
IClientAPI remoteClient, LLUUID folderID, uint callbackID, AssetBase asset, sbyte invType, IClientAPI remoteClient, LLUUID folderID, string name, uint flags, uint callbackID, AssetBase asset, sbyte invType,
uint baseMask, uint currentMask, uint everyoneMask, uint nextOwnerMask) uint baseMask, uint currentMask, uint everyoneMask, uint nextOwnerMask)
{ {
CachedUserInfo userInfo CachedUserInfo userInfo
@ -651,7 +642,8 @@ namespace OpenSim.Region.Environment.Scenes
item.ID = LLUUID.Random(); item.ID = LLUUID.Random();
item.AssetID = asset.FullID; item.AssetID = asset.FullID;
item.Description = asset.Description; item.Description = asset.Description;
item.Name = asset.Name; item.Name = name;
item.Flags = flags;
item.AssetType = asset.Type; item.AssetType = asset.Type;
item.InvType = invType; item.InvType = invType;
item.Folder = folderID; item.Folder = folderID;
@ -715,7 +707,7 @@ namespace OpenSim.Region.Environment.Scenes
AssetBase asset = CreateAsset(name, description, assetType, data); AssetBase asset = CreateAsset(name, description, assetType, data);
AssetCache.AddAsset(asset); AssetCache.AddAsset(asset);
CreateNewInventoryItem(remoteClient, folderID, callbackID, asset, invType, nextOwnerMask); CreateNewInventoryItem(remoteClient, folderID, asset.Name, 0, callbackID, asset, invType, nextOwnerMask);
} }
else else
{ {
@ -864,38 +856,29 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
/// <summary> private InventoryItemBase CreateAgentInventoryItemFromTask(LLUUID destAgent, SceneObjectPart part, LLUUID itemId)
/// Move the given item in the given prim to a folder in the client's inventory
/// </summary>
/// <param name="remoteClient"></param>
/// <param name="folderID"></param>
/// <param name="part"></param>
/// <param name="itemID"></param>
public void MoveTaskInventoryItem(IClientAPI remoteClient, LLUUID folderId, SceneObjectPart part, LLUUID itemId)
{ {
TaskInventoryItem taskItem = part.GetInventoryItem(itemId); TaskInventoryItem taskItem = part.GetInventoryItem(itemId);
if (null == taskItem) if (null == taskItem)
{ {
// Console already notified of error in GetInventoryItem // Console already notified of error in GetInventoryItem
return; return null;
} }
InventoryItemBase agentItem = new InventoryItemBase(); InventoryItemBase agentItem = new InventoryItemBase();
agentItem.ID = LLUUID.Random(); agentItem.ID = LLUUID.Random();
agentItem.Creator = taskItem.CreatorID; agentItem.Creator = taskItem.CreatorID;
agentItem.Owner = remoteClient.AgentId; agentItem.Owner = destAgent;
agentItem.AssetID = taskItem.AssetID; agentItem.AssetID = taskItem.AssetID;
agentItem.Description = taskItem.Description; agentItem.Description = taskItem.Description;
agentItem.Name = taskItem.Name; agentItem.Name = taskItem.Name;
agentItem.AssetType = taskItem.Type; agentItem.AssetType = taskItem.Type;
agentItem.InvType = taskItem.InvType; agentItem.InvType = taskItem.InvType;
agentItem.Folder = folderId;
agentItem.Flags = taskItem.Flags; agentItem.Flags = taskItem.Flags;
if ((remoteClient.AgentId != taskItem.OwnerID) && ExternalChecks.ExternalChecksPropagatePermissions()) if ((destAgent != taskItem.OwnerID) && ExternalChecks.ExternalChecksPropagatePermissions())
{ {
agentItem.BasePermissions = taskItem.NextOwnerMask; agentItem.BasePermissions = taskItem.NextOwnerMask;
agentItem.CurrentPermissions = taskItem.NextOwnerMask; agentItem.CurrentPermissions = taskItem.NextOwnerMask;
@ -910,13 +893,29 @@ namespace OpenSim.Region.Environment.Scenes
agentItem.EveryOnePermissions = taskItem.EveryoneMask; agentItem.EveryOnePermissions = taskItem.EveryoneMask;
} }
AddInventoryItem(remoteClient, agentItem);
if (!ExternalChecks.ExternalChecksBypassPermissions()) if (!ExternalChecks.ExternalChecksBypassPermissions())
{ {
if ((taskItem.OwnerMask & (uint)PermissionMask.Copy) == 0) if ((taskItem.OwnerMask & (uint)PermissionMask.Copy) == 0)
part.RemoveInventoryItem(itemId); part.RemoveInventoryItem(itemId);
} }
return agentItem;
}
/// <summary>
/// Move the given item in the given prim to a folder in the client's inventory
/// </summary>
/// <param name="remoteClient"></param>
/// <param name="folderID"></param>
/// <param name="part"></param>
/// <param name="itemID"></param>
public void MoveTaskInventoryItem(IClientAPI remoteClient, LLUUID folderId, SceneObjectPart part, LLUUID itemId)
{
InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(remoteClient.AgentId, part, itemId);
agentItem.Folder = folderId;
AddInventoryItem(remoteClient, agentItem);
} }
/// <summary> /// <summary>
@ -964,14 +963,22 @@ namespace OpenSim.Region.Environment.Scenes
if (TryGetAvatar(avatarId, out avatar)) if (TryGetAvatar(avatarId, out avatar))
{ {
MoveTaskInventoryItem(avatar.ControllingClient, folderId, part, itemId); MoveTaskInventoryItem(avatar.ControllingClient, folderId, part, itemId);
} }
else else
{ {
m_log.ErrorFormat( CachedUserInfo profile = CommsManager.UserProfileCacheService.GetUserDetails(avatarId);
"[PRIM INVENTORY]: " + if(profile == null || profile.RootFolder == null)
"Avatar {0} cannot be found to update its prim item asset", {
avatarId); m_log.ErrorFormat(
"[PRIM INVENTORY]: " +
"Avatar {0} cannot be found to add item",
avatarId);
}
InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(avatarId, part, itemId);
agentItem.Folder = folderId;
AddInventoryItem(avatarId, agentItem);
} }
} }
@ -1047,6 +1054,41 @@ namespace OpenSim.Region.Environment.Scenes
} }
public void MoveTaskInventoryItems(LLUUID destID, string category, SceneObjectPart host, List<LLUUID> items)
{
CachedUserInfo profile = CommsManager.UserProfileCacheService.GetUserDetails(destID);
if(profile == null || profile.RootFolder == null)
{
m_log.ErrorFormat(
"[PRIM INVENTORY]: " +
"Avatar {0} cannot be found to add items",
destID);
return;
}
LLUUID newFolderID = LLUUID.Random();
profile.CreateFolder(category, newFolderID, 0xffff, profile.RootFolder.ID);
foreach (LLUUID itemID in items)
{
InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(destID, host, itemID);
agentItem.Folder = newFolderID;
AddInventoryItem(destID, agentItem);
}
ScenePresence avatar;
if (TryGetAvatar(destID, out avatar))
{
profile.SendInventoryDecendents(avatar.ControllingClient,
profile.RootFolder.ID, true, false);
profile.SendInventoryDecendents(avatar.ControllingClient,
newFolderID, false, true);
}
}
/// <summary> /// <summary>
/// Update an item in a prim (task) inventory. /// Update an item in a prim (task) inventory.
/// This method does not handle scripts, <see>RezScript(IClientAPI, LLUUID, unit)</see> /// This method does not handle scripts, <see>RezScript(IClientAPI, LLUUID, unit)</see>

View File

@ -4374,10 +4374,45 @@ namespace OpenSim.Region.ScriptEngine.Common
NotImplemented("llGroundRepel"); NotImplemented("llGroundRepel");
} }
private LLUUID GetTaskInventoryItem(string name)
{
foreach (KeyValuePair<LLUUID, TaskInventoryItem> inv in m_host.TaskInventory)
{
if(inv.Value.Name == name)
return inv.Key;
}
return LLUUID.Zero;
}
public void llGiveInventoryList(string destination, string category, LSL_Types.list inventory) public void llGiveInventoryList(string destination, string category, LSL_Types.list inventory)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llGiveInventoryList");
LLUUID destID;
if(!LLUUID.TryParse(destination, out destID))
return;
List<LLUUID> itemList = new List<LLUUID>();
foreach (Object item in inventory.Data)
{
LLUUID itemID;
if(LLUUID.TryParse(item.ToString(), out itemID))
{
itemList.Add(itemID);
}
else
{
itemID = GetTaskInventoryItem(item.ToString());
if(itemID != LLUUID.Zero)
itemList.Add(itemID);
}
}
if(itemList.Count == 0)
return;
m_ScriptEngine.World.MoveTaskInventoryItems(destID, category, m_host, itemList);
} }
public void llSetVehicleType(int type) public void llSetVehicleType(int type)

View File

@ -36,6 +36,7 @@ using Axiom.Math;
using libsecondlife; using libsecondlife;
using OpenSim; using OpenSim;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Framework.Communications.Cache;
using OpenSim.Region.Environment; using OpenSim.Region.Environment;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney; using OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney;
@ -4226,10 +4227,45 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
NotImplemented("llGroundRepel"); NotImplemented("llGroundRepel");
} }
private LLUUID GetTaskInventoryItem(string name)
{
foreach (KeyValuePair<LLUUID, TaskInventoryItem> inv in m_host.TaskInventory)
{
if(inv.Value.Name == name)
return inv.Key;
}
return LLUUID.Zero;
}
public void llGiveInventoryList(string destination, string category, LSL_Types.list inventory) public void llGiveInventoryList(string destination, string category, LSL_Types.list inventory)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llGiveInventoryList");
LLUUID destID;
if(!LLUUID.TryParse(destination, out destID))
return;
List<LLUUID> itemList = new List<LLUUID>();
foreach (Object item in inventory.Data)
{
LLUUID itemID;
if(LLUUID.TryParse(item.ToString(), out itemID))
{
itemList.Add(itemID);
}
else
{
itemID = GetTaskInventoryItem(item.ToString());
if(itemID != LLUUID.Zero)
itemList.Add(itemID);
}
}
if(itemList.Count == 0)
return;
m_ScriptEngine.World.MoveTaskInventoryItems(destID, category, m_host, itemList);
} }
public void llSetVehicleType(int type) public void llSetVehicleType(int type)