fix: zero new island on large protection ranges via incremental capture - #435

Merged
tastybento merged 2 commits into
developfrom
fix/zero-island-large-protection-range
May 16, 2026
Merged

fix: zero new island on large protection ranges via incremental capture#435
tastybento merged 2 commits into
developfrom
fix/zero-island-large-protection-range

Conversation

@tastybento

Copy link
Copy Markdown
Member

Summary

  • Switch the zero-island scan to gen=false so it only counts chunks that exist at zero time (typically just the schematic). Fixes the 5-minute timeout that fires when zero-new-island-levels is on and the protection range is large (e.g. 1000 → ~16k chunks/dim, all needing generation on a fresh world).
  • Add NewChunkListener to accumulate generator block points (sea floor, nether ceiling, etc.) into initialCount lazily as chunks are generated during normal play. Regular level calcs subtract the now-incrementally-grown initialCount, so generator blocks always cancel out — players only get credit for their own placements.
  • Add LevelsManager.addToInitialCount(island, delta) to support the listener (also migrates any legacy initialLevel).

Repro the original bug

  1. Fresh world / server / DB.
  2. Set island range and protection range to 1000.
  3. /is to create an island.

Before: console shows Zeroing island level … then Level calculation timed out after 5m … Island level was being zeroed. and initialCount is never set.
After: zero scan completes in seconds (only schematic chunks); generator chunks roll into initialCount as the player explores.

Trade-off

Per-block-type limits apply within a single scan but not across the listener's incremental additions. For aggressively-limited block types (e.g. cobblestone capped at 10k) generated heavily by terrain, the math can drift slightly. If that becomes an issue, the fix is to store per-block-type initial counts and apply limits at calc time — happy to follow up.

Test plan

  • Build/tests pass locally (mvn test)
  • BSkyBlock: fresh world, range 1000, /is — zero scan completes quickly; level after building reflects only placed blocks
  • AcidIsland-style game mode with sea floor: explore beyond schematic — newly generated sea floor does not inflate level
  • Legacy island (already zeroed pre-upgrade): no double-counting on chunk loads (no isNewChunk events fire for already-generated chunks)

🤖 Generated with Claude Code

tastybentoand others added 2 commits May 15, 2026 07:00
The zero-island scan force-generated every chunk in the protection range
with gen=true. On islands with a large range (e.g. 1000 → ~16k chunks
per dimension on a fresh world) this blew past the 5-minute calculation
timeout, leaving initialCount unset.
Switch the zero scan to gen=false so it only counts chunks that exist
at zero time (typically just the schematic), and add NewChunkListener
to accumulate generator block points (sea floor, nether ceiling, etc.)
into initialCount lazily as chunks are generated during normal play.
Regular level calcs subtract the now-incrementally-grown initialCount,
so generator blocks always cancel out and players only get credit for
their own placements.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- S2184: keep the chunk-centre Location arithmetic in double space by
using +8.0 so SonarQube does not flag a theoretical int-overflow
before implicit widening.
- S107: replace the 12-parameter scan helper with a ScanContext record
bundling all main-thread snapshot state.
- S3776 / S135: split the nested scan into scanRow / scanColumn /
valueAt helpers so each method is small, has at most one return /
continue, and total cognitive complexity drops below 15.
No behaviour change.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit bec4ec1 into developMay 16, 2026
3 checks passed
@tastybento
tastybento deleted the fix/zero-island-large-protection-range branch May 16, 2026 00:47
tastybento added a commit that referenced this pull request Jul 16, 2026
The lazy-zero / per-chunk handicap / parallel chunk scan work merged via
PRs #435 and #440 (plus follow-up fixes) is not production-ready: admins
running CI snapshot builds saw established island levels reset and
recalculations that only counted newly placed blocks (#448).
That work now continues on the feat/per-chunk-zeroing branch. This
commit restores the stable 2.27.0 calculation engine on develop while
keeping everything safe that landed since 2.27.0:
- Donation fixes: recalc donated points from donatedBlocks (#438),
enforce blockconfig donation limits in GUI/prompts (#439), cap
donated counts to current block limits (#443)
- MockBukkit pinned to Maven Central 4.110.0
- Modrinth MC 26.1.2 game version (#444)
- CI publish workflow changes (#445, #446, #447)
- Version stays 2.28.0-SNAPSHOT
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y6f59pxCkwS8QXtJSe1nq6
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)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} 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: zero new island on large protection ranges via incremental capture - #435

Merged
tastybento merged 2 commits into
developfrom
fix/zero-island-large-protection-range
May 16, 2026
Merged

fix: zero new island on large protection ranges via incremental capture#435
tastybento merged 2 commits into
developfrom
fix/zero-island-large-protection-range

Conversation

@tastybento

Copy link
Copy Markdown
Member

Summary

  • Switch the zero-island scan to gen=false so it only counts chunks that exist at zero time (typically just the schematic). Fixes the 5-minute timeout that fires when zero-new-island-levels is on and the protection range is large (e.g. 1000 → ~16k chunks/dim, all needing generation on a fresh world).
  • Add NewChunkListener to accumulate generator block points (sea floor, nether ceiling, etc.) into initialCount lazily as chunks are generated during normal play. Regular level calcs subtract the now-incrementally-grown initialCount, so generator blocks always cancel out — players only get credit for their own placements.
  • Add LevelsManager.addToInitialCount(island, delta) to support the listener (also migrates any legacy initialLevel).

Repro the original bug

  1. Fresh world / server / DB.
  2. Set island range and protection range to 1000.
  3. /is to create an island.

Before: console shows Zeroing island level … then Level calculation timed out after 5m … Island level was being zeroed. and initialCount is never set.
After: zero scan completes in seconds (only schematic chunks); generator chunks roll into initialCount as the player explores.

Trade-off

Per-block-type limits apply within a single scan but not across the listener's incremental additions. For aggressively-limited block types (e.g. cobblestone capped at 10k) generated heavily by terrain, the math can drift slightly. If that becomes an issue, the fix is to store per-block-type initial counts and apply limits at calc time — happy to follow up.

Test plan

  • Build/tests pass locally (mvn test)
  • BSkyBlock: fresh world, range 1000, /is — zero scan completes quickly; level after building reflects only placed blocks
  • AcidIsland-style game mode with sea floor: explore beyond schematic — newly generated sea floor does not inflate level
  • Legacy island (already zeroed pre-upgrade): no double-counting on chunk loads (no isNewChunk events fire for already-generated chunks)

🤖 Generated with Claude Code

tastybentoand others added 2 commits May 15, 2026 07:00
The zero-island scan force-generated every chunk in the protection range
with gen=true. On islands with a large range (e.g. 1000 → ~16k chunks
per dimension on a fresh world) this blew past the 5-minute calculation
timeout, leaving initialCount unset.
Switch the zero scan to gen=false so it only counts chunks that exist
at zero time (typically just the schematic), and add NewChunkListener
to accumulate generator block points (sea floor, nether ceiling, etc.)
into initialCount lazily as chunks are generated during normal play.
Regular level calcs subtract the now-incrementally-grown initialCount,
so generator blocks always cancel out and players only get credit for
their own placements.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- S2184: keep the chunk-centre Location arithmetic in double space by
using +8.0 so SonarQube does not flag a theoretical int-overflow
before implicit widening.
- S107: replace the 12-parameter scan helper with a ScanContext record
bundling all main-thread snapshot state.
- S3776 / S135: split the nested scan into scanRow / scanColumn /
valueAt helpers so each method is small, has at most one return /
continue, and total cognitive complexity drops below 15.
No behaviour change.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit bec4ec1 into developMay 16, 2026
3 checks passed
@tastybento
tastybento deleted the fix/zero-island-large-protection-range branch May 16, 2026 00:47
tastybento added a commit that referenced this pull request Jul 16, 2026
The lazy-zero / per-chunk handicap / parallel chunk scan work merged via
PRs #435 and #440 (plus follow-up fixes) is not production-ready: admins
running CI snapshot builds saw established island levels reset and
recalculations that only counted newly placed blocks (#448).
That work now continues on the feat/per-chunk-zeroing branch. This
commit restores the stable 2.27.0 calculation engine on develop while
keeping everything safe that landed since 2.27.0:
- Donation fixes: recalc donated points from donatedBlocks (#438),
enforce blockconfig donation limits in GUI/prompts (#439), cap
donated counts to current block limits (#443)
- MockBukkit pinned to Maven Central 4.110.0
- Modrinth MC 26.1.2 game version (#444)
- CI publish workflow changes (#445, #446, #447)
- Version stays 2.28.0-SNAPSHOT
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y6f59pxCkwS8QXtJSe1nq6
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)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: zero new island on large protection ranges via incremental capture - #435

Merged
tastybento merged 2 commits into
developfrom
fix/zero-island-large-protection-range
May 16, 2026
Merged

fix: zero new island on large protection ranges via incremental capture#435
tastybento merged 2 commits into
developfrom
fix/zero-island-large-protection-range

Conversation

@tastybento

Copy link
Copy Markdown
Member

Summary

  • Switch the zero-island scan to gen=false so it only counts chunks that exist at zero time (typically just the schematic). Fixes the 5-minute timeout that fires when zero-new-island-levels is on and the protection range is large (e.g. 1000 → ~16k chunks/dim, all needing generation on a fresh world).
  • Add NewChunkListener to accumulate generator block points (sea floor, nether ceiling, etc.) into initialCount lazily as chunks are generated during normal play. Regular level calcs subtract the now-incrementally-grown initialCount, so generator blocks always cancel out — players only get credit for their own placements.
  • Add LevelsManager.addToInitialCount(island, delta) to support the listener (also migrates any legacy initialLevel).

Repro the original bug

  1. Fresh world / server / DB.
  2. Set island range and protection range to 1000.
  3. /is to create an island.

Before: console shows Zeroing island level … then Level calculation timed out after 5m … Island level was being zeroed. and initialCount is never set.
After: zero scan completes in seconds (only schematic chunks); generator chunks roll into initialCount as the player explores.

Trade-off

Per-block-type limits apply within a single scan but not across the listener's incremental additions. For aggressively-limited block types (e.g. cobblestone capped at 10k) generated heavily by terrain, the math can drift slightly. If that becomes an issue, the fix is to store per-block-type initial counts and apply limits at calc time — happy to follow up.

Test plan

  • Build/tests pass locally (mvn test)
  • BSkyBlock: fresh world, range 1000, /is — zero scan completes quickly; level after building reflects only placed blocks
  • AcidIsland-style game mode with sea floor: explore beyond schematic — newly generated sea floor does not inflate level
  • Legacy island (already zeroed pre-upgrade): no double-counting on chunk loads (no isNewChunk events fire for already-generated chunks)

🤖 Generated with Claude Code

tastybentoand others added 2 commits May 15, 2026 07:00
The zero-island scan force-generated every chunk in the protection range
with gen=true. On islands with a large range (e.g. 1000 → ~16k chunks
per dimension on a fresh world) this blew past the 5-minute calculation
timeout, leaving initialCount unset.
Switch the zero scan to gen=false so it only counts chunks that exist
at zero time (typically just the schematic), and add NewChunkListener
to accumulate generator block points (sea floor, nether ceiling, etc.)
into initialCount lazily as chunks are generated during normal play.
Regular level calcs subtract the now-incrementally-grown initialCount,
so generator blocks always cancel out and players only get credit for
their own placements.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- S2184: keep the chunk-centre Location arithmetic in double space by
using +8.0 so SonarQube does not flag a theoretical int-overflow
before implicit widening.
- S107: replace the 12-parameter scan helper with a ScanContext record
bundling all main-thread snapshot state.
- S3776 / S135: split the nested scan into scanRow / scanColumn /
valueAt helpers so each method is small, has at most one return /
continue, and total cognitive complexity drops below 15.
No behaviour change.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit bec4ec1 into developMay 16, 2026
3 checks passed
@tastybento
tastybento deleted the fix/zero-island-large-protection-range branch May 16, 2026 00:47
tastybento added a commit that referenced this pull request Jul 16, 2026
The lazy-zero / per-chunk handicap / parallel chunk scan work merged via
PRs #435 and #440 (plus follow-up fixes) is not production-ready: admins
running CI snapshot builds saw established island levels reset and
recalculations that only counted newly placed blocks (#448).
That work now continues on the feat/per-chunk-zeroing branch. This
commit restores the stable 2.27.0 calculation engine on develop while
keeping everything safe that landed since 2.27.0:
- Donation fixes: recalc donated points from donatedBlocks (#438),
enforce blockconfig donation limits in GUI/prompts (#439), cap
donated counts to current block limits (#443)
- MockBukkit pinned to Maven Central 4.110.0
- Modrinth MC 26.1.2 game version (#444)
- CI publish workflow changes (#445, #446, #447)
- Version stays 2.28.0-SNAPSHOT
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y6f59pxCkwS8QXtJSe1nq6
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)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: zero new island on large protection ranges via incremental capture - #435

Merged
tastybento merged 2 commits into
developfrom
fix/zero-island-large-protection-range
May 16, 2026
Merged

fix: zero new island on large protection ranges via incremental capture#435
tastybento merged 2 commits into
developfrom
fix/zero-island-large-protection-range

Conversation

@tastybento

Copy link
Copy Markdown
Member

Summary

  • Switch the zero-island scan to gen=false so it only counts chunks that exist at zero time (typically just the schematic). Fixes the 5-minute timeout that fires when zero-new-island-levels is on and the protection range is large (e.g. 1000 → ~16k chunks/dim, all needing generation on a fresh world).
  • Add NewChunkListener to accumulate generator block points (sea floor, nether ceiling, etc.) into initialCount lazily as chunks are generated during normal play. Regular level calcs subtract the now-incrementally-grown initialCount, so generator blocks always cancel out — players only get credit for their own placements.
  • Add LevelsManager.addToInitialCount(island, delta) to support the listener (also migrates any legacy initialLevel).

Repro the original bug

  1. Fresh world / server / DB.
  2. Set island range and protection range to 1000.
  3. /is to create an island.

Before: console shows Zeroing island level … then Level calculation timed out after 5m … Island level was being zeroed. and initialCount is never set.
After: zero scan completes in seconds (only schematic chunks); generator chunks roll into initialCount as the player explores.

Trade-off

Per-block-type limits apply within a single scan but not across the listener's incremental additions. For aggressively-limited block types (e.g. cobblestone capped at 10k) generated heavily by terrain, the math can drift slightly. If that becomes an issue, the fix is to store per-block-type initial counts and apply limits at calc time — happy to follow up.

Test plan

  • Build/tests pass locally (mvn test)
  • BSkyBlock: fresh world, range 1000, /is — zero scan completes quickly; level after building reflects only placed blocks
  • AcidIsland-style game mode with sea floor: explore beyond schematic — newly generated sea floor does not inflate level
  • Legacy island (already zeroed pre-upgrade): no double-counting on chunk loads (no isNewChunk events fire for already-generated chunks)

🤖 Generated with Claude Code

tastybentoand others added 2 commits May 15, 2026 07:00
The zero-island scan force-generated every chunk in the protection range
with gen=true. On islands with a large range (e.g. 1000 → ~16k chunks
per dimension on a fresh world) this blew past the 5-minute calculation
timeout, leaving initialCount unset.
Switch the zero scan to gen=false so it only counts chunks that exist
at zero time (typically just the schematic), and add NewChunkListener
to accumulate generator block points (sea floor, nether ceiling, etc.)
into initialCount lazily as chunks are generated during normal play.
Regular level calcs subtract the now-incrementally-grown initialCount,
so generator blocks always cancel out and players only get credit for
their own placements.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- S2184: keep the chunk-centre Location arithmetic in double space by
using +8.0 so SonarQube does not flag a theoretical int-overflow
before implicit widening.
- S107: replace the 12-parameter scan helper with a ScanContext record
bundling all main-thread snapshot state.
- S3776 / S135: split the nested scan into scanRow / scanColumn /
valueAt helpers so each method is small, has at most one return /
continue, and total cognitive complexity drops below 15.
No behaviour change.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit bec4ec1 into developMay 16, 2026
3 checks passed
@tastybento
tastybento deleted the fix/zero-island-large-protection-range branch May 16, 2026 00:47
tastybento added a commit that referenced this pull request Jul 16, 2026
The lazy-zero / per-chunk handicap / parallel chunk scan work merged via
PRs #435 and #440 (plus follow-up fixes) is not production-ready: admins
running CI snapshot builds saw established island levels reset and
recalculations that only counted newly placed blocks (#448).
That work now continues on the feat/per-chunk-zeroing branch. This
commit restores the stable 2.27.0 calculation engine on develop while
keeping everything safe that landed since 2.27.0:
- Donation fixes: recalc donated points from donatedBlocks (#438),
enforce blockconfig donation limits in GUI/prompts (#439), cap
donated counts to current block limits (#443)
- MockBukkit pinned to Maven Central 4.110.0
- Modrinth MC 26.1.2 game version (#444)
- CI publish workflow changes (#445, #446, #447)
- Version stays 2.28.0-SNAPSHOT
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y6f59pxCkwS8QXtJSe1nq6
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)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } 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: zero new island on large protection ranges via incremental capture - #435

Merged
tastybento merged 2 commits into
developfrom
fix/zero-island-large-protection-range
May 16, 2026
Merged

fix: zero new island on large protection ranges via incremental capture#435
tastybento merged 2 commits into
developfrom
fix/zero-island-large-protection-range

Conversation

@tastybento

Copy link
Copy Markdown
Member

Summary

  • Switch the zero-island scan to gen=false so it only counts chunks that exist at zero time (typically just the schematic). Fixes the 5-minute timeout that fires when zero-new-island-levels is on and the protection range is large (e.g. 1000 → ~16k chunks/dim, all needing generation on a fresh world).
  • Add NewChunkListener to accumulate generator block points (sea floor, nether ceiling, etc.) into initialCount lazily as chunks are generated during normal play. Regular level calcs subtract the now-incrementally-grown initialCount, so generator blocks always cancel out — players only get credit for their own placements.
  • Add LevelsManager.addToInitialCount(island, delta) to support the listener (also migrates any legacy initialLevel).

Repro the original bug

  1. Fresh world / server / DB.
  2. Set island range and protection range to 1000.
  3. /is to create an island.

Before: console shows Zeroing island level … then Level calculation timed out after 5m … Island level was being zeroed. and initialCount is never set.
After: zero scan completes in seconds (only schematic chunks); generator chunks roll into initialCount as the player explores.

Trade-off

Per-block-type limits apply within a single scan but not across the listener's incremental additions. For aggressively-limited block types (e.g. cobblestone capped at 10k) generated heavily by terrain, the math can drift slightly. If that becomes an issue, the fix is to store per-block-type initial counts and apply limits at calc time — happy to follow up.

Test plan

  • Build/tests pass locally (mvn test)
  • BSkyBlock: fresh world, range 1000, /is — zero scan completes quickly; level after building reflects only placed blocks
  • AcidIsland-style game mode with sea floor: explore beyond schematic — newly generated sea floor does not inflate level
  • Legacy island (already zeroed pre-upgrade): no double-counting on chunk loads (no isNewChunk events fire for already-generated chunks)

🤖 Generated with Claude Code

tastybentoand others added 2 commits May 15, 2026 07:00
The zero-island scan force-generated every chunk in the protection range
with gen=true. On islands with a large range (e.g. 1000 → ~16k chunks
per dimension on a fresh world) this blew past the 5-minute calculation
timeout, leaving initialCount unset.
Switch the zero scan to gen=false so it only counts chunks that exist
at zero time (typically just the schematic), and add NewChunkListener
to accumulate generator block points (sea floor, nether ceiling, etc.)
into initialCount lazily as chunks are generated during normal play.
Regular level calcs subtract the now-incrementally-grown initialCount,
so generator blocks always cancel out and players only get credit for
their own placements.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- S2184: keep the chunk-centre Location arithmetic in double space by
using +8.0 so SonarQube does not flag a theoretical int-overflow
before implicit widening.
- S107: replace the 12-parameter scan helper with a ScanContext record
bundling all main-thread snapshot state.
- S3776 / S135: split the nested scan into scanRow / scanColumn /
valueAt helpers so each method is small, has at most one return /
continue, and total cognitive complexity drops below 15.
No behaviour change.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit bec4ec1 into developMay 16, 2026
3 checks passed
@tastybento
tastybento deleted the fix/zero-island-large-protection-range branch May 16, 2026 00:47
tastybento added a commit that referenced this pull request Jul 16, 2026
The lazy-zero / per-chunk handicap / parallel chunk scan work merged via
PRs #435 and #440 (plus follow-up fixes) is not production-ready: admins
running CI snapshot builds saw established island levels reset and
recalculations that only counted newly placed blocks (#448).
That work now continues on the feat/per-chunk-zeroing branch. This
commit restores the stable 2.27.0 calculation engine on develop while
keeping everything safe that landed since 2.27.0:
- Donation fixes: recalc donated points from donatedBlocks (#438),
enforce blockconfig donation limits in GUI/prompts (#439), cap
donated counts to current block limits (#443)
- MockBukkit pinned to Maven Central 4.110.0
- Modrinth MC 26.1.2 game version (#444)
- CI publish workflow changes (#445, #446, #447)
- Version stays 2.28.0-SNAPSHOT
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y6f59pxCkwS8QXtJSe1nq6
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)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: zero new island on large protection ranges via incremental capture - #435

Merged
tastybento merged 2 commits into
developfrom
fix/zero-island-large-protection-range
May 16, 2026
Merged

fix: zero new island on large protection ranges via incremental capture#435
tastybento merged 2 commits into
developfrom
fix/zero-island-large-protection-range

Conversation

@tastybento

Copy link
Copy Markdown
Member

Summary

  • Switch the zero-island scan to gen=false so it only counts chunks that exist at zero time (typically just the schematic). Fixes the 5-minute timeout that fires when zero-new-island-levels is on and the protection range is large (e.g. 1000 → ~16k chunks/dim, all needing generation on a fresh world).
  • Add NewChunkListener to accumulate generator block points (sea floor, nether ceiling, etc.) into initialCount lazily as chunks are generated during normal play. Regular level calcs subtract the now-incrementally-grown initialCount, so generator blocks always cancel out — players only get credit for their own placements.
  • Add LevelsManager.addToInitialCount(island, delta) to support the listener (also migrates any legacy initialLevel).

Repro the original bug

  1. Fresh world / server / DB.
  2. Set island range and protection range to 1000.
  3. /is to create an island.

Before: console shows Zeroing island level … then Level calculation timed out after 5m … Island level was being zeroed. and initialCount is never set.
After: zero scan completes in seconds (only schematic chunks); generator chunks roll into initialCount as the player explores.

Trade-off

Per-block-type limits apply within a single scan but not across the listener's incremental additions. For aggressively-limited block types (e.g. cobblestone capped at 10k) generated heavily by terrain, the math can drift slightly. If that becomes an issue, the fix is to store per-block-type initial counts and apply limits at calc time — happy to follow up.

Test plan

  • Build/tests pass locally (mvn test)
  • BSkyBlock: fresh world, range 1000, /is — zero scan completes quickly; level after building reflects only placed blocks
  • AcidIsland-style game mode with sea floor: explore beyond schematic — newly generated sea floor does not inflate level
  • Legacy island (already zeroed pre-upgrade): no double-counting on chunk loads (no isNewChunk events fire for already-generated chunks)

🤖 Generated with Claude Code

tastybentoand others added 2 commits May 15, 2026 07:00
The zero-island scan force-generated every chunk in the protection range
with gen=true. On islands with a large range (e.g. 1000 → ~16k chunks
per dimension on a fresh world) this blew past the 5-minute calculation
timeout, leaving initialCount unset.
Switch the zero scan to gen=false so it only counts chunks that exist
at zero time (typically just the schematic), and add NewChunkListener
to accumulate generator block points (sea floor, nether ceiling, etc.)
into initialCount lazily as chunks are generated during normal play.
Regular level calcs subtract the now-incrementally-grown initialCount,
so generator blocks always cancel out and players only get credit for
their own placements.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- S2184: keep the chunk-centre Location arithmetic in double space by
using +8.0 so SonarQube does not flag a theoretical int-overflow
before implicit widening.
- S107: replace the 12-parameter scan helper with a ScanContext record
bundling all main-thread snapshot state.
- S3776 / S135: split the nested scan into scanRow / scanColumn /
valueAt helpers so each method is small, has at most one return /
continue, and total cognitive complexity drops below 15.
No behaviour change.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit bec4ec1 into developMay 16, 2026
3 checks passed
@tastybento
tastybento deleted the fix/zero-island-large-protection-range branch May 16, 2026 00:47
tastybento added a commit that referenced this pull request Jul 16, 2026
The lazy-zero / per-chunk handicap / parallel chunk scan work merged via
PRs #435 and #440 (plus follow-up fixes) is not production-ready: admins
running CI snapshot builds saw established island levels reset and
recalculations that only counted newly placed blocks (#448).
That work now continues on the feat/per-chunk-zeroing branch. This
commit restores the stable 2.27.0 calculation engine on develop while
keeping everything safe that landed since 2.27.0:
- Donation fixes: recalc donated points from donatedBlocks (#438),
enforce blockconfig donation limits in GUI/prompts (#439), cap
donated counts to current block limits (#443)
- MockBukkit pinned to Maven Central 4.110.0
- Modrinth MC 26.1.2 game version (#444)
- CI publish workflow changes (#445, #446, #447)
- Version stays 2.28.0-SNAPSHOT
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y6f59pxCkwS8QXtJSe1nq6
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)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: zero new island on large protection ranges via incremental capture - #435

Merged
tastybento merged 2 commits into
developfrom
fix/zero-island-large-protection-range
May 16, 2026
Merged

fix: zero new island on large protection ranges via incremental capture#435
tastybento merged 2 commits into
developfrom
fix/zero-island-large-protection-range

Conversation

@tastybento

Copy link
Copy Markdown
Member

Summary

  • Switch the zero-island scan to gen=false so it only counts chunks that exist at zero time (typically just the schematic). Fixes the 5-minute timeout that fires when zero-new-island-levels is on and the protection range is large (e.g. 1000 → ~16k chunks/dim, all needing generation on a fresh world).
  • Add NewChunkListener to accumulate generator block points (sea floor, nether ceiling, etc.) into initialCount lazily as chunks are generated during normal play. Regular level calcs subtract the now-incrementally-grown initialCount, so generator blocks always cancel out — players only get credit for their own placements.
  • Add LevelsManager.addToInitialCount(island, delta) to support the listener (also migrates any legacy initialLevel).

Repro the original bug

  1. Fresh world / server / DB.
  2. Set island range and protection range to 1000.
  3. /is to create an island.

Before: console shows Zeroing island level … then Level calculation timed out after 5m … Island level was being zeroed. and initialCount is never set.
After: zero scan completes in seconds (only schematic chunks); generator chunks roll into initialCount as the player explores.

Trade-off

Per-block-type limits apply within a single scan but not across the listener's incremental additions. For aggressively-limited block types (e.g. cobblestone capped at 10k) generated heavily by terrain, the math can drift slightly. If that becomes an issue, the fix is to store per-block-type initial counts and apply limits at calc time — happy to follow up.

Test plan

  • Build/tests pass locally (mvn test)
  • BSkyBlock: fresh world, range 1000, /is — zero scan completes quickly; level after building reflects only placed blocks
  • AcidIsland-style game mode with sea floor: explore beyond schematic — newly generated sea floor does not inflate level
  • Legacy island (already zeroed pre-upgrade): no double-counting on chunk loads (no isNewChunk events fire for already-generated chunks)

🤖 Generated with Claude Code

tastybentoand others added 2 commits May 15, 2026 07:00
The zero-island scan force-generated every chunk in the protection range
with gen=true. On islands with a large range (e.g. 1000 → ~16k chunks
per dimension on a fresh world) this blew past the 5-minute calculation
timeout, leaving initialCount unset.
Switch the zero scan to gen=false so it only counts chunks that exist
at zero time (typically just the schematic), and add NewChunkListener
to accumulate generator block points (sea floor, nether ceiling, etc.)
into initialCount lazily as chunks are generated during normal play.
Regular level calcs subtract the now-incrementally-grown initialCount,
so generator blocks always cancel out and players only get credit for
their own placements.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- S2184: keep the chunk-centre Location arithmetic in double space by
using +8.0 so SonarQube does not flag a theoretical int-overflow
before implicit widening.
- S107: replace the 12-parameter scan helper with a ScanContext record
bundling all main-thread snapshot state.
- S3776 / S135: split the nested scan into scanRow / scanColumn /
valueAt helpers so each method is small, has at most one return /
continue, and total cognitive complexity drops below 15.
No behaviour change.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit bec4ec1 into developMay 16, 2026
3 checks passed
@tastybento
tastybento deleted the fix/zero-island-large-protection-range branch May 16, 2026 00:47
tastybento added a commit that referenced this pull request Jul 16, 2026
The lazy-zero / per-chunk handicap / parallel chunk scan work merged via
PRs #435 and #440 (plus follow-up fixes) is not production-ready: admins
running CI snapshot builds saw established island levels reset and
recalculations that only counted newly placed blocks (#448).
That work now continues on the feat/per-chunk-zeroing branch. This
commit restores the stable 2.27.0 calculation engine on develop while
keeping everything safe that landed since 2.27.0:
- Donation fixes: recalc donated points from donatedBlocks (#438),
enforce blockconfig donation limits in GUI/prompts (#439), cap
donated counts to current block limits (#443)
- MockBukkit pinned to Maven Central 4.110.0
- Modrinth MC 26.1.2 game version (#444)
- CI publish workflow changes (#445, #446, #447)
- Version stays 2.28.0-SNAPSHOT
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y6f59pxCkwS8QXtJSe1nq6
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)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix: zero new island on large protection ranges via incremental capture - #435

Merged
tastybento merged 2 commits into
developfrom
fix/zero-island-large-protection-range
May 16, 2026
Merged

fix: zero new island on large protection ranges via incremental capture#435
tastybento merged 2 commits into
developfrom
fix/zero-island-large-protection-range

Conversation

@tastybento

Copy link
Copy Markdown
Member

Summary

  • Switch the zero-island scan to gen=false so it only counts chunks that exist at zero time (typically just the schematic). Fixes the 5-minute timeout that fires when zero-new-island-levels is on and the protection range is large (e.g. 1000 → ~16k chunks/dim, all needing generation on a fresh world).
  • Add NewChunkListener to accumulate generator block points (sea floor, nether ceiling, etc.) into initialCount lazily as chunks are generated during normal play. Regular level calcs subtract the now-incrementally-grown initialCount, so generator blocks always cancel out — players only get credit for their own placements.
  • Add LevelsManager.addToInitialCount(island, delta) to support the listener (also migrates any legacy initialLevel).

Repro the original bug

  1. Fresh world / server / DB.
  2. Set island range and protection range to 1000.
  3. /is to create an island.

Before: console shows Zeroing island level … then Level calculation timed out after 5m … Island level was being zeroed. and initialCount is never set.
After: zero scan completes in seconds (only schematic chunks); generator chunks roll into initialCount as the player explores.

Trade-off

Per-block-type limits apply within a single scan but not across the listener's incremental additions. For aggressively-limited block types (e.g. cobblestone capped at 10k) generated heavily by terrain, the math can drift slightly. If that becomes an issue, the fix is to store per-block-type initial counts and apply limits at calc time — happy to follow up.

Test plan

  • Build/tests pass locally (mvn test)
  • BSkyBlock: fresh world, range 1000, /is — zero scan completes quickly; level after building reflects only placed blocks
  • AcidIsland-style game mode with sea floor: explore beyond schematic — newly generated sea floor does not inflate level
  • Legacy island (already zeroed pre-upgrade): no double-counting on chunk loads (no isNewChunk events fire for already-generated chunks)

🤖 Generated with Claude Code

tastybentoand others added 2 commits May 15, 2026 07:00
The zero-island scan force-generated every chunk in the protection range
with gen=true. On islands with a large range (e.g. 1000 → ~16k chunks
per dimension on a fresh world) this blew past the 5-minute calculation
timeout, leaving initialCount unset.
Switch the zero scan to gen=false so it only counts chunks that exist
at zero time (typically just the schematic), and add NewChunkListener
to accumulate generator block points (sea floor, nether ceiling, etc.)
into initialCount lazily as chunks are generated during normal play.
Regular level calcs subtract the now-incrementally-grown initialCount,
so generator blocks always cancel out and players only get credit for
their own placements.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- S2184: keep the chunk-centre Location arithmetic in double space by
using +8.0 so SonarQube does not flag a theoretical int-overflow
before implicit widening.
- S107: replace the 12-parameter scan helper with a ScanContext record
bundling all main-thread snapshot state.
- S3776 / S135: split the nested scan into scanRow / scanColumn /
valueAt helpers so each method is small, has at most one return /
continue, and total cognitive complexity drops below 15.
No behaviour change.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit bec4ec1 into developMay 16, 2026
3 checks passed
@tastybento
tastybento deleted the fix/zero-island-large-protection-range branch May 16, 2026 00:47
tastybento added a commit that referenced this pull request Jul 16, 2026
The lazy-zero / per-chunk handicap / parallel chunk scan work merged via
PRs #435 and #440 (plus follow-up fixes) is not production-ready: admins
running CI snapshot builds saw established island levels reset and
recalculations that only counted newly placed blocks (#448).
That work now continues on the feat/per-chunk-zeroing branch. This
commit restores the stable 2.27.0 calculation engine on develop while
keeping everything safe that landed since 2.27.0:
- Donation fixes: recalc donated points from donatedBlocks (#438),
enforce blockconfig donation limits in GUI/prompts (#439), cap
donated counts to current block limits (#443)
- MockBukkit pinned to Maven Central 4.110.0
- Modrinth MC 26.1.2 game version (#444)
- CI publish workflow changes (#445, #446, #447)
- Version stays 2.28.0-SNAPSHOT
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y6f59pxCkwS8QXtJSe1nq6
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