From 796ae57bea5e7004ac8d41bee2d496d645db81ce Mon Sep 17 00:00:00 2001
From: Justin Clarke Casey
Date: Wed, 9 Jan 2008 15:46:45 +0000
Subject: Prim inventory script saving phase 2. * It is now possible to edit
and save scripts directly from prim inventories * On saving, the script will
be restarted in the region * Doesn't appear that it's yet possible to drag
inventory contents back to agent inventory. Not quite sure why this is yet -
the perms all look very permissive.
---
OpenSim/Region/Environment/Scenes/InnerScene.cs | 2 +-
.../Region/Environment/Scenes/Scene.Inventory.cs | 82 ++++++++++------
.../Environment/Scenes/Scene.PacketHandlers.cs | 2 +-
.../Scenes/SceneObjectGroup.Inventory.cs | 98 ++++++++++++++++++-
.../Region/Environment/Scenes/SceneObjectGroup.cs | 7 +-
.../Scenes/SceneObjectPart.Inventory.cs | 107 +++++++++++++++++----
6 files changed, 241 insertions(+), 57 deletions(-)
diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs
index 0935b43..8c0ba3c 100644
--- a/OpenSim/Region/Environment/Scenes/InnerScene.cs
+++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs
@@ -433,7 +433,7 @@ namespace OpenSim.Region.Environment.Scenes
}
}
return returnResult;
- }
+ }
public SceneObjectPart GetSceneObjectPart(uint localID)
{
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
index 1a05bd9..db3da48 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
@@ -58,7 +58,9 @@ namespace OpenSim.Region.Environment.Scenes
/// in which the item is to be placed.
public void AddInventoryItem(IClientAPI remoteClient, InventoryItemBase item)
{
- CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
+ CachedUserInfo userInfo
+ = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
+
if (userInfo != null)
{
userInfo.AddItem(remoteClient.AgentId, item);
@@ -157,28 +159,47 @@ namespace OpenSim.Region.Environment.Scenes
///
/// The prim which contains the item to update
/// Indicates whether the script to update is currently running
- ///
- /// Asset LLUID created
+ ///
public void CapsUpdateTaskInventoryScriptAsset(IClientAPI remoteClient, LLUUID itemId,
LLUUID primId, bool isScriptRunning, byte[] data)
{
- // TODO Not currently doing anything with the isScriptRunning bool
+ // Retrieve group
+ SceneObjectPart part = GetSceneObjectPart(primId);
+ SceneObjectGroup group = part.ParentGroup;
+ if (null == group)
+ {
+ MainLog.Instance.Error(
+ "PRIMINVENTORY",
+ "Prim inventory update requested for item ID {0} in prim ID {1} but this prim does not exist",
+ itemId, primId);
- MainLog.Instance.Verbose(
- "PRIMINVENTORY",
- "Prim inventory script save functionality not yet implemented."
- + " remoteClient: {0}, itemID: {1}, primID: {2}, isScriptRunning: {3}",
- remoteClient, itemId, primId, isScriptRunning);
-
- // TODO
- // Retrieve client LLUID
- // Retrieve sog containing primID
+ return;
+ }
+
// Retrieve item
- // Create new asset and add to cache
+ TaskInventoryItem item = group.GetInventoryItem(part.LocalID, itemId);
+ if (null == item)
+ {
+ return;
+ }
+
+ // Create new asset
+ // XXX Hardcoding the numbers is a temporary measure - need an enumeration for this
+ AssetBase asset =
+ CreateAsset(item.name, item.desc, 10, 10, data);
+ AssetCache.AddAsset(asset);
+
// Update item with new asset
- // Trigger SOG update (see RezScript)
- // Trigger rerunning of script (use TriggerRezScript event, see RezScript)
- // return new asset id
+ item.asset_id = asset.FullID;
+ group.UpdateInventoryItem(item);
+ group.GetProperites(remoteClient);
+
+ // Trigger rerunning of script (use TriggerRezScript event, see RezScript)
+ if (isScriptRunning)
+ {
+ group.StopScript(part.LocalID, item.item_id);
+ group.StartScript(part.LocalID, item.item_id);
+ }
}
///
@@ -268,14 +289,14 @@ namespace OpenSim.Region.Environment.Scenes
}
else
{
- MainLog.Instance.Warn(
+ MainLog.Instance.Error(
"AGENTINVENTORY",
"Item ID " + itemID + " not found for an inventory item update.");
}
}
else
{
- MainLog.Instance.Warn(
+ MainLog.Instance.Error(
"AGENTINVENTORY",
"Agent ID " + remoteClient.AgentId + " not found for an inventory item update.");
}
@@ -290,7 +311,7 @@ namespace OpenSim.Region.Environment.Scenes
CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(oldAgentID);
if (userInfo == null)
{
- MainLog.Instance.Warn("AGENTINVENTORY", "Failed to find user " + oldAgentID.ToString());
+ MainLog.Instance.Error("AGENTINVENTORY", "Failed to find user " + oldAgentID.ToString());
return;
}
@@ -299,13 +320,13 @@ namespace OpenSim.Region.Environment.Scenes
item = userInfo.RootFolder.HasItem(oldItemID);
if (item == null)
{
- MainLog.Instance.Warn("AGENTINVENTORY", "Failed to find item " + oldItemID.ToString());
+ MainLog.Instance.Error("AGENTINVENTORY", "Failed to find item " + oldItemID.ToString());
return;
}
}
else
{
- MainLog.Instance.Warn("AGENTINVENTORY", "Failed to find item " + oldItemID.ToString());
+ MainLog.Instance.Error("AGENTINVENTORY", "Failed to find item " + oldItemID.ToString());
return;
}
}
@@ -346,7 +367,7 @@ namespace OpenSim.Region.Environment.Scenes
CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
if (userInfo == null)
{
- MainLog.Instance.Warn("AGENTINVENTORY", "Failed to find user " + remoteClient.AgentId.ToString());
+ MainLog.Instance.Error("AGENTINVENTORY", "Failed to find user " + remoteClient.AgentId.ToString());
return;
}
@@ -367,13 +388,13 @@ namespace OpenSim.Region.Environment.Scenes
}
else
{
- MainLog.Instance.Warn("AGENTINVENTORY", "Failed to find item " + itemID.ToString());
+ MainLog.Instance.Error("AGENTINVENTORY", "Failed to find item " + itemID.ToString());
return;
}
}
else
{
- MainLog.Instance.Warn("AGENTINVENTORY", "Failed to find item " + itemID.ToString() + ", no root folder");
+ MainLog.Instance.Error("AGENTINVENTORY", "Failed to find item " + itemID.ToString() + ", no root folder");
return;
}
}
@@ -476,7 +497,7 @@ namespace OpenSim.Region.Environment.Scenes
}
else
{
- MainLog.Instance.Warn(
+ MainLog.Instance.Error(
"PRIMINVENTORY", "Inventory requested of prim {0} which doesn't exist", primLocalID);
}
}
@@ -484,7 +505,8 @@ namespace OpenSim.Region.Environment.Scenes
///
/// Remove an item from a prim (task) inventory
///
- ///
+ /// Unused at the moment but retained since the avatar ID might
+ /// be necessary for a permissions check at some stage.
///
///
public void RemoveTaskInventory(IClientAPI remoteClient, LLUUID itemID, uint localID)
@@ -492,7 +514,7 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectGroup group = GetGroupByPrim(localID);
if (group != null)
{
- int type = group.RemoveInventoryItem(remoteClient, localID, itemID);
+ int type = group.RemoveInventoryItem(localID, itemID);
group.GetProperites(remoteClient);
if (type == 10)
{
@@ -501,7 +523,7 @@ namespace OpenSim.Region.Environment.Scenes
}
else
{
- MainLog.Instance.Warn(
+ MainLog.Instance.Error(
"PRIMINVENTORY",
"Removal of item {0} requested of prim {1} but this prim does not exist",
itemID,
@@ -752,4 +774,4 @@ namespace OpenSim.Region.Environment.Scenes
rootPart.ScheduleFullUpdate();
}
}
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
index 647fbf4..5a7d4de 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
@@ -176,7 +176,7 @@ namespace OpenSim.Region.Environment.Scenes
agentData.AgentID = avatarID;
agentData.QueryID = RequestID;
replyPacket.AgentData = agentData;
- byte[] bytes = new byte[AvatarResponses.Count*32];
+ //byte[] bytes = new byte[AvatarResponses.Count*32];
int i = 0;
foreach (AvatarPickerAvatar item in AvatarResponses)
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs
index b72d743..4d25b5d 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs
@@ -60,6 +60,27 @@ namespace OpenSim.Region.Environment.Scenes
}
}
+// /// Start a given script.
+// ///
+// ///
+// /// A
+// ///
+// public void StartScript(LLUUID partID, LLUUID itemID)
+// {
+// SceneObjectPart part = GetChildPart(partID);
+// if (part != null)
+// {
+// part.StartScript(itemID);
+// }
+// else
+// {
+// MainLog.Instance.Error(
+// "PRIMINVENTORY",
+// "Couldn't find part {0} in object group {1}, {2} to start script with ID {3}",
+// localID, Name, UUID, itemID);
+// }
+// }
+
///
/// Start the scripts contained in all the prims in this group.
///
@@ -71,6 +92,27 @@ namespace OpenSim.Region.Environment.Scenes
}
}
+ /// Start a given script.
+ ///
+ ///
+ /// A
+ ///
+ public void StopScript(uint partID, LLUUID itemID)
+ {
+ SceneObjectPart part = GetChildPart(partID);
+ if (part != null)
+ {
+ part.StopScript(itemID);
+ }
+ else
+ {
+ MainLog.Instance.Error(
+ "PRIMINVENTORY",
+ "Couldn't find part {0} in object group {1}, {2} to stop script with ID {3}",
+ partID, Name, UUID, itemID);
+ }
+ }
+
///
///
///
@@ -156,13 +198,63 @@ namespace OpenSim.Region.Environment.Scenes
return false;
}
+
+ ///
+ /// Returns an existing inventory item. Returns the original, so any changes will be live.
+ ///
+ ///
+ ///
+ /// null if the item does not exist
+ public TaskInventoryItem GetInventoryItem(uint primID, LLUUID itemID)
+ {
+ SceneObjectPart part = GetChildPart(primID);
+ if (part != null)
+ {
+ return part.GetInventoryItem(itemID);
+ }
+ else
+ {
+ MainLog.Instance.Error(
+ "PRIMINVENTORY",
+ "Couldn't find prim local ID {0} in prim {1}, {2} to get inventory item ID {3}",
+ primID, part.Name, part.UUID, itemID);
+ }
+
+ return null;
+ }
+
+ ///
+ /// Update an existing inventory item.
+ ///
+ /// The updated item. An item with the same id must already exist
+ /// in this prim's inventory
+ /// false if the item did not exist, true if the update occurred succesfully
+ public bool UpdateInventoryItem(TaskInventoryItem item)
+ {
+ SceneObjectPart part = GetChildPart(item.ParentPartID);
+ if (part != null)
+ {
+ part.UpdateInventoryItem(item);
+
+ return true;
+ }
+ else
+ {
+ MainLog.Instance.Error(
+ "PRIMINVENTORY",
+ "Couldn't find prim ID {0} to update item {1}, {2}",
+ item.ParentPartID, item.name, item.item_id);
+ }
+
+ return false;
+ }
- public int RemoveInventoryItem(IClientAPI remoteClient, uint localID, LLUUID itemID)
+ public int RemoveInventoryItem(uint localID, LLUUID itemID)
{
SceneObjectPart part = GetChildPart(localID);
if (part != null)
{
- int type = part.RemoveInventoryItem(remoteClient, localID, itemID);
+ int type = part.RemoveInventoryItem(itemID);
// It might seem somewhat crude to update the whole group for a single prim inventory change,
// but it's possible that other prim inventory changes will take place before the region
@@ -177,4 +269,4 @@ namespace OpenSim.Region.Environment.Scenes
return -1;
}
}
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index e8d12ff..c623e55 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -375,8 +375,9 @@ namespace OpenSim.Region.Environment.Scenes
foreach (SceneObjectPart part in m_parts.Values)
{
- Vector3 partPosition =
- new Vector3(part.AbsolutePosition.X, part.AbsolutePosition.Y, part.AbsolutePosition.Z);
+ // Temporary commented to stop compiler warning
+ //Vector3 partPosition =
+ // new Vector3(part.AbsolutePosition.X, part.AbsolutePosition.Y, part.AbsolutePosition.Z);
Quaternion parentrotation =
new Quaternion(GroupRotation.W, GroupRotation.X, GroupRotation.Y, GroupRotation.Z);
@@ -827,10 +828,8 @@ namespace OpenSim.Region.Environment.Scenes
///
public bool HasChildPrim(LLUUID primID)
{
- SceneObjectPart childPart = null;
if (m_parts.ContainsKey(primID))
{
- childPart = m_parts[primID];
return true;
}
return false;
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs
index 9e2c256..5d197e3 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs
@@ -144,7 +144,26 @@ namespace OpenSim.Region.Environment.Scenes
itemId, Name, UUID);
}
- }
+ }
+
+ ///
+ /// Stop a script which is in this prim's inventory.
+ ///
+ ///
+ public void StopScript(LLUUID itemId)
+ {
+ if (m_taskInventory.ContainsKey(itemId))
+ {
+ m_parentGroup.Scene.EventManager.TriggerRemoveScript(LocalID, itemId);
+ }
+ else
+ {
+ MainLog.Instance.Error(
+ "PRIMINVENTORY",
+ "Couldn't stop script with ID {0} since it couldn't be found for prim {1}, {2}",
+ itemId, Name, UUID);
+ }
+ }
///
/// Add an item to this prim's inventory.
@@ -173,33 +192,85 @@ namespace OpenSim.Region.Environment.Scenes
m_inventorySerial++;
}
+
+ ///
+ /// Returns an existing inventory item. Returns the original, so any changes will be live.
+ ///
+ ///
+ /// null if the item does not exist
+ public TaskInventoryItem GetInventoryItem(LLUUID itemID)
+ {
+ if (m_taskInventory.ContainsKey(itemID))
+ {
+ return m_taskInventory[itemID];
+ }
+ else
+ {
+ MainLog.Instance.Error(
+ "PRIMINVENTORY",
+ "Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
+ itemID, Name, UUID);
+ }
+
+ return null;
+ }
+
+ ///
+ /// Update an existing inventory item.
+ ///
+ /// The updated item. An item with the same id must already exist
+ /// in this prim's inventory.
+ /// false if the item did not exist, true if the update occurred succesfully
+ public bool UpdateInventoryItem(TaskInventoryItem item)
+ {
+ if (m_taskInventory.ContainsKey(item.item_id))
+ {
+ m_taskInventory[item.item_id] = item;
+ m_inventorySerial++;
+
+ return true;
+ }
+ else
+ {
+ MainLog.Instance.Error(
+ "PRIMINVENTORY",
+ "Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
+ item.item_id, Name, UUID);
+ }
+
+ return false;
+ }
///
/// Remove an item from this prim's inventory
///
- ///
- ///
///
- /// Numeric asset type of the item removed.
- public int RemoveInventoryItem(IClientAPI remoteClient, uint localID, LLUUID itemID)
+ /// Numeric asset type of the item removed. Returns -1 if the item did not exist
+ /// in this prim's inventory.
+ public int RemoveInventoryItem(LLUUID itemID)
{
- if (localID == LocalID)
+ if (m_taskInventory.ContainsKey(itemID))
{
- if (m_taskInventory.ContainsKey(itemID))
+ string type = m_taskInventory[itemID].inv_type;
+ m_taskInventory.Remove(itemID);
+ m_inventorySerial++;
+ if (type == "lsltext")
+ {
+ return 10;
+ }
+ else
{
- string type = m_taskInventory[itemID].inv_type;
- m_taskInventory.Remove(itemID);
- m_inventorySerial++;
- if (type == "lsltext")
- {
- return 10;
- }
- else
- {
- return 0;
- }
+ return 0;
}
}
+ else
+ {
+ MainLog.Instance.Error(
+ "PRIMINVENTORY",
+ "Tried to remove item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
+ itemID, Name, UUID);
+ }
+
return -1;
}
--
cgit v1.1