From 94aaf67dfaafbcbd4d871f674c465a34c1c1f332 Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Sun, 21 Sep 2008 21:47:00 +0000 Subject: Change the scirpt engine loading mechanism. Script engines are now ordinary region modules and are able to coexist in one instance. See http://opensimulator.org/wiki/ScriptEngines for details. There were changes to OpenSim.ini.example, please note DefaultScriptEngine. Also see the User docs and FAQ on the Wiki. Default is DotNetEngine. --- .../Common/ScriptEngineBase/EventManager.cs | 50 +++++++++++++--------- .../Common/ScriptEngineBase/EventQueueManager.cs | 5 +++ .../Common/ScriptEngineBase/ScriptEngine.cs | 24 ++++++++--- .../Common/ScriptEngineBase/ScriptManager.cs | 8 +++- .../ScriptEngine/Common/ScriptServerInterfaces.cs | 2 +- 5 files changed, 61 insertions(+), 28 deletions(-) (limited to 'OpenSim/Region/ScriptEngine/Common') diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventManager.cs index 5a9385f..4a4e808 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventManager.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventManager.cs @@ -65,31 +65,36 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase myScriptEngine = _ScriptEngine; ReadConfig(); - // Hook up to events from OpenSim - // We may not want to do it because someone is controlling us and will deliver events to us if (performHookUp) { - myScriptEngine.Log.Info("[" + myScriptEngine.ScriptEngineName + "]: Hooking up to server events"); - myScriptEngine.World.EventManager.OnObjectGrab += touch_start; - myScriptEngine.World.EventManager.OnObjectDeGrab += touch_end; myScriptEngine.World.EventManager.OnRezScript += OnRezScript; - myScriptEngine.World.EventManager.OnRemoveScript += OnRemoveScript; - myScriptEngine.World.EventManager.OnScriptChangedEvent += changed; - myScriptEngine.World.EventManager.OnScriptAtTargetEvent += at_target; - myScriptEngine.World.EventManager.OnScriptNotAtTargetEvent += not_at_target; - myScriptEngine.World.EventManager.OnScriptControlEvent += control; - myScriptEngine.World.EventManager.OnScriptColliderStart += collision_start; - myScriptEngine.World.EventManager.OnScriptColliding += collision; - myScriptEngine.World.EventManager.OnScriptCollidingEnd += collision_end; - - // TODO: HOOK ALL EVENTS UP TO SERVER! - IMoneyModule money=myScriptEngine.World.RequestModuleInterface(); - if (money != null) - { - money.OnObjectPaid+=HandleObjectPaid; - } + } + } + + public void HookUpEvents() + { + // Hook up to events from OpenSim + // We may not want to do it because someone is controlling us and will deliver events to us + myScriptEngine.Log.Info("[" + myScriptEngine.ScriptEngineName + "]: Hooking up to server events"); + myScriptEngine.World.EventManager.OnObjectGrab += touch_start; + myScriptEngine.World.EventManager.OnObjectDeGrab += touch_end; + myScriptEngine.World.EventManager.OnRemoveScript += OnRemoveScript; + myScriptEngine.World.EventManager.OnScriptChangedEvent += changed; + myScriptEngine.World.EventManager.OnScriptAtTargetEvent += at_target; + myScriptEngine.World.EventManager.OnScriptNotAtTargetEvent += not_at_target; + myScriptEngine.World.EventManager.OnScriptControlEvent += control; + myScriptEngine.World.EventManager.OnScriptColliderStart += collision_start; + myScriptEngine.World.EventManager.OnScriptColliding += collision; + myScriptEngine.World.EventManager.OnScriptCollidingEnd += collision_end; + + // TODO: HOOK ALL EVENTS UP TO SERVER! + IMoneyModule money=myScriptEngine.World.RequestModuleInterface(); + if (money != null) + { + money.OnObjectPaid+=HandleObjectPaid; } + } public void ReadConfig() @@ -187,8 +192,11 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "touch_end", detstruct, new object[] { new LSL_Types.LSLInteger(1) }); } - public void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez) + public void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine) { + if (engine != "DotNetEngine") + return; + myScriptEngine.Log.Debug("OnRezScript localID: " + localID + " LLUID: " + itemID.ToString() + " Size: " + script.Length); myScriptEngine.m_ScriptManager.StartScript(localID, itemID, script, startParam, postOnRez); diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs index af7fca3..282559a 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs @@ -353,6 +353,11 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase /// Array of parameters to match event mask public void AddToScriptQueue(uint localID, UUID itemID, string FunctionName, Queue_llDetectParams_Struct qParams, params object[] param) { + List keylist = new List(m_ScriptEngine.m_ScriptManager.GetScriptKeys(localID)); + + if (!keylist.Contains(itemID)) // We don't manage that script + return; + lock (eventQueue) { if (eventQueue.Count >= EventExecutionMaxQueueSize) diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs index b0c6314..26e5ec2 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs @@ -56,6 +56,8 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase public IConfigSource ConfigSource; public IConfig ScriptConfigSource; public abstract string ScriptEngineName { get; } + private bool m_enabled = true; + private bool m_hookUpToServer = false; /// /// How many seconds between re-reading config-file. 0 = never. ScriptEngine will try to adjust to new config changes. @@ -91,6 +93,8 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase { World = Sceneworld; ConfigSource = config; + m_hookUpToServer = HookUpToServer; + m_log.Info("[" + ScriptEngineName + "]: ScriptEngine initializing"); // Make sure we have config @@ -98,13 +102,16 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase ConfigSource.AddConfig(ScriptEngineName); ScriptConfigSource = ConfigSource.Configs[ScriptEngineName]; + m_enabled = ScriptConfigSource.GetBoolean("Enabled", true); + if (!m_enabled) + return; + //m_log.Info("[" + ScriptEngineName + "]: InitializeEngine"); // Create all objects we'll be using m_EventQueueManager = new EventQueueManager(this); m_EventManager = new EventManager(this, HookUpToServer); // We need to start it - newScriptManager.Start(); m_ScriptManager = newScriptManager; m_AppDomainManager = new AppDomainManager(this); m_ASYNCLSLCommandManager = new AsyncCommandManager(this); @@ -118,6 +125,17 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase // Or can we assume we are loaded before anything else so we can use proper events? } + public void PostInitialise() + { + if (!m_enabled) + return; + + if (m_hookUpToServer) + m_EventManager.HookUpEvents(); + + m_ScriptManager.Start(); + } + public void Shutdown() { // We are shutting down @@ -155,10 +173,6 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase public abstract void Initialise(Scene scene, IConfigSource config); - public void PostInitialise() - { - } - public void Close() { } diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs index 60333b1..47cb2fd 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs @@ -64,6 +64,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase private static bool PrivateThread; private int LoadUnloadMaxQueueSize; private Object scriptLock = new Object(); + private bool m_started = false; // Load/Unload structure private struct LUStruct @@ -119,6 +120,8 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase public abstract void Initialize(); public void Start() { + m_started = true; + ReadConfig(); Initialize(); @@ -213,6 +216,9 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase public void DoScriptLoadUnload() { + if (!m_started) + return; + lock (LUQueue) { if (LUQueue.Count > 0) @@ -258,7 +264,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase { lock (LUQueue) { - if (LUQueue.Count >= LoadUnloadMaxQueueSize) + if ((LUQueue.Count >= LoadUnloadMaxQueueSize) && m_started) { m_scriptEngine.Log.Error("[" + m_scriptEngine.ScriptEngineName + "]: ERROR: Load/unload queue item count is at " + LUQueue.Count + ". Config variable \"LoadUnloadMaxQueueSize\" is set to " + LoadUnloadMaxQueueSize + ", so ignoring new script."); return; diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs b/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs index a6473ee..aa8dc61 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs @@ -39,7 +39,7 @@ namespace OpenSim.Region.ScriptEngine.Common public interface RemoteEvents { void touch_start(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient); - void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez); + void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine); void OnRemoveScript(uint localID, UUID itemID); void state_exit(uint localID); void touch(uint localID, uint originalID, UUID itemID); -- cgit v1.1