Release 1.19.0 - #53

Merged
tastybento merged 5 commits into
masterfrom
develop
Jun 21, 2026
Merged

Release 1.19.0#53
tastybento merged 5 commits into
masterfrom
develop

Conversation

@tastybento

Copy link
Copy Markdown
Member

Release 1.19.0.

Highlights

Standalone economy now works without a separate economy plugin

fix: register a fresh VaultHook when BentoBox has none — InvSwitcher registers its own per-world Vault economy, but BentoBox hooks Vault during early hooks (before addons enable). When InvSwitcher was the only economy, that early hook failed and was discarded, so getVault() stayed empty and economy-dependent addons (e.g. Bank) disabled themselves with "Vault is required". InvSwitcher now registers a fresh VaultHook once its provider is live, so it works as a standalone economy.

Companion PRs harden this on the framework side: BentoBoxWorld/BentoBox#2995 (retry the Vault hook after addons enable) and BentoBoxWorld/Bank#67 (retry before disabling).

Correct balance reported for offline economy transactions

fix: report offline economy balances correctly and harden offline saves — admin eco give/set/take on an offline player reported a stale balance (e.g. "New balance: 0.00" after giving 2000) because the success message re-read the balance from the database before the asynchronous save had flushed. The commands now report the authoritative balance returned by the transaction itself.

The same change hardens the underlying offline read-after-write path: offline saves are tracked in flight so two rapid sequential transactions can't load independent stale copies and lose an update — without blocking the main thread or caching offline players indefinitely. Adds a regression test.

Commits

  • d929649 fix: register a fresh VaultHook when BentoBox has none
  • a15c645 fix: report offline economy balances correctly and harden offline saves
  • f1bd4c2 chore: bump version to 1.19.0

Full test suite: 124/124 passing.

🤖 Generated with Claude Code

tastybentoand others added 5 commits June 3, 2026 08:18
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
refreshBentoBoxVaultHook() assumed BentoBox already held a VaultHook it
could re-hook. In the standalone case that is never true: BentoBox hooks
Vault during its early hooks, before addons enable, so when InvSwitcher
is the only economy that early hook fails for lack of any economy and is
discarded by HooksManager. getVault() then stays empty and the refresh
was a silent no-op, leaving Bank and the rest of BentoBox unable to see
our economy.
When getVault() is empty, register a fresh VaultHook now that our
provider is live, so getVault() is populated for economy consumers.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Admin eco give/set/take on an offline player reported a stale balance
(e.g. "New balance: 0.00" after giving 2000). The success message
re-read the balance from the database, which reloaded the offline player
fresh before the asynchronous save had flushed, returning the
pre-transaction value. Report the balance from the EconomyResponse the
transaction returned instead, which is authoritative.
Also harden the underlying offline read-after-write path: getStorageObject
loaded an independent transient copy for offline players on every call, so
two rapid sequential economy writes could each load before the first save
flushed, losing the first update. Track offline saves in flight in a
pending-saves map and reuse that object for follow-up reads/writes until
the last save flushes, then drop it so a later login still reloads fresh.
No main-thread blocking, no indefinite caching of offline players.
Add a regression test for the offline read-after-write path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Main code:
- InvEconomy: drop redundant @deprecated from the Vault interface overrides
(suppress the unavoidable deprecation/removal warnings at class level),
extract duplicated debug literals into constants, and replace nested
ternaries in debug routing with a routeSuffix() helper.
- Store: merge nested if in island-key migration; replace if/containsKey in
getStat UNTYPED branch with Optional.ifPresent.
- Remove unused import in InvSwitcherPladdon.
Tests:
- Remove the 'public' modifier from JUnit 5 test classes and annotated
methods (S5786).
- Add assertDoesNotThrow assertions to four clear-stored tests that had none.
- Remove redundant local Island mocks that shadowed the @mock field.
- Remove unused 'server' locals, unused imports, and unnecessary
'throws Exception' declarations.
Left intentionally: S110 (command class depth is inherent to BentoBox's
CompositeCommand hierarchy), S3776 (cognitive complexity on core inventory
methods - refactoring risks regressions), and S5738 (calls to deprecated
Bukkit.getOfflinePlayer required to implement Vault's name-based methods).
All 124 tests pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit 3d5d0c7 into masterJun 21, 2026
5 checks passed
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.

1 participant

@tastybento
, '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

Release 1.19.0 - #53

Merged
tastybento merged 5 commits into
masterfrom
develop
Jun 21, 2026
Merged

Release 1.19.0#53
tastybento merged 5 commits into
masterfrom
develop

Conversation

@tastybento

Copy link
Copy Markdown
Member

Release 1.19.0.

Highlights

Standalone economy now works without a separate economy plugin

fix: register a fresh VaultHook when BentoBox has none — InvSwitcher registers its own per-world Vault economy, but BentoBox hooks Vault during early hooks (before addons enable). When InvSwitcher was the only economy, that early hook failed and was discarded, so getVault() stayed empty and economy-dependent addons (e.g. Bank) disabled themselves with "Vault is required". InvSwitcher now registers a fresh VaultHook once its provider is live, so it works as a standalone economy.

Companion PRs harden this on the framework side: BentoBoxWorld/BentoBox#2995 (retry the Vault hook after addons enable) and BentoBoxWorld/Bank#67 (retry before disabling).

Correct balance reported for offline economy transactions

fix: report offline economy balances correctly and harden offline saves — admin eco give/set/take on an offline player reported a stale balance (e.g. "New balance: 0.00" after giving 2000) because the success message re-read the balance from the database before the asynchronous save had flushed. The commands now report the authoritative balance returned by the transaction itself.

The same change hardens the underlying offline read-after-write path: offline saves are tracked in flight so two rapid sequential transactions can't load independent stale copies and lose an update — without blocking the main thread or caching offline players indefinitely. Adds a regression test.

Commits

  • d929649 fix: register a fresh VaultHook when BentoBox has none
  • a15c645 fix: report offline economy balances correctly and harden offline saves
  • f1bd4c2 chore: bump version to 1.19.0

Full test suite: 124/124 passing.

🤖 Generated with Claude Code

tastybentoand others added 5 commits June 3, 2026 08:18
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
refreshBentoBoxVaultHook() assumed BentoBox already held a VaultHook it
could re-hook. In the standalone case that is never true: BentoBox hooks
Vault during its early hooks, before addons enable, so when InvSwitcher
is the only economy that early hook fails for lack of any economy and is
discarded by HooksManager. getVault() then stays empty and the refresh
was a silent no-op, leaving Bank and the rest of BentoBox unable to see
our economy.
When getVault() is empty, register a fresh VaultHook now that our
provider is live, so getVault() is populated for economy consumers.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Admin eco give/set/take on an offline player reported a stale balance
(e.g. "New balance: 0.00" after giving 2000). The success message
re-read the balance from the database, which reloaded the offline player
fresh before the asynchronous save had flushed, returning the
pre-transaction value. Report the balance from the EconomyResponse the
transaction returned instead, which is authoritative.
Also harden the underlying offline read-after-write path: getStorageObject
loaded an independent transient copy for offline players on every call, so
two rapid sequential economy writes could each load before the first save
flushed, losing the first update. Track offline saves in flight in a
pending-saves map and reuse that object for follow-up reads/writes until
the last save flushes, then drop it so a later login still reloads fresh.
No main-thread blocking, no indefinite caching of offline players.
Add a regression test for the offline read-after-write path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Main code:
- InvEconomy: drop redundant @deprecated from the Vault interface overrides
(suppress the unavoidable deprecation/removal warnings at class level),
extract duplicated debug literals into constants, and replace nested
ternaries in debug routing with a routeSuffix() helper.
- Store: merge nested if in island-key migration; replace if/containsKey in
getStat UNTYPED branch with Optional.ifPresent.
- Remove unused import in InvSwitcherPladdon.
Tests:
- Remove the 'public' modifier from JUnit 5 test classes and annotated
methods (S5786).
- Add assertDoesNotThrow assertions to four clear-stored tests that had none.
- Remove redundant local Island mocks that shadowed the @mock field.
- Remove unused 'server' locals, unused imports, and unnecessary
'throws Exception' declarations.
Left intentionally: S110 (command class depth is inherent to BentoBox's
CompositeCommand hierarchy), S3776 (cognitive complexity on core inventory
methods - refactoring risks regressions), and S5738 (calls to deprecated
Bukkit.getOfflinePlayer required to implement Vault's name-based methods).
All 124 tests pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit 3d5d0c7 into masterJun 21, 2026
5 checks passed
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.

1 participant

@tastybento
, '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

Release 1.19.0 - #53

Merged
tastybento merged 5 commits into
masterfrom
develop
Jun 21, 2026
Merged

Release 1.19.0#53
tastybento merged 5 commits into
masterfrom
develop

Conversation

@tastybento

Copy link
Copy Markdown
Member

Release 1.19.0.

Highlights

Standalone economy now works without a separate economy plugin

fix: register a fresh VaultHook when BentoBox has none — InvSwitcher registers its own per-world Vault economy, but BentoBox hooks Vault during early hooks (before addons enable). When InvSwitcher was the only economy, that early hook failed and was discarded, so getVault() stayed empty and economy-dependent addons (e.g. Bank) disabled themselves with "Vault is required". InvSwitcher now registers a fresh VaultHook once its provider is live, so it works as a standalone economy.

Companion PRs harden this on the framework side: BentoBoxWorld/BentoBox#2995 (retry the Vault hook after addons enable) and BentoBoxWorld/Bank#67 (retry before disabling).

Correct balance reported for offline economy transactions

fix: report offline economy balances correctly and harden offline saves — admin eco give/set/take on an offline player reported a stale balance (e.g. "New balance: 0.00" after giving 2000) because the success message re-read the balance from the database before the asynchronous save had flushed. The commands now report the authoritative balance returned by the transaction itself.

The same change hardens the underlying offline read-after-write path: offline saves are tracked in flight so two rapid sequential transactions can't load independent stale copies and lose an update — without blocking the main thread or caching offline players indefinitely. Adds a regression test.

Commits

  • d929649 fix: register a fresh VaultHook when BentoBox has none
  • a15c645 fix: report offline economy balances correctly and harden offline saves
  • f1bd4c2 chore: bump version to 1.19.0

Full test suite: 124/124 passing.

🤖 Generated with Claude Code

tastybentoand others added 5 commits June 3, 2026 08:18
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
refreshBentoBoxVaultHook() assumed BentoBox already held a VaultHook it
could re-hook. In the standalone case that is never true: BentoBox hooks
Vault during its early hooks, before addons enable, so when InvSwitcher
is the only economy that early hook fails for lack of any economy and is
discarded by HooksManager. getVault() then stays empty and the refresh
was a silent no-op, leaving Bank and the rest of BentoBox unable to see
our economy.
When getVault() is empty, register a fresh VaultHook now that our
provider is live, so getVault() is populated for economy consumers.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Admin eco give/set/take on an offline player reported a stale balance
(e.g. "New balance: 0.00" after giving 2000). The success message
re-read the balance from the database, which reloaded the offline player
fresh before the asynchronous save had flushed, returning the
pre-transaction value. Report the balance from the EconomyResponse the
transaction returned instead, which is authoritative.
Also harden the underlying offline read-after-write path: getStorageObject
loaded an independent transient copy for offline players on every call, so
two rapid sequential economy writes could each load before the first save
flushed, losing the first update. Track offline saves in flight in a
pending-saves map and reuse that object for follow-up reads/writes until
the last save flushes, then drop it so a later login still reloads fresh.
No main-thread blocking, no indefinite caching of offline players.
Add a regression test for the offline read-after-write path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Main code:
- InvEconomy: drop redundant @deprecated from the Vault interface overrides
(suppress the unavoidable deprecation/removal warnings at class level),
extract duplicated debug literals into constants, and replace nested
ternaries in debug routing with a routeSuffix() helper.
- Store: merge nested if in island-key migration; replace if/containsKey in
getStat UNTYPED branch with Optional.ifPresent.
- Remove unused import in InvSwitcherPladdon.
Tests:
- Remove the 'public' modifier from JUnit 5 test classes and annotated
methods (S5786).
- Add assertDoesNotThrow assertions to four clear-stored tests that had none.
- Remove redundant local Island mocks that shadowed the @mock field.
- Remove unused 'server' locals, unused imports, and unnecessary
'throws Exception' declarations.
Left intentionally: S110 (command class depth is inherent to BentoBox's
CompositeCommand hierarchy), S3776 (cognitive complexity on core inventory
methods - refactoring risks regressions), and S5738 (calls to deprecated
Bukkit.getOfflinePlayer required to implement Vault's name-based methods).
All 124 tests pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit 3d5d0c7 into masterJun 21, 2026
5 checks passed
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.

1 participant

@tastybento
, '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

Release 1.19.0 - #53

Merged
tastybento merged 5 commits into
masterfrom
develop
Jun 21, 2026
Merged

Release 1.19.0#53
tastybento merged 5 commits into
masterfrom
develop

Conversation

@tastybento

Copy link
Copy Markdown
Member

Release 1.19.0.

Highlights

Standalone economy now works without a separate economy plugin

fix: register a fresh VaultHook when BentoBox has none — InvSwitcher registers its own per-world Vault economy, but BentoBox hooks Vault during early hooks (before addons enable). When InvSwitcher was the only economy, that early hook failed and was discarded, so getVault() stayed empty and economy-dependent addons (e.g. Bank) disabled themselves with "Vault is required". InvSwitcher now registers a fresh VaultHook once its provider is live, so it works as a standalone economy.

Companion PRs harden this on the framework side: BentoBoxWorld/BentoBox#2995 (retry the Vault hook after addons enable) and BentoBoxWorld/Bank#67 (retry before disabling).

Correct balance reported for offline economy transactions

fix: report offline economy balances correctly and harden offline saves — admin eco give/set/take on an offline player reported a stale balance (e.g. "New balance: 0.00" after giving 2000) because the success message re-read the balance from the database before the asynchronous save had flushed. The commands now report the authoritative balance returned by the transaction itself.

The same change hardens the underlying offline read-after-write path: offline saves are tracked in flight so two rapid sequential transactions can't load independent stale copies and lose an update — without blocking the main thread or caching offline players indefinitely. Adds a regression test.

Commits

  • d929649 fix: register a fresh VaultHook when BentoBox has none
  • a15c645 fix: report offline economy balances correctly and harden offline saves
  • f1bd4c2 chore: bump version to 1.19.0

Full test suite: 124/124 passing.

🤖 Generated with Claude Code

tastybentoand others added 5 commits June 3, 2026 08:18
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
refreshBentoBoxVaultHook() assumed BentoBox already held a VaultHook it
could re-hook. In the standalone case that is never true: BentoBox hooks
Vault during its early hooks, before addons enable, so when InvSwitcher
is the only economy that early hook fails for lack of any economy and is
discarded by HooksManager. getVault() then stays empty and the refresh
was a silent no-op, leaving Bank and the rest of BentoBox unable to see
our economy.
When getVault() is empty, register a fresh VaultHook now that our
provider is live, so getVault() is populated for economy consumers.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Admin eco give/set/take on an offline player reported a stale balance
(e.g. "New balance: 0.00" after giving 2000). The success message
re-read the balance from the database, which reloaded the offline player
fresh before the asynchronous save had flushed, returning the
pre-transaction value. Report the balance from the EconomyResponse the
transaction returned instead, which is authoritative.
Also harden the underlying offline read-after-write path: getStorageObject
loaded an independent transient copy for offline players on every call, so
two rapid sequential economy writes could each load before the first save
flushed, losing the first update. Track offline saves in flight in a
pending-saves map and reuse that object for follow-up reads/writes until
the last save flushes, then drop it so a later login still reloads fresh.
No main-thread blocking, no indefinite caching of offline players.
Add a regression test for the offline read-after-write path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Main code:
- InvEconomy: drop redundant @deprecated from the Vault interface overrides
(suppress the unavoidable deprecation/removal warnings at class level),
extract duplicated debug literals into constants, and replace nested
ternaries in debug routing with a routeSuffix() helper.
- Store: merge nested if in island-key migration; replace if/containsKey in
getStat UNTYPED branch with Optional.ifPresent.
- Remove unused import in InvSwitcherPladdon.
Tests:
- Remove the 'public' modifier from JUnit 5 test classes and annotated
methods (S5786).
- Add assertDoesNotThrow assertions to four clear-stored tests that had none.
- Remove redundant local Island mocks that shadowed the @mock field.
- Remove unused 'server' locals, unused imports, and unnecessary
'throws Exception' declarations.
Left intentionally: S110 (command class depth is inherent to BentoBox's
CompositeCommand hierarchy), S3776 (cognitive complexity on core inventory
methods - refactoring risks regressions), and S5738 (calls to deprecated
Bukkit.getOfflinePlayer required to implement Vault's name-based methods).
All 124 tests pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit 3d5d0c7 into masterJun 21, 2026
5 checks passed
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.

1 participant

@tastybento
, '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

Release 1.19.0 - #53

Merged
tastybento merged 5 commits into
masterfrom
develop
Jun 21, 2026
Merged

Release 1.19.0#53
tastybento merged 5 commits into
masterfrom
develop

Conversation

@tastybento

Copy link
Copy Markdown
Member

Release 1.19.0.

Highlights

Standalone economy now works without a separate economy plugin

fix: register a fresh VaultHook when BentoBox has none — InvSwitcher registers its own per-world Vault economy, but BentoBox hooks Vault during early hooks (before addons enable). When InvSwitcher was the only economy, that early hook failed and was discarded, so getVault() stayed empty and economy-dependent addons (e.g. Bank) disabled themselves with "Vault is required". InvSwitcher now registers a fresh VaultHook once its provider is live, so it works as a standalone economy.

Companion PRs harden this on the framework side: BentoBoxWorld/BentoBox#2995 (retry the Vault hook after addons enable) and BentoBoxWorld/Bank#67 (retry before disabling).

Correct balance reported for offline economy transactions

fix: report offline economy balances correctly and harden offline saves — admin eco give/set/take on an offline player reported a stale balance (e.g. "New balance: 0.00" after giving 2000) because the success message re-read the balance from the database before the asynchronous save had flushed. The commands now report the authoritative balance returned by the transaction itself.

The same change hardens the underlying offline read-after-write path: offline saves are tracked in flight so two rapid sequential transactions can't load independent stale copies and lose an update — without blocking the main thread or caching offline players indefinitely. Adds a regression test.

Commits

  • d929649 fix: register a fresh VaultHook when BentoBox has none
  • a15c645 fix: report offline economy balances correctly and harden offline saves
  • f1bd4c2 chore: bump version to 1.19.0

Full test suite: 124/124 passing.

🤖 Generated with Claude Code

tastybentoand others added 5 commits June 3, 2026 08:18
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
refreshBentoBoxVaultHook() assumed BentoBox already held a VaultHook it
could re-hook. In the standalone case that is never true: BentoBox hooks
Vault during its early hooks, before addons enable, so when InvSwitcher
is the only economy that early hook fails for lack of any economy and is
discarded by HooksManager. getVault() then stays empty and the refresh
was a silent no-op, leaving Bank and the rest of BentoBox unable to see
our economy.
When getVault() is empty, register a fresh VaultHook now that our
provider is live, so getVault() is populated for economy consumers.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Admin eco give/set/take on an offline player reported a stale balance
(e.g. "New balance: 0.00" after giving 2000). The success message
re-read the balance from the database, which reloaded the offline player
fresh before the asynchronous save had flushed, returning the
pre-transaction value. Report the balance from the EconomyResponse the
transaction returned instead, which is authoritative.
Also harden the underlying offline read-after-write path: getStorageObject
loaded an independent transient copy for offline players on every call, so
two rapid sequential economy writes could each load before the first save
flushed, losing the first update. Track offline saves in flight in a
pending-saves map and reuse that object for follow-up reads/writes until
the last save flushes, then drop it so a later login still reloads fresh.
No main-thread blocking, no indefinite caching of offline players.
Add a regression test for the offline read-after-write path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Main code:
- InvEconomy: drop redundant @deprecated from the Vault interface overrides
(suppress the unavoidable deprecation/removal warnings at class level),
extract duplicated debug literals into constants, and replace nested
ternaries in debug routing with a routeSuffix() helper.
- Store: merge nested if in island-key migration; replace if/containsKey in
getStat UNTYPED branch with Optional.ifPresent.
- Remove unused import in InvSwitcherPladdon.
Tests:
- Remove the 'public' modifier from JUnit 5 test classes and annotated
methods (S5786).
- Add assertDoesNotThrow assertions to four clear-stored tests that had none.
- Remove redundant local Island mocks that shadowed the @mock field.
- Remove unused 'server' locals, unused imports, and unnecessary
'throws Exception' declarations.
Left intentionally: S110 (command class depth is inherent to BentoBox's
CompositeCommand hierarchy), S3776 (cognitive complexity on core inventory
methods - refactoring risks regressions), and S5738 (calls to deprecated
Bukkit.getOfflinePlayer required to implement Vault's name-based methods).
All 124 tests pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit 3d5d0c7 into masterJun 21, 2026
5 checks passed
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.

1 participant

@tastybento
, '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

Release 1.19.0 - #53

Merged
tastybento merged 5 commits into
masterfrom
develop
Jun 21, 2026
Merged

Release 1.19.0#53
tastybento merged 5 commits into
masterfrom
develop

Conversation

@tastybento

Copy link
Copy Markdown
Member

Release 1.19.0.

Highlights

Standalone economy now works without a separate economy plugin

fix: register a fresh VaultHook when BentoBox has none — InvSwitcher registers its own per-world Vault economy, but BentoBox hooks Vault during early hooks (before addons enable). When InvSwitcher was the only economy, that early hook failed and was discarded, so getVault() stayed empty and economy-dependent addons (e.g. Bank) disabled themselves with "Vault is required". InvSwitcher now registers a fresh VaultHook once its provider is live, so it works as a standalone economy.

Companion PRs harden this on the framework side: BentoBoxWorld/BentoBox#2995 (retry the Vault hook after addons enable) and BentoBoxWorld/Bank#67 (retry before disabling).

Correct balance reported for offline economy transactions

fix: report offline economy balances correctly and harden offline saves — admin eco give/set/take on an offline player reported a stale balance (e.g. "New balance: 0.00" after giving 2000) because the success message re-read the balance from the database before the asynchronous save had flushed. The commands now report the authoritative balance returned by the transaction itself.

The same change hardens the underlying offline read-after-write path: offline saves are tracked in flight so two rapid sequential transactions can't load independent stale copies and lose an update — without blocking the main thread or caching offline players indefinitely. Adds a regression test.

Commits

  • d929649 fix: register a fresh VaultHook when BentoBox has none
  • a15c645 fix: report offline economy balances correctly and harden offline saves
  • f1bd4c2 chore: bump version to 1.19.0

Full test suite: 124/124 passing.

🤖 Generated with Claude Code

tastybentoand others added 5 commits June 3, 2026 08:18
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
refreshBentoBoxVaultHook() assumed BentoBox already held a VaultHook it
could re-hook. In the standalone case that is never true: BentoBox hooks
Vault during its early hooks, before addons enable, so when InvSwitcher
is the only economy that early hook fails for lack of any economy and is
discarded by HooksManager. getVault() then stays empty and the refresh
was a silent no-op, leaving Bank and the rest of BentoBox unable to see
our economy.
When getVault() is empty, register a fresh VaultHook now that our
provider is live, so getVault() is populated for economy consumers.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Admin eco give/set/take on an offline player reported a stale balance
(e.g. "New balance: 0.00" after giving 2000). The success message
re-read the balance from the database, which reloaded the offline player
fresh before the asynchronous save had flushed, returning the
pre-transaction value. Report the balance from the EconomyResponse the
transaction returned instead, which is authoritative.
Also harden the underlying offline read-after-write path: getStorageObject
loaded an independent transient copy for offline players on every call, so
two rapid sequential economy writes could each load before the first save
flushed, losing the first update. Track offline saves in flight in a
pending-saves map and reuse that object for follow-up reads/writes until
the last save flushes, then drop it so a later login still reloads fresh.
No main-thread blocking, no indefinite caching of offline players.
Add a regression test for the offline read-after-write path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Main code:
- InvEconomy: drop redundant @deprecated from the Vault interface overrides
(suppress the unavoidable deprecation/removal warnings at class level),
extract duplicated debug literals into constants, and replace nested
ternaries in debug routing with a routeSuffix() helper.
- Store: merge nested if in island-key migration; replace if/containsKey in
getStat UNTYPED branch with Optional.ifPresent.
- Remove unused import in InvSwitcherPladdon.
Tests:
- Remove the 'public' modifier from JUnit 5 test classes and annotated
methods (S5786).
- Add assertDoesNotThrow assertions to four clear-stored tests that had none.
- Remove redundant local Island mocks that shadowed the @mock field.
- Remove unused 'server' locals, unused imports, and unnecessary
'throws Exception' declarations.
Left intentionally: S110 (command class depth is inherent to BentoBox's
CompositeCommand hierarchy), S3776 (cognitive complexity on core inventory
methods - refactoring risks regressions), and S5738 (calls to deprecated
Bukkit.getOfflinePlayer required to implement Vault's name-based methods).
All 124 tests pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit 3d5d0c7 into masterJun 21, 2026
5 checks passed
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.

1 participant

@tastybento
, '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

Release 1.19.0 - #53

Merged
tastybento merged 5 commits into
masterfrom
develop
Jun 21, 2026
Merged

Release 1.19.0#53
tastybento merged 5 commits into
masterfrom
develop

Conversation

@tastybento

Copy link
Copy Markdown
Member

Release 1.19.0.

Highlights

Standalone economy now works without a separate economy plugin

fix: register a fresh VaultHook when BentoBox has none — InvSwitcher registers its own per-world Vault economy, but BentoBox hooks Vault during early hooks (before addons enable). When InvSwitcher was the only economy, that early hook failed and was discarded, so getVault() stayed empty and economy-dependent addons (e.g. Bank) disabled themselves with "Vault is required". InvSwitcher now registers a fresh VaultHook once its provider is live, so it works as a standalone economy.

Companion PRs harden this on the framework side: BentoBoxWorld/BentoBox#2995 (retry the Vault hook after addons enable) and BentoBoxWorld/Bank#67 (retry before disabling).

Correct balance reported for offline economy transactions

fix: report offline economy balances correctly and harden offline saves — admin eco give/set/take on an offline player reported a stale balance (e.g. "New balance: 0.00" after giving 2000) because the success message re-read the balance from the database before the asynchronous save had flushed. The commands now report the authoritative balance returned by the transaction itself.

The same change hardens the underlying offline read-after-write path: offline saves are tracked in flight so two rapid sequential transactions can't load independent stale copies and lose an update — without blocking the main thread or caching offline players indefinitely. Adds a regression test.

Commits

  • d929649 fix: register a fresh VaultHook when BentoBox has none
  • a15c645 fix: report offline economy balances correctly and harden offline saves
  • f1bd4c2 chore: bump version to 1.19.0

Full test suite: 124/124 passing.

🤖 Generated with Claude Code

tastybentoand others added 5 commits June 3, 2026 08:18
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
refreshBentoBoxVaultHook() assumed BentoBox already held a VaultHook it
could re-hook. In the standalone case that is never true: BentoBox hooks
Vault during its early hooks, before addons enable, so when InvSwitcher
is the only economy that early hook fails for lack of any economy and is
discarded by HooksManager. getVault() then stays empty and the refresh
was a silent no-op, leaving Bank and the rest of BentoBox unable to see
our economy.
When getVault() is empty, register a fresh VaultHook now that our
provider is live, so getVault() is populated for economy consumers.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Admin eco give/set/take on an offline player reported a stale balance
(e.g. "New balance: 0.00" after giving 2000). The success message
re-read the balance from the database, which reloaded the offline player
fresh before the asynchronous save had flushed, returning the
pre-transaction value. Report the balance from the EconomyResponse the
transaction returned instead, which is authoritative.
Also harden the underlying offline read-after-write path: getStorageObject
loaded an independent transient copy for offline players on every call, so
two rapid sequential economy writes could each load before the first save
flushed, losing the first update. Track offline saves in flight in a
pending-saves map and reuse that object for follow-up reads/writes until
the last save flushes, then drop it so a later login still reloads fresh.
No main-thread blocking, no indefinite caching of offline players.
Add a regression test for the offline read-after-write path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Main code:
- InvEconomy: drop redundant @deprecated from the Vault interface overrides
(suppress the unavoidable deprecation/removal warnings at class level),
extract duplicated debug literals into constants, and replace nested
ternaries in debug routing with a routeSuffix() helper.
- Store: merge nested if in island-key migration; replace if/containsKey in
getStat UNTYPED branch with Optional.ifPresent.
- Remove unused import in InvSwitcherPladdon.
Tests:
- Remove the 'public' modifier from JUnit 5 test classes and annotated
methods (S5786).
- Add assertDoesNotThrow assertions to four clear-stored tests that had none.
- Remove redundant local Island mocks that shadowed the @mock field.
- Remove unused 'server' locals, unused imports, and unnecessary
'throws Exception' declarations.
Left intentionally: S110 (command class depth is inherent to BentoBox's
CompositeCommand hierarchy), S3776 (cognitive complexity on core inventory
methods - refactoring risks regressions), and S5738 (calls to deprecated
Bukkit.getOfflinePlayer required to implement Vault's name-based methods).
All 124 tests pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit 3d5d0c7 into masterJun 21, 2026
5 checks passed
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.

1 participant

@tastybento
, '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

Release 1.19.0 - #53

Merged
tastybento merged 5 commits into
masterfrom
develop
Jun 21, 2026
Merged

Release 1.19.0#53
tastybento merged 5 commits into
masterfrom
develop

Conversation

@tastybento

Copy link
Copy Markdown
Member

Release 1.19.0.

Highlights

Standalone economy now works without a separate economy plugin

fix: register a fresh VaultHook when BentoBox has none — InvSwitcher registers its own per-world Vault economy, but BentoBox hooks Vault during early hooks (before addons enable). When InvSwitcher was the only economy, that early hook failed and was discarded, so getVault() stayed empty and economy-dependent addons (e.g. Bank) disabled themselves with "Vault is required". InvSwitcher now registers a fresh VaultHook once its provider is live, so it works as a standalone economy.

Companion PRs harden this on the framework side: BentoBoxWorld/BentoBox#2995 (retry the Vault hook after addons enable) and BentoBoxWorld/Bank#67 (retry before disabling).

Correct balance reported for offline economy transactions

fix: report offline economy balances correctly and harden offline saves — admin eco give/set/take on an offline player reported a stale balance (e.g. "New balance: 0.00" after giving 2000) because the success message re-read the balance from the database before the asynchronous save had flushed. The commands now report the authoritative balance returned by the transaction itself.

The same change hardens the underlying offline read-after-write path: offline saves are tracked in flight so two rapid sequential transactions can't load independent stale copies and lose an update — without blocking the main thread or caching offline players indefinitely. Adds a regression test.

Commits

  • d929649 fix: register a fresh VaultHook when BentoBox has none
  • a15c645 fix: report offline economy balances correctly and harden offline saves
  • f1bd4c2 chore: bump version to 1.19.0

Full test suite: 124/124 passing.

🤖 Generated with Claude Code

tastybentoand others added 5 commits June 3, 2026 08:18
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
refreshBentoBoxVaultHook() assumed BentoBox already held a VaultHook it
could re-hook. In the standalone case that is never true: BentoBox hooks
Vault during its early hooks, before addons enable, so when InvSwitcher
is the only economy that early hook fails for lack of any economy and is
discarded by HooksManager. getVault() then stays empty and the refresh
was a silent no-op, leaving Bank and the rest of BentoBox unable to see
our economy.
When getVault() is empty, register a fresh VaultHook now that our
provider is live, so getVault() is populated for economy consumers.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Admin eco give/set/take on an offline player reported a stale balance
(e.g. "New balance: 0.00" after giving 2000). The success message
re-read the balance from the database, which reloaded the offline player
fresh before the asynchronous save had flushed, returning the
pre-transaction value. Report the balance from the EconomyResponse the
transaction returned instead, which is authoritative.
Also harden the underlying offline read-after-write path: getStorageObject
loaded an independent transient copy for offline players on every call, so
two rapid sequential economy writes could each load before the first save
flushed, losing the first update. Track offline saves in flight in a
pending-saves map and reuse that object for follow-up reads/writes until
the last save flushes, then drop it so a later login still reloads fresh.
No main-thread blocking, no indefinite caching of offline players.
Add a regression test for the offline read-after-write path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Main code:
- InvEconomy: drop redundant @deprecated from the Vault interface overrides
(suppress the unavoidable deprecation/removal warnings at class level),
extract duplicated debug literals into constants, and replace nested
ternaries in debug routing with a routeSuffix() helper.
- Store: merge nested if in island-key migration; replace if/containsKey in
getStat UNTYPED branch with Optional.ifPresent.
- Remove unused import in InvSwitcherPladdon.
Tests:
- Remove the 'public' modifier from JUnit 5 test classes and annotated
methods (S5786).
- Add assertDoesNotThrow assertions to four clear-stored tests that had none.
- Remove redundant local Island mocks that shadowed the @mock field.
- Remove unused 'server' locals, unused imports, and unnecessary
'throws Exception' declarations.
Left intentionally: S110 (command class depth is inherent to BentoBox's
CompositeCommand hierarchy), S3776 (cognitive complexity on core inventory
methods - refactoring risks regressions), and S5738 (calls to deprecated
Bukkit.getOfflinePlayer required to implement Vault's name-based methods).
All 124 tests pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit 3d5d0c7 into masterJun 21, 2026
5 checks passed
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.

1 participant

@tastybento