From cde9a403f7fdb7a67e9354703d285dffa8f70727 Mon Sep 17 00:00:00 2001 From: wizjany Date: Sun, 2 Aug 2015 04:42:10 -0400 Subject: [PATCH] Allow plugins to register session handlers. --- .../worldguard/session/SessionManager.java | 86 +++++++++++++++---- .../worldguard/session/handler/EntryFlag.java | 8 ++ .../worldguard/session/handler/ExitFlag.java | 8 ++ .../session/handler/FarewellFlag.java | 8 ++ .../worldguard/session/handler/FeedFlag.java | 8 ++ .../session/handler/GameModeFlag.java | 8 ++ .../worldguard/session/handler/GodMode.java | 8 ++ .../session/handler/GreetingFlag.java | 8 ++ .../worldguard/session/handler/Handler.java | 4 + .../worldguard/session/handler/HealFlag.java | 8 ++ .../session/handler/InvincibilityFlag.java | 8 ++ .../session/handler/NotifyEntryFlag.java | 8 ++ .../session/handler/NotifyExitFlag.java | 8 ++ .../session/handler/TimeLockFlag.java | 8 ++ .../session/handler/WaterBreathing.java | 8 ++ .../session/handler/WeatherLockFlag.java | 8 ++ 16 files changed, 187 insertions(+), 15 deletions(-) diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/SessionManager.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/SessionManager.java index 5970c54a..ff81c372 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/SessionManager.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/SessionManager.java @@ -24,7 +24,22 @@ import com.sk89q.guavabackport.cache.LoadingCache; import com.sk89q.worldguard.bukkit.BukkitUtil; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; -import com.sk89q.worldguard.session.handler.*; +import com.sk89q.worldguard.session.handler.EntryFlag; +import com.sk89q.worldguard.session.handler.ExitFlag; +import com.sk89q.worldguard.session.handler.FarewellFlag; +import com.sk89q.worldguard.session.handler.FeedFlag; +import com.sk89q.worldguard.session.handler.GameModeFlag; +import com.sk89q.worldguard.session.handler.GodMode; +import com.sk89q.worldguard.session.handler.GreetingFlag; +import com.sk89q.worldguard.session.handler.Handler; +import com.sk89q.worldguard.session.handler.Handler.Factory; +import com.sk89q.worldguard.session.handler.HealFlag; +import com.sk89q.worldguard.session.handler.InvincibilityFlag; +import com.sk89q.worldguard.session.handler.NotifyEntryFlag; +import com.sk89q.worldguard.session.handler.NotifyExitFlag; +import com.sk89q.worldguard.session.handler.TimeLockFlag; +import com.sk89q.worldguard.session.handler.WaterBreathing; +import com.sk89q.worldguard.session.handler.WeatherLockFlag; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -34,6 +49,7 @@ import javax.annotation.Nullable; import java.lang.ref.WeakReference; import java.util.Collection; +import java.util.LinkedList; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -77,6 +93,7 @@ public Session load(CacheKey key) throws Exception { public SessionManager(WorldGuardPlugin plugin) { checkNotNull(plugin, "plugin"); this.plugin = plugin; + registerDefaultHandlers(); } /** @@ -129,6 +146,56 @@ public void resetState(Player player) { } } + private LinkedList> handlers = new LinkedList>(); + + private void registerDefaultHandlers() { + // our list shouldn't be getting concurrently modified + // so we can safely order by providing null for 'after' + registerHandler(HealFlag.FACTORY, null); + registerHandler(FeedFlag.FACTORY, null); + registerHandler(NotifyEntryFlag.FACTORY, null); + registerHandler(NotifyExitFlag.FACTORY, null); + registerHandler(EntryFlag.FACTORY, null); + registerHandler(ExitFlag.FACTORY, null); + registerHandler(FarewellFlag.FACTORY, null); + registerHandler(GreetingFlag.FACTORY, null); + registerHandler(GameModeFlag.FACTORY, null); + registerHandler(InvincibilityFlag.FACTORY, null); + registerHandler(TimeLockFlag.FACTORY, null); + registerHandler(WeatherLockFlag.FACTORY, null); + registerHandler(GodMode.FACTORY, null); + registerHandler(WaterBreathing.FACTORY, null); + } + + /** + * Register a handler with the SessionManager. + * + * You may specify another handler class to ensure your handler is always registered after that class. + * If that class is not already registered, this method will return false. + * + * For example, flags that always act on a player in a region (like {@link HealFlag} and {@link FeedFlag}) + * should be registered earlier, whereas flags that only take effect when a player leaves the region (like + * {@link FarewellFlag} and {@link GreetingFlag}) should be registered after the {@link ExitFlag.Factory}.class handler factory. + * + * @param factory a factory which takes a session and returns an instance of your handler + * @param after the handler factory to insert the first handler after, to ensure a specific order when creating new sessions + * + * @return {@code true} (as specified by {@link Collection#add}) + * {@code false} if {@param after} is not registered + */ + public boolean registerHandler(Factory factory, @Nullable Factory after) { + if (factory == null) return false; + if (after == null) { + handlers.add(factory); + } else { + int index = handlers.indexOf(after); + if (index == -1) return false; + + handlers.add(index, factory); // shifts "after" right one, and everything after "after" right one + } + return true; + } + /** * Create a session for a player. * @@ -137,20 +204,9 @@ public void resetState(Player player) { */ private Session createSession(Player player) { Session session = new Session(this); - session.register(new HealFlag(session)); - session.register(new FeedFlag(session)); - session.register(new NotifyEntryFlag(session)); - session.register(new NotifyExitFlag(session)); - session.register(new EntryFlag(session)); - session.register(new ExitFlag(session)); - session.register(new FarewellFlag(session)); - session.register(new GreetingFlag(session)); - session.register(new GameModeFlag(session)); - session.register(new InvincibilityFlag(session)); - session.register(new TimeLockFlag(session)); - session.register(new WeatherLockFlag(session)); - session.register(new GodMode(session)); - session.register(new WaterBreathing(session)); + for (Factory factory : handlers) { + session.register(factory.create(session)); + } session.initialize(player); return session; } diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/EntryFlag.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/EntryFlag.java index c40698f1..a01a0cc1 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/EntryFlag.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/EntryFlag.java @@ -33,6 +33,14 @@ public class EntryFlag extends Handler { + public static final Factory FACTORY = new Factory(); + public static class Factory extends Handler.Factory { + @Override + public EntryFlag create(Session session) { + return new EntryFlag(session); + } + } + private static final long MESSAGE_THRESHOLD = 1000 * 2; private long lastMessage; diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/ExitFlag.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/ExitFlag.java index 45d97414..2ef727d6 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/ExitFlag.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/ExitFlag.java @@ -32,6 +32,14 @@ public class ExitFlag extends FlagValueChangeHandler { + public static final Factory FACTORY = new Factory(); + public static class Factory extends Handler.Factory { + @Override + public ExitFlag create(Session session) { + return new ExitFlag(session); + } + } + private static final long MESSAGE_THRESHOLD = 1000 * 2; private String storedMessage; private boolean exitViaTeleport = false; diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/FarewellFlag.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/FarewellFlag.java index 013bc5ff..1037b0e6 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/FarewellFlag.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/FarewellFlag.java @@ -34,6 +34,14 @@ public class FarewellFlag extends Handler { + public static final Factory FACTORY = new Factory(); + public static class Factory extends Handler.Factory { + @Override + public FarewellFlag create(Session session) { + return new FarewellFlag(session); + } + } + private Set lastMessageStack = Collections.emptySet(); public FarewellFlag(Session session) { diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/FeedFlag.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/FeedFlag.java index b60798dd..da0bc602 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/FeedFlag.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/FeedFlag.java @@ -28,6 +28,14 @@ public class FeedFlag extends Handler { + public static final Factory FACTORY = new Factory(); + public static class Factory extends Handler.Factory { + @Override + public FeedFlag create(Session session) { + return new FeedFlag(session); + } + } + private long lastFeed = 0; public FeedFlag(Session session) { diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/GameModeFlag.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/GameModeFlag.java index 3dbef596..4ade87c6 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/GameModeFlag.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/GameModeFlag.java @@ -32,6 +32,14 @@ public class GameModeFlag extends FlagValueChangeHandler { + public static final Factory FACTORY = new Factory(); + public static class Factory extends Handler.Factory { + @Override + public GameModeFlag create(Session session) { + return new GameModeFlag(session); + } + } + private GameMode originalGameMode; private GameMode setGameMode; diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/GodMode.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/GodMode.java index cccf880b..388f094c 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/GodMode.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/GodMode.java @@ -29,6 +29,14 @@ public class GodMode extends Handler { + public static final Factory FACTORY = new Factory(); + public static class Factory extends Handler.Factory { + @Override + public GodMode create(Session session) { + return new GodMode(session); + } + } + private boolean godMode; public GodMode(Session session) { diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/GreetingFlag.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/GreetingFlag.java index e82799e8..167a9b29 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/GreetingFlag.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/GreetingFlag.java @@ -35,6 +35,14 @@ public class GreetingFlag extends Handler { + public static final Factory FACTORY = new Factory(); + public static class Factory extends Handler.Factory { + @Override + public GreetingFlag create(Session session) { + return new GreetingFlag(session); + } + } + private Set lastMessageStack = Collections.emptySet(); public GreetingFlag(Session session) { diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/Handler.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/Handler.java index bd74d803..e0e12267 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/Handler.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/Handler.java @@ -39,6 +39,10 @@ */ public abstract class Handler { + public static abstract class Factory { + public abstract T create(Session session); + } + private final Session session; /** diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/HealFlag.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/HealFlag.java index 4db77af0..78eefd9c 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/HealFlag.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/HealFlag.java @@ -28,6 +28,14 @@ public class HealFlag extends Handler { + public static final Factory FACTORY = new Factory(); + public static class Factory extends Handler.Factory { + @Override + public HealFlag create(Session session) { + return new HealFlag(session); + } + } + private long lastHeal = 0; public HealFlag(Session session) { diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/InvincibilityFlag.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/InvincibilityFlag.java index 52a0a09a..13f6bfe2 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/InvincibilityFlag.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/InvincibilityFlag.java @@ -31,6 +31,14 @@ public class InvincibilityFlag extends FlagValueChangeHandler { + public static final Factory FACTORY = new Factory(); + public static class Factory extends Handler.Factory { + @Override + public InvincibilityFlag create(Session session) { + return new InvincibilityFlag(session); + } + } + @Nullable private State invincibility; diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/NotifyEntryFlag.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/NotifyEntryFlag.java index beca0fb0..575b7812 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/NotifyEntryFlag.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/NotifyEntryFlag.java @@ -30,6 +30,14 @@ public class NotifyEntryFlag extends FlagValueChangeHandler { + public static final Factory FACTORY = new Factory(); + public static class Factory extends Handler.Factory { + @Override + public NotifyEntryFlag create(Session session) { + return new NotifyEntryFlag(session); + } + } + public NotifyEntryFlag(Session session) { super(session, DefaultFlag.NOTIFY_ENTER); } diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/NotifyExitFlag.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/NotifyExitFlag.java index 731abcac..b243e372 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/NotifyExitFlag.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/NotifyExitFlag.java @@ -29,6 +29,14 @@ public class NotifyExitFlag extends FlagValueChangeHandler { + public static final Factory FACTORY = new Factory(); + public static class Factory extends Handler.Factory { + @Override + public NotifyExitFlag create(Session session) { + return new NotifyExitFlag(session); + } + } + private Boolean notifiedForLeave = false; public NotifyExitFlag(Session session) { diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/TimeLockFlag.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/TimeLockFlag.java index 0c07b3d0..9a61a060 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/TimeLockFlag.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/TimeLockFlag.java @@ -31,6 +31,14 @@ public class TimeLockFlag extends FlagValueChangeHandler { + public static final Factory FACTORY = new Factory(); + public static class Factory extends Handler.Factory { + @Override + public TimeLockFlag create(Session session) { + return new TimeLockFlag(session); + } + } + private Long initialTime; private boolean initialRelative; diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/WaterBreathing.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/WaterBreathing.java index 4c153d8b..ac1d24af 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/WaterBreathing.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/WaterBreathing.java @@ -24,6 +24,14 @@ public class WaterBreathing extends Handler { + public static final Factory FACTORY = new Factory(); + public static class Factory extends Handler.Factory { + @Override + public WaterBreathing create(Session session) { + return new WaterBreathing(session); + } + } + public boolean waterBreathing; public WaterBreathing(Session session) { diff --git a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/WeatherLockFlag.java b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/WeatherLockFlag.java index 8984c669..e11a2802 100644 --- a/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/WeatherLockFlag.java +++ b/worldguard-legacy/src/main/java/com/sk89q/worldguard/session/handler/WeatherLockFlag.java @@ -31,6 +31,14 @@ public class WeatherLockFlag extends FlagValueChangeHandler { + public static final Factory FACTORY = new Factory(); + public static class Factory extends Handler.Factory { + @Override + public WeatherLockFlag create(Session session) { + return new WeatherLockFlag(session); + } + } + private WeatherType initialWeather; public WeatherLockFlag(Session session) {