Skip to content

Commit

Permalink
get rid of listener and just move to module
Browse files Browse the repository at this point in the history
  • Loading branch information
xGinko committed Sep 5, 2024
1 parent c4d5e3c commit d2364d1
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 181 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,28 +1,36 @@
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;
import org.bukkit.event.HandlerList;
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<UUID> DEAD_PLAYERS = new CopyOnWriteArraySet<>();
private final Cache<UUID, AtomicInteger> 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.""");
Expand All @@ -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
Expand All @@ -47,6 +56,7 @@ public boolean shouldEnable() {
@Override
public void disable() {
HandlerList.unregisterAll(this);
if (PlatformUtil.isFolia()) PacketEvents.getAPI().getEventManager().unregisterListener(asAbstract);
}

@SuppressWarnings("deprecation")
Expand All @@ -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);
}
}

0 comments on commit d2364d1

Please sign in to comment.