diff options
author | Charles Krinke | 2008-06-26 02:46:29 +0000 |
---|---|---|
committer | Charles Krinke | 2008-06-26 02:46:29 +0000 |
commit | 1cd6b71b60d093b451ba03881ee31efd3eb29a50 (patch) | |
tree | 71e51114e772d9d9121a449a684e9c7f8a8e5a16 /OpenSim/Region/Environment | |
parent | Minor refactoring of POS. Adds a Util.Clamp(x, min, max) function. (diff) | |
download | opensim-SC-1cd6b71b60d093b451ba03881ee31efd3eb29a50.zip opensim-SC-1cd6b71b60d093b451ba03881ee31efd3eb29a50.tar.gz opensim-SC-1cd6b71b60d093b451ba03881ee31efd3eb29a50.tar.bz2 opensim-SC-1cd6b71b60d093b451ba03881ee31efd3eb29a50.tar.xz |
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
Diffstat (limited to 'OpenSim/Region/Environment')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.Inventory.cs | 142 |
1 files changed, 92 insertions, 50 deletions
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index b076855..05c0a28 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs | |||
@@ -88,61 +88,52 @@ namespace OpenSim.Region.Environment.Scenes | |||
88 | } | 88 | } |
89 | } | 89 | } |
90 | 90 | ||
91 | /// <summary> | 91 | public void AddInventoryItem(LLUUID AgentID, InventoryItemBase item) |
92 | /// Add an inventory item to an avatar's inventory. | ||
93 | /// </summary> | ||
94 | /// <param name="remoteClient">The remote client controlling the avatar</param> | ||
95 | /// <param name="item">The item. This structure contains all the item metadata, including the folder | ||
96 | /// in which the item is to be placed.</param> | ||
97 | public void AddInventoryItem(IClientAPI remoteClient, InventoryItemBase item) | ||
98 | { | 92 | { |
99 | CachedUserInfo userInfo | 93 | CachedUserInfo userInfo |
100 | = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); | 94 | = CommsManager.UserProfileCacheService.GetUserDetails(AgentID); |
101 | 95 | ||
102 | if (userInfo != null) | 96 | if (userInfo != null) |
103 | { | 97 | { |
104 | userInfo.AddItem(item); | 98 | userInfo.AddItem(item); |
105 | remoteClient.SendInventoryItemCreateUpdate(item); | ||
106 | 99 | ||
107 | int userlevel = 0; | 100 | int userlevel = 0; |
108 | if (ExternalChecks.ExternalChecksCanBeGodLike(remoteClient.AgentId)) | 101 | if (ExternalChecks.ExternalChecksCanBeGodLike(AgentID)) |
109 | { | 102 | { |
110 | userlevel = 1; | 103 | userlevel = 1; |
111 | } | 104 | } |
112 | if (m_regInfo.MasterAvatarAssignedUUID == remoteClient.AgentId) | 105 | if (m_regInfo.MasterAvatarAssignedUUID == AgentID) |
113 | { | 106 | { |
114 | userlevel = 2; | 107 | userlevel = 2; |
115 | } | 108 | } |
116 | EventManager.TriggerOnNewInventoryItemUploadComplete(remoteClient.AgentId, item.AssetID, item.Name, userlevel); | 109 | EventManager.TriggerOnNewInventoryItemUploadComplete(AgentID, item.AssetID, item.Name, userlevel); |
117 | } | 110 | } |
118 | else | 111 | else |
119 | { | 112 | { |
120 | m_log.ErrorFormat( | 113 | m_log.ErrorFormat( |
121 | "[AGENT INVENTORY]: Agent {0} {1} was not found for add of item {2} {3}", | 114 | "[AGENT INVENTORY]: Agent {1} was not found for add of item {2} {3}", |
122 | remoteClient.Name, remoteClient.AgentId, item.Name, item.ID); | 115 | AgentID, item.Name, item.ID); |
123 | 116 | ||
124 | return; | 117 | return; |
125 | } | 118 | } |
126 | } | 119 | } |
127 | 120 | ||
128 | /// <summary> | 121 | /// <summary> |
129 | /// <see>AddInventoryItem(LLUUID, InventoryItemBase)</see> | 122 | /// Add an inventory item to an avatar's inventory. |
130 | /// </summary> | 123 | /// </summary> |
131 | /// <param name="avatarId">The ID of the avatar</param> | 124 | /// <param name="remoteClient">The remote client controlling the avatar</param> |
132 | /// <param name="item">The item. This structure contains all the item metadata, including the folder | 125 | /// <param name="item">The item. This structure contains all the item metadata, including the folder |
133 | /// in which the item is to be placed.</param> | 126 | /// in which the item is to be placed.</param> |
134 | public void AddInventoryItem(LLUUID avatarId, InventoryItemBase item) | 127 | public void AddInventoryItem(IClientAPI remoteClient, InventoryItemBase item) |
135 | { | 128 | { |
136 | ScenePresence avatar; | 129 | CachedUserInfo userInfo |
130 | = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); | ||
137 | 131 | ||
138 | if (!TryGetAvatar(avatarId, out avatar)) | 132 | if (userInfo != null) |
139 | { | 133 | { |
140 | m_log.ErrorFormat( | 134 | AddInventoryItem(remoteClient.AgentId, item); |
141 | "[AGENT INVENTORY]: Could not find avatar {0} to add inventory item", avatarId); | 135 | remoteClient.SendInventoryItemCreateUpdate(item); |
142 | return; | ||
143 | } | 136 | } |
144 | |||
145 | AddInventoryItem(avatar.ControllingClient, item); | ||
146 | } | 137 | } |
147 | 138 | ||
148 | /// <summary> | 139 | /// <summary> |
@@ -517,13 +508,13 @@ namespace OpenSim.Region.Environment.Scenes | |||
517 | if (remoteClient.AgentId == oldAgentID) | 508 | if (remoteClient.AgentId == oldAgentID) |
518 | { | 509 | { |
519 | CreateNewInventoryItem( | 510 | CreateNewInventoryItem( |
520 | remoteClient, newFolderID, callbackID, asset, (sbyte)item.InvType, | 511 | remoteClient, newFolderID, item.Name, item.Flags, callbackID, asset, (sbyte)item.InvType, |
521 | item.BasePermissions, item.CurrentPermissions, item.EveryOnePermissions, item.NextPermissions); | 512 | item.BasePermissions, item.CurrentPermissions, item.EveryOnePermissions, item.NextPermissions); |
522 | } | 513 | } |
523 | else | 514 | else |
524 | { | 515 | { |
525 | CreateNewInventoryItem( | 516 | CreateNewInventoryItem( |
526 | remoteClient, newFolderID, callbackID, asset, (sbyte)item.InvType, | 517 | remoteClient, newFolderID, item.Name, item.Flags, callbackID, asset, (sbyte)item.InvType, |
527 | item.NextPermissions, item.NextPermissions, item.EveryOnePermissions & item.NextPermissions, item.NextPermissions); | 518 | item.NextPermissions, item.NextPermissions, item.EveryOnePermissions & item.NextPermissions, item.NextPermissions); |
528 | } | 519 | } |
529 | } | 520 | } |
@@ -619,11 +610,11 @@ namespace OpenSim.Region.Environment.Scenes | |||
619 | /// <param name="asset"></param> | 610 | /// <param name="asset"></param> |
620 | /// <param name="invType"></param> | 611 | /// <param name="invType"></param> |
621 | /// <param name="nextOwnerMask"></param> | 612 | /// <param name="nextOwnerMask"></param> |
622 | private void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID folderID, uint callbackID, | 613 | private void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID folderID, string name, uint flags, uint callbackID, |
623 | AssetBase asset, sbyte invType, uint nextOwnerMask) | 614 | AssetBase asset, sbyte invType, uint nextOwnerMask) |
624 | { | 615 | { |
625 | CreateNewInventoryItem( | 616 | CreateNewInventoryItem( |
626 | remoteClient, folderID, callbackID, asset, invType, | 617 | remoteClient, folderID, name, flags, callbackID, asset, invType, |
627 | (uint)PermissionMask.All, (uint)PermissionMask.All, 0, nextOwnerMask); | 618 | (uint)PermissionMask.All, (uint)PermissionMask.All, 0, nextOwnerMask); |
628 | } | 619 | } |
629 | 620 | ||
@@ -637,7 +628,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
637 | /// <param name="invType"></param> | 628 | /// <param name="invType"></param> |
638 | /// <param name="nextOwnerMask"></param> | 629 | /// <param name="nextOwnerMask"></param> |
639 | private void CreateNewInventoryItem( | 630 | private void CreateNewInventoryItem( |
640 | IClientAPI remoteClient, LLUUID folderID, uint callbackID, AssetBase asset, sbyte invType, | 631 | IClientAPI remoteClient, LLUUID folderID, string name, uint flags, uint callbackID, AssetBase asset, sbyte invType, |
641 | uint baseMask, uint currentMask, uint everyoneMask, uint nextOwnerMask) | 632 | uint baseMask, uint currentMask, uint everyoneMask, uint nextOwnerMask) |
642 | { | 633 | { |
643 | CachedUserInfo userInfo | 634 | CachedUserInfo userInfo |
@@ -651,7 +642,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
651 | item.ID = LLUUID.Random(); | 642 | item.ID = LLUUID.Random(); |
652 | item.AssetID = asset.FullID; | 643 | item.AssetID = asset.FullID; |
653 | item.Description = asset.Description; | 644 | item.Description = asset.Description; |
654 | item.Name = asset.Name; | 645 | item.Name = name; |
646 | item.Flags = flags; | ||
655 | item.AssetType = asset.Type; | 647 | item.AssetType = asset.Type; |
656 | item.InvType = invType; | 648 | item.InvType = invType; |
657 | item.Folder = folderID; | 649 | item.Folder = folderID; |
@@ -715,7 +707,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
715 | AssetBase asset = CreateAsset(name, description, assetType, data); | 707 | AssetBase asset = CreateAsset(name, description, assetType, data); |
716 | AssetCache.AddAsset(asset); | 708 | AssetCache.AddAsset(asset); |
717 | 709 | ||
718 | CreateNewInventoryItem(remoteClient, folderID, callbackID, asset, invType, nextOwnerMask); | 710 | CreateNewInventoryItem(remoteClient, folderID, asset.Name, 0, callbackID, asset, invType, nextOwnerMask); |
719 | } | 711 | } |
720 | else | 712 | else |
721 | { | 713 | { |
@@ -864,38 +856,29 @@ namespace OpenSim.Region.Environment.Scenes | |||
864 | } | 856 | } |
865 | } | 857 | } |
866 | 858 | ||
867 | /// <summary> | 859 | private InventoryItemBase CreateAgentInventoryItemFromTask(LLUUID destAgent, SceneObjectPart part, LLUUID itemId) |
868 | /// Move the given item in the given prim to a folder in the client's inventory | ||
869 | /// </summary> | ||
870 | /// <param name="remoteClient"></param> | ||
871 | /// <param name="folderID"></param> | ||
872 | /// <param name="part"></param> | ||
873 | /// <param name="itemID"></param> | ||
874 | public void MoveTaskInventoryItem(IClientAPI remoteClient, LLUUID folderId, SceneObjectPart part, LLUUID itemId) | ||
875 | { | 860 | { |
876 | |||
877 | TaskInventoryItem taskItem = part.GetInventoryItem(itemId); | 861 | TaskInventoryItem taskItem = part.GetInventoryItem(itemId); |
878 | 862 | ||
879 | if (null == taskItem) | 863 | if (null == taskItem) |
880 | { | 864 | { |
881 | // Console already notified of error in GetInventoryItem | 865 | // Console already notified of error in GetInventoryItem |
882 | return; | 866 | return null; |
883 | } | 867 | } |
884 | 868 | ||
885 | InventoryItemBase agentItem = new InventoryItemBase(); | 869 | InventoryItemBase agentItem = new InventoryItemBase(); |
886 | 870 | ||
887 | agentItem.ID = LLUUID.Random(); | 871 | agentItem.ID = LLUUID.Random(); |
888 | agentItem.Creator = taskItem.CreatorID; | 872 | agentItem.Creator = taskItem.CreatorID; |
889 | agentItem.Owner = remoteClient.AgentId; | 873 | agentItem.Owner = destAgent; |
890 | agentItem.AssetID = taskItem.AssetID; | 874 | agentItem.AssetID = taskItem.AssetID; |
891 | agentItem.Description = taskItem.Description; | 875 | agentItem.Description = taskItem.Description; |
892 | agentItem.Name = taskItem.Name; | 876 | agentItem.Name = taskItem.Name; |
893 | agentItem.AssetType = taskItem.Type; | 877 | agentItem.AssetType = taskItem.Type; |
894 | agentItem.InvType = taskItem.InvType; | 878 | agentItem.InvType = taskItem.InvType; |
895 | agentItem.Folder = folderId; | ||
896 | agentItem.Flags = taskItem.Flags; | 879 | agentItem.Flags = taskItem.Flags; |
897 | 880 | ||
898 | if ((remoteClient.AgentId != taskItem.OwnerID) && ExternalChecks.ExternalChecksPropagatePermissions()) | 881 | if ((destAgent != taskItem.OwnerID) && ExternalChecks.ExternalChecksPropagatePermissions()) |
899 | { | 882 | { |
900 | agentItem.BasePermissions = taskItem.NextOwnerMask; | 883 | agentItem.BasePermissions = taskItem.NextOwnerMask; |
901 | agentItem.CurrentPermissions = taskItem.NextOwnerMask; | 884 | agentItem.CurrentPermissions = taskItem.NextOwnerMask; |
@@ -910,13 +893,29 @@ namespace OpenSim.Region.Environment.Scenes | |||
910 | agentItem.EveryOnePermissions = taskItem.EveryoneMask; | 893 | agentItem.EveryOnePermissions = taskItem.EveryoneMask; |
911 | } | 894 | } |
912 | 895 | ||
913 | AddInventoryItem(remoteClient, agentItem); | ||
914 | if (!ExternalChecks.ExternalChecksBypassPermissions()) | 896 | if (!ExternalChecks.ExternalChecksBypassPermissions()) |
915 | { | 897 | { |
916 | if ((taskItem.OwnerMask & (uint)PermissionMask.Copy) == 0) | 898 | if ((taskItem.OwnerMask & (uint)PermissionMask.Copy) == 0) |
917 | part.RemoveInventoryItem(itemId); | 899 | part.RemoveInventoryItem(itemId); |
918 | } | 900 | } |
919 | 901 | ||
902 | return agentItem; | ||
903 | } | ||
904 | |||
905 | /// <summary> | ||
906 | /// Move the given item in the given prim to a folder in the client's inventory | ||
907 | /// </summary> | ||
908 | /// <param name="remoteClient"></param> | ||
909 | /// <param name="folderID"></param> | ||
910 | /// <param name="part"></param> | ||
911 | /// <param name="itemID"></param> | ||
912 | public void MoveTaskInventoryItem(IClientAPI remoteClient, LLUUID folderId, SceneObjectPart part, LLUUID itemId) | ||
913 | { | ||
914 | |||
915 | InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(remoteClient.AgentId, part, itemId); | ||
916 | |||
917 | agentItem.Folder = folderId; | ||
918 | AddInventoryItem(remoteClient, agentItem); | ||
920 | } | 919 | } |
921 | 920 | ||
922 | /// <summary> | 921 | /// <summary> |
@@ -964,14 +963,22 @@ namespace OpenSim.Region.Environment.Scenes | |||
964 | 963 | ||
965 | if (TryGetAvatar(avatarId, out avatar)) | 964 | if (TryGetAvatar(avatarId, out avatar)) |
966 | { | 965 | { |
967 | MoveTaskInventoryItem(avatar.ControllingClient, folderId, part, itemId); | 966 | MoveTaskInventoryItem(avatar.ControllingClient, folderId, part, itemId); |
968 | } | 967 | } |
969 | else | 968 | else |
970 | { | 969 | { |
971 | m_log.ErrorFormat( | 970 | CachedUserInfo profile = CommsManager.UserProfileCacheService.GetUserDetails(avatarId); |
972 | "[PRIM INVENTORY]: " + | 971 | if(profile == null || profile.RootFolder == null) |
973 | "Avatar {0} cannot be found to update its prim item asset", | 972 | { |
974 | avatarId); | 973 | m_log.ErrorFormat( |
974 | "[PRIM INVENTORY]: " + | ||
975 | "Avatar {0} cannot be found to add item", | ||
976 | avatarId); | ||
977 | } | ||
978 | InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(avatarId, part, itemId); | ||
979 | agentItem.Folder = folderId; | ||
980 | |||
981 | AddInventoryItem(avatarId, agentItem); | ||
975 | } | 982 | } |
976 | } | 983 | } |
977 | 984 | ||
@@ -1047,6 +1054,41 @@ namespace OpenSim.Region.Environment.Scenes | |||
1047 | 1054 | ||
1048 | } | 1055 | } |
1049 | 1056 | ||
1057 | public void MoveTaskInventoryItems(LLUUID destID, string category, SceneObjectPart host, List<LLUUID> items) | ||
1058 | { | ||
1059 | CachedUserInfo profile = CommsManager.UserProfileCacheService.GetUserDetails(destID); | ||
1060 | if(profile == null || profile.RootFolder == null) | ||
1061 | { | ||
1062 | m_log.ErrorFormat( | ||
1063 | "[PRIM INVENTORY]: " + | ||
1064 | "Avatar {0} cannot be found to add items", | ||
1065 | destID); | ||
1066 | return; | ||
1067 | } | ||
1068 | |||
1069 | LLUUID newFolderID = LLUUID.Random(); | ||
1070 | |||
1071 | profile.CreateFolder(category, newFolderID, 0xffff, profile.RootFolder.ID); | ||
1072 | |||
1073 | foreach (LLUUID itemID in items) | ||
1074 | { | ||
1075 | InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(destID, host, itemID); | ||
1076 | agentItem.Folder = newFolderID; | ||
1077 | |||
1078 | AddInventoryItem(destID, agentItem); | ||
1079 | } | ||
1080 | |||
1081 | ScenePresence avatar; | ||
1082 | |||
1083 | if (TryGetAvatar(destID, out avatar)) | ||
1084 | { | ||
1085 | profile.SendInventoryDecendents(avatar.ControllingClient, | ||
1086 | profile.RootFolder.ID, true, false); | ||
1087 | profile.SendInventoryDecendents(avatar.ControllingClient, | ||
1088 | newFolderID, false, true); | ||
1089 | } | ||
1090 | } | ||
1091 | |||
1050 | /// <summary> | 1092 | /// <summary> |
1051 | /// Update an item in a prim (task) inventory. | 1093 | /// Update an item in a prim (task) inventory. |
1052 | /// This method does not handle scripts, <see>RezScript(IClientAPI, LLUUID, unit)</see> | 1094 | /// This method does not handle scripts, <see>RezScript(IClientAPI, LLUUID, unit)</see> |