Esempio n. 1
0
        public ItemInstance(SocketedGem gem)
        {
            ItemID = gem.ItemId;

            ItemBonusInstanceData bonus = new ItemBonusInstanceData();

            bonus.Context = (ItemContext)(byte)gem.Context;
            foreach (ushort bonusListId in gem.BonusListIDs)
            {
                if (bonusListId != 0)
                {
                    bonus.BonusListIDs.Add(bonusListId);
                }
            }

            if (bonus.Context != 0 || !bonus.BonusListIDs.Empty())
            {
                ItemBonus.Set(bonus);
            }
        }
Esempio n. 2
0
        public ItemInstance(ItemDynamicFieldGems gem)
        {
            ItemID = gem.ItemId;

            ItemBonusInstanceData bonus = new ItemBonusInstanceData();

            bonus.Context = gem.Context;
            foreach (ushort bonusListId in gem.BonusListIDs)
            {
                if (bonusListId != 0)
                {
                    bonus.BonusListIDs.Add(bonusListId);
                }
            }

            if (bonus.Context != 0 || !bonus.BonusListIDs.Empty())
            {
                ItemBonus.Set(bonus);
            }
        }
Esempio n. 3
0
        public static Task Load()
        {
            return(Task.Run(() =>
            {
                using (var bReader = new BinaryReader(new FileStream("RAW\\itemaddition.pkg", FileMode.Open, FileAccess.Read, FileShare.Read), Encoding.GetEncoding("iso-8859-1")))
                {
                    bReader.BaseStream.Seek(4, SeekOrigin.Begin);
                    var count = bReader.ReadInt32();

                    for (var I = 0; I < count; I++)
                    {
                        bReader.BaseStream.Seek(4, SeekOrigin.Current);
                        var id = bReader.ReadInt32();
                        var info = new ItemBonus {
                            Life = bReader.ReadInt16(), MaxAtk = bReader.ReadInt16(), MinAtk = bReader.ReadInt16(), Defence = bReader.ReadInt16(), MAtk = bReader.ReadInt16(), MDef = bReader.ReadInt16(), Dexterity = bReader.ReadInt16(), Dodge = bReader.ReadInt16()
                        };
                        Collections.ItemBonus.AddOrUpdate(id, info);
                    }
                }
            }));
        }
Esempio n. 4
0
 public override int GetHashCode()
 {
     return(ItemID.GetHashCode() ^ RandomPropertiesSeed.GetHashCode() ^
            RandomPropertiesID.GetHashCode() ^ ItemBonus.GetHashCode() ^ Modifications.GetHashCode());
 }
Esempio n. 5
0
 public override int GetHashCode()
 {
     return(ItemID.GetHashCode() ^ ItemBonus.GetHashCode() ^ Modifications.GetHashCode());
 }
 public void setBonus(ItemBonus bonus, float stat)
 {
     shield.bonuses.Add(bonus, stat);
 }
Esempio n. 7
0
        public static void CalculateInvStats(PlayerObject pobj)
        {
            int   physical       = 0;
            int   holy           = 0;
            int   fire           = 0;
            int   nature         = 0;
            int   frost          = 0;
            int   shadow         = 0;
            int   strength       = 0;
            int   agility        = 0;
            int   stamina        = 0;
            int   intellect      = 0;
            int   spirit         = 0;
            int   health         = 0;
            int   power          = 0;
            float mindamage      = 2.0f;
            float maxdamage      = 4.0f;
            int   baseattacktime = 2000;

            for (int i = 0; i < 18; i++)
            {
                ItemObject item = pobj.Inventory[i];
                if (item != null && item.Template != null)
                {
                    DBItemTemplate template = item.Template;
                    physical += template.Resists.Physical;
                    holy     += template.Resists.Holy;
                    fire     += template.Resists.Fire;
                    nature   += template.Resists.Nature;
                    frost    += template.Resists.Frost;
                    shadow   += template.Resists.Shadow;
                    for (int bonus = 0; bonus < 10; bonus++)
                    {
                        ItemBonus itembonus = template.getItemBonus(bonus);
                        if (itembonus.Stat >= 0 && itembonus.Bonus != 0)
                        {
                            Console.WriteLine("itembonusstat: " + itembonus.Stat);
                            Console.WriteLine("itembonusstatbonus: " + itembonus.Bonus);

                            if (itembonus.Stat == 0)
                            {
                                power += itembonus.Bonus;
                            }
                            else if (itembonus.Stat == 1)
                            {
                                health += itembonus.Bonus;
                            }
                            else if (itembonus.Stat == 3)
                            {
                                agility += itembonus.Bonus;
                            }
                            else if (itembonus.Stat == 4)
                            {
                                strength += itembonus.Bonus;
                            }
                            else if (itembonus.Stat == 5)
                            {
                                intellect += itembonus.Bonus;
                            }
                            else if (itembonus.Stat == 6)
                            {
                                spirit += itembonus.Bonus;
                            }
                            else if (itembonus.Stat == 7)
                            {
                                stamina += itembonus.Bonus;
                            }
                        }
                        else
                        {
                            break;
                        }
                    }

                    if (i == (int)INVSLOT.MAINHAND)
                    {
                        DamageStat damagestat = template.getDamageStat(0);
                        mindamage      = (float)damagestat.Min;
                        maxdamage      = (float)damagestat.Max;
                        baseattacktime = template.WeaponSpeed;
                    }

                    if (i == (int)INVSLOT.OFFHAND)
                    {
                        if (template.SubClass == 5 || template.SubClass == 6)
                        {
                            pobj.HasShield = true;
                        }
                        else
                        {
                            pobj.HasShield = false;
                        }
                    }
                }
            }

            pobj.MaxHealth += health;
            pobj.MaxPower  += power;

            pobj.MaxHealth += (stamina * 10);
            pobj.MaxPower  += (intellect * 10);

            pobj.BaseStrength += strength;

            pobj.BaseStamina += stamina;

            pobj.BaseAgility += agility;

            pobj.BaseIntellect += intellect;

            pobj.BaseSpirit += spirit;

            pobj.Resist_Physical = physical;
            pobj.Resist_Holy     = holy;
            pobj.Resist_Fire     = fire;
            pobj.Resist_Nature   = nature;
            pobj.Resist_Frost    = frost;
            pobj.Resist_Shadow   = shadow;

            pobj.MinDamage      = mindamage;
            pobj.MaxDamage      = maxdamage;
            pobj.BaseAttackTime = baseattacktime;            //baseattacktime;

            if (pobj.Health > pobj.MaxHealth)
            {
                pobj.Health = pobj.MaxHealth;
            }
            if (pobj.Power > pobj.MaxPower)
            {
                pobj.Power = pobj.MaxPower;
            }
        }
Esempio n. 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.UnkEmoteId = db2File.ReadUInt32("Unk MoP 1"); // unk emote
                broadcastText.Type       = 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.ReadUInt32("PhaseID");
                gameObjectTemplateDB2.PhaseGroupId = db2File.ReadUInt32("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");
                if (ClientVersion.RemovedInVersion(ClientVersionBuild.V6_1_0_19678))
                {
                    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");
                if (ClientVersion.AddedInVersion(ClientVersionBuild.V6_1_0_19678))
                {
                    db2File.ReadInt32("Unk1 Wod61x");
                }
                break;
            }

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

            case DB2Hash.Mount:
            {
                var mount = new Mount();
                var id    = db2File.ReadUInt32("ID");
                mount.MountTypeId = db2File.ReadUInt32("MountTypeId");
                mount.DisplayId   = db2File.ReadUInt32("DisplayId");
                mount.Flags       = db2File.ReadUInt32("Flags");

                var NameLength = db2File.ReadUInt16();
                mount.Name = db2File.ReadWoWString("Name", NameLength);

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

                var SourceDescriptionLength = db2File.ReadUInt16();
                mount.SourceDescription = db2File.ReadWoWString("SourceDescription", SourceDescriptionLength);

                mount.Source            = db2File.ReadUInt32("Source");
                mount.SpellId           = db2File.ReadUInt32("SpellId");
                mount.PlayerConditionId = db2File.ReadUInt32("PlayerConditionId");

                Storage.Mounts.Add(id, mount, packet.TimeSpan);
                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.Holidays:
            {
                var holiday = new HolidayData();

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

                holiday.Duration = new uint[10];
                for (var i = 0; i < 10; i++)
                {
                    holiday.Duration[i] = db2File.ReadUInt32("Duration", i);
                }

                holiday.Date = new uint[16];
                for (var i = 0; i < 16; i++)
                {
                    holiday.Date[i] = db2File.ReadUInt32("Date", i);
                }

                holiday.Region  = db2File.ReadUInt32("Region");
                holiday.Looping = db2File.ReadUInt32("Looping");

                holiday.CalendarFlags = new uint[10];
                for (var i = 0; i < 10; i++)
                {
                    holiday.CalendarFlags[i] = db2File.ReadUInt32("CalendarFlags", i);
                }

                holiday.HolidayNameID        = db2File.ReadUInt32("HolidayNameID");
                holiday.HolidayDescriptionID = db2File.ReadUInt32("HolidayDescriptionID");

                var TextureFilenameLength = db2File.ReadUInt16();
                holiday.TextureFilename = db2File.ReadWoWString("SourceDescription", TextureFilenameLength);

                holiday.Priority           = db2File.ReadUInt32("Priority");
                holiday.CalendarFilterType = db2File.ReadUInt32("CalendarFilterType");
                holiday.Flags = db2File.ReadUInt32("Flags");

                Storage.Holidays.Add(id, holiday, packet.TimeSpan);
                break;
            }

            case DB2Hash.ItemAppearance:
            {
                var itemAppearance = new ItemAppearance();

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

                itemAppearance.DisplayID      = db2File.ReadUInt32("Display ID");
                itemAppearance.IconFileDataID = db2File.ReadUInt32("File Data ID");

                Storage.ItemAppearances.Add(id, itemAppearance, packet.TimeSpan);
                break;
            }

            case DB2Hash.ItemBonus:
            {
                var itemBonus = new ItemBonus();

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

                itemBonus.BonusListID = db2File.ReadUInt32("Bonus List ID");
                itemBonus.Type        = db2File.ReadUInt32("Type");

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

                itemBonus.Index = db2File.ReadUInt32("Index");

                Storage.ItemBonuses.Add(id, itemBonus, packet.TimeSpan);
                break;
            }

            case DB2Hash.ItemBonusTreeNode:
            {
                var itemBonusTreeNode = new ItemBonusTreeNode();
                var id = db2File.ReadUInt32("ID");

                itemBonusTreeNode.BonusTreeID    = db2File.ReadUInt32("BonusTreeID");
                itemBonusTreeNode.BonusTreeModID = db2File.ReadUInt32("BonusTreeModID");
                itemBonusTreeNode.SubTreeID      = db2File.ReadUInt32("SubTreeID");
                itemBonusTreeNode.BonusListID    = db2File.ReadUInt32("BonusListID");

                Storage.ItemBonusTreeNodes.Add(id, itemBonusTreeNode, packet.TimeSpan);
                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.ItemNameDescriptionId     = db2File.ReadUInt32("Item Name Description ID");

                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:
            {
                var key = new KeyChain();
                var id  = db2File.ReadUInt32("ID");

                key.Key = new byte[32];
                for (var i = 0; i < 32; i++)
                {
                    key.Key[i] = db2File.ReadByte("Key", i);
                }

                Storage.KeyChains.Add(id, key, packet.TimeSpan);
                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;
            }

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

                db2File.ReadUInt32("Flags");
                db2File.ReadUInt32("Importance");
                db2File.ReadUInt32("FactionID");
                db2File.ReadUInt32("MapID");
                db2File.ReadUInt32("AreaID");
                db2File.ReadUInt32("Icon");

                db2File.ReadSingle("PositionX");
                db2File.ReadSingle("PositionY");

                var len1 = db2File.ReadUInt16();
                db2File.ReadWoWString("Name", len1);

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

                db2File.ReadUInt32("WorldStateID");
                db2File.ReadUInt32("PlayerConditionID");
                db2File.ReadUInt32("WorldMapLink");
                db2File.ReadUInt32("PortLocID");
                break;
            }

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

                db2File.ReadUInt32("AreaPOIID");
                db2File.ReadUInt32("State");
                db2File.ReadUInt32("Icon");

                var len2 = db2File.ReadUInt16();
                db2File.ReadWoWString("Description", len2);
                break;
            }

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

                db2File.ReadUInt32("PathID");
                db2File.ReadUInt32("NodeIndex");
                db2File.ReadUInt32("MapID");

                db2File.ReadSingle("LocX");
                db2File.ReadSingle("LocY");
                db2File.ReadSingle("LocZ");

                db2File.ReadUInt32("Flags");
                db2File.ReadUInt32("Delay");
                db2File.ReadUInt32("ArrivalEventID");
                db2File.ReadUInt32("DepartureEventID");
                break;
            }

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

                db2File.ReadSingle("LocX");
                db2File.ReadSingle("LocY");
                db2File.ReadSingle("LocZ");

                db2File.ReadSingle("Rotation1");
                db2File.ReadSingle("Rotation2");
                db2File.ReadSingle("Rotation3");
                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;
            }
        }
        public object GetEquipments([FromQuery(Name = "job")] Job job, [FromQuery(Name = "minLevel")] int minLevel, [FromQuery(Name = "maxLevel")] int maxLevel)
        {
            try
            {
                if (minLevel > maxLevel)
                {
                    minLevel = maxLevel;
                }

                if (maxLevel - minLevel > 50)
                {
                    minLevel = maxLevel - 50;
                }

                if (!jobToString.ContainsKey(job))
                {
                    return(new Equipment[0]);
                }

                string jobString = jobToString[job];

                Equipment[] equipments = _context.Items
                                         .Where(item => item.Level >= minLevel && item.Level <= maxLevel && item.ItemClassJobs.FirstOrDefault(itemClassJob => itemClassJob.ClassJob.AbbreviationEn == jobString) != null)
                                         .Select(item => new Equipment
                {
                    key      = item.Key,
                    nameKo   = item.UINameKo,
                    nameEn   = item.UINameEn,
                    iconPath = item.IconPath,
                    source   = string.Empty,

                    itemLevel      = item.Level == null ? 0 : (long)item.Level,
                    equipLevel     = item.EquipLevel == null ? 0 : (long)item.EquipLevel,
                    itemCategory   = ItemCategory.OneHandedArm,
                    materiaSockets = item.MateriaSocket,

                    damage     = 0,
                    damageName = new Job[]
                    {
                        Job.WhiteMage,
                        Job.Scholar,
                        Job.Astrologian,

                        Job.BlackMage,
                        Job.Summoner
                    }.Contains(job) ? "마법 기본 성능" : "물리 기본 성능",

                    attackInterval     = 0,
                    attackIntervalName = "공격 주기",

                    autoAttack     = 0,
                    autoAttackName = "물리 자동 공격",

                    shieldRate          = 0,
                    shieldRateName      = "방패 막기 성능",
                    shieldBlockRate     = 0,
                    shieldBlockRateName = "방패 막기 발동력",

                    defense     = 0,
                    defenseName = "물리 방어력",

                    magicDefense     = 0,
                    magicDefenseName = "마법 방어력",

                    attributes = null
                })
                                         .ToArray();

                for (int i = 0; i < equipments.Count(); i++)
                {
                    if (equipments[i].key == null)
                    {
                        continue;
                    }

                    Item item = _context.Items
                                .Include(_item => _item.ItemBonuses)
                                .Include(_item => _item.UICategory)
                                .FirstOrDefault(_item => _item.Key == equipments[i].key);

                    if (item == null)
                    {
                        continue;
                    }

                    if (item.Damage != null)
                    {
                        equipments[i].damage = Math.Max(equipments[i].damage, (long)item.Damage);
                    }

                    if (item.DamageHQ != null)
                    {
                        equipments[i].damage = Math.Max(equipments[i].damage, (long)item.DamageHQ);
                    }

                    if (item.MagicDamage != null)
                    {
                        equipments[i].damage = Math.Max(equipments[i].damage, (long)item.MagicDamage);
                    }

                    if (item.MagicDamageHQ != null)
                    {
                        equipments[i].damage = Math.Max(equipments[i].damage, (long)item.MagicDamageHQ);
                    }

                    if (item.AttackInterval != null)
                    {
                        equipments[i].attackInterval = Math.Max(equipments[i].attackInterval, (double)item.AttackInterval);
                    }

                    if (item.AttackIntervalHQ != null)
                    {
                        equipments[i].attackInterval = Math.Max(equipments[i].attackInterval, (double)item.AttackIntervalHQ);
                    }

                    if (item.AutoAttack != null)
                    {
                        equipments[i].autoAttack = Math.Max(equipments[i].autoAttack, (double)item.AutoAttack);
                    }

                    if (item.AutoAttackHQ != null)
                    {
                        equipments[i].autoAttack = Math.Max(equipments[i].autoAttack, (double)item.AutoAttackHQ);
                    }

                    if (item.ShieldRate != null)
                    {
                        equipments[i].shieldRate = Math.Max(equipments[i].shieldRate, (long)item.ShieldRate);
                    }

                    if (item.ShieldRateHQ != null)
                    {
                        equipments[i].shieldRate = Math.Max(equipments[i].shieldRate, (long)item.ShieldRateHQ);
                    }

                    if (item.ShieldBlockRate != null)
                    {
                        equipments[i].shieldBlockRate = Math.Max(equipments[i].shieldBlockRate, (long)item.ShieldBlockRate);
                    }

                    if (item.ShieldBlockRateHQ != null)
                    {
                        equipments[i].shieldBlockRate = Math.Max(equipments[i].shieldBlockRate, (long)item.ShieldBlockRateHQ);
                    }

                    if (item.Defense != null)
                    {
                        equipments[i].defense = Math.Max(equipments[i].defense, (long)item.Defense);
                    }

                    if (item.DefenseHQ != null)
                    {
                        equipments[i].defense = Math.Max(equipments[i].defense, (long)item.DefenseHQ);
                    }

                    if (item.MagicDefense != null)
                    {
                        equipments[i].magicDefense = Math.Max(equipments[i].magicDefense, (long)item.MagicDefense);
                    }

                    if (item.MagicDefenseHQ != null)
                    {
                        equipments[i].magicDefense = Math.Max(equipments[i].magicDefense, (long)item.MagicDefenseHQ);
                    }

                    equipments[i].attributes = new Dictionary <int, long>();

                    foreach (ItemBonus itemBonus in item.ItemBonuses)
                    {
                        ItemBonus _itemBonus = _context.ItemBonuses
                                               .Include(__itemBonus => __itemBonus.BaseParam)
                                               .FirstOrDefault(__itemBonus => __itemBonus.Key == itemBonus.Key);

                        if (_itemBonus == null)
                        {
                            continue;
                        }
                        if (_itemBonus.BaseParam == null)
                        {
                            continue;
                        }

                        if (stringToAttribute.ContainsKey(_itemBonus.BaseParam.NameEn))
                        {
                            Attribute attribute = stringToAttribute[_itemBonus.BaseParam.NameEn];

                            if (equipments[i].attributes.ContainsKey((int)attribute))
                            {
                                equipments[i].attributes[(int)attribute] = Math.Max(equipments[i].attributes[(int)attribute], _itemBonus.Amount);
                            }
                            else
                            {
                                equipments[i].attributes.Add((int)attribute, _itemBonus.Amount);
                            }
                        }
                    }

                    if (stringToItemCategory.ContainsKey(item.UICategory.NameEn))
                    {
                        equipments[i].itemCategory = stringToItemCategory[item.UICategory.NameEn];
                    }

                    equipments[i].source = getSource(equipments[i].itemLevel, equipments[i].nameEn);
                }

                return(equipments);
            }
            catch
            {
                return(new Equipment[0]);
            }
        }