diff --git a/api/src/main/java/com/github/retrooper/packetevents/PacketEventsAPI.java b/api/src/main/java/com/github/retrooper/packetevents/PacketEventsAPI.java index d062cecd27..7a8229f408 100644 --- a/api/src/main/java/com/github/retrooper/packetevents/PacketEventsAPI.java +++ b/api/src/main/java/com/github/retrooper/packetevents/PacketEventsAPI.java @@ -75,6 +75,8 @@ public LogManager getLogManager() { public abstract void terminate(); + public abstract boolean isTerminated(); + public abstract T getPlugin(); public abstract ServerManager getServerManager(); diff --git a/api/src/main/java/com/github/retrooper/packetevents/settings/PacketEventsSettings.java b/api/src/main/java/com/github/retrooper/packetevents/settings/PacketEventsSettings.java index 7712de5fff..f01ba5f5e0 100644 --- a/api/src/main/java/com/github/retrooper/packetevents/settings/PacketEventsSettings.java +++ b/api/src/main/java/com/github/retrooper/packetevents/settings/PacketEventsSettings.java @@ -39,6 +39,7 @@ public class PacketEventsSettings { private boolean debugEnabled = false; private boolean fullStackTraceEnabled = false; private boolean kickOnPacketExceptionEnabled = true; + private boolean kickIfTerminated = true; private Function resourceProvider = path -> PacketEventsSettings.class .getClassLoader() .getResourceAsStream(path); @@ -139,6 +140,18 @@ public PacketEventsSettings kickOnPacketException(boolean kickOnPacketExceptionE return this; } + /** + * This decides if PacketEvents should kick the player on join if PacketEvents is terminated. + * + * @param kickIfTerminated Value + * @return Settings instance. + */ + @ApiStatus.Internal + public PacketEventsSettings kickIfTerminated(boolean kickIfTerminated) { + this.kickIfTerminated = kickIfTerminated; + return this; + } + /** * Some projects may want to implement a CDN with resources like asset mappings * By default, all resources are retrieved from the ClassLoader @@ -219,6 +232,15 @@ public boolean isKickOnPacketExceptionEnabled() { return kickOnPacketExceptionEnabled; } + /** + * Should packetevents kick the player on join if PacketEvents is terminated? + * + * @return Getter for {@link #kickIfTerminated} + */ + public boolean isKickIfTerminated() { + return kickIfTerminated; + } + /** * As described above, this method retrieves the function that acquires the InputStream * of a desired resource by its path. diff --git a/api/src/test/java/com/github/retrooper/packetevents/test/base/TestPacketEventsBuilder.java b/api/src/test/java/com/github/retrooper/packetevents/test/base/TestPacketEventsBuilder.java index 134d73a560..5d6ff3d839 100644 --- a/api/src/test/java/com/github/retrooper/packetevents/test/base/TestPacketEventsBuilder.java +++ b/api/src/test/java/com/github/retrooper/packetevents/test/base/TestPacketEventsBuilder.java @@ -83,6 +83,7 @@ protected void log(Level level, @Nullable NamedTextColor color, String message) private boolean loaded; private boolean initialized; + private boolean terminated; @Override public void load() { @@ -127,9 +128,15 @@ public boolean isInitialized() { public void terminate() { if (initialized) { initialized = false; + terminated = true; } } + @Override + public boolean isTerminated() { + return terminated; + } + @Override public Plugin getPlugin() { return plugin; diff --git a/bungeecord/src/main/java/io/github/retrooper/packetevents/bungee/factory/BungeePacketEventsBuilder.java b/bungeecord/src/main/java/io/github/retrooper/packetevents/bungee/factory/BungeePacketEventsBuilder.java index b88568abe5..c528e65acc 100644 --- a/bungeecord/src/main/java/io/github/retrooper/packetevents/bungee/factory/BungeePacketEventsBuilder.java +++ b/bungeecord/src/main/java/io/github/retrooper/packetevents/bungee/factory/BungeePacketEventsBuilder.java @@ -185,6 +185,7 @@ protected void log(Level level, @Nullable NamedTextColor color, String message) }; private boolean loaded; private boolean initialized; + private boolean terminated; @Override public void load() { @@ -247,9 +248,15 @@ public void terminate() { // Unregister all our listeners getEventManager().unregisterAllListeners(); initialized = false; + terminated = true; } } + @Override + public boolean isTerminated() { + return terminated; + } + @Override public Plugin getPlugin() { return plugin; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java index c11483baf8..dfd7262d16 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java @@ -167,6 +167,7 @@ protected void log(Level level, @Nullable NamedTextColor color, String message) }; private boolean loaded; private boolean initialized; + private boolean terminated; @Override public void load() { @@ -234,9 +235,15 @@ public void terminate() { //Unregister all our listeners getEventManager().unregisterAllListeners(); initialized = false; + terminated = true; } } + @Override + public boolean isTerminated() { + return terminated; + } + @Override public Minecraft getPlugin() { return Minecraft.getInstance(); diff --git a/netty-common/src/main/java/io/github/retrooper/packetevents/impl/netty/factory/NettyPacketEventsBuilder.java b/netty-common/src/main/java/io/github/retrooper/packetevents/impl/netty/factory/NettyPacketEventsBuilder.java index c1bd20a02d..ce928e3186 100644 --- a/netty-common/src/main/java/io/github/retrooper/packetevents/impl/netty/factory/NettyPacketEventsBuilder.java +++ b/netty-common/src/main/java/io/github/retrooper/packetevents/impl/netty/factory/NettyPacketEventsBuilder.java @@ -80,6 +80,7 @@ public static PacketEventsAPI buildNoCache(BuildData data, ChannelInj private final NettyManager nettyManager = new NettyManagerImpl(); private boolean loaded; private boolean initialized; + private boolean terminated; @Override public void load() { @@ -136,9 +137,15 @@ public void terminate() { //Unregister all our listeners getEventManager().unregisterAllListeners(); initialized = false; + terminated = true; } } + @Override + public boolean isTerminated() { + return terminated; + } + @Override public BuildData getPlugin() { return data; diff --git a/spigot/src/main/java/io/github/retrooper/packetevents/bukkit/InternalBukkitListener.java b/spigot/src/main/java/io/github/retrooper/packetevents/bukkit/InternalBukkitListener.java index 675ff54e94..25c9241f36 100644 --- a/spigot/src/main/java/io/github/retrooper/packetevents/bukkit/InternalBukkitListener.java +++ b/spigot/src/main/java/io/github/retrooper/packetevents/bukkit/InternalBukkitListener.java @@ -48,7 +48,7 @@ public void onJoin(PlayerJoinEvent e) { //We did not inject this user Object channel = PacketEvents.getAPI().getPlayerManager().getChannel(player); //Check if it is a fake connection... - if (!FakeChannelUtil.isFakeChannel(channel)) { + if (!FakeChannelUtil.isFakeChannel(channel) && (!PacketEvents.getAPI().isTerminated() || PacketEvents.getAPI().getSettings().isKickIfTerminated())) { //Kick them, if they are not a fake player. FoliaScheduler.getRegionScheduler().runDelayed(plugin, player.getLocation(), (o) -> { player.kickPlayer("PacketEvents 2.0 failed to inject"); diff --git a/spigot/src/main/java/io/github/retrooper/packetevents/factory/spigot/SpigotPacketEventsBuilder.java b/spigot/src/main/java/io/github/retrooper/packetevents/factory/spigot/SpigotPacketEventsBuilder.java index df0c980683..f990604054 100644 --- a/spigot/src/main/java/io/github/retrooper/packetevents/factory/spigot/SpigotPacketEventsBuilder.java +++ b/spigot/src/main/java/io/github/retrooper/packetevents/factory/spigot/SpigotPacketEventsBuilder.java @@ -87,6 +87,7 @@ public static PacketEventsAPI buildNoCache(Plugin plugin, PacketEventsSe private boolean loaded; private boolean initialized; private boolean lateBind = false; + private boolean terminated = false; @Override public void load() { @@ -222,9 +223,15 @@ public void terminate() { //Unregister all listeners. Because if we attempt to reload, we will end up with duplicate listeners. getEventManager().unregisterAllListeners(); initialized = false; + terminated = true; } } + @Override + public boolean isTerminated() { + return terminated; + } + @Override public Plugin getPlugin() { return plugin; diff --git a/velocity/src/main/java/io/github/retrooper/packetevents/velocity/factory/VelocityPacketEventsBuilder.java b/velocity/src/main/java/io/github/retrooper/packetevents/velocity/factory/VelocityPacketEventsBuilder.java index 622074bff2..fd408d1722 100644 --- a/velocity/src/main/java/io/github/retrooper/packetevents/velocity/factory/VelocityPacketEventsBuilder.java +++ b/velocity/src/main/java/io/github/retrooper/packetevents/velocity/factory/VelocityPacketEventsBuilder.java @@ -163,6 +163,7 @@ protected void log(Level level, @Nullable NamedTextColor color, String message) }; private boolean loaded; private boolean initialized; + private boolean terminated; @Override public void load() { @@ -244,9 +245,15 @@ public void terminate() { // Unregister all our listeners getEventManager().unregisterAllListeners(); initialized = false; + terminated = true; } } + @Override + public boolean isTerminated() { + return terminated; + } + @Override public LogManager getLogManager() { return logManager;