From eb7b629869ee3307b929d20296df3a5a06f51299 Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 29 May 2026 17:25:52 -0700 Subject: [PATCH 01/11] Pin MockBukkit to Maven Central 4.110.0 instead of jitpack snapshot The floating jitpack snapshot v1.21-SNAPSHOT resolves to an ephemeral git-described build whose jar/POM get evicted, breaking CI even on unchanged commits. Switch to the equivalent stable Maven Central coordinates (org.mockbukkit.mockbukkit:mockbukkit-v1.21:4.110.0). Co-Authored-By: Claude Opus 4.8 --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index b3192f9..46bf98e 100644 --- a/pom.xml +++ b/pom.xml @@ -54,7 +54,7 @@ 5.10.2 5.11.0 - v1.21-SNAPSHOT + 4.110.0 1.21.11-R0.1-SNAPSHOT 3.14.0-SNAPSHOT @@ -182,8 +182,8 @@ - com.github.MockBukkit - MockBukkit + org.mockbukkit.mockbukkit + mockbukkit-v1.21 ${mock-bukkit.version} test From 17a69c69cb90f1a3b984ba31b76cf6e5d94283d3 Mon Sep 17 00:00:00 2001 From: tastybento Date: Wed, 3 Jun 2026 08:18:09 -0700 Subject: [PATCH 02/11] Add MC 26.1.2 to Modrinth game-versions (#159) Co-authored-by: Claude Opus 4.8 --- .github/workflows/modrinth-publish.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/modrinth-publish.yml b/.github/workflows/modrinth-publish.yml index 3f8b753..911a8fd 100644 --- a/.github/workflows/modrinth-publish.yml +++ b/.github/workflows/modrinth-publish.yml @@ -89,6 +89,7 @@ jobs: 1.21.11 26.1 26.1.1 + 26.1.2 # Path to the built JAR — Maven produces Warps-.jar in target/ # Note: glob patterns are not supported; use the release tag directly. From ba08f817679d8cad633304f5174878eb98ee885f Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 27 Jun 2026 17:30:49 -0700 Subject: [PATCH 03/11] Add files via upload --- .github/workflows/publish.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/publish.yml diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..3ce15b3 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,19 @@ +# Warps — .github/workflows/publish.yml +# CurseForge-first rollout. Hangar left blank; add its slug later to enable Hangar. + +name: Publish release + +on: + release: + types: [published] + +jobs: + publish: + uses: bentoboxworld/.github/.github/workflows/publish-platforms.yml@main + with: + hangar_slug: "" + curseforge_id: "1514815" + game_versions: "26.1.2,26.1.1,26.1,1.21.11,1.21.10,1.21.9,1.21.8,1.21.7,1.21.6" + secrets: + HANGAR_API_KEY: ${{ secrets.HANGAR_API_KEY }} + CURSEFORGE_TOKEN: ${{ secrets.CURSEFORGE_TOKEN }} From beb6a40e198be0bb30a2e9d7b0b79925a2b3c696 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 28 Jun 2026 11:05:27 -0700 Subject: [PATCH 04/11] ci: add CurseForge publish workflow (publishes the release asset) (#160) Publish the jar attached to each GitHub release to CurseForge via the shared BentoBoxWorld/.github reusable workflow, downloading the release asset instead of rebuilding from source. Mirrors the BentoBox core setup. Co-authored-by: Claude Opus 4.8 (1M context) --- .github/workflows/publish.yml | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 3ce15b3..1812fb8 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,19 +1,30 @@ # Warps — .github/workflows/publish.yml -# CurseForge-first rollout. Hangar left blank; add its slug later to enable Hangar. +# Publishes the jar attached to a GitHub release to CurseForge (and Hangar once a +# slug is set) via the shared BentoBoxWorld/.github reusable workflow. It downloads +# the release asset rather than rebuilding from source, so a dependency-repo outage +# can't block publishing. Includes workflow_dispatch to (re)publish a given version. -name: Publish release +name: Publish release to CurseForge on: release: types: [published] + workflow_dispatch: + inputs: + version: + description: "Version to publish (e.g. 1.2.3)" + required: true + type: string jobs: publish: - uses: bentoboxworld/.github/.github/workflows/publish-platforms.yml@main + uses: bentoboxworld/.github/.github/workflows/publish-platforms.yml@master with: - hangar_slug: "" + use_release_asset: "true" # publish the jar attached to the release; do not rebuild + hangar_slug: "" # set the Hangar project slug to enable Hangar publishing curseforge_id: "1514815" - game_versions: "26.1.2,26.1.1,26.1,1.21.11,1.21.10,1.21.9,1.21.8,1.21.7,1.21.6" + game_versions: "26.2,26.1.2,26.1.1,26.1,1.21.11,1.21.10,1.21.9,1.21.8,1.21.7,1.21.6,1.21.5" + version: ${{ inputs.version }} # empty on release events -> falls back to the release tag secrets: HANGAR_API_KEY: ${{ secrets.HANGAR_API_KEY }} CURSEFORGE_TOKEN: ${{ secrets.CURSEFORGE_TOKEN }} From e063f07b30db492dcf8bf178059124c2fd3e9cbb Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 28 Jun 2026 11:17:12 -0700 Subject: [PATCH 05/11] ci: pin reusable workflow to SHA and enable Hangar publish Pin bentoboxworld/.github publish-platforms.yml to commit e0c5d98f5e6ef9ea7c9a28afad05f4c07bcde898 (Sonar githubactions:S7637) and set the Hangar slug so releases publish to Hangar alongside CurseForge. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/publish.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 1812fb8..adfd747 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,10 +1,10 @@ # Warps — .github/workflows/publish.yml -# Publishes the jar attached to a GitHub release to CurseForge (and Hangar once a -# slug is set) via the shared BentoBoxWorld/.github reusable workflow. It downloads -# the release asset rather than rebuilding from source, so a dependency-repo outage -# can't block publishing. Includes workflow_dispatch to (re)publish a given version. +# Publishes the jar attached to a GitHub release to CurseForge and Hangar via the +# shared BentoBoxWorld/.github reusable workflow. Downloads the release asset instead of +# rebuilding from source. The reusable workflow is pinned to a commit SHA (Sonar +# githubactions:S7637). workflow_dispatch lets you (re)publish a given version. -name: Publish release to CurseForge +name: Publish release to CurseForge and Hangar on: release: @@ -18,10 +18,10 @@ on: jobs: publish: - uses: bentoboxworld/.github/.github/workflows/publish-platforms.yml@master + uses: bentoboxworld/.github/.github/workflows/publish-platforms.yml@e0c5d98f5e6ef9ea7c9a28afad05f4c07bcde898 # master with: use_release_asset: "true" # publish the jar attached to the release; do not rebuild - hangar_slug: "" # set the Hangar project slug to enable Hangar publishing + hangar_slug: "Warps-for-BentoBox" # blank = skip Hangar curseforge_id: "1514815" game_versions: "26.2,26.1.2,26.1.1,26.1,1.21.11,1.21.10,1.21.9,1.21.8,1.21.7,1.21.6,1.21.5" version: ${{ inputs.version }} # empty on release events -> falls back to the release tag From 366e7549db062f4fcfe883ff67f0d408580c2869 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 28 Jun 2026 11:51:28 -0700 Subject: [PATCH 06/11] ci: bump pinned reusable workflow to 71bf927bce32586216baa6995f21852d944b98b9 Picks up the split into independent CurseForge and Hangar jobs so neither platform can block the other. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index adfd747..744167f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -18,7 +18,7 @@ on: jobs: publish: - uses: bentoboxworld/.github/.github/workflows/publish-platforms.yml@e0c5d98f5e6ef9ea7c9a28afad05f4c07bcde898 # master + uses: bentoboxworld/.github/.github/workflows/publish-platforms.yml@71bf927bce32586216baa6995f21852d944b98b9 # master with: use_release_asset: "true" # publish the jar attached to the release; do not rebuild hangar_slug: "Warps-for-BentoBox" # blank = skip Hangar From d03dab813cee253b26b79dc56c10a985076b2c4b Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 30 Jun 2026 23:15:41 -0700 Subject: [PATCH 07/11] ci: bump pinned reusable workflow to fe4b1f0 --- .github/workflows/publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 744167f..a25c22f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -18,7 +18,7 @@ on: jobs: publish: - uses: bentoboxworld/.github/.github/workflows/publish-platforms.yml@71bf927bce32586216baa6995f21852d944b98b9 # master + uses: bentoboxworld/.github/.github/workflows/publish-platforms.yml@fe4b1f03c19f4fd4212020a06a07a7097923adec # master with: use_release_asset: "true" # publish the jar attached to the release; do not rebuild hangar_slug: "Warps-for-BentoBox" # blank = skip Hangar @@ -27,4 +27,4 @@ jobs: version: ${{ inputs.version }} # empty on release events -> falls back to the release tag secrets: HANGAR_API_KEY: ${{ secrets.HANGAR_API_KEY }} - CURSEFORGE_TOKEN: ${{ secrets.CURSEFORGE_TOKEN }} + CURSEFORGE_TOKEN: ${{ secrets.CURSEFORGE_TOKEN }} \ No newline at end of file From de260885996b7d5ce4eabb66d976c2bc6765a157 Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 3 Jul 2026 11:53:38 -0700 Subject: [PATCH 08/11] ci: bump pinned publish-platforms.yml to ca2dcd1 --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a25c22f..6751715 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -18,7 +18,7 @@ on: jobs: publish: - uses: bentoboxworld/.github/.github/workflows/publish-platforms.yml@fe4b1f03c19f4fd4212020a06a07a7097923adec # master + uses: bentoboxworld/.github/.github/workflows/publish-platforms.yml@ca2dcd167e8db4e0f671a976080744dda43801a6 # master with: use_release_asset: "true" # publish the jar attached to the release; do not rebuild hangar_slug: "Warps-for-BentoBox" # blank = skip Hangar From c2e86a7b96e6c2675a5d240c47a7961d2934cb98 Mon Sep 17 00:00:00 2001 From: tastybento Date: Wed, 29 Jul 2026 09:08:04 -0700 Subject: [PATCH 09/11] ci: bump publish-platforms pin to the multipart-JSON fix The pinned SHA predates BentoBoxWorld/.github#13, which moved the CurseForge metadata and Hangar versionUpload JSON out of inline curl -F values and into files. curl treats a ';' in an inline -F value as the start of a type= attribute, so a release body containing a semicolon truncates the JSON and both platforms reject the upload. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01SAQ3YQkcfRoCZEwa6SPJcp --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 6751715..7415e44 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -18,7 +18,7 @@ on: jobs: publish: - uses: bentoboxworld/.github/.github/workflows/publish-platforms.yml@ca2dcd167e8db4e0f671a976080744dda43801a6 # master + uses: bentoboxworld/.github/.github/workflows/publish-platforms.yml@1f91a0edf72e8c86d671b3b8fdd3121ac6fb88e1 # master with: use_release_asset: "true" # publish the jar attached to the release; do not rebuild hangar_slug: "Warps-for-BentoBox" # blank = skip Hangar From 014d25819743429a5fc889d3c2ea0002c195109e Mon Sep 17 00:00:00 2001 From: tastybento Date: Wed, 29 Jul 2026 16:07:48 -0700 Subject: [PATCH 10/11] Notify the sign owner when a warp falls back to the sign block MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warpPlayer(world, user, owner) has two teleport paths: the normal one, used when the spot in front of the sign is safe, fires WarpInitiateEvent, respects vanished players, and tells the sign owner that someone warped to them; and a fallback, used when no safe spot in front exists, which teleported the visitor directly onto the sign's own block and did none of that. Owners silently missed warp visits whenever the fallback ran. The fallback is common on cramped islands — a ChunkBlock island starts as a single chunk, so warp signs often sit at the platform edge with void in front, which fails isSafeLocation and always takes the silent path. That is how this surfaced: owners got warp messages in AOneBlock but never in ChunkBlock. The fallback now routes through the same warpPlayer completion path as a normal warp, so the event, the vanish check, the sounds, and the owner notification behave identically wherever the visitor lands. The sign's facing is used for the arrival yaw, matching normal warps. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01Y7xSdVPS5vRu6wqf6XshRq --- .../warps/managers/WarpSignsManager.java | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/main/java/world/bentobox/warps/managers/WarpSignsManager.java b/src/main/java/world/bentobox/warps/managers/WarpSignsManager.java index 77e1747..48af539 100644 --- a/src/main/java/world/bentobox/warps/managers/WarpSignsManager.java +++ b/src/main/java/world/bentobox/warps/managers/WarpSignsManager.java @@ -384,9 +384,10 @@ public SignCacheItem getSignInfo(@NonNull World world, @NonNull UUID uuid) { } /** - * Warps a player to a spot in front of a sign. + * Warps a player to a spot in front of a sign, or to the sign block itself when no + * safe spot in front exists. * @param user - user who is warping - * @param inFront - location in front of sign - previously checked for safety + * @param inFront - warp destination - previously checked for safety * @param signOwner - warp sign owner * @param directionFacing - direction that sign is facing * @param pvp - true if this location allowed PVP @@ -475,9 +476,10 @@ public void warpPlayer(@NonNull World world, @NonNull User user, @NonNull UUID o } // Find out which direction the warp is facing Block b = warpSpot.getBlock(); + BlockFace directionFacing; if (Tag.WALL_SIGNS.isTagged(b.getType())) { org.bukkit.block.data.type.WallSign s = (org.bukkit.block.data.type.WallSign) b.getBlockData(); - BlockFace directionFacing = s.getFacing(); + directionFacing = s.getFacing(); Location inFront = b.getRelative(directionFacing).getLocation(); Location oneDown = b.getRelative(directionFacing).getRelative(BlockFace.DOWN).getLocation(); if ((plugin.getIslands().isSafeLocation(inFront))) { @@ -489,6 +491,7 @@ public void warpPlayer(@NonNull World world, @NonNull User user, @NonNull UUID o return; } } else if (Tag.ALL_HANGING_SIGNS.isTagged(b.getType())) { + directionFacing = BlockFace.DOWN; Location below = b.getRelative(BlockFace.DOWN).getRelative(BlockFace.DOWN).getLocation(); if ((addon.getIslands().isSafeLocation(below))) { warpPlayer(user, below, owner, BlockFace.DOWN, pvp); @@ -496,7 +499,7 @@ public void warpPlayer(@NonNull World world, @NonNull User user, @NonNull UUID o } } else if (Tag.STANDING_SIGNS.isTagged(b.getType())) { org.bukkit.block.data.type.Sign s = (org.bukkit.block.data.type.Sign) b.getBlockData(); - BlockFace directionFacing = s.getRotation(); + directionFacing = s.getRotation(); Location inFront = b.getRelative(directionFacing).getLocation(); if ((addon.getIslands().isSafeLocation(inFront))) { warpPlayer(user, inFront, owner, directionFacing, pvp); @@ -511,15 +514,10 @@ public void warpPlayer(@NonNull World world, @NonNull User user, @NonNull UUID o if (!(plugin.getIslands().isSafeLocation(warpSpot))) { user.sendMessage("warps.error.not-safe"); } else { - final Location actualWarp = new Location(warpSpot.getWorld(), warpSpot.getBlockX() + 0.5D, warpSpot.getBlockY(), - warpSpot.getBlockZ() + 0.5D); - if (pvp) { - user.sendMessage("protection.flags.PVP_OVERWORLD.enabled"); - user.getWorld().playSound(Objects.requireNonNull(user.getLocation()), Sound.ENTITY_ARROW_HIT, 1F, 1F); - } else { - user.getWorld().playSound(Objects.requireNonNull(user.getLocation()), Sound.ENTITY_BAT_TAKEOFF, 1F, 1F); - } - Util.teleportAsync(user.getPlayer(), actualWarp, TeleportCause.COMMAND); + // Fall back to the sign's own block, but through the same path as a normal + // warp so that the initiate event fires, vanished players stay hidden, and + // the sign owner is told that someone warped to them + warpPlayer(user, warpSpot, owner, directionFacing, pvp); } } From 37e4720123bc82a1b2549edca981cb74b0c55a4b Mon Sep 17 00:00:00 2001 From: tastybento Date: Wed, 29 Jul 2026 16:57:36 -0700 Subject: [PATCH 11/11] Update build version from 1.19.0 to 1.19.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 46bf98e..883701b 100644 --- a/pom.xml +++ b/pom.xml @@ -64,7 +64,7 @@ -LOCAL - 1.19.0 + 1.19.1 BentoBoxWorld_Warps bentobox-world