diff --git a/CHANGELOG.md b/CHANGELOG.md index 944490a8..a0448da3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ######1.3 * Add support for AuthMe 3.X +* Fixed premium logins if the server is not fully started ######1.2.1 diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java index 9910577d..2d3c12a1 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java @@ -50,6 +50,7 @@ public class FastLoginBukkit extends JavaPlugin { private boolean bungeeCord; private Storage storage; + private boolean serverStarted; //this map is thread-safe for async access (Packet Listener) //SafeCacheBuilder is used in order to be version independent @@ -255,4 +256,20 @@ public class FastLoginBukkit extends JavaPlugin { public boolean isBungeeCord() { return bungeeCord; } + + /** + * Wait before the server is fully started. This is workaround, because connections right on startup are not + * injected by ProtocolLib + * + * @return + */ + public boolean isServerFullyStarted() { + return serverStarted; + } + + public void setServerStarted() { + if (!this.serverStarted) { + this.serverStarted = true; + } + } } diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/BukkitJoinListener.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/BukkitJoinListener.java index da8a99df..8f2a8889 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/BukkitJoinListener.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/BukkitJoinListener.java @@ -9,8 +9,11 @@ import com.github.games647.fastlogin.bukkit.PlayerSession; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerLoginEvent.Result; import org.bukkit.event.player.PlayerQuitEvent; /** @@ -27,12 +30,19 @@ public class BukkitJoinListener implements Listener { this.plugin = plugin; } + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerLogin(PlayerLoginEvent loginEvent) { + if (loginEvent.getResult() == Result.ALLOWED && !plugin.isServerFullyStarted()) { + loginEvent.disallow(Result.KICK_OTHER, "§cServer is not fully started yet. Please retry"); + } + } + @EventHandler(ignoreCancelled = true) public void onPlayerJoin(PlayerJoinEvent joinEvent) { - final Player player = joinEvent.getPlayer(); + Player player = joinEvent.getPlayer(); //removing the session because we now use it - final PlayerSession session = plugin.getSessions().get(player.getAddress().toString()); + PlayerSession session = plugin.getSessions().get(player.getAddress().toString()); if (session != null && plugin.getConfig().getBoolean("forwardSkin")) { WrappedGameProfile gameProfile = WrappedGameProfile.fromPlayer(player); WrappedSignedProperty skin = session.getSkin(); @@ -49,7 +59,7 @@ public class BukkitJoinListener implements Listener { @EventHandler public void onPlayerQuit(PlayerQuitEvent quitEvent) { - final Player player = quitEvent.getPlayer(); + Player player = quitEvent.getPlayer(); //prevent memory leaks player.removeMetadata(plugin.getName(), plugin); diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/StartPacketListener.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/StartPacketListener.java index dc683b21..6e854999 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/StartPacketListener.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/StartPacketListener.java @@ -61,7 +61,9 @@ public class StartPacketListener extends PacketAdapter { */ @Override public void onPacketReceiving(PacketEvent packetEvent) { - final Player player = packetEvent.getPlayer(); + plugin.setServerStarted(); + + Player player = packetEvent.getPlayer(); //this includes ip:port. Should be unique for an incoming login request with a timeout of 2 minutes String sessionKey = player.getAddress().toString();