diff --git a/src/main/java/dev/brighten/ac/Anticheat.java b/src/main/java/dev/brighten/ac/Anticheat.java index 4d778bd..5749a2b 100644 --- a/src/main/java/dev/brighten/ac/Anticheat.java +++ b/src/main/java/dev/brighten/ac/Anticheat.java @@ -113,14 +113,16 @@ public class Anticheat extends JavaPlugin { getConfig().set("database.password", UUID.randomUUID().toString()); } - HandlerAbstract.init(); - this.keepaliveProcessor = new KeepaliveProcessor(); this.checkManager = new CheckManager(); this.playerRegistry = new PlayerRegistry(); this.packetHandler = new PacketHandler(); logManager = new LoggerManager(); + keepaliveProcessor.start(); + + HandlerAbstract.init(); + logManager.init(); alog(Color.Green + "Loading WorldInfo system..."); diff --git a/src/main/java/dev/brighten/ac/check/Check.java b/src/main/java/dev/brighten/ac/check/Check.java index 7d9ddd4..b59ccb2 100644 --- a/src/main/java/dev/brighten/ac/check/Check.java +++ b/src/main/java/dev/brighten/ac/check/Check.java @@ -113,7 +113,8 @@ public class Check implements ECheck { if(!toDebug.equals(player.getUuid())) continue; - ComponentBuilder builder = new ComponentBuilder("[DEBUG] ").color(ChatColor.RED); + ComponentBuilder builder = new ComponentBuilder("[ " + getName() + ": " + player.getBukkitPlayer().getName() + "] ") + .color(ChatColor.RED); BaseComponent[] message = builder.append(String.format(information, variables)).color(ChatColor.GRAY).create(); diff --git a/src/main/java/dev/brighten/ac/check/impl/combat/Aim.java b/src/main/java/dev/brighten/ac/check/impl/combat/Aim.java index d8f009b..d3a1113 100644 --- a/src/main/java/dev/brighten/ac/check/impl/combat/Aim.java +++ b/src/main/java/dev/brighten/ac/check/impl/combat/Aim.java @@ -50,7 +50,9 @@ public class Aim extends Check { boolean increasing = deltaYaw > deltaX || deltaPitch > deltaY; boolean flagged = false; - if(player.getMovement().getPitchGCD() < 0.007 && lastGrid.isPassed() && player.getMovement().getLastHighRate().isNotPassed(3)) { + if(player.getMovement().getPitchGCD() < 0.007 && lastGrid.isPassed() + && !player.getMovement().isCinematic() + && player.getMovement().getLastHighRate().isNotPassed(3)) { if(deltaPitch < 10 && ++buffer > 8) { flag("%s", player.getMovement().getPitchGCD()); } 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 d2aaa3f..e345552 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 @@ -37,8 +37,14 @@ public class FlyC extends Check { // Adding all possible velocity deltaY. player.getVelocityHandler().getPossibleVectors().forEach(vec -> possibleHeights.add(vec.getY())); + if(player.getBlockInfo().onHalfBlock) { + possibleHeights.add(0.5); + } + jumpCheck: { - if(!jumped) break jumpCheck; + if(!jumped || player.getInfo().blockAbove.isNotPassed(1) + || player.getInfo().slimeTimer.isNotPassed(1) + || player.getInfo().lastLiquid.isNotPassed(1)) break jumpCheck; // We want to check all possible heights for (Double possibleHeight : possibleHeights) { 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 7c0ddd0..4d395ca 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 @@ -18,7 +18,8 @@ public class FlyD extends Check { @Async WAction flyingPacket = packet -> { - if(!packet.isMoved() || player.getMovement().getMoveTicks() <= 2) return; + if(!packet.isMoved() || player.getMovement().getMoveTicks() <= 2 + || player.getBlockInfo().miscNear || player.getInfo().isGeneralCancel()) return; double deltaY = player.getMovement().getDeltaY(); if(deltaY > 0) diff --git a/src/main/java/dev/brighten/ac/check/impl/movement/nofall/NoFallB.java b/src/main/java/dev/brighten/ac/check/impl/movement/nofall/NoFallB.java index 5516e6c..b4ff4dc 100644 --- a/src/main/java/dev/brighten/ac/check/impl/movement/nofall/NoFallB.java +++ b/src/main/java/dev/brighten/ac/check/impl/movement/nofall/NoFallB.java @@ -52,6 +52,7 @@ public class NoFallB extends Check { && player.getInfo().isNearGround(); if(!packet.isOnGround() && player.getInfo().vehicleSwitch.isPassed(20) + && !player.getBlockInfo().inLiquid && ((player.getInfo().isServerGround() || player.getBlockInfo().blocksBelow) && dground && !player.getBlockInfo().onHalfBlock)) { if((airBuffer +=10) > 30) { diff --git a/src/main/java/dev/brighten/ac/check/impl/movement/speed/Horizontal.java b/src/main/java/dev/brighten/ac/check/impl/movement/speed/Horizontal.java index 55c00d1..b858022 100644 --- a/src/main/java/dev/brighten/ac/check/impl/movement/speed/Horizontal.java +++ b/src/main/java/dev/brighten/ac/check/impl/movement/speed/Horizontal.java @@ -8,6 +8,7 @@ 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.BlockUtils; +import dev.brighten.ac.utils.KLocation; import dev.brighten.ac.utils.MathHelper; import dev.brighten.ac.utils.math.IntVector; import org.bukkit.Material; @@ -24,7 +25,7 @@ public class Horizontal extends Check { private float buffer; private Vector velocity; private int vTicks; - + private KLocation previousFrom; private static final boolean[] TRUE_FALSE = new boolean[]{true, false}; public double strafe, forward; @@ -34,15 +35,15 @@ public class Horizontal extends Check { } WAction flying = packet -> { - Block underBlock = BlockUtils.getBlock(player.getMovement().getTo().getLoc() - .toLocation(player.getBukkitPlayer().getWorld()) - .subtract(0, 1, 0)), - lastUnderBlock = BlockUtils.getBlock(player.getMovement().getFrom().getLoc() - .toLocation(player.getBukkitPlayer().getWorld()) - .subtract(0, 1, 0)); check: { + Block underBlock = BlockUtils.getBlock((previousFrom != null ? player.getMovement().getFrom().getLoc() : player.getMovement().getTo().getLoc()) + .toLocation(player.getBukkitPlayer().getWorld()) + .subtract(0, 1, 0)), + lastUnderBlock = BlockUtils.getBlock((previousFrom != null ? previousFrom : player.getMovement().getFrom().getLoc()) + .toLocation(player.getBukkitPlayer().getWorld()) + .subtract(0, 1, 0)); if (underBlock == null || lastUnderBlock == null) break check; @@ -147,7 +148,7 @@ public class Horizontal extends Check { } //Less than 0.05 - if(((lmotionX * lmotionX) + (lmotionZ * lmotionZ)) < 0.0025 && player.getMovement().getDeltaXZ() < 0.1) { + if(((lmotionX * lmotionX) + (lmotionZ * lmotionZ)) < 0.0025 && player.getMovement().getDeltaXZ() < 0.2) { break check; } // Attack slowdown @@ -262,11 +263,12 @@ public class Horizontal extends Check { } else debug("bad movement"); } else if (buffer > 0) buffer -= 0.05f; - debug("smallest=%s pm=%.5f dxz=%.5f b=%.1f f/s=%.2f,%.2f soulsand=%s", smallestDelta, pmotion, + debug("smallest=%s f=%s lf=%s pm=%.5f dxz=%.5f b=%.1f f/s=%.2f,%.2f soulsand=%s ", smallestDelta, frictionList, lfrictionList, pmotion, player.getMovement().getDeltaXZ(), buffer, forward, strafe, player.getBlockInfo().onSoulSand); } lastLastClientGround = player.getMovement().getFrom().isOnGround(); + previousFrom = player.getMovement().getFrom().getLoc().clone(); }; private static final float[] SIN_TABLE_FAST = new float[4096], SIN_TABLE_FAST_NEW = new float[4096]; 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 new file mode 100644 index 0000000..589f7c8 --- /dev/null +++ b/src/main/java/dev/brighten/ac/check/impl/movement/speed/Speed.java @@ -0,0 +1,134 @@ +package dev.brighten.ac.check.impl.movement.speed; + +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.PlayerUtils; +import dev.brighten.ac.utils.TagsBuilder; +import org.bukkit.potion.PotionEffectType; + +@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; + + WAction flyingPacket = packet -> { + if(player.getMovement().isExcuseNextFlying()) return; + checkProccesing: + { + if (!packet.isMoved()) + break checkProccesing; + + float drag = friction; + + TagsBuilder tags = new TagsBuilder(); + double moveFactor = player.getBukkitPlayer().getWalkSpeed() / 2f; + + 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; + } + } 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"); + } + + 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; + } + + //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().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; + } + + double ratio = (player.getMovement().getDeltaXZ() - ldxz) / moveFactor * 100; + + if (ratio > 100.8 + && !player.getBlockInfo().inHoney + && !player.getBlockInfo().inScaffolding + && player.getInfo().velocity.isPassed(2) + && player.getInfo().lastLiquid.isPassed(2) + && !player.getInfo().generalCancel) { + 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()); + 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; + } + friction = player.getBlockInfo().currentFriction; + }; +} diff --git a/src/main/java/dev/brighten/ac/command/AnticheatCommand.java b/src/main/java/dev/brighten/ac/command/AnticheatCommand.java index 0212a39..44ea6cb 100644 --- a/src/main/java/dev/brighten/ac/command/AnticheatCommand.java +++ b/src/main/java/dev/brighten/ac/command/AnticheatCommand.java @@ -123,6 +123,7 @@ public class AnticheatCommand extends BaseCommand { Anticheat.INSTANCE.getScheduler().execute(() -> { List logs = new ArrayList<>(); + System.out.println("shit 1"); Anticheat.INSTANCE.getLogManager().runQuery("select * from logs where uuid=" + uuid.hashCode(), rs -> { Log log = Log.builder() .uuid(UUID.fromString(rs.getString("uuid"))) @@ -132,6 +133,8 @@ public class AnticheatCommand extends BaseCommand { .time(rs.getLong("time")) .build(); + System.out.println("Shit"); + logs.add("Flagged " + Anticheat.INSTANCE.getCheckManager().getIdToName().get(log.getCheckId()) + " data: " + log.getData() + " VL: " + log.getVl() + " at " + log.getTime()); }); String url = null; diff --git a/src/main/java/dev/brighten/ac/data/handlers/BlockInformation.java b/src/main/java/dev/brighten/ac/data/handlers/BlockInformation.java index 6e55b8f..c3025bd 100644 --- a/src/main/java/dev/brighten/ac/data/handlers/BlockInformation.java +++ b/src/main/java/dev/brighten/ac/data/handlers/BlockInformation.java @@ -371,8 +371,10 @@ public class BlockInformation { if(entityBox.isCollided(normalBox.copy().offset(0, -.1, 0))) player.getInfo().setServerGround(true); - if(entityBox.isCollided(normalBox)) + if(entityBox.isCollided(normalBox)) { collidedWithEntity = true; + player.getInfo().getLastEntityCollision().reset(); + } } //Bukkit.broadcastMessage("chigga5"); diff --git a/src/main/java/dev/brighten/ac/data/handlers/GeneralInformation.java b/src/main/java/dev/brighten/ac/data/handlers/GeneralInformation.java index 2942997..86a64f6 100644 --- a/src/main/java/dev/brighten/ac/data/handlers/GeneralInformation.java +++ b/src/main/java/dev/brighten/ac/data/handlers/GeneralInformation.java @@ -26,8 +26,9 @@ public class GeneralInformation { lastSneak = new TickTimer(), velocity = new TickTimer(), lastCancel = new TickTimer(), slimeTimer = new TickTimer(), lastElytra = new TickTimer(), blockAbove = new TickTimer(), lastPlace = new TickTimer(), climbTimer = new TickTimer(), lastUseItem = new TickTimer(), + lastRespawn = new TickTimer(), lastEntityCollision = new TickTimer(), lastWeb = new TickTimer(), lastLiquid = new TickTimer(), lastBlockDig = new TickTimer(), lastBlockPlace = new TickTimer(), - lastBlockUpdate = new TickTimer(); + lastBlockUpdate = new TickTimer(), lastMiscNear = new TickTimer(), lastHalfBlock = new TickTimer(); public LivingEntity target; public boolean serverGround, lastServerGround, canFly, nearGround, worldLoaded, generalCancel, inVehicle, creative, sneaking, lsneaking, sprinting, gliding, riptiding, wasOnSlime, onLadder, doingVelocity, breakingBlock; diff --git a/src/main/java/dev/brighten/ac/data/handlers/MovementHandler.java b/src/main/java/dev/brighten/ac/data/handlers/MovementHandler.java index 0a5c3f6..fe02c4f 100644 --- a/src/main/java/dev/brighten/ac/data/handlers/MovementHandler.java +++ b/src/main/java/dev/brighten/ac/data/handlers/MovementHandler.java @@ -230,6 +230,7 @@ public class MovementHandler { if (player.getInfo().isGliding()) player.getInfo().getLastElytra().reset(); if (player.getInfo().isSneaking()) player.getInfo().getLastSneak().reset(); if (player.getBlockInfo().inLiquid) player.getInfo().getLastLiquid().reset(); + if(player.getBlockInfo().inWeb) player.getInfo().lastWeb.reset(); player.getInfo().setGeneralCancel(player.getBukkitPlayer().getAllowFlight() || moveTicks == 0 diff --git a/src/main/java/dev/brighten/ac/handler/PacketHandler.java b/src/main/java/dev/brighten/ac/handler/PacketHandler.java index 2a96861..5f4503a 100644 --- a/src/main/java/dev/brighten/ac/handler/PacketHandler.java +++ b/src/main/java/dev/brighten/ac/handler/PacketHandler.java @@ -3,7 +3,6 @@ package dev.brighten.ac.handler; import dev.brighten.ac.Anticheat; import dev.brighten.ac.data.APlayer; import dev.brighten.ac.data.obj.NormalAction; -import dev.brighten.ac.handler.thread.ThreadHandler; import dev.brighten.ac.packet.ProtocolVersion; import dev.brighten.ac.packet.wrapper.PacketType; import dev.brighten.ac.packet.wrapper.in.*; @@ -178,6 +177,7 @@ public class PacketHandler { if(player.getPlayerVersion().isBelow(ProtocolVersion.V1_14)) { player.runKeepaliveAction(k -> player.getBukkitPlayer().setSprinting(false), 1); } + player.runKeepaliveAction(ka -> player.getInfo().lastRespawn.reset()); break; } case SERVER_POSITION: { 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 470db61..f8eaea6 100644 --- a/src/main/java/dev/brighten/ac/handler/keepalive/KeepaliveProcessor.java +++ b/src/main/java/dev/brighten/ac/handler/keepalive/KeepaliveProcessor.java @@ -29,7 +29,6 @@ public class KeepaliveProcessor implements Runnable { final Int2ObjectMap lastResponses = Int2ObjectMaps.synchronize(new Int2ObjectOpenHashMap<>()); public KeepaliveProcessor() { - start(); } @Override @@ -46,7 +45,6 @@ public class KeepaliveProcessor implements Runnable { currentKeepalive.startStamp = System.currentTimeMillis(); totalPlayers = laggyPlayers = 0; - if(Anticheat.INSTANCE.getPlayerRegistry() == null) return; //Temp fix for startup errors on plugman reload for (APlayer value : Anticheat.INSTANCE.getPlayerRegistry().aplayerMap.values()) { totalPlayers++; diff --git a/src/main/java/dev/brighten/ac/logging/LoggerManager.java b/src/main/java/dev/brighten/ac/logging/LoggerManager.java index 6742f84..d4a52f5 100644 --- a/src/main/java/dev/brighten/ac/logging/LoggerManager.java +++ b/src/main/java/dev/brighten/ac/logging/LoggerManager.java @@ -47,7 +47,7 @@ public class LoggerManager { Log log = null; int amount = 0; while((log = logList.poll()) != null) { - objectsToInsert.add(log.getUuid().toString()); + objectsToInsert.add(log.getUuid().hashCode()); objectsToInsert.add(log.getCheckId()); objectsToInsert.add(log.getVl()); objectsToInsert.add(log.getData()); diff --git a/src/main/java/dev/brighten/ac/packet/handler/HandlerAbstract.java b/src/main/java/dev/brighten/ac/packet/handler/HandlerAbstract.java index 9d7f412..5bf7df8 100644 --- a/src/main/java/dev/brighten/ac/packet/handler/HandlerAbstract.java +++ b/src/main/java/dev/brighten/ac/packet/handler/HandlerAbstract.java @@ -24,6 +24,8 @@ public abstract class HandlerAbstract{ if(ProtocolVersion.getGameVersion().isOrAbove(ProtocolVersion.V1_8)) { handler = new ModernHandler(); } else handler = new LegacyHandler(); + + Bukkit.getOnlinePlayers().forEach(handler::add); } public static void shutdown() { diff --git a/src/main/java/dev/brighten/ac/utils/TagsBuilder.java b/src/main/java/dev/brighten/ac/utils/TagsBuilder.java new file mode 100644 index 0000000..a9422a5 --- /dev/null +++ b/src/main/java/dev/brighten/ac/utils/TagsBuilder.java @@ -0,0 +1,22 @@ +package dev.brighten.ac.utils; + +import java.util.ArrayList; +import java.util.List; + +public class TagsBuilder { + private final List tags = new ArrayList<>(); + + public TagsBuilder addTag(String string) { + tags.add(string); + + return this; + } + + public String build() { + return String.join(", ", tags); + } + + public int getSize() { + return tags.size(); + } +} \ No newline at end of file diff --git a/src/main/java/dev/brighten/ac/utils/world/EntityData.java b/src/main/java/dev/brighten/ac/utils/world/EntityData.java index 2df818b..6689b5e 100644 --- a/src/main/java/dev/brighten/ac/utils/world/EntityData.java +++ b/src/main/java/dev/brighten/ac/utils/world/EntityData.java @@ -27,8 +27,8 @@ public class EntityData { //We cast this as a float since the fields are floats. - return new SimpleCollisionBox(new Vector(), fieldWidth.get(ventity), - fieldLength.get(ventity)); + return new SimpleCollisionBox(new Vector(), (float)fieldWidth.get(ventity), + (float)fieldLength.get(ventity)); }).copy(); }