コード例 #1
0
    public static void GetStats(Item item, int optionId, float optionLevelFactor, out Dictionary <StatAttribute, ItemStat> staticStats)
    {
        staticStats = new();
        if (optionLevelFactor < 50)
        {
            return;
        }

        int staticId = ItemMetadataStorage.GetOptionMetadata(item.Id).Static;

        ItemOptionsStatic staticOptions = ItemOptionStaticMetadataStorage.GetMetadata(staticId, item.Rarity);

        if (staticOptions == null)
        {
            GetDefault(item, staticStats, optionId, optionLevelFactor);
            return;
        }

        foreach (ParserStat stat in staticOptions.Stats)
        {
            staticStats[stat.Attribute] = new BasicStat(stat);
        }

        foreach (ParserSpecialStat stat in staticOptions.SpecialStats)
        {
            staticStats[stat.Attribute] = new SpecialStat(stat);
        }

        // TODO: Implement Hidden ndd (defense) and wapmax (Max Weapon Attack)

        GetDefault(item, staticStats, optionId, optionLevelFactor);
    }
コード例 #2
0
        public void GetStaticStats(int itemId, int rarity, List <NormalStat> normalStats, List <SpecialStat> specialStats)
        {
            //Get Static Stats
            int staticId = ItemMetadataStorage.GetOptionStatic(itemId);

            ItemOptionsStatic staticOptions = ItemOptionStaticMetadataStorage.GetMetadata(staticId, rarity);

            if (staticOptions == null)
            {
                BasicStats.AddRange(normalStats);
                BasicStats.AddRange(specialStats);
                return;
            }

            foreach (ParserStat stat in staticOptions.Stats)
            {
                NormalStat normalStat = normalStats.FirstOrDefault(x => x.ItemAttribute == stat.Id);
                if (normalStat == null)
                {
                    normalStats.Add(new NormalStat(stat.Id, stat.Flat, stat.Percent));
                    continue;
                }
                int   index         = normalStats.FindIndex(x => x.ItemAttribute == stat.Id);
                int   summedFlat    = normalStat.Flat + stat.Flat;
                float summedPercent = normalStat.Percent + stat.Percent;

                normalStats[index] = new NormalStat(stat.Id, summedFlat, summedPercent);
            }

            foreach (ParserSpecialStat stat in staticOptions.SpecialStats)
            {
                SpecialStat normalStat = specialStats.FirstOrDefault(x => x.ItemAttribute == stat.Id);
                if (normalStat == null)
                {
                    specialStats.Add(new SpecialStat(stat.Id, stat.Flat, stat.Percent));
                    continue;
                }

                int   index         = specialStats.FindIndex(x => x.ItemAttribute == stat.Id);
                float summedFlat    = normalStat.Flat + stat.Flat;
                float summedPercent = normalStat.Percent + stat.Percent;

                specialStats[index] = new SpecialStat(stat.Id, summedFlat, summedPercent);
            }

            if (staticOptions.HiddenDefenseAdd > 0)
            {
                AddHiddenNormalStat(normalStats, ItemAttribute.Defense, staticOptions.HiddenDefenseAdd, staticOptions.DefenseCalibrationFactor);
            }

            if (staticOptions.HiddenWeaponAtkAdd > 0)
            {
                AddHiddenNormalStat(normalStats, ItemAttribute.MinWeaponAtk, staticOptions.HiddenWeaponAtkAdd, staticOptions.WeaponAtkCalibrationFactor);
                AddHiddenNormalStat(normalStats, ItemAttribute.MaxWeaponAtk, staticOptions.HiddenWeaponAtkAdd, staticOptions.WeaponAtkCalibrationFactor);
            }

            BasicStats.AddRange(normalStats);
            BasicStats.AddRange(specialStats);
        }
コード例 #3
0
        protected override List <ItemOptionStaticMetadata> Parse()
        {
            List <ItemOptionStaticMetadata>             items             = new List <ItemOptionStaticMetadata>();
            Dictionary <int, List <ItemOptionsStatic> > itemOptionsStatic = new Dictionary <int, List <ItemOptionsStatic> >();

            foreach (PackFileEntry entry in Resources.XmlFiles)
            {
                if (!entry.Name.StartsWith("itemoption/option/static"))
                {
                    continue;
                }

                XmlDocument innerDocument = Resources.XmlMemFile.GetDocument(entry.FileHeader);
                XmlNodeList nodeList      = innerDocument.SelectNodes("/ms2/option");
                string      filename      = Path.GetFileNameWithoutExtension(entry.Name);
                foreach (XmlNode node in nodeList)
                {
                    int id = string.IsNullOrEmpty(node.Attributes["code"]?.Value) ? 0 : int.Parse(node.Attributes["code"].Value);
                    ItemOptionsStatic optionsStatic = new ItemOptionsStatic();

                    foreach (XmlNode item in node.Attributes)
                    {
                        switch (item.Name)
                        {
                        case "code":
                            break;

                        case "grade":
                            optionsStatic.Rarity = (byte)(string.IsNullOrEmpty(node.Attributes["grade"]?.Value) ? 0 : byte.Parse(node.Attributes["grade"].Value));
                            break;

                        case "optionNumPick":
                            optionsStatic.Slots = Array.ConvertAll(node.Attributes[item.Name].Value.Split(","), byte.Parse);
                            break;

                        case "abp_rate_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.PerfectGuard, float.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.PerfectGuard, float.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "asp_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.AttackSpeed, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.AttackSpeed, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "atp_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.Accuracy, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.Accuracy, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "bap_value_base":
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.BonusAtk, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "cad_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.CriticalDamage, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.CriticalDamage, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "cap_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.CriticalRate, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.CriticalRate, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "car_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.CriticalEvasion, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.CriticalEvasion, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "dex_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.Dexterity, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.Dexterity, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "evp_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.Evasion, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.Evasion, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "finaladditionaldamage_rate_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.TotalDamage, float.Parse(node.Attributes[item.Name].Value.Split(",").First()), 0));
                                break;
                            }
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.TotalDamage, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "firedamage_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.FireDamage, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "firedamagereduce_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.FireDamageReduce, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "heal_rate_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.Heal, float.Parse(node.Attributes[item.Name].Value.Split(",").First()), 0));
                                break;
                            }
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.Heal, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "hp_rgp_value_base":
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.HpRegen, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "hp_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.Health, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.Health, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "icedamage_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.IceDamage, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "icedamagereduce_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.IceDamageReduce, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "int_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.Intelligence, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.Intelligence, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "killhprestore_value_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.HpOnKill, 0, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "knockbackreduce_value_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.KnockbackReduce, 0, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "lddincrease_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.RangedDamage, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "longdistancedamagereduce_rate_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.RangedDamageReduce, float.Parse(node.Attributes[item.Name].Value.Split(",").First()), 0));
                                break;
                            }
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.RangedDamageReduce, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "lightdamage_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.HolyDamage, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "lightdamagereduce_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.HolyDamageReduce, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "luk_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.Luck, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.Luck, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "map_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.MagicalAtk, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.MagicalAtk, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "mar_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.MagicalRes, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.MagicalRes, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "marpen_rate_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.MagicPiercing, float.Parse(node.Attributes[item.Name].Value.Split(",").First()), 0));
                                break;
                            }
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.MagicPiercing, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "msp_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.MovementSpeed, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.MovementSpeed, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "ndd_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.Defense, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.Defense, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "nddincrease_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.MeleeDamage, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "neardistancedamagereduce_rate_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.MeleeDamageReduce, float.Parse(node.Attributes[item.Name].Value.Split(",").First()), 0));
                                break;
                            }
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.MeleeDamageReduce, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "pap_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.PhysicalAtk, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.PhysicalAtk, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "par_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.PhysicalRes, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.PhysicalRes, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "parpen_rate_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.PhysicalPiercing, float.Parse(node.Attributes[item.Name].Value.Split(",").First()), 0));
                                break;
                            }
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.PhysicalPiercing, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "pen_rate_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.Piercing, float.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.Piercing, float.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "poisondamage_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.PoisonDamage, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "poisondamagereduce_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.PoisonDamageReduce, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "sgi_rate_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.BossDamage, float.Parse(node.Attributes[item.Name].Value.Split(",").First()), 0));
                                break;
                            }
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.BossDamage, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "skillcooldown_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.CooldownReduce, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "str_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.Strength, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.Strength, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "stunreduce_rate_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.StunReduce, float.Parse(node.Attributes[item.Name].Value.Split(",").First()), 0));
                                break;
                            }
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.StunReduce, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "thunderdamage_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.ElectricDamage, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "thunderdamagereduce_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.ElectricDamageReduce, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "wapmax_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.MaxWeaponAtk, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.MaxWeaponAtk, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "wapmin_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.Stats.Add(new ParserStat(ItemAttribute.MinWeaponAtk, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.MinWeaponAtk, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "bap_pet_value_base":
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.PetBonusAtk, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "receivedhealincrease_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.AllyRecovery, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "reduce_darkstream_recive_damage_rate_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.DarkDescentDamageReduce, float.Parse(node.Attributes[item.Name].Value.Split(",").First()), 0));
                                break;
                            }
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.DarkDescentDamageReduce, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "smd_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.MesoBonus, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "sss_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.SwimSpeed, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "wapmin_rate_base":
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.MinWeaponAtk, float.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "wapmax_rate_base":
                            optionsStatic.Stats.Add(new ParserStat(ItemAttribute.MaxWeaponAtk, float.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "pvpdamagereduce_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.PvPDefense, 0, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.PvPDefense, 0, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "pvpdamageincrease_value_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.PvPDamage, 0, int.Parse(node.Attributes[item.Name].Value.Split(",").First())));
                                break;
                            }
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.PvPDamage, 0, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "improve_pvp_exp_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.PvPExp, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "improve_honor_token_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.ValorTokens, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "npckilldropitemincrate_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.DropRate, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "improve_massive_ox_exp_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.OXQuizExp, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "improve_massive_finalsurvival_exp_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.SoleSurvivorExp, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "improve_massive_trapmaster_exp_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.TrapMasterExp, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "improve_massive_crazyrunner_exp_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.CrazyRunnerExp, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "improve_massive_escape_exp_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.LudiEscapeExp, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "improve_massive_springbeach_exp_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.SpringBeachExp, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "improve_massive_dancedance_exp_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.DanceDanceExp, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "improve_massive_ox_msp_value_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.OXMovementSpeed, 0, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "improve_massive_finalsurvival_msp_value_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.SoleSurvivorMovementSpeed, 0, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "improve_massive_trapmaster_msp_value_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.TrapMasterMovementSpeed, 0, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "improve_massive_crazyrunner_msp_value_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.CrazyRunnerMovementSpeed, 0, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "improve_massive_escape_msp_value_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.LudiEscapeMovementSpeed, 0, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "improve_massive_springbeach_msp_value_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.SpringBeachMovementSpeed, 0, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "improve_massive_dancedance_msp_value_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.DanceDanceStopMovementSpeed, 0, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "seg_fishingreward_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.FishingExp, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "seg_playinstrumentreward_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.PerformanceExp, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "npc_hit_reward_sp_ball_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.GenerateSpiritOrbs, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "npc_hit_reward_ep_ball_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.GenerateStaminaOrbs, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "complete_fieldmission_msp_value_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.ExploredAreasMovementSpeed, 0, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "improve_glide_vertical_velocity_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.AirMountAscentSpeed, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "fishing_double_mastery_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.DoubleFishingMastery, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "playinstrument_double_mastery_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.DoublePerformanceMastery, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "gathering_double_mastery_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.DoubleForagingMastery, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "farming_double_mastery_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.DoubleFarmingMastery, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "mining_double_mastery_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.DoubleMiningMastery, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "breeding_double_mastery_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.DoubleRanchingMastery, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "improve_darkstream_damage_rate_base":
                            if (node.Attributes[item.Name].Value.Contains(","))
                            {
                                optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.DarkDescentDamageBonus, float.Parse(node.Attributes[item.Name].Value.Split(",").First()), 0));
                                break;
                            }
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.DarkDescentDamageBonus, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "improve_chaosraid_wap_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.ChaosRaidWeaponAttack, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "improve_chaosraid_asp_value_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.ChaosRaidAttackSpeed, 0, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "improve_chaosraid_atp_value_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.ChaosRaidAccuracy, 0, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "improve_chaosraid_hp_value_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.ChaosRaidHealth, 0, int.Parse(node.Attributes[item.Name].Value)));
                            break;

                        case "hiddennddadd_value_base":
                            optionsStatic.HiddenDefenseAdd = int.Parse(node.Attributes[item.Name].Value);
                            break;

                        case "hiddenwapadd_value_base":
                            optionsStatic.HiddenWeaponAtkAdd = int.Parse(node.Attributes[item.Name].Value);
                            break;

                        case "nddcalibrationfactor_rate_base":
                            optionsStatic.DefenseCalibrationFactor = float.Parse(node.Attributes[item.Name].Value);
                            break;

                        case "wapcalibrationfactor_rate_base":
                            optionsStatic.WeaponAtkCalibrationFactor = float.Parse(node.Attributes[item.Name].Value);
                            break;

                        case "conditionreduce_rate_base":
                            optionsStatic.SpecialStats.Add(new ParserSpecialStat(SpecialItemAttribute.DebuffDurationReduce, float.Parse(node.Attributes[item.Name].Value), 0));
                            break;

                        case "additionaleffect_95000012_value_base":
                        case "additionaleffect_95000014_value_base":
                        case "sgi_target":
                            break;
                        }
                    }
                    if (itemOptionsStatic.ContainsKey(id))
                    {
                        itemOptionsStatic[id].Add(optionsStatic);
                    }
                    else
                    {
                        itemOptionsStatic[id] = new List <ItemOptionsStatic>()
                        {
                            optionsStatic
                        };
                    }
                }
                foreach (KeyValuePair <int, List <ItemOptionsStatic> > optionsData in itemOptionsStatic)
                {
                    ItemOptionStaticMetadata metadata = new ItemOptionStaticMetadata();
                    metadata.Id = optionsData.Key;
                    metadata.ItemOptions.AddRange(optionsData.Value);
                    items.Add(metadata);
                }
            }
            return(items);
        }