示例#1
0
        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);
        }
示例#2
0
文件: Chat.cs 项目: jhurliman/simian
        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);
            }
        }
示例#3
0
        /// <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);
        }
示例#5
0
        /// <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);
        }
示例#6
0
        // 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);
        }
示例#7
0
        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);
        }
示例#8
0
    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);
    }
示例#9
0
文件: Chat.cs 项目: RavenB/gridsearch
        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);
            }
        }
示例#10
0
 // 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);
 }
示例#11
0
 // 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;
        }
示例#13
0
文件: Chat.cs 项目: thoys/simian
        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);
            }
        }
示例#14
0
文件: Chat.cs 项目: thoys/simian
        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);
            }
        }
示例#15
0
        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);
            }
        }
示例#16
0
文件: Chat.cs 项目: jhurliman/simian
        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);
            }
        }
示例#17
0
 // 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);
 }