Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 32 additions & 26 deletions Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<BasicAttribute, BasicOption> minOptions = [];
Dictionary<BasicAttribute, BasicOption> 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<BasicAttribute, BasicOption> minOptions;
Dictionary<BasicAttribute, BasicOption> 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));
}

Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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) {
Expand Down
Loading