aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Framework/ISceneObject.cs1
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs36
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs21
-rw-r--r--OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs19
-rw-r--r--OpenSim/Region/Framework/Interfaces/IEntityInventory.cs1
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs4
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs17
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs6
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs37
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs18
-rw-r--r--OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs5
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs20
-rw-r--r--OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs7
-rw-r--r--OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs1
15 files changed, 125 insertions, 70 deletions
diff --git a/OpenSim/Framework/ISceneObject.cs b/OpenSim/Framework/ISceneObject.cs
index 5147901..18631f1 100644
--- a/OpenSim/Framework/ISceneObject.cs
+++ b/OpenSim/Framework/ISceneObject.cs
@@ -39,5 +39,6 @@ namespace OpenSim.Framework
39 void ExtraFromXmlString(string xmlstr); 39 void ExtraFromXmlString(string xmlstr);
40 string GetStateSnapshot(); 40 string GetStateSnapshot();
41 void SetState(string xmlstr, IScene s); 41 void SetState(string xmlstr, IScene s);
42 bool HasGroupChanged { get; set; }
42 } 43 }
43} 44}
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 6122cc2..fc92fc3 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -276,6 +276,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
276 276
277 if (objatt != null) 277 if (objatt != null)
278 { 278 {
279 // Loading the inventory from XML will have set this, but
280 // there is no way the object could have changed yet,
281 // since scripts aren't running yet. So, clear it here.
282 objatt.HasGroupChanged = false;
279 bool tainted = false; 283 bool tainted = false;
280 if (AttachmentPt != 0 && AttachmentPt != objatt.GetAttachmentPoint()) 284 if (AttachmentPt != 0 && AttachmentPt != objatt.GetAttachmentPoint())
281 tainted = true; 285 tainted = true;
@@ -486,9 +490,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
486 { 490 {
487 m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero); 491 m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero);
488 // CM / XMREngine!!!! Needed to conclude attach event 492 // CM / XMREngine!!!! Needed to conclude attach event
489 SceneObjectSerializer.ToOriginalXmlFormat(group); 493 //SceneObjectSerializer.ToOriginalXmlFormat(group);
490 group.DetachToInventoryPrep(); 494 group.DetachToInventoryPrep();
491 m_log.Debug("[ATTACHMENTS MODULE]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString()); 495 m_log.Debug("[ATTACHMENTS MODULE]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString());
496
497 // If an item contains scripts, it's always changed.
498 // This ensures script state is saved on detach
499 foreach (SceneObjectPart p in group.Parts)
500 if (p.Inventory.ContainsScripts())
501 group.HasGroupChanged = true;
502
492 UpdateKnownItem(remoteClient, group, group.GetFromItemID(), group.OwnerID); 503 UpdateKnownItem(remoteClient, group, group.GetFromItemID(), group.OwnerID);
493 m_scene.DeleteSceneObject(group, false); 504 m_scene.DeleteSceneObject(group, false);
494 return; 505 return;
@@ -497,25 +508,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
497 } 508 }
498 } 509 }
499 510
500 public void UpdateAttachmentPosition(IClientAPI client, SceneObjectGroup sog, Vector3 pos)
501 {
502 // If this is an attachment, then we need to save the modified
503 // object back into the avatar's inventory. First we save the
504 // attachment point information, then we update the relative
505 // positioning (which caused this method to get driven in the
506 // first place. Then we have to mark the object as NOT an
507 // attachment. This is necessary in order to correctly save
508 // and retrieve GroupPosition information for the attachment.
509 // Then we save the asset back into the appropriate inventory
510 // entry. Finally, we restore the object's attachment status.
511 byte attachmentPoint = sog.GetAttachmentPoint();
512 sog.UpdateGroupPosition(pos);
513 sog.RootPart.IsAttachment = false;
514 sog.AbsolutePosition = sog.RootPart.AttachedPos;
515 UpdateKnownItem(client, sog, sog.GetFromItemID(), sog.OwnerID);
516 sog.SetAttachmentPoint(attachmentPoint);
517 }
518
519 /// <summary> 511 /// <summary>
520 /// Update the attachment asset for the new sog details if they have changed. 512 /// Update the attachment asset for the new sog details if they have changed.
521 /// </summary> 513 /// </summary>
@@ -527,7 +519,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
527 /// <param name="grp"></param> 519 /// <param name="grp"></param>
528 /// <param name="itemID"></param> 520 /// <param name="itemID"></param>
529 /// <param name="agentID"></param> 521 /// <param name="agentID"></param>
530 protected void UpdateKnownItem(IClientAPI remoteClient, SceneObjectGroup grp, UUID itemID, UUID agentID) 522 public void UpdateKnownItem(IClientAPI remoteClient, SceneObjectGroup grp, UUID itemID, UUID agentID)
531 { 523 {
532 if (grp != null) 524 if (grp != null)
533 { 525 {
@@ -542,7 +534,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
542 grp.UUID, grp.GetAttachmentPoint()); 534 grp.UUID, grp.GetAttachmentPoint());
543 535
544 string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp); 536 string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp);
545
546 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); 537 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
547 item = m_scene.InventoryService.GetItem(item); 538 item = m_scene.InventoryService.GetItem(item);
548 539
@@ -636,7 +627,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
636 // In case it is later dropped again, don't let 627 // In case it is later dropped again, don't let
637 // it get cleaned up 628 // it get cleaned up
638 so.RootPart.RemFlag(PrimFlags.TemporaryOnRez); 629 so.RootPart.RemFlag(PrimFlags.TemporaryOnRez);
639 so.HasGroupChanged = false;
640 } 630 }
641 } 631 }
642} 632}
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index 0700aa5..2e3db48 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -719,15 +719,20 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
719 { 719 {
720 group.RootPart.Flags |= PrimFlags.Phantom; 720 group.RootPart.Flags |= PrimFlags.Phantom;
721 group.RootPart.IsAttachment = true; 721 group.RootPart.IsAttachment = true;
722 }
723 722
724 // If we're rezzing an attachment then don't ask 723 // If we're rezzing an attachment then don't ask
725 // AddNewSceneObject() to update the client since 724 // AddNewSceneObject() to update the client since
726 // we'll be doing that later on. Scheduling more than 725 // we'll be doing that later on. Scheduling more
727 // one full update during the attachment 726 // than one full update during the attachment
728 // process causes some clients to fail to display the 727 // process causes some clients to fail to display
729 // attachment properly. 728 // the attachment properly.
730 m_Scene.AddNewSceneObject(group, true, false); 729 // Also, don't persist attachments.
730 m_Scene.AddNewSceneObject(group, false, false);
731 }
732 else
733 {
734 m_Scene.AddNewSceneObject(group, true, false);
735 }
731 736
732 // if attachment we set it's asset id so object updates 737 // if attachment we set it's asset id so object updates
733 // can reflect that, if not, we set it's position in world. 738 // can reflect that, if not, we set it's position in world.
diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
index a675928..788f42b 100644
--- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
@@ -127,11 +127,20 @@ namespace OpenSim.Region.Framework.Interfaces
127 void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient); 127 void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient);
128 128
129 /// <summary> 129 /// <summary>
130 /// Update the position of an attachment 130 /// Update the user inventory with a changed attachment
131 /// </summary> 131 /// </summary>
132 /// <param name="client"></param> 132 /// <param name="remoteClient">
133 /// <param name="sog"></param> 133 /// A <see cref="IClientAPI"/>
134 /// <param name="pos"></param> 134 /// </param>
135 void UpdateAttachmentPosition(IClientAPI client, SceneObjectGroup sog, Vector3 pos); 135 /// <param name="grp">
136 /// A <see cref="SceneObjectGroup"/>
137 /// </param>
138 /// <param name="itemID">
139 /// A <see cref="UUID"/>
140 /// </param>
141 /// <param name="agentID">
142 /// A <see cref="UUID"/>
143 /// </param>
144 void UpdateKnownItem(IClientAPI remoteClient, SceneObjectGroup grp, UUID itemID, UUID agentID);
136 } 145 }
137} 146}
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
index 59ce090..ed40da9 100644
--- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
@@ -185,6 +185,7 @@ namespace OpenSim.Region.Framework.Interfaces
185 /// <returns>false if the item did not exist, true if the update occurred successfully</returns> 185 /// <returns>false if the item did not exist, true if the update occurred successfully</returns>
186 bool UpdateInventoryItem(TaskInventoryItem item); 186 bool UpdateInventoryItem(TaskInventoryItem item);
187 bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents); 187 bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents);
188 bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents, bool considerChanged);
188 189
189 /// <summary> 190 /// <summary>
190 /// Remove an item from this entity's inventory 191 /// Remove an item from this entity's inventory
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index dd06be2..c4639c3 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -3255,7 +3255,6 @@ namespace OpenSim.Region.Framework.Scenes
3255 List<ulong> regions = new List<ulong>(avatar.KnownChildRegionHandles); 3255 List<ulong> regions = new List<ulong>(avatar.KnownChildRegionHandles);
3256 regions.Remove(RegionInfo.RegionHandle); 3256 regions.Remove(RegionInfo.RegionHandle);
3257 m_sceneGridService.SendCloseChildAgentConnections(agentID, regions); 3257 m_sceneGridService.SendCloseChildAgentConnections(agentID, regions);
3258
3259 } 3258 }
3260 m_log.Debug("[Scene] Beginning ClientClosed"); 3259 m_log.Debug("[Scene] Beginning ClientClosed");
3261 m_eventManager.TriggerClientClosed(agentID, this); 3260 m_eventManager.TriggerClientClosed(agentID, this);
@@ -3271,6 +3270,9 @@ namespace OpenSim.Region.Framework.Scenes
3271 m_eventManager.TriggerOnRemovePresence(agentID); 3270 m_eventManager.TriggerOnRemovePresence(agentID);
3272 m_log.Debug("[Scene] Finished OnRemovePresence"); 3271 m_log.Debug("[Scene] Finished OnRemovePresence");
3273 3272
3273 if (avatar != null && (!avatar.IsChildAgent))
3274 avatar.SaveChangedAttachments();
3275
3274 ForEachClient( 3276 ForEachClient(
3275 delegate(IClientAPI client) 3277 delegate(IClientAPI client)
3276 { 3278 {
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index a462133..b2d9358 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -281,7 +281,7 @@ namespace OpenSim.Region.Framework.Scenes
281 } 281 }
282 } 282 }
283 283
284 if (!alreadyPersisted) 284 if (attachToBackup && (!alreadyPersisted))
285 { 285 {
286 sceneObject.ForceInventoryPersistence(); 286 sceneObject.ForceInventoryPersistence();
287 sceneObject.HasGroupChanged = true; 287 sceneObject.HasGroupChanged = true;
@@ -304,8 +304,10 @@ namespace OpenSim.Region.Framework.Scenes
304 /// </returns> 304 /// </returns>
305 protected internal bool AddNewSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates) 305 protected internal bool AddNewSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates)
306 { 306 {
307 // Ensure that we persist this new scene object 307 // Ensure that we persist this new scene object if it's not an
308 sceneObject.HasGroupChanged = true; 308 // attachment
309 if (attachToBackup)
310 sceneObject.HasGroupChanged = true;
309 311
310 return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates); 312 return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates);
311 } 313 }
@@ -1342,8 +1344,13 @@ namespace OpenSim.Region.Framework.Scenes
1342 { 1344 {
1343 if (group.IsAttachment || (group.RootPart.Shape.PCode == 9 && group.RootPart.Shape.State != 0)) 1345 if (group.IsAttachment || (group.RootPart.Shape.PCode == 9 && group.RootPart.Shape.State != 0))
1344 { 1346 {
1345 if (m_parentScene.AttachmentsModule != null) 1347 // Set the new attachment point data in the object
1346 m_parentScene.AttachmentsModule.UpdateAttachmentPosition(remoteClient, group, pos); 1348 byte attachmentPoint = group.GetAttachmentPoint();
1349 group.UpdateGroupPosition(pos);
1350 group.RootPart.IsAttachment = false;
1351 group.AbsolutePosition = group.RootPart.AttachedPos;
1352 group.SetAttachmentPoint(attachmentPoint);
1353 group.HasGroupChanged = true;
1347 } 1354 }
1348 else 1355 else
1349 { 1356 {
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 79f7162..ee08072 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -586,13 +586,15 @@ namespace OpenSim.Region.Framework.Scenes
586 XmlNodeList nodes = doc.GetElementsByTagName("SavedScriptState"); 586 XmlNodeList nodes = doc.GetElementsByTagName("SavedScriptState");
587 if (nodes.Count > 0) 587 if (nodes.Count > 0)
588 { 588 {
589 m_savedScriptState = new Dictionary<UUID, string>(); 589 if (m_savedScriptState == null)
590 m_savedScriptState = new Dictionary<UUID, string>();
590 foreach (XmlNode node in nodes) 591 foreach (XmlNode node in nodes)
591 { 592 {
592 if (node.Attributes["UUID"] != null) 593 if (node.Attributes["UUID"] != null)
593 { 594 {
594 UUID itemid = new UUID(node.Attributes["UUID"].Value); 595 UUID itemid = new UUID(node.Attributes["UUID"].Value);
595 m_savedScriptState.Add(itemid, node.InnerXml); 596 if (itemid != UUID.Zero)
597 m_savedScriptState[itemid] = node.InnerXml;
596 } 598 }
597 } 599 }
598 } 600 }
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index be3e87f..b615d42 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -4822,7 +4822,7 @@ namespace OpenSim.Region.Framework.Scenes
4822 { 4822 {
4823 TaskInventoryItem item = Inventory.GetInventoryItem(itemID); 4823 TaskInventoryItem item = Inventory.GetInventoryItem(itemID);
4824 item.OwnerChanged = false; 4824 item.OwnerChanged = false;
4825 Inventory.UpdateInventoryItem(item); 4825 Inventory.UpdateInventoryItem(item, false, false);
4826 } 4826 }
4827 } 4827 }
4828 } 4828 }
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 522f75e..8fcfcc5 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -131,12 +131,6 @@ namespace OpenSim.Region.Framework.Scenes
131 return; 131 return;
132 } 132 }
133 133
134 HasInventoryChanged = true;
135 if (m_part.ParentGroup != null)
136 {
137 m_part.ParentGroup.HasGroupChanged = true;
138 }
139
140 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); 134 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values);
141 Items.Clear(); 135 Items.Clear();
142 136
@@ -158,12 +152,6 @@ namespace OpenSim.Region.Framework.Scenes
158 return; 152 return;
159 } 153 }
160 154
161 HasInventoryChanged = true;
162 if (m_part.ParentGroup != null)
163 {
164 m_part.ParentGroup.HasGroupChanged = true;
165 }
166
167 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); 155 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values);
168 Items.Clear(); 156 Items.Clear();
169 157
@@ -216,8 +204,15 @@ namespace OpenSim.Region.Framework.Scenes
216 return; 204 return;
217 } 205 }
218 206
219 HasInventoryChanged = true; 207 // Don't let this set the HasGroupChanged flag for attachments
220 m_part.ParentGroup.HasGroupChanged = true; 208 // as this happens during rez and we don't want a new asset
209 // for each attachment each time
210 if (!m_part.ParentGroup.RootPart.IsAttachment)
211 {
212 HasInventoryChanged = true;
213 m_part.ParentGroup.HasGroupChanged = true;
214 }
215
221 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); 216 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values);
222 foreach (TaskInventoryItem item in items) 217 foreach (TaskInventoryItem item in items)
223 { 218 {
@@ -824,11 +819,16 @@ namespace OpenSim.Region.Framework.Scenes
824 /// <returns>false if the item did not exist, true if the update occurred successfully</returns> 819 /// <returns>false if the item did not exist, true if the update occurred successfully</returns>
825 public bool UpdateInventoryItem(TaskInventoryItem item) 820 public bool UpdateInventoryItem(TaskInventoryItem item)
826 { 821 {
827 return UpdateInventoryItem(item, true); 822 return UpdateInventoryItem(item, true, true);
828 } 823 }
829 824
830 public bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents) 825 public bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents)
831 { 826 {
827 return UpdateInventoryItem(item, fireScriptEvents, true);
828 }
829
830 public bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents, bool considerChanged)
831 {
832 m_items.LockItemsForWrite(true); 832 m_items.LockItemsForWrite(true);
833 833
834 if (m_items.ContainsKey(item.ItemID)) 834 if (m_items.ContainsKey(item.ItemID))
@@ -849,8 +849,11 @@ namespace OpenSim.Region.Framework.Scenes
849 m_inventorySerial++; 849 m_inventorySerial++;
850 if (fireScriptEvents) 850 if (fireScriptEvents)
851 m_part.TriggerScriptChangedEvent(Changed.INVENTORY); 851 m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
852 HasInventoryChanged = true; 852 if (considerChanged)
853 m_part.ParentGroup.HasGroupChanged = true; 853 {
854 HasInventoryChanged = true;
855 m_part.ParentGroup.HasGroupChanged = true;
856 }
854 m_items.LockItemsForWrite(false); 857 m_items.LockItemsForWrite(false);
855 return true; 858 return true;
856 } 859 }
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index fd23ed2..b340bda 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -4354,6 +4354,24 @@ if (m_animator.m_jumping) force.Z = m_animator.m_jumpVelocity; // add for ju
4354 return(new Vector3(x,y,z)); 4354 return(new Vector3(x,y,z));
4355 } 4355 }
4356 4356
4357 public void SaveChangedAttachments()
4358 {
4359 // Need to copy this list because DetachToInventoryPrep mods it
4360 List<SceneObjectGroup> attachments = new List<SceneObjectGroup>(Attachments.ToArray());
4357 4361
4362 IAttachmentsModule attachmentsModule = m_scene.AttachmentsModule;
4363 if (attachmentsModule != null)
4364 {
4365 foreach (SceneObjectGroup grp in attachments)
4366 {
4367 if (grp.HasGroupChanged) // Resizer scripts?
4368 {
4369 grp.DetachToInventoryPrep();
4370 attachmentsModule.UpdateKnownItem(ControllingClient,
4371 grp, grp.GetFromItemID(), grp.OwnerID);
4372 }
4373 }
4374 }
4375 }
4358 } 4376 }
4359} 4377}
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
index a398dfd..dfc69d8 100644
--- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
+++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
@@ -735,7 +735,10 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
735 735
736 private static void ProcessTIOldItemID(TaskInventoryItem item, XmlTextReader reader) 736 private static void ProcessTIOldItemID(TaskInventoryItem item, XmlTextReader reader)
737 { 737 {
738 item.OldItemID = ReadUUID(reader, "OldItemID"); 738 ReadUUID(reader, "OldItemID");
739 // On deserialization, the old item id MUST BE UUID.Zero!!!!!
740 // Setting this to the saved value will BREAK script persistence!
741 // item.OldItemID = ReadUUID(reader, "OldItemID");
739 } 742 }
740 743
741 private static void ProcessTILastOwnerID(TaskInventoryItem item, XmlTextReader reader) 744 private static void ProcessTILastOwnerID(TaskInventoryItem item, XmlTextReader reader)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 8f05359..c602307 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -3213,17 +3213,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3213 3213
3214 if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) 3214 if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
3215 { 3215 {
3216 SceneObjectGroup grp = m_host.ParentGroup;
3217 UUID itemID = grp.GetFromItemID();
3218
3219 ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
3220
3221 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; 3216 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3222 if (attachmentsModule != null) 3217 if (attachmentsModule != null)
3223 attachmentsModule.ShowDetachInUserInventory(itemID, presence.ControllingClient); 3218 Util.FireAndForget(DetachWrapper, m_host);
3224 } 3219 }
3225 } 3220 }
3226 3221
3222 private void DetachWrapper(object o)
3223 {
3224 SceneObjectPart host = (SceneObjectPart)o;
3225
3226 SceneObjectGroup grp = host.ParentGroup;
3227 UUID itemID = grp.GetFromItemID();
3228 ScenePresence presence = World.GetScenePresence(host.OwnerID);
3229
3230 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3231 if (attachmentsModule != null)
3232 attachmentsModule.ShowDetachInUserInventory(itemID, presence.ControllingClient);
3233 }
3234
3227 public void llTakeCamera(string avatar) 3235 public void llTakeCamera(string avatar)
3228 { 3236 {
3229 m_host.AddScriptLPS(1); 3237 m_host.AddScriptLPS(1);
diff --git a/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs b/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs
index 33e5aa6..04ff83f 100644
--- a/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs
+++ b/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs
@@ -162,6 +162,11 @@ namespace OpenSim.Server.Handlers.Simulation
162 return; 162 return;
163 } 163 }
164 164
165 if (args.ContainsKey("modified"))
166 sog.HasGroupChanged = args["modified"].AsBoolean();
167 else
168 sog.HasGroupChanged = false;
169
165 if ((args["state"] != null) && s.AllowScriptCrossings) 170 if ((args["state"] != null) && s.AllowScriptCrossings)
166 { 171 {
167 stateXmlStr = args["state"].AsString(); 172 stateXmlStr = args["state"].AsString();
@@ -243,4 +248,4 @@ namespace OpenSim.Server.Handlers.Simulation
243 } 248 }
244 249
245 } 250 }
246} \ No newline at end of file 251}
diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
index 0626ebe..1730b95 100644
--- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
@@ -565,6 +565,7 @@ namespace OpenSim.Services.Connectors.Simulation
565 OSDMap args = new OSDMap(2); 565 OSDMap args = new OSDMap(2);
566 args["sog"] = OSD.FromString(sog.ToXml2()); 566 args["sog"] = OSD.FromString(sog.ToXml2());
567 args["extra"] = OSD.FromString(sog.ExtraToXmlString()); 567 args["extra"] = OSD.FromString(sog.ExtraToXmlString());
568 args["modified"] = OSD.FromBoolean(sog.HasGroupChanged);
568 string state = sog.GetStateSnapshot(); 569 string state = sog.GetStateSnapshot();
569 if (state.Length > 0) 570 if (state.Length > 0)
570 args["state"] = OSD.FromString(state); 571 args["state"] = OSD.FromString(state);