diff --git a/pom.xml b/pom.xml index b491b18..339a6ef 100644 --- a/pom.xml +++ b/pom.xml @@ -86,6 +86,12 @@ 1.13 provided + + me.mat1337.loader + loader + 4.0 + provided + org.github.spigot 1.8.8 diff --git a/src/main/java/dev/brighten/ac/Anticheat.java b/src/main/java/dev/brighten/ac/Anticheat.java index d4bd0e0..794d433 100644 --- a/src/main/java/dev/brighten/ac/Anticheat.java +++ b/src/main/java/dev/brighten/ac/Anticheat.java @@ -6,6 +6,7 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder; import dev.brighten.ac.api.AnticheatAPI; import dev.brighten.ac.check.Check; import dev.brighten.ac.check.CheckManager; +import dev.brighten.ac.command.AnticheatCommand; import dev.brighten.ac.data.PlayerRegistry; import dev.brighten.ac.depends.LibraryLoader; import dev.brighten.ac.depends.MavenLibrary; @@ -21,8 +22,6 @@ import dev.brighten.ac.utils.annotation.ConfigSetting; import dev.brighten.ac.utils.annotation.Init; import dev.brighten.ac.utils.annotation.Invoke; import dev.brighten.ac.utils.math.RollingAverageDouble; -import dev.brighten.ac.utils.objects.RemoteClassLoader; -import dev.brighten.ac.utils.reflections.Reflections; import dev.brighten.ac.utils.reflections.types.WrappedClass; import dev.brighten.ac.utils.reflections.types.WrappedField; import dev.brighten.ac.utils.reflections.types.WrappedMethod; @@ -31,13 +30,13 @@ import dev.brighten.ac.utils.timer.impl.TickTimer; import dev.brighten.ac.utils.world.WorldInfo; import lombok.Getter; import lombok.experimental.PackagePrivate; +import me.mat1337.loader.plugin.LoaderPlugin; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.java.JavaPlugin; import java.util.*; import java.util.concurrent.Executors; @@ -53,7 +52,7 @@ import java.util.concurrent.atomic.AtomicLong; @MavenLibrary(groupId = "it.unimi.dsi", artifactId = "fastutil", version = "8.5.6", repo = @Repository(url = "https://repo1.maven.org/maven2")) @MavenLibrary(groupId = "org.ow2.asm", artifactId = "asm", version = "9.2", repo = @Repository(url = "https://repo1.maven.org/maven2")) @MavenLibrary(groupId = "org.ow2.asm", artifactId = "asm-tree", version = "9.2", repo = @Repository(url = "https://repo1.maven.org/maven2")) -public class Anticheat extends JavaPlugin { +public class Anticheat extends LoaderPlugin { public static Anticheat INSTANCE; @@ -80,10 +79,14 @@ public class Anticheat extends JavaPlugin { @ConfigSetting(path = "logging", name = "verbose") private static boolean verboseLogging = true; + private WrappedMethod findClassMethod; + public void onEnable() { INSTANCE = this; LibraryLoader.loadAll(getClass()); + findClassMethod = new WrappedClass(getClassLoader2().getClass()).getMethod("findClass", String.class); + scheduler = Executors.newScheduledThreadPool(2, new ThreadFactoryBuilder() .setNameFormat("Anticheat Schedular") .setUncaughtExceptionHandler((t, e) -> RunUtils.task(e::printStackTrace)) @@ -91,17 +94,19 @@ public class Anticheat extends JavaPlugin { saveDefaultConfig(); - commandManager = new BukkitCommandManager(this); + commandManager = new BukkitCommandManager(getPluginInstance()); commandManager.enableUnstableAPI("help"); + commandManager.registerCommand(new AnticheatCommand()); + new CommandPropertiesManager(commandManager, getDataFolder(), - getResource("command-messages.properties")); + getResource2("command-messages.properties")); packetProcessor = new PacketProcessor(); new AnticheatAPI(); - initializeScanner(getClass(), this, + initializeScanner(getPluginInstance().getClass(), getPluginInstance(), null, true, true); @@ -137,14 +142,13 @@ public class Anticheat extends JavaPlugin { Bukkit.getOnlinePlayers().forEach(HandlerAbstract.getHandler()::add); } - public void onDisable() { scheduler.shutdown(); commandManager.unregisterCommands(); // Unregistering packet listeners for players HandlerAbstract.shutdown(); - HandlerList.unregisterAll(this); + HandlerList.unregisterAll(getPluginInstance()); packetProcessor.shutdown(); packetProcessor = null; checkManager.getCheckClasses().clear(); @@ -158,7 +162,7 @@ public class Anticheat extends JavaPlugin { logManager.shutDown(); - Bukkit.getScheduler().cancelTasks(this); + Bukkit.getScheduler().cancelTasks(getPluginInstance()); // Unregistering APlayer objects @@ -180,9 +184,9 @@ public class Anticheat extends JavaPlugin { - public void initializeScanner(Class mainClass, Plugin plugin, ClassLoader loader, + public void initializeScanner(Class mainClass, Plugin plugin, ClassLoader loader, boolean loadListeners, boolean loadCommands) { - initializeScanner(mainClass, plugin, loader, ClassScanner.scanFile(null, mainClass), loadListeners, + initializeScanner(mainClass, plugin, loader, ClassScanner.getNames(), loadListeners, loadCommands); } @@ -190,26 +194,17 @@ public class Anticheat extends JavaPlugin { return worldInfoMap.computeIfAbsent(world.getUID(), key -> new WorldInfo(world)); } - public void initializeScanner(Class mainClass, Plugin plugin, ClassLoader loader, Set names, + public void initializeScanner(Class mainClass, Plugin plugin, ClassLoader loader, Set names, boolean loadListeners, boolean loadCommands) { names.stream() .map(name -> { - if(loader != null) { - try { - if(loader instanceof RemoteClassLoader) { - return new WrappedClass(((RemoteClassLoader)loader).findClass(name)); - } else - return new WrappedClass(Class.forName(name, true, loader)); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } - return null; - } else { - return Reflections.getClass(name); - } + return new WrappedClass(findClassMethod.invoke(getClassLoader2(), name)); }) .filter(c -> { - if(c == null) return false; + if(c.getParent() == null) { + return false; + } + Init init = c.getAnnotation(Init.class); String[] required = init.requirePlugins(); @@ -333,7 +328,7 @@ public class Anticheat extends JavaPlugin { lastTimeStamp.set(currentTime); } lastTick = currentTime; - }, this, 1L, 1L); + }, 1L, 1L); } public void onTickEnd(Runnable runnable) { diff --git a/src/main/java/dev/brighten/ac/check/impl/movement/fly/FlyC.java b/src/main/java/dev/brighten/ac/check/impl/movement/fly/FlyC.java index e345552..8fc67e4 100644 --- a/src/main/java/dev/brighten/ac/check/impl/movement/fly/FlyC.java +++ b/src/main/java/dev/brighten/ac/check/impl/movement/fly/FlyC.java @@ -43,6 +43,7 @@ public class FlyC extends Check { jumpCheck: { if(!jumped || player.getInfo().blockAbove.isNotPassed(1) + || player.getInfo().climbTimer.isNotPassed(1) || player.getInfo().slimeTimer.isNotPassed(1) || player.getInfo().lastLiquid.isNotPassed(1)) break jumpCheck; diff --git a/src/main/java/dev/brighten/ac/check/impl/movement/fly/FlyD.java b/src/main/java/dev/brighten/ac/check/impl/movement/fly/FlyD.java index 4d395ca..c1960a2 100644 --- a/src/main/java/dev/brighten/ac/check/impl/movement/fly/FlyD.java +++ b/src/main/java/dev/brighten/ac/check/impl/movement/fly/FlyD.java @@ -19,7 +19,9 @@ public class FlyD extends Check { @Async WAction flyingPacket = packet -> { if(!packet.isMoved() || player.getMovement().getMoveTicks() <= 2 - || player.getBlockInfo().miscNear || player.getInfo().isGeneralCancel()) return; + || player.getBlockInfo().miscNear || player.getBlockInfo().onSlab + || player.getBlockInfo().fenceBelow + || player.getBlockInfo().onStairs || player.getInfo().isGeneralCancel()) return; double deltaY = player.getMovement().getDeltaY(); if(deltaY > 0) diff --git a/src/main/java/dev/brighten/ac/check/impl/movement/speed/Speed.java b/src/main/java/dev/brighten/ac/check/impl/movement/speed/Speed.java index 589f7c8..82b3c8e 100644 --- a/src/main/java/dev/brighten/ac/check/impl/movement/speed/Speed.java +++ b/src/main/java/dev/brighten/ac/check/impl/movement/speed/Speed.java @@ -7,20 +7,23 @@ 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.PlayerUtils; -import dev.brighten.ac.utils.TagsBuilder; +import dev.brighten.ac.utils.*; +import dev.brighten.ac.utils.math.IntVector; +import dev.brighten.ac.utils.wrapper.Wrapper; import org.bukkit.potion.PotionEffectType; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + @CheckData(name = "Speed", checkId = "speed", type = CheckType.MOVEMENT) public class Speed extends Check { public Speed(APlayer player) { super(player); } - - private double ldxz = .12f; - private float friction = 0.91f; private float buffer; + private boolean previousFromGround; WAction flyingPacket = packet -> { if(player.getMovement().isExcuseNextFlying()) return; @@ -29,88 +32,106 @@ public class Speed extends Check { if (!packet.isMoved()) break checkProccesing; - float drag = friction; + IntVector belowLoc = new IntVector(MathHelper.floor_double(player.getMovement().getFrom().getX()), + MathHelper.floor_double(player.getMovement().getFrom().getY() - 1), + MathHelper.floor_double(player.getMovement().getFrom().getZ())); + List frictions = player.getBlockUpdateHandler().getPossibleMaterials(belowLoc).stream() + .map(Wrapper.getInstance()::getFriction).collect(Collectors.toList()); - TagsBuilder tags = new TagsBuilder(); - double moveFactor = player.getBukkitPlayer().getWalkSpeed() / 2f; + Tuple ratio = frictions.stream().map(friction -> { + float drag = 0.91f; + double ldxz = player.getMovement().getDeltaXZ(); - moveFactor+= moveFactor * 0.3f; - - if(player.getPotionHandler().hasPotionEffect(PotionEffectType.SPEED)) - moveFactor += (PlayerUtils.getPotionEffectLevel(player.getBukkitPlayer(), PotionEffectType.SPEED) - * (0.20000000298023224D)) * moveFactor; - - if(player.getPotionHandler().hasPotionEffect(PotionEffectType.SLOW)) - moveFactor += (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); - - if (player.getMovement().getFrom().isOnGround() && !player.getMovement().getTo().isOnGround() - && player.getMovement().getDeltaY() > 0.2) { - tags.addTag("jumped"); - moveFactor += 0.2; + if(previousFromGround) { + drag*= friction; } - } else { - tags.addTag("air"); - drag = 0.91f; - moveFactor = 0.026f; - } - if(player.getBlockInfo().inWater) { - tags.addTag("water"); + TagsBuilder tags = new TagsBuilder(); + double moveFactor = player.getBukkitPlayer().getWalkSpeed() / 2f; - drag = player.getPlayerVersion().isOrAbove(ProtocolVersion.V1_13) ? 0.9f : 0.8f; - moveFactor = 0.034; + moveFactor+= moveFactor * 0.3f; - if(player.getInfo().lastLiquid.getResetStreak() < 3) { - tags.addTag("water-enter"); + if(player.getPotionHandler().hasPotionEffect(PotionEffectType.SPEED)) + moveFactor += (PlayerUtils.getPotionEffectLevel(player.getBukkitPlayer(), PotionEffectType.SPEED) + * (0.20000000298023224D)) * moveFactor; + + if(player.getPotionHandler().hasPotionEffect(PotionEffectType.SLOW)) + moveFactor += (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); + + if (player.getMovement().isJumped()) { + tags.addTag("jumped"); + moveFactor += 0.2; + } + } else { + tags.addTag("air"); + drag = 0.91f; + moveFactor = 0.026f; + } + + if(player.getBlockInfo().inWater) { + tags.addTag("water"); + + drag = player.getPlayerVersion().isOrAbove(ProtocolVersion.V1_13) ? 0.9f : 0.8f; + moveFactor = 0.034; + + if(player.getInfo().lastLiquid.getResetStreak() < 3) { + tags.addTag("water-enter"); + moveFactor*= 1.35; + } + } else if(player.getInfo().lastLiquid.isNotPassed(3)) { moveFactor*= 1.35; + tags.addTag("water-leave"); } - } else if(player.getInfo().lastLiquid.isNotPassed(3)) { - moveFactor*= 1.35; - tags.addTag("water-leave"); - } - if(player.getMovement().getLastTeleport().isNotPassed(6) - || player.getInfo().getLastRespawn().isNotPassed(6)) { - tags.addTag("teleport"); - moveFactor+= 0.1; - moveFactor*= 5; - } + if(player.getMovement().getLastTeleport().isNotPassed(6) + || player.getInfo().getLastRespawn().isNotPassed(6)) { + tags.addTag("teleport"); + moveFactor+= 0.1; + 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; - } + //In 1.9+, entity collisions add acceleration to their movement. + if(player.getInfo().lastEntityCollision.isNotPassed(2)) { + tags.addTag("entity-collision"); + moveFactor+= 0.05; + } - //Pistons have the ability to move players 1 whole block - if(player.getBlockInfo().pistonNear) { - tags.addTag("piston"); - moveFactor+= 1; - } + //Pistons have the ability to move players 1 whole block + if(player.getBlockInfo().pistonNear) { + tags.addTag("piston"); + moveFactor+= 1; + } - if(player.getBlockInfo().inWeb - //Ensuring they aren't just entering or leaving web - && player.getInfo().getLastWeb().getResetStreak() > 1) { - tags.addTag("web"); - moveFactor*= 0.4; - } + if(player.getBlockInfo().onSlime && player.getMovement().getFrom().isOnGround()) { + if (Math.abs(player.getMovement().getDeltaY()) < 0.1D && !player.getInfo().isSneaking()) { + moveFactor*= 0.5; + } + } - 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; - } + if(player.getBlockInfo().inWeb + //Ensuring they aren't just entering or leaving web + && player.getInfo().getLastWeb().getResetStreak() > 1) { + tags.addTag("web"); + moveFactor*= 0.4; + } - double ratio = (player.getMovement().getDeltaXZ() - ldxz) / moveFactor * 100; + 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; + } - if (ratio > 100.8 + return new Tuple<>((player.getMovement().getDeltaXZ() - ldxz) / moveFactor * 100D, tags); + }).min(Comparator.comparing(r -> MathUtils.getDelta(r.one, 100))).orElse(new Tuple<>(100D, new TagsBuilder())); + + if (ratio.one > 100.8 && !player.getBlockInfo().inHoney && !player.getBlockInfo().inScaffolding && player.getInfo().velocity.isPassed(2) @@ -119,16 +140,14 @@ public class Speed extends Check { if(++buffer > 2) { vl++; flag("p=%.1f%% dxz=%.3f a/g=%s,%s tags=%s", - ratio, player.getMovement().getDeltaXZ(), player.getMovement().getAirTicks(), player.getMovement().getGroundTicks(), - tags.build()); + ratio.one, player.getMovement().getDeltaXZ(), player.getMovement().getAirTicks(), player.getMovement().getGroundTicks(), + ratio.two.build()); buffer = Math.min(5, buffer); //Preventing runaway flagging } } else if(buffer > 0) buffer-= 0.2f; - debug("ratio=%.1f tags=%s tp=%s buffer=%.1f", ratio, tags.build(), - player.getInfo().getLastLiquid().getPassed(), buffer); - - ldxz = player.getMovement().getDeltaXZ() * drag; + debug("ratio=%.1f deltaY=%.3f tags=%s tp=%s buffer=%.1f", ratio.one, player.getMovement().getDeltaY(), + ratio.two.build(), player.getInfo().getLastLiquid().getPassed(), buffer); } - friction = player.getBlockInfo().currentFriction; + previousFromGround = player.getMovement().getFrom().isOnGround(); }; } diff --git a/src/main/java/dev/brighten/ac/command/AnticheatCommand.java b/src/main/java/dev/brighten/ac/command/AnticheatCommand.java index 197e694..e6ddf88 100644 --- a/src/main/java/dev/brighten/ac/command/AnticheatCommand.java +++ b/src/main/java/dev/brighten/ac/command/AnticheatCommand.java @@ -11,8 +11,10 @@ import dev.brighten.ac.logging.Log; import dev.brighten.ac.logging.sql.Query; import dev.brighten.ac.messages.Messages; import dev.brighten.ac.packet.handler.HandlerAbstract; -import dev.brighten.ac.utils.*; -import dev.brighten.ac.utils.annotation.Init; +import dev.brighten.ac.utils.Color; +import dev.brighten.ac.utils.MiscUtils; +import dev.brighten.ac.utils.Pastebin; +import dev.brighten.ac.utils.Tuple; import dev.brighten.ac.utils.msg.ChatBuilder; import io.netty.buffer.Unpooled; import lombok.val; @@ -32,7 +34,6 @@ import java.util.List; import java.util.UUID; import java.util.stream.Collectors; -@Init(priority = Priority.LOW) @CommandAlias("anticheat|ac") @CommandPermission("anticheat.command") public class AnticheatCommand extends BaseCommand { diff --git a/src/main/java/dev/brighten/ac/data/APlayer.java b/src/main/java/dev/brighten/ac/data/APlayer.java index eb910d5..be13d06 100644 --- a/src/main/java/dev/brighten/ac/data/APlayer.java +++ b/src/main/java/dev/brighten/ac/data/APlayer.java @@ -1,10 +1,15 @@ package dev.brighten.ac.data; import dev.brighten.ac.Anticheat; -import dev.brighten.ac.check.*; -import dev.brighten.ac.data.handlers.*; -import dev.brighten.ac.data.obj.*; +import dev.brighten.ac.check.Check; +import dev.brighten.ac.data.info.BlockInformation; +import dev.brighten.ac.data.info.CheckHandler; +import dev.brighten.ac.data.info.GeneralInformation; +import dev.brighten.ac.data.info.LagInformation; +import dev.brighten.ac.data.obj.InstantAction; +import dev.brighten.ac.data.obj.NormalAction; import dev.brighten.ac.handler.EntityLocationHandler; +import dev.brighten.ac.handler.MovementHandler; import dev.brighten.ac.handler.PotionHandler; import dev.brighten.ac.handler.VelocityHandler; import dev.brighten.ac.handler.block.BlockUpdateHandler; @@ -17,8 +22,10 @@ import dev.brighten.ac.utils.KLocation; import dev.brighten.ac.utils.RunUtils; import dev.brighten.ac.utils.Tuple; import dev.brighten.ac.utils.objects.evicting.EvictingList; +import dev.brighten.ac.utils.reflections.Reflections; import dev.brighten.ac.utils.reflections.impl.MinecraftReflection; -import dev.brighten.ac.utils.reflections.types.WrappedField; +import dev.brighten.ac.utils.reflections.types.WrappedClass; +import dev.brighten.ac.utils.reflections.types.WrappedMethod; import dev.brighten.ac.utils.timer.Timer; import dev.brighten.ac.utils.timer.impl.MillisTimer; import lombok.Getter; @@ -26,7 +33,7 @@ import lombok.Setter; import lombok.val; import net.minecraft.server.v1_8_R3.PacketPlayOutTransaction; import org.bukkit.entity.Player; -import org.bukkit.event.Event; +import org.bukkit.plugin.Plugin; import org.bukkit.util.Vector; import java.util.*; @@ -41,7 +48,7 @@ public class APlayer { @Getter private final UUID uuid; @Getter - private MovementHandler movement; + private MovementHandler movement; @Getter private PotionHandler potionHandler; @@ -92,10 +99,21 @@ public class APlayer { @Getter private boolean sendingPackets; + static WrappedClass bukkitClass = Reflections.getClass("org.bukkit.Bukkit"); + static WrappedClass pluginManager = Reflections.getClass("org.bukkit.plugin.PluginManager"); + static WrappedMethod method = pluginManager.getMethod("isPluginEnabled", String.class), + method2 = pluginManager.getMethod("getPlugin", String.class), + gpmanager = bukkitClass.getMethod("getPluginManager"); public APlayer(Player player) { this.bukkitPlayer = player; this.uuid = player.getUniqueId(); this.playerConnection = MinecraftReflection.getPlayerConnection(player); + + Object pluginManagerObj = gpmanager.invoke(null); + + if(method.invoke(pluginManagerObj, "EnterpriseLoader")) { + Plugin plugin = method2.invoke(pluginManagerObj, "EnterpriseLoader"); + } load(); } diff --git a/src/main/java/dev/brighten/ac/data/handlers/BlockInformation.java b/src/main/java/dev/brighten/ac/data/info/BlockInformation.java similarity index 99% rename from src/main/java/dev/brighten/ac/data/handlers/BlockInformation.java rename to src/main/java/dev/brighten/ac/data/info/BlockInformation.java index c3025bd..66f9cd2 100644 --- a/src/main/java/dev/brighten/ac/data/handlers/BlockInformation.java +++ b/src/main/java/dev/brighten/ac/data/info/BlockInformation.java @@ -1,4 +1,4 @@ -package dev.brighten.ac.data.handlers; +package dev.brighten.ac.data.info; import dev.brighten.ac.Anticheat; import dev.brighten.ac.data.APlayer; @@ -23,7 +23,6 @@ public class BlockInformation { public boolean onClimbable, onSlab, onStairs, onHalfBlock, inLiquid, inLava, inWater, inWeb, onSlime, onIce, onSoulSand, blocksAbove, collidesVertically, bedNear, collidesHorizontally, blocksNear, inBlock, miscNear, collidedWithEntity, roseBush, inPortal, blocksBelow, pistonNear, fenceBelow, inScaffolding, inHoney; - public float currentFriction, fromFriction; public CollisionHandler handler = new CollisionHandler(new ArrayList<>(), new ArrayList<>(), new KLocation(0,0,0), null); public final List aboveCollisions = Collections.synchronizedList(new ArrayList<>()), diff --git a/src/main/java/dev/brighten/ac/data/handlers/CheckHandler.java b/src/main/java/dev/brighten/ac/data/info/CheckHandler.java similarity index 99% rename from src/main/java/dev/brighten/ac/data/handlers/CheckHandler.java rename to src/main/java/dev/brighten/ac/data/info/CheckHandler.java index 6fda566..9b1339f 100644 --- a/src/main/java/dev/brighten/ac/data/handlers/CheckHandler.java +++ b/src/main/java/dev/brighten/ac/data/info/CheckHandler.java @@ -1,4 +1,4 @@ -package dev.brighten.ac.data.handlers; +package dev.brighten.ac.data.info; import dev.brighten.ac.Anticheat; import dev.brighten.ac.check.*; diff --git a/src/main/java/dev/brighten/ac/data/handlers/GeneralInformation.java b/src/main/java/dev/brighten/ac/data/info/GeneralInformation.java similarity index 98% rename from src/main/java/dev/brighten/ac/data/handlers/GeneralInformation.java rename to src/main/java/dev/brighten/ac/data/info/GeneralInformation.java index 86a64f6..f39e1a2 100644 --- a/src/main/java/dev/brighten/ac/data/handlers/GeneralInformation.java +++ b/src/main/java/dev/brighten/ac/data/info/GeneralInformation.java @@ -1,4 +1,4 @@ -package dev.brighten.ac.data.handlers; +package dev.brighten.ac.data.info; import dev.brighten.ac.packet.wrapper.objects.PlayerCapabilities; import dev.brighten.ac.utils.KLocation; diff --git a/src/main/java/dev/brighten/ac/data/handlers/LagInformation.java b/src/main/java/dev/brighten/ac/data/info/LagInformation.java similarity index 91% rename from src/main/java/dev/brighten/ac/data/handlers/LagInformation.java rename to src/main/java/dev/brighten/ac/data/info/LagInformation.java index 1dce31b..45791df 100644 --- a/src/main/java/dev/brighten/ac/data/handlers/LagInformation.java +++ b/src/main/java/dev/brighten/ac/data/info/LagInformation.java @@ -1,4 +1,4 @@ -package dev.brighten.ac.data.handlers; +package dev.brighten.ac.data.info; import dev.brighten.ac.utils.timer.Timer; import dev.brighten.ac.utils.timer.impl.MillisTimer; diff --git a/src/main/java/dev/brighten/ac/depends/LibraryLoader.java b/src/main/java/dev/brighten/ac/depends/LibraryLoader.java index dc26ee2..15d9875 100644 --- a/src/main/java/dev/brighten/ac/depends/LibraryLoader.java +++ b/src/main/java/dev/brighten/ac/depends/LibraryLoader.java @@ -47,7 +47,7 @@ import java.util.Objects; public final class LibraryLoader { @SuppressWarnings("Guava") - private static final Supplier URL_INJECTOR = Suppliers.memoize(() -> URLClassLoaderAccess.create((URLClassLoader) Anticheat.INSTANCE.getClass().getClassLoader())); + private static final Supplier URL_INJECTOR = Suppliers.memoize(() -> URLClassLoaderAccess.create((URLClassLoader) Anticheat.INSTANCE.getPluginInstance().getClass().getClassLoader())); /** * Resolves all {@link MavenLibrary} annotations on the given object. @@ -110,6 +110,9 @@ public final class LibraryLoader { try { URL_INJECTOR.get().addURL(saveLocation.toURI().toURL()); + //val mapOfShit = JarUtil.loadJar(saveLocation); + + //((Map)Anticheat.INSTANCE.getStuffs()).putAll(mapOfShit); } catch (Exception e) { throw new RuntimeException("Unable to load dependency: " + saveLocation.toString(), e); } diff --git a/src/main/java/dev/brighten/ac/data/handlers/MovementHandler.java b/src/main/java/dev/brighten/ac/handler/MovementHandler.java similarity index 98% rename from src/main/java/dev/brighten/ac/data/handlers/MovementHandler.java rename to src/main/java/dev/brighten/ac/handler/MovementHandler.java index fe02c4f..c6a770e 100644 --- a/src/main/java/dev/brighten/ac/data/handlers/MovementHandler.java +++ b/src/main/java/dev/brighten/ac/handler/MovementHandler.java @@ -1,4 +1,4 @@ -package dev.brighten.ac.data.handlers; +package dev.brighten.ac.handler; import dev.brighten.ac.data.APlayer; import dev.brighten.ac.data.obj.CMove; @@ -41,7 +41,7 @@ public class MovementHandler { private int moveTicks; private final List posLocs = new ArrayList<>(); @Getter - private boolean checkMovement, accurateYawData, cinematic; + private boolean checkMovement, accurateYawData, cinematic, jumped, inAir; @Getter @Setter private boolean excuseNextFlying; @@ -232,6 +232,16 @@ public class MovementHandler { if (player.getBlockInfo().inLiquid) player.getInfo().getLastLiquid().reset(); if(player.getBlockInfo().inWeb) player.getInfo().lastWeb.reset(); + if (!to.isOnGround() && moveTicks > 0) { + if (!jumped && from.isOnGround() + && deltaY >= 0) { + jumped = true; + } else { + inAir = true; + jumped = false; + } + } else jumped = inAir = false; + player.getInfo().setGeneralCancel(player.getBukkitPlayer().getAllowFlight() || moveTicks == 0 || excuseNextFlying diff --git a/src/main/java/dev/brighten/ac/handler/keepalive/KeepaliveProcessor.java b/src/main/java/dev/brighten/ac/handler/keepalive/KeepaliveProcessor.java index f8eaea6..5ee1d90 100644 --- a/src/main/java/dev/brighten/ac/handler/keepalive/KeepaliveProcessor.java +++ b/src/main/java/dev/brighten/ac/handler/keepalive/KeepaliveProcessor.java @@ -82,7 +82,7 @@ public class KeepaliveProcessor implements Runnable { public void start() { if (task == null) { - task = RunUtils.taskTimer(this, Anticheat.INSTANCE, 20L, 0L); + task = RunUtils.taskTimer(this, 20L, 0L); } } diff --git a/src/main/java/dev/brighten/ac/handler/thread/ThreadHandler.java b/src/main/java/dev/brighten/ac/handler/thread/ThreadHandler.java index c25dd27..603504f 100644 --- a/src/main/java/dev/brighten/ac/handler/thread/ThreadHandler.java +++ b/src/main/java/dev/brighten/ac/handler/thread/ThreadHandler.java @@ -1,11 +1,10 @@ package dev.brighten.ac.handler.thread; import com.google.common.util.concurrent.ThreadFactoryBuilder; -import dev.brighten.ac.Anticheat; import dev.brighten.ac.data.APlayer; -import dev.brighten.ac.utils.annotation.Init; import dev.brighten.ac.utils.MiscUtils; import dev.brighten.ac.utils.RunUtils; +import dev.brighten.ac.utils.annotation.Init; import lombok.Getter; import org.bukkit.entity.Player; @@ -59,7 +58,7 @@ public class ThreadHandler { private PlayerThread generatePlayerThread() { PlayerThread thread = new PlayerThread(Executors.newSingleThreadExecutor(new ThreadFactoryBuilder() .setNameFormat("Kauri Player Thread " + services.size() + 1) - .setUncaughtExceptionHandler((t, e) -> RunUtils.task(e::printStackTrace, Anticheat.INSTANCE)) + .setUncaughtExceptionHandler((t, e) -> RunUtils.task(e::printStackTrace)) .build())); services.add(thread); diff --git a/src/main/java/dev/brighten/ac/listener/JoinListener.java b/src/main/java/dev/brighten/ac/listener/JoinListener.java index fcb1f7b..375c2da 100644 --- a/src/main/java/dev/brighten/ac/listener/JoinListener.java +++ b/src/main/java/dev/brighten/ac/listener/JoinListener.java @@ -19,7 +19,7 @@ import java.util.Optional; public class JoinListener implements Listener { public JoinListener() { - Anticheat.INSTANCE.getPacketProcessor().processAsync(Anticheat.INSTANCE, EventPriority.NORMAL, event -> { + Anticheat.INSTANCE.getPacketProcessor().processAsync(EventPriority.NORMAL, event -> { if(event.isCancelled()) return; Optional aplayer = Anticheat.INSTANCE.getPlayerRegistry() .getPlayer(event.getPlayer().getUniqueId()); @@ -32,7 +32,7 @@ public class JoinListener implements Listener { }); }); - Anticheat.INSTANCE.getPacketProcessor().process(Anticheat.INSTANCE, EventPriority.HIGHEST, event -> { + Anticheat.INSTANCE.getPacketProcessor().process(EventPriority.HIGHEST, event -> { Optional op = Anticheat.INSTANCE.getPlayerRegistry().getPlayer(event.getPlayer().getUniqueId()); if(!op.isPresent()) { @@ -65,7 +65,7 @@ public class JoinListener implements Listener { case BLOCK_CHANGE: case MULTI_BLOCK_CHANGE: case MAP_CHUNK: { - if(player.getLagInfo().getLastClientTransaction().isPassed(100L) && player.getCreation().isPassed(2000L)) { + if(player.getLagInfo().getLastClientTransaction().isPassed(100L) && player.getCreation().isPassed(6000L)) { synchronized (player.getPacketQueue()) { player.getPacketQueue().add(event.getPacket()); } diff --git a/src/main/java/dev/brighten/ac/packet/listener/ListenerEntry.java b/src/main/java/dev/brighten/ac/packet/listener/ListenerEntry.java index e7fc75b..71a929e 100644 --- a/src/main/java/dev/brighten/ac/packet/listener/ListenerEntry.java +++ b/src/main/java/dev/brighten/ac/packet/listener/ListenerEntry.java @@ -4,14 +4,12 @@ import dev.brighten.ac.packet.listener.functions.PacketListener; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.bukkit.event.EventPriority; -import org.bukkit.plugin.Plugin; import java.util.UUID; @RequiredArgsConstructor @Getter class ListenerEntry { - private final Plugin plugin; private final EventPriority priority; private final PacketListener listener; private long id = UUID.randomUUID().getMostSignificantBits(); diff --git a/src/main/java/dev/brighten/ac/packet/listener/PacketProcessor.java b/src/main/java/dev/brighten/ac/packet/listener/PacketProcessor.java index b365a76..2efe933 100644 --- a/src/main/java/dev/brighten/ac/packet/listener/PacketProcessor.java +++ b/src/main/java/dev/brighten/ac/packet/listener/PacketProcessor.java @@ -11,7 +11,6 @@ import lombok.Getter; import lombok.val; import org.bukkit.entity.Player; import org.bukkit.event.EventPriority; -import org.bukkit.plugin.Plugin; import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; @@ -41,12 +40,12 @@ public class PacketProcessor { } } - public PacketListener process(Plugin plugin, PacketListener listener, PacketType... types) { - return process(plugin, EventPriority.NORMAL, listener, types); + public PacketListener process(PacketListener listener, PacketType... types) { + return process(EventPriority.NORMAL, listener, types); } - public PacketListener process(Plugin plugin, EventPriority priority, PacketListener listener, PacketType... types) { - ListenerEntry entry = new ListenerEntry(plugin, priority, listener); + public PacketListener process(EventPriority priority, PacketListener listener, PacketType... types) { + ListenerEntry entry = new ListenerEntry(priority, listener); synchronized (processors) { for (PacketType type : types) { processors.compute(type, (key, list) -> { @@ -63,21 +62,21 @@ public class PacketProcessor { return listener; } - public PacketListener process(Plugin plugin, EventPriority priority, PacketListener listener) { - return process(plugin, priority, listener, PacketType.UNKNOWN); + public PacketListener process(EventPriority priority, PacketListener listener) { + return process(priority, listener, PacketType.UNKNOWN); } - public PacketListener processAsync(Plugin plugin, PacketListener listener, PacketType... types) { - return processAsync(plugin, EventPriority.NORMAL, listener, types); + public PacketListener processAsync(PacketListener listener, PacketType... types) { + return processAsync(EventPriority.NORMAL, listener, types); } - public PacketListener processAsync(Plugin plugin, EventPriority priority, PacketListener listener) { - return processAsync(plugin, priority, listener, PacketType.UNKNOWN); + public PacketListener processAsync(EventPriority priority, PacketListener listener) { + return processAsync(priority, listener, PacketType.UNKNOWN); } - public PacketListener processAsync(Plugin plugin, EventPriority priority, PacketListener listener, + public PacketListener processAsync(EventPriority priority, PacketListener listener, PacketType... types) { - ListenerEntry entry = new ListenerEntry(plugin, priority, listener); + ListenerEntry entry = new ListenerEntry(priority, listener); synchronized (asyncProcessors) { for (PacketType type : types) { asyncProcessors.compute(type, (key, list) -> { @@ -132,19 +131,6 @@ public class PacketProcessor { return removedListener; } - public void removeListeners(Plugin plugin) { - synchronized (processors) { - for (List list : processors.values()) { - list.removeIf(entry -> entry.getPlugin().getName().equals(plugin.getName())); - } - } - synchronized (asyncProcessors) { - for (List list : asyncProcessors.values()) { - list.removeIf(entry -> entry.getPlugin().getName().equals(plugin.getName())); - } - } - } - public Object call(Player player, Object packet, PacketType type) { if(packet == null) return false; PacketInfo info = new PacketInfo(player, packet, type, System.currentTimeMillis()), diff --git a/src/main/java/dev/brighten/ac/utils/ClassScanner.java b/src/main/java/dev/brighten/ac/utils/ClassScanner.java index be5ed0b..e26eba2 100644 --- a/src/main/java/dev/brighten/ac/utils/ClassScanner.java +++ b/src/main/java/dev/brighten/ac/utils/ClassScanner.java @@ -9,20 +9,13 @@ import org.objectweb.asm.ClassReader; import org.objectweb.asm.tree.AnnotationNode; import org.objectweb.asm.tree.ClassNode; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.lang.annotation.Annotation; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.file.*; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashSet; -import java.util.Set; +import java.nio.file.FileSystems; +import java.nio.file.Path; +import java.nio.file.PathMatcher; +import java.util.*; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -34,259 +27,46 @@ public class ClassScanner { private static final PathMatcher CLASS_FILE = create("glob:*.class"); private static final PathMatcher ARCHIVE = create("glob:*.{jar}"); - public static Set scanFile(String file, File f) { - URL[] urls; - try { - urls = new URL[]{f.toURI().toURL()}; - } catch (MalformedURLException e) { - e.printStackTrace(); - return new HashSet<>(); - } - return scanFile(file, urls); - } - + //TODO Get check classes too public static Set getClasses(Class annotationClass, String packageName) { - return scanFile(annotationClass).stream().filter(pkg -> pkg.startsWith(packageName)) + return getNames().stream().filter(pkg -> pkg.startsWith(packageName) && findClass(map.get(n), Init.class) != null) .map(Reflections::getClass).collect(Collectors.toSet()); } - public static Set getClasses(Class annotationClass) { - return scanFile(annotationClass).stream().map(Reflections::getClass).collect(Collectors.toSet()); + public static Set getNames() { + Map map = (Map) Anticheat.INSTANCE.getStuffs(); + + return map.keySet().stream().filter(n -> { + return !n.endsWith(".yml") && !n.endsWith(".xml") && !n.endsWith(".") && !n.endsWith(".properties") + && !n.contains("dev.brighten.ac.packet") + && Character.isLetterOrDigit(n.charAt(n.length() - 1)) + && findClass(map.get(n), Init.class) != null; + }).collect(Collectors.toSet()); } - public static Set scanFile(Class annotationClass) { - return scanFile(annotationClass, new URL[]{Anticheat.class.getProtectionDomain().getCodeSource().getLocation()}); - } - - public static Set scanFile(Class annotationClass, 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(Paths.get(source), annotationClass, plugins); - } - } - - return plugins; - } - - private static void scanPath(Path path, Class annotationClass, Set plugins) { - if (Files.exists(path)) { - if (Files.isDirectory(path)) { - scanDirectory(path, annotationClass, plugins); - } else { - scanZip(path, annotationClass, plugins); - } - } - } - - private static void scanDirectory(Path dir, Class annotationClass, final Set plugins) { + public static String findClass(byte[] array, Class annotationClass) { try { - Files.walkFileTree(dir, newHashSet(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, - new SimpleFileVisitor() { - @Override - public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException { - if (CLASS_FILE.matches(path.getFileName())) { - try (InputStream in = Files.newInputStream(path)) { - String plugin = findClass(in, annotationClass); - if (plugin != null) { - plugins.add(plugin); - } - } - } - - return FileVisitResult.CONTINUE; - } - }); - } catch (IOException e) { - e.printStackTrace(); - } - } - - - public static String findClass(InputStream in, Class annotationClass) { - try { - ClassReader reader = new ClassReader(in); + ClassReader reader = new ClassReader(array); ClassNode classNode = new ClassNode(); reader.accept(classNode, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES); String className = classNode.name.replace('/', '.'); + final String anName = annotationClass.getName().replace(".", "/"); if (classNode.visibleAnnotations != null) { for (Object node : classNode.visibleAnnotations) { AnnotationNode annotation = (AnnotationNode) node; if (annotation.desc - .equals("L" + anName + ";")) + .equals("L" + anName + ";")) { return className; - } - } - } catch (Exception e) { - //Bukkit.getLogger().info("Failed to scan: " + in.toString()); - } - return null; - } - - private static void scanZip(Path path, Class annotationClass, 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 = findClass(in, annotationClass); - if (plugin != null) { - plugins.add(plugin); } } } - } catch (IOException e) { - e.printStackTrace(); - } - } - - public static Set scanFile(String file, Class clazz) { - return scanFile(file, new URL[]{clazz.getProtectionDomain().getCodeSource().getLocation()}); - } - - public static Set scanFile2(String file, Class clazz) { - Bukkit.getLogger().info("Found file: " + clazz.getProtectionDomain().getCodeSource().getLocation().toString()); - return scanFile2(file, new URL[]{clazz.getProtectionDomain().getCodeSource().getLocation()}); - } - - public static Set scanFile2(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)) { - scanPath2(file, Paths.get(source), plugins); - } - } - - return plugins; - } - - public static 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 static 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 static void scanPath2(String file, Path path, Set plugins) { - if (Files.exists(path)) { - if (Files.isDirectory(path)) { - scanDirectory2(file, path, plugins); - } else { - scanZip2(file, path, plugins); - } - } - } - - private static void scanDirectory(String file, Path dir, final Set plugins) { - try { - Files.walkFileTree(dir, newHashSet(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, - new SimpleFileVisitor() { - @Override - public FileVisitResult visitFile(Path path, 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) { - e.printStackTrace(); - } - } - - private static void scanDirectory2(String file, Path dir, final Set plugins) { - try { - Files.walkFileTree(dir, newHashSet(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, - new SimpleFileVisitor() { - @Override - public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException { - if (CLASS_FILE.matches(path.getFileName())) { - try (InputStream in = Files.newInputStream(path)) { - String plugin = findClasses(file, in); - if (plugin != null) { - plugins.add(plugin); - } - } - } - - return FileVisitResult.CONTINUE; - } - }); - } catch (IOException e) { - e.printStackTrace(); + } catch (Exception e) { + //Bukkit.getLogger().info("Failed to scan"); + //e.printStackTrace(); } + return null; } private static HashSet newHashSet(E... elements) { @@ -320,30 +100,6 @@ public class ClassScanner { e.printStackTrace(); } } - - private static void scanZip2(String file, Path path, Set plugins) { - if (!ARCHIVE.matches(path.getFileName())) { - return; - } - - try (ZipFile zip = new ZipFile(path.toFile())) { - zip.stream().parallel().forEach(entry -> { - if (!entry.isDirectory() && entry.getName().endsWith(".class")) { - try (InputStream in = zip.getInputStream(entry)) { - String plugin = findClasses(file, in); - if (plugin != null) { - plugins.add(plugin); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - }); - } catch (IOException e) { - e.printStackTrace(); - } - } - public static String findPlugin(String file, InputStream in) { try { ClassReader reader = new ClassReader(in); diff --git a/src/main/java/dev/brighten/ac/utils/MiscUtils.java b/src/main/java/dev/brighten/ac/utils/MiscUtils.java index 7268b37..55cf5a1 100644 --- a/src/main/java/dev/brighten/ac/utils/MiscUtils.java +++ b/src/main/java/dev/brighten/ac/utils/MiscUtils.java @@ -31,8 +31,11 @@ import java.lang.reflect.Field; import java.text.SimpleDateFormat; import java.util.*; import java.util.function.Supplier; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; import java.util.stream.Collectors; import java.util.stream.LongStream; +import java.util.zip.ZipException; public class MiscUtils { @@ -423,6 +426,64 @@ public class MiscUtils { return false; } + public static Map loadJar(File jarFile) { + try { + Map classes = new HashMap<>(); + JarFile jar = new JarFile(jarFile); + Enumeration enumeration = jar.entries(); + while (enumeration.hasMoreElements()) { + JarEntry entry = enumeration.nextElement(); + readJar(jar, entry, classes, null); + } + jar.close(); + return classes; + } catch (ZipException e) { + return null; + } + catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + private static Map readJar(JarFile jar, JarEntry en, Map classes, List ignored) { + String name = en.getName(); + try (InputStream jis = jar.getInputStream(en)) { + if (name.endsWith(".class")) { + if (ignored != null) { + for (String s : ignored) { + if (name.startsWith(s)) { + return classes; + } + } + } + byte[] bytes = getBytes(jis); + try { + classes.put(name, bytes); + } catch (Exception e) { + e.printStackTrace(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return classes; + } + + private static byte[] getBytes(InputStream inputStream) { + try { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + int nRead; + byte[] data = new byte[16384]; + while ((nRead = inputStream.read(data, 0, data.length)) != -1) { + buffer.write(data, 0, nRead); + } + return buffer.toByteArray(); + } catch (IOException e) { + return new byte[0]; + } + } + public static T parseObjectFromString(String s, Class clazz) throws Exception { return clazz.getConstructor(new Class[] {String.class}).newInstance(s); } @@ -483,7 +544,7 @@ public class MiscUtils { for (final File f : pluginDir.listFiles()) { try { if (f.getName().endsWith(".jar")) { - final PluginDescriptionFile pdf = Anticheat.INSTANCE.getPluginLoader().getPluginDescription(f); + final PluginDescriptionFile pdf = Anticheat.INSTANCE.getPluginInstance().getPluginLoader().getPluginDescription(f); if (pdf.getDepend().contains("Atlas")) { plugins.add(f); } @@ -509,7 +570,7 @@ public class MiscUtils { for (final File f : pluginDir.listFiles()) { try { if (f.getName().endsWith(".jar")) { - final PluginDescriptionFile pdf = Anticheat.INSTANCE.getPluginLoader().getPluginDescription(f); + final PluginDescriptionFile pdf = Anticheat.INSTANCE.getPluginInstance().getPluginLoader().getPluginDescription(f); if (pdf.getName().equalsIgnoreCase(pl)) { pluginFile = f; msg = "(via search) "; diff --git a/src/main/java/dev/brighten/ac/utils/RunUtils.java b/src/main/java/dev/brighten/ac/utils/RunUtils.java index 5cf32ff..c9de6b8 100644 --- a/src/main/java/dev/brighten/ac/utils/RunUtils.java +++ b/src/main/java/dev/brighten/ac/utils/RunUtils.java @@ -2,7 +2,6 @@ package dev.brighten.ac.utils; import dev.brighten.ac.Anticheat; import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitTask; import java.util.concurrent.ExecutionException; @@ -16,52 +15,28 @@ import java.util.function.Consumer; */ public class RunUtils { - public static BukkitTask taskTimer(Runnable runnable, Plugin plugin, long delay, long interval) { - return Bukkit.getScheduler().runTaskTimer(plugin, runnable, delay, interval); - } - public static BukkitTask taskTimer(Runnable runnable, long delay, long interval) { - return taskTimer(runnable, Anticheat.INSTANCE, delay, interval); - } - - public static BukkitTask taskTimerAsync(Runnable runnable, Plugin plugin, long delay, long interval) { - return Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, runnable, delay, interval); + return Bukkit.getScheduler().runTaskTimer(Anticheat.INSTANCE.getPluginInstance(), runnable, delay, interval); } public static BukkitTask taskTimerAsync(Runnable runnable, long delay, long interval) { - return taskTimerAsync(runnable, Anticheat.INSTANCE, delay, interval); - } - - public static BukkitTask task(Runnable runnable, Plugin plugin) { - return Bukkit.getScheduler().runTask(plugin, runnable); + return Bukkit.getScheduler().runTaskTimerAsynchronously(Anticheat.INSTANCE.getPluginInstance(), runnable, delay, interval); } public static BukkitTask task(Runnable runnable) { - return task(runnable, Anticheat.INSTANCE); - } - - public static BukkitTask taskAsync(Runnable runnable, Plugin plugin) { - return Bukkit.getScheduler().runTaskAsynchronously(plugin, runnable); + return Bukkit.getScheduler().runTask(Anticheat.INSTANCE.getPluginInstance(), runnable); } public static BukkitTask taskAsync(Runnable runnable) { - return taskAsync(runnable, Anticheat.INSTANCE); - } - - public static BukkitTask taskLater(Runnable runnable, Plugin plugin, long delay) { - return Bukkit.getScheduler().runTaskLater(plugin, runnable, delay); + return Bukkit.getScheduler().runTaskAsynchronously(Anticheat.INSTANCE.getPluginInstance(), runnable); } public static BukkitTask taskLater(Runnable runnable, long delay) { - return taskLater(runnable, Anticheat.INSTANCE, delay); - } - - public static BukkitTask taskLaterAsync(Runnable runnable, Plugin plugin, long delay) { - return Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, runnable, delay); + return Bukkit.getScheduler().runTaskLater(Anticheat.INSTANCE.getPluginInstance(), runnable, delay); } public static BukkitTask taskLaterAsync(Runnable runnable, long delay) { - return taskLaterAsync(runnable, Anticheat.INSTANCE, delay); + return Bukkit.getScheduler().runTaskLaterAsynchronously(Anticheat.INSTANCE.getPluginInstance(), runnable, delay); } public static Future callLater(Future runnable, long delay, Consumer onComplete) { diff --git a/src/main/java/dev/brighten/ac/utils/menu/MenuListener.java b/src/main/java/dev/brighten/ac/utils/menu/MenuListener.java index 2724ca7..d683e8f 100644 --- a/src/main/java/dev/brighten/ac/utils/menu/MenuListener.java +++ b/src/main/java/dev/brighten/ac/utils/menu/MenuListener.java @@ -119,7 +119,7 @@ public class MenuListener implements Listener { this.cancel(); } } - }.runTaskTimer(Anticheat.INSTANCE, 2L, 0L)); + }.runTaskTimer(Anticheat.INSTANCE.getPluginInstance(), 2L, 0L)); } } if(inventory instanceof AnvilInventory && anvils.containsKey(inventory)) { diff --git a/src/main/java/dev/brighten/ac/utils/wrapper/Wrapper.java b/src/main/java/dev/brighten/ac/utils/wrapper/Wrapper.java new file mode 100644 index 0000000..599e9e4 --- /dev/null +++ b/src/main/java/dev/brighten/ac/utils/wrapper/Wrapper.java @@ -0,0 +1,27 @@ +package dev.brighten.ac.utils.wrapper; + +import dev.brighten.ac.packet.ProtocolVersion; +import dev.brighten.ac.utils.wrapper.impl.Wrapper_18R3; +import dev.brighten.ac.utils.wrapper.impl.Wrapper_Reflection; +import org.bukkit.Material; + +public abstract class Wrapper { + + private static Wrapper INSTANCE; + + public static Wrapper getInstance() { + if(INSTANCE == null) { + switch (ProtocolVersion.getGameVersion()) { + case V1_8_9: { + return INSTANCE = new Wrapper_18R3(); + } + default: { + return INSTANCE = new Wrapper_Reflection(); + } + } + } + return INSTANCE; + } + + public abstract float getFriction(Material material); +} diff --git a/src/main/java/dev/brighten/ac/utils/wrapper/impl/Wrapper_18R3.java b/src/main/java/dev/brighten/ac/utils/wrapper/impl/Wrapper_18R3.java new file mode 100644 index 0000000..66e0201 --- /dev/null +++ b/src/main/java/dev/brighten/ac/utils/wrapper/impl/Wrapper_18R3.java @@ -0,0 +1,12 @@ +package dev.brighten.ac.utils.wrapper.impl; + +import dev.brighten.ac.utils.wrapper.Wrapper; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_8_R3.util.CraftMagicNumbers; + +public class Wrapper_18R3 extends Wrapper { + @Override + public float getFriction(Material material) { + return CraftMagicNumbers.getBlock(material).frictionFactor; + } +} diff --git a/src/main/java/dev/brighten/ac/utils/wrapper/impl/Wrapper_Reflection.java b/src/main/java/dev/brighten/ac/utils/wrapper/impl/Wrapper_Reflection.java new file mode 100644 index 0000000..799e2cc --- /dev/null +++ b/src/main/java/dev/brighten/ac/utils/wrapper/impl/Wrapper_Reflection.java @@ -0,0 +1,20 @@ +package dev.brighten.ac.utils.wrapper.impl; + +import dev.brighten.ac.utils.reflections.Reflections; +import dev.brighten.ac.utils.reflections.types.WrappedClass; +import dev.brighten.ac.utils.reflections.types.WrappedField; +import dev.brighten.ac.utils.reflections.types.WrappedMethod; +import dev.brighten.ac.utils.wrapper.Wrapper; +import org.bukkit.Material; + +public class Wrapper_Reflection extends Wrapper { + + private static WrappedClass blockClass = Reflections.getNMSClass("Block"); + private static WrappedMethod getById = blockClass.getMethodByType(blockClass.getParent(), 0); + private static WrappedField fieldFriction = blockClass.getFieldByType(float.class, 3); + + @Override + public float getFriction(Material material) { + return fieldFriction.get(getById.invoke(material)); + } +}