diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs
index edeab2e66a..2ef9da3b7e 100755
--- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs
+++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs
@@ -841,8 +841,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
}
//EVENTS PROCESSING
case SymmetricSyncMessage.MsgType.UpdateScript:
+ case SymmetricSyncMessage.MsgType.ScriptReset:
{
- HandleRemoteEvent_OnUpdateScript(msg);
+ HandleRemoteEvent(msg);
return;
}
default:
@@ -975,27 +976,24 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
}
///
- /// Handler for SymmetricSyncMessage.MsgType.OnUpdateScript
+ /// The common actions for handling remote events (event initiated at other actors and propogated here)
///
///
- private void HandleRemoteEvent_OnUpdateScript(SymmetricSyncMessage msg)
+ private void HandleRemoteEvent(SymmetricSyncMessage msg)
{
- m_log.Debug(LogHeader + ", " + m_actorID + ": received OnUpdateScript");
-
OSDMap data = DeserializeMessage(msg);
-
- //get the event parameters, trigger the event in the local scene
string init_actorID = data["actorID"].AsString();
- UUID agentID = data["agentID"].AsUUID();
- UUID itemID = data["itemID"].AsUUID();
- UUID primID = data["primID"].AsUUID();
- bool isRunning = data["running"].AsBoolean();
- UUID assetID = data["assetID"].AsUUID();
- m_scene.EventManager.TriggerUpdateScriptLocally(agentID, itemID, primID, isRunning, assetID);
+ ulong evSeqNum = data["seqNum"].AsULong();
- //trigger the OnUpdateScriptBySync event, so that the handler of the event knows it is event initiated remotely
- //m_scene.EventManager.TriggerOnUpdateScriptBySync(agentID, itemID, primID, isRunning, assetID);
-
+ switch (msg.Type)
+ {
+ case SymmetricSyncMessage.MsgType.UpdateScript:
+ HandleRemoteEvent_OnUpdateScript(init_actorID, evSeqNum, data);
+ break;
+ case SymmetricSyncMessage.MsgType.ScriptReset:
+ HandleRemoteEvent_OnScriptReset(init_actorID, evSeqNum, data);
+ break;
+ }
//if this is a relay node, forwards the event
if (m_isSyncRelay)
@@ -1004,6 +1002,45 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
}
}
+ ///
+ /// Special actions for remote event UpdateScript
+ ///
+ /// OSDMap data of event args
+ private void HandleRemoteEvent_OnUpdateScript(string actorID, ulong evSeqNum, OSDMap data)
+ {
+ m_log.Debug(LogHeader + ", " + m_actorID + ": received UpdateScript");
+
+ UUID agentID = data["agentID"].AsUUID();
+ UUID itemID = data["itemID"].AsUUID();
+ UUID primID = data["primID"].AsUUID();
+ bool isRunning = data["running"].AsBoolean();
+ UUID assetID = data["assetID"].AsUUID();
+
+ //trigger the event in the local scene
+ m_scene.EventManager.TriggerUpdateScriptLocally(agentID, itemID, primID, isRunning, assetID);
+ }
+
+ ///
+ /// Special actions for remote event UpdateScript
+ ///
+ /// OSDMap data of event args
+ private void HandleRemoteEvent_OnScriptReset(string actorID, ulong evSeqNum, OSDMap data)
+ {
+ m_log.Debug(LogHeader + ", " + m_actorID + ": received ScriptReset");
+
+ UUID agentID = data["agentID"].AsUUID();
+ UUID itemID = data["itemID"].AsUUID();
+ UUID primID = data["primID"].AsUUID();
+
+ SceneObjectPart part = m_scene.GetSceneObjectPart(primID);
+ if (part == null || part.ParentGroup.IsDeleted)
+ {
+ m_log.Warn(LogHeader + " part " + primID + " not exist, all is deleted");
+ return;
+ }
+ m_scene.EventManager.TriggerScriptResetLocally(part.LocalId, itemID);
+ }
+
///
/// Send a sync message to remove the given objects in all connected actors, if this is a relay node.
@@ -1042,6 +1079,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
m_log.Debug(LogHeader + " PublishSceneEvent UpdateScript");
OnLocalUpdateScript((UUID)evArgs[0], (UUID)evArgs[1], (UUID)evArgs[2], (bool)evArgs[3], (UUID)evArgs[4]);
return;
+ case EventManager.EventNames.ScriptReset:
+ if (evArgs.Length < 2)
+ {
+ m_log.Error(LogHeader + " not enough event args for ScriptReset");
+ return;
+ }
+ OnLocalScriptReset((uint)evArgs[0], (UUID)evArgs[1]);
+ return;
default:
return;
}
@@ -1074,6 +1119,27 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
SendSceneEventToRelevantSyncConnectors(m_actorID, rsm);
}
+ private void OnLocalScriptReset(uint localID, UUID itemID)
+ {
+ //we will use the prim's UUID as the identifier, not the localID, to publish the event for the prim
+ SceneObjectPart part = m_scene.GetSceneObjectPart(localID);
+
+ OSDMap data = new OSDMap();
+ data["primID"] = OSD.FromUUID(part.UUID);
+ data["itemID"] = OSD.FromUUID(itemID);
+
+ SendSceneEvent(SymmetricSyncMessage.MsgType.ScriptReset, data);
+ }
+
+ private void SendSceneEvent(SymmetricSyncMessage.MsgType msgType, OSDMap data)
+ {
+ data["actorID"] = OSD.FromString(m_actorID);
+ data["seqNum"] = OSD.FromULong(GetNextEventSeq());
+ SymmetricSyncMessage rsm = new SymmetricSyncMessage(msgType, OSDParser.SerializeJsonString(data));
+
+ //send to actors who are interested in the event
+ SendSceneEventToRelevantSyncConnectors(m_actorID, rsm);
+ }
/*
private void PublishSceneEvent(OSDMap data)
diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/SymmetricSyncMessage.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/SymmetricSyncMessage.cs
index d8d925147a..0b47f16234 100755
--- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/SymmetricSyncMessage.cs
+++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/SymmetricSyncMessage.cs
@@ -35,6 +35,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
ActorID,
//events
UpdateScript,
+ ScriptReset,
}
#endregion
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index c178f563c3..f26db672cc 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -51,12 +51,15 @@ namespace OpenSim.Region.Framework.Scenes
public enum EventNames
{
UpdateScript,
+ ScriptReset,
}
public EventManager(Scene scene)
{
m_scene = scene;
}
+
+#region UpdateScript
public override void TriggerUpdateScript(UUID clientId, UUID itemId, UUID primId, bool isScriptRunning, UUID newAssetID)
{
//publish the event to other actors who are intersted in it
@@ -74,11 +77,29 @@ namespace OpenSim.Region.Framework.Scenes
//trigger event locally, as the legacy code does
TriggerUpdateScriptLocally(clientId, itemId, primId, isScriptRunning, newAssetID);
}
-
public void TriggerUpdateScriptLocally(UUID clientId, UUID itemId, UUID primId, bool isScriptRunning, UUID newAssetID)
{
base.TriggerUpdateScript(clientId, itemId, primId, isScriptRunning, newAssetID);
}
+#endregion //UpdateScript
+
+ #region ScriptReset
+ public virtual void TriggerScriptReset(uint localID, UUID itemID)
+ {
+ if (m_scene.RegionSyncModule != null)
+ {
+ Object[] eventArgs = new Object[2];
+ eventArgs[0] = (Object)localID;
+ eventArgs[1] = (Object)itemID;
+ m_scene.RegionSyncModule.PublishSceneEvent(EventNames.ScriptReset, eventArgs);
+ }
+ }
+ public virtual void TriggerScriptResetLocally(uint localID, UUID itemID)
+ {
+ base.TriggerScriptReset(localID, itemID);
+ }
+
+ #endregion //UpdateScript
}
///
@@ -948,7 +969,8 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- public void TriggerScriptReset(uint localID, UUID itemID)
+ //public void TriggerScriptReset(uint localID, UUID itemID)
+ public virtual void TriggerScriptReset(uint localID, UUID itemID)
{
ScriptResetDelegate handlerScriptReset = OnScriptReset;
if (handlerScriptReset != null)