diff --git a/pom.xml b/pom.xml
index 150112c..6d122f7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
org.retromc
Authme-Expanded
- 3.6.3
+ 3.6.4
A fork of AuthMe utilized by RetroMC
diff --git a/src/main/java/uk/org/whoami/authme/AuthMe.java b/src/main/java/uk/org/whoami/authme/AuthMe.java
index 5089dff..1ff4fed 100644
--- a/src/main/java/uk/org/whoami/authme/AuthMe.java
+++ b/src/main/java/uk/org/whoami/authme/AuthMe.java
@@ -135,6 +135,8 @@ public void onEnable() {
Priority.Lowest, this);
pm.registerEvent(Event.Type.PLAYER_QUIT, playerListener,
Priority.Lowest, this);
+ pm.registerEvent(Event.Type.PLAYER_RESPAWN, playerListener,
+ Priority.Lowest, this);
pm.registerEvent(Event.Type.PLAYER_KICK, playerListener,
Priority.Lowest, this);
pm.registerEvent(Event.Type.PLAYER_PICKUP_ITEM, playerListener,
diff --git a/src/main/java/uk/org/whoami/authme/cache/limbo/LimboPlayer.java b/src/main/java/uk/org/whoami/authme/cache/limbo/LimboPlayer.java
index 13df5c4..f056646 100644
--- a/src/main/java/uk/org/whoami/authme/cache/limbo/LimboPlayer.java
+++ b/src/main/java/uk/org/whoami/authme/cache/limbo/LimboPlayer.java
@@ -44,6 +44,10 @@ public Location getLoc() {
return loc;
}
+ public void setLoc(Location loc) {
+ this.loc = loc;
+ }
+
public ItemStack[] getArmour() {
return armour;
}
diff --git a/src/main/java/uk/org/whoami/authme/listener/AuthMePlayerListener.java b/src/main/java/uk/org/whoami/authme/listener/AuthMePlayerListener.java
index 38cc5cd..9a00237 100644
--- a/src/main/java/uk/org/whoami/authme/listener/AuthMePlayerListener.java
+++ b/src/main/java/uk/org/whoami/authme/listener/AuthMePlayerListener.java
@@ -39,6 +39,7 @@
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.event.player.PlayerQuitEvent;
+import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitScheduler;
@@ -316,6 +317,15 @@ public void onPlayerJoin(PlayerJoinEvent event) {
}
LimboCache.getInstance().addLimboPlayer(player);
+ //If the player reconnected while dead (still on the respawn screen), the
+ //location captured above is the spot where they died. Leaving it in the
+ //limbo cache would let /login teleport them back there after they respawn
+ //(respawn-at-death exploit). A dead player has no valid location to
+ //return to, so fall back to the world spawn. onPlayerRespawn refines this
+ //to their actual respawn point (e.g. bed) once they respawn.
+ if (player.isDead() || player.getHealth() <= 0) {
+ LimboCache.getInstance().getLimboPlayer(name).setLoc(player.getWorld().getSpawnLocation());
+ }
player.getInventory().setArmorContents(new ItemStack[0]);
player.getInventory().setContents(new ItemStack[36]);
if (settings.isTeleportToSpawnEnabled()) {
@@ -381,6 +391,28 @@ public void onPlayerKick(PlayerKickEvent event) {
PlayerCache.getInstance().removePlayer(name);
}
+ @Override
+ public void onPlayerRespawn(PlayerRespawnEvent event) {
+ if (event.getPlayer() == null) {
+ return;
+ }
+
+ Player player = event.getPlayer();
+ String name = player.getName().toLowerCase();
+
+ if (CitizensCommunicator.isNPC(player)) {
+ return;
+ }
+
+ if (PlayerCache.getInstance().isAuthenticated(name)) {
+ return;
+ }
+
+ if (LimboCache.getInstance().hasLimboPlayer(name)) {
+ LimboCache.getInstance().getLimboPlayer(name).setLoc(event.getRespawnLocation());
+ }
+ }
+
@Override
public void onPlayerPickupItem(PlayerPickupItemEvent event) {
if (event.isCancelled() || event.getPlayer() == null) {