From 3c3fc1f6603439d0f9c3b9360130bc101f5d81f9 Mon Sep 17 00:00:00 2001 From: isokissa3 Date: Tue, 24 Apr 2018 17:45:32 +0300 Subject: [PATCH] Fixed possible deadlock when game-mode flag is being used When joining to region with game-mode flag set while initializing flag handlers PlayerGameModeChangeEvent is fired causing the plugin to try check the current status of fly flag to decide whenever can they fly or not. This causes issues as the intializers are being fired from the guava's LoadingCache causing the get to block, tho Guava actually prevents deadlocks and throws exception. The workaround is to check if the session is present at the moment and if not then scheduale it for next tick, otherwise we can continue --- .../listeners/PlayerListener.java | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/goldtreeservers/worldguardextraflags/listeners/PlayerListener.java b/src/main/java/net/goldtreeservers/worldguardextraflags/listeners/PlayerListener.java index 4aefbdc..5a6625e 100644 --- a/src/main/java/net/goldtreeservers/worldguardextraflags/listeners/PlayerListener.java +++ b/src/main/java/net/goldtreeservers/worldguardextraflags/listeners/PlayerListener.java @@ -25,6 +25,7 @@ import com.sk89q.worldedit.Location; import com.sk89q.worldedit.bukkit.BukkitUtil; import com.sk89q.worldguard.protection.ApplicableRegionSet; import com.sk89q.worldguard.protection.flags.StateFlag.State; +import com.sk89q.worldguard.session.Session; import net.goldtreeservers.worldguardextraflags.WorldGuardExtraFlagsPlugin; import net.goldtreeservers.worldguardextraflags.essentials.EssentialsUtils; @@ -125,23 +126,43 @@ public class PlayerListener implements Listener { Player player = event.getPlayer(); - Boolean value = WorldGuardExtraFlagsPlugin.getWorldGuardPlugin().getSessionManager().get(player).getHandler(FlyFlagHandler.class).getCurrentValue(); - if (value != null) + Session wgSession = WorldGuardExtraFlagsPlugin.getWorldGuardPlugin().getSessionManager().getIfPresent(player); + if (wgSession != null) + { + Boolean value = wgSession.getHandler(FlyFlagHandler.class).getCurrentValue(); + if (value != null) + { + new BukkitRunnable() + { + @Override + public void run() + { + PlayerListener.this.checkFlyStatus(player); + } + }.runTask(WorldGuardExtraFlagsPlugin.getPlugin()); + } + } + else { new BukkitRunnable() { @Override public void run() { - Boolean value = WorldGuardExtraFlagsPlugin.getWorldGuardPlugin().getSessionManager().get(player).getHandler(FlyFlagHandler.class).getCurrentValue(); - if (value != null) - { - player.setAllowFlight(value); - } + PlayerListener.this.checkFlyStatus(player); } }.runTask(WorldGuardExtraFlagsPlugin.getPlugin()); } } + + private void checkFlyStatus(Player player) + { + Boolean value = WorldGuardExtraFlagsPlugin.getWorldGuardPlugin().getSessionManager().get(player).getHandler(FlyFlagHandler.class).getCurrentValue(); + if (value != null) + { + player.setAllowFlight(value); + } + } //Re-enable if needed and the plugin checks for cancelled events /*@EventHandler(priority = EventPriority.LOWEST)