From 1743fe5d62422f959f1f865d1def2ad929375460 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 25 Oct 2012 00:29:50 +0100
Subject: Move npc creation tests involving appearance from
OSSL_ApiAppearanceTest to OSSL_ApiNpcTests
This is a more intuitive location.
---
.../Shared/Tests/OSSL_ApiAppearanceTest.cs | 70 ----------------------
.../ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs | 69 +++++++++++++++++++++
2 files changed, 69 insertions(+), 70 deletions(-)
(limited to 'OpenSim/Region/ScriptEngine/Shared')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs
index c8718d9..c401794 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs
@@ -75,76 +75,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
m_engine.AddRegion(m_scene);
}
- ///
- /// Test creation of an NPC where the appearance data comes from a notecard
- ///
- [Test]
- public void TestOsNpcCreateUsingAppearanceFromNotecard()
- {
- TestHelpers.InMethod();
-// log4net.Config.XmlConfigurator.Configure();
-
- // Store an avatar with a different height from default in a notecard.
- UUID userId = TestHelpers.ParseTail(0x1);
- float newHeight = 1.9f;
-
- ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId);
- sp.Appearance.AvatarHeight = newHeight;
- SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, 0x10);
- SceneObjectPart part = so.RootPart;
- m_scene.AddSceneObject(so);
-
- OSSL_Api osslApi = new OSSL_Api();
- osslApi.Initialize(m_engine, part, null);
-
- string notecardName = "appearanceNc";
- osslApi.osOwnerSaveAppearance(notecardName);
-
- // Try creating a bot using the appearance in the notecard.
- string npcRaw = osslApi.osNpcCreate("Jane", "Doe", new LSL_Types.Vector3(128, 128, 128), notecardName);
- Assert.That(npcRaw, Is.Not.Null);
-
- UUID npcId = new UUID(npcRaw);
- ScenePresence npc = m_scene.GetScenePresence(npcId);
- Assert.That(npc, Is.Not.Null);
- Assert.That(npc.Appearance.AvatarHeight, Is.EqualTo(newHeight));
- }
-
- ///
- /// Test creation of an NPC where the appearance data comes from an avatar already in the region.
- ///
- [Test]
- public void TestOsNpcCreateUsingAppearanceFromAvatar()
- {
- TestHelpers.InMethod();
-// TestHelpers.EnableLogging();
-
- // Store an avatar with a different height from default in a notecard.
- UUID userId = TestHelpers.ParseTail(0x1);
- float newHeight = 1.9f;
-
- ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId);
- sp.Appearance.AvatarHeight = newHeight;
- SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, 0x10);
- SceneObjectPart part = so.RootPart;
- m_scene.AddSceneObject(so);
-
- OSSL_Api osslApi = new OSSL_Api();
- osslApi.Initialize(m_engine, part, null);
-
- string notecardName = "appearanceNc";
- osslApi.osOwnerSaveAppearance(notecardName);
-
- // Try creating a bot using the existing avatar's appearance
- string npcRaw = osslApi.osNpcCreate("Jane", "Doe", new LSL_Types.Vector3(128, 128, 128), sp.UUID.ToString());
- Assert.That(npcRaw, Is.Not.Null);
-
- UUID npcId = new UUID(npcRaw);
- ScenePresence npc = m_scene.GetScenePresence(npcId);
- Assert.That(npc, Is.Not.Null);
- Assert.That(npc.Appearance.AvatarHeight, Is.EqualTo(newHeight));
- }
-
[Test]
public void TestOsOwnerSaveAppearance()
{
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
index 25679a6..b5a4d93 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
@@ -79,6 +79,75 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
}
///
+ /// Test creation of an NPC where the appearance data comes from a notecard
+ ///
+ [Test]
+ public void TestOsNpcCreateUsingAppearanceFromNotecard()
+ {
+ TestHelpers.InMethod();
+
+ // Store an avatar with a different height from default in a notecard.
+ UUID userId = TestHelpers.ParseTail(0x1);
+ float newHeight = 1.9f;
+
+ ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId);
+ sp.Appearance.AvatarHeight = newHeight;
+ SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, 0x10);
+ SceneObjectPart part = so.RootPart;
+ m_scene.AddSceneObject(so);
+
+ OSSL_Api osslApi = new OSSL_Api();
+ osslApi.Initialize(m_engine, part, null);
+
+ string notecardName = "appearanceNc";
+ osslApi.osOwnerSaveAppearance(notecardName);
+
+ // Try creating a bot using the appearance in the notecard.
+ string npcRaw = osslApi.osNpcCreate("Jane", "Doe", new LSL_Types.Vector3(128, 128, 128), notecardName);
+ Assert.That(npcRaw, Is.Not.Null);
+
+ UUID npcId = new UUID(npcRaw);
+ ScenePresence npc = m_scene.GetScenePresence(npcId);
+ Assert.That(npc, Is.Not.Null);
+ Assert.That(npc.Appearance.AvatarHeight, Is.EqualTo(newHeight));
+ }
+
+ ///
+ /// Test creation of an NPC where the appearance data comes from an avatar already in the region.
+ ///
+ [Test]
+ public void TestOsNpcCreateUsingAppearanceFromAvatar()
+ {
+ TestHelpers.InMethod();
+// TestHelpers.EnableLogging();
+
+ // Store an avatar with a different height from default in a notecard.
+ UUID userId = TestHelpers.ParseTail(0x1);
+ float newHeight = 1.9f;
+
+ ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId);
+ sp.Appearance.AvatarHeight = newHeight;
+ SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, 0x10);
+ SceneObjectPart part = so.RootPart;
+ m_scene.AddSceneObject(so);
+
+ OSSL_Api osslApi = new OSSL_Api();
+ osslApi.Initialize(m_engine, part, null);
+
+ string notecardName = "appearanceNc";
+ osslApi.osOwnerSaveAppearance(notecardName);
+
+ // Try creating a bot using the existing avatar's appearance
+ string npcRaw = osslApi.osNpcCreate("Jane", "Doe", new LSL_Types.Vector3(128, 128, 128), sp.UUID.ToString());
+ Assert.That(npcRaw, Is.Not.Null);
+
+ UUID npcId = new UUID(npcRaw);
+ ScenePresence npc = m_scene.GetScenePresence(npcId);
+ Assert.That(npc, Is.Not.Null);
+ Assert.That(npc.Appearance.AvatarHeight, Is.EqualTo(newHeight));
+ }
+
+ ///
/// Test removal of an owned NPC.
///
[Test]
--
cgit v1.1
From 5d4ac5a90fea758e18c8a9e97b06e799186b5a14 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 25 Oct 2012 00:59:27 +0100
Subject: Add TestOsNpcLoadAppearance()
---
.../Shared/Tests/OSSL_ApiAppearanceTest.cs | 6 ++-
.../ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs | 43 +++++++++++++++++++++-
2 files changed, 45 insertions(+), 4 deletions(-)
(limited to 'OpenSim/Region/ScriptEngine/Shared')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs
index c401794..eb51c4e 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs
@@ -36,11 +36,12 @@ using OpenMetaverse;
using OpenMetaverse.Assets;
using OpenMetaverse.StructuredData;
using OpenSim.Framework;
+using OpenSim.Region.CoreModules.Avatar.Attachments;
using OpenSim.Region.CoreModules.Avatar.AvatarFactory;
-using OpenSim.Region.OptionalModules.World.NPC;
using OpenSim.Region.Framework.Scenes;
using OpenSim.Region.ScriptEngine.Shared;
using OpenSim.Region.ScriptEngine.Shared.Api;
+using OpenSim.Region.OptionalModules.World.NPC;
using OpenSim.Services.Interfaces;
using OpenSim.Tests.Common;
using OpenSim.Tests.Common.Mock;
@@ -68,7 +69,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
config.Set("Enabled", "true");
m_scene = new SceneHelpers().SetupScene();
- SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule());
+ SceneHelpers.SetupSceneModules(
+ m_scene, initConfigSource, new AvatarFactoryModule(), new AttachmentsModule(), new NPCModule());
m_engine = new XEngine.XEngine();
m_engine.Initialise(initConfigSource);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
index b5a4d93..0a3a75d 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
@@ -36,6 +36,7 @@ using OpenMetaverse;
using OpenMetaverse.Assets;
using OpenMetaverse.StructuredData;
using OpenSim.Framework;
+using OpenSim.Region.CoreModules.Avatar.Attachments;
using OpenSim.Region.CoreModules.Avatar.AvatarFactory;
using OpenSim.Region.OptionalModules.World.NPC;
using OpenSim.Region.Framework.Scenes;
@@ -71,7 +72,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
config.Set("Enabled", "true");
m_scene = new SceneHelpers().SetupScene();
- SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule());
+ SceneHelpers.SetupSceneModules(
+ m_scene, initConfigSource, new AvatarFactoryModule(), new AttachmentsModule(), new NPCModule());
m_engine = new XEngine.XEngine();
m_engine.Initialise(initConfigSource);
@@ -147,6 +149,44 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
Assert.That(npc.Appearance.AvatarHeight, Is.EqualTo(newHeight));
}
+ [Test]
+ public void TestOsNpcLoadAppearance()
+ {
+ TestHelpers.InMethod();
+
+ // Store an avatar with a different height from default in a notecard.
+ UUID userId = TestHelpers.ParseTail(0x1);
+ float firstHeight = 1.9f;
+ float secondHeight = 2.1f;
+ string firstAppearanceNcName = "appearanceNc1";
+ string secondAppearanceNcName = "appearanceNc2";
+
+ ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId);
+ sp.Appearance.AvatarHeight = firstHeight;
+ SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, 0x10);
+ SceneObjectPart part = so.RootPart;
+ m_scene.AddSceneObject(so);
+
+ OSSL_Api osslApi = new OSSL_Api();
+ osslApi.Initialize(m_engine, part, null);
+
+ osslApi.osOwnerSaveAppearance(firstAppearanceNcName);
+
+ string npcRaw
+ = osslApi.osNpcCreate("Jane", "Doe", new LSL_Types.Vector3(128, 128, 128), firstAppearanceNcName);
+
+ // Create a second appearance notecard with a different height
+ sp.Appearance.AvatarHeight = secondHeight;
+ osslApi.osOwnerSaveAppearance(secondAppearanceNcName);
+
+ osslApi.osNpcLoadAppearance(npcRaw, secondAppearanceNcName);
+
+ UUID npcId = new UUID(npcRaw);
+ ScenePresence npc = m_scene.GetScenePresence(npcId);
+ Assert.That(npc, Is.Not.Null);
+ Assert.That(npc.Appearance.AvatarHeight, Is.EqualTo(secondHeight));
+ }
+
///
/// Test removal of an owned NPC.
///
@@ -154,7 +194,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
public void TestOsNpcRemoveOwned()
{
TestHelpers.InMethod();
-// log4net.Config.XmlConfigurator.Configure();
// Store an avatar with a different height from default in a notecard.
UUID userId = TestHelpers.ParseTail(0x1);
--
cgit v1.1
From ae662b54ea972e4da4f805fe38b5714d595e032a Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 25 Oct 2012 01:07:06 +0100
Subject: Make osNpcCreate() return UUID.Zero instead of throwing an exception
if notecard name is invalid. Make osNpcLoadAppearance() fail silently in
same circumstance rather than throwing exception.
---
.../Shared/Api/Implementation/OSSL_Api.cs | 26 +++++++----
.../Shared/Tests/OSSL_ApiAppearanceTest.cs | 6 +--
.../ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs | 54 ++++++++++++++++++++++
3 files changed, 74 insertions(+), 12 deletions(-)
(limited to 'OpenSim/Region/ScriptEngine/Shared')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 29bc163..804b0af 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -1780,18 +1780,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
protected string LoadNotecard(string notecardNameOrUuid)
{
UUID assetID = CacheNotecard(notecardNameOrUuid);
- StringBuilder notecardData = new StringBuilder();
- for (int count = 0; count < NotecardCache.GetLines(assetID); count++)
+ if (assetID != UUID.Zero)
{
- string line = NotecardCache.GetLine(assetID, count) + "\n";
-
-// m_log.DebugFormat("[OSSL]: From notecard {0} loading line {1}", notecardNameOrUuid, line);
-
- notecardData.Append(line);
+ StringBuilder notecardData = new StringBuilder();
+
+ for (int count = 0; count < NotecardCache.GetLines(assetID); count++)
+ {
+ string line = NotecardCache.GetLine(assetID, count) + "\n";
+
+ // m_log.DebugFormat("[OSSL]: From notecard {0} loading line {1}", notecardNameOrUuid, line);
+
+ notecardData.Append(line);
+ }
+
+ return notecardData.ToString();
}
- return notecardData.ToString();
+ return null;
}
///
@@ -2407,6 +2413,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return;
string appearanceSerialized = LoadNotecard(notecard);
+
+ if (appearanceSerialized == null)
+ return;
+
OSDMap appearanceOsd = (OSDMap)OSDParser.DeserializeLLSDXml(appearanceSerialized);
// OSD a = OSDParser.DeserializeLLSDXml(appearanceSerialized);
// Console.WriteLine("appearanceSerialized {0}", appearanceSerialized);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs
index eb51c4e..c401794 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs
@@ -36,12 +36,11 @@ using OpenMetaverse;
using OpenMetaverse.Assets;
using OpenMetaverse.StructuredData;
using OpenSim.Framework;
-using OpenSim.Region.CoreModules.Avatar.Attachments;
using OpenSim.Region.CoreModules.Avatar.AvatarFactory;
+using OpenSim.Region.OptionalModules.World.NPC;
using OpenSim.Region.Framework.Scenes;
using OpenSim.Region.ScriptEngine.Shared;
using OpenSim.Region.ScriptEngine.Shared.Api;
-using OpenSim.Region.OptionalModules.World.NPC;
using OpenSim.Services.Interfaces;
using OpenSim.Tests.Common;
using OpenSim.Tests.Common.Mock;
@@ -69,8 +68,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
config.Set("Enabled", "true");
m_scene = new SceneHelpers().SetupScene();
- SceneHelpers.SetupSceneModules(
- m_scene, initConfigSource, new AvatarFactoryModule(), new AttachmentsModule(), new NPCModule());
+ SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule());
m_engine = new XEngine.XEngine();
m_engine.Initialise(initConfigSource);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
index 0a3a75d..4e58315 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
@@ -114,6 +114,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
Assert.That(npc.Appearance.AvatarHeight, Is.EqualTo(newHeight));
}
+ [Test]
+ public void TestOsNpcCreateNotExistingNotecard()
+ {
+ TestHelpers.InMethod();
+
+ UUID userId = TestHelpers.ParseTail(0x1);
+
+ SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, 0x10);
+ m_scene.AddSceneObject(so);
+
+ OSSL_Api osslApi = new OSSL_Api();
+ osslApi.Initialize(m_engine, so.RootPart, null);
+
+ string npcRaw
+ = osslApi.osNpcCreate("Jane", "Doe", new LSL_Types.Vector3(128, 128, 128), "not existing notecard name");
+
+ UUID npcId = new UUID(npcRaw);
+ Assert.That(npcId, Is.EqualTo(UUID.Zero));
+ }
+
///
/// Test creation of an NPC where the appearance data comes from an avatar already in the region.
///
@@ -187,6 +207,40 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
Assert.That(npc.Appearance.AvatarHeight, Is.EqualTo(secondHeight));
}
+ [Test]
+ public void TestOsNpcLoadAppearanceNotExistingNotecard()
+ {
+ TestHelpers.InMethod();
+
+ // Store an avatar with a different height from default in a notecard.
+ UUID userId = TestHelpers.ParseTail(0x1);
+ float firstHeight = 1.9f;
+ float secondHeight = 2.1f;
+ string firstAppearanceNcName = "appearanceNc1";
+ string secondAppearanceNcName = "appearanceNc2";
+
+ ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId);
+ sp.Appearance.AvatarHeight = firstHeight;
+ SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, 0x10);
+ SceneObjectPart part = so.RootPart;
+ m_scene.AddSceneObject(so);
+
+ OSSL_Api osslApi = new OSSL_Api();
+ osslApi.Initialize(m_engine, part, null);
+
+ osslApi.osOwnerSaveAppearance(firstAppearanceNcName);
+
+ string npcRaw
+ = osslApi.osNpcCreate("Jane", "Doe", new LSL_Types.Vector3(128, 128, 128), firstAppearanceNcName);
+
+ osslApi.osNpcLoadAppearance(npcRaw, secondAppearanceNcName);
+
+ UUID npcId = new UUID(npcRaw);
+ ScenePresence npc = m_scene.GetScenePresence(npcId);
+ Assert.That(npc, Is.Not.Null);
+ Assert.That(npc.Appearance.AvatarHeight, Is.EqualTo(firstHeight));
+ }
+
///
/// Test removal of an owned NPC.
///
--
cgit v1.1
From d9aaf51561ea7bb2ee030c648611a5281f21ec49 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 25 Oct 2012 02:52:20 +0100
Subject: When scripts generate expected exceptions (e.g. due to checked bad
parameter) throw ScriptException instead of just a plain old exception.
This is to make it easier to distinguish these exceptions from unexpected OpenSimulator problems internally and in regression tests.
No functional changes.
---
.../Shared/Api/Implementation/LSL_Api.cs | 4 +--
.../Shared/Api/Implementation/MOD_Api.cs | 10 +++---
.../Shared/Api/Implementation/OSSL_Api.cs | 2 +-
.../Region/ScriptEngine/Shared/ScriptException.cs | 40 ++++++++++++++++++++++
4 files changed, 48 insertions(+), 8 deletions(-)
create mode 100644 OpenSim/Region/ScriptEngine/Shared/ScriptException.cs
(limited to 'OpenSim/Region/ScriptEngine/Shared')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index cf801ba..dc791d3 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -10685,12 +10685,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
internal void Deprecated(string command)
{
- throw new Exception("Command deprecated: " + command);
+ throw new ScriptException("Command deprecated: " + command);
}
internal void LSLError(string msg)
{
- throw new Exception("LSL Runtime Error: " + msg);
+ throw new ScriptException("LSL Runtime Error: " + msg);
}
public delegate void AssetRequestCallback(UUID assetID, AssetBase asset);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
index 6809c09..a830a15 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
@@ -95,13 +95,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
internal void MODError(string msg)
{
- throw new Exception("MOD Runtime Error: " + msg);
+ throw new ScriptException("MOD Runtime Error: " + msg);
}
- //
- //Dumps an error message on the debug console.
- //
-
+ ///
+ /// Dumps an error message on the debug console.
+ ///
+ ///
internal void MODShoutError(string message)
{
if (message.Length > 1023)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 804b0af..5301ccd 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -210,7 +210,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
internal void OSSLError(string msg)
{
- throw new Exception("OSSL Runtime Error: " + msg);
+ throw new ScriptException("OSSL Runtime Error: " + msg);
}
///
diff --git a/OpenSim/Region/ScriptEngine/Shared/ScriptException.cs b/OpenSim/Region/ScriptEngine/Shared/ScriptException.cs
new file mode 100644
index 0000000..ae67fc5
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/ScriptException.cs
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+
+namespace OpenSim.Region.ScriptEngine.Shared
+{
+ public class ScriptException : Exception
+ {
+ public ScriptException() : base() {}
+
+ public ScriptException(string message) : base(message) {}
+
+ public ScriptException(string message, Exception innerException) : base(message, innerException) {}
+ }
+}
\ No newline at end of file
--
cgit v1.1
From 8af8319b95c14819d0305527f8f6876a334fa3c0 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 25 Oct 2012 03:02:00 +0100
Subject: Get osNpcCreate() and osNpcLoadAppearance() to generate a script
error if appearance notecard does not exist, rather than returning UUID.Zero
or silently failing.
---
.../Shared/Api/Implementation/OSSL_Api.cs | 11 ++++----
.../ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs | 30 +++++++++++++++++-----
2 files changed, 30 insertions(+), 11 deletions(-)
(limited to 'OpenSim/Region/ScriptEngine/Shared')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 5301ccd..0811519 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -2346,11 +2346,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
appearance = new AvatarAppearance();
appearance.Unpack(appearanceOsd);
}
+ else
+ {
+ OSSLError(string.Format("osNpcCreate: Notecard reference '{0}' not found.", notecard));
+ }
}
- if (appearance == null)
- return new LSL_Key(UUID.Zero.ToString());
-
UUID ownerID = UUID.Zero;
if (owned)
ownerID = m_host.OwnerID;
@@ -2415,8 +2416,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
string appearanceSerialized = LoadNotecard(notecard);
if (appearanceSerialized == null)
- return;
-
+ OSSLError(string.Format("osNpcCreate: Notecard reference '{0}' not found.", notecard));
+
OSDMap appearanceOsd = (OSDMap)OSDParser.DeserializeLLSDXml(appearanceSerialized);
// OSD a = OSDParser.DeserializeLLSDXml(appearanceSerialized);
// Console.WriteLine("appearanceSerialized {0}", appearanceSerialized);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
index 4e58315..b49bcc2 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
@@ -127,11 +127,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
OSSL_Api osslApi = new OSSL_Api();
osslApi.Initialize(m_engine, so.RootPart, null);
- string npcRaw
- = osslApi.osNpcCreate("Jane", "Doe", new LSL_Types.Vector3(128, 128, 128), "not existing notecard name");
-
- UUID npcId = new UUID(npcRaw);
- Assert.That(npcId, Is.EqualTo(UUID.Zero));
+ string npcRaw;
+ bool gotExpectedException = false;
+ try
+ {
+ npcRaw
+ = osslApi.osNpcCreate("Jane", "Doe", new LSL_Types.Vector3(128, 128, 128), "not existing notecard name");
+ }
+ catch (ScriptException)
+ {
+ gotExpectedException = true;
+ }
+
+ Assert.That(gotExpectedException, Is.True);
}
///
@@ -233,7 +241,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
string npcRaw
= osslApi.osNpcCreate("Jane", "Doe", new LSL_Types.Vector3(128, 128, 128), firstAppearanceNcName);
- osslApi.osNpcLoadAppearance(npcRaw, secondAppearanceNcName);
+ bool gotExpectedException = false;
+ try
+ {
+ osslApi.osNpcLoadAppearance(npcRaw, secondAppearanceNcName);
+ }
+ catch (ScriptException)
+ {
+ gotExpectedException = true;
+ }
+
+ Assert.That(gotExpectedException, Is.True);
UUID npcId = new UUID(npcRaw);
ScenePresence npc = m_scene.GetScenePresence(npcId);
--
cgit v1.1
From 01972cc9e8f3288330cdc7ba343b99be7f1491ec Mon Sep 17 00:00:00 2001
From: SignpostMarv
Date: Tue, 23 Oct 2012 11:34:43 +0100
Subject: system ints can end up in LSL lists, which can cause
counter-intuitive unknown list element type errors in ConvertFromLSL (via
modInvoke)
---
OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs | 2 ++
1 file changed, 2 insertions(+)
(limited to 'OpenSim/Region/ScriptEngine/Shared')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
index a830a15..60bb107 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
@@ -359,6 +359,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
result[i] = (string)(LSL_String)plist[i];
else if (plist[i] is LSL_Integer)
result[i] = (int)(LSL_Integer)plist[i];
+ else if (plist[i] is int)
+ result[i] = plist[i];
else if (plist[i] is LSL_Float)
result[i] = (float)(LSL_Float)plist[i];
else if (plist[i] is LSL_Key)
--
cgit v1.1
From ecdb88679e6bb59da13da0f3994cc42d8e84a30d Mon Sep 17 00:00:00 2001
From: SignpostMarv
Date: Tue, 23 Oct 2012 11:39:55 +0100
Subject: Removing the apparently superfluous explicit namespace reference so
that the if-else-if-else block in ConvertFromLSL can have a consistent
appearance
---
.../Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
(limited to 'OpenSim/Region/ScriptEngine/Shared')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
index 60bb107..a181dbe 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
@@ -366,15 +366,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
else if (plist[i] is LSL_Key)
result[i] = new UUID((LSL_Key)plist[i]);
else if (plist[i] is LSL_Rotation)
- {
- result[i] = (OpenMetaverse.Quaternion)(
- (LSL_Rotation)plist[i]);
- }
+ result[i] = (Quaternion)((LSL_Rotation)plist[i]);
else if (plist[i] is LSL_Vector)
- {
- result[i] = (OpenMetaverse.Vector3)(
- (LSL_Vector)plist[i]);
- }
+ result[i] = (Vector3)((LSL_Vector)plist[i]);
else
MODError(String.Format("{0}: unknown LSL list element type", fname));
}
--
cgit v1.1
From 1b3b7a61acf8784af3167a35c0f06eaeb413af9c Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 26 Oct 2012 01:50:46 +0100
Subject: minor: Add comment as to why we are pulcking plain old ints out of
the LSL_List when converting values from LSL for modInvoke()
---
OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs | 2 ++
1 file changed, 2 insertions(+)
(limited to 'OpenSim/Region/ScriptEngine/Shared')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
index a181dbe..8f34833 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
@@ -359,6 +359,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
result[i] = (string)(LSL_String)plist[i];
else if (plist[i] is LSL_Integer)
result[i] = (int)(LSL_Integer)plist[i];
+ // The int check exists because of the many plain old int script constants in ScriptBase which
+ // are not LSL_Integers.
else if (plist[i] is int)
result[i] = plist[i];
else if (plist[i] is LSL_Float)
--
cgit v1.1
From 18b1ee6f379f4d34f72a9056bf6cdf185311fd05 Mon Sep 17 00:00:00 2001
From: SignpostMarv
Date: Tue, 23 Oct 2012 15:29:40 +0100
Subject: Formatting and casing correction in WorldCommModule, trailing new
line in OSSL to get git diff to not complain
---
OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/ScriptEngine/Shared')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 0811519..0650b90 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -3648,4 +3648,4 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
DropAttachmentAt(false, pos, rot);
}
}
-}
\ No newline at end of file
+}
--
cgit v1.1
From e977761071a2d614a9a621437fbf86479b414759 Mon Sep 17 00:00:00 2001
From: SignpostMarv
Date: Tue, 23 Oct 2012 15:42:16 +0100
Subject: adding ability for listeners to be filtered by regular expressions
and a general-purpose function to see if a given string matches a given regex
---
.../Shared/Api/Implementation/OSSL_Api.cs | 63 ++++++++++++++++++++++
.../ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs | 24 +++++++++
.../Shared/Api/Runtime/LSL_Constants.cs | 10 ++++
.../ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs | 10 ++++
4 files changed, 107 insertions(+)
(limited to 'OpenSim/Region/ScriptEngine/Shared')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 0650b90..828288d 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -3647,5 +3647,68 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
DropAttachmentAt(false, pos, rot);
}
+
+ public LSL_Integer osListenRegex(int channelID, string name, string ID, string msg, int regexBitfield)
+ {
+ CheckThreatLevel(ThreatLevel.Low, "osListenRegex");
+ m_host.AddScriptLPS(1);
+ UUID keyID;
+ UUID.TryParse(ID, out keyID);
+
+ // if we want the name to be used as a regular expression, ensure it is valid first.
+ if ((regexBitfield & ScriptBaseClass.OS_LISTEN_REGEX_NAME) == ScriptBaseClass.OS_LISTEN_REGEX_NAME)
+ {
+ try
+ {
+ Regex.IsMatch("", name);
+ }
+ catch (Exception)
+ {
+ OSSLShoutError("Name regex is invalid.");
+ return -1;
+ }
+ }
+
+ // if we want the msg to be used as a regular expression, ensure it is valid first.
+ if ((regexBitfield & ScriptBaseClass.OS_LISTEN_REGEX_MESSAGE) == ScriptBaseClass.OS_LISTEN_REGEX_MESSAGE)
+ {
+ try
+ {
+ Regex.IsMatch("", msg);
+ }
+ catch (Exception)
+ {
+ OSSLShoutError("Message regex is invalid.");
+ return -1;
+ }
+ }
+
+ IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface();
+ return (wComm == null) ? -1 : wComm.Listen(
+ m_host.LocalId,
+ m_item.ItemID,
+ m_host.UUID,
+ channelID,
+ name,
+ keyID,
+ msg,
+ regexBitfield
+ );
+ }
+
+ public LSL_Integer osRegexIsMatch(string input, string pattern)
+ {
+ CheckThreatLevel(ThreatLevel.Low, "osRegexIsMatch");
+ m_host.AddScriptLPS(1);
+ try
+ {
+ return Regex.IsMatch(input, pattern) ? 1 : 0;
+ }
+ catch (Exception)
+ {
+ OSSLShoutError("Possible invalid regular expression detected.");
+ return 0;
+ }
+ }
}
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
index 93188c9..cdd9ea8 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -418,5 +418,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
///
///
void osForceDropAttachmentAt(vector pos, rotation rot);
+
+ ///
+ /// Identical to llListen except for a bitfield which indicates which
+ /// string parameters should be parsed as regex patterns.
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ /// OS_LISTEN_REGEX_NAME
+ /// OS_LISTEN_REGEX_MESSAGE
+ ///
+ ///
+ LSL_Integer osListenRegex(int channelID, string name, string ID,
+ string msg, int regexBitfield);
+
+ ///
+ /// Wraps to bool Regex.IsMatch(string input, string pattern)
+ ///
+ /// string to test for match
+ /// string to use as pattern
+ /// boolean
+ LSL_Integer osRegexIsMatch(string input, string pattern);
}
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
index 62bd6b8..880841b 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
@@ -716,5 +716,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
public static readonly LSLInteger RCERR_UNKNOWN = -1;
public static readonly LSLInteger RCERR_SIM_PERF_LOW = -2;
public static readonly LSLInteger RCERR_CAST_TIME_EXCEEDED = 3;
+
+ ///
+ /// process name parameter as regex
+ ///
+ public const int OS_LISTEN_REGEX_NAME = 0x1;
+
+ ///
+ /// process message parameter as regex
+ ///
+ public const int OS_LISTEN_REGEX_MESSAGE = 0x2;
}
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
index dee1b28..afa9ae0 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -992,5 +992,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
{
m_OSSL_Functions.osForceDropAttachmentAt(pos, rot);
}
+
+ public LSL_Integer osListenRegex(int channelID, string name, string ID, string msg, int regexBitfield)
+ {
+ return m_OSSL_Functions.osListenRegex(channelID, name, ID, msg, regexBitfield);
+ }
+
+ public LSL_Integer osRegexIsMatch(string input, string pattern)
+ {
+ return m_OSSL_Functions.osRegexIsMatch(input, pattern);
+ }
}
}
--
cgit v1.1