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) { }