Example #1
0
        protected void HandleGameObjectQueryResponse(InPacket packet)
        {
            uint entry     = packet.ReadUInt32();
            uint type      = packet.ReadUInt32();
            uint displayId = packet.ReadUInt32();

            var name = packet.ReadCString();

            packet.ReadByte();
            packet.ReadByte();
            packet.ReadByte();

            var IconName       = packet.ReadCString();
            var CastBarCaption = packet.ReadCString();
            var unk1           = packet.ReadCString();

            var size = packet.ReadSingle();

            WorldObject[] worldObjects = new WorldObject[Exchange.gameClient.Objects.Count];
            Exchange.gameClient.Objects.Values.CopyTo(worldObjects, 0);

            foreach (WorldObject obj in worldObjects)
            {
                if (obj.ObjectEntry == entry)
                {
                    obj.Name = name;
                }
            }
        }
        public Character(InPacket packet)
        {
            GUID = packet.ReadUInt64();
            Name = packet.ReadCString();
            Race = (Race)packet.ReadByte();
            Class = (Class)packet.ReadByte();
            Gender = (Gender)packet.ReadByte();
            Bytes = packet.ReadBytes(5);
            Level = packet.ReadByte();
            ZoneId = packet.ReadUInt32();
            MapId = packet.ReadUInt32();
            X = packet.ReadSingle();
            Y = packet.ReadSingle();
            Z = packet.ReadSingle();
            GuildId = packet.ReadUInt32();
            Flags = packet.ReadUInt32();
            packet.ReadUInt32();	// customize (rename, etc)
            packet.ReadByte();		// first login
            PetInfoId = packet.ReadUInt32();
            PetLevel = packet.ReadUInt32();
            PetFamilyId = packet.ReadUInt32();

            // read items
            for (int i = 0; i < Items.Length - 1; ++i)
                Items[i] = new Item(packet);

            // read bags
            for (int i = 0; i < 4; ++i)
            {
                packet.ReadUInt32();
                packet.ReadByte();
                packet.ReadUInt32();
            }
        }
Example #3
0
        protected void HandleCreatureQueryResponse(InPacket packet)
        {
            var entry = packet.ReadUInt32();

            var name = packet.ReadCString();

            packet.ReadByte();
            packet.ReadByte();
            packet.ReadByte();

            var Subname  = packet.ReadCString();
            var IconName = packet.ReadCString();

            uint type_flags  = packet.ReadUInt32();
            uint type        = packet.ReadUInt32();
            uint family      = packet.ReadUInt32();
            uint rank        = packet.ReadUInt32();
            uint KillCredit  = packet.ReadUInt32();
            uint KillCredit2 = packet.ReadUInt32();
            uint Modelid1    = packet.ReadUInt32();
            uint Modelid2    = packet.ReadUInt32();
            uint Modelid3    = packet.ReadUInt32();
            uint Modelid4    = packet.ReadUInt32();

            float ModHealth = packet.ReadSingle();
            float ModMana   = packet.ReadSingle();

            byte RacialLeader = packet.ReadByte();

            //for (uint i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i)
            //data << uint32(ci->questItems[i]);              // itemId[6], quest drop

            uint movementId = packet.ReadUInt32();

            WorldObject[] worldObjects = new WorldObject[Exchange.gameClient.Objects.Count];
            Exchange.gameClient.Objects.Values.CopyTo(worldObjects, 0);

            foreach (WorldObject obj in worldObjects)
            {
                if (obj.ObjectEntry == entry)
                {
                    obj.Name = name;
                }
            }
        }
Example #4
0
        protected void HandleNameQueryResponse(InPacket packet)
        {
            var pguid = packet.ReadPackedGuid();
            var ukn   = packet.ReadByte();
            var name  = packet.ReadCString();

            WorldObject[] worldObjects = new WorldObject[Exchange.gameClient.Objects.Count];
            Exchange.gameClient.Objects.Values.CopyTo(worldObjects, 0);

            foreach (WorldObject obj in worldObjects)
            {
                if (obj.GUID == pguid)
                {
                    obj.Name = name;
                }
            }


            if (!Game.World.PlayerNameLookup.ContainsKey(pguid))
            {
                //! Add name definition per GUID
                Game.World.PlayerNameLookup.Add(pguid, name);
                //! See if any queued messages for this GUID are stored
                Queue <ChatMessage> messageQueue = null;
                if (Game.World.QueuedChatMessages.TryGetValue(pguid, out messageQueue))
                {
                    ChatMessage m;
                    while (messageQueue.GetEnumerator().MoveNext())
                    {
                        //! Print with proper name and remove from queue
                        m = messageQueue.Dequeue();
                        m.Sender.Sender = name;
                        //Game.UI.PresentChatMessage(m);
                    }
                }
            }

            /*
             * var realmName = packet.ReadCString();
             * var race = (Race)packet.ReadByte();
             * var gender = (Gender)packet.ReadByte();
             * var cClass = (Class)packet.ReadByte();
             * var decline = packet.ReadBoolean();
             *
             * if (!decline)
             *  return;
             *
             * for (var i = 0; i < 5; i++)
             *  var declinedName = packet.ReadCString();
             */
        }
Example #5
0
        void HandleNameQueryResponse(InPacket packet)
        {
            var pguid = packet.ReadPackedGuid();
            var end   = packet.ReadBoolean();

            if (end)    //! True if not found, false if found
            {
                return;
            }

            var name = packet.ReadCString();

            if (!Game.World.PlayerNameLookup.ContainsKey(pguid))
            {
                //! Add name definition per GUID
                Game.World.PlayerNameLookup.Add(pguid, name);
                //! See if any queued messages for this GUID are stored
                Queue <ChatMessage> messageQueue = null;
                if (Game.World.QueuedChatMessages.TryGetValue(pguid, out messageQueue))
                {
                    ChatMessage m;
                    while (messageQueue.GetEnumerator().MoveNext())
                    {
                        //! Print with proper name and remove from queue
                        m = messageQueue.Dequeue();
                        m.Sender.Sender = name;
                        Game.UI.PresentChatMessage(m);
                    }
                }
            }

            /*
             * var realmName = packet.ReadCString();
             * var race = (Race)packet.ReadByte();
             * var gender = (Gender)packet.ReadByte();
             * var cClass = (Class)packet.ReadByte();
             * var decline = packet.ReadBoolean();
             *
             * if (!decline)
             *  return;
             *
             * for (var i = 0; i < 5; i++)
             *  var declinedName = packet.ReadCString();
             */
        }
Example #6
0
        protected void HandleNameQueryResponse(InPacket packet)
        {
            var pguid = packet.ReadPackedGuid();
            var end = packet.ReadBoolean();
            if (end)    //! True if not found, false if found
                return;

            var name = packet.ReadCString();

            if (!Game.World.PlayerNameLookup.ContainsKey(pguid))
            {
                //! Add name definition per GUID
                Game.World.PlayerNameLookup.Add(pguid, name);
                //! See if any queued messages for this GUID are stored
                Queue<ChatMessage> messageQueue = null;
                if (Game.World.QueuedChatMessages.TryGetValue(pguid, out messageQueue))
                {
                    ChatMessage m;
                    while (messageQueue.GetEnumerator().MoveNext())
                    {
                        //! Print with proper name and remove from queue
                        m = messageQueue.Dequeue();
                        m.Sender.Sender = name;
                        Game.UI.PresentChatMessage(m);
                    }
                }
            }

            /*
            var realmName = packet.ReadCString();
            var race = (Race)packet.ReadByte();
            var gender = (Gender)packet.ReadByte();
            var cClass = (Class)packet.ReadByte();
            var decline = packet.ReadBoolean();

            if (!decline)
                return;

            for (var i = 0; i < 5; i++)
                var declinedName = packet.ReadCString();
            */
        }
Example #7
0
        void HandleMessageChat(InPacket packet)
        {
            var type = (ChatMessageType)packet.ReadByte();
            var lang = (Language)packet.ReadInt32();
            var guid = packet.ReadUInt64();
            var unkInt = packet.ReadInt32();

            switch (type)
            {
                case ChatMessageType.Say:
                case ChatMessageType.Yell:
                case ChatMessageType.Party:
                case ChatMessageType.PartyLeader:
                case ChatMessageType.Raid:
                case ChatMessageType.RaidLeader:
                case ChatMessageType.RaidWarning:
                case ChatMessageType.Guild:
                case ChatMessageType.Officer:
                case ChatMessageType.Emote:
                case ChatMessageType.TextEmote:
                case ChatMessageType.Whisper:
                case ChatMessageType.WhisperInform:
                case ChatMessageType.System:
                case ChatMessageType.Channel:
                case ChatMessageType.Battleground:
                case ChatMessageType.BattlegroundNeutral:
                case ChatMessageType.BattlegroundAlliance:
                case ChatMessageType.BattlegroundHorde:
                case ChatMessageType.BattlegroundLeader:
                case ChatMessageType.Achievement:
                case ChatMessageType.GuildAchievement:
                    {
                        ChatChannel channel = new ChatChannel();
                        channel.Type = type;

                        if (type == ChatMessageType.Channel)
                            channel.ChannelName = packet.ReadCString();

                        var sender = packet.ReadUInt64();

                        ChatMessage message = new ChatMessage();
                        var textLen = packet.ReadInt32();
                        message.Message = packet.ReadCString();
                        message.Language = lang;
                        message.ChatTag = (ChatTag)packet.ReadByte();
                        message.Sender = channel;

                        //! If we know the name of the sender GUID, use it
                        //! For system messages sender GUID is 0, don't need to do anything fancy
                        string senderName = null;
                        if (type == ChatMessageType.System ||
                            Game.World.PlayerNameLookup.TryGetValue(sender, out senderName))
                        {
                            message.Sender.Sender = senderName;
                            Game.UI.PresentChatMessage(message);
                            return;
                        }

                        //! If not we place the message in the queue,
                        //! .. either existent
                        Queue<ChatMessage> messageQueue = null;
                        if (Game.World.QueuedChatMessages.TryGetValue(sender, out messageQueue))
                            messageQueue.Enqueue(message);
                        //! or non existent
                        else
                        {
                            messageQueue = new Queue<ChatMessage>();
                            messageQueue.Enqueue(message);
                            Game.World.QueuedChatMessages.Add(sender, messageQueue);
                        }

                        //! Furthermore we send CMSG_NAME_QUERY to the server to retrieve the name of the sender
                        OutPacket response = new OutPacket(WorldCommand.CMSG_NAME_QUERY);
                        response.Write(sender);
                        Game.SendPacket(response);

                        //! Enqueued chat will be printed when we receive SMSG_NAME_QUERY_RESPONSE

                        break;
                    }
                default:
                    return;
            }
        }
Example #8
0
 void HandleChatPlayerNotFound(InPacket packet)
 {
     Game.UI.LogLine(String.Format("Player {0} not found!", packet.ReadCString()));
 }
Example #9
0
 protected void HandlePartyList(InPacket packet)
 {
     GroupType groupType = (GroupType)packet.ReadByte();
     packet.ReadByte();
     packet.ReadByte();
     packet.ReadByte();
     if (groupType.HasFlag(GroupType.GROUPTYPE_LFG))
     {
         packet.ReadByte();
         packet.ReadUInt32();
     }
     packet.ReadUInt64();
     packet.ReadUInt32();
     uint membersCount = packet.ReadUInt32();
     GroupMembersGuids.Clear();
     for (uint index = 0; index < membersCount; index++)
     {
         packet.ReadCString();
         UInt64 memberGuid = packet.ReadUInt64();
         GroupMembersGuids.Add(memberGuid);
         packet.ReadByte();
         packet.ReadByte();
         packet.ReadByte();
         packet.ReadByte();
     }
     GroupLeaderGuid = packet.ReadUInt64();
 }
Example #10
0
 protected void HandleChatPlayerNotFound(InPacket packet)
 {
     Game.UI.LogLine(String.Format("Player {0} not found!", packet.ReadCString()));
 }
Example #11
0
        protected void HandleMessageChat(InPacket packet)
        {
            var    chatType   = (ChatMessageType)packet.ReadByte();
            var    language   = (Language)packet.ReadInt32();
            UInt64 senderGuid = packet.ReadUInt64();
            var    unkInt     = packet.ReadUInt32();

            UInt32 senderNameLen   = 0;
            string senderName      = null;
            UInt64 receiverGuid    = 0;
            UInt32 receiverNameLen = 0;
            string receiverName    = null;
            string channelName     = null;

            switch (chatType)
            {
            case ChatMessageType.MonsterSay:
            case ChatMessageType.MonsterParty:
            case ChatMessageType.MonsterYell:
            case ChatMessageType.MonsterWhisper:
            case ChatMessageType.MonsterEmote:
            case ChatMessageType.RaidBossEmote:
            case ChatMessageType.RaidBossWhisper:
            case ChatMessageType.BattleNet:
                senderNameLen = packet.ReadUInt32();
                senderName    = packet.ReadCString();
                receiverGuid  = packet.ReadUInt64();
                if (receiverGuid != 0 && !receiverGuid.IsPlayer() && !receiverGuid.IsPet())
                {
                    receiverNameLen = packet.ReadUInt32();
                    receiverName    = packet.ReadCString();
                }
                break;

            case ChatMessageType.WhisperForeign:
                senderNameLen = packet.ReadUInt32();
                senderName    = packet.ReadCString();
                receiverGuid  = packet.ReadUInt64();
                break;

            case ChatMessageType.BattlegroundNeutral:
            case ChatMessageType.BattlegroundAlliance:
            case ChatMessageType.BattlegroundHorde:
                receiverGuid = packet.ReadUInt64();
                if (receiverGuid != 0 && !receiverGuid.IsPlayer())
                {
                    receiverNameLen = packet.ReadUInt32();
                    receiverName    = packet.ReadCString();
                }
                break;

            case ChatMessageType.Achievement:
            case ChatMessageType.GuildAchievement:
                receiverGuid = packet.ReadUInt64();
                break;

            default:
                if (packet.Header.Command == WorldCommand.SMSG_GM_MESSAGECHAT)
                {
                    senderNameLen = packet.ReadUInt32();
                    senderName    = packet.ReadCString();
                }

                if (chatType == ChatMessageType.Channel)
                {
                    channelName = packet.ReadCString();
                }

                receiverGuid = packet.ReadUInt64();
                break;
            }

            UInt32 messageLen = packet.ReadUInt32();
            string message    = packet.ReadCString();
            var    chatTag    = (ChatTag)packet.ReadByte();

            if (chatType == ChatMessageType.Achievement || chatType == ChatMessageType.GuildAchievement)
            {
                var achievementId = packet.ReadUInt32();
            }

            ChatChannel channel = new ChatChannel();

            channel.Type = chatType;

            if (chatType == ChatMessageType.Channel)
            {
                channel.ChannelName = channelName;
            }

            ChatMessage chatMessage = new ChatMessage();

            chatMessage.Message  = message;
            chatMessage.Language = language;
            chatMessage.ChatTag  = chatTag;
            chatMessage.Sender   = channel;

            //! If we know the name of the sender GUID, use it
            //! For system messages sender GUID is 0, don't need to do anything fancy
            if (senderGuid == 0 || !string.IsNullOrEmpty(senderName) ||
                Game.World.PlayerNameLookup.TryGetValue(senderGuid, out senderName))
            {
                chatMessage.Sender.Sender = senderName;
                Game.UI.PresentChatMessage(chatMessage);
                return;
            }

            //! If not we place the message in the queue,
            //! .. either existent
            Queue <ChatMessage> messageQueue = null;

            if (Game.World.QueuedChatMessages.TryGetValue(senderGuid, out messageQueue))
            {
                messageQueue.Enqueue(chatMessage);
            }
            //! or non existent
            else
            {
                messageQueue = new Queue <ChatMessage>();
                messageQueue.Enqueue(chatMessage);
                Game.World.QueuedChatMessages.Add(senderGuid, messageQueue);
            }

            //! Furthermore we send CMSG_NAME_QUERY to the server to retrieve the name of the sender
            OutPacket response = new OutPacket(WorldCommand.CMSG_NAME_QUERY);

            response.Write(senderGuid);
            Game.SendPacket(response);

            //! Enqueued chat will be printed when we receive SMSG_NAME_QUERY_RESPONSE
        }
Example #12
0
        protected void HandleItemQueryResponse(InPacket packet)
        {
            var entry    = packet.ReadUInt32();
            var Class    = packet.ReadUInt32();
            var SubClass = packet.ReadUInt32();
            var SoundOverrideSubclass = packet.ReadUInt32();

            var name = packet.ReadCString();

            var DisplayID = packet.ReadUInt32();

            var Quality = packet.ReadUInt32();

            var Flags = packet.ReadUInt32();

            var FlagsExtra = packet.ReadUInt32();

            var BuyPrice = packet.ReadUInt32();

            var SellPrice = packet.ReadUInt32();

            var InventoryType = packet.ReadUInt32();

            var AllowedClasses = packet.ReadUInt32();

            var AllowedRaces = packet.ReadUInt32();

            var ItemLevel = packet.ReadUInt32();

            var RequiredLevel = packet.ReadUInt32();

            var RequiredSkillId = packet.ReadUInt32();

            var RequiredSkillLevel = packet.ReadUInt32();

            var RequiredSpell = packet.ReadUInt32();

            var RequiredHonorRank = packet.ReadUInt32();

            var RequiredCityRank = packet.ReadUInt32();

            var RequiredRepFaction = packet.ReadUInt32();

            WorldObject[] worldObjects = new WorldObject[Exchange.gameClient.Objects.Count];
            Exchange.gameClient.Objects.Values.CopyTo(worldObjects, 0);

            foreach (WorldObject obj in worldObjects)
            {
                if (obj.ObjectEntry == entry)
                {
                    obj.Name = name;
                }
            }

            /* item.RequiredRepValue = packet.ReadUInt32("Required Rep Value");
             *
             * item.MaxCount = packet.ReadInt32("Max Count");
             *
             * item.MaxStackSize = packet.ReadInt32("Max Stack Size");
             *
             * item.ContainerSlots = packet.ReadUInt32("Container Slots");
             *
             * item.StatsCount = ClientVersion.AddedInVersion(ClientVersionBuild.V3_0_2_9056) ? packet.ReadUInt32("Stats Count") : 10;
             * item.StatTypes = new ItemModType?[item.StatsCount.GetValueOrDefault()];
             * item.StatValues = new int?[item.StatsCount.GetValueOrDefault()];
             * for (int i = 0; i < item.StatsCount; i++)
             * {
             *   ItemModType type = packet.ReadInt32E<ItemModType>("Stat Type", i);
             *   item.StatTypes[i] = type == ItemModType.None ? ItemModType.Mana : type; // TDB
             *   item.StatValues[i] = packet.ReadInt32("Stat Value", i);
             * }
             *
             * if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_0_2_9056))
             * {
             *   item.ScalingStatDistribution = packet.ReadInt32("SSD ID");
             *   item.ScalingStatValue = packet.ReadUInt32("SSD Value");
             * }
             *
             * int dmgCount = ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767) ? 2 : 5;
             * item.DamageMins = new float?[dmgCount];
             * item.DamageMaxs = new float?[dmgCount];
             * item.DamageTypes = new DamageType?[dmgCount];
             * for (int i = 0; i < dmgCount; i++)
             * {
             *   item.DamageMins[i] = packet.ReadSingle("Damage Min", i);
             *   item.DamageMaxs[i] = packet.ReadSingle("Damage Max", i);
             *   item.DamageTypes[i] = packet.ReadInt32E<DamageType>("Damage Type", i);
             * }
             *
             *
             * item.Armor = packet.ReadUInt32("Armor");
             * item.HolyResistance = packet.ReadUInt32("HolyResistance");
             * item.FireResistance = packet.ReadUInt32("FireResistance");
             * item.NatureResistance = packet.ReadUInt32("NatureResistance");
             * item.FrostResistance = packet.ReadUInt32("FrostResistance");
             * item.ShadowResistance = packet.ReadUInt32("ShadowResistance");
             * item.ArcaneResistance = packet.ReadUInt32("ArcaneResistance");
             *
             * item.Delay = packet.ReadUInt32("Delay");
             *
             * item.AmmoType = packet.ReadInt32E<AmmoType>("Ammo Type");
             *
             * item.RangedMod = packet.ReadSingle("Ranged Mod");
             *
             * item.TriggeredSpellIds = new int?[5];
             * item.TriggeredSpellTypes = new ItemSpellTriggerType?[5];
             * item.TriggeredSpellCharges = new int?[5];
             * item.TriggeredSpellCooldowns = new int?[5];
             * item.TriggeredSpellCategories = new uint?[5];
             * item.TriggeredSpellCategoryCooldowns = new int?[5];
             * for (int i = 0; i < 5; i++)
             * {
             *   item.TriggeredSpellIds[i] = packet.ReadInt32<SpellId>("Triggered Spell ID", i);
             *   item.TriggeredSpellTypes[i] = packet.ReadInt32E<ItemSpellTriggerType>("Trigger Spell Type", i);
             *   item.TriggeredSpellCharges[i] = packet.ReadInt32("Triggered Spell Charges", i);
             *   item.TriggeredSpellCooldowns[i] = packet.ReadInt32("Triggered Spell Cooldown", i);
             *   item.TriggeredSpellCategories[i] = packet.ReadUInt32("Triggered Spell Category", i);
             *   item.TriggeredSpellCategoryCooldowns[i] = packet.ReadInt32("Triggered Spell Category Cooldown", i);
             * }
             *
             * item.Bonding = packet.ReadInt32E<ItemBonding>("Bonding");
             *
             * item.Description = packet.ReadCString();
             *
             * item.PageText = packet.ReadUInt32("Page Text");
             *
             * item.Language = packet.ReadInt32E<Language>("Language");
             *
             * item.PageMaterial = packet.ReadInt32E<PageMaterial>("Page Material");
             *
             * item.StartQuestId = (uint)packet.ReadInt32<QuestId>("Start Quest");
             *
             * item.LockId = packet.ReadUInt32("Lock ID");
             *
             * item.Material = packet.ReadInt32E<Material>("Material");
             *
             * item.SheathType = packet.ReadInt32E<SheathType>("Sheath Type");
             *
             * item.RandomPropery = packet.ReadInt32("Random Property");
             *
             * item.RandomSuffix = packet.ReadUInt32("Random Suffix");
             *
             * item.Block = packet.ReadUInt32("Block");
             *
             * item.ItemSet = packet.ReadUInt32("Item Set");
             *
             * item.MaxDurability = packet.ReadUInt32("Max Durability");
             *
             * item.AreaID = packet.ReadUInt32<AreaId>("Area");
             *
             * // In this single (?) case, map 0 means no map
             * item.MapID = packet.ReadInt32<MapId>("Map");
             *
             * item.BagFamily = packet.ReadInt32E<BagFamilyMask>("Bag Family");
             *
             * item.TotemCategory = packet.ReadInt32E<TotemCategory>("Totem Category");
             *
             * item.ItemSocketColors = new ItemSocketColor?[3];
             * item.SocketContent = new uint?[3];
             * for (int i = 0; i < 3; i++)
             * {
             *   item.ItemSocketColors[i] = packet.ReadInt32E<ItemSocketColor>("Socket Color", i);
             *   item.SocketContent[i] = packet.ReadUInt32("Socket Item", i);
             * }
             *
             * item.SocketBonus = packet.ReadInt32("Socket Bonus");
             *
             * item.GemProperties = packet.ReadInt32("Gem Properties");
             *
             * item.RequiredDisenchantSkill = packet.ReadInt32("Required Disenchant Skill");
             *
             * item.ArmorDamageModifier = packet.ReadSingle("Armor Damage Modifier");
             *
             * if (ClientVersion.AddedInVersion(ClientVersionBuild.V2_4_2_8209))
             *   item.Duration = packet.ReadUInt32("Duration");
             *
             * if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_0_2_9056))
             *   item.ItemLimitCategory = packet.ReadInt32("Limit Category");
             *
             * if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767))
             *   item.HolidayID = packet.ReadInt32E<Holiday>("Holiday");
             *
             * packet.AddSniffData(StoreNameType.Item, entry.Key, "QUERY_RESPONSE");
             *
             * Storage.ItemTemplates.Add(item, packet.TimeSpan);*/
        }
Example #13
0
        protected void HandleMessageChat(InPacket packet)
        {
            var type   = (ChatMessageType)packet.ReadByte();
            var lang   = (Language)packet.ReadInt32();
            var guid   = packet.ReadUInt64();
            var unkInt = packet.ReadInt32();

            switch (type)
            {
            case ChatMessageType.Say:
            case ChatMessageType.Yell:
            case ChatMessageType.Party:
            case ChatMessageType.PartyLeader:
            case ChatMessageType.Raid:
            case ChatMessageType.RaidLeader:
            case ChatMessageType.RaidWarning:
            case ChatMessageType.Guild:
            case ChatMessageType.Officer:
            case ChatMessageType.Emote:
            case ChatMessageType.TextEmote:
            case ChatMessageType.Whisper:
            case ChatMessageType.WhisperInform:
            case ChatMessageType.System:
            case ChatMessageType.Channel:
            case ChatMessageType.Battleground:
            case ChatMessageType.BattlegroundNeutral:
            case ChatMessageType.BattlegroundAlliance:
            case ChatMessageType.BattlegroundHorde:
            case ChatMessageType.BattlegroundLeader:
            case ChatMessageType.Achievement:
            case ChatMessageType.GuildAchievement:
            {
                ChatChannel channel = new ChatChannel();
                channel.Type = type;

                if (type == ChatMessageType.Channel)
                {
                    channel.ChannelName = packet.ReadCString();
                }

                var sender = packet.ReadUInt64();

                ChatMessage message = new ChatMessage();
                var         textLen = packet.ReadInt32();
                message.Message  = packet.ReadCString();
                message.Language = lang;
                message.ChatTag  = (ChatTag)packet.ReadByte();
                message.Sender   = channel;

                //! If we know the name of the sender GUID, use it
                //! For system messages sender GUID is 0, don't need to do anything fancy
                string senderName = null;
                if (type == ChatMessageType.System ||
                    Game.World.PlayerNameLookup.TryGetValue(sender, out senderName))
                {
                    message.Sender.Sender = senderName;
                    Game.UI.PresentChatMessage(message);
                    return;
                }

                //! If not we place the message in the queue,
                //! .. either existent
                Queue <ChatMessage> messageQueue = null;
                if (Game.World.QueuedChatMessages.TryGetValue(sender, out messageQueue))
                {
                    messageQueue.Enqueue(message);
                }
                //! or non existent
                else
                {
                    messageQueue = new Queue <ChatMessage>();
                    messageQueue.Enqueue(message);
                    Game.World.QueuedChatMessages.Add(sender, messageQueue);
                }

                //! Furthermore we send CMSG_NAME_QUERY to the server to retrieve the name of the sender
                OutPacket response = new OutPacket(NetworkOperationCode.CMSG_NAME_QUERY);
                response.Write(sender);
                Game.SendPacket(response);

                //! Enqueued chat will be printed when we receive SMSG_NAME_QUERY_RESPONSE

                break;
            }

            default:
                return;
            }
        }