diff --git a/API/src/main/java/dev/brighten/ac/api/AnticheatAPI.java b/API/src/main/java/dev/brighten/ac/api/AnticheatAPI.java index cdceced..3153a9f 100644 --- a/API/src/main/java/dev/brighten/ac/api/AnticheatAPI.java +++ b/API/src/main/java/dev/brighten/ac/api/AnticheatAPI.java @@ -5,6 +5,7 @@ import org.bukkit.plugin.Plugin; import java.util.*; +@SuppressWarnings("unused") public class AnticheatAPI { public static AnticheatAPI INSTANCE; @@ -13,6 +14,11 @@ public class AnticheatAPI { INSTANCE = this; } + /** Registers an AnticheatEvent to be called when an anticheat action is performed. + * This method associates the given plugin with the provided AnticheatEvent. + * @param plugin org.bukkit.plugin.Plugin + * @param event dev.brighten.ac.api.event.AnticheatEvent + */ public void registerEvent(Plugin plugin, AnticheatEvent event) { registeredEvents.compute(plugin.getName(), (key, list) -> { if(list == null) { @@ -24,6 +30,12 @@ public class AnticheatAPI { }); } + public void shutdown() { + registeredEvents.clear(); + INSTANCE = null; + } + + public void unregisterEvents(Plugin plugin) { registeredEvents.remove(plugin.getName()); } diff --git a/Anticheat/src/main/java/dev/brighten/ac/Anticheat.java b/Anticheat/src/main/java/dev/brighten/ac/Anticheat.java index 0bc49b7..007548d 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/Anticheat.java +++ b/Anticheat/src/main/java/dev/brighten/ac/Anticheat.java @@ -72,19 +72,21 @@ public class Anticheat extends JavaPlugin { private KeepaliveProcessor keepaliveProcessor; private PacketHandler packetHandler; private LoggerManager logManager; + private CommandPropertiesManager commandPropertiesManager; private RunUtils runUtils; private FakeEntityTracker fakeTracker; private int currentTick; - private Deque onTickEnd = new LinkedList<>(); - private ServerInjector injector; + private final Deque onTickEnd = new LinkedList<>(); //Lag Information private Timer lastTickLag; private long lastTick; @PackagePrivate - private RollingAverageDouble tps = new RollingAverageDouble(4, 20); + private final RollingAverageDouble tps = new RollingAverageDouble(4, 20); private final Map worldInfoMap = new HashMap<>(); + private final List commands = new ArrayList<>(); + public static boolean allowDebug = true; @ConfigSetting(path = "logging", name = "verbose") @@ -92,6 +94,7 @@ public class Anticheat extends JavaPlugin { private Configuration anticheatConfig; + @SuppressWarnings("deprecation") public void onEnable() { INSTANCE = this; new LibraryLoader().loadAll(getClass()); @@ -111,14 +114,15 @@ public class Anticheat extends JavaPlugin { commandManager = new BukkitCommandManager(this); commandManager.enableUnstableAPI("help"); - BukkitCommandCompletions cc = (BukkitCommandCompletions) Anticheat.INSTANCE.getCommandManager() - .getCommandCompletions(); + runTpsTask(); - cc.registerCompletion("checks", (c) -> Anticheat.INSTANCE.getCheckManager().getCheckClasses().keySet() + Anticheat.INSTANCE.getCommandManager() + .getCommandCompletions().registerCompletion("@checks", (c) -> Anticheat.INSTANCE.getCheckManager().getCheckClasses().keySet() .stream() .sorted(Comparator.naturalOrder()) .map(name -> name.replace(" ", "_")).collect(Collectors.toList())); - cc.registerCompletion("checkIds", (c) -> Anticheat.INSTANCE.getCheckManager().getCheckClasses().values() + Anticheat.INSTANCE.getCommandManager() + .getCommandCompletions().registerCompletion("@checkIds", (c) -> Anticheat.INSTANCE.getCheckManager().getCheckClasses().values() .stream().map(s -> s.getCheckClass().getAnnotation(CheckData.class).checkId()) .sorted(Comparator.naturalOrder()).collect(Collectors.toList())); @@ -155,12 +159,12 @@ public class Anticheat extends JavaPlugin { .orElse(null); } else if(!c.isOptional()) throw new InvalidCommandArgument(MessageKeys.NOT_ALLOWED_ON_CONSOLE, - false, new String[0]); + false); else return null; } }); - new CommandPropertiesManager(commandManager, getDataFolder(), + commandPropertiesManager = new CommandPropertiesManager(commandManager, getDataFolder(), getResource("command-messages.properties")); packetProcessor = new PacketProcessor(); @@ -168,7 +172,7 @@ public class Anticheat extends JavaPlugin { new AnticheatAPI(); new ClassScanner().initializeScanner(getClass(), this, - null); + null, Collections.emptyNavigableSet()); if(!getAnticheatConfig().contains("database.username")) { getAnticheatConfig().set("database.username", "dbuser"); @@ -202,85 +206,73 @@ public class Anticheat extends JavaPlugin { } public void onDisable() { scheduler.shutdownNow(); + + + // Unregistering APlayer objects + playerRegistry.unregisterAll(); + commands.forEach(commandManager::unregisterCommand); commandManager.unregisterCommands(); - commandManager.getCommandCompletions().unregisterCompletion("checks"); - commandManager.getCommandCompletions().unregisterCompletion("checkIds"); - commandManager = null; + commandManager.getCommandCompletions().unregisterCompletion("@checks"); + try { + commandManager.getCommandCompletions().unregisterCompletion("@checkIds"); + } catch (IllegalStateException e) { + Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Check ID unregister failed", e); + } + commandManager.getScheduler().cancelLocaleTask(); + commandPropertiesManager = null; + + getLogger().info("Disabling the rest of Kauri..."); checkManager.getCheckClasses().clear(); Check.alertsEnabled.clear(); Check.debugInstances.clear(); - checkManager = null; - keepaliveProcessor.keepAlives.cleanUp(); - keepaliveProcessor = null; - tps = null; + checkManager.getCheckSettings().clear(); + checkManager.getIdToName().clear(); + + keepaliveProcessor.stop(); + keepaliveProcessor.keepAlives.clear(); + logManager.shutDown(); Bukkit.getScheduler().cancelTasks(this); - // Unregistering APlayer objects - playerRegistry.unregisterAll(); - playerRegistry = null; - CheckHandler.TO_HOOK.clear(); - BBRevealHandler.INSTANCE = null; + fakeTracker.despawnAll(); - try { - injector.eject(); - injector = null; - } catch (Exception e) { - throw new RuntimeException(e); - } + CheckHandler.TO_HOOK.clear(); fakeTracker.despawnAll(); - fakeTracker = null; worldInfoMap.clear(); - actionManager = null; + // Unregistering packet listeners for players HandlerAbstract.getHandler().shutdown(); HandlerList.unregisterAll(this); packetProcessor.shutdown(); - packetProcessor = null; - packetHandler = null; - injector = null; onTickEnd.clear(); - onTickEnd = null; - packetHandler = null; - AnticheatAPI.INSTANCE = null; + + AnticheatAPI.INSTANCE.shutdown(); + + BBRevealHandler.INSTANCE = null; + INSTANCE = null; + } public void info(@Nonnull String s) { getLogger().info(s); } - public void warn(@Nonnull String s) { - getLogger().warning(s); - } - - public void severe(@Nonnull String s) { - getLogger().severe(s); - } - - public void warn(@Nonnull String s, Throwable t) { - getLogger().log(Level.WARNING, s, t); - } - - public void severe(@Nonnull String s, Throwable t) { - getLogger().log(Level.SEVERE, s, t); - } - public void saveConfig() { try { ConfigurationProvider.getProvider(YamlConfiguration.class) .save(getAnticheatConfig(), new File(getDataFolder().getPath() + File.separator + "anticheat.yml")); } catch (IOException e) { - e.printStackTrace(); + Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Anticheat config save failed", e); } } @@ -299,8 +291,7 @@ public class Anticheat extends JavaPlugin { File configFile = new File(getDataFolder(), "anticheat.yml"); if(!configFile.exists()) { - configFile.getParentFile().mkdirs(); - if(!configFile.createNewFile()) { + if(!configFile.getParentFile().mkdirs() && !configFile.createNewFile()) { throw new RuntimeException("Could not create new anticheat.yml in plugin folder!" + "Insufficient write permissions?"); } else { diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/CheckData.java b/Anticheat/src/main/java/dev/brighten/ac/check/CheckData.java index f705ff2..17fcda6 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/CheckData.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/CheckData.java @@ -23,5 +23,5 @@ public @interface CheckData { int punishVl() default 10; ProtocolVersion minVersion() default ProtocolVersion.V1_7; - ProtocolVersion maxVersion() default ProtocolVersion.V1_21_4; + ProtocolVersion maxVersion() default ProtocolVersion.V1_21_5; } diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/aim/AimA.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/aim/AimA.java index 216760c..37a048d 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/aim/AimA.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/aim/AimA.java @@ -13,7 +13,7 @@ import dev.brighten.ac.utils.annotation.Bind; import dev.brighten.ac.utils.timer.Timer; import dev.brighten.ac.utils.timer.impl.TickTimer; -@CheckData(name = "Aim (A)", checkId = "aima", type = CheckType.COMBAT, maxVersion = ProtocolVersion.V1_21_4) +@CheckData(name = "Aim (A)", checkId = "aima", type = CheckType.COMBAT, maxVersion = ProtocolVersion.V1_21_5) public class AimA extends Check { public AimA(APlayer player) { super(player); diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/aim/AimB.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/aim/AimB.java index 1b0cc82..849e5e2 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/aim/AimB.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/aim/AimB.java @@ -8,10 +8,11 @@ import dev.brighten.ac.data.APlayer; import dev.brighten.ac.packet.ProtocolVersion; import dev.brighten.ac.packet.wrapper.in.WPacketPlayInFlying; import dev.brighten.ac.utils.MathUtils; +import dev.brighten.ac.utils.annotation.Bind; import dev.brighten.ac.utils.timer.Timer; import dev.brighten.ac.utils.timer.impl.TickTimer; -@CheckData(name = "Aim (B)", checkId = "aimb", type = CheckType.COMBAT, experimental = true, maxVersion = ProtocolVersion.V1_21_4) +@CheckData(name = "Aim (B)", checkId = "aimb", type = CheckType.COMBAT, experimental = true, maxVersion = ProtocolVersion.V1_21_5) public class AimB extends Check { public AimB(APlayer player) { super(player); @@ -24,6 +25,7 @@ public class AimB extends Check { private int totalLookTicks = 0; private final Timer lastLargeLook = new TickTimer(); + @Bind WAction flying = packet -> { if(!packet.isLooked()) return; final float sensitivity = player.getMovement().getSensitivityMcp(); diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/aim/AimC.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/aim/AimC.java index e88506e..ceef89c 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/aim/AimC.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/aim/AimC.java @@ -10,7 +10,7 @@ import dev.brighten.ac.packet.wrapper.in.WPacketPlayInFlying; import dev.brighten.ac.utils.MathUtils; import dev.brighten.ac.utils.annotation.Bind; -@CheckData(name = "Aim (C)", checkId = "aimc", type = CheckType.COMBAT, maxVersion = ProtocolVersion.V1_21_4) +@CheckData(name = "Aim (C)", checkId = "aimc", type = CheckType.COMBAT, maxVersion = ProtocolVersion.V1_21_5) public class AimC extends Check { public AimC(APlayer player) { diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/autoclicker/AutoclickerC.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/autoclicker/AutoclickerC.java index f42e68c..9fe9785 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/autoclicker/AutoclickerC.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/autoclicker/AutoclickerC.java @@ -12,7 +12,7 @@ import dev.brighten.ac.utils.objects.evicting.EvictingList; import java.util.List; -@CheckData(name = "Autoclicker (C)", checkId = "autoclickerc", type = CheckType.AUTOCLICKER, maxVersion = ProtocolVersion.V1_21_4) +@CheckData(name = "Autoclicker (C)", checkId = "autoclickerc", type = CheckType.AUTOCLICKER, maxVersion = ProtocolVersion.V1_21_5) public class AutoclickerC extends Check { public AutoclickerC(APlayer player) { diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/KABot.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/KABot.java index 77ac719..2ea12e6 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/KABot.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/KABot.java @@ -13,7 +13,7 @@ import lombok.val; import java.util.List; -@CheckData(name = "KillAura (Bot)", checkId = "kabot", type = CheckType.KILLAURA, maxVersion = ProtocolVersion.V1_21_4) +@CheckData(name = "KillAura (Bot)", checkId = "kabot", type = CheckType.KILLAURA, maxVersion = ProtocolVersion.V1_21_5) public class KABot extends Check { public KABot(APlayer player) { diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/KATrace.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/KATrace.java index 10980ec..c29b91d 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/KATrace.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/KATrace.java @@ -21,7 +21,7 @@ import org.bukkit.util.Vector; * This check is designed to detect an attack through solid blocks, which would be impossible under normal * circumstances. */ -@CheckData(name = "KillAura (Trace)", checkId = "katrace", type = CheckType.KILLAURA, maxVersion = ProtocolVersion.V1_21_4) +@CheckData(name = "KillAura (Trace)", checkId = "katrace", type = CheckType.KILLAURA, maxVersion = ProtocolVersion.V1_21_5) public class KATrace extends Check { public KATrace(APlayer player) { @@ -37,7 +37,7 @@ public class KATrace extends Check { return; // If the player isn't looking at the target, then a raytrace check wouldn't work. - if(player.getMovement().getLookingAtBoxes().size() == 0) { + if(player.getMovement().getLookingAtBoxes().isEmpty()) { debug("No boxes to look at!"); buffer = 0; return; diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/calc/impl/KAGrid.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/calc/impl/KAGrid.java index b18631a..3de72fa 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/calc/impl/KAGrid.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/calc/impl/KAGrid.java @@ -13,7 +13,7 @@ import dev.brighten.ac.utils.objects.evicting.EvictingList; import java.util.List; -@CheckData(name = "KillAura (Grid)", checkId = "kacalcgrid", type = CheckType.KILLAURA, maxVersion = ProtocolVersion.V1_21_4) +@CheckData(name = "KillAura (Grid)", checkId = "kacalcgrid", type = CheckType.KILLAURA, maxVersion = ProtocolVersion.V1_21_5) public class KAGrid extends Check implements RotationCheck { public KAGrid(APlayer player) { super(player); diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/calc/impl/KAZero.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/calc/impl/KAZero.java index b722dd2..bdc935b 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/calc/impl/KAZero.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/calc/impl/KAZero.java @@ -9,7 +9,7 @@ import dev.brighten.ac.packet.ProtocolVersion; import dev.brighten.ac.utils.EntityLocation; import dev.brighten.ac.utils.Tuple; -@CheckData(name = "KillAura (Zero)", checkId = "kacalczero", type = CheckType.KILLAURA, maxVersion = ProtocolVersion.V1_21_4) +@CheckData(name = "KillAura (Zero)", checkId = "kacalczero", type = CheckType.KILLAURA, maxVersion = ProtocolVersion.V1_21_5) public class KAZero extends Check implements RotationCheck { public KAZero(APlayer player) { super(player); diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/BookOp.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/BookOp.java index 330c7d7..1c98ea6 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/BookOp.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/BookOp.java @@ -10,7 +10,7 @@ import dev.brighten.ac.utils.annotation.Bind; import lombok.val; import org.bukkit.event.player.PlayerEditBookEvent; -@CheckData(name = "BookOp", checkId = "bookop", type = CheckType.EXPLOIT, maxVersion = ProtocolVersion.V1_21_4) +@CheckData(name = "BookOp", checkId = "bookop", type = CheckType.EXPLOIT, maxVersion = ProtocolVersion.V1_21_5) public class BookOp extends Check { public BookOp(APlayer player) { super(player); diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/DebugPacket.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/DebugPacket.java new file mode 100644 index 0000000..220c1a1 --- /dev/null +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/DebugPacket.java @@ -0,0 +1,21 @@ +package dev.brighten.ac.check.impl.misc; + +import dev.brighten.ac.api.check.CheckType; +import dev.brighten.ac.check.Check; +import dev.brighten.ac.check.CheckData; +import dev.brighten.ac.check.WAction; +import dev.brighten.ac.data.APlayer; +import dev.brighten.ac.packet.ProtocolVersion; +import dev.brighten.ac.packet.wrapper.in.WPacketPlayInFlying; +import dev.brighten.ac.utils.annotation.Bind; + +@CheckData(name = "DebugPacket", description = "To debug packets", checkId = "debugpacket", type = CheckType.EXPLOIT, maxVersion = ProtocolVersion.V1_21_5) +public class DebugPacket extends Check { + public DebugPacket(APlayer player) { + super(player); + } + + @Bind + WAction flying = packet -> + debug("ypos=%.7f", player.getMovement().getTo().getY()); +} diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/HealthSpoof.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/HealthSpoof.java index 09cea62..e9bb886 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/HealthSpoof.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/HealthSpoof.java @@ -11,7 +11,7 @@ import dev.brighten.ac.packet.wrapper.objects.WrappedWatchableObject; import dev.brighten.ac.packet.wrapper.out.WPacketPlayOutEntityMetadata; import dev.brighten.ac.utils.annotation.Bind; -@CheckData(name = "HealthSpoof", checkId = "healthspoof", type = CheckType.EXPLOIT, maxVersion = ProtocolVersion.V1_21_4) +@CheckData(name = "HealthSpoof", checkId = "healthspoof", type = CheckType.EXPLOIT, maxVersion = ProtocolVersion.V1_21_5) public class HealthSpoof extends Check { public HealthSpoof(APlayer player) { diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/inventory/InventoryClickMove.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/inventory/InventoryClickMove.java index 1a544dc..ae6c49b 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/inventory/InventoryClickMove.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/inventory/InventoryClickMove.java @@ -10,7 +10,7 @@ import dev.brighten.ac.packet.wrapper.in.WPacketPlayInFlying; import dev.brighten.ac.packet.wrapper.in.WPacketPlayInWindowClick; import dev.brighten.ac.utils.annotation.Bind; -@CheckData(name = "Inventory (ClickMove)", checkId = "inventoryc", type = CheckType.INVENTORY, maxVersion = ProtocolVersion.V1_21_4) +@CheckData(name = "Inventory (ClickMove)", checkId = "inventoryc", type = CheckType.INVENTORY, maxVersion = ProtocolVersion.V1_21_5) public class InventoryClickMove extends Check { public InventoryClickMove(APlayer player) { super(player); diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/inventory/InventoryFastClick.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/inventory/InventoryFastClick.java index a0703a6..b79f725 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/inventory/InventoryFastClick.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/misc/inventory/InventoryFastClick.java @@ -10,7 +10,7 @@ import dev.brighten.ac.utils.annotation.Bind; import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryClickEvent; -@CheckData(name = "Inventory (FastClick)", checkId = "inventoryd", type = CheckType.INVENTORY, maxVersion = ProtocolVersion.V1_21_4) +@CheckData(name = "Inventory (FastClick)", checkId = "inventoryd", type = CheckType.INVENTORY, maxVersion = ProtocolVersion.V1_21_5) public class InventoryFastClick extends Check { public InventoryFastClick(APlayer player) { super(player); diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/fly/FlyA.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/fly/FlyA.java index a8056d7..d8993cf 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/fly/FlyA.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/fly/FlyA.java @@ -20,7 +20,7 @@ import org.bukkit.util.Vector; import java.util.List; -@CheckData(name = "Fly (Predict)", checkId = "flya", type = CheckType.MOVEMENT, experimental = true, punishVl = 7) +@CheckData(name = "Fly (Predict)", checkId = "flya", type = CheckType.MOVEMENT, experimental = true, punishVl = 7, maxVersion = ProtocolVersion.V1_21_5) public class FlyA extends Check { public FlyA(APlayer player) { diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/speed/Prediction.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/speed/Prediction.java index caabb1a..85f45f3 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/speed/Prediction.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/speed/Prediction.java @@ -16,11 +16,10 @@ import lombok.val; import me.hydro.emulator.util.Vector; @CheckData(name = "Prediction", checkId = "predictiona", type = CheckType.MOVEMENT, experimental = true, - punishable = false, maxVersion = ProtocolVersion.V1_21_4) + punishable = false, maxVersion = ProtocolVersion.V1_21_5) public class Prediction extends Check { private float buffer; - private boolean maybeSkippedPos; - private int lastFlying, notMoveTicks; + private int notMoveTicks; private final Timer lastSkipPos = new TickTimer(); public Prediction(APlayer player) { diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/speed/Speed.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/speed/Speed.java index 36be170..607b065 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/speed/Speed.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/speed/Speed.java @@ -14,7 +14,7 @@ import dev.brighten.ac.utils.XMaterial; import dev.brighten.ac.utils.annotation.Bind; import org.bukkit.potion.PotionEffectType; -@CheckData(name = "Speed", checkId = "speeda", type = CheckType.MOVEMENT, maxVersion = ProtocolVersion.V1_21_4) +@CheckData(name = "Speed", checkId = "speeda", type = CheckType.MOVEMENT, maxVersion = ProtocolVersion.V1_21_5) public class Speed extends Check { private double ldxz = .12f; @@ -34,20 +34,20 @@ public class Speed extends Check { TagsBuilder tags = new TagsBuilder(); float moveFactor = player.getBukkitPlayer().getWalkSpeed() / 2f; - moveFactor+= moveFactor * 0.30000001192092896D; + moveFactor+= (float) (moveFactor * 0.30000001192092896D); if(player.getPotionHandler().hasPotionEffect(PotionEffectType.SPEED)) - moveFactor += (PlayerUtils.getPotionEffectLevel(player.getBukkitPlayer(), PotionEffectType.SPEED) - * (0.200000000298023224D)) * moveFactor; + moveFactor += (float) ((PlayerUtils.getPotionEffectLevel(player.getBukkitPlayer(), PotionEffectType.SPEED) + * (0.200000000298023224D)) * moveFactor); if(player.getPotionHandler().hasPotionEffect(PotionEffectType.SLOW)) - moveFactor += (PlayerUtils.getPotionEffectLevel(player.getBukkitPlayer(), PotionEffectType.SLOW) - * (-0.15000000596046448D)) * moveFactor; + moveFactor += (float) ((PlayerUtils.getPotionEffectLevel(player.getBukkitPlayer(), PotionEffectType.SLOW) + * (-0.15000000596046448D)) * moveFactor); if (player.getMovement().getFrom().isOnGround()) { tags.addTag("ground"); drag *= 0.91f; - moveFactor *= 0.16277136 / (drag * drag * drag); + moveFactor *= 0.16277136f / (drag * drag * drag); if (player.getMovement().isJumped()) { tags.addTag("jumped"); @@ -67,24 +67,24 @@ public class Speed extends Check { if(player.getInfo().lastLiquid.getResetStreak() < 3) { tags.addTag("water-enter"); - moveFactor*= 1.35; + moveFactor*= 1.35f; } } else if(player.getInfo().lastLiquid.isNotPassed(3)) { - moveFactor*= 1.35; + moveFactor*= 1.35f; tags.addTag("water-leave"); } if(player.getMovement().getLastTeleport().isNotPassed(6) || player.getInfo().lastRespawn.isNotPassed(6)) { tags.addTag("teleport"); - moveFactor+= 0.1; + moveFactor+= 0.1f; moveFactor*= 5; } //In 1.9+, entity collisions add acceleration to their movement. if(player.getInfo().lastEntityCollision.isNotPassed(2)) { tags.addTag("entity-collision"); - moveFactor+= 0.05; + moveFactor+= 0.05f; } //Pistons have the ability to move players 1 whole block @@ -97,14 +97,14 @@ public class Speed extends Check { //Ensuring they aren't just entering or leaving web && player.getInfo().lastWeb.getResetStreak() > 1) { tags.addTag("web"); - moveFactor*= 0.4; + moveFactor*= 0.4f; } if(player.getBlockInfo().onSoulSand && player.getMovement().getFrom().isOnGround() //Ensuring the player is actually standing on the block and recieving slow && packet.getY() % (1) == 0.875) { tags.addTag("soulsand"); - moveFactor*= 0.88; + moveFactor*= 0.88f; } double ratio = (player.getMovement().getDeltaXZ() - ldxz) / moveFactor * 100; diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/velocity/VelocityA.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/velocity/VelocityA.java index 0f1b588..4786f24 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/velocity/VelocityA.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/velocity/VelocityA.java @@ -10,7 +10,7 @@ import dev.brighten.ac.packet.wrapper.in.WPacketPlayInFlying; import dev.brighten.ac.utils.annotation.Bind; import org.bukkit.util.Vector; -@CheckData(name = "Velocity (Vertical)", checkId = "velocitya", type = CheckType.MOVEMENT, maxVersion = ProtocolVersion.V1_21_4) +@CheckData(name = "Velocity (Vertical)", checkId = "velocitya", type = CheckType.MOVEMENT, maxVersion = ProtocolVersion.V1_21_5) public class VelocityA extends Check { private Vector currentVelocity = null; @@ -49,7 +49,7 @@ public class VelocityA extends Check { if(++buffer > 15) { flag("pct=%.1f%% buffer=%.1f", pct, buffer); } - } else if(buffer > 0) buffer-= 0.5; + } else if(buffer > 0) buffer-= 0.5F; debug("pct=%.1f%% buffer=%.1f dy=%.4f vy=%.4f", pct, buffer, player.getMovement().getDeltaY(), currentVelocity.getY()); diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/packet/order/Timer.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/packet/badpackets/Timer.java similarity index 90% rename from Anticheat/src/main/java/dev/brighten/ac/check/impl/packet/order/Timer.java rename to Anticheat/src/main/java/dev/brighten/ac/check/impl/packet/badpackets/Timer.java index d5eb360..dcb5d22 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/packet/order/Timer.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/packet/badpackets/Timer.java @@ -1,4 +1,4 @@ -package dev.brighten.ac.check.impl.packet.order; +package dev.brighten.ac.check.impl.packet.badpackets; import dev.brighten.ac.Anticheat; import dev.brighten.ac.api.check.CheckType; @@ -23,14 +23,11 @@ public class Timer extends Check { } private int buffer; - private final dev.brighten.ac.utils.timer.Timer lastFlag = new TickTimer(), - lastReset = new TickTimer(); + private final dev.brighten.ac.utils.timer.Timer lastFlag = new TickTimer(); private long totalTimer = -1; @Bind - WAction position = packet -> { - totalTimer-= 50; - }; + WAction position = packet -> totalTimer-= 50; @Bind WAction blockPlace = packet -> { @@ -64,7 +61,7 @@ public class Timer extends Check { long threshold = timestamp + 100, delta = totalTimer - threshold; - boolean isLagProblem = Anticheat.INSTANCE.getKeepaliveProcessor().laggyPlayers + boolean isLagProblem = (double)Anticheat.INSTANCE.getKeepaliveProcessor().laggyPlayers / (double)Anticheat.INSTANCE.getKeepaliveProcessor().totalPlayers > 0.8; if(totalTimer > threshold && !isLagProblem) { diff --git a/Anticheat/src/main/java/dev/brighten/ac/command/AnticheatCommand.java b/Anticheat/src/main/java/dev/brighten/ac/command/AnticheatCommand.java index de5e60f..4c96d63 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/command/AnticheatCommand.java +++ b/Anticheat/src/main/java/dev/brighten/ac/command/AnticheatCommand.java @@ -24,6 +24,7 @@ import org.bukkit.entity.Player; import java.io.UnsupportedEncodingException; import java.util.ArrayList; +import java.util.logging.Level; @Init(priority = Priority.LOW) @CommandAlias("kauri|anticheat|ac") @@ -98,7 +99,7 @@ public class AnticheatCommand extends BaseCommand { } @Subcommand("debug") - @CommandCompletion("@checks|none @players") + @CommandCompletion("@checks|none|sniff|boxes @players") @Description("Debug a player") @Syntax("[check] [player]") @CommandPermission("anticheat.command.debug") @@ -136,7 +137,7 @@ public class AnticheatCommand extends BaseCommand { String.join("\n", targetData.sniffedPackets.toArray(new String[0])), "Sniffed from " + target.getName(), Pastebin.Privacy.UNLISTED)); } catch (UnsupportedEncodingException e) { - e.printStackTrace(); + Anticheat.INSTANCE.getLogger().log(Level.WARNING, "Failed to paste link for sniffed packets", e); } targetData.sniffedPackets.clear(); } else { @@ -148,6 +149,23 @@ public class AnticheatCommand extends BaseCommand { } break; } + case "boxes": { + APlayer player = Anticheat.INSTANCE.getPlayerRegistry().getPlayer(target.getUniqueId()).orElse(null); + + if(player == null) { + sender.sendMessage(Color.Red + "Error: Could not get your player information."); + break; + } + + if(player.isBoxDebug()) { + player.setBoxDebug(false); + sender.sendMessage(Color.Red + "Turned off colliding bounding box debug."); + } else { + player.setBoxDebug(true); + sender.sendMessage(Color.Green + "Turned on colliding bounding box debug."); + } + break; + } default: { if(!Anticheat.INSTANCE.getCheckManager().isCheck(check)) { sender.sendMessage(Color.Red + "Check \"" + check + "\" is not a valid check!"); diff --git a/Anticheat/src/main/java/dev/brighten/ac/command/LogsCommand.java b/Anticheat/src/main/java/dev/brighten/ac/command/LogsCommand.java index 0222fa1..2ffca70 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/command/LogsCommand.java +++ b/Anticheat/src/main/java/dev/brighten/ac/command/LogsCommand.java @@ -8,6 +8,7 @@ import dev.brighten.ac.check.CheckSettings; import dev.brighten.ac.gui.Logs; import dev.brighten.ac.logging.Log; import dev.brighten.ac.utils.Color; +import dev.brighten.ac.utils.MojangAPI; import dev.brighten.ac.utils.Pastebin; import dev.brighten.ac.utils.Priority; import dev.brighten.ac.utils.annotation.Init; @@ -15,14 +16,16 @@ import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.Nullable; import java.io.*; import java.net.URL; import java.nio.charset.StandardCharsets; -import java.sql.Timestamp; -import java.time.format.DateTimeFormatter; +import java.text.SimpleDateFormat; import java.util.*; +import java.util.function.Consumer; import java.util.logging.Level; +import java.util.stream.Collectors; @Init(priority = Priority.LOW) @CommandAlias("kauri|anticheat|ac") @@ -34,125 +37,61 @@ public class LogsCommand extends BaseCommand { @CommandCompletion("@players @checkIds") @CommandPermission("anticheat.command.logs") @Description("Get player logs") - public void onLogs(CommandSender sender, @Single String playername, + public void onLogs(Player sender, @Single String playername, @Single @Optional @Default("none") String check, @Single @Optional @Default("5000") int limit) { - UUID uuid = Bukkit.getOfflinePlayer(playername).getUniqueId(); + UUID uuid = MojangAPI.getUUID(playername).orElse(null); - sender.sendMessage(Color.Red + "Getting logs for " + playername + "..."); + if(uuid == null) { + sender.sendMessage(Color.Red + String.format("There is no player with the name \"%s\"", playername)); + return; + } + + sender.sendMessage(Color.Red + "Getting logs for " + playername + " with UUID " + uuid + " and check " + check + " with limit " + limit + "..."); Anticheat.INSTANCE.getRunUtils().taskAsync(() -> { - if(sender instanceof Player) { - if(check.equals("none")) { - Logs logs = new Logs(uuid); + Logs logs; + if(check.equals("none")) { + logs = new Logs(uuid); - logs.showMenu((Player) sender); - } else { - Logs logs = new Logs(uuid, check); - - logs.showMenu((Player) sender); - } } else { - List logs = new ArrayList<>(); + logs = new Logs(uuid, check); - if(check.equals("none")) { - Anticheat.INSTANCE.getLogManager().getLogs(uuid, limit, logsList -> { - logsList.forEach(log -> { - logs.add("[" + new Timestamp(log.getTime()).toLocalDateTime() - .format(DateTimeFormatter.ISO_DATE_TIME) + "] funkemunky failed " - + Anticheat.INSTANCE.getCheckManager().getIdToName().get(log.getCheckId()) + "(VL: " - + log.getVl() + ") {" + log.getData() + "}"); - }); - if(logs.isEmpty()) { - sender.sendMessage(Color.Gray + "There are no logs for player \"" + playername + "\""); - } else { - String url = null; - try { - url = Pastebin.makePaste(String.join("\n", logs), playername + "'s Logs", - Pastebin.Privacy.UNLISTED); - - sender.sendMessage(Color.Green + "Logs for " + playername + ": " + Color.White + url); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } - } - }); - } else { - Anticheat.INSTANCE.getLogManager().getLogs(uuid, check, limit, logsList -> { - logsList.forEach(log -> { - logs.add("[" + new Timestamp(log.getTime()).toLocalDateTime() - .format(DateTimeFormatter.ISO_DATE_TIME) + "] funkemunky failed " - + Anticheat.INSTANCE.getCheckManager().getIdToName().get(log.getCheckId()) - + "(VL: " + log.getVl() + ") {" + log.getData() + "}"); - }); - if(logs.isEmpty()) { - sender.sendMessage(Color.Gray + " does not have any violations for check \"" + check + "\""); - } else { - String url = null; - try { - url = Pastebin.makePaste(String.join("\n", logs), playername + "'s Logs", - Pastebin.Privacy.UNLISTED); - - sender.sendMessage(Color.Green + "Logs for " + playername + ": " + Color.White + url); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } - } - }); - } } + logs.showMenu(sender); }); } @Subcommand("logs paste") @CommandPermission("kauri.command.logs") - @Syntax("[player]") - @CommandCompletion("@players") + @Syntax("[player] [check|none]") + @CommandCompletion("@players @checkIds") @Description("View logs via Pastebin") - public void onLogsPasteBin(CommandSender sender, String[] args) { + public void onLogsPasteBin(CommandSender sender, + @Single String playerName, + @Single @Optional @Default("none") String check, + String[] args) { if(args.length == 0) { - sender.sendMessage(Color.Red + "Usage: /kauri logs web "); + sender.sendMessage(Color.Red + "Usage: /kauri logs paste "); return; } - String playername = args[0]; + UUID uuid = MojangAPI.getUUID(playerName).orElse(null); - UUID uuid = Bukkit.getOfflinePlayer(playername).getUniqueId(); + if(uuid == null) { + sender.sendMessage(Color.Red + String.format("There is no player with the name \"%s\"", playerName)); + return; + } - sender.sendMessage(Color.Red + "Getting logs for " + playername + "..."); + sender.sendMessage(Color.Red + "Getting logs for " + playerName + "..."); - Anticheat.INSTANCE.getRunUtils().taskAsync(() -> { - if(sender instanceof Player) { - Logs logs = new Logs(uuid); - - logs.showMenu((Player) sender); - } else { - List logs = new ArrayList<>(); - - Anticheat.INSTANCE.getLogManager().getLogs(uuid, logsList -> { - logsList.forEach(log -> { - logs.add("[" + new Timestamp(log.getTime()).toLocalDateTime() - .format(DateTimeFormatter.ISO_DATE_TIME) + "] funkemunky failed " - + Anticheat.INSTANCE.getCheckManager().getIdToName().get(log.getCheckId()) + "(VL: " - + log.getVl() + ") {" + log.getData() + "}"); - }); - if(logs.isEmpty()) { - sender.sendMessage(Color.Gray + "There are no logs for player \"" + playername + "\""); - } else { - String url; - try { - url = Pastebin.makePaste(String.join("\n", logs), playername + "'s Logs", - Pastebin.Privacy.UNLISTED); - - sender.sendMessage(Color.Green + "Logs for " + playername + ": " + Color.White + url); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } - } - }); - } - }); + if(check.equals("none")) { + runPastebin(sender, uuid, playerName, null); + } else { + runPastebin(sender, uuid, playerName, check); + } } + @SuppressWarnings("deprecation") @Subcommand("logs web") @CommandPermission("kauri.command.logs") @Syntax("[player]") @@ -175,7 +114,37 @@ public class LogsCommand extends BaseCommand { runWebLog(sender, player); } } + private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + private void runPastebin(CommandSender sender, UUID uuid, String name, @Nullable String checkId) { + Consumer> logHandle = logs -> { + String body = logs.stream().map(log -> String.format("[%s] (%s; vl=%.2f): %s", timeToDate(log.getTime()), + log.getCheckName(), log.getVl(), log.getData())) + .collect(Collectors.joining("\n")); + String title = String.format("%s's Anticheat Logs at %s", name, format.format(new Date())); + try { + var pastebin = Pastebin.makePaste(body, title, Pastebin.Privacy.UNLISTED); + + sender.sendMessage(String.format(Color.Green + "Logs for %s: %s", name, Color.White + pastebin)); + } catch (UnsupportedEncodingException e) { + sender.sendMessage(Color.Red + "There was an error trying to make the pasted link. Check console."); + Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Anticheat Logs could not be made", e); + } + }; + + if(checkId != null) { + Anticheat.INSTANCE.getLogManager().getLogs(uuid, checkId, 100000, 0, logHandle); + } else { + Anticheat.INSTANCE.getLogManager().getLogs(uuid, 100000, 0, logHandle); + } + } + + + private String timeToDate(long timeStamp) { + return format.format(new Date(timeStamp)); + } + + @SuppressWarnings("unchecked") private void runWebLog(CommandSender sender, OfflinePlayer target) { //val logs = Kauri.INSTANCE.loggerManager.getLogs(target.getUniqueId()); Anticheat.INSTANCE.getLogManager().getLogs(target.getUniqueId(), 100000, 0, logs -> { @@ -198,13 +167,10 @@ public class LogsCommand extends BaseCommand { if (!violations.isEmpty()) { for (String key : violations.keySet()) { if (Anticheat.INSTANCE.getCheckManager().isCheck(key)) { - var checkClass = Anticheat.INSTANCE.getCheckManager().getCheckClasses() - .get(Anticheat.INSTANCE.getCheckManager().getIdToName().get(key)) - .getCheckClass().getParent(); - - CheckSettings checkData = Anticheat.INSTANCE.getCheckManager() - .getCheckSettings(checkClass); + .getCheckSettings(Anticheat.INSTANCE.getCheckManager().getCheckClasses() + .get(Anticheat.INSTANCE.getCheckManager().getIdToName().get(key)) + .getCheckClass().getParent()); int vl = violations.get(key), maxVL = checkData.getPunishVl(); boolean developer = false; @@ -230,7 +196,7 @@ public class LogsCommand extends BaseCommand { finalURL = finalURL.replace("%id%", readAll(reader)); } catch (IOException e) { - Anticheat.INSTANCE.getLogger().log(Level.WARNING, "Failed to get logs for " + target.getName(), e); + Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Anticheat Logs could not be made", e); } sender.sendMessage(Color.translate("&aView the log here&7: &f" + finalURL)); diff --git a/Anticheat/src/main/java/dev/brighten/ac/data/APlayer.java b/Anticheat/src/main/java/dev/brighten/ac/data/APlayer.java index 7c8cb40..d2e197d 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/data/APlayer.java +++ b/Anticheat/src/main/java/dev/brighten/ac/data/APlayer.java @@ -88,8 +88,8 @@ public class APlayer { @Getter //TODO Actually grab real player version once finished implementing version grabber from Atlas private ProtocolVersion playerVersion = ProtocolVersion.UNKNOWN; - @Getter - private final Object playerConnection; + + private Object playerConnection; public Emulator EMULATOR; @@ -113,7 +113,7 @@ public class APlayer { @Setter @Getter - private boolean sendingPackets; + private boolean sendingPackets, boxDebug = false; @Getter private boolean initialized = false; @@ -248,34 +248,36 @@ public class APlayer { mob.despawn(); } + public Object getPlayerConnection() { + if(this.playerConnection == null) { + this.playerConnection = MinecraftReflection.getPlayerConnection(bukkitPlayer); + } - public int runKeepaliveAction(Consumer action) { - return runKeepaliveAction(action, 0); + return this.playerConnection; } - public int runKeepaliveAction(Consumer action, int later) { - int id = Anticheat.INSTANCE.getKeepaliveProcessor().currentKeepalive.start + later; + + public void runKeepaliveAction(Consumer action) { + runKeepaliveAction(action, 0); + } + + public void runKeepaliveAction(Consumer action, int later) { + int id = Anticheat.INSTANCE.getKeepaliveProcessor().currentKeepalive.id + later; keepAliveStamps.add(new NormalAction(id, action)); - return id; } public void onVelocity(Consumer runnable) { onVelocityTasks.add(runnable); } - public void runInstantAction(Consumer runnable) { - runInstantAction(runnable, false); - } - - public void runInstantAction(Consumer runnable, boolean flush) { short startId = (short) ThreadLocalRandom.current().nextInt(Short.MIN_VALUE, Short.MAX_VALUE), endId = (short)(startId + 1); //Ensuring we don't have any duplicate IDS - val map = Anticheat.INSTANCE.getKeepaliveProcessor().keepAlives.asMap(); + val map = Anticheat.INSTANCE.getKeepaliveProcessor().keepAlives; while (map.containsKey(startId) || map.containsKey(endId)) { startId = (short) ThreadLocalRandom.current().nextInt(Short.MIN_VALUE, Short.MAX_VALUE); @@ -323,7 +325,8 @@ public class APlayer { public void sendPacketSilently(Object packet) { if(sniffing) { - sniffedPackets.add("(Silent) [" + Anticheat.INSTANCE.getKeepaliveProcessor().tick + "] " + (packet instanceof WPacket ? ((WPacket)packet).getPacketType() + sniffedPackets.add("(Silent) [" + Anticheat.INSTANCE.getKeepaliveProcessor().tick + "] " + + (packet instanceof WPacket ? ((WPacket)packet).getPacketType() : HandlerAbstract.getPacketType(packet)) + ": " + packet); } HandlerAbstract.getHandler().sendPacketSilently(this, packet); diff --git a/Anticheat/src/main/java/dev/brighten/ac/data/info/BlockInformation.java b/Anticheat/src/main/java/dev/brighten/ac/data/info/BlockInformation.java index 55b10cb..097916e 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/data/info/BlockInformation.java +++ b/Anticheat/src/main/java/dev/brighten/ac/data/info/BlockInformation.java @@ -3,10 +3,8 @@ package dev.brighten.ac.data.info; import dev.brighten.ac.Anticheat; import dev.brighten.ac.data.APlayer; import dev.brighten.ac.packet.ProtocolVersion; -import dev.brighten.ac.utils.BlockUtils; -import dev.brighten.ac.utils.Materials; -import dev.brighten.ac.utils.MiscUtils; -import dev.brighten.ac.utils.XMaterial; +import dev.brighten.ac.packet.wrapper.objects.EnumParticle; +import dev.brighten.ac.utils.*; import dev.brighten.ac.utils.math.IntVector; import dev.brighten.ac.utils.world.BlockData; import dev.brighten.ac.utils.world.CollisionBox; @@ -15,7 +13,6 @@ import dev.brighten.ac.utils.world.types.SimpleCollisionBox; import me.hydro.emulator.util.mcp.MathHelper; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.World; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; @@ -105,7 +102,6 @@ public class BlockInformation { synchronized (aboveCollisions) { aboveCollisions.clear(); } - final World world = player.getBukkitPlayer().getWorld(); int it = 12 * 12; int xstart = Math.min(startX, endX), xend = Math.max(startX, endX); @@ -154,6 +150,15 @@ public class BlockInformation { }); } + if(player.isBoxDebug()) { + Anticheat.INSTANCE.getScheduler().execute(() -> + blockBox.downCast().forEach(sc -> + Helper.drawCuboid(sc, + EnumParticle.FLAME, + Collections.singletonList(player.getBukkitPlayer() + )))); + } + if(blockBox.isCollided(normalBox)) { if(type.equals(cobweb)) inWeb = true; diff --git a/Anticheat/src/main/java/dev/brighten/ac/gui/Logs.java b/Anticheat/src/main/java/dev/brighten/ac/gui/Logs.java index 9f7e4cf..1e011cd 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/gui/Logs.java +++ b/Anticheat/src/main/java/dev/brighten/ac/gui/Logs.java @@ -98,10 +98,10 @@ public class Logs extends PagedMenu { getFixedItems().put(getMenuDimension().getSize() - 5, button); for (Log log : logs) { - if(allowedLogs.size() > 0 && !allowedLogs.contains(log.getCheckId())) continue; + if(!allowedLogs.isEmpty() && !allowedLogs.contains(log.getCheckId())) continue; ItemBuilder builder = new ItemBuilder(XMaterial.PAPER.parseMaterial()).amount(1) - .name(Color.Gold + log.getCheckId()); + .name(Color.Gold + log.getCheckName()); String[] split = MiscUtils.splitIntoLine(log.getData(), 45); List lore = new ArrayList<>(Arrays.asList("&eVL: &f" + log.getVl(), diff --git a/Anticheat/src/main/java/dev/brighten/ac/handler/BBRevealHandler.java b/Anticheat/src/main/java/dev/brighten/ac/handler/BBRevealHandler.java index 2a724ec..c2f9ee2 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/handler/BBRevealHandler.java +++ b/Anticheat/src/main/java/dev/brighten/ac/handler/BBRevealHandler.java @@ -64,6 +64,8 @@ public class BBRevealHandler implements Listener { blocksToShow.add(blockLoc); event.getPlayer().spigot().sendMessage(new ComponentBuilder("Now showing block: ") .color(ChatColor.GREEN).append(event.getClickedBlock().getType().name()).color(ChatColor.WHITE) + .append(" (collidable=" + Materials.checkFlag(event.getClickedBlock().getType(), Materials.COLLIDABLE) + ")") + .color(ChatColor.GRAY) .create()); } } else { diff --git a/Anticheat/src/main/java/dev/brighten/ac/handler/PacketHandler.java b/Anticheat/src/main/java/dev/brighten/ac/handler/PacketHandler.java index 67ca614..b313294 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/handler/PacketHandler.java +++ b/Anticheat/src/main/java/dev/brighten/ac/handler/PacketHandler.java @@ -33,7 +33,7 @@ public class PacketHandler { WPacketPlayInTransaction packet = (WPacketPlayInTransaction) packetObject; if (packet.getId() == 0) { - if (Anticheat.INSTANCE.getKeepaliveProcessor().keepAlives.getIfPresent(packet.getAction()) != null) { + if (Anticheat.INSTANCE.getKeepaliveProcessor().keepAlives.get(packet.getAction()) != null) { Anticheat.INSTANCE.getKeepaliveProcessor().addResponse(player, packet.getAction()); val optional = Anticheat.INSTANCE.getKeepaliveProcessor().getResponse(player); @@ -44,14 +44,14 @@ public class PacketHandler { player.addPlayerTick(); player.getLagInfo().setLastTransPing(player.getLagInfo().getTransPing()); - player.getLagInfo().setTransPing(current - ka.start); + player.getLagInfo().setTransPing(current - ka.id); if (player.getPlayerVersion().isOrAbove(ProtocolVersion.V1_9) && player.getMovement().getLastFlying().isPassed(1)) { player.getMovement().runPositionHackFix(); } - if (player.instantTransaction.size() > 0) { + if (!player.instantTransaction.isEmpty()) { synchronized (player.instantTransaction) { Deque toRemove = new LinkedList<>(); player.instantTransaction.forEach((key, tuple) -> { @@ -61,7 +61,7 @@ public class PacketHandler { toRemove.add(key); } }); - Short key = null; + Short key; while ((key = toRemove.poll()) != null) { player.instantTransaction.remove(key); } @@ -73,14 +73,13 @@ public class PacketHandler { player.getLagInfo().getLastPingDrop().reset(); } - ka.getReceived(player.getBukkitPlayer().getUniqueId()).ifPresent(r -> { - r.receivedStamp = timestamp; - }); + ka.getReceived(player.getBukkitPlayer().getUniqueId()) + .ifPresent(r -> r.receivedStamp = timestamp); synchronized (player.keepAliveStamps) { List toRemove = new ArrayList<>(); for (NormalAction action : player.keepAliveStamps) { - if (action.stamp > ka.start) continue; + if (action.stamp > ka.id) continue; action.action.accept(ka); toRemove.add(action); @@ -246,11 +245,10 @@ public class PacketHandler { long serverTime = serial.readLong(); long clientReceivedTime = serial.readLong(); - long currentTime = timestamp; long serverPing = clientReceivedTime - serverTime; - long clientToServer = currentTime - clientReceivedTime; - long totalFeedback = currentTime - serverTime; + long clientToServer = timestamp - clientReceivedTime; + long totalFeedback = timestamp - serverTime; player.getBukkitPlayer().sendMessage(String.format("total: %sms client-server: %sms server-client: %sms", totalFeedback, clientToServer, serverPing)); } @@ -369,9 +367,11 @@ public class PacketHandler { if(player.sniffing) { if(type != PacketType.UNKNOWN) { - player.sniffedPackets.add("[" + Anticheat.INSTANCE.getKeepaliveProcessor().tick + "] " + type.name() + ": " + packetObject.toString()); + player.sniffedPackets.add("[" + Anticheat.INSTANCE.getKeepaliveProcessor().tick + "] " + type.name() + + ": " + packetObject.toString()); } else { - player.sniffedPackets.add("[" + Anticheat.INSTANCE.getKeepaliveProcessor().tick + "] (UNKNOWN) " + packetObject.getClass().getSimpleName() + ": " + packetObject); + player.sniffedPackets.add("[" + Anticheat.INSTANCE.getKeepaliveProcessor().tick + "] (UNKNOWN) " + + packetObject.getClass().getSimpleName() + ": " + packetObject); } } diff --git a/Anticheat/src/main/java/dev/brighten/ac/handler/keepalive/KeepAlive.java b/Anticheat/src/main/java/dev/brighten/ac/handler/keepalive/KeepAlive.java index 591eacd..c565383 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/handler/keepalive/KeepAlive.java +++ b/Anticheat/src/main/java/dev/brighten/ac/handler/keepalive/KeepAlive.java @@ -11,12 +11,10 @@ import java.util.UUID; public class KeepAlive { - public final int start; public final short id; public long startStamp; - public KeepAlive(int start, short id) { - this.start = start; + public KeepAlive(short id) { this.id = id; } @@ -36,6 +34,7 @@ public class KeepAlive { return Optional.empty(); } + @SuppressWarnings("unused") @RequiredArgsConstructor public static class KAReceived { public final APlayer data; diff --git a/Anticheat/src/main/java/dev/brighten/ac/handler/keepalive/KeepaliveProcessor.java b/Anticheat/src/main/java/dev/brighten/ac/handler/keepalive/KeepaliveProcessor.java index 7ae46e8..d2b7b9f 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/handler/keepalive/KeepaliveProcessor.java +++ b/Anticheat/src/main/java/dev/brighten/ac/handler/keepalive/KeepaliveProcessor.java @@ -1,7 +1,5 @@ package dev.brighten.ac.handler.keepalive; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; import dev.brighten.ac.Anticheat; import dev.brighten.ac.data.APlayer; import dev.brighten.ac.packet.handler.HandlerAbstract; @@ -10,21 +8,21 @@ import dev.brighten.ac.utils.BukkitRunnable; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.shorts.Short2ObjectArrayMap; import org.bukkit.scheduler.BukkitTask; +import java.util.Map; import java.util.Optional; -import java.util.concurrent.TimeUnit; public class KeepaliveProcessor implements BukkitRunnable { private BukkitTask task; - public KeepAlive currentKeepalive = new KeepAlive(0, (short) 0); - public int tick; + public KeepAlive currentKeepalive = new KeepAlive((short) 0); + public short tick; public int totalPlayers, laggyPlayers; - public final Cache keepAlives = CacheBuilder.newBuilder().concurrencyLevel(4) - .expireAfterWrite(15, TimeUnit.SECONDS).build(); + public final Map keepAlives = new Short2ObjectArrayMap<>(); final Int2ObjectMap lastResponses = Int2ObjectMaps.synchronize(new Int2ObjectOpenHashMap<>()); @@ -34,12 +32,14 @@ public class KeepaliveProcessor implements BukkitRunnable { @Override public void run(BukkitTask task) { tick++; + + if(tick > Short.MAX_VALUE - 2) { + tick = 0; + keepAlives.clear(); + } synchronized (keepAlives) { - short id = (short) (tick > Short.MAX_VALUE ? tick % Short.MAX_VALUE : tick); - //Ensuring we don't have any duplicate IDS - - currentKeepalive = new KeepAlive(tick, id); + currentKeepalive = new KeepAlive(tick); keepAlives.put(currentKeepalive.id, currentKeepalive); } @@ -66,12 +66,8 @@ public class KeepaliveProcessor implements BukkitRunnable { } } - public Optional getKeepByTick(int tick) { - return keepAlives.asMap().values().stream().filter(ka -> ka.start == tick).findFirst(); - } - public Optional getKeepById(short id) { - return Optional.ofNullable(keepAlives.getIfPresent(id)); + return Optional.ofNullable(keepAlives.getOrDefault(id, null)); } public Optional getResponse(APlayer data) { diff --git a/Anticheat/src/main/java/dev/brighten/ac/listener/JoinListener.java b/Anticheat/src/main/java/dev/brighten/ac/listener/JoinListener.java index c8a5718..79cc177 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/listener/JoinListener.java +++ b/Anticheat/src/main/java/dev/brighten/ac/listener/JoinListener.java @@ -8,8 +8,8 @@ import dev.brighten.ac.utils.annotation.Init; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerKickEvent; +import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerQuitEvent; import java.util.Optional; @@ -19,7 +19,7 @@ public class JoinListener implements Listener { public JoinListener() { Anticheat.INSTANCE.getPacketProcessor().processAsync(EventPriority.NORMAL, event -> { - if(event.isCancelled()) return; + if(event.isCancelled() || !Anticheat.INSTANCE.isEnabled()) return; Optional aplayer = Anticheat.INSTANCE.getPlayerRegistry() .getPlayer(event.getPlayer().getUniqueId()); @@ -35,6 +35,8 @@ public class JoinListener implements Listener { }); Anticheat.INSTANCE.getPacketProcessor().process(EventPriority.HIGHEST, event -> { + if(!Anticheat.INSTANCE.isEnabled()) + return; Optional op = Anticheat.INSTANCE.getPlayerRegistry().getPlayer(event.getPlayer().getUniqueId()); if(op.isEmpty()) { @@ -46,7 +48,7 @@ public class JoinListener implements Listener { if(player.isSendingPackets() || !player.isInitialized()) return; if(event.getType().equals(PacketType.CLIENT_TRANSACTION)) { - if(player.getPacketQueue().size() > 0) { + if(!player.getPacketQueue().isEmpty()) { player.setSendingPackets(true); Object packetToSend; synchronized (player.getPacketQueue()) { @@ -73,17 +75,21 @@ public class JoinListener implements Listener { }); } - @EventHandler - public void onJoin(PlayerJoinEvent event) { + @EventHandler(priority = EventPriority.HIGHEST) + public void onJoin(PlayerLoginEvent event) { for(int i = 0; i < 10 ; i++) { Anticheat.INSTANCE.getLogger().info("Player joined. " + event.getPlayer().getName()); } + + if(event.getResult() != PlayerLoginEvent.Result.ALLOWED) { + return; + } APlayer player = Anticheat.INSTANCE.getPlayerRegistry().generate(event.getPlayer()); if(Anticheat.INSTANCE.getPlayerRegistry().aplayerMap.containsKey(event.getPlayer().getUniqueId().hashCode())) { if(Anticheat.INSTANCE.getPlayerRegistry().aplayerMap .containsKey(event.getPlayer().getUniqueId().hashCode()) - && event.getPlayer() != null && event.getPlayer().isOnline()) { + && event.getPlayer() != null) { HandlerAbstract.getHandler().add(event.getPlayer()); } } diff --git a/Anticheat/src/main/java/dev/brighten/ac/logging/Log.java b/Anticheat/src/main/java/dev/brighten/ac/logging/Log.java index bfdaa50..8007c73 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/logging/Log.java +++ b/Anticheat/src/main/java/dev/brighten/ac/logging/Log.java @@ -1,41 +1,34 @@ package dev.brighten.ac.logging; -import dev.brighten.ac.utils.json.JSONException; -import dev.brighten.ac.utils.json.JSONObject; import lombok.*; +import org.dizitart.no2.collection.NitriteId; +import org.dizitart.no2.index.IndexType; import org.dizitart.no2.repository.annotations.Entity; import org.dizitart.no2.repository.annotations.Id; +import org.dizitart.no2.repository.annotations.Index; +import java.io.Serializable; import java.util.UUID; -@Entity +@Entity(value = "logs", +indices = { + @Index(fields = {"uuid"}, type = IndexType.NON_UNIQUE), + @Index(fields = {"uuid", "checkId"}, type = IndexType.NON_UNIQUE), + @Index(fields = {"time"}, type = IndexType.NON_UNIQUE), + @Index(fields = {"uuid", "checkId", "time"}, type = IndexType.NON_UNIQUE) +}) @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Builder -public class Log { +public class Log implements Serializable { @Id - private long id; + private NitriteId id; public UUID uuid; private float vl; private long time; private String data; private String checkId; - - public String toJson() { - JSONObject object = new JSONObject(); - - try { - object.put("uuid", uuid.toString()); - object.put("vl", vl); - object.put("time", time); - object.put("data", data); - object.put("checkId", checkId); - - return object.toString(); - } catch (JSONException e) { - throw new RuntimeException(e); - } - } + private String checkName; } diff --git a/Anticheat/src/main/java/dev/brighten/ac/logging/LoggerManager.java b/Anticheat/src/main/java/dev/brighten/ac/logging/LoggerManager.java index c345b94..3144cae 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/logging/LoggerManager.java +++ b/Anticheat/src/main/java/dev/brighten/ac/logging/LoggerManager.java @@ -3,6 +3,7 @@ package dev.brighten.ac.logging; import dev.brighten.ac.Anticheat; import dev.brighten.ac.check.CheckData; import dev.brighten.ac.data.APlayer; +import lombok.extern.slf4j.Slf4j; import org.dizitart.no2.Nitrite; import org.dizitart.no2.collection.FindOptions; import org.dizitart.no2.common.SortOrder; @@ -19,6 +20,7 @@ import java.util.function.Consumer; import static org.dizitart.no2.filters.FluentFilter.where; +@Slf4j public class LoggerManager { private final File dbDir = new File(Anticheat.INSTANCE.getDataFolder(), "database"); @@ -39,6 +41,10 @@ public class LoggerManager { MVStoreModule storeModule = MVStoreModule.withConfig() .filePath(dbFile) + .compress(true) + .autoCommit(true) + .autoCommitBufferSize(12) + .cacheSize(64) .build(); database = Nitrite.builder() @@ -50,17 +56,20 @@ public class LoggerManager { } public void insertLog(APlayer player, CheckData checkData, float vl, long time, String data) { - logRepo.insert(Log.builder() + var writeResult = logRepo.insert(Log.builder() .uuid(player.getUuid()) .checkId(checkData.checkId()) + .checkName(checkData.name()) .vl(vl) .data(data) .time(time) .build()); - } - public void getLogs(UUID uuid, Consumer> logConsumer) { - getLogs(uuid, 2000, logConsumer); + try { + Anticheat.INSTANCE.getLogger().info("Inserted log: " + writeResult.getAffectedCount()); + } catch (Exception e) { + throw new RuntimeException(e); + } } public void getLogs(UUID uuid, int limit, Consumer> logConsumer) { @@ -69,52 +78,24 @@ public class LoggerManager { public void getLogs(UUID uuid, int limit, int skip, Consumer> logsConsumer) { Anticheat.INSTANCE.getScheduler().execute(() -> { - var list = logRepo.find(where("uuid").eq(uuid), new FindOptions().skip(skip).limit(limit)).toList(); + var cursor = logRepo.find(where("uuid").eq(uuid), new FindOptions() + .limit(limit).skip(skip) + .thenOrderBy("time", SortOrder.Descending)); - logsConsumer.accept(list); + List logs = cursor.toList(); + + logsConsumer.accept(logs); }); } - - public void getLogs(UUID uuid, String checkId, int limit, Consumer> logConsumer) { - getLogs(uuid, checkId, limit, 0, logConsumer); - } - public void getLogs(UUID uuid, String checkId, int limit, int skip, Consumer> logsConsumer) { Anticheat.INSTANCE.getScheduler().execute(() -> { - var list = logRepo.find(Filter.and(where("uuid").eq(uuid), where("checkId").eq(checkId)), - new FindOptions().skip(skip).limit(limit)).toList(); + var cursor = logRepo.find(Filter.and(where("uuid").eq(uuid), where("checkId").eq(checkId)), + new FindOptions().skip(skip).limit(limit)); - logsConsumer.accept(list); - }); - } + List logs = cursor.toList(); - public void getLogs(UUID uuid, String checkId, long timeBefore, long timeAfter, - Consumer> logsConsumer) { - getLogs(uuid, checkId, timeBefore, timeAfter, 500, 0, logsConsumer); - } - public void getLogs(UUID uuid, String checkId, long timeBefore, long timeAfter, int limit, int skip, - Consumer> logsConsumer) { - Anticheat.INSTANCE.getScheduler().execute(() -> { - var list = logRepo.find(Filter - .and(where("uuid").eq(uuid), - where("checkId").eq(checkId), - where("time").lte(timeAfter), - where("time").gte(timeBefore)), - new FindOptions().skip(skip).limit(limit)).toList(); - - logsConsumer.accept(list); - }); - } - - public void getRecentLogs(int limit, Consumer> logsConsumer) { - Anticheat.INSTANCE.getScheduler().execute(() -> { - var list = logRepo.find(new FindOptions() - .thenOrderBy("time", SortOrder.Descending) - .limit(limit)) - .toList(); - - logsConsumer.accept(list); + logsConsumer.accept(logs); }); } diff --git a/Anticheat/src/main/java/dev/brighten/ac/packet/handler/ModernHandler.java b/Anticheat/src/main/java/dev/brighten/ac/packet/handler/ModernHandler.java index fc96060..1ecb139 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/packet/handler/ModernHandler.java +++ b/Anticheat/src/main/java/dev/brighten/ac/packet/handler/ModernHandler.java @@ -11,6 +11,7 @@ import dev.brighten.ac.utils.reflections.impl.CraftReflection; import dev.brighten.ac.utils.reflections.impl.MinecraftReflection; import dev.brighten.ac.utils.reflections.types.WrappedClass; import io.netty.channel.*; +import lombok.extern.slf4j.Slf4j; import net.minecraft.server.v1_8_R3.PacketLoginInStart; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -22,6 +23,7 @@ import java.util.Map; import java.util.NoSuchElementException; import java.util.logging.Level; +@Slf4j public class ModernHandler extends HandlerAbstract { private final Map channelCache = new HashMap<>(); @@ -33,7 +35,7 @@ public class ModernHandler extends HandlerAbstract { private final List serverChannels = Lists.newArrayList(); public ModernHandler() { - endInitProtocol = new ChannelInitializer() { + endInitProtocol = new ChannelInitializer<>() { @Override protected void initChannel(Channel channel) { @@ -50,7 +52,7 @@ public class ModernHandler extends HandlerAbstract { }; // This is executed before Minecraft's channel handler - beginInitProtocol = new ChannelInitializer() { + beginInitProtocol = new ChannelInitializer<>() { @Override protected void initChannel(Channel channel) { @@ -83,7 +85,7 @@ public class ModernHandler extends HandlerAbstract { Object result = m.invoke(mcServer); if (result != null) serverConnection = result; } catch (Exception e) { - e.printStackTrace(); + Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Cannot invoke " + m, e); } } } @@ -111,12 +113,12 @@ public class ModernHandler extends HandlerAbstract { @Override public void add(Player player) { try { + Anticheat.INSTANCE.getLogger().info("Handshaking " + player.getName()); Channel channel = getChannel(player); injectChannel(channel).player = player; } catch(IllegalArgumentException e) { - System.out.println("Error"); - e.printStackTrace(); + Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Cannot inject incomming player " + player, e); } } @@ -235,11 +237,11 @@ public class ModernHandler extends HandlerAbstract { super.channelRead(ctx, returnedObject); } } catch (Throwable throwable) { - throwable.printStackTrace(); + Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Cannot call packet " + msg, throwable); try { super.channelRead(ctx, msg); } catch (Exception e) { - e.printStackTrace(); + Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Cannot call packet " + msg, e); } } } else { @@ -264,7 +266,7 @@ public class ModernHandler extends HandlerAbstract { super.write(ctx, returnedObject, promise); } } catch(Throwable throwable) { - throwable.printStackTrace(); + Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Cannot call packet " + msg, throwable); super.write(ctx, msg, promise); } } else super.write(ctx, msg, promise); diff --git a/Anticheat/src/main/java/dev/brighten/ac/utils/ClassScanner.java b/Anticheat/src/main/java/dev/brighten/ac/utils/ClassScanner.java index 0c1a774..55eeaa2 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/utils/ClassScanner.java +++ b/Anticheat/src/main/java/dev/brighten/ac/utils/ClassScanner.java @@ -40,10 +40,6 @@ public class ClassScanner { private final PathMatcher CLASS_FILE = create("glob:*.class"); private final PathMatcher ARCHIVE = create("glob:*.{jar}"); - public void initializeScanner(Class mainClass, Plugin plugin, ClassLoader loader) { - initializeScanner(mainClass, plugin, loader, scanFile(null, mainClass)); - } - public void initializeScanner(Class mainClass, Plugin plugin, ClassLoader loader, Set names) { names.stream() .map(name -> { @@ -54,7 +50,7 @@ public class ClassScanner { } else return new WrappedClass(Class.forName(name, true, loader)); } catch (ClassNotFoundException e) { - Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Could not initialize scanner!", e); + Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Failed to load class " + name, e); } return null; } else { @@ -184,7 +180,7 @@ public class ClassScanner { Files.walkFileTree(dir, newHashSet(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, new SimpleFileVisitor<>() { @Override - public @NotNull FileVisitResult visitFile(Path path, @NotNull BasicFileAttributes attrs) throws IOException { + public @NotNull FileVisitResult visitFile(@NotNull Path path, @NotNull BasicFileAttributes attrs) throws IOException { if (CLASS_FILE.matches(path.getFileName())) { try (InputStream in = Files.newInputStream(path)) { String plugin = findClass(in, annotationClass); @@ -198,7 +194,7 @@ public class ClassScanner { } }); } catch (IOException e) { - Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Error scanning directory", e); + Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Failed to scan directory " + dir, e); } } @@ -244,69 +240,7 @@ public class ClassScanner { } } } catch (IOException e) { - Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Failed to scan path: " + path, e); - } - } - - public Set scanFile(String file, Class clazz) { - return scanFile(file, new URL[]{clazz.getProtectionDomain().getCodeSource().getLocation()}); - } - - public Set scanFile(String file, URL[] urls) { - Set sources = new HashSet<>(); - Set plugins = new HashSet<>(); - - - for (URL url : urls) { - if (!url.getProtocol().equals("file")) { - continue; - } - - URI source; - try { - source = url.toURI(); - } catch (URISyntaxException e) { - continue; - } - - if (sources.add(source)) { - scanPath(file, Paths.get(source), plugins); - } - } - - return plugins; - } - - private void scanPath(String file, Path path, Set plugins) { - if (Files.exists(path)) { - if (Files.isDirectory(path)) { - scanDirectory(file, path, plugins); - } else { - scanZip(file, path, plugins); - } - } - } - - private void scanDirectory(String file, Path dir, final Set plugins) { - try { - Files.walkFileTree(dir, newHashSet(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, - new SimpleFileVisitor<>() { - @Override - public @NotNull FileVisitResult visitFile(Path path, @NotNull BasicFileAttributes attrs) throws IOException { - if (CLASS_FILE.matches(path.getFileName())) { - try (InputStream in = Files.newInputStream(path)) { - String plugin = findPlugin(file, in); - if (plugin != null) { - plugins.add(plugin); - } - } - } - - return FileVisitResult.CONTINUE; - } - }); - } catch (IOException e) { - Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Failed to scan dir: " + dir, e); + Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Failed to scan directory " + path, e); } } @@ -317,54 +251,6 @@ public class ClassScanner { return set; } - - private void scanZip(String file, Path path, Set plugins) { - if (!ARCHIVE.matches(path.getFileName())) { - return; - } - - try (ZipFile zip = new ZipFile(path.toFile())) { - Enumeration entries = zip.entries(); - while (entries.hasMoreElements()) { - ZipEntry entry = entries.nextElement(); - if (entry.isDirectory() || !entry.getName().endsWith(".class")) { - continue; - } - - try (InputStream in = zip.getInputStream(entry)) { - String plugin = findPlugin(file, in); - if (plugin != null) { - plugins.add(plugin); - } - } - } - } catch (IOException e) { - Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Failed to scan zip: " + path + "/" + file, e); - } - } - - public String findPlugin(String file, InputStream in) { - try { - ClassReader reader = new ClassReader(in); - ClassNode classNode = new ClassNode(); - reader.accept(classNode, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES); - String className = classNode.name.replace('/', '.'); - if (classNode.visibleAnnotations != null) { - for (AnnotationNode node : classNode.visibleAnnotations) { - if ((file == null && node.desc - .equals("L" + Init.class.getName().replace(".", "/") + ";")) - || (file != null && node.desc - .equals("L" + file.replace(".", "/") + ";"))) - return className; - } - } - if (classNode.superName != null && (classNode.superName.equals(file))) return className; - } catch (Exception e) { - Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Failed to find plugin: " + file, e); - } - return null; - } - public PathMatcher create(String pattern) { return FileSystems.getDefault().getPathMatcher(pattern); } diff --git a/Anticheat/src/main/java/dev/brighten/ac/utils/MojangAPI.java b/Anticheat/src/main/java/dev/brighten/ac/utils/MojangAPI.java index 2bf1492..635c503 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/utils/MojangAPI.java +++ b/Anticheat/src/main/java/dev/brighten/ac/utils/MojangAPI.java @@ -1,5 +1,6 @@ package dev.brighten.ac.utils; +import dev.brighten.ac.Anticheat; import dev.brighten.ac.utils.json.JSONException; import dev.brighten.ac.utils.json.JSONObject; import dev.brighten.ac.utils.json.JsonReader; @@ -7,6 +8,7 @@ import dev.brighten.ac.utils.json.JsonReader; import java.io.IOException; import java.util.Optional; import java.util.UUID; +import java.util.logging.Level; public class MojangAPI { @@ -14,13 +16,16 @@ public class MojangAPI { try { JSONObject object = JsonReader.readJsonFromUrl("https://funkemunky.cc/mojang/name?uuid=" + uuid.toString()); - if(object.getBoolean("success")) { + if(object.has("name")) { return Optional.of(object.getString("name")); } else { return Optional.empty(); } } catch(JSONException | IOException e) { - e.printStackTrace(); + Anticheat.INSTANCE.getLogger().log( + Level.SEVERE, + String.format("Could not get the username for %s", uuid), + e); return Optional.empty(); } } @@ -29,26 +34,17 @@ public class MojangAPI { try { JSONObject object = JsonReader.readJsonFromUrl("https://funkemunky.cc/mojang/uuid?name=" + name); - if(object.getBoolean("success")) { + if(object.has("uuid")) { return Optional.of(UUID.fromString(object.getString("uuid"))); } else { return Optional.empty(); } } catch(JSONException | IOException e) { - e.printStackTrace(); + Anticheat.INSTANCE.getLogger().log( + Level.SEVERE, + String.format("Could not get the uuid for %s", name), + e); return Optional.empty(); } } - - public static UUID formatFromMojangUUID(String mojangUUID) { - String uuid = ""; - for(int i = 0; i <= 31; i++) { - uuid = uuid + mojangUUID.charAt(i); - if(i == 7 || i == 11 || i == 15 || i == 19) { - uuid = uuid + "-"; - } - } - - return UUID.fromString(uuid); - } } diff --git a/Compat/src/main/java/dev/brighten/ac/packet/ProtocolVersion.java b/Compat/src/main/java/dev/brighten/ac/packet/ProtocolVersion.java index 9cddf7c..87c8c49 100644 --- a/Compat/src/main/java/dev/brighten/ac/packet/ProtocolVersion.java +++ b/Compat/src/main/java/dev/brighten/ac/packet/ProtocolVersion.java @@ -64,6 +64,7 @@ public enum ProtocolVersion { V1_21_1(767, "v1_21_R1"), V1_21_2(768, "v1_21_R1"), V1_21_4(769, "v1_21_R1"), + V1_21_5(770, "V1_21_R1"), UNKNOWN(-1, "UNKNOWN");