Skip to content

Release 2.27.0#431

Merged
tastybento merged 24 commits into
masterfrom
develop
May 13, 2026
Merged

Release 2.27.0#431
tastybento merged 24 commits into
masterfrom
develop

Conversation

@tastybento
Copy link
Copy Markdown
Member

No description provided.

tastybento and others added 18 commits May 3, 2026 22:10
Adds a confirmable "inv" subcommand that scans the player's inventory
for donatable blocks, lists each material with its point value plus a
total in the confirmation prompt, and on confirm donates all of them
in one go. Items with no value or that are not donatable blocks remain
in the inventory.

Also fixes the donate tab-complete: the args list BentoBox passes to a
subcommand includes the leaf label at index 0, so the previous
size-1 check never fired in real use and only the auto "help"
suggestion appeared. Tests now exercise the realistic args shape.

Bumps build version to 2.27.0.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds the four new island.donate.inv keys (keyword, confirm-header,
confirm-line, confirm-total) to every non-English locale file. MiniMessage
tags and placeholders are preserved verbatim; only the human-readable
text was translated.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Addresses SonarCloud findings about duplicated string literals in
IslandDonateCommand.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
feat: /island donate inv — donate everything from inventory
…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>
FIXED: Negative values in progression while using a non-linear function.
The forward and backward point-boundary scans could each iterate up to
10M times calling calculateLevel() (string parse + eval) on the primary
thread. Binary search reduces this to ~23 iterations. Also adds missing
ResultsTest coverage for pointsFromCurrentLevel.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…upport-menu

Add custom block support (Oraxen/Nexo/ItemsAdder/CraftEngine) in value, detail, and donate menus
The /is value panel rendered Oraxen/Nexo/ItemsAdder blocks as paper with
the prettified config key as the name. Look up the real ItemStack from
the plugin's registry and use it as the icon, plus the item meta display
name when present. Lookup helper is extracted to Utils so DetailsPanel
and ValuePanel share it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…and-name

Fix custom-block icon and display name in value panel (#426)
Three call sites were missing CraftEngine support, so /is value hand
returned "no value" for held CraftEngine items, the value panel showed
a paper icon with the prettified namespaced key, and the chat output
used the raw key instead of the configured display name:

- Level.getCustomBlockId now checks CraftEngineHook.getItemId, so a
  held custom item is mapped to its namespaced ID.
- Utils.getCustomBlockItemStack now delegates to
  CraftEngineHook.getItemStack so the panel renders the real icon.
- Utils.getCustomBlockDisplayName now also reads the modern
  minecraft:item_name component (hasItemName/getItemName) used by
  CraftEngine, in addition to the legacy display.Name used by Oraxen,
  Nexo, and ItemsAdder.
- IslandValueCommand.printValue routes string IDs through the same
  getCustomBlockItemStack/getCustomBlockDisplayName path used by the
  panel, so the chat message shows the configured display name.

Requires BentoBox >= 3.15.1-SNAPSHOT (BentoBoxWorld/BentoBox#2973 for
the new getItemId helper).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…y-name

fix: recognize CraftEngine items in value lookups (#428)
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Release 2.27.0 expands Level’s donation and custom-block support, improves level-progress reporting for non-linear formulas, and updates project/version metadata.

Changes:

  • Add /island donate inv flow (tab-complete, confirmation prompt, inventory scan + donation logging) and localize new messages.
  • Improve custom-block rendering by resolving representative ItemStacks (Oraxen/Nexo/ItemsAdder/CraftEngine) and using item meta display names in panels/commands.
  • Compute “points within current level” and use it to show accurate level progress for non-linear level formulas; bump addon + dependency versions.

Reviewed changes

Copilot reviewed 31 out of 31 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
src/main/java/world/bentobox/level/commands/IslandDonateCommand.java Adds inv subcommand, inventory donation execution, and revised tab-complete logic.
src/test/java/world/bentobox/level/commands/IslandDonateCommandTest.java Adds tab-complete and inv donation tests.
src/main/resources/locales/en-US.yml Updates donate usage string; adds donate.inv.* messages.
src/main/resources/locales/cs.yml Adds donate.inv.* messages.
src/main/resources/locales/de.yml Adds donate.inv.* messages.
src/main/resources/locales/es.yml Adds donate.inv.* messages.
src/main/resources/locales/fr.yml Adds donate.inv.* messages.
src/main/resources/locales/hu.yml Adds donate.inv.* messages.
src/main/resources/locales/id.yml Adds donate.inv.* messages.
src/main/resources/locales/ko.yml Adds donate.inv.* messages.
src/main/resources/locales/lv.yml Adds donate.inv.* messages.
src/main/resources/locales/nl.yml Adds donate.inv.* messages.
src/main/resources/locales/pl.yml Adds donate.inv.* messages.
src/main/resources/locales/pt.yml Adds donate.inv.* messages.
src/main/resources/locales/ru.yml Adds donate.inv.* messages.
src/main/resources/locales/tr.yml Adds donate.inv.* messages.
src/main/resources/locales/uk.yml Adds donate.inv.* messages.
src/main/resources/locales/vi.yml Adds donate.inv.* messages.
src/main/resources/locales/zh-CN.yml Adds donate.inv.* messages.
src/main/java/world/bentobox/level/util/Utils.java Adds helpers to resolve custom-block ItemStacks and display names.
src/main/java/world/bentobox/level/panels/ValuePanel.java Uses custom-block ItemStack icons + display names where available.
src/main/java/world/bentobox/level/panels/DonationPanel.java Supports custom-block IDs for value lookup and donation logging.
src/main/java/world/bentobox/level/panels/DetailsPanel.java Uses shared custom-block resolution/display-name helpers.
src/main/java/world/bentobox/level/Level.java Adds getCustomBlockId(ItemStack) for Oraxen/Nexo/ItemsAdder/CraftEngine.
src/main/java/world/bentobox/level/commands/IslandValueCommand.java Uses getCustomBlockId() and custom display-name resolution for “hand” value lookups.
src/main/java/world/bentobox/level/commands/IslandLevelCommand.java Displays progress using “points from current level” and computed interval size.
src/main/java/world/bentobox/level/calculators/Results.java Adds pointsFromCurrentLevel field + getters/setters.
src/test/java/world/bentobox/level/calculators/ResultsTest.java Adds unit tests for pointsFromCurrentLevel.
src/main/java/world/bentobox/level/calculators/IslandLevelCalculator.java Uses binary search to compute points-to-next-level and points-within-current-level.
src/main/resources/addon.yml Bumps addon api-version.
pom.xml Bumps build version to 2.27.0 and BentoBox dependency to 3.15.1-SNAPSHOT.
Comments suppressed due to low confidence (1)

src/main/java/world/bentobox/level/commands/IslandDonateCommand.java:300

  • tabComplete() now assumes BentoBox prepends the leaf command label into args (using args.get(1) for the first user argument). This is inconsistent with other commands/tests in this repo (which treat args as only user-typed arguments) and breaks completion for /island donate hand <TAB>: with args like ["hand", ""], the code returns hand/inv suggestions instead of the held amount. Consider supporting the existing args shape (no label) or handling both forms by detecting and adjusting the starting index dynamically.
    public Optional<List<String>> tabComplete(User user, String alias, List<String> args) {
        // BentoBox includes the command label as args.get(0); the user-typed args start at index 1.
        String lastArg = !args.isEmpty() ? args.get(args.size() - 1) : "";
        String handKeyword = user.getTranslation("island.donate.hand.keyword");
        String invKeyword = user.getTranslation("island.donate.inv.keyword");

        // First user-arg slot: suggest "hand" and "inv".
        if (args.size() <= 2) {
            return Optional.of(Util.tabLimit(List.of(handKeyword, invKeyword), lastArg));
        }
        // Second user-arg slot after "hand": suggest the held count.
        if (args.size() == 3 && isHandKeyword(user, args.get(1)) && user.isPlayer()) {
            int held = user.getPlayer().getInventory().getItemInMainHand().getAmount();
            if (held > 0) {
                return Optional.of(Util.tabLimit(List.of(String.valueOf(held)), lastArg));
            }
        }
        return Optional.of(List.of());

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +175 to +183
@Test
void testTabCompleteFirstArgFromBentoBoxFlow() {
// BentoBox passes the leaf command label as args.get(0); the partial first
// user arg sits in args.get(1). Empty string = bare "/island donate <TAB>".
var result = cmd.tabComplete(user, "donate", List.of("donate", ""));
assertTrue(result.isPresent());
assertTrue(result.get().contains("hand"));
assertTrue(result.get().contains("inv"));
}
time-out: "<red>The level calculation took too long. Please try again later."
donate:
parameters: "[hand [amount]]"
parameters: "[hand [amount]] [inv]"
tastybento and others added 6 commits May 11, 2026 20:38
Adds a `donations-only` config option that bypasses the island chunk scan
entirely. The island level is computed only from blocks donated via
`/island donate`, removing the per-recalculation CPU cost of scanning.

When the option is enabled:
- IslandLevelCalculator.scanIsland short-circuits to tidyUp(), which adds
  the donated points (`LevelsManager.getDonatedPoints`) and runs the
  configured level-calc formula on those points alone.
- The /island detail command is not registered, since there are no
  scanned blocks to break down per the issue thread.
- /island level, /island top, /island value, and /island donate continue
  to work; /island level reports the level based on donations only.

Closes #430.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
feat: donations-only mode — skip block scan (#430)
When an admin enables donations-only mid-game, existing islands already
have an `initialCount` recorded from the original starter-island scan.
The level formula subtracts `initialCount` from raw points when
`zero-new-island-levels` is on — but under donations-only, raw points
are just the donated total, which is typically much smaller than the
recorded initial count. The result was a huge negative `modifiedPoints`
and a wildly negative level.

Ignore `initialCount` (treat as 0) whenever donations-only is enabled:
- `calculateLevel(rawPoints)` no longer subtracts it
- the `pointsFromCurrentLevel` binary search no longer floors at it
- the report no longer prints it (would be misleading, since it isn't
  applied to the level math)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The previous short-circuit in scanIsland skipped every scan when
donations-only was enabled — including the zero-island scan that fires
on IslandCreatedEvent / IslandResettedEvent. That meant new islands
created during a donations-only window got initialCount = 0, so if an
admin later disabled donations-only the player's entire current block
total would count toward their level (no handicap subtracted).

Restrict the short-circuit to non-zero-island scans. The zero-island
scan still runs and records the real handicap into initialCount; it is
just ignored by calculateLevel while donations-only is on (per the
existing fix in this PR). When donations-only is later disabled, the
stored initialCount is correctly subtracted by calculateLevel as before.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The viewer button at the bottom of the top-ten panel rendered with a
"Click to view" tooltip and opened the details panel on click. That
panel breaks down scanned blocks, which is meaningless in donations-only
mode (and /island detail is not registered there either).

Add a donations-only check to the VIEW action filter so it's removed
from activeActions for that button when donations-only is enabled.
Filtering it out also drops the "Click to view" tooltip — no template
or locale change needed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ore-initial-count

fix: ignore initialCount in donations-only mode (#430)
@sonarqubecloud
Copy link
Copy Markdown

@tastybento tastybento merged commit 23e4e77 into master May 13, 2026
5 checks passed
Sign up for free to 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.

4 participants