Skip to content

Release 0.1.1 - #3

Merged
tastybento merged 5 commits into
mainfrom
develop
Aug 8, 2026
Merged

Release 0.1.1#3
tastybento merged 5 commits into
mainfrom
develop

Conversation

@tastybento

Copy link
Copy Markdown
Member

A single bug fix release: the respawn loaner boat could not be traded from.

The respawn loaner is your boat, not a hull in your pocket. Die, respawn at the port, get handed the harbourmaster's bamboo raft — and every trader refuses you, "no ship at this quay". The raft was created unowned whenever you still had an active boat far away, on the reasoning that boarding it is what abandons the old one. But trade transacts against the active boat record, so an unowned hull in the pack is not a hold at all; it only became yours once you placed it and got in.

The loaner is now active and owned the moment it is handed over, and the wreck's hull is demoted to your OLD BOAT — still charted, cargo aboard, still yours to row back out and reclaim. A new locale line (boat.respawn-given-replacing) says exactly that.

Taking ownership is destructive to whatever you had, so one guard came with it: a keepInventory death leaves the real boat in your pack, and the loaner must not demote a boat you are holding, cargo and all. No raft is lent in that case.

Also here:

  • A test that was passing for the wrong reason. CommonTestSetup's shared mock Location answers 0.0 to every distanceSquared and its world name was unstubbed, so "my boat is an ocean away" and "my boat is at my feet" were the same test. The respawn tests now use a real location and let distance decide.
  • deploy.sh no longer hardcodes the version, which is what broke the copy on the bump. It takes whatever package built and clears stale TradeWinds-*.jar from the addons folder first, since two versions load as two addons over one world.

600 tests green. No hold, boat or ocean model change, so existing worlds and databases carry over untouched.

🤖 Generated with Claude Code

https://claude.ai/code/session_014as2obVi1QJj8CRTSqXBRr

tastybento and others added 5 commits August 8, 2026 09:47
Playtest: died, respawned at the port, was handed the bamboo raft - and
every trader refused: "no ship at this quay". The raft was created UNOWNED
whenever the player still had an active boat far away, on the reasoning
that boarding it is what abandons the old one. But trade transacts against
the ACTIVE boat record, so an unowned hull in the pack is not a hold at
all; it only became theirs after placing it and getting in.

grantRespawnBoat now always uses BoatService.createFor, so the loaner is
active and owned the moment it is handed over and the wreck's hull is
demoted to an OLD BOAT - still charted, cargo aboard, still theirs to row
back out and reclaim. New locale boat.respawn-given-replacing says so.

Taking ownership is destructive to whatever they had, so a keepInventory
death - where the real boat never left the pack - must not trigger it, or
the raft demotes a boat they are holding, cargo and all. stillHasTheirBoat
skips the grant there.

testBoatWithinReachMeansNoLoaner had been passing for the wrong reason:
CommonTestSetup's shared mock Location answers 0.0 to every
distanceSquared and world.getName() is unstubbed, so "an ocean away" and
"at my feet" were the same test. Stub a world name and a real location.

Version 0.1.1 - and deploy.sh no longer hardcodes it, which is what broke
the copy. It takes whatever package built and clears stale TradeWinds jars
from the addons folder first, since two versions load as two addons.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014as2obVi1QJj8CRTSqXBRr
The house workflow from GushBlock/Border, adapted to this repo. Two
differences worth knowing:

GIT_BRANCH=origin/main, not origin/master. The pom's release profile
activates on the branch we actually release from; point it at master and
every build stays a SNAPSHOT and the upload cannot find its file.

Tests RUN here. GushBlock skips them because the patched MockBukkit it
needs is published nowhere; ours ships inside the repo under libs/, so a
bare checkout tests green and the artifact we publish is the artifact we
tested.

A guard step sits between the two: the jar is named from the pom's
build.version and the upload from the release TAG, so a v-prefixed tag or
a forgotten version bump used to surface as a bare "file not found". It
now says which jar was expected, lists what was built, and names the
cause.

game-versions lists only 26.2 - the one version TradeWinds is tested on,
and what the release notes promise. The compile floor is far lower (clean
against paper-api 1.21.10; only the dialog API, Minecraft 1.21.6, breaks
below that), so the list can widen as older versions are actually played.

MODRINTH_TOKEN and MODRINTH_PROJECT_ID are already set as repo secrets.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014as2obVi1QJj8CRTSqXBRr
Ben: widen the Modrinth game versions. 26.2, 26.1.2, 26.1.1, 26.1 - the
same list the other 26.2-era addons publish, so the version strings are
known-good at Modrinth's end.

The sources compile clean against paper-api 26.1.2 as well as 26.2
(checked, not assumed), so nothing of ours needs 26.2.

It stops at 26.1 rather than following our own compile floor down to
Minecraft 1.21.6, because that floor was never the binding one: BentoBox
3.18.1, which addon.yml requires, ships Java 25 bytecode (class major 69)
like paper-api 26.x, while every 1.21.x paper-api is Java 21 (major 65).
A 1.21.x server would have to run a Java 25 JVM before BentoBox could
load at all, and BentoBox is built against the 26.x API besides. Our
compiler only ever proved TradeWinds touches no 26.x-only Bukkit API.

Only 26.2 is playtested; the rest is a compile-level claim, and the
comment says so.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014as2obVi1QJj8CRTSqXBRr
Ben uploaded TradeWinds to CurseForge. This is the house publish.yml -
the shared BentoBoxWorld/.github reusable workflow, same as BentoBox core,
Border and AcidIsland - pinned to master's current HEAD (1f91a0ed, the
same SHA those two use; GushBlock's pin is older).

It publishes the jar ATTACHED to the GitHub release rather than
rebuilding, so a dependency-repo outage cannot block a release that
already has a working jar. The 0.1.0 release carries TradeWinds-0.1.0.jar,
so that path is proven for this repo.

Hangar is left blank (= skipped): HANGAR_API_KEY exists org-wide, but
there is no hangar.papermc.io/BentoBoxWorld/TradeWinds project yet. One
line to enable when there is.

game_versions stays the 26.x family, matching modrinth-publish.yml rather
than the longer 1.21.x list the other addons carry - BentoBox 3.18.1 is
Java 25 bytecode and cannot load on a 1.21.x server's Java 21 runtime.

CURSEFORGE_TOKEN is an ORGANISATION secret, already available here, so
nothing more needs adding.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014as2obVi1QJj8CRTSqXBRr
hangar.papermc.io/BentoboxWorld/TradeWinds now exists, so the slug goes in
and HANGAR_API_KEY (an organisation secret, already available here) is
passed through. Both platforms publish from the same release event.

hangar_owner stays at the reusable workflow's default, "BentoBoxWorld".
Hangar's API reports the namespace as "BentoboxWorld" - lower-case b - for
TradeWinds AND for Border, AcidIsland and bentobox, all of which publish
with the default spelling, so the lookup is case-insensitive. The comment
says as much, because the casing looks like a typo and is not.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014as2obVi1QJj8CRTSqXBRr
@sonarqubecloud

sonarqubecloud Bot commented Aug 8, 2026

Copy link
Copy Markdown

@tastybento
tastybento merged commit e5c1a82 into main 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