diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs index 7d01de15bc..2f67eec957 100755 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs @@ -556,6 +556,12 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //Shutdown all sync connectors StopAllSyncConnectors(); } + + //Trigger SyncStop event, ActorSyncModules can then take actor specific action if needed. + //For instance, script engine will save script states + //save script state and stop script instances + m_scene.EventManager.TriggerOnSymmetricSyncStop(); + } private void SyncStatus(Object[] args) @@ -854,6 +860,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule /// private void RegionSyncModule_OnObjectBeingRemovedFromScene(SceneObjectGroup sog) { + //m_log.DebugFormat("RegionSyncModule_OnObjectBeingRemovedFromScene called at time {0}:{1}:{2}", DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Millisecond); + //Only send the message out if this is a relay node for sync messages, or this actor caused deleting the object if (m_isSyncRelay || CheckObjectForSendingUpdate(sog)) { diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/ScriptEngineSyncModule.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/ScriptEngineSyncModule.cs index c1cb8025c7..6c24792216 100755 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/ScriptEngineSyncModule.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/ScriptEngineSyncModule.cs @@ -84,6 +84,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //Register for Scene/SceneGraph events m_scene.SceneGraph.OnObjectCreate += new ObjectCreateDelegate(ScriptEngine_OnObjectCreate); + m_scene.EventManager.OnSymmetricSyncStop += ScriptEngine_OnSymmetricSyncStop; } //Called after AddRegion() has been called for all region modules of the scene. @@ -167,6 +168,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule } } + public void ScriptEngine_OnSymmetricSyncStop() + { + //Inform script engine to save script states and stop scripts + m_scene.EventManager.TriggerScriptEngineSyncStop(); + //remove all objects + m_scene.DeleteAllSceneObjects(); + } + #endregion //ScriptEngineSyncModule } diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index db1e27f336..7ba4f39d97 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -2183,7 +2183,7 @@ namespace OpenSim.Region.Framework.Scenes catch (Exception e) { m_log.ErrorFormat( - "[EVENT MANAGER]: Delegate for TriggerOnSceneObjectLoaded failed - continuing. {0} {1}", + "[EVENT MANAGER]: Delegate for TriggerScriptEngineSyncStop failed - continuing. {0} {1}", e.Message, e.StackTrace); } } @@ -2267,6 +2267,30 @@ namespace OpenSim.Region.Framework.Scenes } } } + + public delegate void SymmetricSyncStop(); + public event SymmetricSyncStop OnSymmetricSyncStop; + public void TriggerOnSymmetricSyncStop() + { + SymmetricSyncStop handlerSymmetricSyncStop = OnSymmetricSyncStop; + if (handlerSymmetricSyncStop != null) + { + foreach (SymmetricSyncStop d in handlerSymmetricSyncStop.GetInvocationList()) + { + try + { + d(); + } + catch (Exception e) + { + m_log.ErrorFormat( + "[EVENT MANAGER]: Delegate for TriggerOnSymmetricSyncStop failed - continuing. {0} {1}", + e.Message, e.StackTrace); + } + } + } + } + //end of SYMMETRIC SYNC } }