diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/CrazyLoginHook.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/CrazyLoginHook.java index db513e5c..aa8e5a14 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/CrazyLoginHook.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/CrazyLoginHook.java @@ -1,8 +1,14 @@ package com.github.games647.fastlogin.bukkit.hooks; +import com.comphenix.protocol.reflect.FuzzyReflection; + import de.st_ddt.crazylogin.CrazyLogin; import de.st_ddt.crazylogin.data.LoginPlayerData; import de.st_ddt.crazylogin.databases.CrazyLoginDataDatabase; +import de.st_ddt.crazylogin.listener.PlayerListener; +import de.st_ddt.crazylogin.metadata.Authenticated; + +import java.util.logging.Level; import org.bukkit.entity.Player; @@ -12,6 +18,8 @@ import org.bukkit.entity.Player; */ public class CrazyLoginHook implements AuthPlugin { + private final PlayerListener playerListener = getListener(); + @Override public void forceLogin(Player player) { CrazyLogin crazyLoginPlugin = CrazyLogin.getPlugin(); @@ -20,6 +28,27 @@ public class CrazyLoginHook implements AuthPlugin { if (playerData != null) { //mark the account as logged in playerData.setLoggedIn(true); + + String ip = player.getAddress().getAddress().getHostAddress(); +//this should be done after login to restore the inventory, unhide players, prevent potential memory leaks... +//extracted from: https://github.com/ST-DDT/CrazyLogin/blob/master/src/main/java/de/st_ddt/crazylogin/CrazyLogin.java#L1948 + playerData.resetLoginFails(); + player.setFireTicks(0); + + if (playerListener != null) { + playerListener.removeMovementBlocker(player); + playerListener.disableHidenInventory(player); + playerListener.disableSaveLogin(player); + playerListener.unhidePlayer(player); + } + + //loginFailuresPerIP.remove(IP); + //illegalCommandUsesPerIP.remove(IP); + //tempBans.remove(IP); + playerData.addIP(ip); + crazyLoginPlugin.getCrazyDatabase().saveWithoutPassword(playerData); + player.setMetadata("Authenticated", new Authenticated(crazyLoginPlugin, player)); + crazyLoginPlugin.unregisterDynamicHooks(); } } @@ -43,4 +72,18 @@ public class CrazyLoginHook implements AuthPlugin { crazyDatabase.save(playerData); } } + + private PlayerListener getListener() { + CrazyLogin pluginInstance = CrazyLogin.getPlugin(); + + PlayerListener listener; + try { + listener = FuzzyReflection.getFieldValue(pluginInstance, PlayerListener.class, true); + } catch (Exception ex) { + pluginInstance.getLogger().log(Level.SEVERE, "Failed to get the listener instance for auto login", ex); + listener = null; + } + + return listener; + } }