docs: rewrite the phase 0 comments to explain what the numbers mean - #548

Merged
tastybento merged 1 commit into
developfrom
docs/phase-file-instructions
Aug 2, 2026
Merged

docs: rewrite the phase 0 comments to explain what the numbers mean#548
tastybento merged 1 commit into
developfrom
docs/phase-file-instructions

Conversation

@tastybento

Copy link
Copy Markdown
Member

Why

An admin asked:

in the phases config, what do the numbers represent, as I couldn't see anything in the wiki about it — as in the numbers after the Material or Entity... I know it is not the number that spawn over the phase, is it a weighting?

They were right, and 0_plains.yml — the file we point admins at as the reference — never said so. Nor did it mention the part that actually bites: blocks:, mobs: and custom-blocks: all draw from one shared pool, so a mob weight is directly comparable to a block weight and adding mobs makes every block rarer.

What

Rewritten comments in 0_plains.yml. The header now separates the three distinct kinds of number a phase file contains, since conflating them is the real source of the confusion:

  1. Weightsblocks:, mobs: and custom-blocks: values. One shared pool, weight ÷ phase total. Not counts, not percentages.
  2. PositionsfixedBlocks: and holograms: keys. Block count within this phase, from 0.
  3. The section name — the top-level '0': key. Historically the start block; phases_index.yml has owned order and length since 1.26.0.

Each section then gets its own explanation:

  • A worked example on the Winter phase (the one the admin quoted), and the real Plains percentages computed from the actual file — 11450 block weights + 665 mob weights = 12115, so GRASS_BLOCK: 2000 is 16.5%, CHEST: 200 is 1.7%, COW: 150 is 1.2%, EMERALD_ORE: 10 is 0.08%.
  • Why only the ratio matters, and why the shipped files use big numbers.
  • CHEST as a special case: its weight is the chance of a chest; rarity is a second roll at the hard-coded 62/25/9/4.
  • That custom-blocks:' probability: field is a weight in the same pool despite the name, plus the mob, itemsadder, nexo and craftengine types that were missing from the list.
  • Version gating on individual blocks and mobs via the weight: object form.
  • What actually happens when a mob is rolled (block becomes STONE if empty, mob spawns on top, clear-blocks makes space).

Comments only — verified with git diff that every block, mob and weight is byte-identical, and the parsed YAML is unchanged (blocks total 11450, mobs total 665, same fixedBlocks/holograms/biome/icon/name). OneBlocksManagerTest passes.

Note for existing servers

Phase files are only copied out of the jar when the phases folder is first created, so existing installs keep their old 0_plains.yml and will not see these comments. The companion docs PR covers those admins: BentoBoxWorld/docs#85 adds a "Customizing Phases" page and corrects the AOneBlock overview, which described weights only as "relative probability" and never mentioned the shared pool.

0_plains.yml is the reference file admins read first, but it never said
what the numbers after a Material or EntityType are. An admin asked, and
they were right to guess weighting: they are relative weights in a single
raffle - not counts and not percentages - and blocks, mobs and
custom-blocks all draw from that same pool, so a mob weight is directly
comparable to a block weight and pushes every block's share down.
The header now separates the three distinct kinds of number a phase file
contains, since that is the real source of the confusion:
1. blocks/mobs/custom-blocks values are weights, one shared pool
2. fixedBlocks and holograms keys are positions within the phase, from 0
3. the top-level key is the section name - phases_index.yml has owned
phase order and length since 1.26.0
Each section then gets its own explanation with the real Plains numbers
worked out (11450 block weights + 665 mob weights = 12115, so
GRASS_BLOCK: 2000 is 16.5% and COW: 150 is 1.2%), plus the CHEST
two-stage roll, the mob/custom-block types that were missing from the
list, and version gating.
Comments only - every block, mob and weight is unchanged.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017zwLryefnJ6wG76JmYNamx
@tastybento
tastybento merged commit 1b7c097 into developAug 2, 2026
1 check passed
@tastybento
tastybento deleted the docs/phase-file-instructions branch August 2, 2026 16:57
@sonarqubecloud

Copy link
Copy Markdown

@tastybentotastybento mentioned this pull request Aug 8, 2026
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

docs: rewrite the phase 0 comments to explain what the numbers mean - #548

Merged
tastybento merged 1 commit into
developfrom
docs/phase-file-instructions
Aug 2, 2026
Merged

docs: rewrite the phase 0 comments to explain what the numbers mean#548
tastybento merged 1 commit into
developfrom
docs/phase-file-instructions

Conversation

@tastybento

Copy link
Copy Markdown
Member

Why

An admin asked:

in the phases config, what do the numbers represent, as I couldn't see anything in the wiki about it — as in the numbers after the Material or Entity... I know it is not the number that spawn over the phase, is it a weighting?

They were right, and 0_plains.yml — the file we point admins at as the reference — never said so. Nor did it mention the part that actually bites: blocks:, mobs: and custom-blocks: all draw from one shared pool, so a mob weight is directly comparable to a block weight and adding mobs makes every block rarer.

What

Rewritten comments in 0_plains.yml. The header now separates the three distinct kinds of number a phase file contains, since conflating them is the real source of the confusion:

  1. Weightsblocks:, mobs: and custom-blocks: values. One shared pool, weight ÷ phase total. Not counts, not percentages.
  2. PositionsfixedBlocks: and holograms: keys. Block count within this phase, from 0.
  3. The section name — the top-level '0': key. Historically the start block; phases_index.yml has owned order and length since 1.26.0.

Each section then gets its own explanation:

  • A worked example on the Winter phase (the one the admin quoted), and the real Plains percentages computed from the actual file — 11450 block weights + 665 mob weights = 12115, so GRASS_BLOCK: 2000 is 16.5%, CHEST: 200 is 1.7%, COW: 150 is 1.2%, EMERALD_ORE: 10 is 0.08%.
  • Why only the ratio matters, and why the shipped files use big numbers.
  • CHEST as a special case: its weight is the chance of a chest; rarity is a second roll at the hard-coded 62/25/9/4.
  • That custom-blocks:' probability: field is a weight in the same pool despite the name, plus the mob, itemsadder, nexo and craftengine types that were missing from the list.
  • Version gating on individual blocks and mobs via the weight: object form.
  • What actually happens when a mob is rolled (block becomes STONE if empty, mob spawns on top, clear-blocks makes space).

Comments only — verified with git diff that every block, mob and weight is byte-identical, and the parsed YAML is unchanged (blocks total 11450, mobs total 665, same fixedBlocks/holograms/biome/icon/name). OneBlocksManagerTest passes.

Note for existing servers

Phase files are only copied out of the jar when the phases folder is first created, so existing installs keep their old 0_plains.yml and will not see these comments. The companion docs PR covers those admins: BentoBoxWorld/docs#85 adds a "Customizing Phases" page and corrects the AOneBlock overview, which described weights only as "relative probability" and never mentioned the shared pool.

0_plains.yml is the reference file admins read first, but it never said
what the numbers after a Material or EntityType are. An admin asked, and
they were right to guess weighting: they are relative weights in a single
raffle - not counts and not percentages - and blocks, mobs and
custom-blocks all draw from that same pool, so a mob weight is directly
comparable to a block weight and pushes every block's share down.
The header now separates the three distinct kinds of number a phase file
contains, since that is the real source of the confusion:
1. blocks/mobs/custom-blocks values are weights, one shared pool
2. fixedBlocks and holograms keys are positions within the phase, from 0
3. the top-level key is the section name - phases_index.yml has owned
phase order and length since 1.26.0
Each section then gets its own explanation with the real Plains numbers
worked out (11450 block weights + 665 mob weights = 12115, so
GRASS_BLOCK: 2000 is 16.5% and COW: 150 is 1.2%), plus the CHEST
two-stage roll, the mob/custom-block types that were missing from the
list, and version gating.
Comments only - every block, mob and weight is unchanged.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017zwLryefnJ6wG76JmYNamx
@tastybento
tastybento merged commit 1b7c097 into developAug 2, 2026
1 check passed
@tastybento
tastybento deleted the docs/phase-file-instructions branch August 2, 2026 16:57
@sonarqubecloud

Copy link
Copy Markdown

@tastybentotastybento mentioned this pull request Aug 8, 2026
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

docs: rewrite the phase 0 comments to explain what the numbers mean - #548

Merged
tastybento merged 1 commit into
developfrom
docs/phase-file-instructions
Aug 2, 2026
Merged

docs: rewrite the phase 0 comments to explain what the numbers mean#548
tastybento merged 1 commit into
developfrom
docs/phase-file-instructions

Conversation

@tastybento

Copy link
Copy Markdown
Member

Why

An admin asked:

in the phases config, what do the numbers represent, as I couldn't see anything in the wiki about it — as in the numbers after the Material or Entity... I know it is not the number that spawn over the phase, is it a weighting?

They were right, and 0_plains.yml — the file we point admins at as the reference — never said so. Nor did it mention the part that actually bites: blocks:, mobs: and custom-blocks: all draw from one shared pool, so a mob weight is directly comparable to a block weight and adding mobs makes every block rarer.

What

Rewritten comments in 0_plains.yml. The header now separates the three distinct kinds of number a phase file contains, since conflating them is the real source of the confusion:

  1. Weightsblocks:, mobs: and custom-blocks: values. One shared pool, weight ÷ phase total. Not counts, not percentages.
  2. PositionsfixedBlocks: and holograms: keys. Block count within this phase, from 0.
  3. The section name — the top-level '0': key. Historically the start block; phases_index.yml has owned order and length since 1.26.0.

Each section then gets its own explanation:

  • A worked example on the Winter phase (the one the admin quoted), and the real Plains percentages computed from the actual file — 11450 block weights + 665 mob weights = 12115, so GRASS_BLOCK: 2000 is 16.5%, CHEST: 200 is 1.7%, COW: 150 is 1.2%, EMERALD_ORE: 10 is 0.08%.
  • Why only the ratio matters, and why the shipped files use big numbers.
  • CHEST as a special case: its weight is the chance of a chest; rarity is a second roll at the hard-coded 62/25/9/4.
  • That custom-blocks:' probability: field is a weight in the same pool despite the name, plus the mob, itemsadder, nexo and craftengine types that were missing from the list.
  • Version gating on individual blocks and mobs via the weight: object form.
  • What actually happens when a mob is rolled (block becomes STONE if empty, mob spawns on top, clear-blocks makes space).

Comments only — verified with git diff that every block, mob and weight is byte-identical, and the parsed YAML is unchanged (blocks total 11450, mobs total 665, same fixedBlocks/holograms/biome/icon/name). OneBlocksManagerTest passes.

Note for existing servers

Phase files are only copied out of the jar when the phases folder is first created, so existing installs keep their old 0_plains.yml and will not see these comments. The companion docs PR covers those admins: BentoBoxWorld/docs#85 adds a "Customizing Phases" page and corrects the AOneBlock overview, which described weights only as "relative probability" and never mentioned the shared pool.

0_plains.yml is the reference file admins read first, but it never said
what the numbers after a Material or EntityType are. An admin asked, and
they were right to guess weighting: they are relative weights in a single
raffle - not counts and not percentages - and blocks, mobs and
custom-blocks all draw from that same pool, so a mob weight is directly
comparable to a block weight and pushes every block's share down.
The header now separates the three distinct kinds of number a phase file
contains, since that is the real source of the confusion:
1. blocks/mobs/custom-blocks values are weights, one shared pool
2. fixedBlocks and holograms keys are positions within the phase, from 0
3. the top-level key is the section name - phases_index.yml has owned
phase order and length since 1.26.0
Each section then gets its own explanation with the real Plains numbers
worked out (11450 block weights + 665 mob weights = 12115, so
GRASS_BLOCK: 2000 is 16.5% and COW: 150 is 1.2%), plus the CHEST
two-stage roll, the mob/custom-block types that were missing from the
list, and version gating.
Comments only - every block, mob and weight is unchanged.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017zwLryefnJ6wG76JmYNamx
@tastybento
tastybento merged commit 1b7c097 into developAug 2, 2026
1 check passed
@tastybento
tastybento deleted the docs/phase-file-instructions branch August 2, 2026 16:57
@sonarqubecloud

Copy link
Copy Markdown

@tastybentotastybento mentioned this pull request Aug 8, 2026
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

docs: rewrite the phase 0 comments to explain what the numbers mean - #548

Merged
tastybento merged 1 commit into
developfrom
docs/phase-file-instructions
Aug 2, 2026
Merged

docs: rewrite the phase 0 comments to explain what the numbers mean#548
tastybento merged 1 commit into
developfrom
docs/phase-file-instructions

Conversation

@tastybento

Copy link
Copy Markdown
Member

Why

An admin asked:

in the phases config, what do the numbers represent, as I couldn't see anything in the wiki about it — as in the numbers after the Material or Entity... I know it is not the number that spawn over the phase, is it a weighting?

They were right, and 0_plains.yml — the file we point admins at as the reference — never said so. Nor did it mention the part that actually bites: blocks:, mobs: and custom-blocks: all draw from one shared pool, so a mob weight is directly comparable to a block weight and adding mobs makes every block rarer.

What

Rewritten comments in 0_plains.yml. The header now separates the three distinct kinds of number a phase file contains, since conflating them is the real source of the confusion:

  1. Weightsblocks:, mobs: and custom-blocks: values. One shared pool, weight ÷ phase total. Not counts, not percentages.
  2. PositionsfixedBlocks: and holograms: keys. Block count within this phase, from 0.
  3. The section name — the top-level '0': key. Historically the start block; phases_index.yml has owned order and length since 1.26.0.

Each section then gets its own explanation:

  • A worked example on the Winter phase (the one the admin quoted), and the real Plains percentages computed from the actual file — 11450 block weights + 665 mob weights = 12115, so GRASS_BLOCK: 2000 is 16.5%, CHEST: 200 is 1.7%, COW: 150 is 1.2%, EMERALD_ORE: 10 is 0.08%.
  • Why only the ratio matters, and why the shipped files use big numbers.
  • CHEST as a special case: its weight is the chance of a chest; rarity is a second roll at the hard-coded 62/25/9/4.
  • That custom-blocks:' probability: field is a weight in the same pool despite the name, plus the mob, itemsadder, nexo and craftengine types that were missing from the list.
  • Version gating on individual blocks and mobs via the weight: object form.
  • What actually happens when a mob is rolled (block becomes STONE if empty, mob spawns on top, clear-blocks makes space).

Comments only — verified with git diff that every block, mob and weight is byte-identical, and the parsed YAML is unchanged (blocks total 11450, mobs total 665, same fixedBlocks/holograms/biome/icon/name). OneBlocksManagerTest passes.

Note for existing servers

Phase files are only copied out of the jar when the phases folder is first created, so existing installs keep their old 0_plains.yml and will not see these comments. The companion docs PR covers those admins: BentoBoxWorld/docs#85 adds a "Customizing Phases" page and corrects the AOneBlock overview, which described weights only as "relative probability" and never mentioned the shared pool.

0_plains.yml is the reference file admins read first, but it never said
what the numbers after a Material or EntityType are. An admin asked, and
they were right to guess weighting: they are relative weights in a single
raffle - not counts and not percentages - and blocks, mobs and
custom-blocks all draw from that same pool, so a mob weight is directly
comparable to a block weight and pushes every block's share down.
The header now separates the three distinct kinds of number a phase file
contains, since that is the real source of the confusion:
1. blocks/mobs/custom-blocks values are weights, one shared pool
2. fixedBlocks and holograms keys are positions within the phase, from 0
3. the top-level key is the section name - phases_index.yml has owned
phase order and length since 1.26.0
Each section then gets its own explanation with the real Plains numbers
worked out (11450 block weights + 665 mob weights = 12115, so
GRASS_BLOCK: 2000 is 16.5% and COW: 150 is 1.2%), plus the CHEST
two-stage roll, the mob/custom-block types that were missing from the
list, and version gating.
Comments only - every block, mob and weight is unchanged.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017zwLryefnJ6wG76JmYNamx
@tastybento
tastybento merged commit 1b7c097 into developAug 2, 2026
1 check passed
@tastybento
tastybento deleted the docs/phase-file-instructions branch August 2, 2026 16:57
@sonarqubecloud

Copy link
Copy Markdown

@tastybentotastybento mentioned this pull request Aug 8, 2026
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

docs: rewrite the phase 0 comments to explain what the numbers mean - #548

Merged
tastybento merged 1 commit into
developfrom
docs/phase-file-instructions
Aug 2, 2026
Merged

docs: rewrite the phase 0 comments to explain what the numbers mean#548
tastybento merged 1 commit into
developfrom
docs/phase-file-instructions

Conversation

@tastybento

Copy link
Copy Markdown
Member

Why

An admin asked:

in the phases config, what do the numbers represent, as I couldn't see anything in the wiki about it — as in the numbers after the Material or Entity... I know it is not the number that spawn over the phase, is it a weighting?

They were right, and 0_plains.yml — the file we point admins at as the reference — never said so. Nor did it mention the part that actually bites: blocks:, mobs: and custom-blocks: all draw from one shared pool, so a mob weight is directly comparable to a block weight and adding mobs makes every block rarer.

What

Rewritten comments in 0_plains.yml. The header now separates the three distinct kinds of number a phase file contains, since conflating them is the real source of the confusion:

  1. Weightsblocks:, mobs: and custom-blocks: values. One shared pool, weight ÷ phase total. Not counts, not percentages.
  2. PositionsfixedBlocks: and holograms: keys. Block count within this phase, from 0.
  3. The section name — the top-level '0': key. Historically the start block; phases_index.yml has owned order and length since 1.26.0.

Each section then gets its own explanation:

  • A worked example on the Winter phase (the one the admin quoted), and the real Plains percentages computed from the actual file — 11450 block weights + 665 mob weights = 12115, so GRASS_BLOCK: 2000 is 16.5%, CHEST: 200 is 1.7%, COW: 150 is 1.2%, EMERALD_ORE: 10 is 0.08%.
  • Why only the ratio matters, and why the shipped files use big numbers.
  • CHEST as a special case: its weight is the chance of a chest; rarity is a second roll at the hard-coded 62/25/9/4.
  • That custom-blocks:' probability: field is a weight in the same pool despite the name, plus the mob, itemsadder, nexo and craftengine types that were missing from the list.
  • Version gating on individual blocks and mobs via the weight: object form.
  • What actually happens when a mob is rolled (block becomes STONE if empty, mob spawns on top, clear-blocks makes space).

Comments only — verified with git diff that every block, mob and weight is byte-identical, and the parsed YAML is unchanged (blocks total 11450, mobs total 665, same fixedBlocks/holograms/biome/icon/name). OneBlocksManagerTest passes.

Note for existing servers

Phase files are only copied out of the jar when the phases folder is first created, so existing installs keep their old 0_plains.yml and will not see these comments. The companion docs PR covers those admins: BentoBoxWorld/docs#85 adds a "Customizing Phases" page and corrects the AOneBlock overview, which described weights only as "relative probability" and never mentioned the shared pool.

0_plains.yml is the reference file admins read first, but it never said
what the numbers after a Material or EntityType are. An admin asked, and
they were right to guess weighting: they are relative weights in a single
raffle - not counts and not percentages - and blocks, mobs and
custom-blocks all draw from that same pool, so a mob weight is directly
comparable to a block weight and pushes every block's share down.
The header now separates the three distinct kinds of number a phase file
contains, since that is the real source of the confusion:
1. blocks/mobs/custom-blocks values are weights, one shared pool
2. fixedBlocks and holograms keys are positions within the phase, from 0
3. the top-level key is the section name - phases_index.yml has owned
phase order and length since 1.26.0
Each section then gets its own explanation with the real Plains numbers
worked out (11450 block weights + 665 mob weights = 12115, so
GRASS_BLOCK: 2000 is 16.5% and COW: 150 is 1.2%), plus the CHEST
two-stage roll, the mob/custom-block types that were missing from the
list, and version gating.
Comments only - every block, mob and weight is unchanged.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017zwLryefnJ6wG76JmYNamx
@tastybento
tastybento merged commit 1b7c097 into developAug 2, 2026
1 check passed
@tastybento
tastybento deleted the docs/phase-file-instructions branch August 2, 2026 16:57
@sonarqubecloud

Copy link
Copy Markdown

@tastybentotastybento mentioned this pull request Aug 8, 2026
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

docs: rewrite the phase 0 comments to explain what the numbers mean - #548

Merged
tastybento merged 1 commit into
developfrom
docs/phase-file-instructions
Aug 2, 2026
Merged

docs: rewrite the phase 0 comments to explain what the numbers mean#548
tastybento merged 1 commit into
developfrom
docs/phase-file-instructions

Conversation

@tastybento

Copy link
Copy Markdown
Member

Why

An admin asked:

in the phases config, what do the numbers represent, as I couldn't see anything in the wiki about it — as in the numbers after the Material or Entity... I know it is not the number that spawn over the phase, is it a weighting?

They were right, and 0_plains.yml — the file we point admins at as the reference — never said so. Nor did it mention the part that actually bites: blocks:, mobs: and custom-blocks: all draw from one shared pool, so a mob weight is directly comparable to a block weight and adding mobs makes every block rarer.

What

Rewritten comments in 0_plains.yml. The header now separates the three distinct kinds of number a phase file contains, since conflating them is the real source of the confusion:

  1. Weightsblocks:, mobs: and custom-blocks: values. One shared pool, weight ÷ phase total. Not counts, not percentages.
  2. PositionsfixedBlocks: and holograms: keys. Block count within this phase, from 0.
  3. The section name — the top-level '0': key. Historically the start block; phases_index.yml has owned order and length since 1.26.0.

Each section then gets its own explanation:

  • A worked example on the Winter phase (the one the admin quoted), and the real Plains percentages computed from the actual file — 11450 block weights + 665 mob weights = 12115, so GRASS_BLOCK: 2000 is 16.5%, CHEST: 200 is 1.7%, COW: 150 is 1.2%, EMERALD_ORE: 10 is 0.08%.
  • Why only the ratio matters, and why the shipped files use big numbers.
  • CHEST as a special case: its weight is the chance of a chest; rarity is a second roll at the hard-coded 62/25/9/4.
  • That custom-blocks:' probability: field is a weight in the same pool despite the name, plus the mob, itemsadder, nexo and craftengine types that were missing from the list.
  • Version gating on individual blocks and mobs via the weight: object form.
  • What actually happens when a mob is rolled (block becomes STONE if empty, mob spawns on top, clear-blocks makes space).

Comments only — verified with git diff that every block, mob and weight is byte-identical, and the parsed YAML is unchanged (blocks total 11450, mobs total 665, same fixedBlocks/holograms/biome/icon/name). OneBlocksManagerTest passes.

Note for existing servers

Phase files are only copied out of the jar when the phases folder is first created, so existing installs keep their old 0_plains.yml and will not see these comments. The companion docs PR covers those admins: BentoBoxWorld/docs#85 adds a "Customizing Phases" page and corrects the AOneBlock overview, which described weights only as "relative probability" and never mentioned the shared pool.

0_plains.yml is the reference file admins read first, but it never said
what the numbers after a Material or EntityType are. An admin asked, and
they were right to guess weighting: they are relative weights in a single
raffle - not counts and not percentages - and blocks, mobs and
custom-blocks all draw from that same pool, so a mob weight is directly
comparable to a block weight and pushes every block's share down.
The header now separates the three distinct kinds of number a phase file
contains, since that is the real source of the confusion:
1. blocks/mobs/custom-blocks values are weights, one shared pool
2. fixedBlocks and holograms keys are positions within the phase, from 0
3. the top-level key is the section name - phases_index.yml has owned
phase order and length since 1.26.0
Each section then gets its own explanation with the real Plains numbers
worked out (11450 block weights + 665 mob weights = 12115, so
GRASS_BLOCK: 2000 is 16.5% and COW: 150 is 1.2%), plus the CHEST
two-stage roll, the mob/custom-block types that were missing from the
list, and version gating.
Comments only - every block, mob and weight is unchanged.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017zwLryefnJ6wG76JmYNamx
@tastybento
tastybento merged commit 1b7c097 into developAug 2, 2026
1 check passed
@tastybento
tastybento deleted the docs/phase-file-instructions branch August 2, 2026 16:57
@sonarqubecloud

Copy link
Copy Markdown

@tastybentotastybento mentioned this pull request Aug 8, 2026
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

docs: rewrite the phase 0 comments to explain what the numbers mean - #548

Merged
tastybento merged 1 commit into
developfrom
docs/phase-file-instructions
Aug 2, 2026
Merged

docs: rewrite the phase 0 comments to explain what the numbers mean#548
tastybento merged 1 commit into
developfrom
docs/phase-file-instructions

Conversation

@tastybento

Copy link
Copy Markdown
Member

Why

An admin asked:

in the phases config, what do the numbers represent, as I couldn't see anything in the wiki about it — as in the numbers after the Material or Entity... I know it is not the number that spawn over the phase, is it a weighting?

They were right, and 0_plains.yml — the file we point admins at as the reference — never said so. Nor did it mention the part that actually bites: blocks:, mobs: and custom-blocks: all draw from one shared pool, so a mob weight is directly comparable to a block weight and adding mobs makes every block rarer.

What

Rewritten comments in 0_plains.yml. The header now separates the three distinct kinds of number a phase file contains, since conflating them is the real source of the confusion:

  1. Weightsblocks:, mobs: and custom-blocks: values. One shared pool, weight ÷ phase total. Not counts, not percentages.
  2. PositionsfixedBlocks: and holograms: keys. Block count within this phase, from 0.
  3. The section name — the top-level '0': key. Historically the start block; phases_index.yml has owned order and length since 1.26.0.

Each section then gets its own explanation:

  • A worked example on the Winter phase (the one the admin quoted), and the real Plains percentages computed from the actual file — 11450 block weights + 665 mob weights = 12115, so GRASS_BLOCK: 2000 is 16.5%, CHEST: 200 is 1.7%, COW: 150 is 1.2%, EMERALD_ORE: 10 is 0.08%.
  • Why only the ratio matters, and why the shipped files use big numbers.
  • CHEST as a special case: its weight is the chance of a chest; rarity is a second roll at the hard-coded 62/25/9/4.
  • That custom-blocks:' probability: field is a weight in the same pool despite the name, plus the mob, itemsadder, nexo and craftengine types that were missing from the list.
  • Version gating on individual blocks and mobs via the weight: object form.
  • What actually happens when a mob is rolled (block becomes STONE if empty, mob spawns on top, clear-blocks makes space).

Comments only — verified with git diff that every block, mob and weight is byte-identical, and the parsed YAML is unchanged (blocks total 11450, mobs total 665, same fixedBlocks/holograms/biome/icon/name). OneBlocksManagerTest passes.

Note for existing servers

Phase files are only copied out of the jar when the phases folder is first created, so existing installs keep their old 0_plains.yml and will not see these comments. The companion docs PR covers those admins: BentoBoxWorld/docs#85 adds a "Customizing Phases" page and corrects the AOneBlock overview, which described weights only as "relative probability" and never mentioned the shared pool.

0_plains.yml is the reference file admins read first, but it never said
what the numbers after a Material or EntityType are. An admin asked, and
they were right to guess weighting: they are relative weights in a single
raffle - not counts and not percentages - and blocks, mobs and
custom-blocks all draw from that same pool, so a mob weight is directly
comparable to a block weight and pushes every block's share down.
The header now separates the three distinct kinds of number a phase file
contains, since that is the real source of the confusion:
1. blocks/mobs/custom-blocks values are weights, one shared pool
2. fixedBlocks and holograms keys are positions within the phase, from 0
3. the top-level key is the section name - phases_index.yml has owned
phase order and length since 1.26.0
Each section then gets its own explanation with the real Plains numbers
worked out (11450 block weights + 665 mob weights = 12115, so
GRASS_BLOCK: 2000 is 16.5% and COW: 150 is 1.2%), plus the CHEST
two-stage roll, the mob/custom-block types that were missing from the
list, and version gating.
Comments only - every block, mob and weight is unchanged.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017zwLryefnJ6wG76JmYNamx
@tastybento
tastybento merged commit 1b7c097 into developAug 2, 2026
1 check passed
@tastybento
tastybento deleted the docs/phase-file-instructions branch August 2, 2026 16:57
@sonarqubecloud

Copy link
Copy Markdown

@tastybentotastybento mentioned this pull request Aug 8, 2026
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

docs: rewrite the phase 0 comments to explain what the numbers mean - #548

Merged
tastybento merged 1 commit into
developfrom
docs/phase-file-instructions
Aug 2, 2026
Merged

docs: rewrite the phase 0 comments to explain what the numbers mean#548
tastybento merged 1 commit into
developfrom
docs/phase-file-instructions

Conversation

@tastybento

Copy link
Copy Markdown
Member

Why

An admin asked:

in the phases config, what do the numbers represent, as I couldn't see anything in the wiki about it — as in the numbers after the Material or Entity... I know it is not the number that spawn over the phase, is it a weighting?

They were right, and 0_plains.yml — the file we point admins at as the reference — never said so. Nor did it mention the part that actually bites: blocks:, mobs: and custom-blocks: all draw from one shared pool, so a mob weight is directly comparable to a block weight and adding mobs makes every block rarer.

What

Rewritten comments in 0_plains.yml. The header now separates the three distinct kinds of number a phase file contains, since conflating them is the real source of the confusion:

  1. Weightsblocks:, mobs: and custom-blocks: values. One shared pool, weight ÷ phase total. Not counts, not percentages.
  2. PositionsfixedBlocks: and holograms: keys. Block count within this phase, from 0.
  3. The section name — the top-level '0': key. Historically the start block; phases_index.yml has owned order and length since 1.26.0.

Each section then gets its own explanation:

  • A worked example on the Winter phase (the one the admin quoted), and the real Plains percentages computed from the actual file — 11450 block weights + 665 mob weights = 12115, so GRASS_BLOCK: 2000 is 16.5%, CHEST: 200 is 1.7%, COW: 150 is 1.2%, EMERALD_ORE: 10 is 0.08%.
  • Why only the ratio matters, and why the shipped files use big numbers.
  • CHEST as a special case: its weight is the chance of a chest; rarity is a second roll at the hard-coded 62/25/9/4.
  • That custom-blocks:' probability: field is a weight in the same pool despite the name, plus the mob, itemsadder, nexo and craftengine types that were missing from the list.
  • Version gating on individual blocks and mobs via the weight: object form.
  • What actually happens when a mob is rolled (block becomes STONE if empty, mob spawns on top, clear-blocks makes space).

Comments only — verified with git diff that every block, mob and weight is byte-identical, and the parsed YAML is unchanged (blocks total 11450, mobs total 665, same fixedBlocks/holograms/biome/icon/name). OneBlocksManagerTest passes.

Note for existing servers

Phase files are only copied out of the jar when the phases folder is first created, so existing installs keep their old 0_plains.yml and will not see these comments. The companion docs PR covers those admins: BentoBoxWorld/docs#85 adds a "Customizing Phases" page and corrects the AOneBlock overview, which described weights only as "relative probability" and never mentioned the shared pool.

0_plains.yml is the reference file admins read first, but it never said
what the numbers after a Material or EntityType are. An admin asked, and
they were right to guess weighting: they are relative weights in a single
raffle - not counts and not percentages - and blocks, mobs and
custom-blocks all draw from that same pool, so a mob weight is directly
comparable to a block weight and pushes every block's share down.
The header now separates the three distinct kinds of number a phase file
contains, since that is the real source of the confusion:
1. blocks/mobs/custom-blocks values are weights, one shared pool
2. fixedBlocks and holograms keys are positions within the phase, from 0
3. the top-level key is the section name - phases_index.yml has owned
phase order and length since 1.26.0
Each section then gets its own explanation with the real Plains numbers
worked out (11450 block weights + 665 mob weights = 12115, so
GRASS_BLOCK: 2000 is 16.5% and COW: 150 is 1.2%), plus the CHEST
two-stage roll, the mob/custom-block types that were missing from the
list, and version gating.
Comments only - every block, mob and weight is unchanged.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017zwLryefnJ6wG76JmYNamx
@tastybento
tastybento merged commit 1b7c097 into developAug 2, 2026
1 check passed
@tastybento
tastybento deleted the docs/phase-file-instructions branch August 2, 2026 16:57
@sonarqubecloud

Copy link
Copy Markdown

@tastybentotastybento mentioned this pull request Aug 8, 2026
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