Race
Languages: English · Français
Build timed race tracks and run multiplayer races on foot, by boat or in an elytra: sign up, wait for the synchronized countdown, chain the checkpoints and chase the record.
✨ Features
- Tracks built 100% in-game: a start, ordered checkpoints (the last checkpoint = the finish line), each with a configurable radius.
- Three vehicle types — on foot, boat, or elytra (with a configurable number of rockets) — chosen per track in a settings GUI.
- Multiplayer races: players sign up with /race join; the race auto-starts after a delay (or an admin forces it), with a synchronized countdown then a simultaneous GO.
- Live HUD: chronometer + speed (km/h), a per-checkpoint title showing the time gap with the racer just ahead, and a "back to last checkpoint" compass.
- Checkpoints required in order, or optional (reaching the finish is enough) — per track.
- Records & leaderboard per track: best times, average time (cached, refreshed every 6h) and your personal rank, all shown by /race info.
- Track preview: particles + holograms (green start, cyan checkpoints, orange finish), toggled with /race show and /race hide.
- Settings GUI: rename, vehicle, rockets, checkpoints required/optional, spectator-on-finish, entity collisions on/off.
- Rank money reward via Vault (works with any economy plugin): (racers - rank + 1) × coefficient.
- Full FR/EN localization (lang/fr.yml, lang/en.yml).
Installation
- Drop Race-<version>.jar into the server's plugins/ folder.
- Restart the server (Paper 1.21+, Java 21). Optional soft-dependencies: PlaceholderAPI, Vault (+ any economy plugin) for placeholders and money rewards.
- config.yml, lang/fr.yml, lang/en.yml and tracks.yml are generated on first launch.
️ Usage
Admin — create & configure a track (100% in-game):
- /race create <name>
- Stand at the start, then /race setstart <name>
- /race cp add <name> [radius] for each checkpoint — the last one is the finish line
- /race settings <name> → pick the vehicle (on foot / boat / elytra), rockets and options
- Once complete (start + finish), the track is ready to race.
Player — race:
- Run /race list and pick a track.
- /race join <name> to sign up; the race starts after the countdown (or an admin's /race start).
- /race leave to forfeit.
Commands & Permissions
Command
/race (alias
/r). Permissions:
race.play (default
true) ·
race.admin (default
op).
Players (
race.play):
| /race list |
List the tracks (opens the menu in-game) |
| /race join <name> |
Join / sign up for a race |
| /race leave |
Leave / forfeit the race |
| /race info <name> |
Track details (records, average, your best) |
| /race support |
Get the support Discord link |
Admins (
race.admin):
| /race create <name> |
Create a track |
| /race delete <name> |
Delete a track |
| /race setstart <name> |
Set the start at your position |
| /race cp <add|move|delete|list> <name> [value] |
Manage a track's checkpoints (last = finish) |
| /race tp <name> |
Teleport to a track's start |
| /race settings <name> |
Settings menu (name, vehicle, rockets, options) |
| /race show <name> | /race hide |
Enable / hide the track preview |
| /race resettimes <name> |
Clear a track's times and record |
| /race start [name] | /race stop [name] |
Force an immediate start / stop the race |
| /race reload |
Reload the config and messages |
⚙️ Configuration
Excerpt from
config.yml (English keys & comments; only player-facing values follow the server language):
Code (Text):
# Message language: "fr" or "en" (files customizable in plugins/Race/lang/).
language: fr
prefix: "<gradient:#1e90ff:#00bfff><bold>Race</bold></gradient> <dark_gray>»</dark_gray> "
# Default radius (blocks) of a checkpoint / the finish line.
default-checkpoint-radius: 3.0
# Vault money reward by rank: (numberOfPlayers - rank + 1) * coefficient. 0 disables it.
reward-coefficient: 10.0
default-elytra-rockets: 16 # rockets given for an elytra race
auto-start-delay-seconds: 120 # auto-start delay after the first sign-up
countdown-seconds: 3 # start countdown (TP + release)
detection-interval-ticks: 2 # progress checks (checkpoints / finish)
checkpoint-gap-display-seconds: 1 # time-gap title duration (0 disables)
Compatibility
- Vault (optional): rank money rewards on finish, with any Vault economy (EssentialsX, CMI…). Set reward-coefficient: 0 to disable.
- PlaceholderAPI (optional): placeholders %race_in_race%, %race_record_<track>%, %race_active_track%, %race_track_count% for scoreboards, tablists and chat.
- Standalone: runs on any Paper 1.21+ server — no other plugin required.
API
Loose coupling through the
ServicesManager (no compile-time dependency on the Race jar):
Code (Text):
var reg = Bukkit.getServicesManager().getRegistration(RaceApi.class);
if (reg != null) {
RaceApi api = reg.getProvider();
api.getGames().forEach(g -> getLogger().info(g.displayName() + " : " + g.status()));
api.join(player, "track1");
}
RaceApi exposes
getGames(),
join(player, id),
isInGame(uuid) and
leaveCommand(); each game is a
RaceGame(id, displayName, status, players, joinable). Listen to the custom events:
Code (Text):
@EventHandler
public void onEnd(RaceEndEvent event) {
getLogger().info("Race finished on " + event.getTrack() + " — winner: " + event.getWinner());
}
(
RaceStartEvent exposes
getTrack() /
getPlayers().)
Contributing
━━━━━━━━━━━━━━━━━━━━
Race (Français)
Langues : English · Français
Crée des parcours chronométrés et lance des courses multijoueurs à pied, en bateau ou en élytra : inscris-toi, attends le décompte synchronisé, enchaîne les checkpoints et bats le record.
✨ Fonctionnalités
- Parcours créés 100 % en jeu : un départ, des checkpoints ordonnés (le dernier checkpoint = la ligne d'arrivée), chacun avec un rayon configurable.
- Trois types de véhicule — à pied, en bateau ou en élytra (avec un nombre de fusées configurable) — choisis par parcours dans un menu de réglages.
- Courses multijoueurs : on s'inscrit avec /race join ; la course démarre automatiquement après un délai (ou un admin la force), avec un décompte synchronisé puis un GO simultané.
- HUD en direct : chronomètre + vitesse (km/h), un titre à chaque checkpoint affichant l'écart de temps avec le concurrent juste devant, et une boussole « retour au dernier checkpoint ».
- Checkpoints obligatoires dans l'ordre, ou optionnels (atteindre l'arrivée suffit) — par parcours.
- Records & classement par parcours : meilleurs temps, temps moyen (mis en cache, recalculé toutes les 6 h) et ta position personnelle, le tout via /race info.
- Prévisualisation du parcours : particules + hologrammes (départ vert, checkpoints cyan, arrivée orange), activée avec /race show et /race hide.
- Menu de réglages : renommer, véhicule, fusées, checkpoints obligatoires/optionnels, spectateur à l'arrivée, collisions entre entités activées/désactivées.
- Récompense en argent au classement via Vault (fonctionne avec n'importe quelle économie) : (nbCoureurs - rang + 1) × coefficient.
- Localisation FR/EN complète (lang/fr.yml, lang/en.yml).
Installation
- Déposer Race-<version>.jar dans le dossier plugins/ du serveur.
- Redémarrer le serveur (Paper 1.21+, Java 21). Dépendances optionnelles : PlaceholderAPI, Vault (+ une économie) pour les placeholders et les récompenses en argent.
- config.yml, lang/fr.yml, lang/en.yml et tracks.yml sont générés au premier lancement.
️ Utilisation
Admin — créer & configurer un parcours (100 % en jeu) :
- /race create <nom>
- Se placer au départ, puis /race setstart <nom>
- /race cp add <nom> [rayon] pour chaque checkpoint — le dernier est la ligne d'arrivée
- /race settings <nom> → choisir le véhicule (à pied / bateau / élytra), les fusées et les options
- Une fois complet (départ + arrivée), le parcours est prêt à être couru.
Joueur — courir :
- Lancer /race list et choisir un parcours.
- /race join <nom> pour s'inscrire ; la course démarre au décompte (ou via le /race start d'un admin).
- /race leave pour abandonner.
Commandes & Permissions
Commande
/race (alias
/r). Permissions :
race.play (défaut
true) ·
race.admin (défaut
op).
Joueurs (
race.play) :
| /race list |
Lister les parcours (ouvre le menu en jeu) |
| /race join <nom> |
S'inscrire à la course |
| /race leave |
Se désinscrire / abandonner |
| /race info <nom> |
Détail d'un parcours (records, moyenne, ton meilleur temps) |
| /race support |
Obtenir le lien du Discord de support |
Admins (
race.admin) :
| /race create <nom> |
Créer un parcours |
| /race delete <nom> |
Supprimer un parcours |
| /race setstart <nom> |
Définir le départ à ta position |
| /race cp <add|move|delete|list> <nom> [valeur] |
Gérer les checkpoints (le dernier = l'arrivée) |
| /race tp <nom> |
Se téléporter au départ d'un parcours |
| /race settings <nom> |
Menu de réglages (nom, véhicule, fusées, options) |
| /race show <nom> | /race hide |
Activer / masquer la prévisualisation |
| /race resettimes <nom> |
Effacer les temps et le record d'un parcours |
| /race start [nom] | /race stop [nom] |
Forcer le départ immédiat / arrêter la course |
| /race reload |
Recharger la config et les messages |
⚙️ Configuration
Extrait de
config.yml (clés & commentaires en anglais ; seules les valeurs affichées aux joueurs suivent la langue du serveur) :
Code (Text):
# Langue des messages : "fr" ou "en" (fichiers personnalisables dans plugins/Race/lang/).
language: fr
prefix: "<gradient:#1e90ff:#00bfff><bold>Race</bold></gradient> <dark_gray>»</dark_gray> "
# Rayon par défaut (blocs) d'un checkpoint / de l'arrivée.
default-checkpoint-radius: 3.0
# Récompense Vault au classement : (nbJoueurs - rang + 1) * coefficient. 0 désactive.
reward-coefficient: 10.0
default-elytra-rockets: 16 # fusées données pour une course en élytra
auto-start-delay-seconds: 120 # délai d'auto-démarrage après la 1re inscription
countdown-seconds: 3 # décompte de départ (TP + libération)
detection-interval-ticks: 2 # fréquence des vérifications (checkpoints / arrivée)
checkpoint-gap-display-seconds: 1 # durée du titre d'écart de temps (0 désactive)
Compatibilité
- Vault (optionnel) : récompenses en argent au classement, avec n'importe quelle économie Vault (EssentialsX, CMI…). reward-coefficient: 0 pour les désactiver.
- PlaceholderAPI (optionnel) : placeholders %race_in_race%, %race_record_<parcours>%, %race_active_track%, %race_track_count% pour scoreboards, tablists et chat.
- Autonome : fonctionne sur tout serveur Paper 1.21+ — aucun autre plugin requis.
API
Couplage faible via le
ServicesManager (aucune dépendance de compilation au jar de Race) :
Code (Text):
var reg = Bukkit.getServicesManager().getRegistration(RaceApi.class);
if (reg != null) {
RaceApi api = reg.getProvider();
api.getGames().forEach(g -> getLogger().info(g.displayName() + " : " + g.status()));
api.join(player, "parcours1");
}
RaceApi expose
getGames(),
join(player, id),
isInGame(uuid) et
leaveCommand() ; chaque jeu est un
RaceGame(id, displayName, status, players, joinable). Écouter les événements custom :
Code (Text):
@EventHandler
public void onEnd(RaceEndEvent event) {
getLogger().info("Fin de course sur " + event.getTrack() + " — vainqueur : " + event.getWinner());
}
(
RaceStartEvent expose
getTrack() /
getPlayers().)
Contribution