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.

0.7.4-extended
Justin Clark-Casey (justincc) 2012-10-25 01:07:06 +01:00
parent 3692ff2bdb
commit 95e35fe84a
3 changed files with 74 additions and 12 deletions

View File

@ -1773,18 +1773,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
protected string LoadNotecard(string notecardNameOrUuid) protected string LoadNotecard(string notecardNameOrUuid)
{ {
UUID assetID = CacheNotecard(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"; StringBuilder notecardData = new StringBuilder();
// m_log.DebugFormat("[OSSL]: From notecard {0} loading line {1}", notecardNameOrUuid, line); for (int count = 0; count < NotecardCache.GetLines(assetID); count++)
{
notecardData.Append(line); 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;
} }
/// <summary> /// <summary>
@ -2386,6 +2392,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return; return;
string appearanceSerialized = LoadNotecard(notecard); string appearanceSerialized = LoadNotecard(notecard);
if (appearanceSerialized == null)
return;
OSDMap appearanceOsd = (OSDMap)OSDParser.DeserializeLLSDXml(appearanceSerialized); OSDMap appearanceOsd = (OSDMap)OSDParser.DeserializeLLSDXml(appearanceSerialized);
// OSD a = OSDParser.DeserializeLLSDXml(appearanceSerialized); // OSD a = OSDParser.DeserializeLLSDXml(appearanceSerialized);
// Console.WriteLine("appearanceSerialized {0}", appearanceSerialized); // Console.WriteLine("appearanceSerialized {0}", appearanceSerialized);

View File

@ -36,12 +36,11 @@ using OpenMetaverse;
using OpenMetaverse.Assets; using OpenMetaverse.Assets;
using OpenMetaverse.StructuredData; using OpenMetaverse.StructuredData;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Region.CoreModules.Avatar.Attachments;
using OpenSim.Region.CoreModules.Avatar.AvatarFactory; using OpenSim.Region.CoreModules.Avatar.AvatarFactory;
using OpenSim.Region.OptionalModules.World.NPC;
using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Scenes;
using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.ScriptEngine.Shared;
using OpenSim.Region.ScriptEngine.Shared.Api; using OpenSim.Region.ScriptEngine.Shared.Api;
using OpenSim.Region.OptionalModules.World.NPC;
using OpenSim.Services.Interfaces; using OpenSim.Services.Interfaces;
using OpenSim.Tests.Common; using OpenSim.Tests.Common;
using OpenSim.Tests.Common.Mock; using OpenSim.Tests.Common.Mock;
@ -69,8 +68,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
config.Set("Enabled", "true"); config.Set("Enabled", "true");
m_scene = new SceneHelpers().SetupScene(); m_scene = new SceneHelpers().SetupScene();
SceneHelpers.SetupSceneModules( SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule());
m_scene, initConfigSource, new AvatarFactoryModule(), new AttachmentsModule(), new NPCModule());
m_engine = new XEngine.XEngine(); m_engine = new XEngine.XEngine();
m_engine.Initialise(initConfigSource); m_engine.Initialise(initConfigSource);

View File

@ -114,6 +114,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
Assert.That(npc.Appearance.AvatarHeight, Is.EqualTo(newHeight)); 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));
}
/// <summary> /// <summary>
/// Test creation of an NPC where the appearance data comes from an avatar already in the region. /// Test creation of an NPC where the appearance data comes from an avatar already in the region.
/// </summary> /// </summary>
@ -187,6 +207,40 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
Assert.That(npc.Appearance.AvatarHeight, Is.EqualTo(secondHeight)); 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));
}
/// <summary> /// <summary>
/// Test removal of an owned NPC. /// Test removal of an owned NPC.
/// </summary> /// </summary>