diff --git a/OpenSim/Framework/Communications/Cache/AssetCache.cs b/OpenSim/Framework/Communications/Cache/AssetCache.cs
index 3866e21da9..c08bef2ad6 100644
--- a/OpenSim/Framework/Communications/Cache/AssetCache.cs
+++ b/OpenSim/Framework/Communications/Cache/AssetCache.cs
@@ -137,6 +137,16 @@ namespace OpenSim.Framework.Communications.Caches
return asset;
}
+ public AssetBase GetAsset(LLUUID assetID, bool isTexture)
+ {
+ AssetBase asset = GetAsset(assetID);
+ if (asset == null)
+ {
+ this._assetServer.RequestAsset(assetID, isTexture);
+ }
+ return asset;
+ }
+
public void AddAsset(AssetBase asset)
{
// Console.WriteLine("adding asset " + asset.FullID.ToStringHyphenated());
@@ -241,44 +251,51 @@ namespace OpenSim.Framework.Communications.Caches
if (IsTexture)
{
// Console.WriteLine("asset recieved from asset server");
+
TextureImage image = new TextureImage(asset);
- this.Textures.Add(image.FullID, image);
- if (this.RequestedTextures.ContainsKey(image.FullID))
+ if (!this.Textures.ContainsKey(image.FullID))
{
- AssetRequest req = this.RequestedTextures[image.FullID];
- req.ImageInfo = image;
- if (image.Data.LongLength > 600)
+ this.Textures.Add(image.FullID, image);
+ if (this.RequestedTextures.ContainsKey(image.FullID))
{
- //over 600 bytes so split up file
- req.NumPackets = 1 + (int)(image.Data.Length - 600 ) / 1000;
+ AssetRequest req = this.RequestedTextures[image.FullID];
+ req.ImageInfo = image;
+ if (image.Data.LongLength > 600)
+ {
+ //over 600 bytes so split up file
+ req.NumPackets = 1 + (int)(image.Data.Length - 600) / 1000;
+ }
+ else
+ {
+ req.NumPackets = 1;
+ }
+ this.RequestedTextures.Remove(image.FullID);
+ this.TextureRequests.Add(req);
}
- else
- {
- req.NumPackets = 1;
- }
- this.RequestedTextures.Remove(image.FullID);
- this.TextureRequests.Add(req);
}
}
else
{
AssetInfo assetInf = new AssetInfo(asset);
- this.Assets.Add(assetInf.FullID, assetInf);
- if (this.RequestedAssets.ContainsKey(assetInf.FullID))
+ if (!this.Assets.ContainsKey(assetInf.FullID))
{
- AssetRequest req = this.RequestedAssets[assetInf.FullID];
- req.AssetInf = assetInf;
- if (assetInf.Data.LongLength > 600)
+ this.Assets.Add(assetInf.FullID, assetInf);
+ if (this.RequestedAssets.ContainsKey(assetInf.FullID))
{
- //over 600 bytes so split up file
- req.NumPackets = 1 + (int)(assetInf.Data.Length - 600 + 999) / 1000;
+ AssetRequest req = this.RequestedAssets[assetInf.FullID];
+ req.AssetInf = assetInf;
+ if (assetInf.Data.LongLength > 600)
+ {
+ //over 600 bytes so split up file
+ req.NumPackets = 1 + (int)(assetInf.Data.Length - 600 + 999) / 1000;
+ }
+ else
+ {
+ req.NumPackets = 1;
+ }
+ this.RequestedAssets.Remove(assetInf.FullID);
+ this.AssetRequests.Add(req);
}
- else
- {
- req.NumPackets = 1;
- }
- this.RequestedAssets.Remove(assetInf.FullID);
- this.AssetRequests.Add(req);
}
}
}
diff --git a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs
index 9970d800fe..ddb5658980 100644
--- a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs
+++ b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs
@@ -105,13 +105,27 @@ namespace OpenSim.Framework.Communications.Caches
}
}
- public void updateItem(LLUUID userID, InventoryItemBase itemInfo)
+ public void UpdateItem(LLUUID userID, InventoryItemBase itemInfo)
{
if ((userID == this.UserProfile.UUID) && (this.RootFolder != null))
{
this.m_parentCommsManager.InventoryServer.AddNewInventoryItem(userID, itemInfo);
}
}
+
+ public bool DeleteItem(LLUUID userID, InventoryItemBase item)
+ {
+ bool result = false;
+ if ((userID == this.UserProfile.UUID) && (this.RootFolder != null))
+ {
+ result = RootFolder.DeleteItem(item.inventoryID);
+ if (result)
+ {
+ this.m_parentCommsManager.InventoryServer.DeleteInventoryItem(userID, item);
+ }
+ }
+ return result;
+ }
}
diff --git a/OpenSim/Framework/Communications/Cache/InventoryFolder.cs b/OpenSim/Framework/Communications/Cache/InventoryFolder.cs
index 6b0e2b43e2..34f83db49e 100644
--- a/OpenSim/Framework/Communications/Cache/InventoryFolder.cs
+++ b/OpenSim/Framework/Communications/Cache/InventoryFolder.cs
@@ -90,6 +90,26 @@ namespace OpenSim.Framework.Communications.Caches
return base2;
}
+ public bool DeleteItem(LLUUID itemID)
+ {
+ bool found = false;
+ if (this.Items.ContainsKey(itemID))
+ {
+ Items.Remove(itemID);
+ return true;
+ }
+ foreach (InventoryFolder folder in this.SubFolders.Values)
+ {
+ found = folder.DeleteItem(itemID);
+ if (found == true)
+ {
+ break;
+ }
+ }
+ return found;
+ }
+
+
public InventoryFolder HasSubFolder(LLUUID folderID)
{
InventoryFolder returnFolder = null;
diff --git a/OpenSim/Framework/Communications/IInventoryServices.cs b/OpenSim/Framework/Communications/IInventoryServices.cs
index 6f01cf2dfd..bd58756e36 100644
--- a/OpenSim/Framework/Communications/IInventoryServices.cs
+++ b/OpenSim/Framework/Communications/IInventoryServices.cs
@@ -16,5 +16,6 @@ namespace OpenSim.Framework.Communications
void RequestInventoryForUser(LLUUID userID, InventoryFolderInfo folderCallBack, InventoryItemInfo itemCallBack);
void AddNewInventoryFolder(LLUUID userID, InventoryFolder folder);
void AddNewInventoryItem(LLUUID userID, InventoryItemBase item);
+ void DeleteInventoryItem(LLUUID userID, InventoryItemBase item);
}
}
diff --git a/OpenSim/Framework/Data.MySQL/MySQLInventoryData.cs b/OpenSim/Framework/Data.MySQL/MySQLInventoryData.cs
index d8bfc4d72d..b02aa932df 100644
--- a/OpenSim/Framework/Data.MySQL/MySQLInventoryData.cs
+++ b/OpenSim/Framework/Data.MySQL/MySQLInventoryData.cs
@@ -319,6 +319,15 @@ namespace OpenSim.Framework.Data.MySQL
addInventoryItem(item);
}
+ ///
+ ///
+ ///
+ ///
+ public void deleteInventoryItem(InventoryItemBase item)
+ {
+
+ }
+
///
/// Creates a new inventory folder
///
diff --git a/OpenSim/Framework/Data.SQLite/SQLiteInventoryStore.cs b/OpenSim/Framework/Data.SQLite/SQLiteInventoryStore.cs
index 045fbee8fb..fe494fbb72 100644
--- a/OpenSim/Framework/Data.SQLite/SQLiteInventoryStore.cs
+++ b/OpenSim/Framework/Data.SQLite/SQLiteInventoryStore.cs
@@ -446,6 +446,23 @@ namespace OpenSim.Framework.Data.SQLite
this.addItem(item);
}
+ ///
+ ///
+ ///
+ ///
+ public void deleteInventoryItem(InventoryItemBase item)
+ {
+ DataTable inventoryItemTable = ds.Tables["inventoryitems"];
+
+ DataRow inventoryRow = inventoryItemTable.Rows.Find(item.inventoryID);
+ if (inventoryRow != null)
+ {
+ inventoryRow.Delete();
+ }
+
+ this.invItemsDa.Update(ds, "inventoryitems");
+ }
+
///
/// Adds a new folder specified by folder
///
diff --git a/OpenSim/Framework/Data/InventoryData.cs b/OpenSim/Framework/Data/InventoryData.cs
index a12b87b0e4..38c251c41d 100644
--- a/OpenSim/Framework/Data/InventoryData.cs
+++ b/OpenSim/Framework/Data/InventoryData.cs
@@ -201,6 +201,12 @@ namespace OpenSim.Framework.Data
/// The updated item
void updateInventoryItem(InventoryItemBase item);
+ ///
+ ///
+ ///
+ ///
+ void deleteInventoryItem(InventoryItemBase item);
+
///
/// Adds a new folder specified by folder
///
diff --git a/OpenSim/Framework/General/Interfaces/IClientAPI.cs b/OpenSim/Framework/General/Interfaces/IClientAPI.cs
index f39d0c7beb..8db1e15f04 100644
--- a/OpenSim/Framework/General/Interfaces/IClientAPI.cs
+++ b/OpenSim/Framework/General/Interfaces/IClientAPI.cs
@@ -36,7 +36,7 @@ namespace OpenSim.Framework.Interfaces
{
public delegate void ChatFromViewer(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID);
public delegate void ImprovedInstantMessage(LLUUID fromAgentID, LLUUID toAgentID, uint timestamp, string fromAgentName, string message); // Cut down from full list
- public delegate void RezObject(AssetBase primAsset, LLVector3 pos);
+ public delegate void RezObject(IClientAPI remoteClient, LLUUID itemID, LLVector3 pos);
public delegate void ModifyTerrain(float height, float seconds, byte size, byte action, float north, float west, IClientAPI remoteClient);
public delegate void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam);
public delegate void StartAnim(LLUUID animID, int seq);
@@ -210,6 +210,7 @@ namespace OpenSim.Framework.Interfaces
void SendInventoryFolderDetails(LLUUID ownerID, LLUUID folderID, List items);
void SendInventoryItemDetails(LLUUID ownerID, InventoryItemBase item);
void SendInventoryItemUpdate(InventoryItemBase Item);
+ void SendRemoveInventoryItem(LLUUID itemID);
void SendTaskInventory(LLUUID taskID, short serial, byte[] fileName);
void SendNameReply(LLUUID profileId, string firstname, string lastname);
diff --git a/OpenSim/Framework/General/NullClientAPI.cs b/OpenSim/Framework/General/NullClientAPI.cs
index e85b88fd60..6be2563a6b 100644
--- a/OpenSim/Framework/General/NullClientAPI.cs
+++ b/OpenSim/Framework/General/NullClientAPI.cs
@@ -138,6 +138,7 @@ namespace OpenSim.Framework
public virtual void SendInventoryFolderDetails(LLUUID ownerID, LLUUID folderID, List items){}
public virtual void SendInventoryItemDetails(LLUUID ownerID, InventoryItemBase item){}
public virtual void SendInventoryItemUpdate(InventoryItemBase Item) { }
+ public virtual void SendRemoveInventoryItem(LLUUID itemID) { }
public virtual void SendTaskInventory(LLUUID taskID, short serial, byte[] fileName) { }
public virtual void SendNameReply(LLUUID profileId, string firstname, string lastname){}
diff --git a/OpenSim/Framework/InventoryServiceBase/InventoryServiceBase.cs b/OpenSim/Framework/InventoryServiceBase/InventoryServiceBase.cs
index bc55d0573a..20d3a77680 100644
--- a/OpenSim/Framework/InventoryServiceBase/InventoryServiceBase.cs
+++ b/OpenSim/Framework/InventoryServiceBase/InventoryServiceBase.cs
@@ -124,6 +124,14 @@ namespace OpenSim.Framework.InventoryServiceBase
}
}
+ public void deleteItem(InventoryItemBase item)
+ {
+ foreach (KeyValuePair plugin in m_plugins)
+ {
+ plugin.Value.deleteInventoryItem(item);
+ }
+ }
+
///
///
///
diff --git a/OpenSim/Region/ClientStack/ClientView.API.cs b/OpenSim/Region/ClientStack/ClientView.API.cs
index d7962dc6b2..f655674fa6 100644
--- a/OpenSim/Region/ClientStack/ClientView.API.cs
+++ b/OpenSim/Region/ClientStack/ClientView.API.cs
@@ -630,6 +630,18 @@ namespace OpenSim.Region.ClientStack
OutPacket(InventoryReply);
}
+ public void SendRemoveInventoryItem(LLUUID itemID)
+ {
+ RemoveInventoryItemPacket remove = new RemoveInventoryItemPacket();
+ remove.AgentData.AgentID = this.AgentID;
+ remove.AgentData.SessionID = this.SessionID;
+ remove.InventoryData = new RemoveInventoryItemPacket.InventoryDataBlock[1];
+ remove.InventoryData[0] = new RemoveInventoryItemPacket.InventoryDataBlock();
+ remove.InventoryData[0].ItemID = itemID;
+
+ OutPacket(remove);
+ }
+
public void SendTaskInventory(LLUUID taskID, short serial, byte[] fileName)
{
ReplyTaskInventoryPacket replytask = new ReplyTaskInventoryPacket();
diff --git a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
index f380c257f5..89df29081e 100644
--- a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
+++ b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
@@ -45,12 +45,12 @@ namespace OpenSim.Region.ClientStack
get { return m_moneyBalance; }
}
- public bool AddMoney( int debit )
+ public bool AddMoney(int debit)
{
- if( m_moneyBalance + debit >= 0 )
+ if (m_moneyBalance + debit >= 0)
{
m_moneyBalance += debit;
- SendMoneyBalance( LLUUID.Zero, true, Helpers.StringToField("Poof Poof!"), m_moneyBalance );
+ SendMoneyBalance(LLUUID.Zero, true, Helpers.StringToField("Poof Poof!"), m_moneyBalance);
return true;
}
else
@@ -58,7 +58,7 @@ namespace OpenSim.Region.ClientStack
return false;
}
}
-
+
protected override void ProcessInPacket(Packet Pack)
{
ack_pack(Pack);
@@ -126,21 +126,9 @@ namespace OpenSim.Region.ClientStack
break;
case PacketType.RezObject:
RezObjectPacket rezPacket = (RezObjectPacket)Pack;
- AgentInventory inven = this.m_inventoryCache.GetAgentsInventory(this.AgentID);
- if (inven != null)
+ if (OnRezObject != null)
{
- if (inven.InventoryItems.ContainsKey(rezPacket.InventoryData.ItemID))
- {
- AssetBase asset = this.m_assetCache.GetAsset(inven.InventoryItems[rezPacket.InventoryData.ItemID].AssetID);
- if (asset != null)
- {
- if (OnRezObject != null)
- {
- this.OnRezObject(asset, rezPacket.RezData.RayEnd);
- this.m_inventoryCache.DeleteInventoryItem(this, rezPacket.InventoryData.ItemID);
- }
- }
- }
+ this.OnRezObject(this, rezPacket.InventoryData.ItemID, rezPacket.RezData.RayEnd);
}
break;
case PacketType.DeRezObject:
diff --git a/OpenSim/Region/Communications/Local/LocalInventoryService.cs b/OpenSim/Region/Communications/Local/LocalInventoryService.cs
index 8295cfae29..af58d33286 100644
--- a/OpenSim/Region/Communications/Local/LocalInventoryService.cs
+++ b/OpenSim/Region/Communications/Local/LocalInventoryService.cs
@@ -63,5 +63,10 @@ namespace OpenSim.Region.Communications.Local
{
this.AddItem(item);
}
+
+ public void DeleteInventoryItem(LLUUID userID, InventoryItemBase item)
+ {
+ this.deleteItem(item);
+ }
}
}
diff --git a/OpenSim/Region/Communications/OGS1/OGS1InventoryService.cs b/OpenSim/Region/Communications/OGS1/OGS1InventoryService.cs
index a98684e2d0..70ab75ea6c 100644
--- a/OpenSim/Region/Communications/OGS1/OGS1InventoryService.cs
+++ b/OpenSim/Region/Communications/OGS1/OGS1InventoryService.cs
@@ -29,5 +29,10 @@ namespace OpenSim.Region.Communications.OGS1
{
}
+
+ public void DeleteInventoryItem(LLUUID userID, InventoryItemBase item)
+ {
+
+ }
}
}
diff --git a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
index 10bdd54517..b901d239fd 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
@@ -34,6 +34,7 @@ using OpenSim.Framework.Interfaces;
using OpenSim.Framework.Types;
using OpenSim.Framework.Communications.Caches;
using OpenSim.Framework.Data;
+using OpenSim.Framework.Utilities;
namespace OpenSim.Region.Environment.Scenes
{
@@ -206,26 +207,16 @@ namespace OpenSim.Region.Environment.Scenes
});
}
- ///
- ///
- ///
- ///
- ///
- public void RezObject(AssetBase primAsset, LLVector3 pos)
- {
-
- }
-
///
///
///
///
///
- public void DeRezObject(Packet packet, IClientAPI simClient)
+ public void DeRezObject(Packet packet, IClientAPI remoteClient)
{
DeRezObjectPacket DeRezPacket = (DeRezObjectPacket)packet;
-
+
if (DeRezPacket.AgentBlock.DestinationID == LLUUID.Zero)
{
//currently following code not used (or don't know of any case of destination being zero
@@ -246,17 +237,44 @@ namespace OpenSim.Region.Environment.Scenes
}
if (selectedEnt != null)
{
- if (PermissionsMngr.CanDeRezObject(simClient.AgentId, selectedEnt.m_uuid))
+ if (PermissionsMngr.CanDeRezObject(remoteClient.AgentId,((SceneObjectGroup)selectedEnt).UUID))
{
- List avatars = this.RequestAvatarList();
- foreach (ScenePresence avatar in avatars)
+ string sceneObjectXml = ((SceneObjectGroup)selectedEnt).ToXmlString();
+ CachedUserInfo userInfo = commsManager.UserProfiles.GetUserDetails(remoteClient.AgentId);
+ if (userInfo != null)
{
- avatar.ControllingClient.SendKillObject(this.m_regionHandle, selectedEnt.LocalId);
+ AssetBase asset = new AssetBase();
+ asset.Name = ((SceneObjectGroup)selectedEnt).GetPartName(selectedEnt.LocalId);
+ asset.Description = ((SceneObjectGroup)selectedEnt).GetPartDescription(selectedEnt.LocalId);
+ asset.InvType = 6;
+ asset.Type = 6;
+ asset.FullID = LLUUID.Random();
+ asset.Data = Helpers.StringToField(sceneObjectXml);
+ this.assetCache.AddAsset(asset);
+
+
+ InventoryItemBase item = new InventoryItemBase();
+ item.avatarID = remoteClient.AgentId;
+ item.creatorsID = remoteClient.AgentId;
+ item.inventoryID = LLUUID.Random();
+ item.assetID = asset.FullID;
+ item.inventoryDescription = asset.Description;
+ item.inventoryName = asset.Name;
+ item.assetType = asset.Type;
+ item.invType = asset.InvType;
+ item.parentFolderID = DeRezPacket.AgentBlock.DestinationID;
+ item.inventoryCurrentPermissions = 2147483647;
+ item.inventoryNextPermissions = 2147483647;
+
+ userInfo.AddItem(remoteClient.AgentId, item);
+ remoteClient.SendInventoryItemUpdate(item);
}
+ ((SceneObjectGroup)selectedEnt).DeleteGroup();
+
lock (Entities)
{
- Entities.Remove(selectedEnt.m_uuid);
+ Entities.Remove(((SceneObjectGroup) selectedEnt).UUID);
}
}
}
@@ -264,6 +282,45 @@ namespace OpenSim.Region.Environment.Scenes
}
}
+ public void RezObject(IClientAPI remoteClient, LLUUID itemID, LLVector3 pos)
+ {
+ CachedUserInfo userInfo = commsManager.UserProfiles.GetUserDetails(remoteClient.AgentId);
+ if (userInfo != null)
+ {
+ if(userInfo.RootFolder != null)
+ {
+ InventoryItemBase item = userInfo.RootFolder.HasItem(itemID);
+ if (item != null)
+ {
+ AssetBase rezAsset = this.assetCache.GetAsset(item.assetID, false);
+ if (rezAsset != null)
+ {
+ this.AddRezObject(Util.FieldToString(rezAsset.Data), pos);
+ userInfo.DeleteItem(remoteClient.AgentId, item);
+ remoteClient.SendRemoveInventoryItem(itemID);
+ }
+ else
+ {
+ rezAsset = this.assetCache.GetAsset(item.assetID, false);
+ if (rezAsset != null)
+ {
+ this.AddRezObject(Util.FieldToString(rezAsset.Data), pos);
+ userInfo.DeleteItem(remoteClient.AgentId, item);
+ remoteClient.SendRemoveInventoryItem(itemID);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private void AddRezObject(string xmlData, LLVector3 pos)
+ {
+ SceneObjectGroup group = new SceneObjectGroup(this, this.m_regionHandle, xmlData);
+ this.AddEntity(group);
+ group.Pos = pos;
+ }
+
///
///
///
@@ -301,11 +358,11 @@ namespace OpenSim.Region.Environment.Scenes
this.Entities.Add(copy.UUID, copy);
copy.ScheduleGroupForFullUpdate();
- /* List avatars = this.RequestAvatarList();
- for (int i = 0; i < avatars.Count; i++)
- {
- // copy.SendAllChildPrimsToClient(avatars[i].ControllingClient);
- }*/
+ /* List avatars = this.RequestAvatarList();
+ for (int i = 0; i < avatars.Count; i++)
+ {
+ // copy.SendAllChildPrimsToClient(avatars[i].ControllingClient);
+ }*/
}
else
@@ -620,7 +677,7 @@ namespace OpenSim.Region.Environment.Scenes
if (hasPrim != false)
{
((SceneObjectGroup)ent).UpdateGroupRotation(pos, rot);
- // prim.UpdateGroupMouseRotation(pos, rot);
+ // prim.UpdateGroupMouseRotation(pos, rot);
break;
}
}
@@ -665,7 +722,7 @@ namespace OpenSim.Region.Environment.Scenes
{
if (ent is SceneObjectGroup)
{
- // prim = ((SceneObject)ent).HasChildPrim(localID);
+ // prim = ((SceneObject)ent).HasChildPrim(localID);
if (prim != null)
{
prim.UpdateSingleRotation(rot);
@@ -692,7 +749,7 @@ namespace OpenSim.Region.Environment.Scenes
if (hasPrim != false)
{
((SceneObjectGroup)ent).Resize(scale, localID);
- // prim.ResizeGoup(scale);
+ // prim.ResizeGoup(scale);
break;
}
}
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index 378acf9187..96bb97a92a 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -538,7 +538,10 @@ namespace OpenSim.Region.Environment.Scenes
public void AddEntity(SceneObjectGroup sceneObject)
{
- Entities.Add(sceneObject.UUID, sceneObject);
+ if(!Entities.ContainsKey(sceneObject.UUID))
+ {
+ Entities.Add(sceneObject.UUID, sceneObject);
+ }
}
public void RemoveEntity(SceneObjectGroup sceneObject)
@@ -604,6 +607,7 @@ namespace OpenSim.Region.Environment.Scenes
client.OnObjectDeselect += DeselectPrim;
client.OnGrabUpdate += MoveObject;
client.OnDeRezObject += DeRezObject;
+ client.OnRezObject += RezObject;
client.OnNameFromUUIDRequest += commsManager.HandleUUIDNameRequest;
client.OnObjectDescription += PrimDescription;
client.OnObjectName += PrimName;
@@ -1114,7 +1118,7 @@ namespace OpenSim.Region.Environment.Scenes
this.assetCache.AddAsset(asset);
item.assetID = asset.FullID;
- userInfo.updateItem(remoteClient.AgentId, item);
+ userInfo.UpdateItem(remoteClient.AgentId, item);
// remoteClient.SendInventoryItemUpdate(item);
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index 77d936d62a..73f199eecd 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -39,7 +39,7 @@ namespace OpenSim.Region.Environment.Scenes
{
get { return m_rootPart.RotationOffset; }
}
-
+
///
///
@@ -108,6 +108,12 @@ namespace OpenSim.Region.Environment.Scenes
get { return m_rootPart.OwnerID; }
}
+ public string Text
+ {
+ get { return m_rootPart.Text; }
+ set { m_rootPart.Text = value; }
+ }
+
///
/// Added because the Parcel code seems to use it
/// but not sure a object should have this
@@ -143,19 +149,40 @@ namespace OpenSim.Region.Environment.Scenes
StringReader sr = new StringReader(xmlData);
XmlTextReader reader = new XmlTextReader(sr);
+ reader.Read();
reader.ReadStartElement("SceneObjectGroup");
reader.ReadStartElement("RootPart");
this.m_rootPart = SceneObjectPart.FromXml(reader);
reader.ReadEndElement();
- //TODO: read and create rest of the parts
- reader.ReadEndElement();
+
+ while (reader.Read())
+ {
+ switch (reader.NodeType)
+ {
+ case XmlNodeType.Element:
+ if (reader.Name == "Part")
+ {
+ reader.Read();
+ SceneObjectPart Part = SceneObjectPart.FromXml(reader);
+ Part.LocalID = m_scene.PrimIDAllocate();
+ this.AddPart(Part);
+ Part.RegionHandle = m_regionHandle;
+ }
+ break;
+ case XmlNodeType.EndElement:
+ break;
+ }
+ }
reader.Close();
sr.Close();
-
+ this.m_rootPart.SetParent(this);
this.m_parts.Add(m_rootPart.UUID, m_rootPart);
this.m_rootPart.LocalID = m_scene.PrimIDAllocate();
+ this.m_rootPart.ParentID = 0;
this.m_rootPart.RegionHandle = m_regionHandle;
+ this.UpdateParentIDs();
m_scene.EventManager.OnBackup += this.ProcessBackup;
+ this.ScheduleGroupForFullUpdate();
}
///
@@ -192,6 +219,17 @@ namespace OpenSim.Region.Environment.Scenes
writer.WriteStartElement(String.Empty, "RootPart", String.Empty);
m_rootPart.ToXml(writer);
writer.WriteEndElement();
+ writer.WriteStartElement(String.Empty, "OtherParts", String.Empty);
+ foreach (SceneObjectPart part in this.m_parts.Values)
+ {
+ if (part.UUID != this.m_rootPart.UUID)
+ {
+ writer.WriteStartElement(String.Empty, "Part", String.Empty);
+ part.ToXml(writer);
+ writer.WriteEndElement();
+ }
+ }
+ writer.WriteEndElement();
writer.WriteEndElement();
writer.Close();
// System.Console.WriteLine("prim: " + sw.ToString());
@@ -215,11 +253,11 @@ namespace OpenSim.Region.Environment.Scenes
dupe.m_regionHandle = this.m_regionHandle;
dupe.CopyRootPart(this.m_rootPart);
-
+
List partList = new List(this.m_parts.Values);
foreach (SceneObjectPart part in partList)
{
- if (part.UUID != this.m_rootPart.UUID)
+ if (part.UUID != this.m_rootPart.UUID)
{
dupe.CopyPart(part);
}
@@ -477,13 +515,6 @@ namespace OpenSim.Region.Environment.Scenes
}
}
- public string Text
- {
- get { return m_rootPart.Text; }
- set { m_rootPart.Text = value; }
- }
-
-
public void SetPartText(string text, uint localID)
{
SceneObjectPart part = this.GetChildPrim(localID);
@@ -502,6 +533,26 @@ namespace OpenSim.Region.Environment.Scenes
}
}
+ public string GetPartName(uint localID)
+ {
+ SceneObjectPart part = this.GetChildPrim(localID);
+ if (part != null)
+ {
+ return part.PartName;
+ }
+ return "";
+ }
+
+ public string GetPartDescription(uint localID)
+ {
+ SceneObjectPart part = this.GetChildPrim(localID);
+ if (part != null)
+ {
+ return part.Description;
+ }
+ return "";
+ }
+
///
///
///
@@ -598,7 +649,7 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectPart part = this.GetChildPrim(localID);
if (part != null)
{
- if (part.UUID== this.m_rootPart.UUID)
+ if (part.UUID == this.m_rootPart.UUID)
{
this.UpdateRootPosition(pos);
}
@@ -805,14 +856,14 @@ namespace OpenSim.Region.Environment.Scenes
public override void UpdateMovement()
{
- foreach( SceneObjectPart part in m_parts.Values )
+ foreach (SceneObjectPart part in m_parts.Values)
{
part.UpdateMovement();
}
-
+
base.UpdateMovement();
}
-
+
///
/// Added as a way for the storage provider to reset the scene,
/// most likely a better way to do this sort of thing but for now...
@@ -857,8 +908,8 @@ namespace OpenSim.Region.Environment.Scenes
}
return null;
}
-
- public void UpdateText( string text )
+
+ public void UpdateText(string text)
{
m_rootPart.Text = text;
m_rootPart.ScheduleTerseUpdate();
@@ -866,7 +917,7 @@ namespace OpenSim.Region.Environment.Scenes
public void ObjectGrabHandler(uint localId, LLVector3 offsetPos, IClientAPI remoteClient)
{
- if( m_rootPart.LocalID == localId )
+ if (m_rootPart.LocalID == localId)
{
OnGrabGroup(offsetPos, remoteClient);
}
@@ -886,5 +937,18 @@ namespace OpenSim.Region.Environment.Scenes
{
}
+
+ public void DeleteGroup()
+ {
+ m_scene.EventManager.OnBackup -= this.ProcessBackup;
+ foreach (SceneObjectPart part in this.m_parts.Values)
+ {
+ List avatars = this.RequestSceneAvatars();
+ for (int i = 0; i < avatars.Count; i++)
+ {
+ avatars[i].ControllingClient.SendKillObject(this.m_regionHandle, part.LocalID);
+ }
+ }
+ }
}
}
diff --git a/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs
index 8bd7496c66..25b62b870b 100644
--- a/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs
+++ b/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs
@@ -153,6 +153,7 @@ namespace SimpleApp
public virtual void SendInventoryFolderDetails(LLUUID ownerID, LLUUID folderID, List items) { }
public virtual void SendInventoryItemDetails(LLUUID ownerID, InventoryItemBase item) { }
public virtual void SendInventoryItemUpdate(InventoryItemBase Item) { }
+ public virtual void SendRemoveInventoryItem(LLUUID itemID) { }
public virtual void SendTaskInventory(LLUUID taskID, short serial, byte[] fileName) { }
public virtual void SendNameReply(LLUUID profileId, string firstname, string lastname) { }