From c2a818e837d86abea5623c7cc5873d37a47ebe69 Mon Sep 17 00:00:00 2001 From: Brokkonaut Date: Sat, 22 Aug 2026 05:41:08 +0200 Subject: [PATCH] Fix lock flag restoration after session reinitialization --- .../bukkit/session/BukkitSessionManager.java | 13 +++++++++---- .../java/com/sk89q/worldguard/session/Session.java | 3 ++- .../sk89q/worldguard/session/SessionManager.java | 8 ++++---- 3 files changed, 15 insertions(+), 9 deletions(-) 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 */