diff --git a/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/AnarchyExploitFixes.java b/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/AnarchyExploitFixes.java index b7405b596..a660856c5 100755 --- a/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/AnarchyExploitFixes.java +++ b/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/AnarchyExploitFixes.java @@ -6,7 +6,6 @@ import me.xginko.aef.config.Config; import me.xginko.aef.config.LanguageCache; import me.xginko.aef.enums.AEFPermission; -import me.xginko.aef.listeners.AEFListener; import me.xginko.aef.modules.AEFModule; import me.xginko.aef.utils.CachingPermTool; import me.xginko.aef.utils.KyoriUtil; @@ -27,12 +26,7 @@ import java.io.IOException; import java.nio.file.FileAlreadyExistsException; import java.nio.file.Files; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; +import java.util.*; import java.util.jar.JarFile; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -155,8 +149,6 @@ public void onDisable() { if (isPacketEventsInstalled) { AEFModule.ENABLED_MODULES.forEach(AEFModule::disable); AEFModule.ENABLED_MODULES.clear(); - AEFListener.LISTENERS.forEach(AEFListener::disable); - AEFListener.LISTENERS.clear(); PacketEvents.getAPI().terminate(); } if (languageCacheMap != null) { @@ -233,7 +225,6 @@ private void reloadConfiguration() { config = new Config(); if (tickReporter != null) tickReporter.disable(); tickReporter = TickReporter.create(this, config.tickData_cache_duration); - AEFListener.reloadListeners(); AEFModule.reloadModules(); config.saveConfig(); } catch (Throwable t) { diff --git a/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/events/PacketPlayerRespawnEvent.java b/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/events/PacketPlayerRespawnEvent.java deleted file mode 100644 index 4a20147e1..000000000 --- a/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/events/PacketPlayerRespawnEvent.java +++ /dev/null @@ -1,37 +0,0 @@ -package me.xginko.aef.events; - -import org.bukkit.entity.Player; -import org.bukkit.event.Event; -import org.bukkit.event.HandlerList; -import org.jetbrains.annotations.NotNull; - -public class PacketPlayerRespawnEvent extends Event { - - private static final @NotNull HandlerList handlers = new HandlerList(); - - private final @NotNull Player player; - - public PacketPlayerRespawnEvent(@NotNull Player player) { - super(false); - this.player = player; - } - - public @NotNull Player getPlayer() { - return player; - } - - public boolean isPotentialBedSpawn() { - if (player.getPotentialBedLocation() == null) - return false; - return player.getPotentialBedLocation().distanceSquared(player.getLocation()) <= 16; - } - - @Override - public @NotNull HandlerList getHandlers() { - return handlers; - } - - public static HandlerList getHandlerList() { - return handlers; - } -} diff --git a/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/listeners/AEFListener.java b/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/listeners/AEFListener.java deleted file mode 100644 index 689af3099..000000000 --- a/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/listeners/AEFListener.java +++ /dev/null @@ -1,45 +0,0 @@ -package me.xginko.aef.listeners; - -import com.github.retrooper.packetevents.event.PacketListenerAbstract; -import me.xginko.aef.AnarchyExploitFixes; -import me.xginko.aef.utils.models.ConditionalEnableable; -import me.xginko.aef.utils.models.Disableable; -import org.reflections.Reflections; -import org.reflections.scanners.Scanners; - -import java.lang.reflect.Modifier; -import java.util.HashSet; -import java.util.Set; - -public interface AEFListener extends ConditionalEnableable, Disableable { - - Reflections LISTENERS_PACKAGE = new Reflections(AEFListener.class.getPackage().getName()); - - Set LISTENERS = new HashSet<>(); - - static void reloadListeners() { - LISTENERS.forEach(AEFListener::disable); - LISTENERS.clear(); - - for (Class clazz : LISTENERS_PACKAGE.get(Scanners.SubTypes.of(AEFListener.class).asClass())) { - if (clazz.isInterface() || Modifier.isAbstract(clazz.getModifiers())) continue; - - try { - AEFListener listener = (AEFListener) clazz.getDeclaredConstructor().newInstance(); - if (listener.shouldEnable()) { - if (listener instanceof PacketListenerAbstract && AnarchyExploitFixes.config().packets_disabled) { - AnarchyExploitFixes.getPrefixedLogger() - .warn("Cannot enable listener {} because you disabled packets in config!", clazz.getSimpleName()); - continue; - } - - listener.enable(); - LISTENERS.add(listener); - } - } catch (Throwable t) { - AnarchyExploitFixes.getPrefixedLogger().error("Failed to load listener {}", clazz.getSimpleName(), t); - } - } - } - -} diff --git a/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/listeners/PacketPlayerRespawnListener.java b/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/listeners/PacketPlayerRespawnListener.java deleted file mode 100644 index 26cf0856f..000000000 --- a/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/listeners/PacketPlayerRespawnListener.java +++ /dev/null @@ -1,73 +0,0 @@ -package me.xginko.aef.listeners; - -import com.github.retrooper.packetevents.PacketEvents; -import com.github.retrooper.packetevents.event.PacketListenerAbstract; -import com.github.retrooper.packetevents.event.PacketListenerPriority; -import com.github.retrooper.packetevents.event.PacketReceiveEvent; -import com.github.retrooper.packetevents.protocol.packettype.PacketType; -import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientClientStatus; -import me.xginko.aef.AnarchyExploitFixes; -import me.xginko.aef.events.PacketPlayerRespawnEvent; -import me.xginko.aef.utils.PlatformUtil; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.PlayerDeathEvent; - -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.CopyOnWriteArraySet; - -public class PacketPlayerRespawnListener extends PacketListenerAbstract implements AEFListener, Listener { - - private static final Set DEAD_PLAYERS = new CopyOnWriteArraySet<>(); - private final AnarchyExploitFixes plugin; - - public PacketPlayerRespawnListener() { - super(PacketListenerPriority.HIGHEST); - this.plugin = AnarchyExploitFixes.getInstance(); - } - - @Override - public boolean shouldEnable() { - return PlatformUtil.isFolia(); - } - - @Override - public void enable() { - plugin.getServer().getPluginManager().registerEvents(this, plugin); - PacketEvents.getAPI().getEventManager().unregisterListener(this); - } - - @Override - public void disable() { - HandlerList.unregisterAll(this); - PacketEvents.getAPI().getEventManager().registerListener(this); - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - private void onPlayerDeath(PlayerDeathEvent event) { - DEAD_PLAYERS.add(event.getPlayer().getUniqueId()); - } - - @Override - public void onPacketReceive(PacketReceiveEvent event) { - if (event.isCancelled()) return; - if (event.getPacketType() != PacketType.Play.Client.CLIENT_STATUS) return; - WrapperPlayClientClientStatus packet = new WrapperPlayClientClientStatus(event); - if (packet.getAction() != WrapperPlayClientClientStatus.Action.PERFORM_RESPAWN) return; - - UUID uuid = event.getUser().getUUID(); - Player bukkitPlayer = plugin.getServer().getPlayer(uuid); - if (bukkitPlayer == null) return; - - if (DEAD_PLAYERS.contains(uuid) || bukkitPlayer.isDead()) { - bukkitPlayer.getScheduler().execute(plugin, () -> { - new PacketPlayerRespawnEvent(bukkitPlayer).callEvent(); - DEAD_PLAYERS.remove(bukkitPlayer.getUniqueId()); - }, null, 20L); - } - } -} diff --git a/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/preventions/BedTrap.java b/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/packets/BedTrap.java similarity index 51% rename from AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/preventions/BedTrap.java rename to AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/packets/BedTrap.java index 549081e34..316d606a1 100755 --- a/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/preventions/BedTrap.java +++ b/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/packets/BedTrap.java @@ -1,10 +1,15 @@ -package me.xginko.aef.modules.preventions; +package me.xginko.aef.modules.packets; import com.destroystokyo.paper.event.player.PlayerPostRespawnEvent; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; -import me.xginko.aef.events.PacketPlayerRespawnEvent; -import me.xginko.aef.modules.AEFModule; +import com.github.retrooper.packetevents.PacketEvents; +import com.github.retrooper.packetevents.event.PacketListenerPriority; +import com.github.retrooper.packetevents.event.PacketReceiveEvent; +import com.github.retrooper.packetevents.protocol.packettype.PacketType; +import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientClientStatus; +import me.xginko.aef.utils.PlatformUtil; +import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -12,17 +17,20 @@ import org.bukkit.event.Listener; import java.time.Duration; +import java.util.Set; import java.util.UUID; +import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.atomic.AtomicInteger; -public class BedTrap extends AEFModule implements Listener { +public class BedTrap extends PacketModule implements Listener { + private static final Set DEAD_PLAYERS = new CopyOnWriteArraySet<>(); private final Cache playerDeathNearBedCount; private final int maxDeathsPerTime; private final boolean shouldLog; public BedTrap() { - super("preventions.anti-bed-trap"); + super("preventions.anti-bed-trap", PacketListenerPriority.MONITOR); config.addComment(configPath + ".enable", """ Resets a players bed respawn they die too many times within\s a certain timeframe."""); @@ -37,6 +45,7 @@ public BedTrap() { @Override public void enable() { plugin.getServer().getPluginManager().registerEvents(this, plugin); + if (PlatformUtil.isFolia()) PacketEvents.getAPI().getEventManager().registerListener(asAbstract); } @Override @@ -47,6 +56,7 @@ public boolean shouldEnable() { @Override public void disable() { HandlerList.unregisterAll(this); + if (PlatformUtil.isFolia()) PacketEvents.getAPI().getEventManager().unregisterListener(asAbstract); } @SuppressWarnings("deprecation") @@ -69,22 +79,42 @@ private void onPlayerPostRespawn(PlayerPostRespawnEvent event) { }, null, 1L); } + /** + * Needed on folia since PlayerPostRespawnEvent does not fire + */ + @Override @SuppressWarnings("deprecation") - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - private void onPacketPlayerRespawn(PacketPlayerRespawnEvent event) { - Player player = event.getPlayer(); - if (!event.isPotentialBedSpawn()) return; + public void onPacketReceive(PacketReceiveEvent event) { + if (event.isCancelled()) return; + if (event.getPacketType() != PacketType.Play.Client.CLIENT_STATUS) return; + WrapperPlayClientClientStatus packet = new WrapperPlayClientClientStatus(event); + if (packet.getAction() != WrapperPlayClientClientStatus.Action.PERFORM_RESPAWN) return; - if (playerDeathNearBedCount.get(player.getUniqueId(), k -> new AtomicInteger()).incrementAndGet() <= maxDeathsPerTime) { + Player player = (Player) event.getPlayer(); + if (player == null) return; + + if (!DEAD_PLAYERS.contains(player.getUniqueId()) && !player.isDead()) { return; } - try { - player.setRespawnLocation(null, true); - } catch (NoSuchMethodError e) { - player.setBedSpawnLocation(null, true); - } + player.getScheduler().execute(plugin, () -> { + Location potentialBedSpawn = player.getPotentialBedLocation(); + if (potentialBedSpawn == null || potentialBedSpawn.distanceSquared(player.getLocation()) > 16) return; + + if (playerDeathNearBedCount.get(player.getUniqueId(), k -> new AtomicInteger()).incrementAndGet() <= maxDeathsPerTime) { + return; + } + + try { + player.setRespawnLocation(null, true); + } catch (NoSuchMethodError e) { + player.setBedSpawnLocation(null, true); + } + + if (shouldLog) info("Reset bed respawn of potentially bed-trapped player '" + player.getName() + "'"); + - if (shouldLog) info("Reset bed respawn of potentially bed-trapped player '" + player.getName() + "'"); + DEAD_PLAYERS.remove(player.getUniqueId()); + }, null, 20L); } } \ No newline at end of file