aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Scene.Inventory.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs221
1 files changed, 125 insertions, 96 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 4cc797b..1d8b988 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -99,34 +99,22 @@ namespace OpenSim.Region.Framework.Scenes
99 /// <param name="item"></param> 99 /// <param name="item"></param>
100 public bool AddInventoryItem(InventoryItemBase item) 100 public bool AddInventoryItem(InventoryItemBase item)
101 { 101 {
102 if (UUID.Zero == item.Folder) 102 InventoryFolderBase folder;
103
104 if (item.Folder == UUID.Zero)
103 { 105 {
104 InventoryFolderBase f = InventoryService.GetFolderForType(item.Owner, (AssetType)item.AssetType); 106 folder = InventoryService.GetFolderForType(item.Owner, (AssetType)item.AssetType);
105 if (f != null) 107 if (folder == null)
106 {
107// m_log.DebugFormat(
108// "[LOCAL INVENTORY SERVICES CONNECTOR]: Found folder {0} type {1} for item {2}",
109// f.Name, (AssetType)f.Type, item.Name);
110
111 item.Folder = f.ID;
112 }
113 else
114 { 108 {
115 f = InventoryService.GetRootFolder(item.Owner); 109 folder = InventoryService.GetRootFolder(item.Owner);
116 if (f != null) 110
117 { 111 if (folder == null)
118 item.Folder = f.ID;
119 }
120 else
121 {
122 m_log.WarnFormat(
123 "[AGENT INVENTORY]: Could not find root folder for {0} when trying to add item {1} with no parent folder specified",
124 item.Owner, item.Name);
125 return false; 112 return false;
126 }
127 } 113 }
114
115 item.Folder = folder.ID;
128 } 116 }
129 117
130 if (InventoryService.AddItem(item)) 118 if (InventoryService.AddItem(item))
131 { 119 {
132 int userlevel = 0; 120 int userlevel = 0;
@@ -252,8 +240,7 @@ namespace OpenSim.Region.Framework.Scenes
252 240
253 // Update item with new asset 241 // Update item with new asset
254 item.AssetID = asset.FullID; 242 item.AssetID = asset.FullID;
255 if (group.UpdateInventoryItem(item)) 243 group.UpdateInventoryItem(item);
256 remoteClient.SendAgentAlertMessage("Script saved", false);
257 244
258 part.GetProperties(remoteClient); 245 part.GetProperties(remoteClient);
259 246
@@ -264,12 +251,7 @@ namespace OpenSim.Region.Framework.Scenes
264 { 251 {
265 // Needs to determine which engine was running it and use that 252 // Needs to determine which engine was running it and use that
266 // 253 //
267 part.Inventory.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine, 0); 254 errors = part.Inventory.CreateScriptInstanceEr(item.ItemID, 0, false, DefaultScriptEngine, 0);
268 errors = part.Inventory.GetScriptErrors(item.ItemID);
269 }
270 else
271 {
272 remoteClient.SendAgentAlertMessage("Script saved", false);
273 } 255 }
274 part.ParentGroup.ResumeScripts(); 256 part.ParentGroup.ResumeScripts();
275 return errors; 257 return errors;
@@ -683,6 +665,8 @@ namespace OpenSim.Region.Framework.Scenes
683 return; 665 return;
684 } 666 }
685 667
668 if (newName == null) newName = item.Name;
669
686 AssetBase asset = AssetService.Get(item.AssetID.ToString()); 670 AssetBase asset = AssetService.Get(item.AssetID.ToString());
687 671
688 if (asset != null) 672 if (asset != null)
@@ -730,6 +714,24 @@ namespace OpenSim.Region.Framework.Scenes
730 } 714 }
731 715
732 /// <summary> 716 /// <summary>
717 /// Move an item within the agent's inventory, and leave a copy (used in making a new outfit)
718 /// </summary>
719 public void MoveInventoryItemsLeaveCopy(IClientAPI remoteClient, List<InventoryItemBase> items, UUID destfolder)
720 {
721 List<InventoryItemBase> moveitems = new List<InventoryItemBase>();
722 foreach (InventoryItemBase b in items)
723 {
724 CopyInventoryItem(remoteClient, 0, remoteClient.AgentId, b.ID, b.Folder, null);
725 InventoryItemBase n = InventoryService.GetItem(b);
726 n.Folder = destfolder;
727 moveitems.Add(n);
728 remoteClient.SendInventoryItemCreateUpdate(n, 0);
729 }
730
731 MoveInventoryItem(remoteClient, moveitems);
732 }
733
734 /// <summary>
733 /// Move an item within the agent's inventory. 735 /// Move an item within the agent's inventory.
734 /// </summary> 736 /// </summary>
735 /// <param name="remoteClient"></param> 737 /// <param name="remoteClient"></param>
@@ -972,8 +974,12 @@ namespace OpenSim.Region.Framework.Scenes
972 public void RemoveTaskInventory(IClientAPI remoteClient, UUID itemID, uint localID) 974 public void RemoveTaskInventory(IClientAPI remoteClient, UUID itemID, uint localID)
973 { 975 {
974 SceneObjectPart part = GetSceneObjectPart(localID); 976 SceneObjectPart part = GetSceneObjectPart(localID);
975 SceneObjectGroup group = part.ParentGroup; 977 SceneObjectGroup group = null;
976 if (group != null) 978 if (part != null)
979 {
980 group = part.ParentGroup;
981 }
982 if (part != null && group != null)
977 { 983 {
978 if (!Permissions.CanEditObjectInventory(part.UUID, remoteClient.AgentId)) 984 if (!Permissions.CanEditObjectInventory(part.UUID, remoteClient.AgentId))
979 return; 985 return;
@@ -1420,13 +1426,6 @@ namespace OpenSim.Region.Framework.Scenes
1420 { 1426 {
1421 agentTransactions.HandleTaskItemUpdateFromTransaction( 1427 agentTransactions.HandleTaskItemUpdateFromTransaction(
1422 remoteClient, part, transactionID, currentItem); 1428 remoteClient, part, transactionID, currentItem);
1423
1424 if ((InventoryType)itemInfo.InvType == InventoryType.Notecard)
1425 remoteClient.SendAgentAlertMessage("Notecard saved", false);
1426 else if ((InventoryType)itemInfo.InvType == InventoryType.LSL)
1427 remoteClient.SendAgentAlertMessage("Script saved", false);
1428 else
1429 remoteClient.SendAgentAlertMessage("Item saved", false);
1430 } 1429 }
1431 1430
1432 // Base ALWAYS has move 1431 // Base ALWAYS has move
@@ -1544,7 +1543,7 @@ namespace OpenSim.Region.Framework.Scenes
1544 return; 1543 return;
1545 1544
1546 AssetBase asset = CreateAsset(itemBase.Name, itemBase.Description, (sbyte)itemBase.AssetType, 1545 AssetBase asset = CreateAsset(itemBase.Name, itemBase.Description, (sbyte)itemBase.AssetType,
1547 Encoding.ASCII.GetBytes("default\n{\n state_entry()\n {\n llSay(0, \"Script running\");\n }\n}"), 1546 Encoding.ASCII.GetBytes("default\n{\n state_entry()\n {\n llSay(0, \"Script running\");\n }\n\n touch_start(integer num)\n {\n }\n}"),
1548 remoteClient.AgentId); 1547 remoteClient.AgentId);
1549 AssetService.Store(asset); 1548 AssetService.Store(asset);
1550 1549
@@ -1696,23 +1695,32 @@ namespace OpenSim.Region.Framework.Scenes
1696 // build a list of eligible objects 1695 // build a list of eligible objects
1697 List<uint> deleteIDs = new List<uint>(); 1696 List<uint> deleteIDs = new List<uint>();
1698 List<SceneObjectGroup> deleteGroups = new List<SceneObjectGroup>(); 1697 List<SceneObjectGroup> deleteGroups = new List<SceneObjectGroup>();
1699 1698 List<SceneObjectGroup> takeGroups = new List<SceneObjectGroup>();
1700 // Start with true for both, then remove the flags if objects
1701 // that we can't derez are part of the selection
1702 bool permissionToTake = true;
1703 bool permissionToTakeCopy = true;
1704 bool permissionToDelete = true;
1705 1699
1706 foreach (uint localID in localIDs) 1700 foreach (uint localID in localIDs)
1707 { 1701 {
1702 // Start with true for both, then remove the flags if objects
1703 // that we can't derez are part of the selection
1704 bool permissionToTake = true;
1705 bool permissionToTakeCopy = true;
1706 bool permissionToDelete = true;
1707
1708 // Invalid id 1708 // Invalid id
1709 SceneObjectPart part = GetSceneObjectPart(localID); 1709 SceneObjectPart part = GetSceneObjectPart(localID);
1710 if (part == null) 1710 if (part == null)
1711 {
1712 //Client still thinks the object exists, kill it
1713 deleteIDs.Add(localID);
1711 continue; 1714 continue;
1715 }
1712 1716
1713 // Already deleted by someone else 1717 // Already deleted by someone else
1714 if (part.ParentGroup == null || part.ParentGroup.IsDeleted) 1718 if (part.ParentGroup == null || part.ParentGroup.IsDeleted)
1719 {
1720 //Client still thinks the object exists, kill it
1721 deleteIDs.Add(localID);
1715 continue; 1722 continue;
1723 }
1716 1724
1717 // Can't delete child prims 1725 // Can't delete child prims
1718 if (part != part.ParentGroup.RootPart) 1726 if (part != part.ParentGroup.RootPart)
@@ -1720,9 +1728,6 @@ namespace OpenSim.Region.Framework.Scenes
1720 1728
1721 SceneObjectGroup grp = part.ParentGroup; 1729 SceneObjectGroup grp = part.ParentGroup;
1722 1730
1723 deleteIDs.Add(localID);
1724 deleteGroups.Add(grp);
1725
1726 if (remoteClient == null) 1731 if (remoteClient == null)
1727 { 1732 {
1728 // Autoreturn has a null client. Nothing else does. So 1733 // Autoreturn has a null client. Nothing else does. So
@@ -1734,8 +1739,15 @@ namespace OpenSim.Region.Framework.Scenes
1734 } 1739 }
1735 else 1740 else
1736 { 1741 {
1737 if (!Permissions.CanTakeCopyObject(grp.UUID, remoteClient.AgentId)) 1742 if (action == DeRezAction.TakeCopy)
1743 {
1744 if (!Permissions.CanTakeCopyObject(grp.UUID, remoteClient.AgentId))
1745 permissionToTakeCopy = false;
1746 }
1747 else
1748 {
1738 permissionToTakeCopy = false; 1749 permissionToTakeCopy = false;
1750 }
1739 if (!Permissions.CanTakeObject(grp.UUID, remoteClient.AgentId)) 1751 if (!Permissions.CanTakeObject(grp.UUID, remoteClient.AgentId))
1740 permissionToTake = false; 1752 permissionToTake = false;
1741 1753
@@ -1743,71 +1755,88 @@ namespace OpenSim.Region.Framework.Scenes
1743 permissionToDelete = false; 1755 permissionToDelete = false;
1744 } 1756 }
1745 1757
1746 } 1758 // Handle god perms
1747 1759 if ((remoteClient != null) && Permissions.IsGod(remoteClient.AgentId))
1748 // Handle god perms 1760 {
1749 if ((remoteClient != null) && Permissions.IsGod(remoteClient.AgentId)) 1761 permissionToTake = true;
1750 { 1762 permissionToTakeCopy = true;
1751 permissionToTake = true; 1763 permissionToDelete = true;
1752 permissionToTakeCopy = true; 1764 }
1753 permissionToDelete = true;
1754 }
1755 1765
1756 // If we're re-saving, we don't even want to delete 1766 // If we're re-saving, we don't even want to delete
1757 if (action == DeRezAction.SaveToExistingUserInventoryItem) 1767 if (action == DeRezAction.SaveToExistingUserInventoryItem)
1758 permissionToDelete = false; 1768 permissionToDelete = false;
1759 1769
1760 // if we want to take a copy, we also don't want to delete 1770 // if we want to take a copy, we also don't want to delete
1761 // Note: after this point, the permissionToTakeCopy flag 1771 // Note: after this point, the permissionToTakeCopy flag
1762 // becomes irrelevant. It already includes the permissionToTake 1772 // becomes irrelevant. It already includes the permissionToTake
1763 // permission and after excluding no copy items here, we can 1773 // permission and after excluding no copy items here, we can
1764 // just use that. 1774 // just use that.
1765 if (action == DeRezAction.TakeCopy) 1775 if (action == DeRezAction.TakeCopy)
1766 { 1776 {
1767 // If we don't have permission, stop right here 1777 // If we don't have permission, stop right here
1768 if (!permissionToTakeCopy) 1778 if (!permissionToTakeCopy)
1769 return; 1779 return;
1770 1780
1771 permissionToTake = true; 1781 permissionToTake = true;
1772 // Don't delete 1782 // Don't delete
1773 permissionToDelete = false; 1783 permissionToDelete = false;
1774 } 1784 }
1775 1785
1776 if (action == DeRezAction.Return) 1786 if (action == DeRezAction.Return)
1777 {
1778 if (remoteClient != null)
1779 { 1787 {
1780 if (Permissions.CanReturnObjects( 1788 if (remoteClient != null)
1781 null,
1782 remoteClient.AgentId,
1783 deleteGroups))
1784 { 1789 {
1785 permissionToTake = true; 1790 if (Permissions.CanReturnObjects(
1786 permissionToDelete = true; 1791 null,
1787 1792 remoteClient.AgentId,
1788 foreach (SceneObjectGroup g in deleteGroups) 1793 deleteGroups))
1789 { 1794 {
1790 AddReturn(g.OwnerID, g.Name, g.AbsolutePosition, "parcel owner return"); 1795 permissionToTake = true;
1796 permissionToDelete = true;
1797
1798 AddReturn(grp.OwnerID, grp.Name, grp.AbsolutePosition, "parcel owner return");
1791 } 1799 }
1792 } 1800 }
1801 else // Auto return passes through here with null agent
1802 {
1803 permissionToTake = true;
1804 permissionToDelete = true;
1805 }
1793 } 1806 }
1794 else // Auto return passes through here with null agent 1807
1808 if (permissionToTake && (!permissionToDelete))
1809 takeGroups.Add(grp);
1810
1811 if (permissionToDelete)
1795 { 1812 {
1796 permissionToTake = true; 1813 if (permissionToTake)
1797 permissionToDelete = true; 1814 deleteGroups.Add(grp);
1815 deleteIDs.Add(grp.LocalId);
1798 } 1816 }
1799 } 1817 }
1800 1818
1801 if (permissionToTake) 1819 SendKillObject(deleteIDs);
1820
1821 if (deleteGroups.Count > 0)
1802 { 1822 {
1823 foreach (SceneObjectGroup g in deleteGroups)
1824 deleteIDs.Remove(g.LocalId);
1825
1803 m_asyncSceneObjectDeleter.DeleteToInventory( 1826 m_asyncSceneObjectDeleter.DeleteToInventory(
1804 action, destinationID, deleteGroups, remoteClient, 1827 action, destinationID, deleteGroups, remoteClient,
1805 permissionToDelete); 1828 true);
1829 }
1830 if (takeGroups.Count > 0)
1831 {
1832 m_asyncSceneObjectDeleter.DeleteToInventory(
1833 action, destinationID, takeGroups, remoteClient,
1834 false);
1806 } 1835 }
1807 else if (permissionToDelete) 1836 if (deleteIDs.Count > 0)
1808 { 1837 {
1809 foreach (SceneObjectGroup g in deleteGroups) 1838 foreach (SceneObjectGroup g in deleteGroups)
1810 DeleteSceneObject(g, false); 1839 DeleteSceneObject(g, true);
1811 } 1840 }
1812 } 1841 }
1813 1842