diff --git a/OpenSim/Region/Framework/Interfaces/INPCModule.cs b/OpenSim/Region/Framework/Interfaces/INPCModule.cs
index dc3ff89303..b4dc3c3c11 100644
--- a/OpenSim/Region/Framework/Interfaces/INPCModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/INPCModule.cs
@@ -134,6 +134,36 @@ 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 Say(UUID agentID, Scene scene, string text);
+ ///
+ /// Get the NPC to say something.
+ ///
+ /// 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 Say(UUID agentID, Scene scene, string text, int channel);
+
+ ///
+ /// Get the NPC to shout something.
+ ///
+ /// 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 Shout(UUID agentID, Scene scene, string text, int channel);
+
+ ///
+ /// Get the NPC to whisper something.
+ ///
+ /// 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 Whisper(UUID agentID, Scene scene, string text, int channel);
+
///
/// Sit the NPC.
///
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
index 5ea5af74a2..e57e5e6f97 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
@@ -76,22 +76,27 @@ namespace OpenSim.Region.OptionalModules.World.NPC
public void Say(string message)
{
- SendOnChatFromClient(message, ChatTypeEnum.Say);
+ SendOnChatFromClient(0, message, ChatTypeEnum.Say);
}
- public void Shout(string message)
+ public void Say(int channel, string message)
{
- SendOnChatFromClient(message, ChatTypeEnum.Shout);
+ SendOnChatFromClient(channel, message, ChatTypeEnum.Say);
}
- public void Whisper(string message)
+ public void Shout(int channel, string message)
{
- SendOnChatFromClient(message, ChatTypeEnum.Whisper);
+ SendOnChatFromClient(channel, message, ChatTypeEnum.Shout);
+ }
+
+ public void Whisper(int channel, string message)
+ {
+ SendOnChatFromClient(channel, message, ChatTypeEnum.Whisper);
}
public void Broadcast(string message)
{
- SendOnChatFromClient(message, ChatTypeEnum.Broadcast);
+ SendOnChatFromClient(0, message, ChatTypeEnum.Broadcast);
}
public void GiveMoney(UUID target, int amount)
@@ -146,10 +151,10 @@ namespace OpenSim.Region.OptionalModules.World.NPC
#region Internal Functions
- private void SendOnChatFromClient(string message, ChatTypeEnum chatType)
+ private void SendOnChatFromClient(int channel, string message, ChatTypeEnum chatType)
{
OSChatMessage chatFromClient = new OSChatMessage();
- chatFromClient.Channel = 0;
+ chatFromClient.Channel = channel;
chatFromClient.From = Name;
chatFromClient.Message = message;
chatFromClient.Position = StartPos;
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
index 2b8379dba9..adc6f9c765 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
@@ -211,6 +211,11 @@ namespace OpenSim.Region.OptionalModules.World.NPC
}
public bool Say(UUID agentID, Scene scene, string text)
+ {
+ return Say(agentID, scene, text, 0);
+ }
+
+ public bool Say(UUID agentID, Scene scene, string text, int channel)
{
lock (m_avatars)
{
@@ -219,7 +224,25 @@ namespace OpenSim.Region.OptionalModules.World.NPC
ScenePresence sp;
scene.TryGetScenePresence(agentID, out sp);
- m_avatars[agentID].Say(text);
+ m_avatars[agentID].Say(channel, text);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public bool Shout(UUID agentID, Scene scene, string text, int channel)
+ {
+ lock (m_avatars)
+ {
+ if (m_avatars.ContainsKey(agentID))
+ {
+ ScenePresence sp;
+ scene.TryGetScenePresence(agentID, out sp);
+
+ m_avatars[agentID].Shout(channel, text);
return true;
}
@@ -246,6 +269,24 @@ namespace OpenSim.Region.OptionalModules.World.NPC
return false;
}
+ public bool Whisper(UUID agentID, Scene scene, string text, int channel)
+ {
+ lock (m_avatars)
+ {
+ if (m_avatars.ContainsKey(agentID))
+ {
+ ScenePresence sp;
+ scene.TryGetScenePresence(agentID, out sp);
+
+ m_avatars[agentID].Whisper(channel, text);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
public bool Stand(UUID agentID, Scene scene)
{
lock (m_avatars)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index fe94b79b74..890115df07 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -2530,6 +2530,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
public void osNpcSay(LSL_Key npc, string message)
+ {
+ osNpcSay(npc, 0, message);
+ }
+
+ public void osNpcSay(LSL_Key npc, int channel, string message)
{
CheckThreatLevel(ThreatLevel.High, "osNpcSay");
m_host.AddScriptLPS(1);
@@ -2542,7 +2547,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (!module.CheckPermissions(npcId, m_host.OwnerID))
return;
- module.Say(npcId, World, message);
+ module.Say(npcId, World, message, channel);
+ }
+ }
+
+ public void osNpcShout(LSL_Key npc, int channel, string message)
+ {
+ CheckThreatLevel(ThreatLevel.High, "osNpcShout");
+ m_host.AddScriptLPS(1);
+
+ INPCModule module = World.RequestModuleInterface();
+ if (module != null)
+ {
+ UUID npcId = new UUID(npc.m_string);
+
+ if (!module.CheckPermissions(npcId, m_host.OwnerID))
+ return;
+
+ module.Shout(npcId, World, message, channel);
}
}
@@ -2627,6 +2649,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
}
+ public void osNpcWhisper(LSL_Key npc, int channel, string message)
+ {
+ CheckThreatLevel(ThreatLevel.High, "osNpcWhisper");
+ m_host.AddScriptLPS(1);
+
+ INPCModule module = World.RequestModuleInterface();
+ if (module != null)
+ {
+ UUID npcId = new UUID(npc.m_string);
+
+ if (!module.CheckPermissions(npcId, m_host.OwnerID))
+ return;
+
+ module.Whisper(npcId, World, message, channel);
+ }
+ }
+
///
/// Save the current appearance of the script owner permanently to the named notecard.
///
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
index 545bbeea70..2d3e8e8bff 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -203,11 +203,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
void osNpcSetRot(LSL_Key npc, rotation rot);
void osNpcStopMoveToTarget(LSL_Key npc);
void osNpcSay(key npc, string message);
+ void osNpcSay(key npc, int channel, string message);
+ void osNpcShout(key npc, int channel, string message);
void osNpcSit(key npc, key target, int options);
void osNpcStand(LSL_Key npc);
void osNpcRemove(key npc);
void osNpcPlayAnimation(LSL_Key npc, string animation);
void osNpcStopAnimation(LSL_Key npc, string animation);
+ void osNpcWhisper(key npc, int channel, string message);
LSL_Key osOwnerSaveAppearance(string notecard);
LSL_Key osAgentSaveAppearance(key agentId, 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 b94b9bffe0..e8369597c2 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -569,6 +569,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
m_OSSL_Functions.osNpcSay(npc, message);
}
+ public void osNpcSay(key npc, int channel, string message)
+ {
+ m_OSSL_Functions.osNpcSay(npc, channel, message);
+ }
+
+
+ public void osNpcShout(key npc, int channel, string message)
+ {
+ m_OSSL_Functions.osNpcShout(npc, channel, message);
+ }
+
public void osNpcSit(LSL_Key npc, LSL_Key target, int options)
{
m_OSSL_Functions.osNpcSit(npc, target, options);
@@ -594,6 +605,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
m_OSSL_Functions.osNpcStopAnimation(npc, animation);
}
+ public void osNpcWhisper(key npc, int channel, string message)
+ {
+ m_OSSL_Functions.osNpcWhisper(npc, channel, message);
+ }
+
public LSL_Key osOwnerSaveAppearance(string notecard)
{
return m_OSSL_Functions.osOwnerSaveAppearance(notecard);