// Roll new bonus stats and values except the locked stat public static List <ItemStat> RollBonusStatsWithStatLocked(Item item, short ignoreStat, bool isSpecialStat) { int id = item.Id; int randomId = ItemMetadataStorage.GetOptionRandom(id); ItemOptionRandom randomOptions = ItemOptionRandomMetadataStorage.GetMetadata(randomId, item.Rarity); if (randomOptions == null) { return(null); } Random random = new Random(); List <ItemStat> itemStats = new List <ItemStat>(); List <ParserStat> attributes = isSpecialStat ? randomOptions.Stats : randomOptions.Stats.Where(x => (short)x.Id != ignoreStat).ToList(); List <ParserSpecialStat> specialAttributes = isSpecialStat ? randomOptions.SpecialStats.Where(x => (short)x.Id != ignoreStat).ToList() : randomOptions.SpecialStats; foreach (ParserStat attribute in attributes) { Dictionary <ItemAttribute, List <ParserStat> > dictionary = GetRange(randomId); if (!dictionary.ContainsKey(attribute.Id)) { continue; } NormalStat normalStat = new NormalStat(dictionary[attribute.Id][Roll(id)]); if (randomOptions.MultiplyFactor > 0) { normalStat.Flat *= (int)Math.Ceiling(randomOptions.MultiplyFactor); normalStat.Percent *= randomOptions.MultiplyFactor; } itemStats.Add(normalStat); } foreach (ParserSpecialStat attribute in specialAttributes) { Dictionary <SpecialItemAttribute, List <ParserSpecialStat> > dictionary = GetSpecialRange(randomId); if (!dictionary.ContainsKey(attribute.Id)) { continue; } SpecialStat specialStat = new SpecialStat(dictionary[attribute.Id][Roll(id)]); if (randomOptions.MultiplyFactor > 0) { specialStat.Flat *= (int)Math.Ceiling(randomOptions.MultiplyFactor); specialStat.Percent *= randomOptions.MultiplyFactor; } itemStats.Add(specialStat); } return(itemStats.OrderBy(x => random.Next()).Take(item.Stats.BonusStats.Count).ToList()); }
public void GetBonusStats(int itemId, int rarity) { int randomId = ItemMetadataStorage.GetOptionRandom(itemId); ItemOptionRandom randomOptions = ItemOptionRandomMetadataStorage.GetMetadata(randomId, rarity); if (randomOptions == null) { return; } // get amount of slots Random random = RandomProvider.Get(); int slots = random.Next(randomOptions.Slots[0], randomOptions.Slots[1]); List <ItemStat> itemStats = RollStats(randomOptions, randomId, itemId); List <ItemStat> selectedStats = itemStats.OrderBy(x => random.Next()).Take(slots).ToList(); BonusStats.AddRange(selectedStats); }