// 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 level = item.Level; bool isTwoHand = item.IsTwoHand; if (!ItemOptionsMetadataStorage.GetRandomBonus(id, out List <ItemOption> randomBonusList)) { return(null); } Random random = new Random(); ItemOption itemOption = randomBonusList.FirstOrDefault(options => options.Rarity == item.Rarity && options.Slots > 0); if (itemOption == null) { return(null); } List <ItemStat> itemStats = new List <ItemStat>(); List <ItemAttribute> attributes = isSpecialStat ? itemOption.Stats : itemOption.Stats.Where(x => (short)x != ignoreStat).ToList(); List <SpecialItemAttribute> specialAttributes = isSpecialStat ? itemOption.SpecialStats.Where(x => (short)x != ignoreStat).ToList() : itemOption.SpecialStats; foreach (ItemAttribute attribute in attributes) { Dictionary <ItemAttribute, List <ParserStat> > dictionary = GetRange(id); if (!dictionary.ContainsKey(attribute)) { continue; } NormalStat normalStat = NormalStat.Of(dictionary[attribute][Roll(level)]); if (isTwoHand) { normalStat.Flat *= 2; normalStat.Percent *= 2; } itemStats.Add(normalStat); } foreach (SpecialItemAttribute attribute in specialAttributes) { Dictionary <SpecialItemAttribute, List <ParserSpecialStat> > dictionary = GetSpecialRange(id); if (!dictionary.ContainsKey(attribute)) { continue; } SpecialStat specialStat = SpecialStat.Of(dictionary[attribute][Roll(level)]); if (isTwoHand) { specialStat.Flat *= 2; specialStat.Percent *= 2; } itemStats.Add(specialStat); } return(itemStats.OrderBy(x => random.Next()).Take(item.Stats.BonusStats.Count).ToList()); }
// Roll new values for existing bonus stats public static List <ItemStat> RollNewBonusValues(Item item, short ignoreStat, bool isSpecialStat) { List <ItemStat> newBonus = new List <ItemStat>(); foreach (NormalStat stat in item.Stats.BonusStats.Where(x => x.GetType() == typeof(NormalStat))) { if (!isSpecialStat && (short)stat.Id == ignoreStat) { newBonus.Add(stat); continue; } newBonus.Add(NormalStat.Of(GetRange(item.Id)[stat.Id][Roll(item.Level)])); } foreach (SpecialStat stat in item.Stats.BonusStats.Where(x => x.GetType() == typeof(SpecialStat))) { if (isSpecialStat && (short)stat.Id == ignoreStat) { newBonus.Add(stat); continue; } newBonus.Add(SpecialStat.Of(GetSpecialRange(item.Id)[stat.Id][Roll(item.Level)])); } return(newBonus); }
// Roll new bonus stats and values except the locked stat public static List <ItemStat> RollBonusStatsWithStatLocked(int itemId, int rarity, int slots, int level, short ignoreStat, bool isSpecialStat) { if (!ItemOptionsMetadataStorage.GetRandomBonus(itemId, out List <ItemOption> randomBonusList)) { return(null); } Random random = new Random(); ItemOption itemOption = randomBonusList.FirstOrDefault(options => options.Rarity == rarity && options.Slots > 0); if (itemOption == null) { return(null); } List <ItemStat> itemStats = new List <ItemStat>(); List <ItemAttribute> attributes = isSpecialStat ? itemOption.Stats : itemOption.Stats.Where(x => (short)x != ignoreStat).ToList(); List <SpecialItemAttribute> specialAttributes = isSpecialStat ? itemOption.SpecialStats.Where(x => (short)x != ignoreStat).ToList() : itemOption.SpecialStats; foreach (ItemAttribute attribute in attributes) { itemStats.Add(NormalStat.Of(GetRange(itemId)[attribute][Roll(level)])); } foreach (SpecialItemAttribute attribute in specialAttributes) { itemStats.Add(SpecialStat.Of(GetSpecialRange(itemId)[attribute][Roll(level)])); } return(itemStats.OrderBy(x => random.Next()).Take(slots).ToList()); }
// Roll new bonus stats and values public static List <ItemStat> RollBonusStats(int itemId, int rarity, int level) { if (!ItemOptionsMetadataStorage.GetRandomBonus(itemId, out List <ItemOption> randomBonusList)) { return(null); } Random random = new Random(); ItemOption itemOption = randomBonusList.FirstOrDefault(options => options.Rarity == rarity && options.Slots > 0); if (itemOption == null) { return(null); } List <ItemStat> itemStats = new List <ItemStat>(); foreach (ItemAttribute attribute in itemOption.Stats) { itemStats.Add(NormalStat.Of(GetRange(itemId)[attribute][Roll(level)])); } foreach (SpecialItemAttribute attribute in itemOption.SpecialStats) { itemStats.Add(SpecialStat.Of(GetSpecialRange(itemId)[attribute][Roll(level)])); } return(itemStats.OrderBy(x => random.Next()).Take(itemOption.Slots).ToList()); }
// Get random values for each stat and check if item is two-handed private static List <ItemStat> RollStats(int itemId, int level, bool isTwoHand, ItemOption itemOption) { List <ItemStat> itemStats = new List <ItemStat>(); foreach (ItemAttribute attribute in itemOption.Stats) { Dictionary <ItemAttribute, List <ParserStat> > dictionary = GetRange(itemId); if (!dictionary.ContainsKey(attribute)) { continue; } NormalStat normalStat = NormalStat.Of(dictionary[attribute][Roll(level)]); if (isTwoHand) { normalStat.Flat *= 2; normalStat.Percent *= 2; } itemStats.Add(normalStat); } foreach (SpecialItemAttribute attribute in itemOption.SpecialStats) { Dictionary <SpecialItemAttribute, List <ParserSpecialStat> > dictionary = GetSpecialRange(itemId); if (!dictionary.ContainsKey(attribute)) { continue; } SpecialStat specialStat = SpecialStat.Of(dictionary[attribute][Roll(level)]); if (isTwoHand) { specialStat.Flat *= 2; specialStat.Percent *= 2; } itemStats.Add(specialStat); } return(itemStats); }
// Roll new values for existing bonus stats public static List <ItemStat> RollNewBonusValues(Item item, short ignoreStat, bool isSpecialStat) { List <ItemStat> newBonus = new List <ItemStat>(); foreach (NormalStat stat in item.Stats.BonusStats.Where(x => x.GetType() == typeof(NormalStat))) { if (!isSpecialStat && (short)stat.Id == ignoreStat) { newBonus.Add(stat); continue; } Dictionary <ItemAttribute, List <ParserStat> > dictionary = GetRange(item.Id); if (!dictionary.ContainsKey(stat.Id)) { continue; } newBonus.Add(NormalStat.Of(dictionary[stat.Id][Roll(item.Level)])); } foreach (SpecialStat stat in item.Stats.BonusStats.Where(x => x.GetType() == typeof(SpecialStat))) { if (isSpecialStat && (short)stat.Id == ignoreStat) { newBonus.Add(stat); continue; } Dictionary <SpecialItemAttribute, List <ParserSpecialStat> > dictionary = GetSpecialRange(item.Id); if (!dictionary.ContainsKey(stat.Id)) { continue; } newBonus.Add(SpecialStat.Of(dictionary[stat.Id][Roll(item.Level)])); } return(newBonus); }
// Roll new basic stats and values public List <ItemStat> RollBasicStats(int itemId, int rarity, int level) { if (!ItemOptionsMetadataStorage.GetBasic(itemId, out List <ItemOption> basicList)) { return(null); } ItemOption itemOptions = basicList.Find(options => options.Rarity == rarity); if (itemOptions == null) { return(null); } // Weapon and pet atk comes from each Item option and not from stat ranges if (itemOptions.MaxWeaponAtk != 0) { BasicStats.Add(NormalStat.Of(ItemAttribute.MinWeaponAtk, itemOptions.MinWeaponAtk)); BasicStats.Add(NormalStat.Of(ItemAttribute.MaxWeaponAtk, itemOptions.MaxWeaponAtk)); } if (itemOptions.PetAtk != 0) { BasicStats.Add(NormalStat.Of(ItemAttribute.PetBonusAtk, itemOptions.PetAtk)); } List <ItemStat> itemStats = new List <ItemStat>(); foreach (ItemAttribute attribute in itemOptions.Stats) { itemStats.Add(NormalStat.Of(GetRange(itemId)[attribute][Roll(level)])); } foreach (SpecialItemAttribute attribute in itemOptions.SpecialStats) { itemStats.Add(SpecialStat.Of(GetSpecialRange(itemId)[attribute][Roll(level)])); } return(itemStats); }