Respawn après mort envoie le joueur dans le mauvais monde #4

Closed
opened 2026-05-30 15:28:27 +00:00 by wait4mi · 0 comments
Owner

Contexte

Sur mc-plot, le serveur a level-name=plots dans server.properties. EkaiiPlots est configuré avec plot.world: world (monde secondaire créé par le plugin).

Le bukkit.yml contient actuellement :

worlds:
  plots:
    generator: EkaiiPlots
  world:
    generator: EkaiiPlots

Résultat : les deux mondes (plots = monde principal Bukkit, et world = monde EkaiiPlots) ont été générés avec le générateur de parcelles. Le monde plots ne devrait pas avoir ce générateur.

Symptôme

Quand un joueur meurt (sans lit/ancre de respawn), Bukkit le renvoie au spawn du monde principal (plots). Ce monde ayant lui aussi le terrain EkaiiPlots, le joueur arrive dans un "second monde plot" identique visuellement à world, mais ce n'est pas le bon. Il faut se déconnecter/reconnecter pour que teleport-on-join le ramène dans world.

Cause racine

PlotEntryListener gère PlayerJoinEvent (téléportation vers world au login) mais pas PlayerRespawnEvent. Il n'y a aucun redirect vers le plot world après une mort.

La présence de worlds.plots.generator: EkaiiPlots dans bukkit.yml est un problème de config serveur (hors scope EkaiiPlots), mais aggrave le symptôme : même sans fix code, si plots était vanilla le joueur arriverait au moins dans un monde normal.

Fix à apporter dans EkaiiPlots

Ajouter un handler PlayerRespawnEvent dans PlotEntryListener (le listener existe déjà, il gère join/move/quit) :

@EventHandler(priority = EventPriority.NORMAL)
public void onRespawn(PlayerRespawnEvent event) {
    if (!teleportOnJoin) return;  // respecte le même flag que onJoin
    World plotWorld = manager.getPlotWorld();
    if (plotWorld == null) return;
    event.setRespawnLocation(resolveWorldSpawn(plotWorld));
}

Notes d'implémentation :

  • resolveWorldSpawn(World) existe déjà dans PlotEntryListener, rien à dupliquer.
  • teleportOnJoin est déjà un champ de la classe — le réutiliser garde le comportement cohérent avec le login.
  • En Folia/Luminol, PlayerRespawnEvent se comporte comme en Paper standard — event.setRespawnLocation() est la bonne API, pas de scheduling spécial nécessaire.
  • Pas besoin de vérifier si le joueur est déjà dans plotWorld : un respawn sans lit dans world enverrait aussi au spawn global, autant toujours passer par resolveWorldSpawn.

Fix côté serveur (hors EkaiiPlots, à faire manuellement)

Retirer l'entrée parasite de bukkit.yml :

# Supprimer ce bloc :
  plots:
    generator: EkaiiPlots

Puis supprimer les region files du monde plots (généré à tort avec EkaiiPlots) pour qu'il reparte en vanilla :

docker stop mc-plot
docker run --rm -v /opt/mc-stack/plot:/server eclipse-temurin:25-jre \n  rm -rf /server/plots/dimensions/minecraft/overworld/region/
docker start mc-plot

Ce fix serveur supprime la confusion visuelle même avant que le fix code soit déployé.

## Contexte Sur `mc-plot`, le serveur a `level-name=plots` dans `server.properties`. EkaiiPlots est configuré avec `plot.world: world` (monde secondaire créé par le plugin). Le `bukkit.yml` contient actuellement : ```yaml worlds: plots: generator: EkaiiPlots world: generator: EkaiiPlots ``` Résultat : **les deux mondes** (`plots` = monde principal Bukkit, et `world` = monde EkaiiPlots) ont été générés avec le générateur de parcelles. Le monde `plots` ne devrait pas avoir ce générateur. ## Symptôme Quand un joueur meurt (sans lit/ancre de respawn), Bukkit le renvoie au spawn du monde principal (`plots`). Ce monde ayant lui aussi le terrain EkaiiPlots, le joueur arrive dans un _"second monde plot"_ identique visuellement à `world`, mais ce n'est pas le bon. Il faut se déconnecter/reconnecter pour que `teleport-on-join` le ramène dans `world`. ## Cause racine `PlotEntryListener` gère `PlayerJoinEvent` (téléportation vers `world` au login) mais **pas `PlayerRespawnEvent`**. Il n'y a aucun redirect vers le plot world après une mort. La présence de `worlds.plots.generator: EkaiiPlots` dans `bukkit.yml` est un problème de config serveur (hors scope EkaiiPlots), mais aggrave le symptôme : même sans fix code, si `plots` était vanilla le joueur arriverait au moins dans un monde normal. ## Fix à apporter dans EkaiiPlots Ajouter un handler `PlayerRespawnEvent` dans `PlotEntryListener` (le listener existe déjà, il gère join/move/quit) : ```java @EventHandler(priority = EventPriority.NORMAL) public void onRespawn(PlayerRespawnEvent event) { if (!teleportOnJoin) return; // respecte le même flag que onJoin World plotWorld = manager.getPlotWorld(); if (plotWorld == null) return; event.setRespawnLocation(resolveWorldSpawn(plotWorld)); } ``` **Notes d'implémentation :** - `resolveWorldSpawn(World)` existe déjà dans `PlotEntryListener`, rien à dupliquer. - `teleportOnJoin` est déjà un champ de la classe — le réutiliser garde le comportement cohérent avec le login. - En Folia/Luminol, `PlayerRespawnEvent` se comporte comme en Paper standard — `event.setRespawnLocation()` est la bonne API, pas de scheduling spécial nécessaire. - Pas besoin de vérifier si le joueur est déjà dans `plotWorld` : un respawn sans lit dans `world` enverrait aussi au spawn global, autant toujours passer par `resolveWorldSpawn`. ## Fix côté serveur (hors EkaiiPlots, à faire manuellement) Retirer l'entrée parasite de `bukkit.yml` : ```yaml # Supprimer ce bloc : plots: generator: EkaiiPlots ``` Puis supprimer les region files du monde `plots` (généré à tort avec EkaiiPlots) pour qu'il reparte en vanilla : ```bash docker stop mc-plot docker run --rm -v /opt/mc-stack/plot:/server eclipse-temurin:25-jre \n rm -rf /server/plots/dimensions/minecraft/overworld/region/ docker start mc-plot ``` Ce fix serveur supprime la confusion visuelle même avant que le fix code soit déployé.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Ekaii/ekaiiplots#4
No description provided.