From f11107821e259d544dc42648f4cdba2b123cd71e Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Thu, 25 Sep 2008 17:26:32 +0000
Subject: Add an extension to allow registering multiple interfaces of a type
with Scene. Make the script engines check that the engine name in the
//Engine:language comment is a valid engine and treat it as a normal comment
if it's not. //DotNetEngine: needs to be written as
//ScriptEngine.DotNetEngine: now, since that is it's real internal name.
//XEngine: still works
---
.../Region/Environment/Scenes/Scene.Inventory.cs | 6 +
OpenSim/Region/Environment/Scenes/Scene.cs | 53 +++++++--
OpenSim/Region/Environment/Scenes/SceneBase.cs | 5 +
OpenSim/Region/Interfaces/IScriptModule.cs | 38 +++++++
.../Common/ScriptEngineBase/EventManager.cs | 15 ++-
.../ScriptEngineBase/EventQueueThreadClass.cs | 2 +-
.../Common/ScriptEngineBase/ScriptEngine.cs | 6 +-
.../Shared/Api/Implementation/LSL_Api_Base.cs | 2 +-
.../ScriptEngine/Shared/Instance/ScriptInstance.cs | 126 +++++++++++----------
OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 26 ++++-
10 files changed, 198 insertions(+), 81 deletions(-)
create mode 100644 OpenSim/Region/Interfaces/IScriptModule.cs
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
index 2a9be81..8fec13f 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
@@ -178,6 +178,7 @@ namespace OpenSim.Region.Environment.Scenes
remoteClient.SendAgentAlertMessage("Insufficient permissions to edit notecard", false);
return UUID.Zero;
}
+ remoteClient.SendAgentAlertMessage("Notecard saved", false);
}
else if ((InventoryType) item.InvType == InventoryType.LSL)
{
@@ -186,6 +187,7 @@ namespace OpenSim.Region.Environment.Scenes
remoteClient.SendAgentAlertMessage("Insufficient permissions to edit script", false);
return UUID.Zero;
}
+ remoteClient.SendAgentAlertMessage("Script saved", false);
}
AssetBase asset =
@@ -287,6 +289,10 @@ namespace OpenSim.Region.Environment.Scenes
//
part.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine);
}
+ else
+ {
+ remoteClient.SendAgentAlertMessage("Script saved", false);
+ }
}
///
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index 74502b8..e5f10b8 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -124,7 +124,7 @@ namespace OpenSim.Region.Environment.Scenes
{
get { return m_modules; }
}
- protected Dictionary ModuleInterfaces = new Dictionary();
+ protected Dictionary > ModuleInterfaces = new Dictionary >();
protected Dictionary ModuleAPIMethods = new Dictionary();
protected Dictionary m_moduleCommanders = new Dictionary();
@@ -3025,10 +3025,27 @@ namespace OpenSim.Region.Environment.Scenes
{
if (!ModuleInterfaces.ContainsKey(typeof(M)))
{
- ModuleInterfaces.Add(typeof(M), mod);
+ List
///
[Serializable]
- public abstract class ScriptEngine : IRegionModule, ScriptServerInterfaces.ScriptEngine, iScriptEngineFunctionModule, IEventReceiver
+ public abstract class ScriptEngine : IRegionModule, IScriptModule, ScriptServerInterfaces.ScriptEngine, iScriptEngineFunctionModule, IEventReceiver
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -126,8 +127,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
m_log.Info("[" + ScriptEngineName + "]: Reading configuration from config section \"" + ScriptEngineName + "\"");
ReadConfig();
- // Should we iterate the region for scripts that needs starting?
- // Or can we assume we are loaded before anything else so we can use proper events?
+ m_Scene.StackModuleInterface(this);
}
public void PostInitialise()
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api_Base.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api_Base.cs
index 320e878..396d924 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api_Base.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api_Base.cs
@@ -5114,7 +5114,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public LSL_Integer llScriptDanger(LSL_Vector pos)
{
m_host.AddScriptLPS(1);
- bool result = World.scriptDanger(m_host.LocalId, new Vector3((float)pos.x, (float)pos.y, (float)pos.z));
+ bool result = World.ScriptDanger(m_host.LocalId, new Vector3((float)pos.x, (float)pos.y, (float)pos.z));
if (result)
{
return 1;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index 28a3b11..6e6d169 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -567,86 +567,90 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
}
else
{
- SceneObjectPart part = m_Engine.World.GetSceneObjectPart(
- m_LocalID);
- // m_Engine.Log.DebugFormat("[Script] Delivered event {2} in state {3} to {0}.{1}",
- // m_PrimName, m_ScriptName, data.EventName, m_State);
-
- try
+ if (m_Engine.World.PipeEventsForScript(m_LocalID) ||
+ data.EventName == "control") // Don't freeze avies!
{
- m_CurrentEvent = data.EventName;
- m_EventStart = DateTime.Now;
- m_InEvent = true;
+ SceneObjectPart part = m_Engine.World.GetSceneObjectPart(
+ m_LocalID);
+ // m_Engine.Log.DebugFormat("[Script] Delivered event {2} in state {3} to {0}.{1}",
+ // m_PrimName, m_ScriptName, data.EventName, m_State);
- m_Script.ExecuteEvent(State, data.EventName, data.Params);
+ try
+ {
+ m_CurrentEvent = data.EventName;
+ m_EventStart = DateTime.Now;
+ m_InEvent = true;
- m_InEvent = false;
- m_CurrentEvent = String.Empty;
+ m_Script.ExecuteEvent(State, data.EventName, data.Params);
- if (m_SaveState)
- {
- // This will be the very first event we deliver
- // (state_entry) in defualt state
- //
+ m_InEvent = false;
+ m_CurrentEvent = String.Empty;
- SaveState(m_Assembly);
+ if (m_SaveState)
+ {
+ // This will be the very first event we deliver
+ // (state_entry) in defualt state
+ //
- m_SaveState = false;
- }
- }
- catch (Exception e)
- {
- m_InEvent = false;
- m_CurrentEvent = String.Empty;
+ SaveState(m_Assembly);
- if (!(e is TargetInvocationException) || (!(e.InnerException is EventAbortException) && (!(e.InnerException is SelfDeleteException))))
+ m_SaveState = false;
+ }
+ }
+ catch (Exception e)
{
- if (e is System.Threading.ThreadAbortException)
+ m_InEvent = false;
+ m_CurrentEvent = String.Empty;
+
+ if (!(e is TargetInvocationException) || (!(e.InnerException is EventAbortException) && (!(e.InnerException is SelfDeleteException))))
{
- lock (m_EventQueue)
+ if (e is System.Threading.ThreadAbortException)
{
- if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown))
+ lock (m_EventQueue)
{
- m_CurrentResult=m_Engine.QueueEventHandler(this);
+ if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown))
+ {
+ m_CurrentResult=m_Engine.QueueEventHandler(this);
+ }
+ else
+ {
+ m_CurrentResult = null;
+ }
}
- else
- {
- m_CurrentResult = null;
- }
- }
- m_DetectParams = null;
+ m_DetectParams = null;
- return 0;
- }
+ return 0;
+ }
- try
- {
- // DISPLAY ERROR INWORLD
- string text = "Runtime error:\n" + e.InnerException.ToString();
- if (text.Length > 1000)
- text = text.Substring(0, 1000);
- m_Engine.World.SimChat(Utils.StringToBytes(text),
- ChatTypeEnum.DebugChannel, 2147483647,
- part.AbsolutePosition,
- part.Name, part.UUID, false);
+ try
+ {
+ // DISPLAY ERROR INWORLD
+ string text = "Runtime error:\n" + e.InnerException.ToString();
+ if (text.Length > 1000)
+ text = text.Substring(0, 1000);
+ m_Engine.World.SimChat(Utils.StringToBytes(text),
+ ChatTypeEnum.DebugChannel, 2147483647,
+ part.AbsolutePosition,
+ part.Name, part.UUID, false);
+ }
+ catch (Exception e2) // LEGIT: User Scripting
+ {
+ m_Engine.Log.Error("[Script]: "+
+ "Error displaying error in-world: " +
+ e2.ToString());
+ m_Engine.Log.Error("[Script]: " +
+ "Errormessage: Error compiling script:\r\n" +
+ e.ToString());
+ }
}
- catch (Exception e2) // LEGIT: User Scripting
+ else if ((e is TargetInvocationException) && (e.InnerException is SelfDeleteException))
{
- m_Engine.Log.Error("[Script]: "+
- "Error displaying error in-world: " +
- e2.ToString());
- m_Engine.Log.Error("[Script]: " +
- "Errormessage: Error compiling script:\r\n" +
- e.ToString());
+ m_InSelfDelete = true;
+ if (part != null && part.ParentGroup != null)
+ m_Engine.World.DeleteSceneObject(part.ParentGroup);
}
}
- else if ((e is TargetInvocationException) && (e.InnerException is SelfDeleteException))
- {
- m_InSelfDelete = true;
- if (part != null && part.ParentGroup != null)
- m_Engine.World.DeleteSceneObject(part.ParentGroup);
- }
}
}
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 701ad60..f11ccc4 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -39,6 +39,7 @@ using log4net;
using Nini.Config;
using Amib.Threading;
using OpenSim.Framework;
+using OpenSim.Region.Interfaces;
using OpenSim.Region.Environment;
using OpenSim.Region.Environment.Scenes;
using OpenSim.Region.Environment.Interfaces;
@@ -50,7 +51,7 @@ using OpenSim.Region.ScriptEngine.Interfaces;
namespace OpenSim.Region.ScriptEngine.XEngine
{
- public class XEngine : IRegionModule, IScriptEngine
+ public class XEngine : IRegionModule, IScriptModule, IScriptEngine
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -213,6 +214,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
//
SetupEngine(m_MinThreads, m_MaxThreads, m_IdleTimeout, m_Prio,
m_MaxScriptQueue, m_StackSize);
+
+ m_Scene.StackModuleInterface(this);
}
public void PostInitialise()
@@ -331,6 +334,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
public void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine)
{
+ List engines = new List(m_Scene.RequestModuleInterfaces());
+
+ List names = new List();
+ foreach (IScriptModule m in engines)
+ names.Add(m.ScriptEngineName);
+
int lineEnd = script.IndexOf('\n');
if (lineEnd != 1)
@@ -340,8 +349,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine
int colon = firstline.IndexOf(':');
if (firstline.Length > 2 && firstline.Substring(0, 2) == "//" && colon != -1)
{
- engine = firstline.Substring(2, colon-2);
- script = "//" + script.Substring(script.IndexOf(':')+1);
+ string engineName = firstline.Substring(2, colon-2);
+
+ if (names.Contains(engineName))
+ {
+ engine = engineName;
+ script = "//" + script.Substring(script.IndexOf(':')+1);
+ }
}
}
@@ -454,14 +468,20 @@ namespace OpenSim.Region.ScriptEngine.XEngine
// m_log.DebugFormat("[XEngine] Compiling script {0} ({1})",
// item.Name, itemID.ToString());
+ ScenePresence presence = m_Scene.GetScenePresence(item.OwnerID);
+
string assembly = "";
try
{
assembly = m_Compiler.PerformScriptCompile(script,
assetID.ToString());
+ if (presence != null)
+ presence.ControllingClient.SendAgentAlertMessage("Compile successful", false);
}
catch (Exception e)
{
+ if (presence != null)
+ presence.ControllingClient.SendAgentAlertMessage("Script saved with errors, check debug window!", false);
try
{
// DISPLAY ERROR INWORLD
--
cgit v1.1