An F1‒style ice boat racing plugin for Bukkit/Spigot (compatible with Paper/Purpur) with a clean, vanilla‒like GUI. Manage teams, configure tracks with the built‒in BoatRacing selection tool, run timed races with checkpoints, pit area penalties, and a guided setup wizard.
Status: Public release (1.0.9)
See the changelog in CHANGELOG.md.
This is how to test the plugin to validate its behavior after each update: see the QA checklist in CHECKLIST.md
Compatibility and fixes:
Updater cadence:
updates.console-warn).Improvements and toggles:
racing.ui.scoreboard.show-position|show-lap|show-checkpoints|show-pitstops|show-nameracing.ui.actionbar.show-lap|show-checkpoints|show-pitstops|show-timeracing.mandatory-pitstops > 0, show “PIT A/B” on the sidebar and “Pit A/B” in the ActionBar (gated by the toggles above).racing.registration-announce)./boatracing setup setpitstops <n> sets and persists racing.mandatory-pitstops.boatracing.*. Admins still get absolutely all plugin permissions, now by explicit children under boatracing.admin to avoid circular inheritance.join|leave|status under /boatracing race; admin-only verbs (open|start|force|stop) are suggested only to admins.Updater:
updates.console-warn).Bugfixes and quality-of-life:
Console update check noise removed: only a single WARN shortly after startup when you are outdated (respecting updates.console-warn). Periodic 5‑minute checks remain but are silent.
Stability: network errors during update checks are logged at most once per server run.
Removal:
UI:
Improvements and tweaks:
racing.lights-out-jitter-seconds.Fixes and polish:
/boatracing setup setpit [team] accepts team names with spaces when quoted (e.g., "/boatracing setup setpit "Toast Peace""); tab‑completion suggests quoted names when the input starts with a quote./boatracing reload, new default keys are merged into your existing config.yml without overwriting your changes./boatracing setup setpit [team] sets the default pit when no team is provided, or the pit for a specific team when a team name is given. Tab‑completion suggests team names.racing.mandatory-pitstops config (default 0). When > 0, racers must complete at least that many pit exits before they are allowed to finish; pitstops are counted on exiting the pit area and persist for the whole race.config.yml keys are merged into your existing file without overwriting your changes.join, leave, and status by default; only open|start|force|stop remain admin‑only. Removed extra runtime checks that could block players with permissive defaults./boatracing setup setpos <player> <slot|auto> and /boatracing setup clearpos <player>. On race start, players bound to a slot are placed there first; remaining racers are ordered by their best recorded race time on that track (fastest first), and racers without a time are placed last.Admin Tracks GUI: manage multiple named tracks — Create and select, Delete (with confirmation), and Reapply selected. Requires boatracing.setup.
Admin Race GUI: manage race lifecycle from a GUI — open/close registration, start/force/stop, quick-set laps, remove registrants, and handy setup tips.
Terminology: “loaded” → “selected”; “pit lane” → “pit area”.
All track configuration lives per‑track under plugins/BoatRacing/tracks/<name>.yml.
track.yml (if present) is migrated automatically to tracks/default.yml (with in‑game admin notice).Setup Wizard UX: concise, colorized, clickable. Adds a Laps step and an explicit Finish button; navigation buttons now use emojis (⟵, ℹ, ✖) and the blank line is placed at the top of the block for readability.
Selection tool: built‑in wand (Blaze Rod). Left‑click = Corner A, right‑click = Corner B. Richer /boatracing setup selinfo diagnostics.
Race commands now require a track argument: open|join|leave|force|start|stop|status <track>.
Race lifecycle: “race stop” cancels registration and any running race for that track. Starts enforce unique grid slots, face forward (pitch 0), and auto‑mount racers into their selected boat. “force” and “start” use only registered participants.
Tab‑completion: for race subcommands that take <track> (including status), it suggests existing track names.
Admin Tracks GUI: after creating a track, sends a clickable tip to paste /boatracing setup wizard in chat.
Messages remain English‑only; denial texts are hardcoded.
Start lights + false starts: configure exactly 5 Redstone Lamps and enjoy an F1-style left-to-right light-up countdown (no redstone wiring needed). Moving forward during the countdown (false start) applies a configurable time penalty.
Race permissions: split by subcommand. Players can join, leave, and status by default; admin actions open|start|force|stop require boatracing.race.admin (or boatracing.setup).
Pit area and checkpoints are now optional. Track readiness only requires at least one start slot and a finish line; the wizard labels Pit area and Checkpoints as “(optional)” and lets you skip them.
Removed “Save as…” from the Tracks GUI (create/select, delete, and reapply remain).
New: live in‑race scoreboard per participant showing Lap, Checkpoints, and Elapsed Time.
New: crossing the pit area counts as finish for lap counting once all lap checkpoints are completed (still applies pit penalty when enabled).
plugins/BoatRacing/tracks/ (no central track.yml).Supported servers
plugins/ folder./boatracing teams to open the main GUI.Use the BoatRacing selection tool to make cuboid selections (left-click = mark Corner A, right-click = mark Corner B). The tool item is a Blaze Rod named "BoatRacing Selection Tool".
/boatracing setup help — lists setup commands/boatracing setup wand — gives you the BoatRacing selection tool/boatracing setup setfinish — set the finish line region from your current selection/boatracing setup setpit [team] — set the default pit area from your current selection, or the pit area for a specific team when a team is provided (tab‑complete team names)/boatracing setup addcheckpoint — add a checkpoint in order (A → B → C …)/boatracing setup clearcheckpoints — remove all checkpoints/boatracing setup addlight — add the Redstone Lamp you’re looking at as a start light (exactly 5; order left→right)/boatracing setup clearlights — remove all start lights/boatracing setup addstart — add your current position as a start slot (order matters)/boatracing setup clearstarts — remove all start slots/boatracing setup setpos <player> <slot|auto> — bind a player to a specific start slot (1‑based) or use auto to remove the binding/boatracing setup clearpos <player> — remove a player’s custom start slot/boatracing setup setpitstops <n> — set the number of mandatory pitstops (0 disables the requirement)/boatracing setup show — show a summary of the current track config (includes team‑specific pits and count of custom start positions)
(includes the active track name if saved/loaded from Admin Tracks GUI)/boatracing setup selinfo — debug info about your current selection/boatracing setup wizard (single entrypoint)The wizard provides concise, colorized instructions with clickable actions. Steps: Starts → Finish → Start lights (5 required) → Pit area (optional) → Checkpoints (optional) → Mandatory pit stops (optional) → Laps → Done. The Starts step also includes optional buttons to set per‑player custom start slots (setpos/clearpos/auto) and shows the count of custom slots configured. The new “Mandatory pit stops” step shows your current value and quick options [0] [1] [2] [3]. On completion, the wizard prints a Summary that includes “Custom slots N”. It does not auto‑start races; the final prompt suggests opening registration for the currently selected track. Use /boatracing setup wand to get the selection tool.
Notes:
/boatracing race help — lists race commands/boatracing race open <track> — open a registration window on the selected track and broadcast it/boatracing race join <track> — join the registration (you must be in a team)/boatracing race leave <track> — leave the registration/boatracing race force <track> — force start immediately with the registered participants (requires at least one registered)/boatracing race start <track> — start now with the registered participants (requires registration)/boatracing race stop <track> — stop and announce results; also cancels registration if still open/boatracing race status <track> — current race/registration status for that trackRace logic highlights:
racing.mandatory-pitstops > 0, racers must complete at least that many pit exits during the race before they are allowed to finish.racing.laps) and/or the track’s saved setting; open and start don’t accept a laps argument.teams, race, setup, reload, version, admin (filtered by permissions)create, rename, color, join, leave, boat, number, confirm, cancel (rename/color are admin‑only via command; GUI for members can be enabled via config). Disband is not exposed as a player command; it’s a GUI action when enabled.help, wand, wizard, addstart, clearstarts, setfinish, setpit, addcheckpoint, clearcheckpoints, addlight, clearlights, setpos, clearpos, show, selinfosetpos suggests player names, plus auto and slot numbers; clearpos suggests player names.join, leave, and status; admins also see open, start, force, stop. When a subcommand expects <track>, tab‑completion lists existing track names.color lists all DyeColorsboat lists allowed boat types (normal first, then chest variants)join suggests existing team namesAdmins (permission boatracing.admin) can:
Open Admin GUI: /boatracing admin
boatracing.setup): create named tracks (Create auto‑loads and suggests the setup wizard), load an existing track, delete with confirmation, and reapply selected.Command alternatives:
/boatracing admin team create <name> [color] [firstMember]/boatracing admin team delete <name>/boatracing admin team rename <old> <new>/boatracing admin team color <name> <DyeColor>/boatracing admin team add <name> <player>/boatracing admin team remove <name> <player>/boatracing admin player setteam <player> <team|none>/boatracing admin player setnumber <player> <1-99>/boatracing admin player setboat <player> <BoatType>boatracing.* (default: false) — wildcard that grants ALL BoatRacing permissionsboatracing.use (default: true) — meta permission; grants boatracing.teams and boatracing.versionboatracing.teams (default: true) — access to /boatracing teamsboatracing.version (default: true) — access to /boatracing versionboatracing.reload (default: op) — access to /boatracing reloadboatracing.update (default: op) — receive in‑game update noticesboatracing.setup (default: op) — configure tracks and selections (wizard, lights, starts, finish, pit, checkpoints)boatracing.admin (default: op) — admin GUI and commands (manage teams and players). Grants all plugin permissions via explicit children (no circular wildcard). Also enables root tab‑completion for admin.
boatracing.setup to open from the Admin panel.Race‑specific permissions:
boatracing.race.join (default: true) — join a registrationboatracing.race.leave (default: true) — leave a registrationboatracing.race.status (default: true) — view race status for a trackboatracing.race.admin (default: op) — manage races: /boatracing race open|start|force|stop <track>Players without boatracing.setup can use /boatracing race join <track>, /boatracing race leave <track>, and /boatracing race status <track> during an open registration (granted by the default‑true permissions above).
prefix: message prefixmax-members-per-team: maximum players in a teamplayer-actions.*: flags to allow/deny non‑admin players to:
allow-team-create (default true)allow-team-rename (default false) — when true, members can rename their team from the Team GUI (commands remain admin‑only)allow-team-color (default false) — when true, members can change their team color from the Team GUI (commands remain admin‑only)allow-team-disband (default false) — when true, members can disband their own team from the Team GUI. The Disband icon is hidden when not allowed.allow-set-boat (default true)allow-set-number (default true)
Denial messages are hardcoded in English; they are not configurable.bstats.enabled: true|false (bStats plugin-id is fixed)updates.enabled: enable update checksupdates.console-warn: WARN in console when outdatedupdates.notify-admins: in‑game update notices for admins (boatracing.update)racing.laps: default race laps (int, default 3)racing.mandatory-pitstops: required pit exits to be allowed to finish (int, default 0 = disabled)racing.pit-penalty-seconds: time penalty applied on pit entry (double, default 5.0)racing.registration-seconds: registration window length (seconds, default 300)racing.false-start-penalty-seconds: time penalty applied for a false start during the light countdown (double, default 3.0)racing.enable-pit-penalty: enable/disable pit area time penalty (boolean, default true)racing.enable-false-start-penalty: enable/disable false start penalty (boolean, default true)racing.lights-out-delay-seconds (since 1.0.6): delay between all 5 start lights lit and “lights out”/GO (seconds, default 1.0)updates.console-warn). Admin join shows an in‑game chat notice (if enabled) and does not print to console.plugins/BoatRacing/teams.ymlplugins/BoatRacing/racers.ymlplugins/BoatRacing/tracks/<name>.yml (managed via Admin Tracks GUI). Includes: starts, finish, pitlane, teamPits, checkpoints, start lights, and now customStartSlots and bestTimes (per‑player).Legacy migration: if a legacy plugins/BoatRacing/track.yml is found on startup, it is migrated to plugins/BoatRacing/tracks/default.yml (or default_N.yml) and the old file is removed when possible. Admins with boatracing.setup get an in‑game notice.
BoatRacing.jar shaded. Run mvn -DskipTests clean package.Distributed under the MIT License. See LICENSE.