diff --git a/Maple2.Server.Game/Util/ItemStatsCalculator.cs b/Maple2.Server.Game/Util/ItemStatsCalculator.cs index c677a3a7b..f835aa398 100644 --- a/Maple2.Server.Game/Util/ItemStatsCalculator.cs +++ b/Maple2.Server.Game/Util/ItemStatsCalculator.cs @@ -199,26 +199,26 @@ public bool RandomizeValues(Item item, ItemOption itemOptionMetadata, ref ItemSt foreach (BasicAttribute attribute in option.Basic.Keys) { if (table.Values.TryGetValue(attribute, out ItemEquipVariationTable.Set[]? values)) { - int value = GetValue(item, itemOptionMetadata, attribute, tableValues: values, rollMax: rollMax); + int value = GetValue(attribute, tableValues: values, rollMax: rollMax); option.Basic[attribute] = new BasicOption((int) (value * option.MultiplyFactor)); } else if (table.Rates.TryGetValue(attribute, out ItemEquipVariationTable.Set[]? rates)) { - int rateInt = GetValue(item, itemOptionMetadata, attribute, tableRates: rates, rollMax: rollMax); + int rateInt = GetValue(attribute, tableRates: rates, rollMax: rollMax); option.Basic[attribute] = new BasicOption((rateInt / 1000f) * option.MultiplyFactor); } } foreach (SpecialAttribute attribute in option.Special.Keys) { if (table.SpecialValues.TryGetValue(attribute, out ItemEquipVariationTable.Set[]? values)) { - int value = GetValue(item, itemOptionMetadata, specialAttribute: attribute, tableValues: values, rollMax: rollMax); + int value = GetValue(specialAttribute: attribute, tableValues: values, rollMax: rollMax); option.Special[attribute] = new SpecialOption(0f, value * option.MultiplyFactor); } else if (table.SpecialRates.TryGetValue(attribute, out ItemEquipVariationTable.Set[]? rates)) { - int rateInt = GetValue(item, itemOptionMetadata, specialAttribute: attribute, tableRates: rates, rollMax: rollMax); + int rateInt = GetValue(specialAttribute: attribute, tableRates: rates, rollMax: rollMax); option.Special[attribute] = new SpecialOption((rateInt / 1000f) * option.MultiplyFactor); } } return true; - int GetValue(Item item, ItemOption itemOptionMetadata, BasicAttribute? attribute = null, SpecialAttribute? specialAttribute = null, ItemEquipVariationTable.Set[]? tableValues = null, ItemEquipVariationTable.Set[]? tableRates = null, bool rollMax = false) { + int GetValue(BasicAttribute? attribute = null, SpecialAttribute? specialAttribute = null, ItemEquipVariationTable.Set[]? tableValues = null, ItemEquipVariationTable.Set[]? tableRates = null, bool rollMax = false) { var weightedValues = new WeightedSet(); var weightedRates = new WeightedSet(); if (item.Type.IsPet) { @@ -446,13 +446,21 @@ private int GetItemVariationValue(BasicAttribute? basicAttribute = null, Special } else if (TableMetadata.ItemVariationTable.Rates.TryGetValue(basicAttribute.Value, out ItemVariationTable.Range[]? rates)) { foreach (ItemVariationTable.Range range in rates) { if (rate >= range.Min && rate <= range.Max) { - int convertedVariation = (int) range.Variation * 1000; - int convertedRate = (int) rate * 1000; + int convertedVariation = (int) (range.Variation * 1000); + int convertedRate = (int) (rate * 1000); return Random.Shared.Next(convertedRate, convertedRate + convertedVariation + 1); } } } - } else if (specialAttribute != null) { + + if (value != 0) { + return value; + } + + return (int) (rate * 1000); + } + + if (specialAttribute != null) { if (TableMetadata.ItemVariationTable.SpecialValues.TryGetValue(specialAttribute.Value, out ItemVariationTable.Range[]? values)) { foreach (ItemVariationTable.Range range in values) { if (value >= range.Min && value <= range.Max) { @@ -462,13 +470,20 @@ private int GetItemVariationValue(BasicAttribute? basicAttribute = null, Special } else if (TableMetadata.ItemVariationTable.SpecialRates.TryGetValue(specialAttribute.Value, out ItemVariationTable.Range[]? rates)) { foreach (ItemVariationTable.Range range in rates) { if (rate >= range.Min && rate <= range.Max) { - int convertedVariation = (int) range.Variation * 1000; - int convertedRate = (int) rate * 1000; + int convertedVariation = (int) (range.Variation * 1000); + int convertedRate = (int) (rate * 1000); return Random.Shared.Next(convertedRate, convertedRate + convertedVariation + 1); } } } + + if (value != 0) { + return value; + } + + return (int) (rate * 1000); } + return 0; }