package cc.funkemunky.anticheat.impl.checks.combat; import cc.funkemunky.anticheat.api.checks.CancelType; import cc.funkemunky.anticheat.api.checks.Check; import cc.funkemunky.anticheat.api.checks.CheckInfo; import cc.funkemunky.anticheat.api.checks.CheckType; import cc.funkemunky.anticheat.api.utils.CustomLocation; import cc.funkemunky.anticheat.api.utils.Packets; import cc.funkemunky.api.tinyprotocol.api.Packet; import cc.funkemunky.api.utils.BoundingBox; import cc.funkemunky.api.utils.Init; import cc.funkemunky.api.utils.MiscUtils; import lombok.val; import org.bukkit.entity.LivingEntity; import org.bukkit.event.Event; import org.bukkit.util.Vector; import java.util.stream.Collectors; @CheckInfo(name = "Reach", type = CheckType.REACH, cancelType = CancelType.COMBAT, maxVL = 50) @Init @Packets(packets = {Packet.Client.POSITION_LOOK, Packet.Client.POSITION, Packet.Client.LOOK, Packet.Client.FLYING, Packet.Client.LEGACY_LOOK, Packet.Client.LEGACY_POSITION, Packet.Client.LEGACY_POSITION_LOOK}) public class Reach extends Check { private int vl; @Override public void onPacket(Object packet, String packetType, long timeStamp) { if(getData().getLastAttack().hasNotPassed(0) && getData().getTarget() != null && MiscUtils.entityDimensions.containsKey(getData().getTarget().getType())) { val move = getData().getMovementProcessor(); val pastLocation = getData().getEntityPastLocation().getEstimatedLocation(getData().getTransPing(), 135L + (getData().getPing() - getData().getLastPing())).stream().map(loc -> getHitBox(getData().getTarget(), loc)).collect(Collectors.toList()); val vecs = pastLocation.stream().map(BoundingBox::getMinimum).collect(Collectors.toList()); vecs.addAll( pastLocation.stream().map(BoundingBox::getMaximum).collect(Collectors.toList())); val distance = (float) vecs.stream().mapToDouble(vec -> vec.distance(move.getTo().toVector())).min().orElse(0); if(distance > 3.45) { if(vl++ > 10) { flag("distance=" + distance + " ping=" + getData().getTransPing(), true, true); } } else vl-= vl > 0 ? 1 : 0; } } @Override public void onBukkitEvent(Event event) { } private BoundingBox getHitBox(LivingEntity entity, CustomLocation loc) { val bounds = MiscUtils.entityDimensions.getOrDefault(entity.getType(), new Vector(1,1,1)); return new BoundingBox(loc.toVector(), loc.toVector()).grow((float) bounds.getX(), 0, (float) bounds.getZ()).add(0,0,0,0, (float) bounds.getY(), 0); } }