diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/session/BukkitSessionManager.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/session/BukkitSessionManager.java index 2e64fb738..7a98e04b3 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/session/BukkitSessionManager.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/session/BukkitSessionManager.java @@ -43,8 +43,8 @@ public class BukkitSessionManager extends AbstractSessionManager implements Runnable, Listener { /** - * Re-initialize handlers and clear "last position," "last state," etc. - * information for all players. + * Restore handler-managed state, re-initialize handlers, and clear + * "last position," "last state," etc. information for all players. */ @Override @SuppressWarnings({"rawtypes", "unchecked"}) @@ -72,9 +72,14 @@ public void accept(Object ignored) { @EventHandler public void onPlayerProcess(ProcessPlayerEvent event) { - // Pre-load a session + // Create a new session or re-initialize a cached one. LocalPlayer player = WorldGuardPlugin.inst().wrapPlayer(event.getPlayer()); - get(player).initialize(player); + Session session = getIfPresent(player); + if (session == null) { + get(player); // this also initializes the new session + } else { + session.resetState(player); // old sessions need explicit re-initialization + } } @Override diff --git a/worldguard-core/src/main/java/com/sk89q/worldguard/session/Session.java b/worldguard-core/src/main/java/com/sk89q/worldguard/session/Session.java index f52f00cc7..fe42bbaae 100644 --- a/worldguard-core/src/main/java/com/sk89q/worldguard/session/Session.java +++ b/worldguard-core/src/main/java/com/sk89q/worldguard/session/Session.java @@ -161,11 +161,12 @@ public void tick(LocalPlayer player) { } /** - * Re-initialize the session. + * Restore handler-managed state and then re-initialize the session. * * @param player The player */ public void resetState(LocalPlayer player) { + uninitialize(player); initialize(player); needRefresh.set(true); } diff --git a/worldguard-core/src/main/java/com/sk89q/worldguard/session/SessionManager.java b/worldguard-core/src/main/java/com/sk89q/worldguard/session/SessionManager.java index fce2bf340..cf0b1ad40 100644 --- a/worldguard-core/src/main/java/com/sk89q/worldguard/session/SessionManager.java +++ b/worldguard-core/src/main/java/com/sk89q/worldguard/session/SessionManager.java @@ -41,14 +41,14 @@ public interface SessionManager { boolean hasBypass(LocalPlayer player, World world); /** - * Re-initialize handlers and clear "last position," "last state," etc. - * information for all players. + * Restore handler-managed state, re-initialize handlers, and clear + * "last position," "last state," etc. information for all players. */ void resetAllStates(); /** - * Re-initialize handlers and clear "last position," "last state," etc. - * information. + * Restore handler-managed state, re-initialize handlers, and clear + * "last position," "last state," etc. information. * * @param player The player */