Release 2.27.0#431
Merged
Merged
Conversation
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>
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)
Contributor
There was a problem hiding this comment.
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 invflow (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 intoargs(usingargs.get(1)for the first user argument). This is inconsistent with other commands/tests in this repo (which treatargsas only user-typed arguments) and breaks completion for/island donate hand <TAB>: with args like["hand", ""], the code returnshand/invsuggestions 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]" |
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)
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



No description provided.