void ChatFromViewerHandler(Packet packet, Agent agent) { ChatFromViewerPacket viewerChat = (ChatFromViewerPacket)packet; string message = Utils.BytesToString(viewerChat.ChatData.Message); if (viewerChat.ChatData.Channel != 0 || (message.Length > 0 && message.Substring(0, 1) == "/")) { return; //not public chat } //TODO: add distance constraints to AudibleLevel and Message ChatFromSimulatorPacket chat = new ChatFromSimulatorPacket(); chat.ChatData.Audible = (byte)ChatAudibleLevel.Fully; chat.ChatData.ChatType = viewerChat.ChatData.Type; chat.ChatData.OwnerID = agent.AgentID; chat.ChatData.SourceID = agent.AgentID; chat.ChatData.SourceType = (byte)ChatSourceType.Agent; chat.ChatData.Position = agent.Avatar.Position; chat.ChatData.FromName = Utils.StringToBytes(agent.Avatar.Name); chat.ChatData.Message = viewerChat.ChatData.Message; server.UDP.BroadcastPacket(chat, PacketCategory.Transaction); }
private void SendTypingPackets(QueuedInterestListEvent[] eventDatas, IScenePresence presence) { if (!(presence is LLAgent) || presence.InterestList == null) { return; } LLAgent agent = (LLAgent)presence; // We can't combine chat blocks together, so send a packet for each typing event // that is pulled off the event queue for (int i = 0; i < eventDatas.Length; i++) { TypingData data = (TypingData)eventDatas[i].Event.State; ChatAudibleLevel audible = GetAudibleLevel(data.Source.ScenePosition, presence.ScenePosition, NORMAL_DIST); ChatFromSimulatorPacket packet = new ChatFromSimulatorPacket(); packet.ChatData.Audible = (byte)audible; packet.ChatData.ChatType = (byte)(data.StartTyping ? ChatType.StartTyping : ChatType.StopTyping); packet.ChatData.FromName = Utils.StringToBytes(data.Source.Name); packet.ChatData.Message = Utils.EmptyBytes; packet.ChatData.OwnerID = data.Source.OwnerID; packet.ChatData.Position = data.Source.ScenePosition; packet.ChatData.SourceID = data.Source.ID; packet.ChatData.SourceType = (byte)ChatSourceType.Agent; m_udp.SendPacket(agent, packet, ThrottleCategory.Task, false); } }
/// <summary> /// Take an incoming Chat packet, auto-parse, and if OnChat is defined call /// that with the appropriate arguments. /// </summary> /// <param name="packet">Incoming ChatFromSimulatorPacket</param> /// <param name="simulator">[UNUSED]</param> private void ChatHandler(Packet packet, Simulator simulator) { if (packet.Type == PacketType.ChatFromSimulator) { ChatFromSimulatorPacket chat = (ChatFromSimulatorPacket)packet; if (OnChat != null) { OnChat(Helpers.FieldToString(chat.ChatData.Message), chat.ChatData.Audible, chat.ChatData.ChatType, chat.ChatData.SourceType, Helpers.FieldToString(chat.ChatData.FromName), chat.ChatData.SourceID); } } }
public bool SimChat(SimClient simClient, Packet packet) { System.Text.Encoding enc = System.Text.Encoding.ASCII; ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)packet; if (Util.FieldToString(inchatpack.ChatData.Message) == "") { //empty message so don't bother with it return(true); } libsecondlife.Packets.ChatFromSimulatorPacket reply = new ChatFromSimulatorPacket(); reply.ChatData.Audible = 1; reply.ChatData.Message = inchatpack.ChatData.Message; reply.ChatData.ChatType = inchatpack.ChatData.Type; reply.ChatData.SourceType = 1; reply.ChatData.Position = simClient.ClientAvatar.Pos; reply.ChatData.FromName = enc.GetBytes(simClient.ClientAvatar.firstname + " " + simClient.ClientAvatar.lastname + "\0"); reply.ChatData.OwnerID = simClient.AgentID; reply.ChatData.SourceID = simClient.AgentID; foreach (SimClient client in m_clientThreads.Values) { switch (inchatpack.ChatData.Type) { case 0: int dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X), (int)(client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y)); if ((dis < 10) && (dis > -10)) { client.OutPacket(reply); } break; case 1: dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X), (int)(client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y)); if ((dis < 30) && (dis > -30)) { client.OutPacket(reply); } break; case 2: dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X), (int)(client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y)); if ((dis < 100) && (dis > -100)) { client.OutPacket(reply); } break; } } return(true); }
/// <summary> /// Send a message to the viewer /// </summary> /// <param name="fromName">A string containing text indicating the origin of the message</param> /// <param name="message">A string containing the message to send</param> public void SayToUser(string fromName, string message) { ChatFromSimulatorPacket packet = new ChatFromSimulatorPacket(); packet.ChatData.SourceID = UUID.Random(); packet.ChatData.FromName = Utils.StringToBytes(fromName); packet.ChatData.OwnerID = agentID; packet.ChatData.SourceType = (byte)2; packet.ChatData.ChatType = (byte)1; packet.ChatData.Audible = (byte)1; packet.ChatData.Position = new Vector3(0, 0, 0); packet.ChatData.Message = Utils.StringToBytes(message); proxy.InjectPacket(packet, Direction.Incoming); }
// SayToUser: send a message to the user as in-world chat public void SayToUser(string message) { ChatFromSimulatorPacket packet = new ChatFromSimulatorPacket(); packet.ChatData.FromName = Helpers.StringToField("SLProxy"); packet.ChatData.SourceID = LLUUID.Random(); packet.ChatData.OwnerID = agentID; packet.ChatData.SourceType = (byte)2; packet.ChatData.ChatType = (byte)1; packet.ChatData.Audible = (byte)1; packet.ChatData.Position = new LLVector3(0, 0, 0); packet.ChatData.Message = Helpers.StringToField(message); proxy.InjectPacket(packet, Direction.Incoming); }
private Packet InChatFromServerHandler(Packet packet, IPEndPoint sim) { ChatFromSimulatorPacket chat = (ChatFromSimulatorPacket)packet; //if (chat.ChatData.OwnerID != this.frame.AgentID) //{ string chatMsg = Utils.BytesToString(chat.ChatData.Message); //Console.WriteLine(chatMsg); if (chatMsg.StartsWith(this.brand)) { form.log("We got a chat with " + chatMsg, Color.GreenYellow); chat.ChatData.Message = Utils.StringToBytes(shadow_decrypt(chatMsg.Substring(this.brand.Length))); } //} return(chat); }
private static Packet ChatFromSimulator(Packet packet, IPEndPoint sim) { // deconstruct the packet ChatFromSimulatorPacket chat = (ChatFromSimulatorPacket)packet; string message = Helpers.FieldToString(chat.ChatData.Message); string name = Helpers.FieldToString(chat.ChatData.FromName); byte audible = chat.ChatData.Audible; byte type = chat.ChatData.ChatType; // if this was a normal, audible message, write it to the console if (audible != 0 && (type == 0 || type == 1 || type == 2)) { Console.WriteLine(name + ": " + message); } // return the packet unmodified return(packet); }
void ChatFromViewerHandler(Packet packet, Agent agent) { ChatFromViewerPacket viewerChat = (ChatFromViewerPacket)packet; if (viewerChat.ChatData.Channel != 0) return; //not public chat //TODO: add distance constraints to AudibleLevel and Message ChatFromSimulatorPacket chat = new ChatFromSimulatorPacket(); chat.ChatData.Audible = (byte)ChatAudibleLevel.Fully; chat.ChatData.ChatType = viewerChat.ChatData.Type; chat.ChatData.OwnerID = agent.AgentID; chat.ChatData.SourceID = agent.AgentID; chat.ChatData.SourceType = (byte)ChatSourceType.Agent; chat.ChatData.Position = agent.Avatar.Position; chat.ChatData.FromName = Utils.StringToBytes(agent.Avatar.Name); chat.ChatData.Message = viewerChat.ChatData.Message; lock (Server.Agents) { foreach(Agent recipient in Server.Agents.Values) recipient.SendPacket(chat); } }
// SayToUser: send a message to the user as in-world chat public void SayToUser(string message) { ChatFromSimulatorPacket packet = new ChatFromSimulatorPacket(); packet.ChatData.FromName = Utils.StringToBytes("GridProxy"); packet.ChatData.SourceID = UUID.Random(); packet.ChatData.OwnerID = agentID; packet.ChatData.SourceType = (byte)2; packet.ChatData.ChatType = (byte)1; packet.ChatData.Audible = (byte)1; packet.ChatData.Position = new Vector3(0, 0, 0); packet.ChatData.Message = Utils.StringToBytes(message); proxy.InjectPacket(packet, Direction.Incoming); }
// SayToUser: send a message to the user as in-world chat private void SayToUser(string message) { ChatFromSimulatorPacket packet = new ChatFromSimulatorPacket(); packet.ChatData.FromName = Helpers.StringToField("Analyst"); packet.ChatData.SourceID = LLUUID.Random(); packet.ChatData.OwnerID = frame.AgentID; packet.ChatData.SourceType = (byte)2; packet.ChatData.ChatType = (byte)1; packet.ChatData.Audible = (byte)1; packet.ChatData.Position = new LLVector3(0, 0, 0); packet.ChatData.Message = Helpers.StringToField(message); proxy.InjectPacket(packet, Direction.Incoming); }
public bool SimChat(SimClient simClient, Packet packet) { System.Text.Encoding enc = System.Text.Encoding.ASCII; ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)packet; if (Util.FieldToString(inchatpack.ChatData.Message) == "") { //empty message so don't bother with it return true; } libsecondlife.Packets.ChatFromSimulatorPacket reply = new ChatFromSimulatorPacket(); reply.ChatData.Audible = 1; reply.ChatData.Message = inchatpack.ChatData.Message; reply.ChatData.ChatType = inchatpack.ChatData.Type; reply.ChatData.SourceType = 1; reply.ChatData.Position = simClient.ClientAvatar.Pos; reply.ChatData.FromName = enc.GetBytes(simClient.ClientAvatar.firstname + " " + simClient.ClientAvatar.lastname + "\0"); reply.ChatData.OwnerID = simClient.AgentID; reply.ChatData.SourceID = simClient.AgentID; foreach (SimClient client in m_clientThreads.Values) { switch (inchatpack.ChatData.Type) { case 0: int dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X),(int)( client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y)); if ((dis < 10) && (dis > -10)) { client.OutPacket(reply); } break; case 1: dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X), (int)(client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y)); if ((dis < 30) && (dis > -30)) { client.OutPacket(reply); } break; case 2: dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X),(int)( client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y)); if ((dis < 100) && (dis > -100)) { client.OutPacket(reply); } break; } } return true; }
private void SendTypingPackets(QueuedInterestListEvent[] eventDatas, IScenePresence presence) { if (!(presence is LLAgent) || presence.InterestList == null) return; LLAgent agent = (LLAgent)presence; // We can't combine chat blocks together, so send a packet for each typing event // that is pulled off the event queue for (int i = 0; i < eventDatas.Length; i++) { TypingData data = (TypingData)eventDatas[i].Event.State; ChatAudibleLevel audible = GetAudibleLevel(data.Source.ScenePosition, presence.ScenePosition, NORMAL_DIST); ChatFromSimulatorPacket packet = new ChatFromSimulatorPacket(); packet.ChatData.Audible = (byte)audible; packet.ChatData.ChatType = (byte)(data.StartTyping ? ChatType.StartTyping : ChatType.StopTyping); packet.ChatData.FromName = Utils.StringToBytes(data.Source.Name); packet.ChatData.Message = Utils.EmptyBytes; packet.ChatData.OwnerID = data.Source.OwnerID; packet.ChatData.Position = data.Source.ScenePosition; packet.ChatData.SourceID = data.Source.ID; packet.ChatData.SourceType = (byte)ChatSourceType.Agent; m_udp.SendPacket(agent, packet, ThrottleCategory.Task, false); } }
private void SendChatPackets(QueuedInterestListEvent[] eventDatas, IScenePresence presence) { if (!(presence is LLAgent) || presence.InterestList == null) return; LLAgent agent = (LLAgent)presence; // We can't combine chat blocks together, so send a packet for each chat event // that is pulled off the event queue for (int i = 0; i < eventDatas.Length; i++) { ChatArgs data = (ChatArgs)eventDatas[i].Event.State; ChatAudibleLevel audible; ChatType type; string sourceName; ChatSourceType sourceType; string message; ChatFromSimulatorPacket packet = new ChatFromSimulatorPacket(); if (data.Source == null) { // System message audible = ChatAudibleLevel.Fully; type = ChatType.Normal; sourceName = m_scene.Name; message = data.Message; sourceType = ChatSourceType.System; packet.ChatData.FromName = Utils.StringToBytes(m_scene.Name); packet.ChatData.OwnerID = UUID.Zero; packet.ChatData.Position = Vector3.Zero; packet.ChatData.SourceID = m_scene.ID; } else { // Message from an agent or object sourceName = data.Source.Name; switch (data.Type) { case EntityChatType.Debug: type = ChatType.Debug; audible = ChatAudibleLevel.Fully; break; case EntityChatType.Owner: type = ChatType.OwnerSay; audible = ChatAudibleLevel.Fully; break; case EntityChatType.Broadcast: type = ChatType.Normal; audible = ChatAudibleLevel.Fully; break; default: type = GetChatType(data.AudibleDistance); audible = GetAudibleLevel(data.Source.ScenePosition, presence.ScenePosition, data.AudibleDistance); break; } if (audible == ChatAudibleLevel.Fully) message = data.Message; else message = String.Empty; if (data.Source is IScenePresence) sourceType = ChatSourceType.Agent; else sourceType = ChatSourceType.Object; packet.ChatData.FromName = Utils.StringToBytes(data.Source.Name); packet.ChatData.OwnerID = data.Source.OwnerID; packet.ChatData.Position = data.Source.ScenePosition; packet.ChatData.SourceID = data.Source.ID; } packet.ChatData.Audible = (byte)audible; packet.ChatData.ChatType = (byte)type; packet.ChatData.Message = Utils.StringToBytes(message); packet.ChatData.SourceType = (byte)sourceType; m_udp.SendPacket(agent, packet, ThrottleCategory.Task, false); } }
public void ObjectChat(object sender, UUID ownerID, UUID sourceID, ChatAudibleLevel audible, ChatType type, ChatSourceType sourceType, string fromName, Vector3 position, int channel, string message) { if (OnObjectChat != null) { OnObjectChat(sender, ownerID, sourceID, audible, type, sourceType, fromName, position, channel, message); } if (channel == 0) { // TODO: Reduction provider will impose the chat radius ChatFromSimulatorPacket chat = new ChatFromSimulatorPacket(); chat.ChatData.Audible = (byte)audible; chat.ChatData.ChatType = (byte)type; chat.ChatData.OwnerID = ownerID; chat.ChatData.SourceID = sourceID; chat.ChatData.SourceType = (byte)sourceType; chat.ChatData.Position = position; chat.ChatData.FromName = Utils.StringToBytes(fromName); chat.ChatData.Message = Utils.StringToBytes(message); udp.BroadcastPacket(chat, PacketCategory.Messaging); } }
private void SendChatPackets(QueuedInterestListEvent[] eventDatas, IScenePresence presence) { if (!(presence is LLAgent) || presence.InterestList == null) { return; } LLAgent agent = (LLAgent)presence; // We can't combine chat blocks together, so send a packet for each chat event // that is pulled off the event queue for (int i = 0; i < eventDatas.Length; i++) { ChatArgs data = (ChatArgs)eventDatas[i].Event.State; ChatAudibleLevel audible; ChatType type; string sourceName; ChatSourceType sourceType; string message; ChatFromSimulatorPacket packet = new ChatFromSimulatorPacket(); if (data.Source == null) { // System message audible = ChatAudibleLevel.Fully; type = ChatType.Normal; sourceName = m_scene.Name; message = data.Message; sourceType = ChatSourceType.System; packet.ChatData.FromName = Utils.StringToBytes(m_scene.Name); packet.ChatData.OwnerID = UUID.Zero; packet.ChatData.Position = Vector3.Zero; packet.ChatData.SourceID = m_scene.ID; } else { // Message from an agent or object sourceName = data.Source.Name; switch (data.Type) { case EntityChatType.Debug: type = ChatType.Debug; audible = ChatAudibleLevel.Fully; break; case EntityChatType.Owner: type = ChatType.OwnerSay; audible = ChatAudibleLevel.Fully; break; case EntityChatType.Broadcast: type = ChatType.Normal; audible = ChatAudibleLevel.Fully; break; default: type = GetChatType(data.AudibleDistance); audible = GetAudibleLevel(data.Source.ScenePosition, presence.ScenePosition, data.AudibleDistance); break; } if (audible == ChatAudibleLevel.Fully) { message = data.Message; } else { message = String.Empty; } if (data.Source is IScenePresence) { sourceType = ChatSourceType.Agent; } else { sourceType = ChatSourceType.Object; } packet.ChatData.FromName = Utils.StringToBytes(data.Source.Name); packet.ChatData.OwnerID = data.Source.OwnerID; packet.ChatData.Position = data.Source.ScenePosition; packet.ChatData.SourceID = data.Source.ID; } packet.ChatData.Audible = (byte)audible; packet.ChatData.ChatType = (byte)type; packet.ChatData.Message = Utils.StringToBytes(message); packet.ChatData.SourceType = (byte)sourceType; m_udp.SendPacket(agent, packet, ThrottleCategory.Task, false); } }
// SayToUser: send a message to the user as in-world chat private void SayToUser(string message) { ChatFromSimulatorPacket packet = new ChatFromSimulatorPacket(); packet.ChatData.FromName = Utils.StringToBytes("ClientAO"); packet.ChatData.SourceID = Guid.NewGuid(); packet.ChatData.OwnerID = frame.AgentID; packet.ChatData.SourceType = (byte)2; packet.ChatData.ChatType = (byte)1; packet.ChatData.Audible = (byte)1; packet.ChatData.Position = new Vector3(0, 0, 0); packet.ChatData.Message = Utils.StringToBytes(message); proxy.InjectPacket(packet, Direction.Incoming); }