Level Calculation Instability #448

Description

@mercurialmusic

Expected behavior

Treating this as a sort of draft issue since we're still trying to gather more info and nail down what's happening, but Level calculations went somewhat wild when we updated from Level-2.28.0-SNAPSHOT-b736 to Level-2.28.0-SNAPSHOT-b749.

We've been getting reports of high-level users suddenly having their levels reset completely, particularly on OneBlock, with some strange level fluctuations that can't be explained by block placement or tree growth, etc.

Not all users seem to be affected, and there isn't a permission-level difference at least between users who are affected or not, but more users seem to be affected than not.

Observed/Actual behavior

Levels are being wiped for some users and new calculations seem to be ignoring existing blocks on an island and only calculating new blocks placed since the last calculation was run.

I'm still trying to determine a trigger, but my current theory is a server restart wipes them or each calculation only takes into affect newly placed blocks since the last calculation.

From user reports:

when I check my oneblock level via /ob level, it tells me a different level every time i do it. i did it a few times because it originally (few days ago) said my level was -10 and i know i had at least level 100 because ive gotten the challenge for it. just now it told me level 60, the levels go up each time and its so weird

Another user reported that /ob detail seems to count blocks correctly but only newly placed blocks are reflected in the score. This was our top user who had a level over 13k, who logged on this morning to a level of -10:
Image

He tested with placing 22 netherite blocks and ran the level calculation again:
Image

So the new blocks are being calculated correctly, but the calculation is ignoring literally every other block on his otherwise massive island.

Select Level config.yml values relevant to the images above:

levelcost: 100
level-calc: blocks / level_cost
deathpenalty: 100

From blockconfig.yml:

blocks:
netherite_block: 400

Steps/models to reproduce

Still working on this.

BentoBox version

[21:32:54 INFO]: Running PAPER 26.1.2.
[21:32:54 INFO]: (26.1.2-74-e4e17fc (MC: 26.1.2))
[21:32:54 INFO]: BentoBox version: 3.19.1-SNAPSHOT-b287
[21:32:54 INFO]: Database: JSON
[21:32:54 INFO]: Loaded Game Worlds:
[21:32:54 INFO]: acidisland_world (AcidIsland): Overworld, Nether, The End
[21:32:54 INFO]: boxed_world (Boxed): Overworld, Nether
[21:32:54 INFO]: bskyblock_world (BSkyBlock): Overworld, Nether, The End
[21:32:54 INFO]: oneblock_world (OneBlock): Overworld, Nether*
[21:32:54 INFO]: Loaded Addons:
[21:32:54 INFO]: AcidIsland 1.22.1-SNAPSHOT-b1116 (ENABLED)
[21:32:54 INFO]: AOneBlock 1.25.2-SNAPSHOT-b547 (ENABLED)
[21:32:54 INFO]: Bank 1.10.1 (ENABLED)
[21:32:54 INFO]: Border 4.8.4-SNAPSHOT-b319 (ENABLED)
[21:32:54 INFO]: Boxed 3.4.1-SNAPSHOT-b358 (ENABLED)
[21:32:54 INFO]: BSkyBlock 1.20.0-SNAPSHOT-b838 (ENABLED)
[21:32:54 INFO]: Challenges 1.7.0-SNAPSHOT-b676 (ENABLED)
[21:32:54 INFO]: DimensionalTrees 1.9.0-SNAPSHOT-b153 (ENABLED)
[21:32:54 INFO]: Greenhouses 1.9.5 (ENABLED)
[21:32:54 INFO]: InvSwitcher 1.19.1-SNAPSHOT-b324 (ENABLED)
[21:32:54 INFO]: Level 2.28.0-SNAPSHOT-b749 (ENABLED)
[21:32:54 INFO]: Limits 1.29.0 (ENABLED)
[21:32:54 INFO]: Warps 1.19.0-SNAPSHOT-b433 (ENABLED)

Plugin list

No response

Other

Happy to help if any more info would be helpful or you'd like us to test something in particular.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

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

      Level Calculation Instability #448

      Description

      @mercurialmusic

      Expected behavior

      Treating this as a sort of draft issue since we're still trying to gather more info and nail down what's happening, but Level calculations went somewhat wild when we updated from Level-2.28.0-SNAPSHOT-b736 to Level-2.28.0-SNAPSHOT-b749.

      We've been getting reports of high-level users suddenly having their levels reset completely, particularly on OneBlock, with some strange level fluctuations that can't be explained by block placement or tree growth, etc.

      Not all users seem to be affected, and there isn't a permission-level difference at least between users who are affected or not, but more users seem to be affected than not.

      Observed/Actual behavior

      Levels are being wiped for some users and new calculations seem to be ignoring existing blocks on an island and only calculating new blocks placed since the last calculation was run.

      I'm still trying to determine a trigger, but my current theory is a server restart wipes them or each calculation only takes into affect newly placed blocks since the last calculation.

      From user reports:

      when I check my oneblock level via /ob level, it tells me a different level every time i do it. i did it a few times because it originally (few days ago) said my level was -10 and i know i had at least level 100 because ive gotten the challenge for it. just now it told me level 60, the levels go up each time and its so weird

      Another user reported that /ob detail seems to count blocks correctly but only newly placed blocks are reflected in the score. This was our top user who had a level over 13k, who logged on this morning to a level of -10:
      Image

      He tested with placing 22 netherite blocks and ran the level calculation again:
      Image

      So the new blocks are being calculated correctly, but the calculation is ignoring literally every other block on his otherwise massive island.

      Select Level config.yml values relevant to the images above:

      levelcost: 100
      level-calc: blocks / level_cost
      deathpenalty: 100
      

      From blockconfig.yml:

      blocks:
      netherite_block: 400
      

      Steps/models to reproduce

      Still working on this.

      BentoBox version

      [21:32:54 INFO]: Running PAPER 26.1.2.
      [21:32:54 INFO]: (26.1.2-74-e4e17fc (MC: 26.1.2))
      [21:32:54 INFO]: BentoBox version: 3.19.1-SNAPSHOT-b287
      [21:32:54 INFO]: Database: JSON
      [21:32:54 INFO]: Loaded Game Worlds:
      [21:32:54 INFO]: acidisland_world (AcidIsland): Overworld, Nether, The End
      [21:32:54 INFO]: boxed_world (Boxed): Overworld, Nether
      [21:32:54 INFO]: bskyblock_world (BSkyBlock): Overworld, Nether, The End
      [21:32:54 INFO]: oneblock_world (OneBlock): Overworld, Nether*
      [21:32:54 INFO]: Loaded Addons:
      [21:32:54 INFO]: AcidIsland 1.22.1-SNAPSHOT-b1116 (ENABLED)
      [21:32:54 INFO]: AOneBlock 1.25.2-SNAPSHOT-b547 (ENABLED)
      [21:32:54 INFO]: Bank 1.10.1 (ENABLED)
      [21:32:54 INFO]: Border 4.8.4-SNAPSHOT-b319 (ENABLED)
      [21:32:54 INFO]: Boxed 3.4.1-SNAPSHOT-b358 (ENABLED)
      [21:32:54 INFO]: BSkyBlock 1.20.0-SNAPSHOT-b838 (ENABLED)
      [21:32:54 INFO]: Challenges 1.7.0-SNAPSHOT-b676 (ENABLED)
      [21:32:54 INFO]: DimensionalTrees 1.9.0-SNAPSHOT-b153 (ENABLED)
      [21:32:54 INFO]: Greenhouses 1.9.5 (ENABLED)
      [21:32:54 INFO]: InvSwitcher 1.19.1-SNAPSHOT-b324 (ENABLED)
      [21:32:54 INFO]: Level 2.28.0-SNAPSHOT-b749 (ENABLED)
      [21:32:54 INFO]: Limits 1.29.0 (ENABLED)
      [21:32:54 INFO]: Warps 1.19.0-SNAPSHOT-b433 (ENABLED)

      Plugin list

      No response

      Other

      Happy to help if any more info would be helpful or you'd like us to test something in particular.

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        No labels
        No labels

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

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

          Level Calculation Instability #448

          Description

          @mercurialmusic

          Expected behavior

          Treating this as a sort of draft issue since we're still trying to gather more info and nail down what's happening, but Level calculations went somewhat wild when we updated from Level-2.28.0-SNAPSHOT-b736 to Level-2.28.0-SNAPSHOT-b749.

          We've been getting reports of high-level users suddenly having their levels reset completely, particularly on OneBlock, with some strange level fluctuations that can't be explained by block placement or tree growth, etc.

          Not all users seem to be affected, and there isn't a permission-level difference at least between users who are affected or not, but more users seem to be affected than not.

          Observed/Actual behavior

          Levels are being wiped for some users and new calculations seem to be ignoring existing blocks on an island and only calculating new blocks placed since the last calculation was run.

          I'm still trying to determine a trigger, but my current theory is a server restart wipes them or each calculation only takes into affect newly placed blocks since the last calculation.

          From user reports:

          when I check my oneblock level via /ob level, it tells me a different level every time i do it. i did it a few times because it originally (few days ago) said my level was -10 and i know i had at least level 100 because ive gotten the challenge for it. just now it told me level 60, the levels go up each time and its so weird

          Another user reported that /ob detail seems to count blocks correctly but only newly placed blocks are reflected in the score. This was our top user who had a level over 13k, who logged on this morning to a level of -10:
          Image

          He tested with placing 22 netherite blocks and ran the level calculation again:
          Image

          So the new blocks are being calculated correctly, but the calculation is ignoring literally every other block on his otherwise massive island.

          Select Level config.yml values relevant to the images above:

          levelcost: 100
          level-calc: blocks / level_cost
          deathpenalty: 100
          

          From blockconfig.yml:

          blocks:
          netherite_block: 400
          

          Steps/models to reproduce

          Still working on this.

          BentoBox version

          [21:32:54 INFO]: Running PAPER 26.1.2.
          [21:32:54 INFO]: (26.1.2-74-e4e17fc (MC: 26.1.2))
          [21:32:54 INFO]: BentoBox version: 3.19.1-SNAPSHOT-b287
          [21:32:54 INFO]: Database: JSON
          [21:32:54 INFO]: Loaded Game Worlds:
          [21:32:54 INFO]: acidisland_world (AcidIsland): Overworld, Nether, The End
          [21:32:54 INFO]: boxed_world (Boxed): Overworld, Nether
          [21:32:54 INFO]: bskyblock_world (BSkyBlock): Overworld, Nether, The End
          [21:32:54 INFO]: oneblock_world (OneBlock): Overworld, Nether*
          [21:32:54 INFO]: Loaded Addons:
          [21:32:54 INFO]: AcidIsland 1.22.1-SNAPSHOT-b1116 (ENABLED)
          [21:32:54 INFO]: AOneBlock 1.25.2-SNAPSHOT-b547 (ENABLED)
          [21:32:54 INFO]: Bank 1.10.1 (ENABLED)
          [21:32:54 INFO]: Border 4.8.4-SNAPSHOT-b319 (ENABLED)
          [21:32:54 INFO]: Boxed 3.4.1-SNAPSHOT-b358 (ENABLED)
          [21:32:54 INFO]: BSkyBlock 1.20.0-SNAPSHOT-b838 (ENABLED)
          [21:32:54 INFO]: Challenges 1.7.0-SNAPSHOT-b676 (ENABLED)
          [21:32:54 INFO]: DimensionalTrees 1.9.0-SNAPSHOT-b153 (ENABLED)
          [21:32:54 INFO]: Greenhouses 1.9.5 (ENABLED)
          [21:32:54 INFO]: InvSwitcher 1.19.1-SNAPSHOT-b324 (ENABLED)
          [21:32:54 INFO]: Level 2.28.0-SNAPSHOT-b749 (ENABLED)
          [21:32:54 INFO]: Limits 1.29.0 (ENABLED)
          [21:32:54 INFO]: Warps 1.19.0-SNAPSHOT-b433 (ENABLED)

          Plugin list

          No response

          Other

          Happy to help if any more info would be helpful or you'd like us to test something in particular.

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            No labels
            No labels

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

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

              Level Calculation Instability #448

              Description

              @mercurialmusic

              Expected behavior

              Treating this as a sort of draft issue since we're still trying to gather more info and nail down what's happening, but Level calculations went somewhat wild when we updated from Level-2.28.0-SNAPSHOT-b736 to Level-2.28.0-SNAPSHOT-b749.

              We've been getting reports of high-level users suddenly having their levels reset completely, particularly on OneBlock, with some strange level fluctuations that can't be explained by block placement or tree growth, etc.

              Not all users seem to be affected, and there isn't a permission-level difference at least between users who are affected or not, but more users seem to be affected than not.

              Observed/Actual behavior

              Levels are being wiped for some users and new calculations seem to be ignoring existing blocks on an island and only calculating new blocks placed since the last calculation was run.

              I'm still trying to determine a trigger, but my current theory is a server restart wipes them or each calculation only takes into affect newly placed blocks since the last calculation.

              From user reports:

              when I check my oneblock level via /ob level, it tells me a different level every time i do it. i did it a few times because it originally (few days ago) said my level was -10 and i know i had at least level 100 because ive gotten the challenge for it. just now it told me level 60, the levels go up each time and its so weird

              Another user reported that /ob detail seems to count blocks correctly but only newly placed blocks are reflected in the score. This was our top user who had a level over 13k, who logged on this morning to a level of -10:
              Image

              He tested with placing 22 netherite blocks and ran the level calculation again:
              Image

              So the new blocks are being calculated correctly, but the calculation is ignoring literally every other block on his otherwise massive island.

              Select Level config.yml values relevant to the images above:

              levelcost: 100
              level-calc: blocks / level_cost
              deathpenalty: 100
              

              From blockconfig.yml:

              blocks:
              netherite_block: 400
              

              Steps/models to reproduce

              Still working on this.

              BentoBox version

              [21:32:54 INFO]: Running PAPER 26.1.2.
              [21:32:54 INFO]: (26.1.2-74-e4e17fc (MC: 26.1.2))
              [21:32:54 INFO]: BentoBox version: 3.19.1-SNAPSHOT-b287
              [21:32:54 INFO]: Database: JSON
              [21:32:54 INFO]: Loaded Game Worlds:
              [21:32:54 INFO]: acidisland_world (AcidIsland): Overworld, Nether, The End
              [21:32:54 INFO]: boxed_world (Boxed): Overworld, Nether
              [21:32:54 INFO]: bskyblock_world (BSkyBlock): Overworld, Nether, The End
              [21:32:54 INFO]: oneblock_world (OneBlock): Overworld, Nether*
              [21:32:54 INFO]: Loaded Addons:
              [21:32:54 INFO]: AcidIsland 1.22.1-SNAPSHOT-b1116 (ENABLED)
              [21:32:54 INFO]: AOneBlock 1.25.2-SNAPSHOT-b547 (ENABLED)
              [21:32:54 INFO]: Bank 1.10.1 (ENABLED)
              [21:32:54 INFO]: Border 4.8.4-SNAPSHOT-b319 (ENABLED)
              [21:32:54 INFO]: Boxed 3.4.1-SNAPSHOT-b358 (ENABLED)
              [21:32:54 INFO]: BSkyBlock 1.20.0-SNAPSHOT-b838 (ENABLED)
              [21:32:54 INFO]: Challenges 1.7.0-SNAPSHOT-b676 (ENABLED)
              [21:32:54 INFO]: DimensionalTrees 1.9.0-SNAPSHOT-b153 (ENABLED)
              [21:32:54 INFO]: Greenhouses 1.9.5 (ENABLED)
              [21:32:54 INFO]: InvSwitcher 1.19.1-SNAPSHOT-b324 (ENABLED)
              [21:32:54 INFO]: Level 2.28.0-SNAPSHOT-b749 (ENABLED)
              [21:32:54 INFO]: Limits 1.29.0 (ENABLED)
              [21:32:54 INFO]: Warps 1.19.0-SNAPSHOT-b433 (ENABLED)

              Plugin list

              No response

              Other

              Happy to help if any more info would be helpful or you'd like us to test something in particular.

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                No labels
                No labels

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

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

                  Level Calculation Instability #448

                  Description

                  @mercurialmusic

                  Expected behavior

                  Treating this as a sort of draft issue since we're still trying to gather more info and nail down what's happening, but Level calculations went somewhat wild when we updated from Level-2.28.0-SNAPSHOT-b736 to Level-2.28.0-SNAPSHOT-b749.

                  We've been getting reports of high-level users suddenly having their levels reset completely, particularly on OneBlock, with some strange level fluctuations that can't be explained by block placement or tree growth, etc.

                  Not all users seem to be affected, and there isn't a permission-level difference at least between users who are affected or not, but more users seem to be affected than not.

                  Observed/Actual behavior

                  Levels are being wiped for some users and new calculations seem to be ignoring existing blocks on an island and only calculating new blocks placed since the last calculation was run.

                  I'm still trying to determine a trigger, but my current theory is a server restart wipes them or each calculation only takes into affect newly placed blocks since the last calculation.

                  From user reports:

                  when I check my oneblock level via /ob level, it tells me a different level every time i do it. i did it a few times because it originally (few days ago) said my level was -10 and i know i had at least level 100 because ive gotten the challenge for it. just now it told me level 60, the levels go up each time and its so weird

                  Another user reported that /ob detail seems to count blocks correctly but only newly placed blocks are reflected in the score. This was our top user who had a level over 13k, who logged on this morning to a level of -10:
                  Image

                  He tested with placing 22 netherite blocks and ran the level calculation again:
                  Image

                  So the new blocks are being calculated correctly, but the calculation is ignoring literally every other block on his otherwise massive island.

                  Select Level config.yml values relevant to the images above:

                  levelcost: 100
                  level-calc: blocks / level_cost
                  deathpenalty: 100
                  

                  From blockconfig.yml:

                  blocks:
                  netherite_block: 400
                  

                  Steps/models to reproduce

                  Still working on this.

                  BentoBox version

                  [21:32:54 INFO]: Running PAPER 26.1.2.
                  [21:32:54 INFO]: (26.1.2-74-e4e17fc (MC: 26.1.2))
                  [21:32:54 INFO]: BentoBox version: 3.19.1-SNAPSHOT-b287
                  [21:32:54 INFO]: Database: JSON
                  [21:32:54 INFO]: Loaded Game Worlds:
                  [21:32:54 INFO]: acidisland_world (AcidIsland): Overworld, Nether, The End
                  [21:32:54 INFO]: boxed_world (Boxed): Overworld, Nether
                  [21:32:54 INFO]: bskyblock_world (BSkyBlock): Overworld, Nether, The End
                  [21:32:54 INFO]: oneblock_world (OneBlock): Overworld, Nether*
                  [21:32:54 INFO]: Loaded Addons:
                  [21:32:54 INFO]: AcidIsland 1.22.1-SNAPSHOT-b1116 (ENABLED)
                  [21:32:54 INFO]: AOneBlock 1.25.2-SNAPSHOT-b547 (ENABLED)
                  [21:32:54 INFO]: Bank 1.10.1 (ENABLED)
                  [21:32:54 INFO]: Border 4.8.4-SNAPSHOT-b319 (ENABLED)
                  [21:32:54 INFO]: Boxed 3.4.1-SNAPSHOT-b358 (ENABLED)
                  [21:32:54 INFO]: BSkyBlock 1.20.0-SNAPSHOT-b838 (ENABLED)
                  [21:32:54 INFO]: Challenges 1.7.0-SNAPSHOT-b676 (ENABLED)
                  [21:32:54 INFO]: DimensionalTrees 1.9.0-SNAPSHOT-b153 (ENABLED)
                  [21:32:54 INFO]: Greenhouses 1.9.5 (ENABLED)
                  [21:32:54 INFO]: InvSwitcher 1.19.1-SNAPSHOT-b324 (ENABLED)
                  [21:32:54 INFO]: Level 2.28.0-SNAPSHOT-b749 (ENABLED)
                  [21:32:54 INFO]: Limits 1.29.0 (ENABLED)
                  [21:32:54 INFO]: Warps 1.19.0-SNAPSHOT-b433 (ENABLED)

                  Plugin list

                  No response

                  Other

                  Happy to help if any more info would be helpful or you'd like us to test something in particular.

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    No labels
                    No labels

                    Type

                    No type

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

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

                      Level Calculation Instability #448

                      Description

                      @mercurialmusic

                      Expected behavior

                      Treating this as a sort of draft issue since we're still trying to gather more info and nail down what's happening, but Level calculations went somewhat wild when we updated from Level-2.28.0-SNAPSHOT-b736 to Level-2.28.0-SNAPSHOT-b749.

                      We've been getting reports of high-level users suddenly having their levels reset completely, particularly on OneBlock, with some strange level fluctuations that can't be explained by block placement or tree growth, etc.

                      Not all users seem to be affected, and there isn't a permission-level difference at least between users who are affected or not, but more users seem to be affected than not.

                      Observed/Actual behavior

                      Levels are being wiped for some users and new calculations seem to be ignoring existing blocks on an island and only calculating new blocks placed since the last calculation was run.

                      I'm still trying to determine a trigger, but my current theory is a server restart wipes them or each calculation only takes into affect newly placed blocks since the last calculation.

                      From user reports:

                      when I check my oneblock level via /ob level, it tells me a different level every time i do it. i did it a few times because it originally (few days ago) said my level was -10 and i know i had at least level 100 because ive gotten the challenge for it. just now it told me level 60, the levels go up each time and its so weird

                      Another user reported that /ob detail seems to count blocks correctly but only newly placed blocks are reflected in the score. This was our top user who had a level over 13k, who logged on this morning to a level of -10:
                      Image

                      He tested with placing 22 netherite blocks and ran the level calculation again:
                      Image

                      So the new blocks are being calculated correctly, but the calculation is ignoring literally every other block on his otherwise massive island.

                      Select Level config.yml values relevant to the images above:

                      levelcost: 100
                      level-calc: blocks / level_cost
                      deathpenalty: 100
                      

                      From blockconfig.yml:

                      blocks:
                      netherite_block: 400
                      

                      Steps/models to reproduce

                      Still working on this.

                      BentoBox version

                      [21:32:54 INFO]: Running PAPER 26.1.2.
                      [21:32:54 INFO]: (26.1.2-74-e4e17fc (MC: 26.1.2))
                      [21:32:54 INFO]: BentoBox version: 3.19.1-SNAPSHOT-b287
                      [21:32:54 INFO]: Database: JSON
                      [21:32:54 INFO]: Loaded Game Worlds:
                      [21:32:54 INFO]: acidisland_world (AcidIsland): Overworld, Nether, The End
                      [21:32:54 INFO]: boxed_world (Boxed): Overworld, Nether
                      [21:32:54 INFO]: bskyblock_world (BSkyBlock): Overworld, Nether, The End
                      [21:32:54 INFO]: oneblock_world (OneBlock): Overworld, Nether*
                      [21:32:54 INFO]: Loaded Addons:
                      [21:32:54 INFO]: AcidIsland 1.22.1-SNAPSHOT-b1116 (ENABLED)
                      [21:32:54 INFO]: AOneBlock 1.25.2-SNAPSHOT-b547 (ENABLED)
                      [21:32:54 INFO]: Bank 1.10.1 (ENABLED)
                      [21:32:54 INFO]: Border 4.8.4-SNAPSHOT-b319 (ENABLED)
                      [21:32:54 INFO]: Boxed 3.4.1-SNAPSHOT-b358 (ENABLED)
                      [21:32:54 INFO]: BSkyBlock 1.20.0-SNAPSHOT-b838 (ENABLED)
                      [21:32:54 INFO]: Challenges 1.7.0-SNAPSHOT-b676 (ENABLED)
                      [21:32:54 INFO]: DimensionalTrees 1.9.0-SNAPSHOT-b153 (ENABLED)
                      [21:32:54 INFO]: Greenhouses 1.9.5 (ENABLED)
                      [21:32:54 INFO]: InvSwitcher 1.19.1-SNAPSHOT-b324 (ENABLED)
                      [21:32:54 INFO]: Level 2.28.0-SNAPSHOT-b749 (ENABLED)
                      [21:32:54 INFO]: Limits 1.29.0 (ENABLED)
                      [21:32:54 INFO]: Warps 1.19.0-SNAPSHOT-b433 (ENABLED)

                      Plugin list

                      No response

                      Other

                      Happy to help if any more info would be helpful or you'd like us to test something in particular.

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        No labels
                        No labels

                        Type

                        No type

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

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

                          Level Calculation Instability #448

                          Description

                          @mercurialmusic

                          Expected behavior

                          Treating this as a sort of draft issue since we're still trying to gather more info and nail down what's happening, but Level calculations went somewhat wild when we updated from Level-2.28.0-SNAPSHOT-b736 to Level-2.28.0-SNAPSHOT-b749.

                          We've been getting reports of high-level users suddenly having their levels reset completely, particularly on OneBlock, with some strange level fluctuations that can't be explained by block placement or tree growth, etc.

                          Not all users seem to be affected, and there isn't a permission-level difference at least between users who are affected or not, but more users seem to be affected than not.

                          Observed/Actual behavior

                          Levels are being wiped for some users and new calculations seem to be ignoring existing blocks on an island and only calculating new blocks placed since the last calculation was run.

                          I'm still trying to determine a trigger, but my current theory is a server restart wipes them or each calculation only takes into affect newly placed blocks since the last calculation.

                          From user reports:

                          when I check my oneblock level via /ob level, it tells me a different level every time i do it. i did it a few times because it originally (few days ago) said my level was -10 and i know i had at least level 100 because ive gotten the challenge for it. just now it told me level 60, the levels go up each time and its so weird

                          Another user reported that /ob detail seems to count blocks correctly but only newly placed blocks are reflected in the score. This was our top user who had a level over 13k, who logged on this morning to a level of -10:
                          Image

                          He tested with placing 22 netherite blocks and ran the level calculation again:
                          Image

                          So the new blocks are being calculated correctly, but the calculation is ignoring literally every other block on his otherwise massive island.

                          Select Level config.yml values relevant to the images above:

                          levelcost: 100
                          level-calc: blocks / level_cost
                          deathpenalty: 100
                          

                          From blockconfig.yml:

                          blocks:
                          netherite_block: 400
                          

                          Steps/models to reproduce

                          Still working on this.

                          BentoBox version

                          [21:32:54 INFO]: Running PAPER 26.1.2.
                          [21:32:54 INFO]: (26.1.2-74-e4e17fc (MC: 26.1.2))
                          [21:32:54 INFO]: BentoBox version: 3.19.1-SNAPSHOT-b287
                          [21:32:54 INFO]: Database: JSON
                          [21:32:54 INFO]: Loaded Game Worlds:
                          [21:32:54 INFO]: acidisland_world (AcidIsland): Overworld, Nether, The End
                          [21:32:54 INFO]: boxed_world (Boxed): Overworld, Nether
                          [21:32:54 INFO]: bskyblock_world (BSkyBlock): Overworld, Nether, The End
                          [21:32:54 INFO]: oneblock_world (OneBlock): Overworld, Nether*
                          [21:32:54 INFO]: Loaded Addons:
                          [21:32:54 INFO]: AcidIsland 1.22.1-SNAPSHOT-b1116 (ENABLED)
                          [21:32:54 INFO]: AOneBlock 1.25.2-SNAPSHOT-b547 (ENABLED)
                          [21:32:54 INFO]: Bank 1.10.1 (ENABLED)
                          [21:32:54 INFO]: Border 4.8.4-SNAPSHOT-b319 (ENABLED)
                          [21:32:54 INFO]: Boxed 3.4.1-SNAPSHOT-b358 (ENABLED)
                          [21:32:54 INFO]: BSkyBlock 1.20.0-SNAPSHOT-b838 (ENABLED)
                          [21:32:54 INFO]: Challenges 1.7.0-SNAPSHOT-b676 (ENABLED)
                          [21:32:54 INFO]: DimensionalTrees 1.9.0-SNAPSHOT-b153 (ENABLED)
                          [21:32:54 INFO]: Greenhouses 1.9.5 (ENABLED)
                          [21:32:54 INFO]: InvSwitcher 1.19.1-SNAPSHOT-b324 (ENABLED)
                          [21:32:54 INFO]: Level 2.28.0-SNAPSHOT-b749 (ENABLED)
                          [21:32:54 INFO]: Limits 1.29.0 (ENABLED)
                          [21:32:54 INFO]: Warps 1.19.0-SNAPSHOT-b433 (ENABLED)

                          Plugin list

                          No response

                          Other

                          Happy to help if any more info would be helpful or you'd like us to test something in particular.

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            No labels
                            No labels

                            Type

                            No type

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

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

                              Level Calculation Instability #448

                              Description

                              @mercurialmusic

                              Expected behavior

                              Treating this as a sort of draft issue since we're still trying to gather more info and nail down what's happening, but Level calculations went somewhat wild when we updated from Level-2.28.0-SNAPSHOT-b736 to Level-2.28.0-SNAPSHOT-b749.

                              We've been getting reports of high-level users suddenly having their levels reset completely, particularly on OneBlock, with some strange level fluctuations that can't be explained by block placement or tree growth, etc.

                              Not all users seem to be affected, and there isn't a permission-level difference at least between users who are affected or not, but more users seem to be affected than not.

                              Observed/Actual behavior

                              Levels are being wiped for some users and new calculations seem to be ignoring existing blocks on an island and only calculating new blocks placed since the last calculation was run.

                              I'm still trying to determine a trigger, but my current theory is a server restart wipes them or each calculation only takes into affect newly placed blocks since the last calculation.

                              From user reports:

                              when I check my oneblock level via /ob level, it tells me a different level every time i do it. i did it a few times because it originally (few days ago) said my level was -10 and i know i had at least level 100 because ive gotten the challenge for it. just now it told me level 60, the levels go up each time and its so weird

                              Another user reported that /ob detail seems to count blocks correctly but only newly placed blocks are reflected in the score. This was our top user who had a level over 13k, who logged on this morning to a level of -10:
                              Image

                              He tested with placing 22 netherite blocks and ran the level calculation again:
                              Image

                              So the new blocks are being calculated correctly, but the calculation is ignoring literally every other block on his otherwise massive island.

                              Select Level config.yml values relevant to the images above:

                              levelcost: 100
                              level-calc: blocks / level_cost
                              deathpenalty: 100
                              

                              From blockconfig.yml:

                              blocks:
                              netherite_block: 400
                              

                              Steps/models to reproduce

                              Still working on this.

                              BentoBox version

                              [21:32:54 INFO]: Running PAPER 26.1.2.
                              [21:32:54 INFO]: (26.1.2-74-e4e17fc (MC: 26.1.2))
                              [21:32:54 INFO]: BentoBox version: 3.19.1-SNAPSHOT-b287
                              [21:32:54 INFO]: Database: JSON
                              [21:32:54 INFO]: Loaded Game Worlds:
                              [21:32:54 INFO]: acidisland_world (AcidIsland): Overworld, Nether, The End
                              [21:32:54 INFO]: boxed_world (Boxed): Overworld, Nether
                              [21:32:54 INFO]: bskyblock_world (BSkyBlock): Overworld, Nether, The End
                              [21:32:54 INFO]: oneblock_world (OneBlock): Overworld, Nether*
                              [21:32:54 INFO]: Loaded Addons:
                              [21:32:54 INFO]: AcidIsland 1.22.1-SNAPSHOT-b1116 (ENABLED)
                              [21:32:54 INFO]: AOneBlock 1.25.2-SNAPSHOT-b547 (ENABLED)
                              [21:32:54 INFO]: Bank 1.10.1 (ENABLED)
                              [21:32:54 INFO]: Border 4.8.4-SNAPSHOT-b319 (ENABLED)
                              [21:32:54 INFO]: Boxed 3.4.1-SNAPSHOT-b358 (ENABLED)
                              [21:32:54 INFO]: BSkyBlock 1.20.0-SNAPSHOT-b838 (ENABLED)
                              [21:32:54 INFO]: Challenges 1.7.0-SNAPSHOT-b676 (ENABLED)
                              [21:32:54 INFO]: DimensionalTrees 1.9.0-SNAPSHOT-b153 (ENABLED)
                              [21:32:54 INFO]: Greenhouses 1.9.5 (ENABLED)
                              [21:32:54 INFO]: InvSwitcher 1.19.1-SNAPSHOT-b324 (ENABLED)
                              [21:32:54 INFO]: Level 2.28.0-SNAPSHOT-b749 (ENABLED)
                              [21:32:54 INFO]: Limits 1.29.0 (ENABLED)
                              [21:32:54 INFO]: Warps 1.19.0-SNAPSHOT-b433 (ENABLED)

                              Plugin list

                              No response

                              Other

                              Happy to help if any more info would be helpful or you'd like us to test something in particular.

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                No labels
                                No labels

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions