* Major structural change: Begun converting Events to use (caller, args) syntax to conform with .NET guidelines.
* OnChatFromViewer has been converted as an example. * Bug: SimpleApp's NPC client does not implement a Scene property and will likely crash with a NullReferenceException when it attempts to chat.afrisby
parent
9a17bc58a6
commit
1313544ac7
|
@ -34,8 +34,108 @@ using OpenSim.Framework.Types;
|
||||||
|
|
||||||
namespace OpenSim.Framework.Interfaces
|
namespace OpenSim.Framework.Interfaces
|
||||||
{
|
{
|
||||||
|
// Base Args Interface
|
||||||
|
public interface IEventArgs
|
||||||
|
{
|
||||||
|
IScene Scene
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
|
||||||
|
IClientAPI Sender
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public delegate void ViewerEffectEventHandler(IClientAPI sender, ViewerEffectPacket.EffectBlock[] effectBlock);
|
public delegate void ViewerEffectEventHandler(IClientAPI sender, ViewerEffectPacket.EffectBlock[] effectBlock);
|
||||||
public delegate void ChatFromViewer(byte[] message, byte type, int channel, LLVector3 fromPos, string fromName, LLUUID fromAgentID);
|
|
||||||
|
public delegate void ChatFromViewer(Object sender, ChatFromViewerArgs e);
|
||||||
|
|
||||||
|
public enum ChatTypeEnum { Whisper = 0, Say = 1, Shout = 2, Broadcast = 0xFF };
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ChatFromViewer Arguments
|
||||||
|
/// </summary>
|
||||||
|
public class ChatFromViewerArgs : EventArgs, IEventArgs
|
||||||
|
{
|
||||||
|
protected string m_message;
|
||||||
|
protected ChatTypeEnum m_type;
|
||||||
|
protected int m_channel;
|
||||||
|
protected LLVector3 m_position;
|
||||||
|
protected string m_from;
|
||||||
|
|
||||||
|
protected IClientAPI m_sender;
|
||||||
|
protected IScene m_scene;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The message sent by the user
|
||||||
|
/// </summary>
|
||||||
|
public string Message
|
||||||
|
{
|
||||||
|
get { return m_message; }
|
||||||
|
set { m_message = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The type of message, eg say, shout, broadcast.
|
||||||
|
/// </summary>
|
||||||
|
public ChatTypeEnum Type
|
||||||
|
{
|
||||||
|
get { return m_type; }
|
||||||
|
set { m_type = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Which channel was this message sent on? Different channels may have different listeners. Public chat is on channel zero.
|
||||||
|
/// </summary>
|
||||||
|
public int Channel
|
||||||
|
{
|
||||||
|
get { return m_channel; }
|
||||||
|
set { m_channel = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The position of the sender at the time of the message broadcast.
|
||||||
|
/// </summary>
|
||||||
|
public LLVector3 Position
|
||||||
|
{
|
||||||
|
get { return m_position; }
|
||||||
|
set { m_position = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The name of the sender (needed for scripts)
|
||||||
|
/// </summary>
|
||||||
|
public string From
|
||||||
|
{
|
||||||
|
get { return m_from; }
|
||||||
|
set { m_from = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The client responsible for sending the message, or null.
|
||||||
|
/// </summary>
|
||||||
|
public IClientAPI Sender
|
||||||
|
{
|
||||||
|
get { return m_sender; }
|
||||||
|
set { m_sender = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public IScene Scene
|
||||||
|
{
|
||||||
|
get { return m_scene; }
|
||||||
|
set { m_scene = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChatFromViewerArgs()
|
||||||
|
{
|
||||||
|
m_position = new LLVector3();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public delegate void ImprovedInstantMessage(LLUUID fromAgentID, LLUUID fromAgentSession, LLUUID toAgentID, LLUUID imSessionID, uint timestamp, string fromAgentName, string message, byte dialog); // Cut down from full list
|
public delegate void ImprovedInstantMessage(LLUUID fromAgentID, LLUUID fromAgentSession, LLUUID toAgentID, LLUUID imSessionID, uint timestamp, string fromAgentName, string message, byte dialog); // Cut down from full list
|
||||||
public delegate void RezObject(IClientAPI remoteClient, LLUUID itemID, LLVector3 pos);
|
public delegate void RezObject(IClientAPI remoteClient, LLUUID itemID, LLVector3 pos);
|
||||||
public delegate void ModifyTerrain(float height, float seconds, byte size, byte action, float north, float west, IClientAPI remoteClient);
|
public delegate void ModifyTerrain(float height, float seconds, byte size, byte action, float north, float west, IClientAPI remoteClient);
|
||||||
|
|
|
@ -100,7 +100,17 @@ namespace OpenSim.Region.ClientStack
|
||||||
|
|
||||||
if (OnChatFromViewer != null)
|
if (OnChatFromViewer != null)
|
||||||
{
|
{
|
||||||
this.OnChatFromViewer(message, type, channel, fromPos, fromName, fromAgentID);
|
ChatFromViewerArgs args = new ChatFromViewerArgs();
|
||||||
|
args.Channel = channel;
|
||||||
|
args.From = fromName;
|
||||||
|
args.Message = Util.FieldToString(message);
|
||||||
|
args.Type = (ChatTypeEnum)type;
|
||||||
|
args.Position = fromPos;
|
||||||
|
|
||||||
|
args.Scene = Scene;
|
||||||
|
args.Sender = this;
|
||||||
|
|
||||||
|
this.OnChatFromViewer(this, args);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PacketType.ImprovedInstantMessage:
|
case PacketType.ImprovedInstantMessage:
|
||||||
|
|
|
@ -68,7 +68,14 @@ namespace OpenSim.Region.ClientStack
|
||||||
//private AgentAssetUpload UploadAssets;
|
//private AgentAssetUpload UploadAssets;
|
||||||
private LLUUID newAssetFolder = LLUUID.Zero;
|
private LLUUID newAssetFolder = LLUUID.Zero;
|
||||||
private int debug = 0;
|
private int debug = 0;
|
||||||
|
|
||||||
protected IScene m_scene;
|
protected IScene m_scene;
|
||||||
|
|
||||||
|
public IScene Scene
|
||||||
|
{
|
||||||
|
get { return m_scene; }
|
||||||
|
}
|
||||||
|
|
||||||
private ClientManager m_clientManager;
|
private ClientManager m_clientManager;
|
||||||
private AssetCache m_assetCache;
|
private AssetCache m_assetCache;
|
||||||
// private InventoryCache m_inventoryCache;
|
// private InventoryCache m_inventoryCache;
|
||||||
|
|
|
@ -32,6 +32,6 @@ namespace OpenSim.Region.Environment.Interfaces
|
||||||
{
|
{
|
||||||
public interface ISimChat
|
public interface ISimChat
|
||||||
{
|
{
|
||||||
void SimChat(byte[] message, byte type, int channel, LLVector3 fromPos, string fromName, LLUUID fromAgentID);
|
void SimChat(System.Object sender, OpenSim.Framework.Interfaces.ChatFromViewerArgs e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,15 +33,16 @@ using System.Threading;
|
||||||
using libsecondlife;
|
using libsecondlife;
|
||||||
using OpenSim.Framework.Interfaces;
|
using OpenSim.Framework.Interfaces;
|
||||||
using OpenSim.Framework.Utilities;
|
using OpenSim.Framework.Utilities;
|
||||||
|
using OpenSim.Framework.Console;
|
||||||
using OpenSim.Region.Environment.Interfaces;
|
using OpenSim.Region.Environment.Interfaces;
|
||||||
using OpenSim.Region.Environment.Scenes;
|
using OpenSim.Region.Environment.Scenes;
|
||||||
using Nini.Config;
|
|
||||||
|
|
||||||
namespace OpenSim.Region.Environment.Modules
|
namespace OpenSim.Region.Environment.Modules
|
||||||
{
|
{
|
||||||
public class ChatModule : IRegionModule, ISimChat
|
public class ChatModule : IRegionModule, ISimChat
|
||||||
{
|
{
|
||||||
private Scene m_scene;
|
private Scene m_scene;
|
||||||
|
private LogBase m_log;
|
||||||
|
|
||||||
private string m_server = null;
|
private string m_server = null;
|
||||||
private int m_port = 6668;
|
private int m_port = 6668;
|
||||||
|
@ -65,10 +66,12 @@ namespace OpenSim.Region.Environment.Modules
|
||||||
m_nick = "OSimBot" + Util.RandomClass.Next(1, 99);
|
m_nick = "OSimBot" + Util.RandomClass.Next(1, 99);
|
||||||
m_irc = null;
|
m_irc = null;
|
||||||
m_ircWriter = null;
|
m_ircWriter = null;
|
||||||
m_ircReader = null;
|
m_ircReader = null;
|
||||||
|
|
||||||
|
m_log = OpenSim.Framework.Console.MainLog.Instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Initialise(Scene scene, IConfigSource config)
|
public void Initialise(Scene scene, Nini.Config.IConfigSource config)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
m_server = config.Configs["IRC"].GetString("server");
|
m_server = config.Configs["IRC"].GetString("server");
|
||||||
|
@ -175,41 +178,80 @@ namespace OpenSim.Region.Environment.Modules
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SimChat(byte[] message, byte type, int channel, LLVector3 fromPos, string fromName,
|
public void SimChat(Object sender, ChatFromViewerArgs e)
|
||||||
LLUUID fromAgentID)
|
|
||||||
{
|
{
|
||||||
ScenePresence avatar = null;
|
ScenePresence avatar = null;
|
||||||
avatar = m_scene.GetScenePresence(fromAgentID);
|
|
||||||
|
//TODO: Move ForEachScenePresence and others into IScene.
|
||||||
|
Scene scene = (Scene)e.Scene;
|
||||||
|
|
||||||
|
//TODO: Remove the need for this check
|
||||||
|
if (scene == null)
|
||||||
|
scene = m_scene;
|
||||||
|
|
||||||
|
// Filled in since it's easier than rewriting right now.
|
||||||
|
LLVector3 fromPos = e.Position;
|
||||||
|
string fromName = e.From;
|
||||||
|
string message = e.Message;
|
||||||
|
byte type = (byte)e.Type;
|
||||||
|
LLUUID fromAgentID = LLUUID.Zero;
|
||||||
|
|
||||||
|
if (e.Sender != null)
|
||||||
|
avatar = scene.GetScenePresence(e.Sender.AgentId);
|
||||||
|
|
||||||
if (avatar != null)
|
if (avatar != null)
|
||||||
{
|
{
|
||||||
fromPos = avatar.AbsolutePosition;
|
fromPos = avatar.AbsolutePosition;
|
||||||
fromName = avatar.Firstname + " " + avatar.Lastname;
|
fromName = avatar.Firstname + " " + avatar.Lastname;
|
||||||
|
fromAgentID = e.Sender.AgentId;
|
||||||
avatar = null;
|
avatar = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string typeName;
|
||||||
|
switch (e.Type)
|
||||||
|
{
|
||||||
|
case ChatTypeEnum.Broadcast:
|
||||||
|
typeName = "broadcasts";
|
||||||
|
break;
|
||||||
|
case ChatTypeEnum.Say:
|
||||||
|
typeName = "says";
|
||||||
|
break;
|
||||||
|
case ChatTypeEnum.Shout:
|
||||||
|
typeName = "shouts";
|
||||||
|
break;
|
||||||
|
case ChatTypeEnum.Whisper:
|
||||||
|
typeName = "whispers";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
typeName = "unknown";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_log.Verbose("CHAT", fromName + " (" + e.Channel + ") " + typeName + ": " + e.Message);
|
||||||
|
|
||||||
if (connected)
|
if (connected)
|
||||||
{
|
{
|
||||||
m_ircWriter.WriteLine("PRIVMSG " + m_channel + " :" + "<" + fromName + ">: " +
|
m_ircWriter.WriteLine("PRIVMSG " + m_channel + " :" + "<" + fromName + ">: " +
|
||||||
Util.FieldToString(message));
|
e.Message);
|
||||||
m_ircWriter.Flush();
|
m_ircWriter.Flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (channel == 0)
|
if (e.Channel == 0)
|
||||||
{
|
{
|
||||||
m_scene.ForEachScenePresence(delegate(ScenePresence presence)
|
scene.ForEachScenePresence(delegate(ScenePresence presence)
|
||||||
{
|
{
|
||||||
int dis = -1000;
|
int dis = -1000;
|
||||||
|
|
||||||
//err ??? the following code seems to be request a scenePresence when it already has a ref to it
|
//err ??? the following code seems to be request a scenePresence when it already has a ref to it
|
||||||
avatar = m_scene.GetScenePresence(presence.ControllingClient.AgentId);
|
avatar = scene.GetScenePresence(presence.ControllingClient.AgentId);
|
||||||
if (avatar != null)
|
if (avatar != null)
|
||||||
{
|
{
|
||||||
dis = (int) avatar.AbsolutePosition.GetDistanceTo(fromPos);
|
dis = (int) avatar.AbsolutePosition.GetDistanceTo(fromPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (type)
|
switch (e.Type)
|
||||||
{
|
{
|
||||||
case 0: // Whisper
|
case ChatTypeEnum.Whisper:
|
||||||
if ((dis < 10) && (dis > -10))
|
if ((dis < 10) && (dis > -10))
|
||||||
{
|
{
|
||||||
//should change so the message is sent through the avatar rather than direct to the ClientView
|
//should change so the message is sent through the avatar rather than direct to the ClientView
|
||||||
|
@ -220,7 +262,7 @@ namespace OpenSim.Region.Environment.Modules
|
||||||
fromAgentID);
|
fromAgentID);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1: // Say
|
case ChatTypeEnum.Say:
|
||||||
if ((dis < 30) && (dis > -30))
|
if ((dis < 30) && (dis > -30))
|
||||||
{
|
{
|
||||||
//Console.WriteLine("sending chat");
|
//Console.WriteLine("sending chat");
|
||||||
|
@ -231,7 +273,7 @@ namespace OpenSim.Region.Environment.Modules
|
||||||
fromAgentID);
|
fromAgentID);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2: // Shout
|
case ChatTypeEnum.Shout:
|
||||||
if ((dis < 100) && (dis > -100))
|
if ((dis < 100) && (dis > -100))
|
||||||
{
|
{
|
||||||
presence.ControllingClient.SendChatMessage(message,
|
presence.ControllingClient.SendChatMessage(message,
|
||||||
|
@ -242,7 +284,7 @@ namespace OpenSim.Region.Environment.Modules
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xff: // Broadcast
|
case ChatTypeEnum.Broadcast:
|
||||||
presence.ControllingClient.SendChatMessage(message, type,
|
presence.ControllingClient.SendChatMessage(message, type,
|
||||||
fromPos,
|
fromPos,
|
||||||
fromName,
|
fromName,
|
||||||
|
|
|
@ -119,13 +119,12 @@ namespace OpenSim.Region.Environment.Modules
|
||||||
client.OnChatFromViewer += DeliverClientMessage;
|
client.OnChatFromViewer += DeliverClientMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DeliverClientMessage(byte[] message, byte type, int channel, LLVector3 fromPos, string fromName,
|
private void DeliverClientMessage(Object sender, ChatFromViewerArgs e)
|
||||||
LLUUID fromAgentID)
|
|
||||||
{
|
{
|
||||||
ASCIIEncoding ae = new ASCIIEncoding();
|
DeliverMessage(e.Sender.AgentId.ToString(),
|
||||||
|
(int)e.Type, e.Channel,
|
||||||
DeliverMessage(fromAgentID.ToString(), type, channel, fromName, ae.GetString(message));
|
e.Sender.FirstName + " " + e.Sender.LastName,
|
||||||
|
e.Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int Listen(uint localID, LLUUID itemID, LLUUID hostID, int channel, string name, string id, string msg)
|
public int Listen(uint localID, LLUUID itemID, LLUUID hostID, int channel, string name, string id, string msg)
|
||||||
|
|
|
@ -70,7 +70,22 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
{
|
{
|
||||||
if (m_simChatModule != null)
|
if (m_simChatModule != null)
|
||||||
{
|
{
|
||||||
m_simChatModule.SimChat(message, type, channel, fromPos, fromName, fromAgentID);
|
ChatFromViewerArgs args = new ChatFromViewerArgs();
|
||||||
|
|
||||||
|
args.Message = OpenSim.Framework.Utilities.Util.FieldToString(message);
|
||||||
|
args.Channel = channel;
|
||||||
|
args.Type = (ChatTypeEnum)type;
|
||||||
|
args.Position = fromPos;
|
||||||
|
|
||||||
|
ScenePresence user = this.GetScenePresence(fromAgentID);
|
||||||
|
if (user != null)
|
||||||
|
args.Sender = user.ControllingClient;
|
||||||
|
else
|
||||||
|
args.Sender = null;
|
||||||
|
|
||||||
|
args.From = fromName;
|
||||||
|
|
||||||
|
m_simChatModule.SimChat(this, args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -245,7 +245,15 @@ namespace SimpleApp
|
||||||
{
|
{
|
||||||
if (OnChatFromViewer != null)
|
if (OnChatFromViewer != null)
|
||||||
{
|
{
|
||||||
this.OnChatFromViewer(enc.GetBytes("Kind of quiet around here, isn't it! \0"), 2, 0, new LLVector3(128, 128, 26), this.FirstName + " " + this.LastName, this.AgentId);
|
ChatFromViewerArgs args = new ChatFromViewerArgs();
|
||||||
|
args.Message = "Kinda quiet around here, isn't it?";
|
||||||
|
args.Channel = 0;
|
||||||
|
args.From = this.FirstName + " " + this.LastName;
|
||||||
|
args.Position = new LLVector3(128, 128, 26);
|
||||||
|
args.Sender = this;
|
||||||
|
args.Type = ChatTypeEnum.Shout;
|
||||||
|
|
||||||
|
this.OnChatFromViewer(this, args);
|
||||||
}
|
}
|
||||||
count = -1;
|
count = -1;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue