/// <summary>
        /// Analyzes text sent by the player through the chat window. If it matches what is expected as a command, process the command.
        /// </summary>
        /// <param name="data">The data from the received message packet.</param>
        public static void Incoming(Socket sender, byte[] data)
        {
            //get full packet data as string
            string message = Encoding.ASCII.GetString(data);

            //get message
            message = message.Substring(0x2c, 0x1fb).Trim(new[] { '\0' }).ToLower(); //0x1fb = max message size

            if (message.Substring(0, 1).Equals(@"\"))                                //is command
            {
                PlayerCharacter pc = User.Instance.Character;
                string          command;
                bool            hasParameters = false;
                List <string>   parameters    = new List <string>();

                if (message.IndexOf(' ') > 0)
                {
                    parameters.AddRange(message.Split(' '));
                    command = parameters[0];
                    parameters.RemoveAt(0);
                }
                else
                {
                    command = message;
                }

                if (parameters.Count > 0)
                {
                    hasParameters = true;
                }

                switch (command)
                {
                case @"\help":
                    SendMessage(sender, MessageType.System, "Available commands:");
                    SendMessage(sender, MessageType.System, @"\setweather {weather name}");
                    SendMessage(sender, MessageType.System, @"\setmusic {music id}");
                    break;

                case @"\setweather":
                    string wheatherName = parameters[0].First().ToString().ToUpper() + parameters[0].Substring(1);

                    if (Enum.IsDefined(typeof(Weather), wheatherName))
                    {
                        World.Instance.SetWeather(sender, (Weather)Enum.Parse(typeof(Weather), wheatherName));

                        switch (wheatherName)
                        {
                        case "Dalamudthunder":
                            World.Instance.SetMusic(sender, 29);         //set music to "Answers", I THINK it was the original track for this weather.
                            break;
                        }
                    }
                    else
                    {
                        SendMessage(sender, MessageType.System, "Requested weather not found.");
                    }
                    break;

                case @"\setmusic":
                    if (byte.TryParse(parameters[0], out byte id))
                    {
                        World.Instance.SetMusic(sender, id);
                    }
                    else
                    {
                        SendMessage(sender, MessageType.System, "Invalid music id.");
                    }
                    break;

                case @"\setemote":
                    byte[] emote = new byte[] { 0x00, 0xB0, 0x00, 0x05, 0x41, 0x29, 0x9B, 0x02, 0x6E, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
                    Buffer.BlockCopy(BitConverter.GetBytes(User.Instance.Character.Id), 0, emote, 0x04, 4);
                    Buffer.BlockCopy(BitConverter.GetBytes(Convert.ToByte(parameters[1])), 0, emote, Convert.ToByte(parameters[0]), 1);
                    sender.Send(new Packet(new GamePacket
                    {
                        Opcode = (ushort)ServerOpcode.DoEmote,
                        Data   = emote
                    }).ToBytes());

                    break;

                case @"\resetlevel":
                    short level = 1;

                    if (hasParameters)
                    {
                        Int16.TryParse(parameters[0], out level);
                    }

                    pc.LevelDown(sender, level);
                    break;

                //case @"\spawn":
                //    //_world.ZoneList.GetZone(_user.Character.Position.ZoneId).SpawnActors(sender);
                //    break;

                case @"\teleport":
                    if (parameters.Count > 0)
                    {
                        World.Instance.TeleportPlayer(sender, Convert.ToUInt32(parameters[0]));
                    }
                    break;

                case @"\setposition":
                    if (parameters.Count > 0)
                    {
                        Position pos = pc.Position;
                        pos.X = Convert.ToSingle(parameters[0]);
                        pos.Y = Convert.ToSingle(parameters[1]);
                        pos.Z = Convert.ToSingle(parameters[2]);

                        pc.Position = pos;
                        pc.SetPosition(sender);
                    }
                    break;

                case @"\spawn":
                    if (hasParameters)
                    {
                        if (parameters[0] == "antelope")
                        {
                            TestPackets.Antelope(pc.Id, pc.Position, sender);
                        }
                        else if (parameters[0] == "populace")
                        {
                            TestPackets.Populace(pc.Id, pc.Position, sender);
                        }
                        else if (parameters[0] == "company")
                        {
                            TestPackets.CompanyWarp(pc.Id, pc.Position, sender);
                        }
                    }

                    //TestPackets.Antelope(pc.Id, pc.Position, sender);
                    //TestPackets.TeleportInn(UserFactory.Instance.User.Character.Id, UserFactory.Instance.User.Character.Position, sender);
                    //Aetheryte ae = new Aetheryte(1280007, 20925, new Position(128, 582.47f, 54.52f, -1.2f, 0f, 0));
                    //_log.Info("sent test");
                    break;

                case @"\text":

                    data = new byte[] { 0x41, 0x29, 0x9B, 0x02, 0x01, 0x00, 0xF8, 0x5F, 0x89, 0x77, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
                                        0x02, 0x00, 0x00, 0x6B, 0x1E, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F,
                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

                    if (parameters.Count > 0)
                    {
                        Buffer.BlockCopy(BitConverter.GetBytes(Convert.ToUInt32(parameters[0])), 0, data, 0x08, 4);
                    }

                    Buffer.BlockCopy(BitConverter.GetBytes(pc.Id), 0, data, 0, 4);

                    GamePacket g = new GamePacket
                    {
                        Opcode = (ushort)ServerOpcode.TextSheetMessage70b,
                        Data   = data
                    };

                    SubPacket sb = new SubPacket(g)
                    {
                        SourceId = 0x5ff80001
                    };

                    Packet pk = new Packet(sb);

                    sender.Send(pk.ToBytes());
                    break;

                case @"\addloot":
                    Inventory.AddLoot(sender);
                    break;

                case @"\additem":
                    pc.Inventory.AddItem(ref pc.Inventory.Bag,
                                         parameters[0].Replace("_", " ").Replace("'", "''"),
                                         (parameters.Count > 2 ? Convert.ToUInt32(parameters[1]) : 1),
                                         sender);
                    break;

                case @"\addkeyitem":
                    pc.Inventory.AddItem(ref pc.Inventory.KeyItems,
                                         parameters[0].Replace("_", " ").Replace("'", "''"),
                                         (parameters.Count > 2 ? Convert.ToUInt32(parameters[1]) : 1), //TODO: should key items be always 1?
                                         sender);
                    break;

                case @"\addexp":
                    if (hasParameters)
                    {
                        User.Instance.Character.AddExp(sender, Convert.ToInt32(parameters[0]));
                    }
                    break;

                case @"\removeactor":
                    GamePacket gps = new GamePacket
                    {
                        Opcode = 0x7,
                        Data   = new byte[8]
                    };
                    Packet packet = new Packet(new SubPacket(gps)
                    {
                        SourceId = User.Instance.Character.Id, TargetId = User.Instance.Character.Id
                    });
                    sender.Send(packet.ToBytes());
                    //UserFactory.Instance.User.Character.SetPosition(sender, ZoneList.EntryPoints.Find(x => x.ZoneId == Convert.ToUInt32(value)), 2, 1);
                    User.Instance.Character.Position = EntryPoints.List.Find(x => x.ZoneId == Convert.ToUInt32(parameters[0]));
                    World.Instance.Initialize(sender);
                    break;

                case @"\anim":
                    short animid  = 0x29;
                    byte  another = 0x04;
                    if (hasParameters)
                    {
                        animid = Convert.ToInt16(parameters[0]);
                    }

                    if (parameters.Count > 1)
                    {
                        another = Convert.ToByte(parameters[1]);
                    }

                    byte[] anim = new byte[] { 0x29, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00 };

                    Buffer.BlockCopy(BitConverter.GetBytes(animid), 0, anim, 0, 2);
                    anim[3] = another;

                    sender.Send(new Packet(new GamePacket
                    {
                        Opcode = (ushort)ServerOpcode.PlayAnimationEffect,
                        Data   = anim
                    }).ToBytes());
                    break;

                case @"\mapui":
                    uint code = 0;

                    if (hasParameters)
                    {
                        code = Convert.ToUInt32(parameters[0]);
                    }

                    //User.Instance.Character.ToggleControl(sender, code);
                    break;

                default:
                    SendMessage(sender, MessageType.System, "Unknown command.");
                    break;
                }
            }
            else
            {
                SendMessage(sender, MessageType.System, "Sorry, no one is listening. What a lonely life...");
            }
        }