Fix enchant scroll applying single-level stats instead of cumulative - #674

Merged
Zintixx merged 2 commits into
masterfrom
fix/enchant-scroll-cumulative
Apr 3, 2026
Merged

Fix enchant scroll applying single-level stats instead of cumulative#674
Zintixx merged 2 commits into
masterfrom
fix/enchant-scroll-cumulative

Conversation

@AngeloTadeucci

@AngeloTadeucciAngeloTadeucci commented Mar 29, 2026

Copy link
Copy Markdown
Collaborator

EnchantScrollHandler.HandleEnchant only called GetEnchant for the target level, giving e.g. only level 11's bonus instead of the sum of levels 1 through 11. HandlePreview also computed deltas from current enchant level instead of absolute cumulative values, showing wrong stats when using a scroll on an already-enchanted item.

Both now use GetCumulativeEnchant which sums per-level rates from 1 through the target level, matching manual Ophelia/Peachy enchanting.

Summary by CodeRabbit

  • Bug Fixes
    • Enchant scroll preview now accurately computes and displays option ranges across enchant levels using cumulative accumulation.
    • Corrected handling of random vs. standard enchant types so previews reflect true min/max options.
    • Fixed enchant application so upgraded items properly accumulate enchant properties and repopulate option lists after an upgrade.

EnchantScrollHandler.HandleEnchant only called GetEnchant for the target
level, giving e.g. only level 11's bonus instead of the sum of levels
1 through 11. HandlePreview also computed deltas from current enchant
level instead of absolute cumulative values, showing wrong stats when
using a scroll on an already-enchanted item.
Both now use GetCumulativeEnchant which sums per-level rates from 1
through the target level, matching manual Ophelia/Peachy enchanting.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 271493c6-0743-4cb9-8d61-29e21cf3b787

📥 Commits

Reviewing files that changed from the base of the PR and between 1a8a18f and 6a9fb6e.

📒 Files selected for processing (1)
  • Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs

📝 Walkthrough

Walkthrough

Preview and apply logic for enchant scrolls changed to compute cumulative BasicOptions across levels using a new GetCumulativeEnchant helper; preview selects min/max from cumulative results, and application updates item.Enchant fields by accumulating and replacing basic options rather than assigning a single-level enchant directly.

Changes

Cohort / File(s)Summary
Enchant Scroll Handler
Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs
Reworked preview and apply flows to use a new GetCumulativeEnchant(session, item, targetLevel) helper that accumulates BasicOptions across levels 1..targetLevel. Preview for Random scrolls uses cumulative values at min/max metadata enchants; non-random uses cumulative at max. Runtime apply logic now computes cumulative enchant for the final level, sets item.Enchant.Enchants = targetLevel, clears item.Enchant.BasicOptions, and repopulates from the computed cumulative result instead of directly assigning item.Enchant from a single-level lookup. Added private static helper to produce cumulative enchant results.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~35 minutes

Possibly related PRs

  • Fix: Add enchant stats to character #453 — Modifies consumption of item.Enchant.BasicOptions when applying enchant stats to characters; related to how BasicOptions are produced/used.
  • fix enchanting #631 — Adjusts merging and update logic for enchant BasicOptions and enchant counters; overlaps with cumulative accumulation changes.

Suggested reviewers

  • Zintixx

Poem

🐰
Whiskers twitch, I count each hop,
From one to target, options pop,
Cumulative bits stitched level by level,
Random or steady, none left dishevel,
I nibble code and bless this drop. ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title directly and concisely describes the main bug fix: enchant scrolls now apply cumulative stats instead of single-level stats.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/enchant-scroll-cumulative

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs`:
- Line 110: The current assignment item.Enchant = GetCumulativeEnchant(session,
item, enchantLevel) replaces the existing ItemEnchant object and wipes persisted
fields (EnchantExp, EnchantCharges, Charges, Tradeable) — instead, update the
existing Item.Enchant in-place: call GetCumulativeEnchant to obtain the computed
BasicOptions/Enchants and then copy only those specific properties onto the
existing item.Enchant instance (or create it if null) so EnchantExp,
EnchantCharges, Charges and Tradeable remain unchanged; apply the same in-place
merge fix for the other similar block referenced around lines 138-151.
- Around line 67-69: The preview for Random scrolls uses metadata.Enchants.Min()
directly which can show a lower floor than the item's current enchant; change
the min preview calculation in the EnchantScrollType.Random branch of
HandleEnchant to clamp the minimum roll to the item's current enchant (e.g.,
compute minRoll = Math.Max(metadata.Enchants.Min(), currentEnchant) or
equivalent using the item's current enchant level) before calling
GetCumulativeEnchant(session, item, ...). Leave the max preview as
metadata.Enchants.Max() but ensure both calls use the clamped value for the
lower bound so minOptions reflects the true non-decreasing floor.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 17ba1ebe-0ea3-451f-b707-165b486f42de

📥 Commits

Reviewing files that changed from the base of the PR and between edabcd9 and 1a8a18f.

📒 Files selected for processing (1)
  • Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs

Comment threadMaple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs
Comment threadMaple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs Outdated
Clamp preview minimum to item's current enchant level (Math.Max) since
enchant scrolls never decrease enchant level. Update enchant properties
in-place instead of replacing the ItemEnchant object to preserve
persisted fields (EnchantExp, EnchantCharges, Charges, Tradeable).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@Zintixx
Zintixx merged commit ee532da into masterApr 3, 2026
3 checks passed
@AngeloTadeucci
AngeloTadeucci deleted the fix/enchant-scroll-cumulative branch April 3, 2026 22:16
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AngeloTadeucci@Zintixx
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Fix enchant scroll applying single-level stats instead of cumulative - #674

Merged
Zintixx merged 2 commits into
masterfrom
fix/enchant-scroll-cumulative
Apr 3, 2026
Merged

Fix enchant scroll applying single-level stats instead of cumulative#674
Zintixx merged 2 commits into
masterfrom
fix/enchant-scroll-cumulative

Conversation

@AngeloTadeucci

@AngeloTadeucciAngeloTadeucci commented Mar 29, 2026

Copy link
Copy Markdown
Collaborator

EnchantScrollHandler.HandleEnchant only called GetEnchant for the target level, giving e.g. only level 11's bonus instead of the sum of levels 1 through 11. HandlePreview also computed deltas from current enchant level instead of absolute cumulative values, showing wrong stats when using a scroll on an already-enchanted item.

Both now use GetCumulativeEnchant which sums per-level rates from 1 through the target level, matching manual Ophelia/Peachy enchanting.

Summary by CodeRabbit

  • Bug Fixes
    • Enchant scroll preview now accurately computes and displays option ranges across enchant levels using cumulative accumulation.
    • Corrected handling of random vs. standard enchant types so previews reflect true min/max options.
    • Fixed enchant application so upgraded items properly accumulate enchant properties and repopulate option lists after an upgrade.

EnchantScrollHandler.HandleEnchant only called GetEnchant for the target
level, giving e.g. only level 11's bonus instead of the sum of levels
1 through 11. HandlePreview also computed deltas from current enchant
level instead of absolute cumulative values, showing wrong stats when
using a scroll on an already-enchanted item.
Both now use GetCumulativeEnchant which sums per-level rates from 1
through the target level, matching manual Ophelia/Peachy enchanting.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 271493c6-0743-4cb9-8d61-29e21cf3b787

📥 Commits

Reviewing files that changed from the base of the PR and between 1a8a18f and 6a9fb6e.

📒 Files selected for processing (1)
  • Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs

📝 Walkthrough

Walkthrough

Preview and apply logic for enchant scrolls changed to compute cumulative BasicOptions across levels using a new GetCumulativeEnchant helper; preview selects min/max from cumulative results, and application updates item.Enchant fields by accumulating and replacing basic options rather than assigning a single-level enchant directly.

Changes

Cohort / File(s)Summary
Enchant Scroll Handler
Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs
Reworked preview and apply flows to use a new GetCumulativeEnchant(session, item, targetLevel) helper that accumulates BasicOptions across levels 1..targetLevel. Preview for Random scrolls uses cumulative values at min/max metadata enchants; non-random uses cumulative at max. Runtime apply logic now computes cumulative enchant for the final level, sets item.Enchant.Enchants = targetLevel, clears item.Enchant.BasicOptions, and repopulates from the computed cumulative result instead of directly assigning item.Enchant from a single-level lookup. Added private static helper to produce cumulative enchant results.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~35 minutes

Possibly related PRs

  • Fix: Add enchant stats to character #453 — Modifies consumption of item.Enchant.BasicOptions when applying enchant stats to characters; related to how BasicOptions are produced/used.
  • fix enchanting #631 — Adjusts merging and update logic for enchant BasicOptions and enchant counters; overlaps with cumulative accumulation changes.

Suggested reviewers

  • Zintixx

Poem

🐰
Whiskers twitch, I count each hop,
From one to target, options pop,
Cumulative bits stitched level by level,
Random or steady, none left dishevel,
I nibble code and bless this drop. ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title directly and concisely describes the main bug fix: enchant scrolls now apply cumulative stats instead of single-level stats.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/enchant-scroll-cumulative

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs`:
- Line 110: The current assignment item.Enchant = GetCumulativeEnchant(session,
item, enchantLevel) replaces the existing ItemEnchant object and wipes persisted
fields (EnchantExp, EnchantCharges, Charges, Tradeable) — instead, update the
existing Item.Enchant in-place: call GetCumulativeEnchant to obtain the computed
BasicOptions/Enchants and then copy only those specific properties onto the
existing item.Enchant instance (or create it if null) so EnchantExp,
EnchantCharges, Charges and Tradeable remain unchanged; apply the same in-place
merge fix for the other similar block referenced around lines 138-151.
- Around line 67-69: The preview for Random scrolls uses metadata.Enchants.Min()
directly which can show a lower floor than the item's current enchant; change
the min preview calculation in the EnchantScrollType.Random branch of
HandleEnchant to clamp the minimum roll to the item's current enchant (e.g.,
compute minRoll = Math.Max(metadata.Enchants.Min(), currentEnchant) or
equivalent using the item's current enchant level) before calling
GetCumulativeEnchant(session, item, ...). Leave the max preview as
metadata.Enchants.Max() but ensure both calls use the clamped value for the
lower bound so minOptions reflects the true non-decreasing floor.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 17ba1ebe-0ea3-451f-b707-165b486f42de

📥 Commits

Reviewing files that changed from the base of the PR and between edabcd9 and 1a8a18f.

📒 Files selected for processing (1)
  • Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs

Comment threadMaple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs
Comment threadMaple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs Outdated
Clamp preview minimum to item's current enchant level (Math.Max) since
enchant scrolls never decrease enchant level. Update enchant properties
in-place instead of replacing the ItemEnchant object to preserve
persisted fields (EnchantExp, EnchantCharges, Charges, Tradeable).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@Zintixx
Zintixx merged commit ee532da into masterApr 3, 2026
3 checks passed
@AngeloTadeucci
AngeloTadeucci deleted the fix/enchant-scroll-cumulative branch April 3, 2026 22:16
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AngeloTadeucci@Zintixx
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix enchant scroll applying single-level stats instead of cumulative - #674

Merged
Zintixx merged 2 commits into
masterfrom
fix/enchant-scroll-cumulative
Apr 3, 2026
Merged

Fix enchant scroll applying single-level stats instead of cumulative#674
Zintixx merged 2 commits into
masterfrom
fix/enchant-scroll-cumulative

Conversation

@AngeloTadeucci

@AngeloTadeucciAngeloTadeucci commented Mar 29, 2026

Copy link
Copy Markdown
Collaborator

EnchantScrollHandler.HandleEnchant only called GetEnchant for the target level, giving e.g. only level 11's bonus instead of the sum of levels 1 through 11. HandlePreview also computed deltas from current enchant level instead of absolute cumulative values, showing wrong stats when using a scroll on an already-enchanted item.

Both now use GetCumulativeEnchant which sums per-level rates from 1 through the target level, matching manual Ophelia/Peachy enchanting.

Summary by CodeRabbit

  • Bug Fixes
    • Enchant scroll preview now accurately computes and displays option ranges across enchant levels using cumulative accumulation.
    • Corrected handling of random vs. standard enchant types so previews reflect true min/max options.
    • Fixed enchant application so upgraded items properly accumulate enchant properties and repopulate option lists after an upgrade.

EnchantScrollHandler.HandleEnchant only called GetEnchant for the target
level, giving e.g. only level 11's bonus instead of the sum of levels
1 through 11. HandlePreview also computed deltas from current enchant
level instead of absolute cumulative values, showing wrong stats when
using a scroll on an already-enchanted item.
Both now use GetCumulativeEnchant which sums per-level rates from 1
through the target level, matching manual Ophelia/Peachy enchanting.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 271493c6-0743-4cb9-8d61-29e21cf3b787

📥 Commits

Reviewing files that changed from the base of the PR and between 1a8a18f and 6a9fb6e.

📒 Files selected for processing (1)
  • Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs

📝 Walkthrough

Walkthrough

Preview and apply logic for enchant scrolls changed to compute cumulative BasicOptions across levels using a new GetCumulativeEnchant helper; preview selects min/max from cumulative results, and application updates item.Enchant fields by accumulating and replacing basic options rather than assigning a single-level enchant directly.

Changes

Cohort / File(s)Summary
Enchant Scroll Handler
Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs
Reworked preview and apply flows to use a new GetCumulativeEnchant(session, item, targetLevel) helper that accumulates BasicOptions across levels 1..targetLevel. Preview for Random scrolls uses cumulative values at min/max metadata enchants; non-random uses cumulative at max. Runtime apply logic now computes cumulative enchant for the final level, sets item.Enchant.Enchants = targetLevel, clears item.Enchant.BasicOptions, and repopulates from the computed cumulative result instead of directly assigning item.Enchant from a single-level lookup. Added private static helper to produce cumulative enchant results.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~35 minutes

Possibly related PRs

  • Fix: Add enchant stats to character #453 — Modifies consumption of item.Enchant.BasicOptions when applying enchant stats to characters; related to how BasicOptions are produced/used.
  • fix enchanting #631 — Adjusts merging and update logic for enchant BasicOptions and enchant counters; overlaps with cumulative accumulation changes.

Suggested reviewers

  • Zintixx

Poem

🐰
Whiskers twitch, I count each hop,
From one to target, options pop,
Cumulative bits stitched level by level,
Random or steady, none left dishevel,
I nibble code and bless this drop. ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title directly and concisely describes the main bug fix: enchant scrolls now apply cumulative stats instead of single-level stats.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/enchant-scroll-cumulative

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs`:
- Line 110: The current assignment item.Enchant = GetCumulativeEnchant(session,
item, enchantLevel) replaces the existing ItemEnchant object and wipes persisted
fields (EnchantExp, EnchantCharges, Charges, Tradeable) — instead, update the
existing Item.Enchant in-place: call GetCumulativeEnchant to obtain the computed
BasicOptions/Enchants and then copy only those specific properties onto the
existing item.Enchant instance (or create it if null) so EnchantExp,
EnchantCharges, Charges and Tradeable remain unchanged; apply the same in-place
merge fix for the other similar block referenced around lines 138-151.
- Around line 67-69: The preview for Random scrolls uses metadata.Enchants.Min()
directly which can show a lower floor than the item's current enchant; change
the min preview calculation in the EnchantScrollType.Random branch of
HandleEnchant to clamp the minimum roll to the item's current enchant (e.g.,
compute minRoll = Math.Max(metadata.Enchants.Min(), currentEnchant) or
equivalent using the item's current enchant level) before calling
GetCumulativeEnchant(session, item, ...). Leave the max preview as
metadata.Enchants.Max() but ensure both calls use the clamped value for the
lower bound so minOptions reflects the true non-decreasing floor.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 17ba1ebe-0ea3-451f-b707-165b486f42de

📥 Commits

Reviewing files that changed from the base of the PR and between edabcd9 and 1a8a18f.

📒 Files selected for processing (1)
  • Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs

Comment threadMaple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs
Comment threadMaple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs Outdated
Clamp preview minimum to item's current enchant level (Math.Max) since
enchant scrolls never decrease enchant level. Update enchant properties
in-place instead of replacing the ItemEnchant object to preserve
persisted fields (EnchantExp, EnchantCharges, Charges, Tradeable).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@Zintixx
Zintixx merged commit ee532da into masterApr 3, 2026
3 checks passed
@AngeloTadeucci
AngeloTadeucci deleted the fix/enchant-scroll-cumulative branch April 3, 2026 22:16
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AngeloTadeucci@Zintixx
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix enchant scroll applying single-level stats instead of cumulative - #674

Merged
Zintixx merged 2 commits into
masterfrom
fix/enchant-scroll-cumulative
Apr 3, 2026
Merged

Fix enchant scroll applying single-level stats instead of cumulative#674
Zintixx merged 2 commits into
masterfrom
fix/enchant-scroll-cumulative

Conversation

@AngeloTadeucci

@AngeloTadeucciAngeloTadeucci commented Mar 29, 2026

Copy link
Copy Markdown
Collaborator

EnchantScrollHandler.HandleEnchant only called GetEnchant for the target level, giving e.g. only level 11's bonus instead of the sum of levels 1 through 11. HandlePreview also computed deltas from current enchant level instead of absolute cumulative values, showing wrong stats when using a scroll on an already-enchanted item.

Both now use GetCumulativeEnchant which sums per-level rates from 1 through the target level, matching manual Ophelia/Peachy enchanting.

Summary by CodeRabbit

  • Bug Fixes
    • Enchant scroll preview now accurately computes and displays option ranges across enchant levels using cumulative accumulation.
    • Corrected handling of random vs. standard enchant types so previews reflect true min/max options.
    • Fixed enchant application so upgraded items properly accumulate enchant properties and repopulate option lists after an upgrade.

EnchantScrollHandler.HandleEnchant only called GetEnchant for the target
level, giving e.g. only level 11's bonus instead of the sum of levels
1 through 11. HandlePreview also computed deltas from current enchant
level instead of absolute cumulative values, showing wrong stats when
using a scroll on an already-enchanted item.
Both now use GetCumulativeEnchant which sums per-level rates from 1
through the target level, matching manual Ophelia/Peachy enchanting.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 271493c6-0743-4cb9-8d61-29e21cf3b787

📥 Commits

Reviewing files that changed from the base of the PR and between 1a8a18f and 6a9fb6e.

📒 Files selected for processing (1)
  • Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs

📝 Walkthrough

Walkthrough

Preview and apply logic for enchant scrolls changed to compute cumulative BasicOptions across levels using a new GetCumulativeEnchant helper; preview selects min/max from cumulative results, and application updates item.Enchant fields by accumulating and replacing basic options rather than assigning a single-level enchant directly.

Changes

Cohort / File(s)Summary
Enchant Scroll Handler
Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs
Reworked preview and apply flows to use a new GetCumulativeEnchant(session, item, targetLevel) helper that accumulates BasicOptions across levels 1..targetLevel. Preview for Random scrolls uses cumulative values at min/max metadata enchants; non-random uses cumulative at max. Runtime apply logic now computes cumulative enchant for the final level, sets item.Enchant.Enchants = targetLevel, clears item.Enchant.BasicOptions, and repopulates from the computed cumulative result instead of directly assigning item.Enchant from a single-level lookup. Added private static helper to produce cumulative enchant results.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~35 minutes

Possibly related PRs

  • Fix: Add enchant stats to character #453 — Modifies consumption of item.Enchant.BasicOptions when applying enchant stats to characters; related to how BasicOptions are produced/used.
  • fix enchanting #631 — Adjusts merging and update logic for enchant BasicOptions and enchant counters; overlaps with cumulative accumulation changes.

Suggested reviewers

  • Zintixx

Poem

🐰
Whiskers twitch, I count each hop,
From one to target, options pop,
Cumulative bits stitched level by level,
Random or steady, none left dishevel,
I nibble code and bless this drop. ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title directly and concisely describes the main bug fix: enchant scrolls now apply cumulative stats instead of single-level stats.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/enchant-scroll-cumulative

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs`:
- Line 110: The current assignment item.Enchant = GetCumulativeEnchant(session,
item, enchantLevel) replaces the existing ItemEnchant object and wipes persisted
fields (EnchantExp, EnchantCharges, Charges, Tradeable) — instead, update the
existing Item.Enchant in-place: call GetCumulativeEnchant to obtain the computed
BasicOptions/Enchants and then copy only those specific properties onto the
existing item.Enchant instance (or create it if null) so EnchantExp,
EnchantCharges, Charges and Tradeable remain unchanged; apply the same in-place
merge fix for the other similar block referenced around lines 138-151.
- Around line 67-69: The preview for Random scrolls uses metadata.Enchants.Min()
directly which can show a lower floor than the item's current enchant; change
the min preview calculation in the EnchantScrollType.Random branch of
HandleEnchant to clamp the minimum roll to the item's current enchant (e.g.,
compute minRoll = Math.Max(metadata.Enchants.Min(), currentEnchant) or
equivalent using the item's current enchant level) before calling
GetCumulativeEnchant(session, item, ...). Leave the max preview as
metadata.Enchants.Max() but ensure both calls use the clamped value for the
lower bound so minOptions reflects the true non-decreasing floor.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 17ba1ebe-0ea3-451f-b707-165b486f42de

📥 Commits

Reviewing files that changed from the base of the PR and between edabcd9 and 1a8a18f.

📒 Files selected for processing (1)
  • Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs

Comment threadMaple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs
Comment threadMaple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs Outdated
Clamp preview minimum to item's current enchant level (Math.Max) since
enchant scrolls never decrease enchant level. Update enchant properties
in-place instead of replacing the ItemEnchant object to preserve
persisted fields (EnchantExp, EnchantCharges, Charges, Tradeable).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@Zintixx
Zintixx merged commit ee532da into masterApr 3, 2026
3 checks passed
@AngeloTadeucci
AngeloTadeucci deleted the fix/enchant-scroll-cumulative branch April 3, 2026 22:16
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AngeloTadeucci@Zintixx
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Fix enchant scroll applying single-level stats instead of cumulative - #674

Merged
Zintixx merged 2 commits into
masterfrom
fix/enchant-scroll-cumulative
Apr 3, 2026
Merged

Fix enchant scroll applying single-level stats instead of cumulative#674
Zintixx merged 2 commits into
masterfrom
fix/enchant-scroll-cumulative

Conversation

@AngeloTadeucci

@AngeloTadeucciAngeloTadeucci commented Mar 29, 2026

Copy link
Copy Markdown
Collaborator

EnchantScrollHandler.HandleEnchant only called GetEnchant for the target level, giving e.g. only level 11's bonus instead of the sum of levels 1 through 11. HandlePreview also computed deltas from current enchant level instead of absolute cumulative values, showing wrong stats when using a scroll on an already-enchanted item.

Both now use GetCumulativeEnchant which sums per-level rates from 1 through the target level, matching manual Ophelia/Peachy enchanting.

Summary by CodeRabbit

  • Bug Fixes
    • Enchant scroll preview now accurately computes and displays option ranges across enchant levels using cumulative accumulation.
    • Corrected handling of random vs. standard enchant types so previews reflect true min/max options.
    • Fixed enchant application so upgraded items properly accumulate enchant properties and repopulate option lists after an upgrade.

EnchantScrollHandler.HandleEnchant only called GetEnchant for the target
level, giving e.g. only level 11's bonus instead of the sum of levels
1 through 11. HandlePreview also computed deltas from current enchant
level instead of absolute cumulative values, showing wrong stats when
using a scroll on an already-enchanted item.
Both now use GetCumulativeEnchant which sums per-level rates from 1
through the target level, matching manual Ophelia/Peachy enchanting.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 271493c6-0743-4cb9-8d61-29e21cf3b787

📥 Commits

Reviewing files that changed from the base of the PR and between 1a8a18f and 6a9fb6e.

📒 Files selected for processing (1)
  • Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs

📝 Walkthrough

Walkthrough

Preview and apply logic for enchant scrolls changed to compute cumulative BasicOptions across levels using a new GetCumulativeEnchant helper; preview selects min/max from cumulative results, and application updates item.Enchant fields by accumulating and replacing basic options rather than assigning a single-level enchant directly.

Changes

Cohort / File(s)Summary
Enchant Scroll Handler
Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs
Reworked preview and apply flows to use a new GetCumulativeEnchant(session, item, targetLevel) helper that accumulates BasicOptions across levels 1..targetLevel. Preview for Random scrolls uses cumulative values at min/max metadata enchants; non-random uses cumulative at max. Runtime apply logic now computes cumulative enchant for the final level, sets item.Enchant.Enchants = targetLevel, clears item.Enchant.BasicOptions, and repopulates from the computed cumulative result instead of directly assigning item.Enchant from a single-level lookup. Added private static helper to produce cumulative enchant results.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~35 minutes

Possibly related PRs

  • Fix: Add enchant stats to character #453 — Modifies consumption of item.Enchant.BasicOptions when applying enchant stats to characters; related to how BasicOptions are produced/used.
  • fix enchanting #631 — Adjusts merging and update logic for enchant BasicOptions and enchant counters; overlaps with cumulative accumulation changes.

Suggested reviewers

  • Zintixx

Poem

🐰
Whiskers twitch, I count each hop,
From one to target, options pop,
Cumulative bits stitched level by level,
Random or steady, none left dishevel,
I nibble code and bless this drop. ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title directly and concisely describes the main bug fix: enchant scrolls now apply cumulative stats instead of single-level stats.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/enchant-scroll-cumulative

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs`:
- Line 110: The current assignment item.Enchant = GetCumulativeEnchant(session,
item, enchantLevel) replaces the existing ItemEnchant object and wipes persisted
fields (EnchantExp, EnchantCharges, Charges, Tradeable) — instead, update the
existing Item.Enchant in-place: call GetCumulativeEnchant to obtain the computed
BasicOptions/Enchants and then copy only those specific properties onto the
existing item.Enchant instance (or create it if null) so EnchantExp,
EnchantCharges, Charges and Tradeable remain unchanged; apply the same in-place
merge fix for the other similar block referenced around lines 138-151.
- Around line 67-69: The preview for Random scrolls uses metadata.Enchants.Min()
directly which can show a lower floor than the item's current enchant; change
the min preview calculation in the EnchantScrollType.Random branch of
HandleEnchant to clamp the minimum roll to the item's current enchant (e.g.,
compute minRoll = Math.Max(metadata.Enchants.Min(), currentEnchant) or
equivalent using the item's current enchant level) before calling
GetCumulativeEnchant(session, item, ...). Leave the max preview as
metadata.Enchants.Max() but ensure both calls use the clamped value for the
lower bound so minOptions reflects the true non-decreasing floor.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 17ba1ebe-0ea3-451f-b707-165b486f42de

📥 Commits

Reviewing files that changed from the base of the PR and between edabcd9 and 1a8a18f.

📒 Files selected for processing (1)
  • Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs

Comment threadMaple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs
Comment threadMaple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs Outdated
Clamp preview minimum to item's current enchant level (Math.Max) since
enchant scrolls never decrease enchant level. Update enchant properties
in-place instead of replacing the ItemEnchant object to preserve
persisted fields (EnchantExp, EnchantCharges, Charges, Tradeable).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@Zintixx
Zintixx merged commit ee532da into masterApr 3, 2026
3 checks passed
@AngeloTadeucci
AngeloTadeucci deleted the fix/enchant-scroll-cumulative branch April 3, 2026 22:16
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AngeloTadeucci@Zintixx
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix enchant scroll applying single-level stats instead of cumulative - #674

Merged
Zintixx merged 2 commits into
masterfrom
fix/enchant-scroll-cumulative
Apr 3, 2026
Merged

Fix enchant scroll applying single-level stats instead of cumulative#674
Zintixx merged 2 commits into
masterfrom
fix/enchant-scroll-cumulative

Conversation

@AngeloTadeucci

@AngeloTadeucciAngeloTadeucci commented Mar 29, 2026

Copy link
Copy Markdown
Collaborator

EnchantScrollHandler.HandleEnchant only called GetEnchant for the target level, giving e.g. only level 11's bonus instead of the sum of levels 1 through 11. HandlePreview also computed deltas from current enchant level instead of absolute cumulative values, showing wrong stats when using a scroll on an already-enchanted item.

Both now use GetCumulativeEnchant which sums per-level rates from 1 through the target level, matching manual Ophelia/Peachy enchanting.

Summary by CodeRabbit

  • Bug Fixes
    • Enchant scroll preview now accurately computes and displays option ranges across enchant levels using cumulative accumulation.
    • Corrected handling of random vs. standard enchant types so previews reflect true min/max options.
    • Fixed enchant application so upgraded items properly accumulate enchant properties and repopulate option lists after an upgrade.

EnchantScrollHandler.HandleEnchant only called GetEnchant for the target
level, giving e.g. only level 11's bonus instead of the sum of levels
1 through 11. HandlePreview also computed deltas from current enchant
level instead of absolute cumulative values, showing wrong stats when
using a scroll on an already-enchanted item.
Both now use GetCumulativeEnchant which sums per-level rates from 1
through the target level, matching manual Ophelia/Peachy enchanting.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 271493c6-0743-4cb9-8d61-29e21cf3b787

📥 Commits

Reviewing files that changed from the base of the PR and between 1a8a18f and 6a9fb6e.

📒 Files selected for processing (1)
  • Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs

📝 Walkthrough

Walkthrough

Preview and apply logic for enchant scrolls changed to compute cumulative BasicOptions across levels using a new GetCumulativeEnchant helper; preview selects min/max from cumulative results, and application updates item.Enchant fields by accumulating and replacing basic options rather than assigning a single-level enchant directly.

Changes

Cohort / File(s)Summary
Enchant Scroll Handler
Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs
Reworked preview and apply flows to use a new GetCumulativeEnchant(session, item, targetLevel) helper that accumulates BasicOptions across levels 1..targetLevel. Preview for Random scrolls uses cumulative values at min/max metadata enchants; non-random uses cumulative at max. Runtime apply logic now computes cumulative enchant for the final level, sets item.Enchant.Enchants = targetLevel, clears item.Enchant.BasicOptions, and repopulates from the computed cumulative result instead of directly assigning item.Enchant from a single-level lookup. Added private static helper to produce cumulative enchant results.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~35 minutes

Possibly related PRs

  • Fix: Add enchant stats to character #453 — Modifies consumption of item.Enchant.BasicOptions when applying enchant stats to characters; related to how BasicOptions are produced/used.
  • fix enchanting #631 — Adjusts merging and update logic for enchant BasicOptions and enchant counters; overlaps with cumulative accumulation changes.

Suggested reviewers

  • Zintixx

Poem

🐰
Whiskers twitch, I count each hop,
From one to target, options pop,
Cumulative bits stitched level by level,
Random or steady, none left dishevel,
I nibble code and bless this drop. ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title directly and concisely describes the main bug fix: enchant scrolls now apply cumulative stats instead of single-level stats.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/enchant-scroll-cumulative

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs`:
- Line 110: The current assignment item.Enchant = GetCumulativeEnchant(session,
item, enchantLevel) replaces the existing ItemEnchant object and wipes persisted
fields (EnchantExp, EnchantCharges, Charges, Tradeable) — instead, update the
existing Item.Enchant in-place: call GetCumulativeEnchant to obtain the computed
BasicOptions/Enchants and then copy only those specific properties onto the
existing item.Enchant instance (or create it if null) so EnchantExp,
EnchantCharges, Charges and Tradeable remain unchanged; apply the same in-place
merge fix for the other similar block referenced around lines 138-151.
- Around line 67-69: The preview for Random scrolls uses metadata.Enchants.Min()
directly which can show a lower floor than the item's current enchant; change
the min preview calculation in the EnchantScrollType.Random branch of
HandleEnchant to clamp the minimum roll to the item's current enchant (e.g.,
compute minRoll = Math.Max(metadata.Enchants.Min(), currentEnchant) or
equivalent using the item's current enchant level) before calling
GetCumulativeEnchant(session, item, ...). Leave the max preview as
metadata.Enchants.Max() but ensure both calls use the clamped value for the
lower bound so minOptions reflects the true non-decreasing floor.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 17ba1ebe-0ea3-451f-b707-165b486f42de

📥 Commits

Reviewing files that changed from the base of the PR and between edabcd9 and 1a8a18f.

📒 Files selected for processing (1)
  • Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs

Comment threadMaple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs
Comment threadMaple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs Outdated
Clamp preview minimum to item's current enchant level (Math.Max) since
enchant scrolls never decrease enchant level. Update enchant properties
in-place instead of replacing the ItemEnchant object to preserve
persisted fields (EnchantExp, EnchantCharges, Charges, Tradeable).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@Zintixx
Zintixx merged commit ee532da into masterApr 3, 2026
3 checks passed
@AngeloTadeucci
AngeloTadeucci deleted the fix/enchant-scroll-cumulative branch April 3, 2026 22:16
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AngeloTadeucci@Zintixx
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix enchant scroll applying single-level stats instead of cumulative - #674

Merged
Zintixx merged 2 commits into
masterfrom
fix/enchant-scroll-cumulative
Apr 3, 2026
Merged

Fix enchant scroll applying single-level stats instead of cumulative#674
Zintixx merged 2 commits into
masterfrom
fix/enchant-scroll-cumulative

Conversation

@AngeloTadeucci

@AngeloTadeucciAngeloTadeucci commented Mar 29, 2026

Copy link
Copy Markdown
Collaborator

EnchantScrollHandler.HandleEnchant only called GetEnchant for the target level, giving e.g. only level 11's bonus instead of the sum of levels 1 through 11. HandlePreview also computed deltas from current enchant level instead of absolute cumulative values, showing wrong stats when using a scroll on an already-enchanted item.

Both now use GetCumulativeEnchant which sums per-level rates from 1 through the target level, matching manual Ophelia/Peachy enchanting.

Summary by CodeRabbit

  • Bug Fixes
    • Enchant scroll preview now accurately computes and displays option ranges across enchant levels using cumulative accumulation.
    • Corrected handling of random vs. standard enchant types so previews reflect true min/max options.
    • Fixed enchant application so upgraded items properly accumulate enchant properties and repopulate option lists after an upgrade.

EnchantScrollHandler.HandleEnchant only called GetEnchant for the target
level, giving e.g. only level 11's bonus instead of the sum of levels
1 through 11. HandlePreview also computed deltas from current enchant
level instead of absolute cumulative values, showing wrong stats when
using a scroll on an already-enchanted item.
Both now use GetCumulativeEnchant which sums per-level rates from 1
through the target level, matching manual Ophelia/Peachy enchanting.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 271493c6-0743-4cb9-8d61-29e21cf3b787

📥 Commits

Reviewing files that changed from the base of the PR and between 1a8a18f and 6a9fb6e.

📒 Files selected for processing (1)
  • Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs

📝 Walkthrough

Walkthrough

Preview and apply logic for enchant scrolls changed to compute cumulative BasicOptions across levels using a new GetCumulativeEnchant helper; preview selects min/max from cumulative results, and application updates item.Enchant fields by accumulating and replacing basic options rather than assigning a single-level enchant directly.

Changes

Cohort / File(s)Summary
Enchant Scroll Handler
Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs
Reworked preview and apply flows to use a new GetCumulativeEnchant(session, item, targetLevel) helper that accumulates BasicOptions across levels 1..targetLevel. Preview for Random scrolls uses cumulative values at min/max metadata enchants; non-random uses cumulative at max. Runtime apply logic now computes cumulative enchant for the final level, sets item.Enchant.Enchants = targetLevel, clears item.Enchant.BasicOptions, and repopulates from the computed cumulative result instead of directly assigning item.Enchant from a single-level lookup. Added private static helper to produce cumulative enchant results.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~35 minutes

Possibly related PRs

  • Fix: Add enchant stats to character #453 — Modifies consumption of item.Enchant.BasicOptions when applying enchant stats to characters; related to how BasicOptions are produced/used.
  • fix enchanting #631 — Adjusts merging and update logic for enchant BasicOptions and enchant counters; overlaps with cumulative accumulation changes.

Suggested reviewers

  • Zintixx

Poem

🐰
Whiskers twitch, I count each hop,
From one to target, options pop,
Cumulative bits stitched level by level,
Random or steady, none left dishevel,
I nibble code and bless this drop. ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title directly and concisely describes the main bug fix: enchant scrolls now apply cumulative stats instead of single-level stats.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/enchant-scroll-cumulative

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs`:
- Line 110: The current assignment item.Enchant = GetCumulativeEnchant(session,
item, enchantLevel) replaces the existing ItemEnchant object and wipes persisted
fields (EnchantExp, EnchantCharges, Charges, Tradeable) — instead, update the
existing Item.Enchant in-place: call GetCumulativeEnchant to obtain the computed
BasicOptions/Enchants and then copy only those specific properties onto the
existing item.Enchant instance (or create it if null) so EnchantExp,
EnchantCharges, Charges and Tradeable remain unchanged; apply the same in-place
merge fix for the other similar block referenced around lines 138-151.
- Around line 67-69: The preview for Random scrolls uses metadata.Enchants.Min()
directly which can show a lower floor than the item's current enchant; change
the min preview calculation in the EnchantScrollType.Random branch of
HandleEnchant to clamp the minimum roll to the item's current enchant (e.g.,
compute minRoll = Math.Max(metadata.Enchants.Min(), currentEnchant) or
equivalent using the item's current enchant level) before calling
GetCumulativeEnchant(session, item, ...). Leave the max preview as
metadata.Enchants.Max() but ensure both calls use the clamped value for the
lower bound so minOptions reflects the true non-decreasing floor.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 17ba1ebe-0ea3-451f-b707-165b486f42de

📥 Commits

Reviewing files that changed from the base of the PR and between edabcd9 and 1a8a18f.

📒 Files selected for processing (1)
  • Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs

Comment threadMaple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs
Comment threadMaple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs Outdated
Clamp preview minimum to item's current enchant level (Math.Max) since
enchant scrolls never decrease enchant level. Update enchant properties
in-place instead of replacing the ItemEnchant object to preserve
persisted fields (EnchantExp, EnchantCharges, Charges, Tradeable).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@Zintixx
Zintixx merged commit ee532da into masterApr 3, 2026
3 checks passed
@AngeloTadeucci
AngeloTadeucci deleted the fix/enchant-scroll-cumulative branch April 3, 2026 22:16
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AngeloTadeucci@Zintixx
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Fix enchant scroll applying single-level stats instead of cumulative - #674

Merged
Zintixx merged 2 commits into
masterfrom
fix/enchant-scroll-cumulative
Apr 3, 2026
Merged

Fix enchant scroll applying single-level stats instead of cumulative#674
Zintixx merged 2 commits into
masterfrom
fix/enchant-scroll-cumulative

Conversation

@AngeloTadeucci

@AngeloTadeucciAngeloTadeucci commented Mar 29, 2026

Copy link
Copy Markdown
Collaborator

EnchantScrollHandler.HandleEnchant only called GetEnchant for the target level, giving e.g. only level 11's bonus instead of the sum of levels 1 through 11. HandlePreview also computed deltas from current enchant level instead of absolute cumulative values, showing wrong stats when using a scroll on an already-enchanted item.

Both now use GetCumulativeEnchant which sums per-level rates from 1 through the target level, matching manual Ophelia/Peachy enchanting.

Summary by CodeRabbit

  • Bug Fixes
    • Enchant scroll preview now accurately computes and displays option ranges across enchant levels using cumulative accumulation.
    • Corrected handling of random vs. standard enchant types so previews reflect true min/max options.
    • Fixed enchant application so upgraded items properly accumulate enchant properties and repopulate option lists after an upgrade.

EnchantScrollHandler.HandleEnchant only called GetEnchant for the target
level, giving e.g. only level 11's bonus instead of the sum of levels
1 through 11. HandlePreview also computed deltas from current enchant
level instead of absolute cumulative values, showing wrong stats when
using a scroll on an already-enchanted item.
Both now use GetCumulativeEnchant which sums per-level rates from 1
through the target level, matching manual Ophelia/Peachy enchanting.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 271493c6-0743-4cb9-8d61-29e21cf3b787

📥 Commits

Reviewing files that changed from the base of the PR and between 1a8a18f and 6a9fb6e.

📒 Files selected for processing (1)
  • Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs

📝 Walkthrough

Walkthrough

Preview and apply logic for enchant scrolls changed to compute cumulative BasicOptions across levels using a new GetCumulativeEnchant helper; preview selects min/max from cumulative results, and application updates item.Enchant fields by accumulating and replacing basic options rather than assigning a single-level enchant directly.

Changes

Cohort / File(s)Summary
Enchant Scroll Handler
Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs
Reworked preview and apply flows to use a new GetCumulativeEnchant(session, item, targetLevel) helper that accumulates BasicOptions across levels 1..targetLevel. Preview for Random scrolls uses cumulative values at min/max metadata enchants; non-random uses cumulative at max. Runtime apply logic now computes cumulative enchant for the final level, sets item.Enchant.Enchants = targetLevel, clears item.Enchant.BasicOptions, and repopulates from the computed cumulative result instead of directly assigning item.Enchant from a single-level lookup. Added private static helper to produce cumulative enchant results.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~35 minutes

Possibly related PRs

  • Fix: Add enchant stats to character #453 — Modifies consumption of item.Enchant.BasicOptions when applying enchant stats to characters; related to how BasicOptions are produced/used.
  • fix enchanting #631 — Adjusts merging and update logic for enchant BasicOptions and enchant counters; overlaps with cumulative accumulation changes.

Suggested reviewers

  • Zintixx

Poem

🐰
Whiskers twitch, I count each hop,
From one to target, options pop,
Cumulative bits stitched level by level,
Random or steady, none left dishevel,
I nibble code and bless this drop. ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title directly and concisely describes the main bug fix: enchant scrolls now apply cumulative stats instead of single-level stats.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/enchant-scroll-cumulative

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs`:
- Line 110: The current assignment item.Enchant = GetCumulativeEnchant(session,
item, enchantLevel) replaces the existing ItemEnchant object and wipes persisted
fields (EnchantExp, EnchantCharges, Charges, Tradeable) — instead, update the
existing Item.Enchant in-place: call GetCumulativeEnchant to obtain the computed
BasicOptions/Enchants and then copy only those specific properties onto the
existing item.Enchant instance (or create it if null) so EnchantExp,
EnchantCharges, Charges and Tradeable remain unchanged; apply the same in-place
merge fix for the other similar block referenced around lines 138-151.
- Around line 67-69: The preview for Random scrolls uses metadata.Enchants.Min()
directly which can show a lower floor than the item's current enchant; change
the min preview calculation in the EnchantScrollType.Random branch of
HandleEnchant to clamp the minimum roll to the item's current enchant (e.g.,
compute minRoll = Math.Max(metadata.Enchants.Min(), currentEnchant) or
equivalent using the item's current enchant level) before calling
GetCumulativeEnchant(session, item, ...). Leave the max preview as
metadata.Enchants.Max() but ensure both calls use the clamped value for the
lower bound so minOptions reflects the true non-decreasing floor.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 17ba1ebe-0ea3-451f-b707-165b486f42de

📥 Commits

Reviewing files that changed from the base of the PR and between edabcd9 and 1a8a18f.

📒 Files selected for processing (1)
  • Maple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs

Comment threadMaple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs
Comment threadMaple2.Server.Game/PacketHandlers/EnchantScrollHandler.cs Outdated
Clamp preview minimum to item's current enchant level (Math.Max) since
enchant scrolls never decrease enchant level. Update enchant properties
in-place instead of replacing the ItemEnchant object to preserve
persisted fields (EnchantExp, EnchantCharges, Charges, Tradeable).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@Zintixx
Zintixx merged commit ee532da into masterApr 3, 2026
3 checks passed
@AngeloTadeucci
AngeloTadeucci deleted the fix/enchant-scroll-cumulative branch April 3, 2026 22:16
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AngeloTadeucci@Zintixx