mirror of
https://github.com/opensim/opensim.git
synced 2026-08-10 19:36:07 +08:00
* Store task inventory when an object is taken into agent inventory
* This means that you can take an object from a region and rez it somewhere else, with its inventory intact. * As for earlier, at this stage only scripts can be placed in inventory * This isn't an efficient implementation, a better one will probably need to come along soonish
This commit is contained in:
@@ -184,21 +184,21 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
}
|
||||
|
||||
// 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);
|
||||
// XXX Hardcoding the numbers is a temporary measure - need an enumeration for this
|
||||
// There may well be one in libsecondlife
|
||||
AssetBase asset = CreateAsset(item.Name, item.Description, 10, 10, data);
|
||||
AssetCache.AddAsset(asset);
|
||||
|
||||
// Update item with new asset
|
||||
item.asset_id = asset.FullID;
|
||||
item.AssetID = 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);
|
||||
group.StopScript(part.LocalID, item.ItemID);
|
||||
group.StartScript(part.LocalID, item.ItemID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -750,12 +750,14 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
private void AddRezObject(string xmlData, LLVector3 pos)
|
||||
{
|
||||
SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData);
|
||||
group.GenerateNewIDs();
|
||||
group.ResetIDs();
|
||||
AddEntity(group);
|
||||
group.AbsolutePosition = pos;
|
||||
SceneObjectPart rootPart = group.GetChildPart(group.UUID);
|
||||
rootPart.ApplySanePermissions();
|
||||
group.ApplyPhysics(m_physicalPrim);
|
||||
group.StartScripts();
|
||||
|
||||
//bool UsePhysics = (((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) > 0)&& m_physicalPrim);
|
||||
//if ((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) == 0)
|
||||
//{
|
||||
@@ -772,6 +774,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
// rootPart.DoPhysicsPropertyUpdate(UsePhysics, true);
|
||||
|
||||
// }
|
||||
//
|
||||
rootPart.ScheduleFullUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,14 +169,14 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
{
|
||||
TaskInventoryItem taskItem = new TaskInventoryItem();
|
||||
|
||||
taskItem.item_id = newItemId;
|
||||
taskItem.asset_id = item.assetID;
|
||||
taskItem.name = item.inventoryName;
|
||||
taskItem.desc = item.inventoryDescription;
|
||||
taskItem.owner_id = item.avatarID;
|
||||
taskItem.creator_id = item.creatorsID;
|
||||
taskItem.type = item.assetType;
|
||||
taskItem.inv_type = item.invType;
|
||||
taskItem.ItemID = newItemId;
|
||||
taskItem.AssetID = item.assetID;
|
||||
taskItem.Name = item.inventoryName;
|
||||
taskItem.Description = item.inventoryDescription;
|
||||
taskItem.OwnerID = item.avatarID;
|
||||
taskItem.CreatorID = item.creatorsID;
|
||||
taskItem.Type = item.assetType;
|
||||
taskItem.InvType = item.invType;
|
||||
part.AddInventoryItem(taskItem);
|
||||
|
||||
// It might seem somewhat crude to update the whole group for a single prim inventory change,
|
||||
@@ -250,7 +250,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
MainLog.Instance.Error(
|
||||
"PRIMINVENTORY",
|
||||
"Couldn't find prim ID {0} to update item {1}, {2}",
|
||||
item.ParentPartID, item.name, item.item_id);
|
||||
item.ParentPartID, item.Name, item.ItemID);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -609,15 +609,19 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
SetPartAsNonRoot(newPart);
|
||||
}
|
||||
|
||||
|
||||
public void GenerateNewIDs()
|
||||
/// <summary>
|
||||
/// Reset the LLUUIDs for all the prims that make up this group.
|
||||
///
|
||||
/// This is called by methods which want to add a new group to an existing scene, in order
|
||||
/// to ensure that there are no clashes with groups already present.
|
||||
/// </summary>
|
||||
public void ResetIDs()
|
||||
{
|
||||
List<SceneObjectPart> partsList = new List<SceneObjectPart>(m_parts.Values);
|
||||
m_parts.Clear();
|
||||
foreach (SceneObjectPart part in partsList)
|
||||
{
|
||||
part.UUID = LLUUID.Random();
|
||||
part.LinkNum = m_parts.Count;
|
||||
part.ResetIDs(m_parts.Count);
|
||||
m_parts.Add(part.UUID, part);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,19 +57,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
get { return m_folderID; }
|
||||
set { m_folderID = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Holds in memory prim inventory
|
||||
/// </summary>
|
||||
protected IDictionary<LLUUID, TaskInventoryItem> m_taskInventory
|
||||
= new Dictionary<LLUUID, TaskInventoryItem>();
|
||||
|
||||
[XmlIgnore]
|
||||
public IDictionary<LLUUID, TaskInventoryItem> TaskInventory
|
||||
{
|
||||
get { return m_taskInventory; }
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Serial count for inventory file , used to tell if inventory has changed
|
||||
/// no need for this to be part of Database backup
|
||||
@@ -79,8 +67,36 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
public uint InventorySerial
|
||||
{
|
||||
get { return m_inventorySerial; }
|
||||
set { m_inventorySerial = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Holds in memory prim inventory
|
||||
/// </summary>
|
||||
protected TaskInventoryDictionary m_taskInventory = new TaskInventoryDictionary();
|
||||
|
||||
public TaskInventoryDictionary TaskInventory
|
||||
{
|
||||
get { return m_taskInventory; }
|
||||
set { m_taskInventory = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reset LLUUIDs for all the items in the prim's inventory. This involves either generating
|
||||
/// new ones or setting existing UUIDs to the correct parent UUIDs
|
||||
/// </summary>
|
||||
/// <param name="linkNum'>Link number for the part</param>
|
||||
public void ResetInventoryIDs()
|
||||
{
|
||||
IList<TaskInventoryItem> items = new List<TaskInventoryItem>(TaskInventory.Values);
|
||||
TaskInventory.Clear();
|
||||
|
||||
foreach (TaskInventoryItem item in items)
|
||||
{
|
||||
item.ResetIDs(UUID);
|
||||
TaskInventory.Add(item.ItemID, item);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Start all the scripts contained in this prim's inventory
|
||||
@@ -90,7 +106,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
foreach (TaskInventoryItem item in m_taskInventory.Values)
|
||||
{
|
||||
// XXX more hardcoding badness. Should be an enum in TaskInventoryItem
|
||||
if (10 == item.type)
|
||||
if (10 == item.Type)
|
||||
{
|
||||
StartScript(item);
|
||||
}
|
||||
@@ -107,21 +123,21 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
// MainLog.Instance.Verbose(
|
||||
// "PRIMINVENTORY",
|
||||
// "Starting script {0}, {1} in prim {2}, {3}",
|
||||
// item.name, item.item_id, Name, UUID);
|
||||
// item.Name, item.ItemID, Name, UUID);
|
||||
|
||||
AssetBase rezAsset = m_parentGroup.Scene.AssetCache.GetAsset(item.asset_id, false);
|
||||
AssetBase rezAsset = m_parentGroup.Scene.AssetCache.GetAsset(item.AssetID, false);
|
||||
|
||||
if (rezAsset != null)
|
||||
{
|
||||
string script = Helpers.FieldToUTF8String(rezAsset.Data);
|
||||
m_parentGroup.Scene.EventManager.TriggerRezScript(LocalID, item.item_id, script);
|
||||
m_parentGroup.Scene.EventManager.TriggerRezScript(LocalID, item.ItemID, script);
|
||||
}
|
||||
else
|
||||
{
|
||||
MainLog.Instance.Error(
|
||||
"PRIMINVENTORY",
|
||||
"Couldn't start script {0}, {1} since asset ID {2} could not be found",
|
||||
item.name, item.item_id, item.asset_id);
|
||||
item.Name, item.ItemID, item.AssetID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,10 +188,10 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
/// <param name="item"></param>
|
||||
public void AddInventoryItem(TaskInventoryItem item)
|
||||
{
|
||||
item.parent_id = m_folderID;
|
||||
item.creation_date = 1000;
|
||||
item.ParentID = m_folderID;
|
||||
item.CreationDate = 1000;
|
||||
item.ParentPartID = UUID;
|
||||
m_taskInventory.Add(item.item_id, item);
|
||||
m_taskInventory.Add(item.ItemID, item);
|
||||
m_inventorySerial++;
|
||||
}
|
||||
|
||||
@@ -188,7 +204,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
{
|
||||
foreach (TaskInventoryItem item in items)
|
||||
{
|
||||
m_taskInventory.Add(item.item_id, item);
|
||||
m_taskInventory.Add(item.ItemID, item);
|
||||
}
|
||||
|
||||
m_inventorySerial++;
|
||||
@@ -224,9 +240,9 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
/// <returns>false if the item did not exist, true if the update occurred succesfully</returns>
|
||||
public bool UpdateInventoryItem(TaskInventoryItem item)
|
||||
{
|
||||
if (m_taskInventory.ContainsKey(item.item_id))
|
||||
if (m_taskInventory.ContainsKey(item.ItemID))
|
||||
{
|
||||
m_taskInventory[item.item_id] = item;
|
||||
m_taskInventory[item.ItemID] = item;
|
||||
m_inventorySerial++;
|
||||
|
||||
return true;
|
||||
@@ -236,7 +252,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
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);
|
||||
item.ItemID, Name, UUID);
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -252,7 +268,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
{
|
||||
if (m_taskInventory.ContainsKey(itemID))
|
||||
{
|
||||
int type = m_taskInventory[itemID].inv_type;
|
||||
int type = m_taskInventory[itemID].InvType;
|
||||
m_taskInventory.Remove(itemID);
|
||||
m_inventorySerial++;
|
||||
|
||||
@@ -296,8 +312,8 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
foreach (TaskInventoryItem item in m_taskInventory.Values)
|
||||
{
|
||||
invString.AddItemStart();
|
||||
invString.AddNameValueLine("item_id", item.item_id.ToString());
|
||||
invString.AddNameValueLine("parent_id", item.parent_id.ToString());
|
||||
invString.AddNameValueLine("item_id", item.ItemID.ToString());
|
||||
invString.AddNameValueLine("parent_id", item.ParentID.ToString());
|
||||
|
||||
invString.AddPermissionsStart();
|
||||
invString.AddNameValueLine("base_mask", "0x7FFFFFFF");
|
||||
@@ -305,19 +321,19 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
invString.AddNameValueLine("group_mask", "0x7FFFFFFF");
|
||||
invString.AddNameValueLine("everyone_mask", "0x7FFFFFFF");
|
||||
invString.AddNameValueLine("next_owner_mask", "0x7FFFFFFF");
|
||||
invString.AddNameValueLine("creator_id", item.creator_id.ToString());
|
||||
invString.AddNameValueLine("owner_id", item.owner_id.ToString());
|
||||
invString.AddNameValueLine("last_owner_id", item.last_owner_id.ToString());
|
||||
invString.AddNameValueLine("group_id", item.group_id.ToString());
|
||||
invString.AddNameValueLine("creator_id", item.CreatorID.ToString());
|
||||
invString.AddNameValueLine("owner_id", item.OwnerID.ToString());
|
||||
invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString());
|
||||
invString.AddNameValueLine("group_id", item.GroupID.ToString());
|
||||
invString.AddSectionEnd();
|
||||
|
||||
invString.AddNameValueLine("asset_id", item.asset_id.ToString());
|
||||
invString.AddNameValueLine("type", TaskInventoryItem.Types[item.type]);
|
||||
invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.inv_type]);
|
||||
invString.AddNameValueLine("asset_id", item.AssetID.ToString());
|
||||
invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]);
|
||||
invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]);
|
||||
invString.AddNameValueLine("flags", "0x00");
|
||||
invString.AddNameValueLine("name", item.name + "|");
|
||||
invString.AddNameValueLine("desc", item.desc + "|");
|
||||
invString.AddNameValueLine("creation_date", item.creation_date.ToString());
|
||||
invString.AddNameValueLine("name", item.Name + "|");
|
||||
invString.AddNameValueLine("desc", item.Description + "|");
|
||||
invString.AddNameValueLine("creation_date", item.CreationDate.ToString());
|
||||
invString.AddSectionEnd();
|
||||
}
|
||||
|
||||
|
||||
@@ -991,6 +991,19 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Reset LLUUIDs for this part. This involves generate this part's own LLUUID and
|
||||
/// generating new LLUUIDs for all the items in the inventory.
|
||||
/// </summary>
|
||||
/// <param name="linkNum'>Link number for the part</param>
|
||||
public void ResetIDs(int linkNum)
|
||||
{
|
||||
UUID = LLUUID.Random();
|
||||
LinkNum = linkNum;
|
||||
|
||||
ResetInventoryIDs();
|
||||
}
|
||||
|
||||
#region Update Scheduling
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
m_regInfo.RegionHandle, aPrimNode.OuterXml);
|
||||
if (newIDS)
|
||||
{
|
||||
obj.GenerateNewIDs();
|
||||
obj.ResetIDs();
|
||||
}
|
||||
//if we want this to be a import method then we need new uuids for the object to avoid any clashes
|
||||
//obj.RegenerateFullIDs();
|
||||
@@ -189,4 +189,4 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
file.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -140,6 +140,8 @@ namespace OpenSim.DataStore.MSSQL
|
||||
|
||||
public void RemoveObject(LLUUID obj, LLUUID regionUUID)
|
||||
{
|
||||
MainLog.Instance.Verbose("DATASTORE", "Removing obj: {0} from region: {1}", obj.UUID, regionUUID);
|
||||
|
||||
DataTable prims = ds.Tables["prims"];
|
||||
DataTable shapes = ds.Tables["primshapes"];
|
||||
|
||||
@@ -1087,4 +1089,4 @@ namespace OpenSim.DataStore.MSSQL
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user