diff --git a/duels-plugin/src/main/java/com/meteordevelopments/duels/duel/DuelManager.java b/duels-plugin/src/main/java/com/meteordevelopments/duels/duel/DuelManager.java index aedb5089..5e360cd6 100644 --- a/duels-plugin/src/main/java/com/meteordevelopments/duels/duel/DuelManager.java +++ b/duels-plugin/src/main/java/com/meteordevelopments/duels/duel/DuelManager.java @@ -833,13 +833,11 @@ public void on(final PlayerQuitEvent event) { return; } + // Kill the player to trigger the death handler which ends the match. + // Do NOT call PlayerUtil.reset() or info.restore() here — the player is dead + // and modifying their state causes corruption (e.g. stuck in adventure-like mode). + // PlayerInfo stays in cache and will be restored via PlayerRespawnEvent on rejoin. player.setHealth(0); - player.getInventory().clear(); - player.getInventory().setArmorContents(null); - player.updateInventory(); - - final PlayerInfo info = playerManager.get(player); - info.restore(player); } @EventHandler(ignoreCancelled = true) @@ -892,8 +890,6 @@ public void on(final PlayerTeleportEvent event) { if (!config.isLimitTeleportEnabled() || event.getCause() == TeleportCause.ENDER_PEARL || event.getCause() == TeleportCause.SPECTATE - || event.getCause() == TeleportCause.PLUGIN - || event.getCause() == TeleportCause.UNKNOWN || !arenaManager.isInMatch(player)) { return; } diff --git a/duels-plugin/src/main/java/com/meteordevelopments/duels/listeners/TeleportListener.java b/duels-plugin/src/main/java/com/meteordevelopments/duels/listeners/TeleportListener.java index 7a4225ed..649249b5 100644 --- a/duels-plugin/src/main/java/com/meteordevelopments/duels/listeners/TeleportListener.java +++ b/duels-plugin/src/main/java/com/meteordevelopments/duels/listeners/TeleportListener.java @@ -13,7 +13,6 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import java.util.Set; @@ -53,8 +52,7 @@ public void on(final PlayerTeleportEvent event) { final Player player = event.getPlayer(); if (player.isOp() || player.isDead() || player.hasPermission(Permissions.ADMIN) || player.hasPermission(Permissions.TP_BYPASS) || - player.hasMetadata(Teleport.METADATA_KEY) || arenaManager.isInMatch(player) || spectateManager.isSpectating(player) || - event.getCause() == TeleportCause.PLUGIN || event.getCause() == TeleportCause.UNKNOWN) { + player.hasMetadata(Teleport.METADATA_KEY) || arenaManager.isInMatch(player) || spectateManager.isSpectating(player)) { return; } diff --git a/duels-plugin/src/main/java/com/meteordevelopments/duels/teleport/Teleport.java b/duels-plugin/src/main/java/com/meteordevelopments/duels/teleport/Teleport.java index 9e57b80e..2a642fd8 100644 --- a/duels-plugin/src/main/java/com/meteordevelopments/duels/teleport/Teleport.java +++ b/duels-plugin/src/main/java/com/meteordevelopments/duels/teleport/Teleport.java @@ -57,6 +57,16 @@ public void tryTeleport(final Player player, final Location location) { player.removePassenger(entity); } + // Wake up sleeping players (bed) and eject from vehicles, + // otherwise player.teleport() fails with "Player is dead or is vehicle" + if (player.isSleeping()) { + player.wakeup(false); + } + + if (player.isInsideVehicle()) { + player.leaveVehicle(); + } + player.closeInventory(); if (essentials != null) {