Skip to content

Release 1.1.0 - #21

Merged
tastybento merged 10 commits into
masterfrom
develop
Aug 8, 2026
Merged

Release 1.1.0#21
tastybento merged 10 commits into
masterfrom
develop

Conversation

@tastybento

Copy link
Copy Markdown
Member

Release 1.1.0 — developmaster.

Two gameplay changes to claiming, plus a data-loss fix ported from AOneBlock that raises the minimum BentoBox version.

What's in it

#17 Confirm chunk claims before spending level credit
#18 Do not lose island progress when the server restarts
#19 Let islands choose who may claim chunks

🔺 Minimum BentoBox is now 3.22.0

#18 uses saveObjectNow(), which is 3.22.0 API, so addon.yml api-version went 3.13.0 → 3.22.0 and bentobox.version in the pom followed. Without the api-version bump the addon would load on an older core and then throw NoSuchMethodError at 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 — default true
  • chunkblock.claim.confirmation-timeout — default 15
  • island.save-every — default 10, was a hardcoded 50
  • CHUNKBLOCK_CLAIM_CHUNKS: 1000 in default-island-flags

Claim confirmation defaulting to true changes 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-confirm and protection.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

  • Team chunk-claim governance #6 stays open: the rank options are done, the team-proposal and team-vote options were deliberately left out.
  • MAGIC_BLOCK at ChunkBlock.java:128 still 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

tastybento and others added 10 commits July 29, 2026 21:25
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
@sonarqubecloud

sonarqubecloud Bot commented Aug 8, 2026

Copy link
Copy Markdown

@tastybento
tastybento merged commit 06524f8 into master Aug 8, 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.

1 participant