diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 1e096109cd..ebb5bd2b13 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -566,8 +566,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
///
protected void AttachToAgent(ScenePresence avatar, SceneObjectGroup so, uint attachmentpoint, Vector3 attachOffset, bool silent)
{
- m_log.DebugFormat("[ATTACHMENTS MODULE]: Adding attachment {0} to avatar {1} in pt {2} pos {3} {4}", Name, avatar.Name,
- attachmentpoint, attachOffset, so.RootPart.AttachedPos);
+ m_log.DebugFormat("[ATTACHMENTS MODULE]: Adding attachment {0} to avatar {1} in pt {2} pos {3} {4}",
+ so.Name, avatar.Name, attachmentpoint, attachOffset, so.RootPart.AttachedPos);
so.DetachFromBackup();
diff --git a/OpenSim/Region/Framework/Interfaces/INPCModule.cs b/OpenSim/Region/Framework/Interfaces/INPCModule.cs
index 54575ca40a..763d2dcdb4 100644
--- a/OpenSim/Region/Framework/Interfaces/INPCModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/INPCModule.cs
@@ -58,7 +58,7 @@ namespace OpenSim.Region.Framework.Interfaces
///
///
///
- ///
+ /// True if the operation succeeded, false if there was no such agent or the agent was not an NPC
bool SetNPCAppearance(UUID agentID, AvatarAppearance appearance, Scene scene);
///
@@ -67,7 +67,16 @@ namespace OpenSim.Region.Framework.Interfaces
/// The UUID of the NPC
///
///
- void MoveToTarget(UUID agentID, Scene scene, Vector3 pos);
+ /// True if the operation succeeded, false if there was no such agent or the agent was not an NPC
+ bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos);
+
+ ///
+ /// Stop the NPC's current movement.
+ ///
+ /// The UUID of the NPC
+ ///
+ /// True if the operation succeeded, false if there was no such agent or the agent was not an NPC
+ bool StopMoveToTarget(UUID agentID, Scene scene);
///
/// Get the NPC to say something.
@@ -75,13 +84,15 @@ namespace OpenSim.Region.Framework.Interfaces
/// The UUID of the NPC
///
///
- void Say(UUID agentID, Scene scene, string text);
+ /// True if the operation succeeded, false if there was no such agent or the agent was not an NPC
+ bool Say(UUID agentID, Scene scene, string text);
///
/// Delete an NPC.
///
/// The UUID of the NPC
///
- void DeleteNPC(UUID agentID, Scene scene);
+ /// True if the operation succeeded, false if there was no such agent or the agent was not an NPC
+ bool DeleteNPC(UUID agentID, Scene scene);
}
}
\ No newline at end of file
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
index 068eec8c25..87cb32203b 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
@@ -217,7 +217,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
return npcAvatar.AgentId;
}
- public void MoveToTarget(UUID agentID, Scene scene, Vector3 pos)
+ public bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos)
{
lock (m_avatars)
{
@@ -230,22 +230,49 @@ namespace OpenSim.Region.OptionalModules.World.NPC
"[NPC MODULE]: Moving {0} to {1} in {2}", sp.Name, pos, scene.RegionInfo.RegionName);
sp.MoveToTarget(pos);
+
+ return true;
}
}
+
+ return false;
}
- public void Say(UUID agentID, Scene scene, string text)
+ public bool StopMoveToTarget(UUID agentID, Scene scene)
+ {
+ lock (m_avatars)
+ {
+ if (m_avatars.ContainsKey(agentID))
+ {
+ ScenePresence sp;
+ scene.TryGetScenePresence(agentID, out sp);
+
+ sp.Velocity = Vector3.Zero;
+ sp.ResetMoveToTarget();
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public bool Say(UUID agentID, Scene scene, string text)
{
lock (m_avatars)
{
if (m_avatars.ContainsKey(agentID))
{
m_avatars[agentID].Say(text);
+
+ return true;
}
}
+
+ return false;
}
- public void DeleteNPC(UUID agentID, Scene scene)
+ public bool DeleteNPC(UUID agentID, Scene scene)
{
lock (m_avatars)
{
@@ -253,8 +280,12 @@ namespace OpenSim.Region.OptionalModules.World.NPC
{
scene.RemoveClient(agentID);
m_avatars.Remove(agentID);
+
+ return true;
}
}
+
+ return false;
}
public void PostInitialise()
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index a05c623d41..9c320296ed 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -2213,6 +2213,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
}
+ public void osNpcStopMoveTo(LSL_Key npc)
+ {
+ CheckThreatLevel(ThreatLevel.VeryLow, "osNpcStopMoveTo");
+
+ INPCModule module = World.RequestModuleInterface();
+ if (module != null)
+ module.StopMoveToTarget(new UUID(npc.m_string), World);
+ }
+
public void osNpcSay(LSL_Key npc, string message)
{
CheckThreatLevel(ThreatLevel.High, "osNpcSay");
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
index 92473ae25d..ab0097aedd 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -173,6 +173,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
LSL_Key osNpcSaveAppearance(string avatar, string notecardName);
void osNpcLoadAppearance(string avatar, string notecardNameOrUuid);
void osNpcMoveTo(key npc, vector position);
+ void osNpcStopMoveTo(LSL_Key npc);
void osNpcSay(key npc, string message);
void osNpcRemove(key npc);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
index 4b21c88092..a7843dd6a0 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -498,6 +498,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
m_OSSL_Functions.osNpcMoveTo(npc, position);
}
+ public void osNpcStopMoveTo(LSL_Key npc)
+ {
+ m_OSSL_Functions.osNpcStopMoveTo(npc);
+ }
+
public void osNpcSay(key npc, string message)
{
m_OSSL_Functions.osNpcSay(npc, message);