diff --git a/src/main/java/fr/xephi/authme/listener/PlayerListener.java b/src/main/java/fr/xephi/authme/listener/PlayerListener.java index 443439f4d..da489cdc2 100644 --- a/src/main/java/fr/xephi/authme/listener/PlayerListener.java +++ b/src/main/java/fr/xephi/authme/listener/PlayerListener.java @@ -43,7 +43,6 @@ import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerShearEntityEvent; -import org.spigotmc.event.player.PlayerSpawnLocationEvent; import javax.inject.Inject; @@ -80,8 +79,7 @@ public class PlayerListener implements Listener { @Inject private JoinMessageService joinMessageService; - private boolean isAsyncPlayerPreLoginEventCalled = false; - private boolean isPlayerSpawnLocationEventCalled = false; + private static boolean IS_ASYNC_PLAYER_PRE_LOGIN_EVENT_CALLED = false; @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { @@ -189,26 +187,11 @@ public class PlayerListener implements Listener { } } - // Note: the following event is called since MC1.9, in older versions we have to fallback on the PlayerJoinEvent - - @EventHandler(priority = EventPriority.HIGH) - public void onPlayerSpawn(PlayerSpawnLocationEvent event) { - isPlayerSpawnLocationEventCalled = true; - final Player player = event.getPlayer(); - - management.performJoin(player, event.getSpawnLocation()); - - Location customSpawnLocation = teleportationService.prepareOnJoinSpawnLocation(player); - if (customSpawnLocation != null) { - event.setSpawnLocation(customSpawnLocation); - } - } - @EventHandler(priority = EventPriority.NORMAL) public void onPlayerJoin(PlayerJoinEvent event) { final Player player = event.getPlayer(); - if (!isPlayerSpawnLocationEventCalled) { + if (!PlayerListener19.isIsPlayerSpawnLocationEventCalled()) { teleportationService.teleportOnJoin(player); management.performJoin(player, player.getLocation()); } @@ -239,7 +222,7 @@ public class PlayerListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onAsyncPlayerPreLoginEvent(AsyncPlayerPreLoginEvent event) { - isAsyncPlayerPreLoginEventCalled = true; + IS_ASYNC_PLAYER_PRE_LOGIN_EVENT_CALLED = true; final String name = event.getName(); @@ -274,7 +257,7 @@ public class PlayerListener implements Listener { return; } - if (!isAsyncPlayerPreLoginEventCalled) { + if (!IS_ASYNC_PLAYER_PRE_LOGIN_EVENT_CALLED) { try { runOnJoinChecks(name, event.getAddress().getHostAddress()); } catch (FailedVerificationException e) { diff --git a/src/main/java/fr/xephi/authme/listener/PlayerListener19.java b/src/main/java/fr/xephi/authme/listener/PlayerListener19.java index ce2febe03..c5aef4dbc 100644 --- a/src/main/java/fr/xephi/authme/listener/PlayerListener19.java +++ b/src/main/java/fr/xephi/authme/listener/PlayerListener19.java @@ -2,19 +2,50 @@ package fr.xephi.authme.listener; import javax.inject.Inject; +import fr.xephi.authme.process.Management; +import fr.xephi.authme.service.TeleportationService; +import org.bukkit.Location; +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.PlayerSwapHandItemsEvent; +import org.spigotmc.event.player.PlayerSpawnLocationEvent; /** * Listener of player events for events introduced in Minecraft 1.9. */ public class PlayerListener19 implements Listener { + @Inject + private Management management; + + @Inject + private TeleportationService teleportationService; + @Inject private ListenerService listenerService; + private static boolean IS_PLAYER_SPAWN_LOCATION_EVENT_CALLED = false; + + public static boolean isIsPlayerSpawnLocationEventCalled() { + return IS_PLAYER_SPAWN_LOCATION_EVENT_CALLED; + } + + // Note: the following event is called since MC1.9, in older versions we have to fallback on the PlayerJoinEvent + @EventHandler(priority = EventPriority.HIGH) + public void onPlayerSpawn(PlayerSpawnLocationEvent event) { + PlayerListener19.IS_PLAYER_SPAWN_LOCATION_EVENT_CALLED = true; + final Player player = event.getPlayer(); + + management.performJoin(player, event.getSpawnLocation()); + + Location customSpawnLocation = teleportationService.prepareOnJoinSpawnLocation(player); + if (customSpawnLocation != null) { + event.setSpawnLocation(customSpawnLocation); + } + } + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) { if (listenerService.shouldCancelEvent(event)) { diff --git a/src/test/java/fr/xephi/authme/listener/ListenerConsistencyTest.java b/src/test/java/fr/xephi/authme/listener/ListenerConsistencyTest.java index f0ea065eb..18f4fc809 100644 --- a/src/test/java/fr/xephi/authme/listener/ListenerConsistencyTest.java +++ b/src/test/java/fr/xephi/authme/listener/ListenerConsistencyTest.java @@ -32,7 +32,7 @@ public final class ListenerConsistencyTest { "PlayerListener#onPlayerQuit", "ServerListener#onPluginDisable", "ServerListener#onServerPing", "ServerListener#onPluginEnable", "PlayerListener#onJoinMessage", "PlayerListener#onAsyncPlayerPreLoginEvent", - "PlayerListener#onPlayerSpawn"); + "PlayerListener19#onPlayerSpawn"); @BeforeClass public static void collectListenerClasses() { @@ -120,7 +120,9 @@ public final class ListenerConsistencyTest { // Exclude any methods with "$" in it: jacoco creates a "$jacocoInit" method we want to ignore, and // methods like "access$000" are created by the compiler when a private member is being accessed by an inner // class, which is not of interest for us - if (Modifier.isPrivate(method.getModifiers()) || method.getName().contains("$")) { + // Also exclude getters + String methodName = method.getName(); + if (Modifier.isPrivate(method.getModifiers()) || methodName.contains("$") || methodName.startsWith("get") || methodName.startsWith("is")) { return false; } // Skip reload() method (implementation of Reloadable interface)