Add custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menus - #425

Merged
tastybento merged 4 commits into
developfrom
copilot/add-custom-block-support-menu
May 8, 2026
Merged

Add custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menus#425
tastybento merged 4 commits into
developfrom
copilot/add-custom-block-support-menu

Conversation

CopilotAI commented May 7, 2026

Copy link
Copy Markdown
Contributor

Custom blocks from Oraxen, Nexo, ItemsAdder, and CraftEngine were invisible or broken across all Level GUI surfaces: they were filtered out of /level value, rendered as nameless PAPER icons in /level detail, and silently rejected by /level donate.

Root causes

  • ValuePanel.getIcon() only returned non-null for Oraxen+ItemsAdder+vanilla — Nexo and CraftEngine blocks were filtered entirely from the list
  • DetailsPanel.getBlockData() only entered the String branch when addon.isItemsAdder() — all other custom-block string keys fell through to a (PAPER, "", 0, 0) dead-end
  • IslandValueCommand.executeHandCommand() missed Nexo
  • IslandDonateCommand and DonationPanel only checked item.getType().isBlock() and looked up values by vanilla Material, which never matches a custom-block string key

Changes

Level.java — new shared helper

// Returns "oraxen:id", "nexo:id", or an ItemsAdder namespaced ID; null if not custom@NullablepublicStringgetCustomBlockId(ItemStackitem)

Checks Oraxen → Nexo → ItemsAdder in order. Used by all affected surfaces so detection logic isn't duplicated.

ValuePanel

  • getIcon() returns Material.PAPER for nexo:* and any CraftEngine-registered key
  • createMaterialButton() strips the nexo: prefix before display (mirroring existing oraxen: handling)

DetailsPanel

  • getBlockData() now enters the String branch unconditionally; custom-block icon/name resolution extracted into getCustomBlockItemStack(String) (Oraxen → actual built ItemStack; Nexo → NexoItems.itemFromId(…).build(); ItemsAdder → existing hook; CraftEngine → PAPER + prettified key)

IslandValueCommand

  • executeHandCommand() delegates to addon.getCustomBlockId(item) first; falls back to vanilla Material

IslandDonateCommand

  • handleHandDonation / performHandDonation accept custom-block items (bypassing isBlock() guard) and record donations under the custom ID
  • collectDonatableTotals / performInvDonation use String keys throughout; vanilla Material names resolve back via Material.matchMaterial() for value lookup to handle the uppercase/lowercase key mismatch

DonationPanel

  • isValidDonationItem, calculateDonationValue, and processDonation all call addon.getCustomBlockId(item) and route value lookups / donation records through the custom ID when present

CraftEngine note:CraftEngineHook exposes no getIdByItem(ItemStack) equivalent, so CraftEngine custom blocks will appear correctly in /value and /detail but cannot be donated from hand/inventory or the panel GUI.

CopilotAI linked an issue May 7, 2026 that may be closed by this pull request
2 tasks
CopilotAIand others added 3 commits May 7, 2026 19:07
…e, detail, and donate menus
Agent-Logs-Url: https://github.com/BentoBoxWorld/Level/sessions/daf183a6-549f-4946-900c-5719c0a27e81
Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com>
…inv donation value
Agent-Logs-Url: https://github.com/BentoBoxWorld/Level/sessions/daf183a6-549f-4946-900c-5719c0a27e81
Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com>
CopilotAI changed the title [WIP] Add support for custom blocks in the menuAdd custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menusMay 7, 2026
CopilotAI requested a review from tastybentoMay 7, 2026 19:15
@tastybento
tastybento marked this pull request as ready for review May 7, 2026 23:05
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit d4b0277 into developMay 8, 2026
3 checks passed
@tastybento
tastybento deleted the copilot/add-custom-block-support-menu branch May 8, 2026 00:50
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.

There is no support for custom blocks in the menu

2 participants

@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

Add custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menus - #425

Merged
tastybento merged 4 commits into
developfrom
copilot/add-custom-block-support-menu
May 8, 2026
Merged

Add custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menus#425
tastybento merged 4 commits into
developfrom
copilot/add-custom-block-support-menu

Conversation

CopilotAI commented May 7, 2026

Copy link
Copy Markdown
Contributor

Custom blocks from Oraxen, Nexo, ItemsAdder, and CraftEngine were invisible or broken across all Level GUI surfaces: they were filtered out of /level value, rendered as nameless PAPER icons in /level detail, and silently rejected by /level donate.

Root causes

  • ValuePanel.getIcon() only returned non-null for Oraxen+ItemsAdder+vanilla — Nexo and CraftEngine blocks were filtered entirely from the list
  • DetailsPanel.getBlockData() only entered the String branch when addon.isItemsAdder() — all other custom-block string keys fell through to a (PAPER, "", 0, 0) dead-end
  • IslandValueCommand.executeHandCommand() missed Nexo
  • IslandDonateCommand and DonationPanel only checked item.getType().isBlock() and looked up values by vanilla Material, which never matches a custom-block string key

Changes

Level.java — new shared helper

// Returns "oraxen:id", "nexo:id", or an ItemsAdder namespaced ID; null if not custom@NullablepublicStringgetCustomBlockId(ItemStackitem)

Checks Oraxen → Nexo → ItemsAdder in order. Used by all affected surfaces so detection logic isn't duplicated.

ValuePanel

  • getIcon() returns Material.PAPER for nexo:* and any CraftEngine-registered key
  • createMaterialButton() strips the nexo: prefix before display (mirroring existing oraxen: handling)

DetailsPanel

  • getBlockData() now enters the String branch unconditionally; custom-block icon/name resolution extracted into getCustomBlockItemStack(String) (Oraxen → actual built ItemStack; Nexo → NexoItems.itemFromId(…).build(); ItemsAdder → existing hook; CraftEngine → PAPER + prettified key)

IslandValueCommand

  • executeHandCommand() delegates to addon.getCustomBlockId(item) first; falls back to vanilla Material

IslandDonateCommand

  • handleHandDonation / performHandDonation accept custom-block items (bypassing isBlock() guard) and record donations under the custom ID
  • collectDonatableTotals / performInvDonation use String keys throughout; vanilla Material names resolve back via Material.matchMaterial() for value lookup to handle the uppercase/lowercase key mismatch

DonationPanel

  • isValidDonationItem, calculateDonationValue, and processDonation all call addon.getCustomBlockId(item) and route value lookups / donation records through the custom ID when present

CraftEngine note:CraftEngineHook exposes no getIdByItem(ItemStack) equivalent, so CraftEngine custom blocks will appear correctly in /value and /detail but cannot be donated from hand/inventory or the panel GUI.

CopilotAI linked an issue May 7, 2026 that may be closed by this pull request
2 tasks
CopilotAIand others added 3 commits May 7, 2026 19:07
…e, detail, and donate menus
Agent-Logs-Url: https://github.com/BentoBoxWorld/Level/sessions/daf183a6-549f-4946-900c-5719c0a27e81
Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com>
…inv donation value
Agent-Logs-Url: https://github.com/BentoBoxWorld/Level/sessions/daf183a6-549f-4946-900c-5719c0a27e81
Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com>
CopilotAI changed the title [WIP] Add support for custom blocks in the menuAdd custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menusMay 7, 2026
CopilotAI requested a review from tastybentoMay 7, 2026 19:15
@tastybento
tastybento marked this pull request as ready for review May 7, 2026 23:05
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit d4b0277 into developMay 8, 2026
3 checks passed
@tastybento
tastybento deleted the copilot/add-custom-block-support-menu branch May 8, 2026 00:50
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.

There is no support for custom blocks in the menu

2 participants

@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

Add custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menus - #425

Merged
tastybento merged 4 commits into
developfrom
copilot/add-custom-block-support-menu
May 8, 2026
Merged

Add custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menus#425
tastybento merged 4 commits into
developfrom
copilot/add-custom-block-support-menu

Conversation

CopilotAI commented May 7, 2026

Copy link
Copy Markdown
Contributor

Custom blocks from Oraxen, Nexo, ItemsAdder, and CraftEngine were invisible or broken across all Level GUI surfaces: they were filtered out of /level value, rendered as nameless PAPER icons in /level detail, and silently rejected by /level donate.

Root causes

  • ValuePanel.getIcon() only returned non-null for Oraxen+ItemsAdder+vanilla — Nexo and CraftEngine blocks were filtered entirely from the list
  • DetailsPanel.getBlockData() only entered the String branch when addon.isItemsAdder() — all other custom-block string keys fell through to a (PAPER, "", 0, 0) dead-end
  • IslandValueCommand.executeHandCommand() missed Nexo
  • IslandDonateCommand and DonationPanel only checked item.getType().isBlock() and looked up values by vanilla Material, which never matches a custom-block string key

Changes

Level.java — new shared helper

// Returns "oraxen:id", "nexo:id", or an ItemsAdder namespaced ID; null if not custom@NullablepublicStringgetCustomBlockId(ItemStackitem)

Checks Oraxen → Nexo → ItemsAdder in order. Used by all affected surfaces so detection logic isn't duplicated.

ValuePanel

  • getIcon() returns Material.PAPER for nexo:* and any CraftEngine-registered key
  • createMaterialButton() strips the nexo: prefix before display (mirroring existing oraxen: handling)

DetailsPanel

  • getBlockData() now enters the String branch unconditionally; custom-block icon/name resolution extracted into getCustomBlockItemStack(String) (Oraxen → actual built ItemStack; Nexo → NexoItems.itemFromId(…).build(); ItemsAdder → existing hook; CraftEngine → PAPER + prettified key)

IslandValueCommand

  • executeHandCommand() delegates to addon.getCustomBlockId(item) first; falls back to vanilla Material

IslandDonateCommand

  • handleHandDonation / performHandDonation accept custom-block items (bypassing isBlock() guard) and record donations under the custom ID
  • collectDonatableTotals / performInvDonation use String keys throughout; vanilla Material names resolve back via Material.matchMaterial() for value lookup to handle the uppercase/lowercase key mismatch

DonationPanel

  • isValidDonationItem, calculateDonationValue, and processDonation all call addon.getCustomBlockId(item) and route value lookups / donation records through the custom ID when present

CraftEngine note:CraftEngineHook exposes no getIdByItem(ItemStack) equivalent, so CraftEngine custom blocks will appear correctly in /value and /detail but cannot be donated from hand/inventory or the panel GUI.

CopilotAI linked an issue May 7, 2026 that may be closed by this pull request
2 tasks
CopilotAIand others added 3 commits May 7, 2026 19:07
…e, detail, and donate menus
Agent-Logs-Url: https://github.com/BentoBoxWorld/Level/sessions/daf183a6-549f-4946-900c-5719c0a27e81
Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com>
…inv donation value
Agent-Logs-Url: https://github.com/BentoBoxWorld/Level/sessions/daf183a6-549f-4946-900c-5719c0a27e81
Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com>
CopilotAI changed the title [WIP] Add support for custom blocks in the menuAdd custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menusMay 7, 2026
CopilotAI requested a review from tastybentoMay 7, 2026 19:15
@tastybento
tastybento marked this pull request as ready for review May 7, 2026 23:05
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit d4b0277 into developMay 8, 2026
3 checks passed
@tastybento
tastybento deleted the copilot/add-custom-block-support-menu branch May 8, 2026 00:50
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.

There is no support for custom blocks in the menu

2 participants

@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

Add custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menus - #425

Merged
tastybento merged 4 commits into
developfrom
copilot/add-custom-block-support-menu
May 8, 2026
Merged

Add custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menus#425
tastybento merged 4 commits into
developfrom
copilot/add-custom-block-support-menu

Conversation

CopilotAI commented May 7, 2026

Copy link
Copy Markdown
Contributor

Custom blocks from Oraxen, Nexo, ItemsAdder, and CraftEngine were invisible or broken across all Level GUI surfaces: they were filtered out of /level value, rendered as nameless PAPER icons in /level detail, and silently rejected by /level donate.

Root causes

  • ValuePanel.getIcon() only returned non-null for Oraxen+ItemsAdder+vanilla — Nexo and CraftEngine blocks were filtered entirely from the list
  • DetailsPanel.getBlockData() only entered the String branch when addon.isItemsAdder() — all other custom-block string keys fell through to a (PAPER, "", 0, 0) dead-end
  • IslandValueCommand.executeHandCommand() missed Nexo
  • IslandDonateCommand and DonationPanel only checked item.getType().isBlock() and looked up values by vanilla Material, which never matches a custom-block string key

Changes

Level.java — new shared helper

// Returns "oraxen:id", "nexo:id", or an ItemsAdder namespaced ID; null if not custom@NullablepublicStringgetCustomBlockId(ItemStackitem)

Checks Oraxen → Nexo → ItemsAdder in order. Used by all affected surfaces so detection logic isn't duplicated.

ValuePanel

  • getIcon() returns Material.PAPER for nexo:* and any CraftEngine-registered key
  • createMaterialButton() strips the nexo: prefix before display (mirroring existing oraxen: handling)

DetailsPanel

  • getBlockData() now enters the String branch unconditionally; custom-block icon/name resolution extracted into getCustomBlockItemStack(String) (Oraxen → actual built ItemStack; Nexo → NexoItems.itemFromId(…).build(); ItemsAdder → existing hook; CraftEngine → PAPER + prettified key)

IslandValueCommand

  • executeHandCommand() delegates to addon.getCustomBlockId(item) first; falls back to vanilla Material

IslandDonateCommand

  • handleHandDonation / performHandDonation accept custom-block items (bypassing isBlock() guard) and record donations under the custom ID
  • collectDonatableTotals / performInvDonation use String keys throughout; vanilla Material names resolve back via Material.matchMaterial() for value lookup to handle the uppercase/lowercase key mismatch

DonationPanel

  • isValidDonationItem, calculateDonationValue, and processDonation all call addon.getCustomBlockId(item) and route value lookups / donation records through the custom ID when present

CraftEngine note:CraftEngineHook exposes no getIdByItem(ItemStack) equivalent, so CraftEngine custom blocks will appear correctly in /value and /detail but cannot be donated from hand/inventory or the panel GUI.

CopilotAI linked an issue May 7, 2026 that may be closed by this pull request
2 tasks
CopilotAIand others added 3 commits May 7, 2026 19:07
…e, detail, and donate menus
Agent-Logs-Url: https://github.com/BentoBoxWorld/Level/sessions/daf183a6-549f-4946-900c-5719c0a27e81
Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com>
…inv donation value
Agent-Logs-Url: https://github.com/BentoBoxWorld/Level/sessions/daf183a6-549f-4946-900c-5719c0a27e81
Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com>
CopilotAI changed the title [WIP] Add support for custom blocks in the menuAdd custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menusMay 7, 2026
CopilotAI requested a review from tastybentoMay 7, 2026 19:15
@tastybento
tastybento marked this pull request as ready for review May 7, 2026 23:05
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit d4b0277 into developMay 8, 2026
3 checks passed
@tastybento
tastybento deleted the copilot/add-custom-block-support-menu branch May 8, 2026 00:50
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.

There is no support for custom blocks in the menu

2 participants

@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

Add custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menus - #425

Merged
tastybento merged 4 commits into
developfrom
copilot/add-custom-block-support-menu
May 8, 2026
Merged

Add custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menus#425
tastybento merged 4 commits into
developfrom
copilot/add-custom-block-support-menu

Conversation

CopilotAI commented May 7, 2026

Copy link
Copy Markdown
Contributor

Custom blocks from Oraxen, Nexo, ItemsAdder, and CraftEngine were invisible or broken across all Level GUI surfaces: they were filtered out of /level value, rendered as nameless PAPER icons in /level detail, and silently rejected by /level donate.

Root causes

  • ValuePanel.getIcon() only returned non-null for Oraxen+ItemsAdder+vanilla — Nexo and CraftEngine blocks were filtered entirely from the list
  • DetailsPanel.getBlockData() only entered the String branch when addon.isItemsAdder() — all other custom-block string keys fell through to a (PAPER, "", 0, 0) dead-end
  • IslandValueCommand.executeHandCommand() missed Nexo
  • IslandDonateCommand and DonationPanel only checked item.getType().isBlock() and looked up values by vanilla Material, which never matches a custom-block string key

Changes

Level.java — new shared helper

// Returns "oraxen:id", "nexo:id", or an ItemsAdder namespaced ID; null if not custom@NullablepublicStringgetCustomBlockId(ItemStackitem)

Checks Oraxen → Nexo → ItemsAdder in order. Used by all affected surfaces so detection logic isn't duplicated.

ValuePanel

  • getIcon() returns Material.PAPER for nexo:* and any CraftEngine-registered key
  • createMaterialButton() strips the nexo: prefix before display (mirroring existing oraxen: handling)

DetailsPanel

  • getBlockData() now enters the String branch unconditionally; custom-block icon/name resolution extracted into getCustomBlockItemStack(String) (Oraxen → actual built ItemStack; Nexo → NexoItems.itemFromId(…).build(); ItemsAdder → existing hook; CraftEngine → PAPER + prettified key)

IslandValueCommand

  • executeHandCommand() delegates to addon.getCustomBlockId(item) first; falls back to vanilla Material

IslandDonateCommand

  • handleHandDonation / performHandDonation accept custom-block items (bypassing isBlock() guard) and record donations under the custom ID
  • collectDonatableTotals / performInvDonation use String keys throughout; vanilla Material names resolve back via Material.matchMaterial() for value lookup to handle the uppercase/lowercase key mismatch

DonationPanel

  • isValidDonationItem, calculateDonationValue, and processDonation all call addon.getCustomBlockId(item) and route value lookups / donation records through the custom ID when present

CraftEngine note:CraftEngineHook exposes no getIdByItem(ItemStack) equivalent, so CraftEngine custom blocks will appear correctly in /value and /detail but cannot be donated from hand/inventory or the panel GUI.

CopilotAI linked an issue May 7, 2026 that may be closed by this pull request
2 tasks
CopilotAIand others added 3 commits May 7, 2026 19:07
…e, detail, and donate menus
Agent-Logs-Url: https://github.com/BentoBoxWorld/Level/sessions/daf183a6-549f-4946-900c-5719c0a27e81
Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com>
…inv donation value
Agent-Logs-Url: https://github.com/BentoBoxWorld/Level/sessions/daf183a6-549f-4946-900c-5719c0a27e81
Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com>
CopilotAI changed the title [WIP] Add support for custom blocks in the menuAdd custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menusMay 7, 2026
CopilotAI requested a review from tastybentoMay 7, 2026 19:15
@tastybento
tastybento marked this pull request as ready for review May 7, 2026 23:05
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit d4b0277 into developMay 8, 2026
3 checks passed
@tastybento
tastybento deleted the copilot/add-custom-block-support-menu branch May 8, 2026 00:50
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.

There is no support for custom blocks in the menu

2 participants

@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

Add custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menus - #425

Merged
tastybento merged 4 commits into
developfrom
copilot/add-custom-block-support-menu
May 8, 2026
Merged

Add custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menus#425
tastybento merged 4 commits into
developfrom
copilot/add-custom-block-support-menu

Conversation

CopilotAI commented May 7, 2026

Copy link
Copy Markdown
Contributor

Custom blocks from Oraxen, Nexo, ItemsAdder, and CraftEngine were invisible or broken across all Level GUI surfaces: they were filtered out of /level value, rendered as nameless PAPER icons in /level detail, and silently rejected by /level donate.

Root causes

  • ValuePanel.getIcon() only returned non-null for Oraxen+ItemsAdder+vanilla — Nexo and CraftEngine blocks were filtered entirely from the list
  • DetailsPanel.getBlockData() only entered the String branch when addon.isItemsAdder() — all other custom-block string keys fell through to a (PAPER, "", 0, 0) dead-end
  • IslandValueCommand.executeHandCommand() missed Nexo
  • IslandDonateCommand and DonationPanel only checked item.getType().isBlock() and looked up values by vanilla Material, which never matches a custom-block string key

Changes

Level.java — new shared helper

// Returns "oraxen:id", "nexo:id", or an ItemsAdder namespaced ID; null if not custom@NullablepublicStringgetCustomBlockId(ItemStackitem)

Checks Oraxen → Nexo → ItemsAdder in order. Used by all affected surfaces so detection logic isn't duplicated.

ValuePanel

  • getIcon() returns Material.PAPER for nexo:* and any CraftEngine-registered key
  • createMaterialButton() strips the nexo: prefix before display (mirroring existing oraxen: handling)

DetailsPanel

  • getBlockData() now enters the String branch unconditionally; custom-block icon/name resolution extracted into getCustomBlockItemStack(String) (Oraxen → actual built ItemStack; Nexo → NexoItems.itemFromId(…).build(); ItemsAdder → existing hook; CraftEngine → PAPER + prettified key)

IslandValueCommand

  • executeHandCommand() delegates to addon.getCustomBlockId(item) first; falls back to vanilla Material

IslandDonateCommand

  • handleHandDonation / performHandDonation accept custom-block items (bypassing isBlock() guard) and record donations under the custom ID
  • collectDonatableTotals / performInvDonation use String keys throughout; vanilla Material names resolve back via Material.matchMaterial() for value lookup to handle the uppercase/lowercase key mismatch

DonationPanel

  • isValidDonationItem, calculateDonationValue, and processDonation all call addon.getCustomBlockId(item) and route value lookups / donation records through the custom ID when present

CraftEngine note:CraftEngineHook exposes no getIdByItem(ItemStack) equivalent, so CraftEngine custom blocks will appear correctly in /value and /detail but cannot be donated from hand/inventory or the panel GUI.

CopilotAI linked an issue May 7, 2026 that may be closed by this pull request
2 tasks
CopilotAIand others added 3 commits May 7, 2026 19:07
…e, detail, and donate menus
Agent-Logs-Url: https://github.com/BentoBoxWorld/Level/sessions/daf183a6-549f-4946-900c-5719c0a27e81
Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com>
…inv donation value
Agent-Logs-Url: https://github.com/BentoBoxWorld/Level/sessions/daf183a6-549f-4946-900c-5719c0a27e81
Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com>
CopilotAI changed the title [WIP] Add support for custom blocks in the menuAdd custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menusMay 7, 2026
CopilotAI requested a review from tastybentoMay 7, 2026 19:15
@tastybento
tastybento marked this pull request as ready for review May 7, 2026 23:05
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit d4b0277 into developMay 8, 2026
3 checks passed
@tastybento
tastybento deleted the copilot/add-custom-block-support-menu branch May 8, 2026 00:50
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.

There is no support for custom blocks in the menu

2 participants

@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

Add custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menus - #425

Merged
tastybento merged 4 commits into
developfrom
copilot/add-custom-block-support-menu
May 8, 2026
Merged

Add custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menus#425
tastybento merged 4 commits into
developfrom
copilot/add-custom-block-support-menu

Conversation

CopilotAI commented May 7, 2026

Copy link
Copy Markdown
Contributor

Custom blocks from Oraxen, Nexo, ItemsAdder, and CraftEngine were invisible or broken across all Level GUI surfaces: they were filtered out of /level value, rendered as nameless PAPER icons in /level detail, and silently rejected by /level donate.

Root causes

  • ValuePanel.getIcon() only returned non-null for Oraxen+ItemsAdder+vanilla — Nexo and CraftEngine blocks were filtered entirely from the list
  • DetailsPanel.getBlockData() only entered the String branch when addon.isItemsAdder() — all other custom-block string keys fell through to a (PAPER, "", 0, 0) dead-end
  • IslandValueCommand.executeHandCommand() missed Nexo
  • IslandDonateCommand and DonationPanel only checked item.getType().isBlock() and looked up values by vanilla Material, which never matches a custom-block string key

Changes

Level.java — new shared helper

// Returns "oraxen:id", "nexo:id", or an ItemsAdder namespaced ID; null if not custom@NullablepublicStringgetCustomBlockId(ItemStackitem)

Checks Oraxen → Nexo → ItemsAdder in order. Used by all affected surfaces so detection logic isn't duplicated.

ValuePanel

  • getIcon() returns Material.PAPER for nexo:* and any CraftEngine-registered key
  • createMaterialButton() strips the nexo: prefix before display (mirroring existing oraxen: handling)

DetailsPanel

  • getBlockData() now enters the String branch unconditionally; custom-block icon/name resolution extracted into getCustomBlockItemStack(String) (Oraxen → actual built ItemStack; Nexo → NexoItems.itemFromId(…).build(); ItemsAdder → existing hook; CraftEngine → PAPER + prettified key)

IslandValueCommand

  • executeHandCommand() delegates to addon.getCustomBlockId(item) first; falls back to vanilla Material

IslandDonateCommand

  • handleHandDonation / performHandDonation accept custom-block items (bypassing isBlock() guard) and record donations under the custom ID
  • collectDonatableTotals / performInvDonation use String keys throughout; vanilla Material names resolve back via Material.matchMaterial() for value lookup to handle the uppercase/lowercase key mismatch

DonationPanel

  • isValidDonationItem, calculateDonationValue, and processDonation all call addon.getCustomBlockId(item) and route value lookups / donation records through the custom ID when present

CraftEngine note:CraftEngineHook exposes no getIdByItem(ItemStack) equivalent, so CraftEngine custom blocks will appear correctly in /value and /detail but cannot be donated from hand/inventory or the panel GUI.

CopilotAI linked an issue May 7, 2026 that may be closed by this pull request
2 tasks
CopilotAIand others added 3 commits May 7, 2026 19:07
…e, detail, and donate menus
Agent-Logs-Url: https://github.com/BentoBoxWorld/Level/sessions/daf183a6-549f-4946-900c-5719c0a27e81
Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com>
…inv donation value
Agent-Logs-Url: https://github.com/BentoBoxWorld/Level/sessions/daf183a6-549f-4946-900c-5719c0a27e81
Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com>
CopilotAI changed the title [WIP] Add support for custom blocks in the menuAdd custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menusMay 7, 2026
CopilotAI requested a review from tastybentoMay 7, 2026 19:15
@tastybento
tastybento marked this pull request as ready for review May 7, 2026 23:05
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit d4b0277 into developMay 8, 2026
3 checks passed
@tastybento
tastybento deleted the copilot/add-custom-block-support-menu branch May 8, 2026 00:50
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.

There is no support for custom blocks in the menu

2 participants

@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

Add custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menus - #425

Merged
tastybento merged 4 commits into
developfrom
copilot/add-custom-block-support-menu
May 8, 2026
Merged

Add custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menus#425
tastybento merged 4 commits into
developfrom
copilot/add-custom-block-support-menu

Conversation

CopilotAI commented May 7, 2026

Copy link
Copy Markdown
Contributor

Custom blocks from Oraxen, Nexo, ItemsAdder, and CraftEngine were invisible or broken across all Level GUI surfaces: they were filtered out of /level value, rendered as nameless PAPER icons in /level detail, and silently rejected by /level donate.

Root causes

  • ValuePanel.getIcon() only returned non-null for Oraxen+ItemsAdder+vanilla — Nexo and CraftEngine blocks were filtered entirely from the list
  • DetailsPanel.getBlockData() only entered the String branch when addon.isItemsAdder() — all other custom-block string keys fell through to a (PAPER, "", 0, 0) dead-end
  • IslandValueCommand.executeHandCommand() missed Nexo
  • IslandDonateCommand and DonationPanel only checked item.getType().isBlock() and looked up values by vanilla Material, which never matches a custom-block string key

Changes

Level.java — new shared helper

// Returns "oraxen:id", "nexo:id", or an ItemsAdder namespaced ID; null if not custom@NullablepublicStringgetCustomBlockId(ItemStackitem)

Checks Oraxen → Nexo → ItemsAdder in order. Used by all affected surfaces so detection logic isn't duplicated.

ValuePanel

  • getIcon() returns Material.PAPER for nexo:* and any CraftEngine-registered key
  • createMaterialButton() strips the nexo: prefix before display (mirroring existing oraxen: handling)

DetailsPanel

  • getBlockData() now enters the String branch unconditionally; custom-block icon/name resolution extracted into getCustomBlockItemStack(String) (Oraxen → actual built ItemStack; Nexo → NexoItems.itemFromId(…).build(); ItemsAdder → existing hook; CraftEngine → PAPER + prettified key)

IslandValueCommand

  • executeHandCommand() delegates to addon.getCustomBlockId(item) first; falls back to vanilla Material

IslandDonateCommand

  • handleHandDonation / performHandDonation accept custom-block items (bypassing isBlock() guard) and record donations under the custom ID
  • collectDonatableTotals / performInvDonation use String keys throughout; vanilla Material names resolve back via Material.matchMaterial() for value lookup to handle the uppercase/lowercase key mismatch

DonationPanel

  • isValidDonationItem, calculateDonationValue, and processDonation all call addon.getCustomBlockId(item) and route value lookups / donation records through the custom ID when present

CraftEngine note:CraftEngineHook exposes no getIdByItem(ItemStack) equivalent, so CraftEngine custom blocks will appear correctly in /value and /detail but cannot be donated from hand/inventory or the panel GUI.

CopilotAI linked an issue May 7, 2026 that may be closed by this pull request
2 tasks
CopilotAIand others added 3 commits May 7, 2026 19:07
…e, detail, and donate menus
Agent-Logs-Url: https://github.com/BentoBoxWorld/Level/sessions/daf183a6-549f-4946-900c-5719c0a27e81
Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com>
…inv donation value
Agent-Logs-Url: https://github.com/BentoBoxWorld/Level/sessions/daf183a6-549f-4946-900c-5719c0a27e81
Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com>
CopilotAI changed the title [WIP] Add support for custom blocks in the menuAdd custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menusMay 7, 2026
CopilotAI requested a review from tastybentoMay 7, 2026 19:15
@tastybento
tastybento marked this pull request as ready for review May 7, 2026 23:05
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit d4b0277 into developMay 8, 2026
3 checks passed
@tastybento
tastybento deleted the copilot/add-custom-block-support-menu branch May 8, 2026 00:50
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.

There is no support for custom blocks in the menu

2 participants

@tastybento