diff --git a/pom.xml b/pom.xml index 864a2710b..b90eea6fe 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ - 2.7.11b1 + 2.7.11b2 org.bukkit 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 7417b42f9..c491ba204 100644 --- a/src/main/java/uk/org/whoami/authme/listener/AuthMePlayerListener.java +++ b/src/main/java/uk/org/whoami/authme/listener/AuthMePlayerListener.java @@ -29,6 +29,7 @@ import org.bukkit.Material; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.block.SignChangeEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.event.player.PlayerBedEnterEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerDropItemEvent; @@ -77,6 +78,7 @@ public class AuthMePlayerListener implements Listener { public static int gm = 0; public static HashMap gameMode = new HashMap(); + public HashMap sessions = new HashMap(); private Utils utils = Utils.getInstance(); private Messages m = Messages.getInstance(); public AuthMe plugin; @@ -564,6 +566,22 @@ public class AuthMePlayerListener implements Listener { } + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerPreLogin(AsyncPlayerPreLoginEvent event) { + if (event == null || event.getName() == null || event.getName().isEmpty()) return; + + if (!Settings.isSessionsEnabled && !Settings.sessionExpireOnIpChange) return; + + PlayerAuth auth = data.getAuth(event.getName().toLowerCase()); + if (event.getAddress().getHostAddress() == auth.getIp()) { + return; + } else { + if (!plugin.getServer().getPlayer(event.getName()).isOnline()) { + this.sessions.put(event.getName().toLowerCase(), true); + } + } + } + @EventHandler(priority = EventPriority.LOWEST) public void onPlayerLogin(PlayerLoginEvent event) { @@ -699,28 +717,30 @@ public class AuthMePlayerListener implements Listener { if((cur - lastLogin < timeout || timeout == 0) && !auth.getIp().equals("198.18.0.1") ) { - if (auth.getNickname().equalsIgnoreCase(name) && auth.getIp().equals(ip) ) { - plugin.getServer().getPluginManager().callEvent(new SessionEvent(auth, true)); - if(PlayerCache.getInstance().getAuth(name) != null) { - PlayerCache.getInstance().updatePlayer(auth); - } else { - PlayerCache.getInstance().addPlayer(auth); - } - player.sendMessage(m._("valid_session")); - return; - } else { - if(Settings.sessionExpireOnIpChange && !player.isOnline()) { - PlayerCache.getInstance().removePlayer(name); - LimboCache.getInstance().addLimboPlayer(player , utils.removeAll(player)); - } else { - int gM = gameMode.get(name); - player.setGameMode(GameMode.getByValue(gM)); - player.kickPlayer(m._("unvalid_session")); - return; - } - } + if (!this.sessions.containsKey(name)) { + if (auth.getNickname().equalsIgnoreCase(name) && auth.getIp().equals(ip) ) { + plugin.getServer().getPluginManager().callEvent(new SessionEvent(auth, true)); + if(PlayerCache.getInstance().getAuth(name) != null) { + PlayerCache.getInstance().updatePlayer(auth); + } else { + PlayerCache.getInstance().addPlayer(auth); + } + player.sendMessage(m._("valid_session")); + return; + } else { + int gM = gameMode.get(name); + player.setGameMode(GameMode.getByValue(gM)); + player.kickPlayer(m._("unvalid_session")); + return; + } + } else { + //Player change his IP between 2 relog-in + PlayerCache.getInstance().removePlayer(name); + LimboCache.getInstance().addLimboPlayer(player , utils.removeAll(player)); + this.sessions.remove(name); + } } else { - + //Session is ended correctly PlayerCache.getInstance().removePlayer(name); LimboCache.getInstance().addLimboPlayer(player , utils.removeAll(player)); } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 258c018e8..61d43af8c 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -3,7 +3,7 @@ author: darkwarriros,Xephi website: http://www.multiplayer-italia.com/ description: AuthMe prevents people, which aren't logged in, from doing stuff like placing blocks, moving, typing commands or seeing the inventory of the current player. main: uk.org.whoami.authme.AuthMe -version: 2.7.11b1 +version: 2.7.11b2 softdepend: [Vault, ChestShop, Spout, Multiverse-Core, Notifications, Citizens, CombatTag] commands: register: