Release 1.1.0 - #21
Merged
Merged
Conversation
curseforge_id 1512493 was AOneBlock's project id, left over when the workflow was copied — publishing ChunkBlock releases sent the jar to AOneBlock's CurseForge page (the stray file has been archived there). ChunkBlock has no CurseForge or Hangar project yet, so both ids are now blank, which makes the shared workflow skip those platforms. The TODO in the file lists what to fill in once the projects exist. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Y7xSdVPS5vRu6wqf6XshRq
Hitting the border spent the island's levels on the first swing, so a stray click near the frontier could cost a chunk's worth of credit with no way back. Claiming is now two deliberate gestures: the first hit outlines the target chunk and quotes its price, and only a second hit made while sneaking pays for it. A hit that could not claim anyway (no credit, beyond the protection range, not adjacent) skips the preview and gives the same feedback as before, so players are only asked to confirm a purchase that would actually go through. Sneaking, rather than simply hitting twice, is what separates the confirming gesture from an ordinary swing: mining cadence puts a second hit ~250ms after the first, which would confirm on its own. A short arming delay sits underneath that because one physical swing can raise both LEFT_CLICK_AIR and LEFT_CLICK_BLOCK on the same tick, and without it that single swing would preview and pay at once. The outline lives in BorderDisplay and rides the existing redraw task, so it persists for the whole confirmation window and expires by itself rather than needing a scheduler of its own. Quotes are bound to island, chunk and time: aiming elsewhere re-prices, an expired window re-prices, and logging out drops the pending claim. Repeat swings at the same chunk reuse the existing feedback throttle so the quote is announced once, not once per blow; that throttle never stamped its timestamp on the first message, which is fixed here too. Configurable via chunkblock.claim.require-confirmation (default true) and chunkblock.claim.confirmation-timeout (15s), so servers preferring the old one-hit claim can switch it off. Part of #6 (the confirmation step only; rank-based claim permission is still to come). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Taa2snoHkvtcZ6e5rAHDQS
Ported from AOneBlock, which this addon is forked from and shares the bug with verbatim - same code, same line numbers. See BentoBoxWorld/AOneBlock#550. A player breaking blocks and then sitting through a restart would come back to their block count rolled back to the last checkpoint - up to 49 blocks of progress gone, repeatedly, on every restart. The shutdown save was queued, not written. onDisable() called saveCache(), which uses saveObjectAsync(), and this addon is a Pladdon: the server disables it before BentoBox, so the write landed in a queue that BentoBox had to drain on its way out. BentoBox 3.22.0 added that drain (flushAll), but every earlier version discarded it silently. Write directly on shutdown instead, via a new saveCacheNow() using saveObjectNow(). That removes the dependency on core behaviour entirely rather than relying on a specific BentoBox version getting it right. saveObjectNow() is BentoBox 3.22.0 API, so bump the dependency and raise api-version to match. Without the api-version bump the addon would still load on an older core and throw NoSuchMethodError at shutdown, which is worse than the bug being fixed. It now refuses to load with "Please update BentoBox". Also make the periodic save interval configurable as island.save-every, defaulting to 10 rather than the hardcoded 50. Nothing helps if the server is SIGKILLed, but this caps what an unclean kill can cost at 9 blocks. Test notes: the BentoBox bump broke the same 5 PhasesPanelTest tests it broke in AOneBlock, at the same line numbers. None were regressions - all called when(user.getTranslation(...)) on a real User rather than a mock, which stubs nothing on the User and instead attaches to whichever mock the real method last touched. 3.22.0's getTranslation(World, ...) calls getIWM().getAddon() first, moving the target. Ported the stubTranslation() helper that stubs the LocalesManager these actually read from. The same pattern remains elsewhere in that class and is worth a follow-up sweep. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014t1DSo2wMbTWZLcwXpwUmQ
The preview outline computed its particle coordinates with int arithmetic before widening to the double parameters, which Sonar reports as a reliability bug. Hold the chunk origin as a double so the whole expression is double, and fold the half-block offset into the base height rather than recomputing it per row. Also in the tests: use the Component overload of PlayerQuitEvent instead of the String one, which is deprecated for removal, and hoist an inline mock into a local. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Taa2snoHkvtcZ6e5rAHDQS
Claiming was hard-coded to the island owner, and a teammate who hit the border got nothing back at all — no message, no sound — which reads as a broken mechanic rather than as a permission. Who may spend the island's level credit is now the CHUNKBLOCK_CLAIM_CHUNKS protection flag, so an island can open expansion to sub-owners, members, trusted or coop through the ordinary island settings GUI, and servers can move the default in default-island-flags. The flag defaults to owner rank, so nothing changes until an island says otherwise. A teammate below the rank is now told why instead of being ignored. Visitors and passers-by still get nothing: they see the ordinary locked-chunk message from the guard listener, and another island's credit is none of their business. The guard listener carried the same hard-coded owner check, so a teammate bumping into the border never saw the claim hint even on an island that had opened claiming to them. It now asks the same flag. Both listener tests move from mocking ChunkBlock to spying on a real one: a mock leaves the final flag fields null, and BossBarListenerTest already establishes the spy pattern for exactly this reason. Part of #6. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Taa2snoHkvtcZ6e5rAHDQS
Confirm chunk claims before spending level credit
Let islands choose who may claim chunks
BentoBox 3.18.0 onwards is compiled for Java 25 (Minecraft 26.x), so its class files are version 69. A JDK 21 javac cannot parse those at all, and the build dies with "class file has wrong version 69.0, should be 65.0" against every BentoBox type before it reaches any of our code. This only surfaces once the dependency moves to 3.22.0, as it does in this branch. It did not show up locally because the dev machine is already on JDK 25 - the compiler reads the newer class files happily and <release>21</release> still emits Java 21 bytecode, which is what the addon ships. The addon's own target is unchanged: still Java 21 via <release> in the pom. Only the JDK doing the compiling moves. Also moves setup-java to v4 and the 'adopt' distribution to 'temurin', since neither v3 nor adopt offers a Java 25 build. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014t1DSo2wMbTWZLcwXpwUmQ
fix: do not lose island progress when the server restarts
|
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.



Release 1.1.0 —
develop→master.Two gameplay changes to claiming, plus a data-loss fix ported from AOneBlock that raises the minimum BentoBox version.
What's in it
🔺 Minimum BentoBox is now 3.22.0
#18 uses
saveObjectNow(), which is 3.22.0 API, soaddon.ymlapi-versionwent 3.13.0 → 3.22.0 andbentobox.versionin the pom followed. Without the api-version bump the addon would load on an older core and then throwNoSuchMethodErrorat shutdown — worse than the bug it fixes. With it, BentoBox declines to load and says to update.This is the one thing in the release that can strand a server, so it leads the release notes.
⚙️ New config
chunkblock.claim.require-confirmation— defaulttruechunkblock.claim.confirmation-timeout— default15island.save-every— default10, was a hardcoded 50CHUNKBLOCK_CLAIM_CHUNKS: 1000indefault-island-flagsClaim confirmation defaulting to
truechanges how claiming feels on an existing server mid-season. That is the intended default — it removes the "one misclick spent my levels" failure — and it is called out in the release notes with the opt-out.🔡 New locale keys
chunkblock.chunks.claim-confirmandprotection.flags.CHUNKBLOCK_CLAIM_CHUNKS.{name,description,hint}. en-US only; other locales show the raw key until synced.Verification
627 tests green on
develop. The claim confirmation and rank flag were tried on a live Paper 26.2 server with BentoBox 3.22.0 and Level 2.28.1, alongside AOneBlock.Note from #18's own description: that port was verified by its test suite but not boot-tested on a real server — the equivalent AOneBlock change was checked on two servers and the code is identical, but a smoke test of 1.1.0 as a whole before merging would be sensible.
Still open
MAGIC_BLOCKatChunkBlock.java:128still uses an unprefixed flag ID that AOneBlock likely also registers — the same duplicate-ID class of bug that got the other flags renamed in 1.0.1. Wants its own issue; not in this release.Draft release notes are prepared on GitHub against tag
1.1.0.🤖 Generated with Claude Code
https://claude.ai/code/session_01Taa2snoHkvtcZ6e5rAHDQS