diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Scene.Inventory.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 182 |
1 files changed, 104 insertions, 78 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index e005698..31d9ce59 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -1463,7 +1463,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1463 | // If we've found the item in the user's inventory or in the library | 1463 | // If we've found the item in the user's inventory or in the library |
1464 | if (item != null) | 1464 | if (item != null) |
1465 | { | 1465 | { |
1466 | part.ParentGroup.AddInventoryItem(remoteClient, primLocalID, item, copyID); | 1466 | part.ParentGroup.AddInventoryItem(remoteClient.AgentId, primLocalID, item, copyID); |
1467 | m_log.InfoFormat( | 1467 | m_log.InfoFormat( |
1468 | "[PRIM INVENTORY]: Update with item {0} requested of prim {1} for {2}", | 1468 | "[PRIM INVENTORY]: Update with item {0} requested of prim {1} for {2}", |
1469 | item.Name, primLocalID, remoteClient.Name); | 1469 | item.Name, primLocalID, remoteClient.Name); |
@@ -1572,104 +1572,130 @@ namespace OpenSim.Region.Framework.Scenes | |||
1572 | /// Rez a script into a prim's inventory, either ex nihilo or from an existing avatar inventory | 1572 | /// Rez a script into a prim's inventory, either ex nihilo or from an existing avatar inventory |
1573 | /// </summary> | 1573 | /// </summary> |
1574 | /// <param name="remoteClient"></param> | 1574 | /// <param name="remoteClient"></param> |
1575 | /// <param name="itemID"> </param> | 1575 | /// <param name="itemBase"> </param> |
1576 | /// <param name="transactionID"></param> | ||
1576 | /// <param name="localID"></param> | 1577 | /// <param name="localID"></param> |
1577 | public void RezScript(IClientAPI remoteClient, InventoryItemBase itemBase, UUID transactionID, uint localID) | 1578 | public void RezScript(IClientAPI remoteClient, InventoryItemBase itemBase, UUID transactionID, uint localID) |
1578 | { | 1579 | { |
1579 | UUID itemID = itemBase.ID; | 1580 | SceneObjectPart partWhereRezzed; |
1581 | |||
1582 | if (itemBase.ID != UUID.Zero) | ||
1583 | partWhereRezzed = RezScriptFromAgentInventory(remoteClient.AgentId, itemBase.ID, localID); | ||
1584 | else | ||
1585 | partWhereRezzed = RezNewScript(remoteClient.AgentId, itemBase); | ||
1586 | |||
1587 | if (partWhereRezzed != null) | ||
1588 | partWhereRezzed.SendPropertiesToClient(remoteClient); | ||
1589 | } | ||
1590 | |||
1591 | /// <summary> | ||
1592 | /// Rez a script into a prim from an agent inventory. | ||
1593 | /// </summary> | ||
1594 | /// <param name="agentID"></param> | ||
1595 | /// <param name="fromItemID"></param> | ||
1596 | /// <param name="localID"></param> | ||
1597 | /// <returns>The part where the script was rezzed if successful. False otherwise.</returns> | ||
1598 | public SceneObjectPart RezScriptFromAgentInventory(UUID agentID, UUID fromItemID, uint localID) | ||
1599 | { | ||
1580 | UUID copyID = UUID.Random(); | 1600 | UUID copyID = UUID.Random(); |
1601 | InventoryItemBase item = new InventoryItemBase(fromItemID, agentID); | ||
1602 | item = InventoryService.GetItem(item); | ||
1581 | 1603 | ||
1582 | if (itemID != UUID.Zero) // transferred from an avatar inventory to the prim's inventory | 1604 | // Try library |
1605 | // XXX clumsy, possibly should be one call | ||
1606 | if (null == item && LibraryService != null && LibraryService.LibraryRootFolder != null) | ||
1583 | { | 1607 | { |
1584 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | 1608 | item = LibraryService.LibraryRootFolder.FindItem(fromItemID); |
1585 | item = InventoryService.GetItem(item); | 1609 | } |
1586 | 1610 | ||
1587 | // Try library | 1611 | if (item != null) |
1588 | // XXX clumsy, possibly should be one call | 1612 | { |
1589 | if (null == item && LibraryService != null && LibraryService.LibraryRootFolder != null) | 1613 | SceneObjectPart part = GetSceneObjectPart(localID); |
1614 | if (part != null) | ||
1590 | { | 1615 | { |
1591 | item = LibraryService.LibraryRootFolder.FindItem(itemID); | 1616 | if (!Permissions.CanEditObjectInventory(part.UUID, agentID)) |
1592 | } | 1617 | return null; |
1593 | 1618 | ||
1594 | if (item != null) | 1619 | part.ParentGroup.AddInventoryItem(agentID, localID, item, copyID); |
1595 | { | 1620 | // TODO: switch to posting on_rez here when scripts |
1596 | SceneObjectPart part = GetSceneObjectPart(localID); | 1621 | // have state in inventory |
1597 | if (part != null) | 1622 | part.Inventory.CreateScriptInstance(copyID, 0, false, DefaultScriptEngine, 0); |
1598 | { | ||
1599 | if (!Permissions.CanEditObjectInventory(part.UUID, remoteClient.AgentId)) | ||
1600 | return; | ||
1601 | 1623 | ||
1602 | part.ParentGroup.AddInventoryItem(remoteClient, localID, item, copyID); | 1624 | // m_log.InfoFormat("[PRIMINVENTORY]: " + |
1603 | // TODO: switch to posting on_rez here when scripts | 1625 | // "Rezzed script {0} into prim local ID {1} for user {2}", |
1604 | // have state in inventory | 1626 | // item.inventoryName, localID, remoteClient.Name); |
1605 | part.Inventory.CreateScriptInstance(copyID, 0, false, DefaultScriptEngine, 0); | 1627 | part.ParentGroup.ResumeScripts(); |
1606 | 1628 | ||
1607 | // m_log.InfoFormat("[PRIMINVENTORY]: " + | 1629 | return part; |
1608 | // "Rezzed script {0} into prim local ID {1} for user {2}", | ||
1609 | // item.inventoryName, localID, remoteClient.Name); | ||
1610 | part.SendPropertiesToClient(remoteClient); | ||
1611 | part.ParentGroup.ResumeScripts(); | ||
1612 | } | ||
1613 | else | ||
1614 | { | ||
1615 | m_log.ErrorFormat( | ||
1616 | "[PRIM INVENTORY]: " + | ||
1617 | "Could not rez script {0} into prim local ID {1} for user {2}" | ||
1618 | + " because the prim could not be found in the region!", | ||
1619 | item.Name, localID, remoteClient.Name); | ||
1620 | } | ||
1621 | } | 1630 | } |
1622 | else | 1631 | else |
1623 | { | 1632 | { |
1624 | m_log.ErrorFormat( | 1633 | m_log.ErrorFormat( |
1625 | "[PRIM INVENTORY]: Could not find script inventory item {0} to rez for {1}!", | 1634 | "[PRIM INVENTORY]: " + |
1626 | itemID, remoteClient.Name); | 1635 | "Could not rez script {0} into prim local ID {1} for user {2}" |
1636 | + " because the prim could not be found in the region!", | ||
1637 | item.Name, localID, agentID); | ||
1627 | } | 1638 | } |
1628 | } | 1639 | } |
1629 | else // script has been rezzed directly into a prim's inventory | 1640 | else |
1630 | { | 1641 | { |
1631 | SceneObjectPart part = GetSceneObjectPart(itemBase.Folder); | 1642 | m_log.ErrorFormat( |
1632 | if (part == null) | 1643 | "[PRIM INVENTORY]: Could not find script inventory item {0} to rez for {1}!", |
1633 | return; | 1644 | fromItemID, agentID); |
1645 | } | ||
1634 | 1646 | ||
1635 | if (!Permissions.CanCreateObjectInventory( | 1647 | return null; |
1636 | itemBase.InvType, part.UUID, remoteClient.AgentId)) | 1648 | } |
1637 | return; | ||
1638 | 1649 | ||
1639 | AssetBase asset = CreateAsset(itemBase.Name, itemBase.Description, (sbyte)itemBase.AssetType, | 1650 | /// <summary> |
1640 | Encoding.ASCII.GetBytes("default\n{\n state_entry()\n {\n llSay(0, \"Script running\");\n }\n\n touch_start(integer num)\n {\n }\n}"), | 1651 | /// Rez a new script from nothing. |
1641 | remoteClient.AgentId); | 1652 | /// </summary> |
1642 | AssetService.Store(asset); | 1653 | /// <param name="remoteClient"></param> |
1654 | /// <param name="itemBase"></param> | ||
1655 | /// <returns>The part where the script was rezzed if successful. False otherwise.</returns> | ||
1656 | public SceneObjectPart RezNewScript(UUID agentID, InventoryItemBase itemBase) | ||
1657 | { | ||
1658 | // The part ID is the folder ID! | ||
1659 | SceneObjectPart part = GetSceneObjectPart(itemBase.Folder); | ||
1660 | if (part == null) | ||
1661 | return null; | ||
1643 | 1662 | ||
1644 | TaskInventoryItem taskItem = new TaskInventoryItem(); | 1663 | if (!Permissions.CanCreateObjectInventory(itemBase.InvType, part.UUID, agentID)) |
1645 | 1664 | return null; | |
1646 | taskItem.ResetIDs(itemBase.Folder); | ||
1647 | taskItem.ParentID = itemBase.Folder; | ||
1648 | taskItem.CreationDate = (uint)itemBase.CreationDate; | ||
1649 | taskItem.Name = itemBase.Name; | ||
1650 | taskItem.Description = itemBase.Description; | ||
1651 | taskItem.Type = itemBase.AssetType; | ||
1652 | taskItem.InvType = itemBase.InvType; | ||
1653 | taskItem.OwnerID = itemBase.Owner; | ||
1654 | taskItem.CreatorID = itemBase.CreatorIdAsUuid; | ||
1655 | taskItem.BasePermissions = itemBase.BasePermissions; | ||
1656 | taskItem.CurrentPermissions = itemBase.CurrentPermissions; | ||
1657 | taskItem.EveryonePermissions = itemBase.EveryOnePermissions; | ||
1658 | taskItem.GroupPermissions = itemBase.GroupPermissions; | ||
1659 | taskItem.NextPermissions = itemBase.NextPermissions; | ||
1660 | taskItem.GroupID = itemBase.GroupID; | ||
1661 | taskItem.GroupPermissions = 0; | ||
1662 | taskItem.Flags = itemBase.Flags; | ||
1663 | taskItem.PermsGranter = UUID.Zero; | ||
1664 | taskItem.PermsMask = 0; | ||
1665 | taskItem.AssetID = asset.FullID; | ||
1666 | |||
1667 | part.Inventory.AddInventoryItem(taskItem, false); | ||
1668 | part.SendPropertiesToClient(remoteClient); | ||
1669 | 1665 | ||
1670 | part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0); | 1666 | AssetBase asset = CreateAsset(itemBase.Name, itemBase.Description, (sbyte)itemBase.AssetType, |
1671 | part.ParentGroup.ResumeScripts(); | 1667 | Encoding.ASCII.GetBytes("default\n{\n state_entry()\n {\n llSay(0, \"Script running\");\n }\n\n touch_start(integer num)\n {\n }\n}"), |
1672 | } | 1668 | agentID); |
1669 | AssetService.Store(asset); | ||
1670 | |||
1671 | TaskInventoryItem taskItem = new TaskInventoryItem(); | ||
1672 | |||
1673 | taskItem.ResetIDs(itemBase.Folder); | ||
1674 | taskItem.ParentID = itemBase.Folder; | ||
1675 | taskItem.CreationDate = (uint)itemBase.CreationDate; | ||
1676 | taskItem.Name = itemBase.Name; | ||
1677 | taskItem.Description = itemBase.Description; | ||
1678 | taskItem.Type = itemBase.AssetType; | ||
1679 | taskItem.InvType = itemBase.InvType; | ||
1680 | taskItem.OwnerID = itemBase.Owner; | ||
1681 | taskItem.CreatorID = itemBase.CreatorIdAsUuid; | ||
1682 | taskItem.BasePermissions = itemBase.BasePermissions; | ||
1683 | taskItem.CurrentPermissions = itemBase.CurrentPermissions; | ||
1684 | taskItem.EveryonePermissions = itemBase.EveryOnePermissions; | ||
1685 | taskItem.GroupPermissions = itemBase.GroupPermissions; | ||
1686 | taskItem.NextPermissions = itemBase.NextPermissions; | ||
1687 | taskItem.GroupID = itemBase.GroupID; | ||
1688 | taskItem.GroupPermissions = 0; | ||
1689 | taskItem.Flags = itemBase.Flags; | ||
1690 | taskItem.PermsGranter = UUID.Zero; | ||
1691 | taskItem.PermsMask = 0; | ||
1692 | taskItem.AssetID = asset.FullID; | ||
1693 | |||
1694 | part.Inventory.AddInventoryItem(taskItem, false); | ||
1695 | part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0); | ||
1696 | part.ParentGroup.ResumeScripts(); | ||
1697 | |||
1698 | return part; | ||
1673 | } | 1699 | } |
1674 | 1700 | ||
1675 | /// <summary> | 1701 | /// <summary> |
@@ -1678,7 +1704,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1678 | /// <param name="remoteClient"></param> | 1704 | /// <param name="remoteClient"></param> |
1679 | /// <param name="itemID"> </param> | 1705 | /// <param name="itemID"> </param> |
1680 | /// <param name="localID"></param> | 1706 | /// <param name="localID"></param> |
1681 | public void RezScript(UUID srcId, SceneObjectPart srcPart, UUID destId, int pin, int running, int start_param) | 1707 | public void RezScriptFromPrim(UUID srcId, SceneObjectPart srcPart, UUID destId, int pin, int running, int start_param) |
1682 | { | 1708 | { |
1683 | TaskInventoryItem srcTaskItem = srcPart.Inventory.GetInventoryItem(srcId); | 1709 | TaskInventoryItem srcTaskItem = srcPart.Inventory.GetInventoryItem(srcId); |
1684 | 1710 | ||