diff --git a/OpenSim/Region/Framework/Interfaces/INPCModule.cs b/OpenSim/Region/Framework/Interfaces/INPCModule.cs
index 9dd8c79a5f..b65f82c5ed 100644
--- a/OpenSim/Region/Framework/Interfaces/INPCModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/INPCModule.cs
@@ -103,6 +103,14 @@ namespace OpenSim.Region.Framework.Interfaces
/// true if the sit succeeded, false if not
bool Sit(UUID agentID, UUID partID, Scene scene);
+ ///
+ /// Stand a sitting NPC.
+ ///
+ ///
+ ///
+ /// true if the stand succeeded, false if not
+ bool Stand(UUID agentID, Scene scene);
+
///
/// Delete an NPC.
///
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
index be736393b5..e94ed85ba9 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
@@ -217,6 +217,23 @@ namespace OpenSim.Region.OptionalModules.World.NPC
return false;
}
+ public bool Stand(UUID agentID, Scene scene)
+ {
+ lock (m_avatars)
+ {
+ if (m_avatars.ContainsKey(agentID))
+ {
+ ScenePresence sp;
+ scene.TryGetScenePresence(agentID, out sp);
+ sp.StandUp();
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
public bool DeleteNPC(UUID agentID, Scene scene)
{
lock (m_avatars)
diff --git a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs
index c5be0b69a9..be1ecd0612 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs
@@ -231,7 +231,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
}
[Test]
- public void TestSit()
+ public void TestSitAndStand()
{
TestHelpers.InMethod();
// log4net.Config.XmlConfigurator.Configure();
@@ -249,9 +249,13 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
part.SitTargetPosition = new Vector3(0, 0, 1);
npcModule.Sit(npc.UUID, part.UUID, scene);
- // Assertions?
Assert.That(part.SitTargetAvatar, Is.EqualTo(npcId));
Assert.That(npc.ParentID, Is.EqualTo(part.LocalId));
+
+ npcModule.Stand(npc.UUID, scene);
+
+ Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero));
+ Assert.That(npc.ParentID, Is.EqualTo(0));
}
}
}
\ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 7cf6642b3a..49c8722dfb 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -2362,6 +2362,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
}
+ public void osNpcStand(LSL_Key npc)
+ {
+ CheckThreatLevel(ThreatLevel.High, "osNpcStand");
+
+ INPCModule module = World.RequestModuleInterface();
+ if (module != null)
+ {
+ module.Stand(new UUID(npc.m_string), World);
+ }
+ }
+
public void osNpcRemove(LSL_Key npc)
{
CheckThreatLevel(ThreatLevel.High, "osNpcRemove");
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
index bb0a87099c..3221833414 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -179,6 +179,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
void osNpcStopMoveToTarget(LSL_Key npc);
void osNpcSay(key npc, string message);
void osNpcSit(key npc, key target, int options);
+ void osNpcStand(LSL_Key npc);
void osNpcRemove(key npc);
LSL_Key osOwnerSaveAppearance(string notecard);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
index 38391dfbb6..9e7c8da793 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -533,6 +533,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
m_OSSL_Functions.osNpcSit(npc, target, options);
}
+ public void osNpcStand(LSL_Key npc)
+ {
+ m_OSSL_Functions.osNpcStand(npc);
+ }
+
public void osNpcRemove(key npc)
{
m_OSSL_Functions.osNpcRemove(npc);