From 5f532403315fa136453b6ea59c52001009eac007 Mon Sep 17 00:00:00 2001 From: Dawson <30784509+funkemunky@users.noreply.github.com> Date: Mon, 27 Mar 2023 12:12:36 -0400 Subject: [PATCH] Cleaning up code, new Aim C --- .../brighten/ac/check/impl/combat/Hitbox.java | 29 ++-- .../ac/check/impl/combat/aim/AimB.java | 6 +- .../ac/check/impl/combat/aim/AimC.java | 41 ++++++ .../check/impl/combat/killaura/KATrace.java | 10 +- .../impl/combat/killaura/calc/KACalc.java | 47 ++++--- .../ac/check/impl/movement/Phase.java | 18 +-- .../check/impl/movement/nofall/NoFallA.java | 7 +- .../impl/movement/velocity/VelocityB.java | 16 +-- .../brighten/ac/check/impl/world/BlockA.java | 12 +- .../brighten/ac/check/impl/world/BlockC.java | 2 +- .../java/dev/brighten/ac/data/APlayer.java | 16 +++ .../ac/data/info/BlockInformation.java | 12 +- .../java/dev/brighten/ac/data/obj/CMove.java | 10 +- .../ac/handler/EntityLocationHandler.java | 2 +- .../brighten/ac/handler/MovementHandler.java | 82 +++++------ .../ac/packet/wrapper/impl/Processor_18.java | 4 +- .../java/dev/brighten/ac/utils/KLocation.java | 132 ------------------ .../dev/brighten/ac/utils/MovementUtils.java | 40 +++--- .../dev/brighten/ac/utils/PastLocation.java | 15 +- .../ac/utils/math/MinecraftConstants.java | 6 + .../brighten/ac/utils/world/EntityData.java | 2 +- .../utils/world/types/SimpleCollisionBox.java | 2 +- .../java/dev/brighten/ac/utils/KLocation.java | 8 +- .../java/dev/brighten/ac/utils/MathUtils.java | 22 ++- .../utils/objects/evicting/EvictingSet.java | 69 +++++++++ 25 files changed, 310 insertions(+), 300 deletions(-) create mode 100644 Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/aim/AimC.java delete mode 100644 Anticheat/src/main/java/dev/brighten/ac/utils/KLocation.java create mode 100644 Anticheat/src/main/java/dev/brighten/ac/utils/math/MinecraftConstants.java create mode 100644 Compat/src/main/java/dev/brighten/ac/utils/objects/evicting/EvictingSet.java diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/Hitbox.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/Hitbox.java index 2f20eda..dbcb421 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/Hitbox.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/Hitbox.java @@ -43,7 +43,8 @@ public class Hitbox extends Check { if(entity == null) return; if(packet.getAction() == WPacketPlayInUseEntity.EnumEntityUseAction.ATTACK && allowedEntityTypes.contains(entity.getType())) { - attacks.add(new Tuple<>(packet.getEntity(player.getBukkitPlayer().getWorld()), player.getMovement().getTo().getLoc().clone())); + attacks.add(new Tuple<>(packet.getEntity(player.getBukkitPlayer().getWorld()), + player.getMovement().getTo().getLoc().clone())); } }; @@ -60,9 +61,10 @@ public class Hitbox extends Check { while((target = attacks.poll()) != null) { //Updating new entity loc - Optional> optionalEloc = player.getEntityLocationHandler().getEntityLocation(target.one); + Optional> optionalEloc = player.getEntityLocationHandler() + .getEntityLocation(target.one); - if(!optionalEloc.isPresent()) { + if(optionalEloc.isEmpty()) { return; } @@ -118,13 +120,13 @@ public class Hitbox extends Check { || player.getInfo().getLastElytra().isNotPassed(40); List directions = new ArrayList<>(Arrays.asList(MathUtils.getDirection( - player.getMovement().getTo().getLoc().yaw, - player.getMovement().getTo().getLoc().pitch), - MathUtils.getDirection(player.getMovement().getFrom().getLoc().yaw, - player.getMovement().getTo().getLoc().pitch))); + player.getMovement().getTo().getLoc().getYaw(), + player.getMovement().getTo().getLoc().getPitch()), + MathUtils.getDirection(player.getMovement().getFrom().getLoc().getYaw(), + player.getMovement().getTo().getLoc().getPitch()))); if(!didSneakOrElytra) { - to.y+= 1.62f; + to.add(0, 1.62f, 0); for (Vector direction : directions) { for (SimpleCollisionBox targetBox : boxes) { final AxisAlignedBB vanillaBox = new AxisAlignedBB(targetBox); @@ -134,7 +136,8 @@ public class Hitbox extends Check { if(intersectTo != null) { lastAimOnTarget.reset(); hits++; - distance = Math.min(distance, intersectTo.distanceSquared(new Vec3D(to.x, to.y, to.z))); + distance = Math.min(distance, intersectTo + .distanceSquared(new Vec3D(to.getX(), to.getY(), to.getZ()))); collided = true; } } @@ -148,13 +151,14 @@ public class Hitbox extends Check { KLocation from = to.clone(); - from.y+= eyeHeight; + from.add(0, eyeHeight, 0); Vec3D intersectTo = vanillaBox.rayTrace(from.toVector(), direction, 10); if(intersectTo != null) { lastAimOnTarget.reset(); hits++; - distance = Math.min(distance, intersectTo.distanceSquared(new Vec3D(from.x, from.y, from.z))); + distance = Math.min(distance, intersectTo + .distanceSquared(new Vec3D(from.getX(), from.getY(), from.getZ()))); collided = true; } } @@ -174,7 +178,8 @@ public class Hitbox extends Check { if(hbuffer > 0) hbuffer--; - debug("buffer: %.3f distance=%.2f hits=%s sneaking=%s", buffer, distance, hits, player.getInfo().isSneaking()); + debug("buffer: %.3f distance=%.2f hits=%s sneaking=%s", buffer, distance, hits, + player.getInfo().isSneaking()); } else if(player.getEntityLocationHandler().streak > 1) { if (++hbuffer > 5) { flag("%.1f;%.1f;%.1f", eloc.one.x, eloc.one.y, eloc.one.z); 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 7c19cf4..7f23fb6 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 @@ -1,15 +1,16 @@ package dev.brighten.ac.check.impl.combat.aim; +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.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) +@CheckData(name = "Aim (B)", checkId = "aimb", type = CheckType.COMBAT, experimental = true) public class AimB extends Check { public AimB(APlayer player) { super(player); @@ -22,7 +23,6 @@ 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 new file mode 100644 index 0000000..cde4bfd --- /dev/null +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/aim/AimC.java @@ -0,0 +1,41 @@ +package dev.brighten.ac.check.impl.combat.aim; + +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.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) +public class AimC extends Check { + + public AimC(APlayer player) { + super(player); + } + + private float buffer; + + @Bind + WAction flying = packet -> { + if(!packet.isLooked()) return; + + float deltaYaw = MathUtils.getAngleDelta(player.getMovement().getTo().getYaw(), + player.getMovement().getFrom().getYaw()); + + if(deltaYaw > 320 && player.getMovement().getLDeltaYaw() > 0 + && player.getMovement().getLDeltaYaw() < 30 + && player.getMovement().getTo().getYaw() < 360 + && player.getMovement().getTo().getYaw() > -360 + && player.getMovement().getLastTeleport().isPassed(1) + && player.getMovement().getSensitivityX() < 0.65) { + if(++buffer > 1) { + flag("yaw=%.3f", deltaYaw); + } + } else if(buffer > 0) buffer-= 0.005f; + + debug("[%.3f] yaw=%.3f", buffer, deltaYaw); + }; +} 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 109b5af..fcc0c9a 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 @@ -5,7 +5,6 @@ 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.WPacketPlayInUseEntity; import dev.brighten.ac.utils.KLocation; import dev.brighten.ac.utils.annotation.Bind; @@ -24,12 +23,8 @@ import org.bukkit.util.Vector; @CheckData(name = "KillAura (Trace)", checkId = "katrace", type = CheckType.KILLAURA) public class KATrace extends Check { - private float sneakY = 1.54f; public KATrace(APlayer player) { super(player); - - // We're caching the player's sneak height here, so we don't have to do it every time. - sneakY = player.getPlayerVersion().isBelow(ProtocolVersion.V1_14) ? 1.27f : 1.54f; } private int buffer; @@ -57,7 +52,7 @@ public class KATrace extends Check { final KLocation origin = player.getMovement().getTo().getLoc().clone(); // Setting the player's eye height based on their sneak status - origin.y+= player.getInfo().isSneaking() ? sneakY : 1.62f; + origin.add(0, player.getEyeHeight(), 0); final Vector originVec = origin.toVector(); @@ -78,8 +73,7 @@ public class KATrace extends Check { // the result from there in this check to save on compute time. synchronized (player.getMovement().getLookingAtBoxes()) { for (CollisionBox lookingAtBox : player.getMovement().getLookingAtBoxes()) { - if((lookingAtBox instanceof SimpleCollisionBox)) { - SimpleCollisionBox box = (SimpleCollisionBox) lookingAtBox; + if((lookingAtBox instanceof SimpleCollisionBox box)) { if(box.minX % 1 != 0 || box.minY % 1 != 0 || box.minZ % 1 != 0 || box.maxX % 1 != 0 || box.maxY % 1 != 0 || box.maxZ % 1 != 0) continue; diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/calc/KACalc.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/calc/KACalc.java index 77e5fb1..f456ce3 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/calc/KACalc.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/combat/killaura/calc/KACalc.java @@ -14,16 +14,22 @@ import dev.brighten.ac.utils.annotation.Bind; import dev.brighten.ac.utils.objects.evicting.EvictingList; import org.bukkit.util.Vector; +import java.util.ArrayList; import java.util.List; import java.util.Optional; @CheckData(name = "KillAura (Calc)", checkId = "kacalc", type = CheckType.KILLAURA) -public class KACalc extends Check { +public abstract class KACalc extends Check { + + private final List CALCULATION_CHECKS = new ArrayList<>(); public KACalc(APlayer player) { super(player); } - List floats = new EvictingList<>(100); + private final List YAW_OFFSET = new EvictingList<>(10), + PITCH_OFFSET = new EvictingList<>(10); + + private int buffer; @Bind WAction flying = packet -> { @@ -42,30 +48,31 @@ public class KACalc extends Check { .add(0, player.getInfo().isSneaking() ? 1.54f : 1.62f, 0); double halfHeight = player.getInfo().getTarget().getEyeHeight() / 2; + KLocation targetLocation = new KLocation(current.getX(), current.getY(), current.getZ()); var rotations = MathUtils - .getRotation(originKLoc, new KLocation(current.getX(), current.getY() + halfHeight, current.getZ())); + .getRotation(originKLoc, targetLocation.clone().add(0, halfHeight, 0)); + var offset = MathUtils.getOffsetFromLocation(originKLoc, targetLocation); - var diff = new float[3]; - diff[0] = MathUtils.getAngleDelta(player.getMovement().getTo().getYaw(), rotations[0]); - diff[1] = player.getMovement().getTo().getPitch() - rotations[1]; - diff[2] = player.getMovement().getTo().getYaw(); + YAW_OFFSET.add(offset[0]); + PITCH_OFFSET.add(offset[1]); - floats.add(diff); + if(YAW_OFFSET.size() < 10 || PITCH_OFFSET.size() < 10) return; - if(floats.size() == 60) { - float[] xFloats = new float[floats.size()], yawFloats = new float[floats.size()]; + double[] std = new double[2]; - for (int i = 0; i < floats.size(); i++) { - float[] floats = this.floats.get(i); + std[0] = MathUtils.stdev(YAW_OFFSET); + std[1] = MathUtils.stdev(PITCH_OFFSET); - xFloats[i] = floats[0] + Math.abs(floats[1]); - yawFloats[i] = floats[2]; - } - - double x = MathUtils.getAverage(xFloats), y = MathUtils.getGrid(yawFloats); - - debug("avg=%.4f grid=%.4f", x, y); - floats.clear(); + for (KACalc check : CALCULATION_CHECKS) { + check.runCheck(tuple, std, offset, rotations); } }; + + /** + * + * @param std double[] - Standard deviation of the offset. Arg 0 is yaw, arg 1 is pitch. + * @param offset double[] - Offset of the target. Arg 0 is yaw, arg 1 is pitch. + * @param rot float[] - Rotations to the target. Arg 0 is yaw, arg 1 is pitch. + */ + public abstract void runCheck(Tuple locs, double[] std, double[] offset, float[] rot); } diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/Phase.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/Phase.java index 55c92db..4342575 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/Phase.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/Phase.java @@ -10,11 +10,11 @@ import dev.brighten.ac.packet.wrapper.in.WPacketPlayInFlying; import dev.brighten.ac.packet.wrapper.out.WPacketPlayOutPosition; import dev.brighten.ac.utils.*; import dev.brighten.ac.utils.annotation.Bind; +import dev.brighten.ac.utils.objects.evicting.EvictingSet; import dev.brighten.ac.utils.world.types.SimpleCollisionBox; import org.bukkit.Location; import org.bukkit.util.Vector; -import java.util.HashSet; import java.util.List; import java.util.Set; @@ -26,7 +26,7 @@ public class Phase extends Check { } private int ticks; - private final Set POSITIONS = new HashSet<>(); + private final Set POSITIONS = new EvictingSet<>(10); private Location teleportLoc = null; @Bind @@ -34,19 +34,19 @@ public class Phase extends Check { KLocation loc = new KLocation(packet.getX(), packet.getY(), packet.getZ(), packet.getYaw(), packet.getPitch()); if (packet.getFlags().contains(WPacketPlayOutPosition.EnumPlayerTeleportFlags.X)) { - loc.x += player.getMovement().getTo().getLoc().x; + loc.add(player.getMovement().getTo().getLoc().getX(), 0, 0); } if (packet.getFlags().contains(WPacketPlayOutPosition.EnumPlayerTeleportFlags.Y)) { - loc.y += player.getMovement().getTo().getLoc().y; + loc.add(0, player.getMovement().getTo().getLoc().getY(), 0); } if (packet.getFlags().contains(WPacketPlayOutPosition.EnumPlayerTeleportFlags.Z)) { - loc.z += player.getMovement().getTo().getLoc().z; + loc.add(0, 0, player.getMovement().getTo().getLoc().getZ()); } if (packet.getFlags().contains(WPacketPlayOutPosition.EnumPlayerTeleportFlags.X_ROT)) { - loc.pitch += player.getMovement().getTo().getLoc().pitch; + loc.setPitch(loc.getPitch() + player.getMovement().getTo().getLoc().getPitch()); } if (packet.getFlags().contains(WPacketPlayOutPosition.EnumPlayerTeleportFlags.Y_ROT)) { - loc.yaw += player.getMovement().getTo().getLoc().yaw; + loc.setYaw(loc.getYaw() + player.getMovement().getTo().getLoc().getYaw()); } POSITIONS.add(loc.toVector()); @@ -115,7 +115,7 @@ public class Phase extends Check { toBox.offset(0, 0, deltaZ); - KLocation calculatedTo = player.getMovement().getFrom().getLoc().clone().add(deltaX, deltaY, deltaZ); + KLocation calculatedTo = player.getMovement().getFrom().getLoc().clone(); double dx = Math.abs(deltaX - player.getMovement().getDeltaX()), dy = Math.abs(deltaY - player.getMovement().getDeltaY()), @@ -123,7 +123,7 @@ public class Phase extends Check { double totalDelta = dx + dy + dz; - if(totalDelta > 0.00001) { + if(totalDelta > 0.0001) { RunUtils.task(() -> { teleportLoc = calculatedTo .toLocation(player.getBukkitPlayer().getWorld()); diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/nofall/NoFallA.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/nofall/NoFallA.java index 2e2e6a3..a632ae6 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/nofall/NoFallA.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/nofall/NoFallA.java @@ -7,6 +7,7 @@ import dev.brighten.ac.check.WAction; import dev.brighten.ac.data.APlayer; import dev.brighten.ac.packet.wrapper.in.WPacketPlayInFlying; import dev.brighten.ac.utils.annotation.Bind; +import dev.brighten.ac.utils.math.MinecraftConstants; @CheckData(name = "NoFall (A)", checkId = "nofalla", type = CheckType.MOVEMENT) public class NoFallA extends Check { @@ -14,8 +15,6 @@ public class NoFallA extends Check { public NoFallA(APlayer player) { super(player); } - - private static double divisor = 1. / 64.; private float buffer; @Bind @@ -41,8 +40,8 @@ public class NoFallA extends Check { && !player.getInfo().isServerGround() && !player.getBlockInfo().fenceNear && (player.getMovement().getDeltaY() >= 0 - && (Math.abs(player.getMovement().getTo().getLoc().y) % divisor != 0 - || Math.abs(player.getMovement().getDeltaY()) % divisor != 0) + && (Math.abs(player.getMovement().getTo().getLoc().getY()) % MinecraftConstants.BLOCK_DIVISOR != 0 + || Math.abs(player.getMovement().getDeltaY()) % MinecraftConstants.BLOCK_DIVISOR != 0) || player.getMovement().getDeltaY() <= player.getMovement().getLDeltaY()); } else { flag = player.getMovement().getDeltaY() == 0 && player.getMovement().getLDeltaY() == 0 diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/velocity/VelocityB.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/velocity/VelocityB.java index 725cf25..a941b74 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/velocity/VelocityB.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/movement/velocity/VelocityB.java @@ -61,9 +61,9 @@ public class VelocityB extends Check { ? player.getMovement().getFrom().getLoc() : player.getMovement().getTo().getLoc(); Material underMaterial = player.getBlockUpdateHandler() - .getBlock(new IntVector(MathHelper.floor_double(underBlockLoc.x), - MathHelper.floor_double(underBlockLoc.y - 1), - MathHelper.floor_double(underBlockLoc.z))) + .getBlock(new IntVector(MathHelper.floor_double(underBlockLoc.getX()), + MathHelper.floor_double(underBlockLoc.getY() - 1), + MathHelper.floor_double(underBlockLoc.getZ()))) .getType(); if (player.getMovement().getMoveTicks() == 0 @@ -149,7 +149,7 @@ public class VelocityB extends Check { f5 = (float) (aiMoveSpeed * (0.16277136F / (drag * drag * drag))); if (iteration.sprinting && iteration.jumped) { - float rot = player.getMovement().getTo().getLoc().yaw * 0.017453292F; + float rot = player.getMovement().getTo().getLoc().getYaw() * 0.017453292F; lmotionX -= sin(iteration.fastMath, rot) * 0.2F; lmotionZ += cos(iteration.fastMath, rot) * 0.2F; } @@ -165,9 +165,9 @@ public class VelocityB extends Check { strafe *= keyedMotion; final float yawSin = sin(iteration.fastMath, - player.getMovement().getTo().getLoc().yaw * (float) Math.PI / 180.F), + player.getMovement().getTo().getLoc().getYaw() * (float) Math.PI / 180.F), yawCos = cos(iteration.fastMath, - player.getMovement().getTo().getLoc().yaw * (float) Math.PI / 180.F); + player.getMovement().getTo().getLoc().getYaw() * (float) Math.PI / 180.F); lmotionX += (strafe * yawCos - forward * yawSin); lmotionZ += (forward * yawCos + strafe * yawSin); @@ -181,9 +181,9 @@ public class VelocityB extends Check { strafe *= keyedMotion; final float yawSin = sin(iteration.fastMath, - player.getMovement().getTo().getLoc().yaw * (float) Math.PI / 180.F), + player.getMovement().getTo().getLoc().getYaw() * (float) Math.PI / 180.F), yawCos = cos(iteration.fastMath, - player.getMovement().getTo().getLoc().yaw * (float) Math.PI / 180.F); + player.getMovement().getTo().getLoc().getYaw() * (float) Math.PI / 180.F); lmotionX += (strafe * yawCos - forward * yawSin); lmotionZ += (forward * yawCos + strafe * yawSin); diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/world/BlockA.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/world/BlockA.java index 1e2066c..22e2688 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/world/BlockA.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/world/BlockA.java @@ -5,7 +5,6 @@ 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.WPacketPlayInBlockPlace; import dev.brighten.ac.packet.wrapper.in.WPacketPlayInFlying; import dev.brighten.ac.utils.BlockUtils; @@ -71,13 +70,8 @@ public class BlockA extends Check { final SimpleCollisionBox box = tuple.two.copy().expand(0.025); final Block block = tuple.one; - final KLocation to = player.getMovement().getTo().getLoc().clone(), - from = player.getMovement().getFrom().getLoc().clone(); - - to.y += player.getInfo().sneaking ? (ProtocolVersion.getGameVersion().isOrAbove(ProtocolVersion.V1_14) - ? 1.27f : 1.54f) : 1.62f; - from.y += player.getInfo().lsneaking ? (ProtocolVersion.getGameVersion().isOrAbove(ProtocolVersion.V1_14) - ? 1.27f : 1.54f) : 1.62f; + final KLocation to = player.getMovement().getTo().getLoc().clone().add(0, player.getEyeHeight(), 0), + from = player.getMovement().getFrom().getLoc().clone().add(0, player.getPreviousEyeHeight(), 0); final RayCollision rayTo = new RayCollision(to.toVector(), MathUtils.getDirection(to)), @@ -89,7 +83,7 @@ public class BlockA extends Check { if (!collided) { if (VERBOSE.add() > 4) { flag("to=[x=%.1f y=%.1f z=%.1f yaw=%.1f pitch=%.1f] loc=[%.1f,%.1f,%.1f]", - to.x, to.y, to.z, to.yaw, from.pitch, + to.getX(), to.getY(), to.getZ(), to.getYaw(), from.getPitch(), block.getLocation().getX(), block.getLocation().getY(), block.getLocation().getZ()); } } else VERBOSE.subtract(0.33); diff --git a/Anticheat/src/main/java/dev/brighten/ac/check/impl/world/BlockC.java b/Anticheat/src/main/java/dev/brighten/ac/check/impl/world/BlockC.java index 8120397..5ca358a 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/check/impl/world/BlockC.java +++ b/Anticheat/src/main/java/dev/brighten/ac/check/impl/world/BlockC.java @@ -43,7 +43,7 @@ public class BlockC extends Check { if(lastMovePacket == null) return; - final long delta = timestamp - lastMovePacket.timeStamp; + final long delta = timestamp - lastMovePacket.getTimeStamp(); if(delta <= 25) { lastPlace = timestamp; 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 d35e942..6bd7637 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/data/APlayer.java +++ b/Anticheat/src/main/java/dev/brighten/ac/data/APlayer.java @@ -290,6 +290,22 @@ public class APlayer { }); } + public double getEyeHeight() { + if(ProtocolVersion.getGameVersion().isOrAbove(ProtocolVersion.V1_14)) { + return getInfo().sneaking ? 1.27f : 1.62f; + } else { + return getInfo().sneaking ? 1.54f : 1.62f; + } + } + + public double getPreviousEyeHeight() { + if(ProtocolVersion.getGameVersion().isOrAbove(ProtocolVersion.V1_14)) { + return getInfo().lsneaking ? 1.27f : 1.62f; + } else { + return getInfo().lsneaking ? 1.54f : 1.62f; + } + } + public void addPlayerTick() { playerTick++; } 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 1ad8675..17046d9 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 @@ -66,12 +66,12 @@ public class BlockInformation { if(dy > 10) dy = 10; if(dh > 10) dh = 10; - int startX = Location.locToBlock(player.getMovement().getTo().getLoc().x - 1 - dh); - int endX = Location.locToBlock(player.getMovement().getTo().getLoc().x + 1 + dh); - int startY = Location.locToBlock(player.getMovement().getTo().getLoc().y - 1 - dy); - int endY = Location.locToBlock(player.getMovement().getTo().getLoc().y + 2.82 + dy); - int startZ = Location.locToBlock(player.getMovement().getTo().getLoc().z - 1 - dh); - int endZ = Location.locToBlock(player.getMovement().getTo().getLoc().z + 1 + dh); + int startX = Location.locToBlock(player.getMovement().getTo().getLoc().getX() - 1 - dh); + int endX = Location.locToBlock(player.getMovement().getTo().getLoc().getX() + 1 + dh); + int startY = Location.locToBlock(player.getMovement().getTo().getLoc().getY() - 1 - dy); + int endY = Location.locToBlock(player.getMovement().getTo().getLoc().getY() + 2.82 + dy); + int startZ = Location.locToBlock(player.getMovement().getTo().getLoc().getZ() - 1 - dh); + int endZ = Location.locToBlock(player.getMovement().getTo().getLoc().getZ() + 1 + dh); SimpleCollisionBox waterBox = player.getMovement().getTo().getBox().copy().expand(0, -.38, 0); diff --git a/Anticheat/src/main/java/dev/brighten/ac/data/obj/CMove.java b/Anticheat/src/main/java/dev/brighten/ac/data/obj/CMove.java index e98ef7f..086d881 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/data/obj/CMove.java +++ b/Anticheat/src/main/java/dev/brighten/ac/data/obj/CMove.java @@ -21,22 +21,22 @@ public class CMove { } public double getX() { - return loc.x; + return loc.getX(); } public double getY() { - return loc.y; + return loc.getY(); } public double getZ() { - return loc.z; + return loc.getZ(); } public float getYaw() { - return loc.yaw; + return loc.getYaw(); } public float getPitch() { - return loc.pitch; + return loc.getPitch(); } } diff --git a/Anticheat/src/main/java/dev/brighten/ac/handler/EntityLocationHandler.java b/Anticheat/src/main/java/dev/brighten/ac/handler/EntityLocationHandler.java index 6babdcf..d90aea0 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/handler/EntityLocationHandler.java +++ b/Anticheat/src/main/java/dev/brighten/ac/handler/EntityLocationHandler.java @@ -281,7 +281,7 @@ public class EntityLocationHandler { } KLocation eyeLoc = data.getMovement().getTo().getLoc().clone() - .add(0, 0.6, 0); + .add(0, data.getEyeHeight() / 2.5, 0); RayCollision collision = new RayCollision(eyeLoc.toVector(), eyeLoc.getDirection()); diff --git a/Anticheat/src/main/java/dev/brighten/ac/handler/MovementHandler.java b/Anticheat/src/main/java/dev/brighten/ac/handler/MovementHandler.java index af02d31..60cfd4c 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/handler/MovementHandler.java +++ b/Anticheat/src/main/java/dev/brighten/ac/handler/MovementHandler.java @@ -90,11 +90,11 @@ public class MovementHandler { // Initializing player location to.setWorld(bplayer.getWorld()); - to.getLoc().x = bplayer.getLocation().getX(); - to.getLoc().y = bplayer.getLocation().getY(); - to.getLoc().z = bplayer.getLocation().getZ(); - to.getLoc().yaw = bplayer.getLocation().getYaw(); - to.getLoc().pitch = bplayer.getLocation().getPitch(); + to.getLoc().setX(bplayer.getLocation().getX()); + to.getLoc().setY(bplayer.getLocation().getY()); + to.getLoc().setZ(bplayer.getLocation().getZ()); + to.getLoc().setYaw(bplayer.getLocation().getYaw()); + to.getLoc().setPitch(bplayer.getLocation().getPitch()); to.setBox(new SimpleCollisionBox(to.getLoc(), 0.6, 1.8)); to.setOnGround(bplayer.isOnGround()); @@ -143,7 +143,8 @@ public class MovementHandler { for (KLocation posLoc : posLocs) { // Resetting to prevent lag issues. - IterationResult result = player.EMULATOR.runTeleportIteration(new Vector(posLoc.x, posLoc.y, posLoc.z)); + IterationResult result = player.EMULATOR + .runTeleportIteration(new Vector(posLoc.getX(), posLoc.getY(), posLoc.getZ())); if (minimum == null || minimum.getOffset() > result.getOffset()) { minimum = result; @@ -181,8 +182,8 @@ public class MovementHandler { .fastMathType(fastMath) .sneaking(player.getInfo().isSneaking()) .ground(from.isOnGround()) - .to(new Vector(to.x, to.y, to.z)) - .yaw(to.yaw) + .to(new Vector(to.getX(), to.getY(), to.getZ())) + .yaw(to.getYaw()) .lastReportedBoundingBox(from.getBox().toNeo()) .effectSpeed(EFFECTS[0]) .effectSlow(EFFECTS[1]) @@ -238,7 +239,6 @@ public class MovementHandler { if(total < 9E-4) { player.getInfo().lastCanceledFlying.reset(); - player.getBukkitPlayer().sendMessage("003"); minimum.getTags().add("003"); } @@ -380,8 +380,8 @@ public class MovementHandler { val origin = this.to.getLoc().clone(); - origin.y += player.getInfo().isSneaking() - ? (player.getPlayerVersion().isBelow(ProtocolVersion.V1_14) ? 1.54 : 1.27f) : 1.62; + origin.add(0, player.getInfo().isSneaking() + ? (player.getPlayerVersion().isBelow(ProtocolVersion.V1_14) ? 1.54 : 1.27f) : 1.62, 0); RayCollision collision = new RayCollision(origin.toVector(), MathUtils.getDirection(origin)); @@ -558,15 +558,21 @@ it if (packet.isMoved() || packet.isLooked()) { KLocation origin = to.getLoc().clone().add(0, 1.7, 0); - RayCollision coll = new RayCollision(origin.toVector(), origin.getDirection().multiply(-1)); + final double MULTIPLIER = Math.max(-0.5, Math.min(-1, -1 / (Math.abs(deltaYaw) * 0.25))); + RayCollision coll = new RayCollision(origin.toVector(), origin.getDirection() + .multiply(MULTIPLIER).setY(0)); - Location loc1 = coll.collisionPoint(2.2).toLocation(player.getBukkitPlayer().getWorld()); + Location loc1 = coll.collisionPoint(1.5).toLocation(player.getBukkitPlayer().getWorld()); if (player.getInfo().botAttack.isNotPassed(7)) { - loc1.setY(Math.max(origin.y + 1.2, loc1.getY())); - } else loc1.setY(Math.max(origin.y + 0.3, loc1.getY())); - - player.getMob().teleport(loc1.getX(), loc1.getY(), loc1.getZ(), loc1.getYaw(), loc1.getPitch()); + loc1.setY(Math.max(origin.getY() + 2, loc1.getY())); + player.getMob().teleport(loc1.getX(), loc1.getY(), loc1.getZ(), loc1.getYaw(), loc1.getPitch()); + } else { + loc1.setY(Math.max(origin.getY() + 0.6, loc1.getY())); + if(Math.random() > 0.2) + RunUtils.taskLaterAsync(() -> player.getMob() + .teleport(loc1.getX(), loc1.getY(), loc1.getZ(), loc1.getYaw(), loc1.getPitch()), 5); + } } } @@ -725,27 +731,27 @@ it public void addPosition(WPacketPlayOutPosition packet) { int i = 0; - KLocation loc = new KLocation(packet.getX(), packet.getY(), packet.getZ(), + final KLocation loc = new KLocation(packet.getX(), packet.getY(), packet.getZ(), packet.getYaw(), packet.getPitch()); if (packet.getFlags().contains(WPacketPlayOutPosition.EnumPlayerTeleportFlags.X)) { - loc.x += player.getMovement().getTo().getLoc().x; + loc.add(player.getMovement().getTo().getLoc().getX(), 0 ,0); } if (packet.getFlags().contains(WPacketPlayOutPosition.EnumPlayerTeleportFlags.Y)) { - loc.y += player.getMovement().getTo().getLoc().y; + loc.add(0, player.getMovement().getTo().getLoc().getY() ,0); } if (packet.getFlags().contains(WPacketPlayOutPosition.EnumPlayerTeleportFlags.Z)) { - loc.z += player.getMovement().getTo().getLoc().z; + loc.add(0, 0, player.getMovement().getTo().getLoc().getZ()); } if (packet.getFlags().contains(WPacketPlayOutPosition.EnumPlayerTeleportFlags.X_ROT)) { - loc.pitch += player.getMovement().getTo().getLoc().pitch; + loc.setPitch(loc.getPitch() + player.getMovement().getTo().getLoc().getPitch()); } if (packet.getFlags().contains(WPacketPlayOutPosition.EnumPlayerTeleportFlags.Y_ROT)) { - loc.yaw += player.getMovement().getTo().getLoc().yaw; + loc.setYaw(loc.getYaw() + player.getMovement().getTo().getLoc().getYaw()); } teleportsToConfirm++; - loc.timeStamp = System.currentTimeMillis(); + loc.setTimeStamp(System.currentTimeMillis()); player.runKeepaliveAction(ka -> { teleportsToConfirm--; @@ -765,11 +771,9 @@ it * @param location Location */ public void moveTo(Location location) { - to.getLoc().x = from.getLoc().x = location.getX(); - to.getLoc().y = from.getLoc().y = location.getY(); - to.getLoc().z = from.getLoc().z = location.getZ(); - to.getLoc().yaw = from.getLoc().yaw = location.getYaw(); - to.getLoc().pitch = from.getLoc().pitch = location.getPitch(); + KLocation newLoc = new KLocation(location); + to.getLoc().setLocation(newLoc); + to.getLoc().setLocation(newLoc); deltaX = deltaY = deltaZ = deltaXZ = lDeltaX = lDeltaY = lDeltaZ @@ -818,13 +822,13 @@ it private void setTo(WPacketPlayInFlying packet) { to.setWorld(player.getBukkitPlayer().getWorld()); if (packet.isMoved()) { - to.getLoc().x = packet.getX(); - to.getLoc().y = packet.getY(); - to.getLoc().z = packet.getZ(); + to.getLoc().setX(packet.getX()); + to.getLoc().setY(packet.getY()); + to.getLoc().setZ(packet.getZ()); } if (packet.isLooked()) { - to.getLoc().yaw = packet.getYaw(); - to.getLoc().pitch = packet.getPitch(); + to.getLoc().setYaw(packet.getYaw()); + to.getLoc().setPitch(packet.getPitch()); } to.setBox(new SimpleCollisionBox(to.getLoc(), 0.6, 1.8)); to.setOnGround(packet.isOnGround()); @@ -852,12 +856,12 @@ it lDeltaYaw = deltaYaw; lDeltaPitch = deltaPitch; - deltaX = to.getLoc().x - from.getLoc().x; - deltaY = to.getLoc().y - from.getLoc().y; - deltaZ = to.getLoc().z - from.getLoc().z; + deltaX = to.getLoc().getX() - from.getLoc().getX(); + deltaY = to.getLoc().getY() - from.getLoc().getY(); + deltaZ = to.getLoc().getZ() - from.getLoc().getZ(); deltaXZ = Math.hypot(deltaX, deltaZ); // Calculating here to cache since hypot() can be heavy. - deltaYaw = to.getLoc().yaw - from.getLoc().yaw; - deltaPitch = to.getLoc().pitch - from.getLoc().pitch; + deltaYaw = to.getLoc().getYaw() - from.getLoc().getYaw(); + deltaPitch = to.getLoc().getPitch() - from.getLoc().getPitch(); player.getInfo().setClientGroundTicks(packet.isOnGround() ? player.getInfo().getClientGroundTicks() + 1 : 0); player.getInfo().setClientAirTicks(!packet.isOnGround() ? player.getInfo().getClientAirTicks() + 1 : 0); diff --git a/Anticheat/src/main/java/dev/brighten/ac/packet/wrapper/impl/Processor_18.java b/Anticheat/src/main/java/dev/brighten/ac/packet/wrapper/impl/Processor_18.java index 32dd299..db0fc34 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/packet/wrapper/impl/Processor_18.java +++ b/Anticheat/src/main/java/dev/brighten/ac/packet/wrapper/impl/Processor_18.java @@ -34,6 +34,7 @@ import org.bukkit.util.Vector; import java.io.IOException; import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; import java.util.stream.Collectors; @@ -191,7 +192,8 @@ public class Processor_18 implements PacketConverter { .pitch(serializer.readFloat()) .flags(PacketPlayOutPosition.EnumPlayerTeleportFlags.a(serializer.readUnsignedByte()).stream() .map(f -> WPacketPlayOutPosition.EnumPlayerTeleportFlags.valueOf(f.name())) - .collect(Collectors.toSet())) + .collect(Collectors.toCollection(() -> EnumSet + .allOf(WPacketPlayOutPosition.EnumPlayerTeleportFlags.class)))) .build(); } diff --git a/Anticheat/src/main/java/dev/brighten/ac/utils/KLocation.java b/Anticheat/src/main/java/dev/brighten/ac/utils/KLocation.java deleted file mode 100644 index c6cd753..0000000 --- a/Anticheat/src/main/java/dev/brighten/ac/utils/KLocation.java +++ /dev/null @@ -1,132 +0,0 @@ -package dev.brighten.ac.utils; - -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.util.Vector; - -import java.util.Objects; - -public class KLocation implements Cloneable { - public double x, y, z; - public float yaw, pitch; - public long timeStamp; - - public KLocation(double x, double y, double z, float yaw, float pitch, long timeStamp) { - this.x = x; - this.y = y; - this.z = z; - this.yaw = yaw; - this.pitch = pitch; - this.timeStamp = timeStamp; - } - - public KLocation(double x, double y, double z, float yaw, float pitch) { - this.x = x; - this.y = y; - this.z = z; - this.yaw = yaw; - this.pitch = pitch; - this.timeStamp = System.currentTimeMillis(); - } - - public KLocation(double x, double y, double z) { - this.x = x; - this.y = y; - this.z = z; - - this.timeStamp = System.currentTimeMillis(); - } - - public KLocation(Vector vector) { - this.x = vector.getX(); - this.y = vector.getY(); - this.z = vector.getZ(); - this.timeStamp = System.currentTimeMillis(); - } - - public KLocation(Location location) { - this.x = location.getX(); - this.y = location.getY(); - this.z = location.getZ(); - this.yaw = location.getYaw(); - this.pitch = location.getPitch(); - this.timeStamp = System.currentTimeMillis(); - } - - public Vector toVector() { - return new Vector(x, y, z); - } - - public Location toLocation(World world) { - return new Location(world, x, y, z, yaw, pitch); - } - - @SuppressWarnings("MethodDoesntCallSuperMethod") - @Override - public KLocation clone() { - return new KLocation(x, y, z, yaw, pitch, timeStamp); - } - - public double distanceSquared(KLocation other) { - double dx = (x - other.x), dy = (y - other.y), dz = (z - other.z); - return dx * dx + dy * dy + dz * dz; - } - - public double distance(KLocation other) { - return Math.sqrt(distanceSquared(other)); - } - - public KLocation add(double x, double y, double z) { - this.x+= x; - this.y+= y; - this.z+= z; - return this; - } - - public KLocation subtract(double x, double y, double z) { - this.x-= x; - this.y-= y; - this.z-= z; - return this; - } - - public KLocation setLocation(KLocation loc) { - this.x = loc.x; - this.y = loc.y; - this.z = loc.z; - this.yaw = loc.yaw; - this.pitch = loc.pitch; - this.timeStamp = loc.timeStamp; - - return this; - } - - public Vector getDirection() { - return MathUtils.getDirection(this); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - KLocation kLocation = (KLocation) o; - return Double.compare(kLocation.x, x) == 0 && Double.compare(kLocation.y, y) == 0 && Double.compare(kLocation.z, z) == 0 && Float.compare(kLocation.yaw, yaw) == 0 && Float.compare(kLocation.pitch, pitch) == 0 && timeStamp == kLocation.timeStamp; - } - - @Override - public int hashCode() { - return Objects.hash(x, y, z, yaw, pitch, timeStamp); - } - - @Override - public String toString() { - return "KLocation{" + - "x=" + x + - ", y=" + y + - ", z=" + z + - ", yaw=" + yaw + - ", pitch=" + pitch + - ", timeStamp=" + timeStamp + - '}'; - } -} diff --git a/Anticheat/src/main/java/dev/brighten/ac/utils/MovementUtils.java b/Anticheat/src/main/java/dev/brighten/ac/utils/MovementUtils.java index ece9f71..7802947 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/utils/MovementUtils.java +++ b/Anticheat/src/main/java/dev/brighten/ac/utils/MovementUtils.java @@ -17,6 +17,7 @@ import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Optional; public class MovementUtils { @@ -32,17 +33,18 @@ public class MovementUtils { } public static boolean isSameLocation(KLocation one, KLocation two) { - return one.x == two.x && one.y == two.y && one.z == two.z; + return one.getX() == two.getX() && one.getY() == two.getY() && one.getZ() == two.getZ(); } public static boolean isOnLadder(APlayer data) { try { - int i = MathHelper.floor_double(data.getMovement().getTo().getLoc().x); + int i = MathHelper.floor_double(data.getMovement().getTo().getLoc().getX()); int j = MathHelper.floor_double(data.getMovement().getTo().getBox().minY); - int k = MathHelper.floor_double(data.getMovement().getTo().getLoc().z); - Block block = BlockUtils.getBlock(new Location(data.getBukkitPlayer().getWorld(), i, j, k)); + int k = MathHelper.floor_double(data.getMovement().getTo().getLoc().getZ()); + Optional block = BlockUtils.getBlockAsync(new Location(data.getBukkitPlayer().getWorld(), i, j, k)); + + return block.filter(value -> Materials.checkFlag(value.getType(), Materials.LADDER)).isPresent(); - return Materials.checkFlag(block.getType(), Materials.LADDER); } catch(NullPointerException e) { return false; } @@ -69,24 +71,18 @@ public class MovementUtils { } public static double getHorizontalDistance(KLocation one, KLocation two) { - return MathUtils.hypot(one.x - two.x, one.z - two.z); + return MathUtils.hypot(one.getX() - two.getX(), one.getZ() - two.getZ()); } public static float getFriction(Block block) { XMaterial matched = BlockUtils.getXMaterial(block.getType()); if(matched == null) return 0.6f; - switch(matched) { - case SLIME_BLOCK: - return 0.8f; - case ICE: - case BLUE_ICE: - case FROSTED_ICE: - case PACKED_ICE: - return 0.98f; - default: - return 0.6f; - } + return switch (matched) { + case SLIME_BLOCK -> 0.8f; + case ICE, BLUE_ICE, FROSTED_ICE, PACKED_ICE -> 0.98f; + default -> 0.6f; + }; } public static Location findGroundLocation(APlayer player, int lowestBelow) { @@ -102,15 +98,14 @@ public class MovementUtils { val block = BlockUtils .getBlockAsync(new Location(player.getBukkitPlayer().getWorld(), x, y, z)); - if(!block.isPresent()) break; //No point in continuing since the one below will still be not present. + if(block.isEmpty()) break; //No point in continuing since the one below will still be not present. if(Materials.checkFlag(block.get().getType(), Materials.SOLID) && Materials.checkFlag(block.get().getType(), Materials.LIQUID)) { CollisionBox box = BlockData.getData(block.get().getType()) .getBox(block.get(), ProtocolVersion.getGameVersion()); - if(box instanceof SimpleCollisionBox) { - SimpleCollisionBox sbox = (SimpleCollisionBox) box; + if(box instanceof SimpleCollisionBox sbox) { return new Location(block.get().getWorld(), x, sbox.maxY, z); } else { @@ -139,15 +134,14 @@ public class MovementUtils { val block = BlockUtils .getBlockAsync(new Location(toStart.getWorld(), x, y, z)); - if(!block.isPresent()) break; //No point in continuing since the one below will still be not present. + if(block.isEmpty()) break; //No point in continuing since the one below will still be not present. if(Materials.checkFlag(block.get().getType(), Materials.SOLID) || Materials.checkFlag(block.get().getType(), Materials.LIQUID)) { CollisionBox box = BlockData.getData(block.get().getType()) .getBox(block.get(), ProtocolVersion.getGameVersion()); - if(box instanceof SimpleCollisionBox) { - SimpleCollisionBox sbox = (SimpleCollisionBox) box; + if(box instanceof SimpleCollisionBox sbox) { return new Location(block.get().getWorld(), x, sbox.maxY, z); } else { diff --git a/Anticheat/src/main/java/dev/brighten/ac/utils/PastLocation.java b/Anticheat/src/main/java/dev/brighten/ac/utils/PastLocation.java index 02041eb..5adb2b1 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/utils/PastLocation.java +++ b/Anticheat/src/main/java/dev/brighten/ac/utils/PastLocation.java @@ -6,13 +6,14 @@ import org.bukkit.Location; import java.util.*; import java.util.stream.Collectors; +@SuppressWarnings("unused") public class PastLocation { public final LinkedList previousLocations = new LinkedList<>(); public KLocation getPreviousLocation(int time) { synchronized (previousLocations) { return (this.previousLocations.stream() - .min(Comparator.comparing(loc -> Math.abs(time - loc.timeStamp))) + .min(Comparator.comparing(loc -> Math.abs(time - loc.getTimeStamp()))) .orElse(this.previousLocations.getFirst())); } } @@ -24,7 +25,7 @@ public class PastLocation { List locs = new ArrayList<>(); for (KLocation previousLocation : previousLocations) { - if (Math.abs(tick - previousLocation.timeStamp) <= delta) { + if (Math.abs(tick - previousLocation.getTimeStamp()) <= delta) { locs.add(previousLocation.clone()); } } @@ -51,8 +52,8 @@ public class PastLocation { public List getEstimatedLocation(long time, long ping) { synchronized (previousLocations) { return this.previousLocations.stream() - .filter(loc -> time - loc.timeStamp > 0 - && time - loc.timeStamp <= ping + (ping < 50 ? 100 : 50)) + .filter(loc -> time - loc.getTimeStamp() > 0 + && time - loc.getTimeStamp() <= ping + (ping < 50 ? 100 : 50)) .collect(Collectors.toList()); } } @@ -62,7 +63,7 @@ public class PastLocation { long stamp = System.currentTimeMillis(); return this.previousLocations.stream() - .filter(loc -> stamp - loc.timeStamp < delta) + .filter(loc -> stamp - loc.getTimeStamp() < delta) .collect(Collectors.toList()); } } @@ -73,7 +74,7 @@ public class PastLocation { previousLocations.removeFirst(); KLocation loc = new KLocation(location); - loc.timeStamp = Anticheat.INSTANCE.getKeepaliveProcessor().tick; + loc.setTimeStamp(Anticheat.INSTANCE.getKeepaliveProcessor().tick); previousLocations.add(loc); } } @@ -84,7 +85,7 @@ public class PastLocation { public void addLocation(KLocation location) { KLocation loc = location.clone(); - loc.timeStamp = Anticheat.INSTANCE.getKeepaliveProcessor().tick; + loc.setTimeStamp(Anticheat.INSTANCE.getKeepaliveProcessor().tick); synchronized (previousLocations) { if (previousLocations.size() >= 20) previousLocations.removeFirst(); diff --git a/Anticheat/src/main/java/dev/brighten/ac/utils/math/MinecraftConstants.java b/Anticheat/src/main/java/dev/brighten/ac/utils/math/MinecraftConstants.java new file mode 100644 index 0000000..f24c435 --- /dev/null +++ b/Anticheat/src/main/java/dev/brighten/ac/utils/math/MinecraftConstants.java @@ -0,0 +1,6 @@ +package dev.brighten.ac.utils.math; + +public interface MinecraftConstants { + + double BLOCK_DIVISOR = 1 / 64.; +} diff --git a/Anticheat/src/main/java/dev/brighten/ac/utils/world/EntityData.java b/Anticheat/src/main/java/dev/brighten/ac/utils/world/EntityData.java index 1b07c3a..903365b 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/utils/world/EntityData.java +++ b/Anticheat/src/main/java/dev/brighten/ac/utils/world/EntityData.java @@ -41,7 +41,7 @@ public class EntityData { } public static CollisionBox getEntityBox(KLocation location, Entity entity) { - return bounds(entity).offset(location.x, location.y, location.z); + return bounds(entity).offset(location.getX(), location.getY(), location.getZ()); } static { diff --git a/Anticheat/src/main/java/dev/brighten/ac/utils/world/types/SimpleCollisionBox.java b/Anticheat/src/main/java/dev/brighten/ac/utils/world/types/SimpleCollisionBox.java index 9c95ebf..6c2e623 100644 --- a/Anticheat/src/main/java/dev/brighten/ac/utils/world/types/SimpleCollisionBox.java +++ b/Anticheat/src/main/java/dev/brighten/ac/utils/world/types/SimpleCollisionBox.java @@ -61,7 +61,7 @@ public class SimpleCollisionBox implements CollisionBox { } public SimpleCollisionBox(KLocation loc, double width, double height) { - this(loc.x, loc.y, loc.z, loc.x, loc.y, loc.z); + this(loc.getX(), loc.getY(), loc.getZ(), loc.getX(), loc.getY(), loc.getZ()); expand(width / 2, 0, width / 2); maxY += height; diff --git a/Compat/src/main/java/dev/brighten/ac/utils/KLocation.java b/Compat/src/main/java/dev/brighten/ac/utils/KLocation.java index c6cd753..2ab1046 100644 --- a/Compat/src/main/java/dev/brighten/ac/utils/KLocation.java +++ b/Compat/src/main/java/dev/brighten/ac/utils/KLocation.java @@ -1,15 +1,17 @@ package dev.brighten.ac.utils; +import lombok.Data; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.util.Vector; import java.util.Objects; +@Data public class KLocation implements Cloneable { - public double x, y, z; - public float yaw, pitch; - public long timeStamp; + private double x, y, z; + private float yaw, pitch; + private long timeStamp; public KLocation(double x, double y, double z, float yaw, float pitch, long timeStamp) { this.x = x; diff --git a/Compat/src/main/java/dev/brighten/ac/utils/MathUtils.java b/Compat/src/main/java/dev/brighten/ac/utils/MathUtils.java index b5771f6..13782c3 100644 --- a/Compat/src/main/java/dev/brighten/ac/utils/MathUtils.java +++ b/Compat/src/main/java/dev/brighten/ac/utils/MathUtils.java @@ -90,13 +90,13 @@ public class MathUtils { } public static double getDistanceWithoutRoot(KLocation one, KLocation two) { - double deltaX = one.x - two.x, deltaY = one.y - two.y, deltaZ = one.z - two.z; + double deltaX = one.getX() - two.getX(), deltaY = one.getY() - two.getY(), deltaZ = one.getZ() - two.getZ(); return (deltaX * deltaX) + (deltaY * deltaY) + (deltaZ * deltaZ); } public static boolean isSameLocation(KLocation one, KLocation two) { - return one.x == two.x && one.y == two.y && one.z == two.z; + return one.getX() == two.getX() && one.getY() == two.getY() && one.getZ() == two.getZ(); } @@ -509,8 +509,8 @@ public class MathUtils { /* Stolen from Bukkit */ public static Vector getDirection(KLocation loc) { Vector vector = new Vector(); - double rotX = loc.yaw; - double rotY = loc.pitch; + double rotX = loc.getYaw(); + double rotY = loc.getPitch(); vector.setY(-Math.sin(Math.toRadians(rotY))); double xz = Math.cos(Math.toRadians(rotY)); vector.setX(-xz * Math.sin(Math.toRadians(rotX))); @@ -892,9 +892,9 @@ public class MathUtils { } public static float[] getRotation(KLocation one, KLocation two) { - double diffX = two.x - one.x; - double diffZ = two.z - one.z; - double diffY = two.y - one.y; + double diffX = two.getX() - one.getX(); + double diffZ = two.getZ() - one.getZ(); + double diffY = two.getY() - one.getY(); double dist = Math.sqrt(diffX * diffX + diffZ * diffZ); float yaw = (float) (FastTrig.fast_atan2(diffZ, diffX) * 180.0 / 3.141592653589793) - 90.0f; float pitch = (float) (-FastTrig.fast_atan2(diffY, dist) * 180.0 / 3.141592653589793); @@ -926,5 +926,13 @@ public class MathUtils { double pitchOffset = Math.abs(pitch - one.getPitch()); return new double[]{yawOffset, pitchOffset}; } + + public static double[] getOffsetFromLocation(KLocation one, KLocation two) { + double yaw = MathUtils.getRotation(one, two)[0]; + double pitch = MathUtils.getRotation(one, two)[1]; + double yawOffset = Math.abs(yaw - MathUtils.yawTo180F(one.getYaw())); + double pitchOffset = Math.abs(pitch - one.getPitch()); + return new double[]{yawOffset, pitchOffset}; + } } diff --git a/Compat/src/main/java/dev/brighten/ac/utils/objects/evicting/EvictingSet.java b/Compat/src/main/java/dev/brighten/ac/utils/objects/evicting/EvictingSet.java new file mode 100644 index 0000000..d74a818 --- /dev/null +++ b/Compat/src/main/java/dev/brighten/ac/utils/objects/evicting/EvictingSet.java @@ -0,0 +1,69 @@ +package dev.brighten.ac.utils.objects.evicting; + +import lombok.Getter; + +import java.util.*; + +public class EvictingSet extends AbstractSet implements Set, Cloneable { + + @Getter + private final int fixedSize; + private transient EvictingMap map; + + public EvictingSet(int fixedSize) { + this.fixedSize = fixedSize; + this.map = new EvictingMap<>(fixedSize); + } + private static final Object PRESENT = new Object(); + + + @Override + public int size() { + return map.size(); + } + + @Override + public boolean isEmpty() { + return map.isEmpty(); + } + + @Override + public boolean contains(Object o) { + return map.containsKey(o); + } + + @Override + public Iterator iterator() { + return map.keySet().iterator(); + } + + @Override + public Object[] toArray() { + return map.keySet().toArray(); + } + + @Override + public T[] toArray(T[] a) { + return map.keySet().toArray(a); + } + + @Override + public boolean add(E k) { + return map.put(k, PRESENT) == null; + } + + @Override + public boolean remove(Object o) { + return map.remove(o) == PRESENT; + } + + public Object clone() { + try { + EvictingSet newSet = (EvictingSet) super.clone(); + newSet.map = (EvictingMap) map.clone(); + return newSet; + } catch (CloneNotSupportedException e) { + throw new InternalError(e); + } + } +}