diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index 898c55eba4..5bb034c731 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs @@ -764,13 +764,17 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess // one full update during the attachment // process causes some clients to fail to display the // attachment properly. - m_Scene.AddNewSceneObject(group, true, false); + //m_Scene.AddNewSceneObject(group, true, false); + //DSG SYNC: tell RegionSyncModule not to call SyncNewObject + // yet, as not all properties have been set yet + bool triggerSyncNewObject = false; + m_Scene.AddNewSceneObjectByRez(group, true, false, triggerSyncNewObject); // if attachment we set it's asset id so object updates // can reflect that, if not, we set it's position in world. if (!attachment) { - group.ScheduleGroupForFullUpdate(new List(){SceneObjectPartSyncProperties.FullUpdate}); + group.ScheduleGroupForFullUpdate(null); group.AbsolutePosition = pos + veclist[i]; } @@ -857,7 +861,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess // Fire on_rez group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 1); rootPart.ParentGroup.ResumeScripts(); - rootPart.ScheduleFullUpdate(new List() { SceneObjectPartSyncProperties.FullUpdate }); + rootPart.ScheduleFullUpdate(null); } } @@ -876,6 +880,12 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess } } } + + //DSG SYNC: now all properties have been set, sending NewObject message, + if (m_Scene.RegionSyncModule != null) + { + m_Scene.RegionSyncModule.SyncNewObject(group); + } } return group; } diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs index ea1e683f50..dbb4eda73d 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs @@ -1977,9 +1977,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule { pos = part.PhysActor.Position; } - m_log.WarnFormat("-- part {0}, UUID {1}, LocalID {2}, GroupPos {3}, offset-position {4}, Position {5}, AggregateScriptEvents ={6}, Flags = {7}, LocalFlags {8}, Scale {9}", - part.Name, part.UUID, part.LocalId, part.GroupPosition, part.OffsetPosition, - pos, part.AggregateScriptEvents, part.Flags, part.LocalFlags, part.Scale); + m_log.WarnFormat("-- part {0}, UUID {1}, LocalID {2}, GroupPos {3}, offset-position {4}, Position {5}, AggregateScriptEvents ={6}, AttachedAvatar={7}, AttachmentPoint = {8}, AttachedPos={9}", + //Flags = {7}, LocalFlags {8}, Scale {9}", + part.Name, part.UUID, part.LocalId, part.GroupPosition, part.OffsetPosition, + pos, part.AggregateScriptEvents, + //part.Flags, part.LocalFlags, part.Scale); + part.AttachedAvatar, part.AttachmentPoint, part.AttachedPos + ); } } @@ -3870,11 +3874,12 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule Scene.ObjectUpdateResult updateResult = m_scene.AddNewSceneObjectBySync(group); //Now the PhysActor of each part in sog have been created, let's - //set the PhysActor's properties + //set the PhysActor's properties. Also trigger aggregateScriptEventSubscriptions + //since it may access PhysActor to link collision events foreach (SceneObjectPart part in group.Parts) { - //primsSyncInfo[part.UUID].SetSOPPhyscActorProperties(part); m_primSyncInfoManager.SetSOPPhyscActorProperties(part); + part.aggregateScriptEventSubscriptions(); } } diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 28c9abfdf4..5307d408e6 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -2237,7 +2237,10 @@ namespace OpenSim.Region.Framework.Scenes sourcePart.Inventory.RemoveInventoryItem(item.ItemID); } - AddNewSceneObject(group, true); + //AddNewSceneObject(group, true); + //DSG SYNC + bool triggerSyncNewObject = false; + AddNewSceneObjectByRez(group, true, true, triggerSyncNewObject); group.AbsolutePosition = pos; group.Velocity = vel; @@ -2256,8 +2259,14 @@ namespace OpenSim.Region.Framework.Scenes group.CreateScriptInstances(param, true, DefaultScriptEngine, 3); //group.ScheduleGroupForFullUpdate(); - group.ScheduleGroupForFullUpdate(new List(){SceneObjectPartSyncProperties.FullUpdate}); //new object, all properties have new value - + group.ScheduleGroupForFullUpdate(null); //new object, all properties have new value + + //DSG SYNC: now all properties have been set, sending NewObject message, + if (RegionSyncModule != null) + { + RegionSyncModule.SyncNewObject(group); + } + return group; } diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 5fc58222a7..374b298bc2 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -882,6 +882,29 @@ namespace OpenSim.Region.Framework.Scenes return false; } + /// + /// Add a newly created object to the scene + /// + /// + /// + /// If true, the object is made persistent into the scene. + /// If false, the object will not persist over server restarts + /// + /// + /// If true, updates for the new scene object are sent to all viewers in range. + /// If false, it is left to the caller to schedule the update + /// + public bool AddNewSceneObjectByRez(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates, bool triggerSyncNewObject) + { + if (m_sceneGraph.AddNewSceneObjectByRez(sceneObject, attachToBackup, sendClientUpdates, triggerSyncNewObject)) + { + EventManager.TriggerObjectAddedToScene(sceneObject); + return true; + } + + return false; + } + #endregion //DSG SYNC public ICapabilitiesModule CapsModule diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 8d1ae3a36c..0a4c1900d2 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -288,7 +288,7 @@ namespace OpenSim.Region.Framework.Scenes sceneObject.HasGroupChanged = true; } - return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates, false); + return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates, true); } /// @@ -310,7 +310,8 @@ namespace OpenSim.Region.Framework.Scenes if (attachToBackup) sceneObject.HasGroupChanged = true; - return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates, false); + //DSG SYNC: passing true to trigger SyncNewObject + return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates, true); } /// @@ -368,7 +369,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// true if the object was added, false if an object with the same uuid was already in the scene /// - protected bool AddSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates, bool addedByDelink) + protected bool AddSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates, bool triggerSyncNewObject) { if (sceneObject == null || sceneObject.RootPart == null || sceneObject.RootPart.UUID == UUID.Zero) return false; @@ -434,7 +435,7 @@ namespace OpenSim.Region.Framework.Scenes sceneObject.ScheduleGroupForFullUpdate(null); //DSG SYNC: sending NewObject event, and sending it before calling ScheduleGroupForFullUpdate - if (m_parentScene.RegionSyncModule != null && !addedByDelink) + if (m_parentScene.RegionSyncModule != null && triggerSyncNewObject) { m_parentScene.RegionSyncModule.SyncNewObject(sceneObject); } @@ -2569,8 +2570,18 @@ namespace OpenSim.Region.Framework.Scenes if (attachToBackup) sceneObject.HasGroupChanged = true; - bool addedByDelink = true; - return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates, addedByDelink); + bool triggerSyncNewObject = false; + return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates, triggerSyncNewObject); + } + + protected internal bool AddNewSceneObjectByRez(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates, bool triggerSyncNewObject) + { + // Ensure that we persist this new scene object if it's not an + // attachment + if (attachToBackup) + sceneObject.HasGroupChanged = true; + + return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates, triggerSyncNewObject); } #endregion //DSG SYNC