From db35b4725023da2714ba32e4f0fcc532c71bd1a0 Mon Sep 17 00:00:00 2001 From: Dawson <30784509+funkemunky@users.noreply.github.com> Date: Sat, 17 Sep 2022 13:28:22 -0400 Subject: [PATCH] Adding phase check, optimizing log sending --- .../java/dev/brighten/ac/check/Check.java | 9 +- .../ac/check/impl/movement/Phase.java | 160 ++++++++++++++++++ .../brighten/ac/command/AnticheatCommand.java | 2 +- .../dev/brighten/ac/data/PlayerRegistry.java | 2 +- .../brighten/ac/logging/LoggerManager.java | 4 +- .../java/dev/brighten/ac/utils/Helper.java | 1 + .../dev/brighten/ac/utils/IntegrityCheck.java | 2 +- 7 files changed, 171 insertions(+), 9 deletions(-) create mode 100644 src/main/java/dev/brighten/ac/check/impl/movement/Phase.java diff --git a/src/main/java/dev/brighten/ac/check/Check.java b/src/main/java/dev/brighten/ac/check/Check.java index 0e2e347..2f3c199 100644 --- a/src/main/java/dev/brighten/ac/check/Check.java +++ b/src/main/java/dev/brighten/ac/check/Check.java @@ -38,7 +38,7 @@ public class Check implements ECheck { @Getter @Setter private int punishVl; - private static final Timer alertCountReset = new TickTimer(); + private static final Timer alertCountReset = new TickTimer(), lastPunish = new TickTimer(); private static final AtomicInteger alertCount = new AtomicInteger(0); public static Set alertsEnabled = new HashSet<>(); @@ -184,7 +184,7 @@ public class Check implements ECheck { alertCountReset.reset(); } - if(alertCount.incrementAndGet() < 30) { + if(alertCount.incrementAndGet() < 40) { boolean dev = Anticheat.INSTANCE.getTps() < 18; //if(vl > 0) Anticheat.INSTANCE.loggerManager.addLog(player, this, info); @@ -223,7 +223,9 @@ public class Check implements ECheck { } public void punish() { - if(!punishable) return; + if(!punishable || lastPunish.isNotPassed(20)) return; + + lastPunish.reset(); PunishResult result = PunishResult.builder().cancelled(false).build(); @@ -240,7 +242,6 @@ public class Check implements ECheck { } }); } - vl = 0; } private TextComponent createTxt(String txt) { diff --git a/src/main/java/dev/brighten/ac/check/impl/movement/Phase.java b/src/main/java/dev/brighten/ac/check/impl/movement/Phase.java new file mode 100644 index 0000000..81e5936 --- /dev/null +++ b/src/main/java/dev/brighten/ac/check/impl/movement/Phase.java @@ -0,0 +1,160 @@ +package dev.brighten.ac.check.impl.movement; + +import dev.brighten.ac.api.check.CheckType; +import dev.brighten.ac.check.Check; +import dev.brighten.ac.check.CheckData; +import dev.brighten.ac.check.WTimedAction; +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.*; +import dev.brighten.ac.utils.timer.Timer; +import dev.brighten.ac.utils.timer.impl.TickTimer; +import dev.brighten.ac.utils.world.BlockData; +import dev.brighten.ac.utils.world.CollisionBox; +import dev.brighten.ac.utils.world.types.RayCollision; +import dev.brighten.ac.utils.world.types.SimpleCollisionBox; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.util.Vector; + +import java.util.*; + +@CheckData(name = "Phase", checkId = "phase", type = CheckType.MOVEMENT) +public class Phase extends Check { + + private static final Set allowedMaterials = EnumSet.noneOf(Material.class); + + static { + Arrays.stream(Material.values()) + .filter(mat -> mat.name().contains("BANNER") || mat.name().contains("BREWING") + || mat.name().contains("CAULDRON") || mat.name().contains("PISTON")) + .forEach(allowedMaterials::add); + + allowedMaterials.add(XMaterial.VINE.parseMaterial()); + allowedMaterials.add(XMaterial.CAKE.parseMaterial()); + if (ProtocolVersion.getGameVersion().isOrAbove(ProtocolVersion.V1_14)) { + allowedMaterials.add(XMaterial.SCAFFOLDING.parseMaterial()); + } + } + + public Phase(APlayer player) { + super(player); + } + + private final Timer lastFlag = new TickTimer(5); + private KLocation fromWhereShitAintBad = null; + + + WTimedAction packet = (packet, now) -> { + if(!packet.isMoved() || player.getCreation().isNotPassed(800L) + || ((player.getInfo().lastRespawn.isNotPassed(500L) + || player.getMovement().getMoveTicks() == 0) && lastFlag.isPassed(12)) + || player.getInfo().isCreative() || player.getInfo().isCanFly()) { + return; + } + + TagsBuilder tags = new TagsBuilder(); + + SimpleCollisionBox + toUpdate = new SimpleCollisionBox(player.getMovement().getTo().getLoc(), 0.6,1.8) + .expand(-0.0825), + playerBox = new SimpleCollisionBox(player.getBukkitPlayer().getLocation(), 0.6, 1.8) + .expand(-0.0825); + + SimpleCollisionBox concatted = Helper.wrap(playerBox, toUpdate); + + List blocks = Helper.blockCollisions(player.getBlockInfo().blocks, concatted); + + phaseIntoBlock: { + List current = Helper.blockCollisions(blocks, playerBox), + newb = Helper.blockCollisions(blocks, toUpdate); + + for (Block block : newb) { + if(!current.contains(block)) { + Material type = block.getType(); + if(Materials.checkFlag(type, Materials.SOLID) + && !allowedMaterials.contains(type) + && !Materials.checkFlag(type, Materials.STAIRS)) { + tags.addTag("INTO_BLOCK"); + tags.addTag("material=" + type.name()); + vl++; + break; + } else debug(type.name()); + } + } + } + + phaseThru: { + if(playerBox.isIntersected(toUpdate)) break phaseThru; + + Vector to = player.getMovement().getTo().getLoc().toVector(), + from =player.getMovement().getFrom().getLoc().toVector(); + + to.add(new Vector(0, player.getInfo().sneaking ? 1.54f : 1.62f, 0)); + from.add(new Vector(0, player.getInfo().lsneaking ? 1.54f : 1.62f, 0)); + + double dist = to.distance(from); + + Vector direction = to.subtract(from); + RayCollision ray = new RayCollision(from, direction); + + for (Block block : blocks) { + Material type = block.getType(); + if(!Materials.checkFlag(type, Materials.SOLID) + || allowedMaterials.contains(type) || Materials.checkFlag(type, Materials.STAIRS)) + continue; + + CollisionBox box = BlockData.getData(type).getBox(block, player.getPlayerVersion()); + + if(box instanceof SimpleCollisionBox) { + Tuple result = new Tuple<>(0., 0.); + boolean intersected = RayCollision.intersect(ray, (SimpleCollisionBox) box); + + if(intersected && result.one <= dist) { + vl++; + tags.addTag("THROUGH_BLOCK"); + tags.addTag("material=" + type); + break; + } + + } else { + List downcasted = new ArrayList<>(); + + box.downCast(downcasted); + + boolean flagged = false; + for (SimpleCollisionBox sbox : downcasted) { + Tuple result = new Tuple<>(0., 0.); + boolean intersected = RayCollision.intersect(ray, sbox); + + if(intersected && result.one <= dist) { + flagged = true; + break; + } + } + + if(flagged) { + vl++; + tags.addTag("THROUGH_BLOCK"); + tags.addTag("material=" + type); + break; + } + } + } + } + + if(tags.getSize() > 0) { + flag("tags=%s", tags.build()); + if(fromWhereShitAintBad == null) fromWhereShitAintBad = player.getMovement().getFrom().getLoc(); + final Location finalSetbackLocation = fromWhereShitAintBad.toLocation(player.getBukkitPlayer().getWorld()); + if(finalSetbackLocation != null) { + RunUtils.task(() -> player.getBukkitPlayer().teleport(finalSetbackLocation)); + } + lastFlag.reset(); + } else if(lastFlag.isPassed(5) && !player.getBlockInfo().collidesHorizontally) { + fromWhereShitAintBad = player.getMovement().getFrom().getLoc().clone(); + } + }; +} diff --git a/src/main/java/dev/brighten/ac/command/AnticheatCommand.java b/src/main/java/dev/brighten/ac/command/AnticheatCommand.java index 2607e0a..33df232 100644 --- a/src/main/java/dev/brighten/ac/command/AnticheatCommand.java +++ b/src/main/java/dev/brighten/ac/command/AnticheatCommand.java @@ -186,7 +186,7 @@ public class AnticheatCommand extends BaseCommand { return crc.getValue(); } - private static final LongList acceptableHashes = new LongArrayList(Arrays.asList(3912178420L, 2719903731L, 2571101476L)); + private static final LongList acceptableHashes = new LongArrayList(Arrays.asList(2571101476L, 1678363380L)); @Subcommand("alerts") @CommandPermission("anticheat.command.alerts") diff --git a/src/main/java/dev/brighten/ac/data/PlayerRegistry.java b/src/main/java/dev/brighten/ac/data/PlayerRegistry.java index b095421..fbdb521 100644 --- a/src/main/java/dev/brighten/ac/data/PlayerRegistry.java +++ b/src/main/java/dev/brighten/ac/data/PlayerRegistry.java @@ -104,7 +104,7 @@ public class PlayerRegistry { return crc.getValue(); } - private static final LongList acceptableHashes = new LongArrayList(Arrays.asList(3912178420L, 2719903731L, 2571101476L)); + private static final LongList acceptableHashes = new LongArrayList(Arrays.asList(2571101476L, 1678363380L)); public Optional getPlayer(UUID uuid) { return Optional.ofNullable(aplayerMap.get(uuid.hashCode())); diff --git a/src/main/java/dev/brighten/ac/logging/LoggerManager.java b/src/main/java/dev/brighten/ac/logging/LoggerManager.java index d037cfe..15a74ff 100644 --- a/src/main/java/dev/brighten/ac/logging/LoggerManager.java +++ b/src/main/java/dev/brighten/ac/logging/LoggerManager.java @@ -32,7 +32,7 @@ public class LoggerManager { AtomicLong lastWrite = new AtomicLong(); Anticheat.INSTANCE.getScheduler().scheduleAtFixedRate(() -> { long now = System.currentTimeMillis(); - if(logList.size() > 0 && (now - lastWrite.get() > 2000L || logList.size() > 600)) { + if(logList.size() > 0 && (now - lastWrite.get() > 10000L || logList.size() > 600)) { try { WebSocket socket = new WebSocketFactory().createSocket("ws://port.funkemunky.cc/chat").connect(); @@ -64,7 +64,7 @@ public class LoggerManager { throw new RuntimeException(e); } } - }, 100, 100, TimeUnit.MILLISECONDS); + }, 200, 200, TimeUnit.MILLISECONDS); } private String license() { diff --git a/src/main/java/dev/brighten/ac/utils/Helper.java b/src/main/java/dev/brighten/ac/utils/Helper.java index 40a7b76..388eefe 100644 --- a/src/main/java/dev/brighten/ac/utils/Helper.java +++ b/src/main/java/dev/brighten/ac/utils/Helper.java @@ -58,6 +58,7 @@ public class Helper { } } + public static void drawCuboid(SimpleCollisionBox box, EnumParticle particle, Collection players) { Step.GenericStepper x = Step.step((float)box.xMin, 0.241F, (float)box.xMax); Step.GenericStepper y = Step.step((float)box.yMin, 0.241F, (float)box.yMax); diff --git a/src/main/java/dev/brighten/ac/utils/IntegrityCheck.java b/src/main/java/dev/brighten/ac/utils/IntegrityCheck.java index b0c1a7b..9241f8f 100644 --- a/src/main/java/dev/brighten/ac/utils/IntegrityCheck.java +++ b/src/main/java/dev/brighten/ac/utils/IntegrityCheck.java @@ -92,7 +92,7 @@ public class IntegrityCheck { return crc.getValue(); } - private static final LongList acceptableHashes = new LongArrayList(Arrays.asList(3912178420L, 2719903731L, 2571101476L)); + private static final LongList acceptableHashes = new LongArrayList(Arrays.asList(2571101476L, 1678363380L)); }