diff --git a/Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs b/Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs index 5ceb682f..a8d723a5 100644 --- a/Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs +++ b/Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs @@ -62,31 +62,17 @@ private void HandlePreview(GameSession session, IByteReader packet) { return; } - int minEnchant = Math.Min(item.Enchant?.Enchants ?? 0, metadata.Enchants.Min()); - int maxEnchant = metadata.Enchants.Max(); - Dictionary minOptions = []; - Dictionary maxOptions = []; - for (int i = minEnchant; i < maxEnchant; i++) { - // add to dictionaries - int targetEnchant = i - 1; - ItemEnchant result = ItemEnchantManager.GetEnchant(session, item, i + 1); - foreach ((BasicAttribute attribute, BasicOption option) in result.BasicOptions) { - if (minOptions.TryGetValue(attribute, out BasicOption currentOption)) { - minOptions[attribute] = currentOption + option; - } else { - minOptions[attribute] = option; - } - } - - result = ItemEnchantManager.GetEnchant(session, item, i - 1); - foreach ((BasicAttribute attribute, BasicOption option) in result.BasicOptions) { - if (maxOptions.TryGetValue(attribute, out BasicOption currentOption)) { - maxOptions[attribute] = currentOption + option; - } else { - maxOptions[attribute] = option; - } - } + Dictionary minOptions; + Dictionary maxOptions; + if (metadata.Type == EnchantScrollType.Random) { + int minRoll = Math.Max(metadata.Enchants.Min(), item.Enchant?.Enchants ?? 0); + minOptions = GetCumulativeEnchant(session, item, minRoll).BasicOptions; + maxOptions = GetCumulativeEnchant(session, item, metadata.Enchants.Max()).BasicOptions; + } else { + minOptions = GetCumulativeEnchant(session, item, metadata.Enchants.Max()).BasicOptions; + maxOptions = minOptions; } + session.Send(EnchantScrollPacket.Preview(item, metadata.Type, minOptions, maxOptions)); } @@ -122,8 +108,12 @@ private void HandleEnchant(GameSession session, IByteReader packet) { // Ensure that you cannot randomize an enchant lower than current item. item.Enchant ??= new ItemEnchant(); if (enchantLevel > item.Enchant.Enchants) { - item.Enchant = ItemEnchantManager.GetEnchant(session, item, enchantLevel); - item.Enchant.Enchants = enchantLevel; + ItemEnchant computed = GetCumulativeEnchant(session, item, enchantLevel); + item.Enchant.Enchants = computed.Enchants; + item.Enchant.BasicOptions.Clear(); + foreach ((BasicAttribute attribute, BasicOption option) in computed.BasicOptions) { + item.Enchant.BasicOptions[attribute] = option; + } } session.Send(EnchantScrollPacket.Enchant(item)); @@ -151,6 +141,22 @@ private static EnchantScrollError IsCompatibleScroll(Item item, EnchantScrollMet return s_enchantscroll_ok; } + private static ItemEnchant GetCumulativeEnchant(GameSession session, Item item, int targetLevel) { + var cumulative = new ItemEnchant(); + for (int i = 1; i <= targetLevel; i++) { + ItemEnchant levelEnchant = ItemEnchantManager.GetEnchant(session, item, i); + foreach ((BasicAttribute attribute, BasicOption option) in levelEnchant.BasicOptions) { + if (cumulative.BasicOptions.TryGetValue(attribute, out BasicOption existing)) { + cumulative.BasicOptions[attribute] = existing + option; + } else { + cumulative.BasicOptions[attribute] = option; + } + } + } + cumulative.Enchants = targetLevel; + return cumulative; + } + private bool TryGetMetadata(GameSession session, long scrollUid, [NotNullWhen(true)] out EnchantScrollMetadata? metadata) { Item? scroll = session.Item.Inventory.Get(scrollUid); if (scroll == null) {