示例#1
0
        public static void LoadSQL()
        {
            if (!SQLConnector.Connected())
            {
                throw new DataException("Cannot get DB data without an active DB connection.");
            }

            var startTime = DateTime.Now;

            var query = new StringBuilder(string.Format("SELECT ID, Language, MaleText, FemaleText, EmoteID0, EmoteID1, EmoteID2, EmoteDelay0, EmoteDelay1, EmoteDelay2, SoundId, Unk1, Unk2 FROM {0}.broadcast_text;", Settings.TDBDatabase));

            using (var reader = SQLConnector.ExecuteQuery(query.ToString()))
            {
                if (reader == null)
                {
                    return;
                }

                while (reader.Read())
                {
                    var broadcastText = new BroadcastText();

                    uint Id = Convert.ToUInt32(reader["Id"]);

                    broadcastText.language   = Convert.ToUInt32(reader["Language"]);
                    broadcastText.MaleText   = Convert.ToString(reader["MaleText"]);
                    broadcastText.FemaleText = Convert.ToString(reader["FemaleText"]);

                    broadcastText.emoteID0 = Convert.ToUInt32(reader["EmoteID0"]);
                    broadcastText.emoteID1 = Convert.ToUInt32(reader["EmoteID1"]);
                    broadcastText.emoteID2 = Convert.ToUInt32(reader["EmoteID2"]);

                    broadcastText.emoteDelay0 = Convert.ToUInt32(reader["EmoteDelay0"]);
                    broadcastText.emoteDelay1 = Convert.ToUInt32(reader["EmoteDelay1"]);
                    broadcastText.emoteDelay2 = Convert.ToUInt32(reader["EmoteDelay2"]);

                    broadcastText.soundId = Convert.ToUInt32(reader["SoundId"]);
                    broadcastText.unk1    = Convert.ToUInt32(reader["Unk1"]);
                    broadcastText.unk2    = Convert.ToUInt32(reader["Unk2"]);

                    var tuple = Tuple.Create(Id, broadcastText);
                    BroadcastTextStores.Add(tuple);
                }
            }

            var endTime = DateTime.Now;
            var span    = endTime.Subtract(startTime);

            Trace.WriteLine(String.Format("SQL loaded in {0}.", span.ToFormattedString()));
        }
示例#2
0
        /// <summary>
        /// Loads the broadcast texts form the database.
        /// </summary>
        private static void LoadBroadcastText()
        {
            string query =
                $"SELECT ID, Language, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, EmoteDelay3, SoundId, UnkEmoteID, Type FROM {Settings.HotfixesDatabase}.broadcast_text;";

            using (MySqlDataReader reader = SQLConnector.ExecuteQuery(query))
            {
                if (reader == null)
                {
                    return;
                }

                while (reader.Read())
                {
                    BroadcastText broadcastText = new BroadcastText();

                    uint id = Convert.ToUInt32(reader["Id"]);

                    broadcastText.Language   = Convert.ToInt32(reader["Language"]);
                    broadcastText.MaleText   = Convert.ToString(reader["MaleText"]);
                    broadcastText.FemaleText = Convert.ToString(reader["FemaleText"]);

                    broadcastText.EmoteID    = new uint?[3];
                    broadcastText.EmoteID[0] = Convert.ToUInt32(reader["EmoteID1"]);
                    broadcastText.EmoteID[1] = Convert.ToUInt32(reader["EmoteID2"]);
                    broadcastText.EmoteID[2] = Convert.ToUInt32(reader["EmoteID3"]);

                    broadcastText.EmoteDelay    = new uint?[3];
                    broadcastText.EmoteDelay[0] = Convert.ToUInt32(reader["EmoteDelay1"]);
                    broadcastText.EmoteDelay[1] = Convert.ToUInt32(reader["EmoteDelay2"]);
                    broadcastText.EmoteDelay[2] = Convert.ToUInt32(reader["EmoteDelay3"]);

                    broadcastText.SoundId    = Convert.ToUInt32(reader["SoundId"]);
                    broadcastText.UnkEmoteId = Convert.ToUInt32(reader["UnkEmoteID"]);
                    broadcastText.Type       = Convert.ToUInt32(reader["Type"]);

                    var tuple = Tuple.Create(id, broadcastText);
                    BroadcastTextStores.Add(tuple);
                }
            }
        }
示例#3
0
        private static void LoadBroadcastText()
        {
            var query = new StringBuilder(string.Format("SELECT ID, Language, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, EmoteDelay3, SoundId, UnkEmoteID, Type FROM {0}.broadcast_text;", Settings.HotfixesDatabase));

            using (var reader = SQLConnector.ExecuteQuery(query.ToString()))
            {
                if (reader == null)
                {
                    return;
                }

                while (reader.Read())
                {
                    var broadcastText = new BroadcastText();

                    uint id = Convert.ToUInt32(reader["Id"]);

                    broadcastText.language   = Convert.ToInt32(reader["Language"]);
                    broadcastText.MaleText   = Convert.ToString(reader["MaleText"]);
                    broadcastText.FemaleText = Convert.ToString(reader["FemaleText"]);

                    broadcastText.emoteID0 = Convert.ToUInt32(reader["EmoteID1"]);
                    broadcastText.emoteID1 = Convert.ToUInt32(reader["EmoteID2"]);
                    broadcastText.emoteID2 = Convert.ToUInt32(reader["EmoteID3"]);

                    broadcastText.emoteDelay0 = Convert.ToUInt32(reader["EmoteDelay1"]);
                    broadcastText.emoteDelay1 = Convert.ToUInt32(reader["EmoteDelay2"]);
                    broadcastText.emoteDelay2 = Convert.ToUInt32(reader["EmoteDelay3"]);

                    broadcastText.soundId = Convert.ToUInt32(reader["SoundId"]);
                    broadcastText.unk1    = Convert.ToUInt32(reader["UnkEmoteID"]);
                    broadcastText.unk2    = Convert.ToUInt32(reader["Type"]);

                    var tuple = Tuple.Create(id, broadcastText);
                    BroadcastTextStores.Add(tuple);
                }
            }
        }
        public static void HandleDBReply(Packet packet)
        {
            var type = packet.ReadEnum <DB2Hash>("DB2 File", TypeCode.UInt32);

            packet.ReadTime("Hotfix date");
            var size = packet.ReadInt32("Size");

            var data    = packet.ReadBytes(size);
            var db2File = new Packet(data, packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName);
            var entry   = (uint)packet.ReadInt32("Entry");

            if ((int)entry < 0)
            {
                packet.WriteLine("Row {0} has been removed.", -(int)entry);
                return;
            }

            switch (type)
            {
            case DB2Hash.BroadcastText:
            {
                var broadcastText = new BroadcastText();

                var Id = db2File.ReadEntry("Broadcast Text Entry");
                broadcastText.language = db2File.ReadUInt32("Language");
                if (db2File.ReadUInt16() > 0)
                {
                    broadcastText.MaleText = db2File.ReadCString("Male Text");
                }
                if (db2File.ReadUInt16() > 0)
                {
                    broadcastText.FemaleText = db2File.ReadCString("Female Text");
                }

                broadcastText.EmoteID    = new uint[3];
                broadcastText.EmoteDelay = new uint[3];
                for (var i = 0; i < 3; ++i)
                {
                    broadcastText.EmoteID[i] = (uint)db2File.ReadInt32("Emote ID", i);
                }
                for (var i = 0; i < 3; ++i)
                {
                    broadcastText.EmoteDelay[i] = (uint)db2File.ReadInt32("Emote Delay", i);
                }

                broadcastText.soundId = db2File.ReadUInt32("Sound Id");
                broadcastText.unk1    = db2File.ReadUInt32("Unk 1");      // emote unk
                broadcastText.unk2    = db2File.ReadUInt32("Unk 2");      // kind of type?

                Storage.BroadcastTexts.Add((uint)Id.Key, broadcastText, packet.TimeSpan);
                packet.AddSniffData(StoreNameType.BroadcastText, Id.Key, "BROADCAST_TEXT");
                break;
            }

            case DB2Hash.Creature:
            {
                db2File.ReadUInt32("Creature Entry");
                db2File.ReadUInt32("Item Entry 1");
                db2File.ReadUInt32("Item Entry 2");
                db2File.ReadUInt32("Item Entry 3");
                db2File.ReadUInt32("Projectile Entry 1");
                db2File.ReadUInt32("Projectile Entry 2");
                db2File.ReadUInt32("Mount");
                db2File.ReadUInt32("Display Id 1");
                db2File.ReadUInt32("Display Id 2");
                db2File.ReadUInt32("Display Id 3");
                db2File.ReadUInt32("Display Id 4");
                db2File.ReadSingle("Unk Float 1");
                db2File.ReadSingle("Unk Float 2");
                db2File.ReadSingle("Unk Float 3");
                db2File.ReadSingle("Unk Float 4");
                if (db2File.ReadUInt16() > 0)
                {
                    db2File.ReadCString("Name");
                }

                db2File.ReadUInt32("Inhabit Type");
                break;
            }

            case DB2Hash.Item:
            {
                var item = Storage.ItemTemplates.ContainsKey(entry) ? Storage.ItemTemplates[entry].Item1 : new ItemTemplate();

                db2File.ReadEntry <UInt32>(StoreNameType.Item, "Item Entry");
                item.Class    = db2File.ReadEnum <ItemClass>("Class", TypeCode.Int32);
                item.SubClass = db2File.ReadUInt32("Sub Class");
                item.SoundOverrideSubclass = db2File.ReadInt32("Sound Override Subclass");
                item.Material      = db2File.ReadEnum <Material>("Material", TypeCode.Int32);
                item.DisplayId     = db2File.ReadUInt32("Display ID");
                item.InventoryType = db2File.ReadEnum <InventoryType>("Inventory Type", TypeCode.UInt32);
                item.SheathType    = db2File.ReadEnum <SheathType>("Sheath Type", TypeCode.Int32);

                Storage.ItemTemplates.Add(entry, item, packet.TimeSpan);
                packet.AddSniffData(StoreNameType.Item, (int)entry, "DB_REPLY");
                break;
            }

            case DB2Hash.Item_sparse:
            {
                var item = Storage.ItemTemplates.ContainsKey(entry) ? Storage.ItemTemplates[entry].Item1 : new ItemTemplate();

                db2File.ReadEntry <UInt32>(StoreNameType.Item, "Item Sparse Entry");
                item.Quality            = db2File.ReadEnum <ItemQuality>("Quality", TypeCode.Int32);
                item.Flags1             = db2File.ReadEnum <ItemProtoFlags>("Flags 1", TypeCode.UInt32);
                item.Flags2             = db2File.ReadEnum <ItemFlagExtra>("Flags 2", TypeCode.Int32);
                item.Flags3             = db2File.ReadUInt32("Flags 3");
                item.Unk430_1           = db2File.ReadSingle("Unk430_1");
                item.Unk430_2           = db2File.ReadSingle("Unk430_2");
                item.BuyCount           = db2File.ReadUInt32("Buy count");
                item.BuyPrice           = db2File.ReadUInt32("Buy Price");
                item.SellPrice          = db2File.ReadUInt32("Sell Price");
                item.InventoryType      = db2File.ReadEnum <InventoryType>("Inventory Type", TypeCode.Int32);
                item.AllowedClasses     = db2File.ReadEnum <ClassMask>("Allowed Classes", TypeCode.Int32);
                item.AllowedRaces       = db2File.ReadEnum <RaceMask>("Allowed Races", TypeCode.Int32);
                item.ItemLevel          = db2File.ReadUInt32("Item Level");
                item.RequiredLevel      = db2File.ReadUInt32("Required Level");
                item.RequiredSkillId    = db2File.ReadUInt32("Required Skill ID");
                item.RequiredSkillLevel = db2File.ReadUInt32("Required Skill Level");
                item.RequiredSpell      = (uint)db2File.ReadEntry <Int32>(StoreNameType.Spell, "Required Spell");
                item.RequiredHonorRank  = db2File.ReadUInt32("Required Honor Rank");
                item.RequiredCityRank   = db2File.ReadUInt32("Required City Rank");
                item.RequiredRepFaction = db2File.ReadUInt32("Required Rep Faction");
                item.RequiredRepValue   = db2File.ReadUInt32("Required Rep Value");
                item.MaxCount           = db2File.ReadInt32("Max Count");
                item.MaxStackSize       = db2File.ReadInt32("Max Stack Size");
                item.ContainerSlots     = db2File.ReadUInt32("Container Slots");

                item.StatTypes = new ItemModType[10];
                for (var i = 0; i < 10; i++)
                {
                    var statType = db2File.ReadEnum <ItemModType>("Stat Type", TypeCode.Int32, i);
                    item.StatTypes[i] = statType == ItemModType.None ? ItemModType.Mana : statType;         // TDB
                }

                item.StatValues = new int[10];
                for (var i = 0; i < 10; i++)
                {
                    item.StatValues[i] = db2File.ReadInt32("Stat Value", i);
                }

                item.StatUnk1 = new int[10];
                for (var i = 0; i < 10; i++)
                {
                    item.StatUnk1[i] = db2File.ReadInt32("Unk UInt32 1", i);
                }

                item.StatUnk2 = new int[10];
                for (var i = 0; i < 10; i++)
                {
                    item.StatUnk2[i] = db2File.ReadInt32("Unk UInt32 2", i);
                }

                item.ScalingStatDistribution = db2File.ReadInt32("Scaling Stat Distribution");
                item.DamageType = db2File.ReadEnum <DamageType>("Damage Type", TypeCode.Int32);
                item.Delay      = db2File.ReadUInt32("Delay");
                item.RangedMod  = db2File.ReadSingle("Ranged Mod");

                item.TriggeredSpellIds = new int[5];
                for (var i = 0; i < 5; i++)
                {
                    item.TriggeredSpellIds[i] = db2File.ReadEntry <Int32>(StoreNameType.Spell, "Triggered Spell ID", i);
                }

                item.TriggeredSpellTypes = new ItemSpellTriggerType[5];
                for (var i = 0; i < 5; i++)
                {
                    item.TriggeredSpellTypes[i] = db2File.ReadEnum <ItemSpellTriggerType>("Trigger Spell Type", TypeCode.Int32, i);
                }

                item.TriggeredSpellCharges = new int[5];
                for (var i = 0; i < 5; i++)
                {
                    item.TriggeredSpellCharges[i] = db2File.ReadInt32("Triggered Spell Charges", i);
                }

                item.TriggeredSpellCooldowns = new int[5];
                for (var i = 0; i < 5; i++)
                {
                    item.TriggeredSpellCooldowns[i] = db2File.ReadInt32("Triggered Spell Cooldown", i);
                }

                item.TriggeredSpellCategories = new uint[5];
                for (var i = 0; i < 5; i++)
                {
                    item.TriggeredSpellCategories[i] = db2File.ReadUInt32("Triggered Spell Category", i);
                }

                item.TriggeredSpellCategoryCooldowns = new int[5];
                for (var i = 0; i < 5; i++)
                {
                    item.TriggeredSpellCategoryCooldowns[i] = db2File.ReadInt32("Triggered Spell Category Cooldown", i);
                }

                item.Bonding = db2File.ReadEnum <ItemBonding>("Bonding", TypeCode.Int32);

                if (db2File.ReadUInt16() > 0)
                {
                    item.Name = db2File.ReadCString("Name", 0);
                }

                for (var i = 1; i < 4; ++i)
                {
                    if (db2File.ReadUInt16() > 0)
                    {
                        db2File.ReadCString("Name", i);
                    }
                }

                if (db2File.ReadUInt16() > 0)
                {
                    item.Description = db2File.ReadCString("Description");
                }

                item.PageText      = db2File.ReadUInt32("Page Text");
                item.Language      = db2File.ReadEnum <Language>("Language", TypeCode.Int32);
                item.PageMaterial  = db2File.ReadEnum <PageMaterial>("Page Material", TypeCode.Int32);
                item.StartQuestId  = (uint)db2File.ReadEntry <Int32>(StoreNameType.Quest, "Start Quest");
                item.LockId        = db2File.ReadUInt32("Lock ID");
                item.Material      = db2File.ReadEnum <Material>("Material", TypeCode.Int32);
                item.SheathType    = db2File.ReadEnum <SheathType>("Sheath Type", TypeCode.Int32);
                item.RandomPropery = db2File.ReadInt32("Random Property");
                item.RandomSuffix  = db2File.ReadUInt32("Random Suffix");
                item.ItemSet       = db2File.ReadUInt32("Item Set");
                item.AreaId        = db2File.ReadEntry <UInt32>(StoreNameType.Area, "Area");
                var map = db2File.ReadEntry <Int32>(StoreNameType.Map, "Map ID");
                item.MapId         = map;
                item.BagFamily     = db2File.ReadEnum <BagFamilyMask>("Bag Family", TypeCode.Int32);
                item.TotemCategory = db2File.ReadEnum <TotemCategory>("Totem Category", TypeCode.Int32);

                item.ItemSocketColors = new ItemSocketColor[3];
                for (var i = 0; i < 3; i++)
                {
                    item.ItemSocketColors[i] = db2File.ReadEnum <ItemSocketColor>("Socket Color", TypeCode.Int32, i);
                }

                item.SocketContent = new uint[3];
                for (var i = 0; i < 3; i++)
                {
                    item.SocketContent[i] = db2File.ReadUInt32("Socket Item", i);
                }

                item.SocketBonus               = db2File.ReadInt32("Socket Bonus");
                item.GemProperties             = db2File.ReadInt32("Gem Properties");
                item.ArmorDamageModifier       = db2File.ReadSingle("Armor Damage Modifier");
                item.Duration                  = db2File.ReadUInt32("Duration");
                item.ItemLimitCategory         = db2File.ReadInt32("Limit Category");
                item.HolidayId                 = db2File.ReadEnum <Holiday>("Holiday", TypeCode.Int32);
                item.StatScalingFactor         = db2File.ReadSingle("Stat Scaling Factor");
                item.CurrencySubstitutionId    = db2File.ReadUInt32("Currency Substitution Id");
                item.CurrencySubstitutionCount = db2File.ReadUInt32("Currency Substitution Count");

                Storage.ObjectNames.Add(entry, new ObjectName {
                        ObjectType = ObjectType.Item, Name = item.Name
                    }, packet.TimeSpan);
                packet.AddSniffData(StoreNameType.Item, (int)entry, "DB_REPLY");
                break;
            }

            case DB2Hash.KeyChain:
            {
                db2File.ReadUInt32("Key Chain Id");
                db2File.ReadBytes("Key", 32);
                break;
            }

            default:
            {
                db2File.AddValue("Unknown DB2 file type", string.Format(": {0} (0x{0:x})", type));
                for (var i = 0; ; ++i)
                {
                    if (db2File.Length - 4 >= db2File.Position)
                    {
                        var    blockVal = db2File.ReadUpdateField();
                        string value    = blockVal.UInt32Value + "/" + blockVal.SingleValue;
                        packet.AddValue("Block Value " + i, value);
                    }
                    else
                    {
                        var left = db2File.Length - db2File.Position;
                        for (var j = 0; j < left; ++j)
                        {
                            var value = db2File.ReadByte();
                            packet.AddValue("Byte Value " + i, value);
                        }
                        break;
                    }
                }
                break;
            }
            }

            db2File.ClosePacket(false);
        }
示例#5
0
        public static void HandleDBReply(Packet packet)
        {
            var type      = packet.ReadUInt32E <DB2Hash>("TableHash");
            var entry     = packet.ReadInt32("RecordID");
            var timeStamp = packet.ReadUInt32();

            packet.AddValue("Timestamp", Utilities.GetDateTimeFromUnixTime(timeStamp));
            var allow = packet.ReadBit("Allow");

            var size    = packet.ReadInt32("Size");
            var data    = packet.ReadBytes(size);
            var db2File = new Packet(data, packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName);

            if (entry < 0 || !allow)
            {
                packet.WriteLine("Row {0} has been removed.", -entry);
                HotfixStoreMgr.RemoveRecord(type, entry);
            }
            else
            {
                switch (type)
                {
                case DB2Hash.BroadcastText:
                {
                    var bct = new BroadcastText()
                    {
                        Text  = db2File.ReadCString("Text"),
                        Text1 = db2File.ReadCString("Text1"),
                    };

                    bct.ID                   = db2File.ReadUInt32("ID");
                    bct.LanguageID           = db2File.ReadByte("LanguageID");
                    bct.ConditionID          = db2File.ReadUInt32("ConditionID");
                    bct.EmotesID             = db2File.ReadUInt16("EmotesID");
                    bct.Flags                = db2File.ReadByte("Flags");
                    bct.ChatBubbleDurationMs = db2File.ReadUInt32("ChatBubbleDurationMs");

                    bct.SoundEntriesID = new uint?[2];
                    for (int i = 0; i < 2; ++i)
                    {
                        bct.SoundEntriesID[i] = db2File.ReadUInt32("SoundEntriesID", i);
                    }

                    bct.EmoteID    = new ushort?[3];
                    bct.EmoteDelay = new ushort?[3];
                    for (int i = 0; i < 3; ++i)
                    {
                        bct.EmoteID[i] = db2File.ReadUInt16("EmoteID", i);
                    }
                    for (int i = 0; i < 3; ++i)
                    {
                        bct.EmoteDelay[i] = db2File.ReadUInt16("EmoteDelay", i);
                    }

                    Storage.BroadcastTexts.Add(bct, packet.TimeSpan);

                    if (ClientLocale.PacketLocale != LocaleConstant.enUS)
                    {
                        BroadcastTextLocale lbct = new BroadcastTextLocale
                        {
                            ID        = bct.ID,
                            TextLang  = bct.Text,
                            Text1Lang = bct.Text1
                        };
                        Storage.BroadcastTextLocales.Add(lbct, packet.TimeSpan);
                    }
                    break;
                }

                default:
                    HotfixStoreMgr.AddRecord(type, entry, db2File);
                    break;
                }

                db2File.ClosePacket(false);
            }
        }
示例#6
0
        public static void HandleDBReply(Packet packet)
        {
            var size    = packet.ReadInt32("Size");
            var data    = packet.ReadBytes(size);
            var db2File = new Packet(data, packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName);

            var type = packet.ReadEnum <DB2Hash>("DB2 File", TypeCode.UInt32);

            packet.ReadTime("Hotfix date");
            var entry = (uint)packet.ReadInt32("Entry");

            if ((int)entry < 0)
            {
                packet.WriteLine("Row {0} has been removed.", -(int)entry);
                return;
            }

            switch (type)
            {
            case DB2Hash.BroadcastText:
            {
                var broadcastText = new BroadcastText();

                var Id = db2File.ReadEntry("Id");
                broadcastText.language = db2File.ReadUInt32("Language");
                if (db2File.ReadUInt16() > 0)
                {
                    broadcastText.MaleText = db2File.ReadCString("Male Text");
                }
                if (db2File.ReadUInt16() > 0)
                {
                    broadcastText.FemaleText = db2File.ReadCString("Female Text");
                }

                broadcastText.EmoteID    = new uint[3];
                broadcastText.EmoteDelay = new uint[3];
                for (var i = 0; i < 3; ++i)
                {
                    broadcastText.EmoteID[i] = (uint)db2File.ReadInt32("Emote ID", i);
                }
                for (var i = 0; i < 3; ++i)
                {
                    broadcastText.EmoteDelay[i] = (uint)db2File.ReadInt32("Emote Delay", i);
                }

                broadcastText.soundId = db2File.ReadUInt32("Sound Id");
                broadcastText.unk1    = db2File.ReadUInt32("Unk MoP 1");  // unk emote
                broadcastText.unk2    = db2File.ReadUInt32("Unk MoP 2");  // kind of type?

                Storage.BroadcastTexts.Add((uint)Id.Key, broadcastText, packet.TimeSpan);
                packet.AddSniffData(StoreNameType.BroadcastText, Id.Key, "BROADCAST_TEXT");
                break;
            }

            case DB2Hash.Creature:     // New structure - 5.4.0
            {
                db2File.ReadUInt32("Creature Id");
                db2File.ReadUInt32("Item Id 1");
                db2File.ReadUInt32("Item Id 2");
                db2File.ReadUInt32("Item Id 3");
                db2File.ReadUInt32("Mount");
                for (var i = 0; i < 4; ++i)
                {
                    db2File.ReadInt32("Display Id", i);
                }

                for (var i = 0; i < 4; ++i)
                {
                    db2File.ReadSingle("Display Id Probability", i);
                }

                if (db2File.ReadUInt16() > 0)
                {
                    db2File.ReadCString("Name");
                }

                if (db2File.ReadUInt16() > 0)
                {
                    db2File.ReadCString("SubName");
                }

                if (db2File.ReadUInt16() > 0)
                {
                    db2File.ReadCString("Female SubName");
                }

                db2File.ReadUInt32("Rank");
                db2File.ReadUInt32("Inhabit Type");
                break;
            }

            case DB2Hash.CreatureDifficulty:
            {
                var creatureDifficulty = new CreatureDifficulty();

                var Id = db2File.ReadEntry("Id");
                creatureDifficulty.CreatureID = db2File.ReadUInt32("Creature Id");
                creatureDifficulty.FactionID  = db2File.ReadUInt32("Faction Template Id");
                creatureDifficulty.Expansion  = db2File.ReadInt32("Expansion");
                creatureDifficulty.MinLevel   = db2File.ReadInt32("Min Level");
                creatureDifficulty.MaxLevel   = db2File.ReadInt32("Max Level");

                creatureDifficulty.Flags = new uint[5];
                for (var i = 0; i < 5; ++i)
                {
                    creatureDifficulty.Flags[i] = db2File.ReadUInt32("Flags", i);
                }

                Storage.CreatureDifficultys.Add((uint)Id.Key, creatureDifficulty, packet.TimeSpan);
                break;
            }

            case DB2Hash.GameObjects:
            {
                var gameObjectTemplateDB2 = new GameObjectTemplateDB2();

                var Id = db2File.ReadEntry("GameObject Id");

                gameObjectTemplateDB2.MapID = db2File.ReadUInt32("Map");

                gameObjectTemplateDB2.DisplayId = db2File.ReadUInt32("Display Id");

                gameObjectTemplateDB2.PositionX = db2File.ReadSingle("Position X");
                gameObjectTemplateDB2.PositionY = db2File.ReadSingle("Position Y");
                gameObjectTemplateDB2.PositionZ = db2File.ReadSingle("Position Z");
                gameObjectTemplateDB2.RotationX = db2File.ReadSingle("Rotation X");
                gameObjectTemplateDB2.RotationY = db2File.ReadSingle("Rotation Y");
                gameObjectTemplateDB2.RotationZ = db2File.ReadSingle("Rotation Z");
                gameObjectTemplateDB2.RotationW = db2File.ReadSingle("Rotation W");

                gameObjectTemplateDB2.Size = db2File.ReadSingle("Size");
                gameObjectTemplateDB2.Type = db2File.ReadEnum <GameObjectType>("Type", TypeCode.Int32);

                gameObjectTemplateDB2.Data = new int[4];
                for (var i = 0; i < gameObjectTemplateDB2.Data.Length; i++)
                {
                    gameObjectTemplateDB2.Data[i] = db2File.ReadInt32("Data", i);
                }

                if (db2File.ReadUInt16() > 0)
                {
                    gameObjectTemplateDB2.Name = db2File.ReadCString("Name");
                }

                Storage.GameObjectTemplateDB2s.Add((uint)Id.Key, gameObjectTemplateDB2, packet.TimeSpan);
                break;
            }

            case DB2Hash.Item:
            {
                var item = Storage.ItemTemplates.ContainsKey(entry)
                        ? Storage.ItemTemplates[entry].Item1
                        : new ItemTemplate();

                db2File.ReadEntry <UInt32>(StoreNameType.Item, "Item Entry");
                item.Class    = db2File.ReadEnum <ItemClass>("Class", TypeCode.Int32);
                item.SubClass = db2File.ReadUInt32("Sub Class");
                item.SoundOverrideSubclass = db2File.ReadInt32("Sound Override Subclass");
                item.Material      = db2File.ReadEnum <Material>("Material", TypeCode.Int32);
                item.DisplayId     = db2File.ReadUInt32("Display ID");
                item.InventoryType = db2File.ReadEnum <InventoryType>("Inventory Type", TypeCode.UInt32);
                item.SheathType    = db2File.ReadEnum <SheathType>("Sheath Type", TypeCode.Int32);

                Storage.ItemTemplates.Add(entry, item, packet.TimeSpan);
                packet.AddSniffData(StoreNameType.Item, (int)entry, "DB_REPLY");
                break;
            }

            case DB2Hash.ItemExtendedCost:
            {
                db2File.ReadUInt32("Item Extended Cost Entry");
                db2File.ReadUInt32("Required Honor Points");
                db2File.ReadUInt32("Required Arena Points");
                db2File.ReadUInt32("Required Arena Slot");
                for (var i = 0; i < 5; ++i)
                {
                    db2File.ReadUInt32("Required Item", i);
                }

                for (var i = 0; i < 5; ++i)
                {
                    db2File.ReadUInt32("Required Item Count", i);
                }

                db2File.ReadUInt32("Required Personal Arena Rating");
                db2File.ReadUInt32("Item Purchase Group");
                for (var i = 0; i < 5; ++i)
                {
                    db2File.ReadUInt32("Required Currency", i);
                }

                for (var i = 0; i < 5; ++i)
                {
                    db2File.ReadUInt32("Required Currency Count", i);
                }

                db2File.ReadUInt32("Required Faction Id");
                db2File.ReadUInt32("Required Faction Standing");
                db2File.ReadUInt32("Requirement Flags");
                db2File.ReadUInt32("Required Guild Level");
                db2File.ReadUInt32("Required Achievement");
                break;
            }

            case DB2Hash.Item_sparse:
            {
                var item = Storage.ItemTemplates.ContainsKey(entry)
                        ? Storage.ItemTemplates[entry].Item1
                        : new ItemTemplate();

                db2File.ReadEntry <UInt32>(StoreNameType.Item, "Item Sparse Entry");
                item.Quality            = db2File.ReadEnum <ItemQuality>("Quality", TypeCode.Int32);
                item.Flags1             = db2File.ReadEnum <ItemProtoFlags>("Flags 1", TypeCode.UInt32);
                item.Flags2             = db2File.ReadEnum <ItemFlagExtra>("Flags 2", TypeCode.Int32);
                item.Flags3             = db2File.ReadUInt32("Flags 3");
                item.Unk430_1           = db2File.ReadSingle("Unk430_1");
                item.Unk430_2           = db2File.ReadSingle("Unk430_2");
                item.BuyCount           = db2File.ReadUInt32("Buy count");
                item.BuyPrice           = db2File.ReadUInt32("Buy Price");
                item.SellPrice          = db2File.ReadUInt32("Sell Price");
                item.InventoryType      = db2File.ReadEnum <InventoryType>("Inventory Type", TypeCode.Int32);
                item.AllowedClasses     = db2File.ReadEnum <ClassMask>("Allowed Classes", TypeCode.Int32);
                item.AllowedRaces       = db2File.ReadEnum <RaceMask>("Allowed Races", TypeCode.Int32);
                item.ItemLevel          = db2File.ReadUInt32("Item Level");
                item.RequiredLevel      = db2File.ReadUInt32("Required Level");
                item.RequiredSkillId    = db2File.ReadUInt32("Required Skill ID");
                item.RequiredSkillLevel = db2File.ReadUInt32("Required Skill Level");
                item.RequiredSpell      = (uint)db2File.ReadEntry <Int32>(StoreNameType.Spell, "Required Spell");
                item.RequiredHonorRank  = db2File.ReadUInt32("Required Honor Rank");
                item.RequiredCityRank   = db2File.ReadUInt32("Required City Rank");
                item.RequiredRepFaction = db2File.ReadUInt32("Required Rep Faction");
                item.RequiredRepValue   = db2File.ReadUInt32("Required Rep Value");
                item.MaxCount           = db2File.ReadInt32("Max Count");
                item.MaxStackSize       = db2File.ReadInt32("Max Stack Size");
                item.ContainerSlots     = db2File.ReadUInt32("Container Slots");

                item.StatTypes = new ItemModType[10];
                for (var i = 0; i < 10; i++)
                {
                    var statType = db2File.ReadEnum <ItemModType>("Stat Type", TypeCode.Int32, i);
                    item.StatTypes[i] = statType == ItemModType.None ? ItemModType.Mana : statType;     // TDB
                }

                item.StatValues = new int[10];
                for (var i = 0; i < 10; i++)
                {
                    item.StatValues[i] = db2File.ReadInt32("Stat Value", i);
                }

                item.StatUnk1 = new int[10];
                for (var i = 0; i < 10; i++)
                {
                    item.StatUnk1[i] = db2File.ReadInt32("Unk UInt32 1", i);
                }

                item.StatUnk2 = new int[10];
                for (var i = 0; i < 10; i++)
                {
                    item.StatUnk2[i] = db2File.ReadInt32("Unk UInt32 2", i);
                }

                item.ScalingStatDistribution = db2File.ReadInt32("Scaling Stat Distribution");
                item.DamageType = db2File.ReadEnum <DamageType>("Damage Type", TypeCode.Int32);
                item.Delay      = db2File.ReadUInt32("Delay");
                item.RangedMod  = db2File.ReadSingle("Ranged Mod");

                item.TriggeredSpellIds = new int[5];
                for (var i = 0; i < 5; i++)
                {
                    item.TriggeredSpellIds[i] = db2File.ReadEntry <Int32>(StoreNameType.Spell,
                                                                          "Triggered Spell ID", i);
                }

                item.TriggeredSpellTypes = new ItemSpellTriggerType[5];
                for (var i = 0; i < 5; i++)
                {
                    item.TriggeredSpellTypes[i] = db2File.ReadEnum <ItemSpellTriggerType>("Trigger Spell Type",
                                                                                          TypeCode.Int32, i);
                }

                item.TriggeredSpellCharges = new int[5];
                for (var i = 0; i < 5; i++)
                {
                    item.TriggeredSpellCharges[i] = db2File.ReadInt32("Triggered Spell Charges", i);
                }

                item.TriggeredSpellCooldowns = new int[5];
                for (var i = 0; i < 5; i++)
                {
                    item.TriggeredSpellCooldowns[i] = db2File.ReadInt32("Triggered Spell Cooldown", i);
                }

                item.TriggeredSpellCategories = new uint[5];
                for (var i = 0; i < 5; i++)
                {
                    item.TriggeredSpellCategories[i] = db2File.ReadUInt32("Triggered Spell Category", i);
                }

                item.TriggeredSpellCategoryCooldowns = new int[5];
                for (var i = 0; i < 5; i++)
                {
                    item.TriggeredSpellCategoryCooldowns[i] = db2File.ReadInt32(
                        "Triggered Spell Category Cooldown", i);
                }

                item.Bonding = db2File.ReadEnum <ItemBonding>("Bonding", TypeCode.Int32);

                if (db2File.ReadUInt16() > 0)
                {
                    item.Name = db2File.ReadCString("Name", 0);
                }

                for (var i = 1; i < 4; ++i)
                {
                    if (db2File.ReadUInt16() > 0)
                    {
                        db2File.ReadCString("Name", i);
                    }
                }

                if (db2File.ReadUInt16() > 0)
                {
                    item.Description = db2File.ReadCString("Description");
                }

                item.PageText      = db2File.ReadUInt32("Page Text");
                item.Language      = db2File.ReadEnum <Language>("Language", TypeCode.Int32);
                item.PageMaterial  = db2File.ReadEnum <PageMaterial>("Page Material", TypeCode.Int32);
                item.StartQuestId  = (uint)db2File.ReadEntry <Int32>(StoreNameType.Quest, "Start Quest");
                item.LockId        = db2File.ReadUInt32("Lock ID");
                item.Material      = db2File.ReadEnum <Material>("Material", TypeCode.Int32);
                item.SheathType    = db2File.ReadEnum <SheathType>("Sheath Type", TypeCode.Int32);
                item.RandomPropery = db2File.ReadInt32("Random Property");
                item.RandomSuffix  = db2File.ReadUInt32("Random Suffix");
                item.ItemSet       = db2File.ReadUInt32("Item Set");
                item.AreaId        = db2File.ReadEntry <UInt32>(StoreNameType.Area, "Area");
                item.MapId         = db2File.ReadEntry <Int32>(StoreNameType.Map, "Map ID");
                item.BagFamily     = db2File.ReadEnum <BagFamilyMask>("Bag Family", TypeCode.Int32);
                item.TotemCategory = db2File.ReadEnum <TotemCategory>("Totem Category", TypeCode.Int32);

                item.ItemSocketColors = new ItemSocketColor[3];
                for (var i = 0; i < 3; i++)
                {
                    item.ItemSocketColors[i] = db2File.ReadEnum <ItemSocketColor>("Socket Color", TypeCode.Int32, i);
                }

                item.SocketContent = new uint[3];
                for (var i = 0; i < 3; i++)
                {
                    item.SocketContent[i] = db2File.ReadUInt32("Socket Item", i);
                }

                item.SocketBonus               = db2File.ReadInt32("Socket Bonus");
                item.GemProperties             = db2File.ReadInt32("Gem Properties");
                item.ArmorDamageModifier       = db2File.ReadSingle("Armor Damage Modifier");
                item.Duration                  = db2File.ReadUInt32("Duration");
                item.ItemLimitCategory         = db2File.ReadInt32("Limit Category");
                item.HolidayId                 = db2File.ReadEnum <Holiday>("Holiday", TypeCode.Int32);
                item.StatScalingFactor         = db2File.ReadSingle("Stat Scaling Factor");
                item.CurrencySubstitutionId    = db2File.ReadUInt32("Currency Substitution Id");
                item.CurrencySubstitutionCount = db2File.ReadUInt32("Currency Substitution Count");

                Storage.ObjectNames.Add(entry, new ObjectName {
                        ObjectType = ObjectType.Item, Name = item.Name
                    },
                                        packet.TimeSpan);
                packet.AddSniffData(StoreNameType.Item, (int)entry, "DB_REPLY");
                break;
            }

            case DB2Hash.KeyChain:
            {
                db2File.ReadUInt32("Key Chain Id");
                db2File.ReadBytes("Key", 32);
                break;
            }

            case DB2Hash.SceneScript:     // lua ftw!
            {
                db2File.ReadUInt32("Scene Script Id");
                if (db2File.ReadUInt16() > 0)
                {
                    db2File.ReadCString("Name");
                }

                if (db2File.ReadUInt16() > 0)
                {
                    db2File.ReadCString("Script");
                }
                db2File.ReadUInt32("Previous Scene Script Part");
                db2File.ReadUInt32("Next Scene Script Part");
                break;
            }

            case DB2Hash.Vignette:
            {
                db2File.ReadUInt32("Vignette Entry");
                if (db2File.ReadUInt16() > 0)
                {
                    db2File.ReadCString("Name");
                }

                db2File.ReadUInt32("Icon");
                db2File.ReadUInt32("Flag");     // not 100% sure (8 & 32 as values only) - todo verify with more data
                db2File.ReadSingle("Unk Float 1");
                db2File.ReadSingle("Unk Float 2");
                break;
            }

            case DB2Hash.WbAccessControlList:
            {
                db2File.ReadUInt32("Id");

                if (db2File.ReadUInt16() > 0)
                {
                    db2File.ReadCString("Address");
                }

                db2File.ReadUInt32("Unk MoP 1");
                db2File.ReadUInt32("Unk MoP 2");
                db2File.ReadUInt32("Unk MoP 3");
                db2File.ReadUInt32("Unk MoP 4");     // flags?
                break;
            }

            default:
            {
                db2File.AddValue("Unknown DB2 file type", string.Format("{0} (0x{0:x})", type));
                for (var i = 0;; ++i)
                {
                    if (db2File.Length - 4 >= db2File.Position)
                    {
                        var    blockVal = db2File.ReadUpdateField();
                        string value    = blockVal.UInt32Value + "/" + blockVal.SingleValue;
                        packet.AddValue("Block Value " + i, value);
                    }
                    else
                    {
                        var left = db2File.Length - db2File.Position;
                        for (var j = 0; j < left; ++j)
                        {
                            var value = db2File.ReadByte();
                            packet.AddValue("Byte Value " + i, value);
                        }
                        break;
                    }
                }
                break;
            }
            }

            db2File.ClosePacket(false);
        }
        public static void HandleDBReply(Packet packet)
        {
            var dbReply = packet.Holder.DbReply = new();
            var type    = packet.ReadUInt32E <DB2Hash>("TableHash");

            dbReply.TableHash = (uint)type;
            var entry     = dbReply.RecordId = packet.ReadInt32("RecordID");
            var timeStamp = packet.ReadUInt32();
            var time      = packet.AddValue("Timestamp", Utilities.GetDateTimeFromUnixTime(timeStamp));

            dbReply.Time = Timestamp.FromDateTime(DateTime.SpecifyKind(time, DateTimeKind.Utc));
            int statusBits = ClientVersion.AddedInVersion(ClientVersionBuild.V9_1_0_39185) ? 3 : 2;
            var status     = packet.ReadBitsE <HotfixStatus>("Status", statusBits);

            switch (status)
            {
            case HotfixStatus.Valid:
                dbReply.Status = PacketDbReplyRecordStatus.RecordStatusValid;
                break;

            case HotfixStatus.RecordRemoved:
                dbReply.Status = PacketDbReplyRecordStatus.RecordStatusRecordRemoved;
                break;

            case HotfixStatus.Invalid:
                dbReply.Status = PacketDbReplyRecordStatus.RecordStatusInvalid;
                break;

            case HotfixStatus.NotPublic:
                dbReply.Status = PacketDbReplyRecordStatus.RecordStatusNotPublic;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            var size    = packet.ReadInt32("Size");
            var data    = packet.ReadBytes(size);
            var db2File = new Packet(data, packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName);

            switch (status)
            {
            case HotfixStatus.Valid:
            {
                switch (type)
                {
                case DB2Hash.BroadcastText:
                {
                    var bct = new BroadcastText()
                    {
                        Text  = db2File.ReadCString("Text"),
                        Text1 = db2File.ReadCString("Text1"),
                    };

                    bct.ID                   = db2File.ReadUInt32("ID");
                    bct.LanguageID           = db2File.ReadInt32("LanguageID");
                    bct.ConditionID          = db2File.ReadUInt32("ConditionID");
                    bct.EmotesID             = db2File.ReadUInt16("EmotesID");
                    bct.Flags                = db2File.ReadByte("Flags");
                    bct.ChatBubbleDurationMs = db2File.ReadUInt32("ChatBubbleDurationMs");

                    bct.SoundEntriesID = new uint?[2];
                    for (int i = 0; i < 2; ++i)
                    {
                        bct.SoundEntriesID[i] = db2File.ReadUInt32("SoundEntriesID", i);
                    }

                    bct.EmoteID    = new ushort?[3];
                    bct.EmoteDelay = new ushort?[3];
                    for (int i = 0; i < 3; ++i)
                    {
                        bct.EmoteID[i] = db2File.ReadUInt16("EmoteID", i);
                    }
                    for (int i = 0; i < 3; ++i)
                    {
                        bct.EmoteDelay[i] = db2File.ReadUInt16("EmoteDelay", i);
                    }

                    Storage.BroadcastTexts.Add(bct, packet.TimeSpan);

                    if (ClientLocale.PacketLocale != LocaleConstant.enUS)
                    {
                        BroadcastTextLocale lbct = new BroadcastTextLocale
                        {
                            ID        = bct.ID,
                            TextLang  = bct.Text,
                            Text1Lang = bct.Text1
                        };
                        Storage.BroadcastTextLocales.Add(lbct, packet.TimeSpan);
                    }

                    dbReply.BroadcastText = new PacketDbReplyBroadcastText()
                    {
                        Id                 = bct.ID.Value,
                        Text0              = bct.Text,
                        Text1              = bct.Text1,
                        Language           = bct.LanguageID.Value,
                        ConditionId        = bct.ConditionID.Value,
                        EmotesId           = bct.EmotesID.Value,
                        Flags              = bct.Flags.Value,
                        ChatBubbleDuration = bct.ChatBubbleDurationMs.Value,
                    };
                    for (int i = 0; i < 2; ++i)
                    {
                        dbReply.BroadcastText.Sounds.Add(bct.SoundEntriesID[i] ?? 0);
                    }
                    for (int i = 0; i < 3; ++i)
                    {
                        dbReply.BroadcastText.Emotes.Add(new BroadcastTextEmote()
                                {
                                    EmoteId = bct.EmoteID[i] ?? 0, Delay = bct.EmoteDelay[i] ?? 0
                                });
                    }
                    break;
                }

                default:
                    HotfixStoreMgr.AddRecord(type, entry, db2File);
                    break;
                }

                if (db2File.Position != db2File.Length)
                {
                    HandleHotfixOptionalData(packet, type, entry, db2File);
                }

                db2File.ClosePacket(false);
                break;
            }

            case HotfixStatus.RecordRemoved:
            {
                packet.WriteLine($"Row {entry} has been removed.");
                HotfixStoreMgr.RemoveRecord(type, entry);
                break;
            }

            case HotfixStatus.Invalid:
            {
                // sniffs from others may have the data
                packet.WriteLine($"Row {entry} is invalid.");
                break;
            }

            case HotfixStatus.NotPublic:
            {
                packet.WriteLine($"Row {entry} is not public.");
                break;
            }

            default:
            {
                packet.WriteLine($"Unhandled status: {status}");
                break;
            }
            }
        }
示例#8
0
        public static void HandleDBReply(Packet packet)
        {
            var type  = packet.ReadUInt32E <DB2Hash>("DB2 File");
            var entry = (uint)packet.ReadInt32("Entry");

            packet.ReadTime("Hotfix date");

            var size    = packet.ReadInt32("Size");
            var data    = packet.ReadBytes(size);
            var db2File = new Packet(data, packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName);

            if ((int)entry < 0)
            {
                packet.WriteLine("Row {0} has been removed.", -(int)entry);
                return;
            }

            switch (type)
            {
            case DB2Hash.BroadcastText:
            {
                var broadcastText = new BroadcastText();

                var id = db2File.ReadEntry("Id");
                broadcastText.language = db2File.ReadInt32("Language");
                var maletextLength = db2File.ReadUInt16();
                broadcastText.MaleText = db2File.ReadWoWString("Male Text", maletextLength);
                var femaletextLength = db2File.ReadUInt16();
                broadcastText.FemaleText = db2File.ReadWoWString("Female Text", femaletextLength);

                broadcastText.EmoteID    = new uint[3];
                broadcastText.EmoteDelay = new uint[3];
                for (var i = 0; i < 3; ++i)
                {
                    broadcastText.EmoteID[i] = (uint)db2File.ReadInt32("Emote ID", i);
                }
                for (var i = 0; i < 3; ++i)
                {
                    broadcastText.EmoteDelay[i] = (uint)db2File.ReadInt32("Emote Delay", i);
                }

                broadcastText.soundId = db2File.ReadUInt32("Sound Id");
                broadcastText.unk1    = db2File.ReadUInt32("Unk MoP 1");  // unk emote
                broadcastText.unk2    = db2File.ReadUInt32("Unk MoP 2");  // kind of type?

                Storage.BroadcastTexts.Add((uint)id.Key, broadcastText, packet.TimeSpan);
                packet.AddSniffData(StoreNameType.BroadcastText, id.Key, "BROADCAST_TEXT");
                break;
            }

            case DB2Hash.Creature:     // New structure - 6.0.2
            {
                db2File.ReadUInt32("Creature ID");
                db2File.ReadInt32E <CreatureType>("Type");

                for (var i = 0; i < 3; ++i)
                {
                    db2File.ReadUInt32 <ItemId>("Item ID", i);
                }

                db2File.ReadUInt32("Mount");
                for (var i = 0; i < 4; ++i)
                {
                    db2File.ReadInt32("Display ID", i);
                }

                for (var i = 0; i < 4; ++i)
                {
                    db2File.ReadSingle("Display ID Probability", i);
                }

                if (db2File.ReadUInt16() > 0)
                {
                    db2File.ReadCString("Name");
                }

                if (db2File.ReadUInt16() > 0)
                {
                    db2File.ReadCString("Female Name");
                }

                if (db2File.ReadUInt16() > 0)
                {
                    db2File.ReadCString("SubName");
                }

                if (db2File.ReadUInt16() > 0)
                {
                    db2File.ReadCString("Female SubName");
                }

                db2File.ReadUInt32("Rank");
                db2File.ReadUInt32("Inhabit Type");
                break;
            }

            case DB2Hash.CreatureDifficulty:
            {
                var creatureDifficulty = new CreatureDifficulty();

                var id = db2File.ReadEntry("Id");
                creatureDifficulty.CreatureID = db2File.ReadUInt32("Creature Id");
                creatureDifficulty.FactionID  = db2File.ReadUInt32("Faction Template Id");
                creatureDifficulty.Expansion  = db2File.ReadInt32("Expansion");
                creatureDifficulty.MinLevel   = db2File.ReadInt32("Min Level");
                creatureDifficulty.MaxLevel   = db2File.ReadInt32("Max Level");

                creatureDifficulty.Flags = new uint[5];
                for (var i = 0; i < 5; ++i)
                {
                    creatureDifficulty.Flags[i] = db2File.ReadUInt32("Flags", i);
                }

                Storage.CreatureDifficultys.Add((uint)id.Key, creatureDifficulty, packet.TimeSpan);
                break;
            }

            case DB2Hash.CurvePoint:
            {
                var curvePoint = new CurvePoint();
                var id         = db2File.ReadUInt32("ID");
                curvePoint.CurveID = db2File.ReadUInt32("CurveID");
                curvePoint.Index   = db2File.ReadUInt32("Index");
                curvePoint.X       = db2File.ReadSingle("X");
                curvePoint.Y       = db2File.ReadSingle("Y");

                Storage.CurvePoints.Add(id, curvePoint, packet.TimeSpan);
                break;
            }

            case DB2Hash.GameObjects:     // New structure - 6.0.2
            {
                var gameObjectTemplateDB2 = new GameObjectTemplateDB2();

                var id = db2File.ReadEntry("ID");

                gameObjectTemplateDB2.MapID = db2File.ReadUInt32("Map");

                gameObjectTemplateDB2.DisplayId = db2File.ReadUInt32("DisplayID");

                gameObjectTemplateDB2.PositionX = db2File.ReadSingle("PositionX");
                gameObjectTemplateDB2.PositionY = db2File.ReadSingle("PositionY");
                gameObjectTemplateDB2.PositionZ = db2File.ReadSingle("PositionZ");
                gameObjectTemplateDB2.RotationX = db2File.ReadSingle("RotationX");
                gameObjectTemplateDB2.RotationY = db2File.ReadSingle("RotationY");
                gameObjectTemplateDB2.RotationZ = db2File.ReadSingle("RotationZ");
                gameObjectTemplateDB2.RotationW = db2File.ReadSingle("RotationW");

                gameObjectTemplateDB2.Size = db2File.ReadSingle("Size");

                db2File.ReadInt32("Phase Use Flags");
                gameObjectTemplateDB2.PhaseId      = db2File.ReadInt32("PhaseID");
                gameObjectTemplateDB2.PhaseGroupId = db2File.ReadInt32("PhaseGroupID");

                gameObjectTemplateDB2.Type = db2File.ReadInt32E <GameObjectType>("Type");

                gameObjectTemplateDB2.Data = new int[8];
                for (var i = 0; i < gameObjectTemplateDB2.Data.Length; i++)
                {
                    gameObjectTemplateDB2.Data[i] = db2File.ReadInt32("Data", i);
                }

                if (db2File.ReadUInt16() > 0)
                {
                    gameObjectTemplateDB2.Name = db2File.ReadCString("Name");
                }

                Storage.GameObjectTemplateDB2s.Add((uint)id.Key, gameObjectTemplateDB2, packet.TimeSpan);
                break;
            }

            case DB2Hash.Item:     // New structure - 6.0.2
            {
                var item = Storage.ItemTemplates.ContainsKey(entry)
                        ? Storage.ItemTemplates[entry].Item1
                        : new ItemTemplate();

                db2File.ReadUInt32 <ItemId>("Item ID");
                item.Class    = db2File.ReadInt32E <ItemClass>("Class");
                item.SubClass = db2File.ReadUInt32("Sub Class");
                item.SoundOverrideSubclass = db2File.ReadInt32("Sound Override Subclass");
                item.Material      = db2File.ReadInt32E <Material>("Material");
                item.InventoryType = db2File.ReadUInt32E <InventoryType>("Inventory Type");
                item.SheathType    = db2File.ReadInt32E <SheathType>("Sheath Type");
                db2File.ReadInt32("Icon File Data ID");
                db2File.ReadInt32("Item Group Sounds ID");

                Storage.ItemTemplates.Add(entry, item, packet.TimeSpan);
                packet.AddSniffData(StoreNameType.Item, (int)entry, "DB_REPLY");
                break;
            }

            case DB2Hash.ItemExtendedCost:     // New structure - 6.0.2
            {
                db2File.ReadUInt32("Item Extended Cost ID");
                db2File.ReadUInt32("Required Honor Points");
                db2File.ReadUInt32("Required Arena Points");
                db2File.ReadUInt32("Required Arena Slot");
                for (var i = 0; i < 5; ++i)
                {
                    db2File.ReadUInt32("Required Item", i);
                }

                for (var i = 0; i < 5; ++i)
                {
                    db2File.ReadUInt32("Required Item Count", i);
                }

                db2File.ReadUInt32("Required Personal Arena Rating");
                db2File.ReadUInt32("Item Purchase Group");
                for (var i = 0; i < 5; ++i)
                {
                    db2File.ReadUInt32("Required Currency", i);
                }

                for (var i = 0; i < 5; ++i)
                {
                    db2File.ReadUInt32("Required Currency Count", i);
                }

                db2File.ReadUInt32("Required Faction ID");
                db2File.ReadUInt32("Required Faction Standing");
                db2File.ReadUInt32("Requirement Flags");
                db2File.ReadInt32 <AchievementId>("Required Achievement");
                break;
            }

            case DB2Hash.ItemCurrencyCost:
            {
                db2File.ReadUInt32("ID");
                db2File.ReadUInt32 <ItemId>("Item ID");
                break;
            }

            case DB2Hash.RulesetItemUpgrade:
            {
                db2File.ReadUInt32("ID");
                db2File.ReadUInt32("Item Upgrade Level");
                db2File.ReadUInt32("Item Upgrade ID");
                db2File.ReadUInt32 <ItemId>("Item ID");
                break;
            }

            case DB2Hash.Item_sparse:     // New structure - 6.0.2
            {
                var item = Storage.ItemTemplates.ContainsKey(entry)
                        ? Storage.ItemTemplates[entry].Item1
                        : new ItemTemplate();

                db2File.ReadUInt32 <ItemId>("Item Sparse Entry");
                item.Quality            = db2File.ReadInt32E <ItemQuality>("Quality");
                item.Flags1             = db2File.ReadUInt32E <ItemProtoFlags>("Flags 1");
                item.Flags2             = db2File.ReadInt32E <ItemFlagExtra>("Flags 2");
                item.Flags3             = db2File.ReadUInt32("Flags 3");
                item.Unk430_1           = db2File.ReadSingle("Unk430_1");
                item.Unk430_2           = db2File.ReadSingle("Unk430_2");
                item.BuyCount           = db2File.ReadUInt32("Buy count");
                item.BuyPrice           = db2File.ReadUInt32("Buy Price");
                item.SellPrice          = db2File.ReadUInt32("Sell Price");
                item.InventoryType      = db2File.ReadInt32E <InventoryType>("Inventory Type");
                item.AllowedClasses     = db2File.ReadInt32E <ClassMask>("Allowed Classes");
                item.AllowedRaces       = db2File.ReadInt32E <RaceMask>("Allowed Races");
                item.ItemLevel          = db2File.ReadUInt32("Item Level");
                item.RequiredLevel      = db2File.ReadUInt32("Required Level");
                item.RequiredSkillId    = db2File.ReadUInt32("Required Skill ID");
                item.RequiredSkillLevel = db2File.ReadUInt32("Required Skill Level");
                item.RequiredSpell      = (uint)db2File.ReadInt32 <SpellId>("Required Spell");
                item.RequiredHonorRank  = db2File.ReadUInt32("Required Honor Rank");
                item.RequiredCityRank   = db2File.ReadUInt32("Required City Rank");
                item.RequiredRepFaction = db2File.ReadUInt32("Required Rep Faction");
                item.RequiredRepValue   = db2File.ReadUInt32("Required Rep Value");
                item.MaxCount           = db2File.ReadInt32("Max Count");
                item.MaxStackSize       = db2File.ReadInt32("Max Stack Size");
                item.ContainerSlots     = db2File.ReadUInt32("Container Slots");

                item.StatTypes = new ItemModType[10];
                for (var i = 0; i < 10; i++)
                {
                    var statType = db2File.ReadInt32E <ItemModType>("Stat Type", i);
                    item.StatTypes[i] = statType == ItemModType.None ? ItemModType.Mana : statType;     // TDB
                }

                item.StatValues = new int[10];
                for (var i = 0; i < 10; i++)
                {
                    item.StatValues[i] = db2File.ReadInt32("Stat Value", i);
                }

                item.ScalingValue = new int[10];
                for (var i = 0; i < 10; i++)
                {
                    item.ScalingValue[i] = db2File.ReadInt32("Scaling Value", i);
                }

                item.SocketCostRate = new int[10];
                for (var i = 0; i < 10; i++)
                {
                    item.SocketCostRate[i] = db2File.ReadInt32("Socket Cost Rate", i);
                }

                item.ScalingStatDistribution = db2File.ReadInt32("Scaling Stat Distribution");
                item.DamageType = db2File.ReadInt32E <DamageType>("Damage Type");
                item.Delay      = db2File.ReadUInt32("Delay");
                item.RangedMod  = db2File.ReadSingle("Ranged Mod");
                item.Bonding    = db2File.ReadInt32E <ItemBonding>("Bonding");

                var nameLength = db2File.ReadUInt16();
                item.Name = db2File.ReadWoWString("Name", nameLength, 0);

                for (var i = 1; i < 4; ++i)
                {
                    if (db2File.ReadUInt16() > 0)
                    {
                        db2File.ReadCString("Name", i);
                    }
                }

                var descriptionLength = db2File.ReadUInt16();
                item.Description = db2File.ReadWoWString("Description", descriptionLength);

                item.PageText      = db2File.ReadUInt32("Page Text");
                item.Language      = db2File.ReadInt32E <Language>("Language");
                item.PageMaterial  = db2File.ReadInt32E <PageMaterial>("Page Material");
                item.StartQuestId  = (uint)db2File.ReadInt32 <QuestId>("Start Quest");
                item.LockId        = db2File.ReadUInt32("Lock ID");
                item.Material      = db2File.ReadInt32E <Material>("Material");
                item.SheathType    = db2File.ReadInt32E <SheathType>("Sheath Type");
                item.RandomPropery = db2File.ReadInt32("Random Property");
                item.RandomSuffix  = db2File.ReadUInt32("Random Suffix");
                item.ItemSet       = db2File.ReadUInt32("Item Set");
                item.AreaId        = db2File.ReadUInt32 <AreaId>("Area");
                item.MapId         = db2File.ReadInt32 <MapId>("Map ID");
                item.BagFamily     = db2File.ReadInt32E <BagFamilyMask>("Bag Family");
                item.TotemCategory = db2File.ReadInt32E <TotemCategory>("Totem Category");

                item.ItemSocketColors = new ItemSocketColor[3];
                for (var i = 0; i < 3; i++)
                {
                    item.ItemSocketColors[i] = db2File.ReadInt32E <ItemSocketColor>("Socket Color", i);
                }

                item.SocketBonus               = db2File.ReadInt32("Socket Bonus");
                item.GemProperties             = db2File.ReadInt32("Gem Properties");
                item.ArmorDamageModifier       = db2File.ReadSingle("Armor Damage Modifier");
                item.Duration                  = db2File.ReadUInt32("Duration");
                item.ItemLimitCategory         = db2File.ReadInt32("Limit Category");
                item.HolidayId                 = db2File.ReadInt32E <Holiday>("Holiday");
                item.StatScalingFactor         = db2File.ReadSingle("Stat Scaling Factor");
                item.CurrencySubstitutionId    = db2File.ReadUInt32("Currency Substitution Id");
                item.CurrencySubstitutionCount = db2File.ReadUInt32("Currency Substitution Count");
                item.flagsCustom               = db2File.ReadUInt32("Flags Custom");

                Storage.ObjectNames.Add(entry, new ObjectName {
                        ObjectType = ObjectType.Item, Name = item.Name
                    },
                                        packet.TimeSpan);
                packet.AddSniffData(StoreNameType.Item, (int)entry, "DB_REPLY");
                break;
            }

            case DB2Hash.KeyChain:
            {
                db2File.ReadUInt32("Key Chain ID");
                db2File.ReadBytes("Key", 32);
                break;
            }

            case DB2Hash.SceneScript:     // lua ftw!
            {
                db2File.ReadUInt32("Scene Script ID");
                var nameLength = db2File.ReadUInt16();
                db2File.ReadWoWString("Name", nameLength);

                var scriptLength = db2File.ReadUInt16();
                db2File.ReadWoWString("Script", scriptLength);
                db2File.ReadUInt32("Previous Scene Script Part");
                db2File.ReadUInt32("Next Scene Script Part");
                break;
            }

            case DB2Hash.SpellMisc:     // New structure - 6.0.2
            {
                var spellMisc = new SpellMisc();

                var id = db2File.ReadEntry("ID");

                spellMisc.Attributes       = db2File.ReadUInt32("Attributes");
                spellMisc.AttributesEx     = db2File.ReadUInt32("AttributesEx");
                spellMisc.AttributesExB    = db2File.ReadUInt32("AttributesExB");
                spellMisc.AttributesExC    = db2File.ReadUInt32("AttributesExC");
                spellMisc.AttributesExD    = db2File.ReadUInt32("AttributesExD");
                spellMisc.AttributesExE    = db2File.ReadUInt32("AttributesExE");
                spellMisc.AttributesExF    = db2File.ReadUInt32("AttributesExF");
                spellMisc.AttributesExG    = db2File.ReadUInt32("AttributesExG");
                spellMisc.AttributesExH    = db2File.ReadUInt32("AttributesExH");
                spellMisc.AttributesExI    = db2File.ReadUInt32("AttributesExI");
                spellMisc.AttributesExJ    = db2File.ReadUInt32("AttributesExJ");
                spellMisc.AttributesExK    = db2File.ReadUInt32("AttributesExK");
                spellMisc.AttributesExL    = db2File.ReadUInt32("AttributesExL");
                spellMisc.AttributesExM    = db2File.ReadUInt32("AttributesExM");
                spellMisc.CastingTimeIndex = db2File.ReadUInt32("CastingTimeIndex");
                spellMisc.DurationIndex    = db2File.ReadUInt32("DurationIndex");
                spellMisc.RangeIndex       = db2File.ReadUInt32("RangeIndex");
                spellMisc.Speed            = db2File.ReadSingle("Speed");

                spellMisc.SpellVisualID = new uint[2];
                for (var i = 0; i < 2; ++i)
                {
                    spellMisc.SpellVisualID[i] = db2File.ReadUInt32("SpellVisualID", i);
                }

                spellMisc.SpellIconID         = db2File.ReadUInt32("SpellIconID");
                spellMisc.ActiveIconID        = db2File.ReadUInt32("ActiveIconID");
                spellMisc.SchoolMask          = db2File.ReadUInt32("SchoolMask");
                spellMisc.MultistrikeSpeedMod = db2File.ReadSingle("MultistrikeSpeedMod");

                Storage.SpellMiscs.Add((uint)id.Key, spellMisc, packet.TimeSpan);
                break;
            }

            case DB2Hash.Toy:     // New structure - 6.0.2
            {
                db2File.ReadUInt32("ID");
                db2File.ReadUInt32 <ItemId>("Item ID");
                db2File.ReadUInt32("Flags");

                var descriptionLength = db2File.ReadUInt16();
                db2File.ReadWoWString("Description", descriptionLength);

                db2File.ReadInt32("Source Type");
                break;
            }

            case DB2Hash.Vignette:
            {
                db2File.ReadUInt32("Vignette ID");
                var nameLength = db2File.ReadUInt16();
                db2File.ReadWoWString("Name", nameLength);

                db2File.ReadUInt32("Icon");
                db2File.ReadUInt32("Flag");     // not 100% sure (8 & 32 as values only) - todo verify with more data
                db2File.ReadSingle("Unk Float 1");
                db2File.ReadSingle("Unk Float 2");
                break;
            }

            case DB2Hash.WbAccessControlList:
            {
                db2File.ReadUInt32("Id");

                var addressLength = db2File.ReadUInt16();
                db2File.ReadWoWString("Address", addressLength);

                db2File.ReadUInt32("Unk MoP 1");
                db2File.ReadUInt32("Unk MoP 2");
                db2File.ReadUInt32("Unk MoP 3");
                db2File.ReadUInt32("Unk MoP 4");     // flags?
                break;
            }

            default:
            {
                db2File.AddValue("Unknown DB2 file type", string.Format("{0} (0x{0:x})", type));
                for (var i = 0;; ++i)
                {
                    if (db2File.Length - 4 >= db2File.Position)
                    {
                        var    blockVal = db2File.ReadUpdateField();
                        string key      = "Block Value " + i;
                        string value    = blockVal.UInt32Value + "/" + blockVal.SingleValue;
                        packet.AddValue(key, value);
                    }
                    else
                    {
                        var left = db2File.Length - db2File.Position;
                        for (var j = 0; j < left; ++j)
                        {
                            string key   = "Byte Value " + i;
                            var    value = db2File.ReadByte();
                            packet.AddValue(key, value);
                        }
                        break;
                    }
                }
                break;
            }
            }

            if (db2File.Length != db2File.Position)
            {
                packet.WriteLine("Packet not fully read! Current position is {0}, length is {1}, and diff is {2}.",
                                 db2File.Position, db2File.Length, db2File.Length - db2File.Position);

                if (db2File.Length < 300) // If the packet isn't "too big" and it is not full read, print its hex table
                {
                    packet.AsHex();
                }

                packet.Status = ParsedStatus.WithErrors;
            }
        }
示例#9
0
        public static void HandleDBReply(Packet packet)
        {
            var dbReply = packet.Holder.DbReply = new();
            var type    = packet.ReadUInt32E <DB2Hash>("TableHash");

            dbReply.TableHash = (uint)type;
            var entry     = dbReply.RecordId = packet.ReadInt32("RecordID");
            var timeStamp = packet.ReadUInt32();
            var time      = packet.AddValue("Timestamp", Utilities.GetDateTimeFromUnixTime(timeStamp));

            dbReply.Time = Timestamp.FromDateTime(DateTime.SpecifyKind(time, DateTimeKind.Utc));
            var allow = packet.ReadBit("Allow");

            var size    = packet.ReadInt32("Size");
            var data    = packet.ReadBytes(size);
            var db2File = new Packet(data, packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName);

            if (entry < 0 || !allow)
            {
                dbReply.Status = PacketDbReplyRecordStatus.RecordStatusRecordRemoved;
                packet.WriteLine("Row {0} has been removed.", -entry);
                HotfixStoreMgr.RemoveRecord(type, entry);
            }
            else
            {
                dbReply.Status = PacketDbReplyRecordStatus.RecordStatusValid;
                switch (type)
                {
                case DB2Hash.BroadcastText:
                {
                    var bct = new BroadcastText()
                    {
                        ID    = (uint)entry,
                        Text  = db2File.ReadCString("Text"),
                        Text1 = db2File.ReadCString("Text1"),
                    };

                    bct.EmoteID    = new ushort?[3];
                    bct.EmoteDelay = new ushort?[3];

                    for (int i = 0; i < 3; ++i)
                    {
                        bct.EmoteID[i] = db2File.ReadUInt16("EmoteID", i);
                    }
                    for (int i = 0; i < 3; ++i)
                    {
                        bct.EmoteDelay[i] = db2File.ReadUInt16("EmoteDelay", i);
                    }

                    bct.EmotesID   = db2File.ReadUInt16("EmotesID");
                    bct.LanguageID = db2File.ReadByte("LanguageID");
                    bct.Flags      = db2File.ReadByte("Flags");

                    if (ClientVersion.AddedInVersion(ClientVersionBuild.V7_3_5_25848))
                    {
                        bct.ConditionID = db2File.ReadUInt32("ConditionID");
                    }

                    bct.SoundEntriesID = new uint?[2];
                    for (int i = 0; i < 2; ++i)
                    {
                        bct.SoundEntriesID[i] = db2File.ReadUInt32("SoundEntriesID", i);
                    }

                    if (ClientVersion.AddedInVersion(ClientVersionBuild.V7_0_3_22248) && ClientVersion.RemovedInVersion(ClientVersionBuild.V7_3_5_25848))
                    {
                        bct.ConditionID = db2File.ReadUInt32("ConditionID");
                    }

                    Storage.BroadcastTexts.Add(bct, packet.TimeSpan);

                    if (ClientLocale.PacketLocale != LocaleConstant.enUS)
                    {
                        BroadcastTextLocale lbct = new BroadcastTextLocale
                        {
                            ID        = bct.ID,
                            TextLang  = bct.Text,
                            Text1Lang = bct.Text1
                        };
                        Storage.BroadcastTextLocales.Add(lbct, packet.TimeSpan);
                    }

                    dbReply.BroadcastText = new PacketDbReplyBroadcastText()
                    {
                        Id                 = bct.ID.Value,
                        Text0              = bct.Text,
                        Text1              = bct.Text1,
                        Language           = bct.LanguageID.Value,
                        ConditionId        = bct.ConditionID ?? 0,
                        EmotesId           = bct.EmotesID.Value,
                        Flags              = bct.Flags.Value,
                        ChatBubbleDuration = 0,
                    };
                    dbReply.BroadcastText.Sounds.Add(bct.SoundEntriesID1 ?? 0);
                    dbReply.BroadcastText.Sounds.Add(bct.SoundEntriesID2 ?? 0);
                    for (int i = 0; i < 3; ++i)
                    {
                        dbReply.BroadcastText.Emotes.Add(new BroadcastTextEmote()
                            {
                                EmoteId = bct.EmoteID[i] ?? 0, Delay = bct.EmoteDelay[i] ?? 0
                            });
                    }
                    break;
                }

                default:
                    HotfixStoreMgr.AddRecord(type, entry, db2File);
                    break;
                }

                db2File.ClosePacket(false);
            }
        }
示例#10
0
        public static void HandleDBReply(Packet packet)
        {
            var type      = packet.ReadUInt32E <DB2Hash>("TableHash");
            var entry     = packet.ReadInt32("RecordID");
            var timeStamp = packet.ReadUInt32();

            packet.AddValue("Timestamp", Utilities.GetDateTimeFromUnixTime(timeStamp));
            var allow = packet.ReadBit("Allow");

            var size    = packet.ReadInt32("Size");
            var data    = packet.ReadBytes(size);
            var db2File = new Packet(data, packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName);

            if (entry < 0 || !allow)
            {
                packet.WriteLine("Row {0} has been removed.", -entry);
                HotfixStoreMgr.RemoveRecord(type, entry);
            }
            else
            {
                switch (type)
                {
                case DB2Hash.BroadcastText:
                {
                    var bct = new BroadcastText()
                    {
                        ID         = (uint)entry,
                        MaleText   = db2File.ReadCString("MaleText"),
                        FemaleText = db2File.ReadCString("FemaleText"),
                    };

                    bct.EmoteID    = new ushort?[3];
                    bct.EmoteDelay = new ushort?[3];

                    for (int i = 0; i < 3; ++i)
                    {
                        bct.EmoteID[i] = db2File.ReadUInt16("EmoteID", i);
                    }
                    for (int i = 0; i < 3; ++i)
                    {
                        bct.EmoteDelay[i] = db2File.ReadUInt16("EmoteDelay", i);
                    }

                    bct.UnkEmoteID = db2File.ReadUInt16("UnkEmoteID");
                    bct.Language   = db2File.ReadByte("Language");
                    bct.Type       = db2File.ReadByte("Type");

                    bct.SoundID = new uint?[2];
                    for (int i = 0; i < 2; ++i)
                    {
                        bct.SoundID[i] = db2File.ReadUInt32("SoundID", i);
                    }

                    bct.PlayerConditionID = db2File.ReadUInt32("PlayerConditionID");

                    Storage.BroadcastTexts.Add(bct, packet.TimeSpan);
                    break;
                }

                default:
                    HotfixStoreMgr.AddRecord(type, entry, db2File);
                    break;
                }

                db2File.ClosePacket(false);
            }
        }