diff --git a/src/main/java/dev/brighten/ac/check/Check.java b/src/main/java/dev/brighten/ac/check/Check.java index f5137db..414f53b 100644 --- a/src/main/java/dev/brighten/ac/check/Check.java +++ b/src/main/java/dev/brighten/ac/check/Check.java @@ -2,10 +2,7 @@ package dev.brighten.ac.check; import dev.brighten.ac.Anticheat; import dev.brighten.ac.data.APlayer; -import dev.brighten.ac.utils.Color; -import dev.brighten.ac.utils.MathUtils; -import dev.brighten.ac.utils.MiscUtils; -import dev.brighten.ac.utils.Tuple; +import dev.brighten.ac.utils.*; import dev.brighten.ac.utils.timer.Timer; import dev.brighten.ac.utils.timer.impl.MillisTimer; import lombok.Getter; @@ -51,6 +48,19 @@ public abstract class Check { .replace("%vl%", String.valueOf(MathUtils.round(vl, 1))); } + public void cancel() { + if(checkData.type() == CheckType.COMBAT) { + player.hitsToCancel++; + } else { + player.getInfo().getLastCancel().reset(); + + KLocation fromLoc = player.getInfo().getLastKnownGoodPosition() != null + ? player.getInfo().getLastKnownGoodPosition() : player.getMovement().getFrom().getLoc(); + + player.getBukkitPlayer().teleport(fromLoc.toLocation(player.getBukkitPlayer().getWorld())); + } + } + public void debug(String information, Object... variables) { if(!Anticheat.allowDebug) return; diff --git a/src/main/java/dev/brighten/ac/check/impl/combat/Reach.java b/src/main/java/dev/brighten/ac/check/impl/combat/Reach.java index 8313b26..e14d295 100644 --- a/src/main/java/dev/brighten/ac/check/impl/combat/Reach.java +++ b/src/main/java/dev/brighten/ac/check/impl/combat/Reach.java @@ -15,6 +15,7 @@ import dev.brighten.ac.utils.world.EntityData; import dev.brighten.ac.utils.world.types.SimpleCollisionBox; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.bukkit.util.Vector; import java.util.*; import java.util.concurrent.LinkedBlockingQueue; @@ -63,7 +64,7 @@ public class Reach extends Check { final KLocation to = target.two; - //debug("current loc: %.4f, %.4f, %.4f", eloc.x, eloc.y, eloc.z); + debug("current loc: %.4f, %.4f, %.4f", eloc.x, eloc.y, eloc.z); if(eloc.x == 0 && eloc.y == 0 & eloc.z == 0) { return; @@ -111,39 +112,49 @@ public class Reach extends Check { boolean didSneakOrElytra = getPlayer().getInfo().getLastElytra().isNotPassed(40) || getPlayer().getInfo().getLastElytra().isNotPassed(40); + List directions = new ArrayList<>(Arrays.asList(MathUtils.getDirection( + getPlayer().getMovement().getTo().getLoc().yaw, + getPlayer().getMovement().getTo().getLoc().pitch), + MathUtils.getDirection(getPlayer().getMovement().getFrom().getLoc().yaw, + getPlayer().getMovement().getTo().getLoc().pitch))); + if(!didSneakOrElytra) { to.y+= 1.62f; - for (SimpleCollisionBox targetBox : boxes) { - final AxisAlignedBB vanillaBox = new AxisAlignedBB(targetBox); - - Vec3D intersectTo = vanillaBox.rayTrace(to.toVector(), MathUtils.getDirection(to), 10); - - if(intersectTo != null) { - lastAimOnTarget.reset(); - hits++; - distance = Math.min(distance, intersectTo.distanceSquared(new Vec3D(to.x, to.y, to.z))); - collided = true; - } - } - //Checking all possible eyeheights since client actions notoriously desync from the server side - } else { - for (double eyeHeight : getPlayer().getMovement().getEyeHeights()) { + for (Vector direction : directions) { for (SimpleCollisionBox targetBox : boxes) { final AxisAlignedBB vanillaBox = new AxisAlignedBB(targetBox); - KLocation from = to.clone(); - - from.y+= eyeHeight; - Vec3D intersectTo = vanillaBox.rayTrace(from.toVector(), MathUtils.getDirection(from), 10); + Vec3D intersectTo = vanillaBox.rayTrace(to.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(to.x, to.y, to.z))); collided = true; } } } + //Checking all possible eyeheights since client actions notoriously desync from the server side + } else { + for (Vector direction : directions) { + for (double eyeHeight : getPlayer().getMovement().getEyeHeights()) { + for (SimpleCollisionBox targetBox : boxes) { + final AxisAlignedBB vanillaBox = new AxisAlignedBB(targetBox); + + KLocation from = to.clone(); + + from.y+= eyeHeight; + 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))); + collided = true; + } + } + } + } } if(collided) { @@ -157,10 +168,13 @@ public class Reach extends Check { } else if(buffer > 0) buffer-= 0.05f; if(hbuffer > 0) hbuffer--; + + debug("buffer: %.3f distance=%.2f hits=%s", buffer, distance, hits); } else { if (++hbuffer > 5) { flag("%.1f;%.1f;%.1f", eloc.x, eloc.y, eloc.z); } + debug("Missed!"); } } } diff --git a/src/main/java/dev/brighten/ac/check/impl/fly/FlyA.java b/src/main/java/dev/brighten/ac/check/impl/fly/FlyA.java index ad6852f..d3508b9 100644 --- a/src/main/java/dev/brighten/ac/check/impl/fly/FlyA.java +++ b/src/main/java/dev/brighten/ac/check/impl/fly/FlyA.java @@ -57,6 +57,8 @@ public class FlyA extends Check { if(!getPlayer().getInfo().isGeneralCancel() && getPlayer().getInfo().getBlockAbove().isPassed(1) && !getPlayer().getInfo().isOnLadder() + && !(onGround && !fromGround) + && getPlayer().getInfo().getVelocity().isPassed(1) && !getPlayer().getBlockInformation().onSlime && deltaPredict > 0.016) { if(++buffer > 5) { buffer = 5; @@ -65,6 +67,9 @@ public class FlyA extends Check { } } else buffer-= buffer > 0 ? 0.25f : 0; + debug("dY=%.3f p=%.3f dx=%.3f b=%s velocity=%s", getPlayer().getMovement().getDeltaY(), predicted, + getPlayer().getMovement().getDeltaXZ(), buffer, getPlayer().getInfo().getVelocity().getPassed()); + lastPos.reset(); } } diff --git a/src/main/java/dev/brighten/ac/check/impl/fly/FlyB.java b/src/main/java/dev/brighten/ac/check/impl/fly/FlyB.java new file mode 100644 index 0000000..cc423dd --- /dev/null +++ b/src/main/java/dev/brighten/ac/check/impl/fly/FlyB.java @@ -0,0 +1,33 @@ +package dev.brighten.ac.check.impl.fly; + +import dev.brighten.ac.check.Action; +import dev.brighten.ac.check.Check; +import dev.brighten.ac.data.APlayer; +import dev.brighten.ac.packet.wrapper.in.WPacketPlayInFlying; +import dev.brighten.ac.utils.timer.Timer; +import dev.brighten.ac.utils.timer.impl.TickTimer; + +//@CheckData(name = "Fly (B)", type = CheckType.MOVEMENT) +public class FlyB extends Check { + public FlyB(APlayer player) { + super(player); + } + + private Timer lastNearGround = new TickTimer(); + + @Action + public void onFlying(WPacketPlayInFlying packet) { + if(getPlayer().getInfo().isNearGround()) lastNearGround.reset(); + if(!packet.isMoved() || getPlayer().getInfo().isGeneralCancel()) return; + + if(getPlayer().getMovement().getDeltaY() - getPlayer().getMovement().getLDeltaY() > 0.01 + && getPlayer().getMovement().getMoveTicks() > 3 + && getPlayer().getInfo().getLastPlace().isPassed(3) + && lastNearGround.isPassed(2) + && getPlayer().getInfo().getVelocity().isPassed(2) + && getPlayer().getMovement().getDeltaY() > 0) { + flag("%.4f>-%.4f", + getPlayer().getMovement().getDeltaY(), getPlayer().getMovement().getLDeltaY()); + } + } +} diff --git a/src/main/java/dev/brighten/ac/check/impl/speed/Speed.java b/src/main/java/dev/brighten/ac/check/impl/speed/Speed.java index 871c983..28a0b0e 100644 --- a/src/main/java/dev/brighten/ac/check/impl/speed/Speed.java +++ b/src/main/java/dev/brighten/ac/check/impl/speed/Speed.java @@ -196,8 +196,14 @@ public class Speed extends Check { pmotionz = lmotionZ; if (delta < 1E-15) { - this.strafe = strafe; - this.forward = forward; + this.strafe = s * 0.98f; + this.forward = f * 0.98f; + + if (getPlayer().getInfo().getLastCancel().isPassed(2)) + getPlayer().getInfo() + .setLastKnownGoodPosition(getPlayer() + .getMovement().getFrom().getLoc() + .clone()); break loop; } } @@ -222,7 +228,7 @@ public class Speed extends Check { } } else if (buffer > 0) buffer -= 0.1f; - debug("smallest=%s b=%.1f", smallestDelta, buffer); + debug("smallest=%s b=%.1f f/s=%.2f,%.2f", smallestDelta, buffer, forward, strafe); } lastLastClientGround = getPlayer().getMovement().getFrom().isOnGround(); } diff --git a/src/main/java/dev/brighten/ac/check/impl/velocity/VelocityB.java b/src/main/java/dev/brighten/ac/check/impl/velocity/VelocityB.java index 0eb779c..88feb06 100644 --- a/src/main/java/dev/brighten/ac/check/impl/velocity/VelocityB.java +++ b/src/main/java/dev/brighten/ac/check/impl/velocity/VelocityB.java @@ -2,13 +2,12 @@ package dev.brighten.ac.check.impl.velocity; import dev.brighten.ac.check.Action; import dev.brighten.ac.check.Check; -import dev.brighten.ac.check.CheckData; -import dev.brighten.ac.check.CheckType; import dev.brighten.ac.check.impl.speed.Speed; import dev.brighten.ac.data.APlayer; import dev.brighten.ac.packet.wrapper.in.WPacketPlayInFlying; import dev.brighten.ac.packet.wrapper.in.WPacketPlayInUseEntity; import dev.brighten.ac.utils.Tuple; +import org.bukkit.craftbukkit.v1_8_R3.util.CraftMagicNumbers; import org.bukkit.enchantments.Enchantment; import org.bukkit.potion.PotionEffectType; @@ -16,9 +15,8 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Optional; -import java.util.concurrent.atomic.AtomicReference; -@CheckData(name = "Velocity (B)", type = CheckType.MOVEMENT) +//@CheckData(name = "Velocity (B)", type = CheckType.MOVEMENT) public class VelocityB extends Check { public VelocityB(APlayer player) { super(player); @@ -27,13 +25,14 @@ public class VelocityB extends Check { pvX = velocity.getX(); pvZ = velocity.getZ(); ticks = 0; - debug("did velocity"); + debug("did velocity: %.3f, %.3f", pvX, pvZ); }); } private double pvX, pvZ; private boolean useEntity, sprint; private double buffer; + private float fromFriction; private int ticks; private static final double[] moveValues = new double[] {-0.98, 0, 0.98}; @@ -47,136 +46,143 @@ public class VelocityB extends Check { @Action public void onFlying(WPacketPlayInFlying packet) { - if((pvX != 0 || pvZ != 0) && (getPlayer().getMovement().getDeltaX() != 0 - || getPlayer().getMovement().getDeltaY() != 0 - || getPlayer().getMovement().getDeltaZ() != 0)) { - boolean found = false; + check: { + if((pvX != 0 || pvZ != 0) && (getPlayer().getMovement().getDeltaX() != 0 + || getPlayer().getMovement().getDeltaY() != 0 + || getPlayer().getMovement().getDeltaZ() != 0)) { + boolean found = false; - double drag = 0.91; + double drag = 0.91; - if(getPlayer().getBlockInformation().blocksNear - || getPlayer().getBlockInformation().blocksAbove - || getPlayer().getBlockInformation().inLiquid - || getPlayer().getLagInfo().getLastPingDrop().isNotPassed()) { - pvX = pvZ = 0; - buffer-= buffer > 0 ? 1 : 0; - return; - } + if(getPlayer().getBlockInformation().blocksNear + || getPlayer().getBlockInformation().blocksAbove + || getPlayer().getBlockInformation().inLiquid + || getPlayer().getLagInfo().getLastPingDrop().isNotPassed()) { + pvX = pvZ = 0; + buffer-= buffer > 0 ? 1 : 0; + break check; + } - if(getPlayer().getMovement().getFrom().isOnGround()) { - drag*= getPlayer().getBlockInformation().fromFriction; - } + if(getPlayer().getMovement().getFrom().isOnGround()) { + drag*= fromFriction; + } - if(useEntity && (sprint || (getPlayer().getBukkitPlayer().getItemInHand() != null - && getPlayer().getBukkitPlayer().getItemInHand().containsEnchantment(Enchantment.KNOCKBACK)))) { - pvX*= 0.6; - pvZ*= 0.6; - } + if(useEntity && (sprint || (getPlayer().getBukkitPlayer().getItemInHand() != null + && getPlayer().getBukkitPlayer().getItemInHand().containsEnchantment(Enchantment.KNOCKBACK)))) { + pvX*= 0.6; + pvZ*= 0.6; + } - double f = 0.16277136 / (drag * drag * drag); - double f5; + double f = 0.16277136 / (drag * drag * drag); + double f5; - if (getPlayer().getMovement().getFrom().isOnGround()) { - AtomicReference aiMoveSpeed = new AtomicReference<>((double) getPlayer().getBukkitPlayer().getWalkSpeed() / 2f); + if (getPlayer().getMovement().getFrom().isOnGround()) { + double aiMoveSpeed = (double) getPlayer().getBukkitPlayer().getWalkSpeed() / 2f; - if(getPlayer().getInfo().isSprinting()) aiMoveSpeed.updateAndGet(v -> new Double((double) (v + aiMoveSpeed.get() * 0.3f))); + if(getPlayer().getInfo().isSprinting()) aiMoveSpeed += aiMoveSpeed * 0.30000001192092896D; - getPlayer().getPotionHandler().getEffectByType(PotionEffectType.SPEED).ifPresent(speed -> - aiMoveSpeed.updateAndGet(v -> new Double((double) (v + (speed.getAmplifier() + 1) * (double) 0.2f * aiMoveSpeed.get())))); - getPlayer().getPotionHandler().getEffectByType(PotionEffectType.SLOW).ifPresent(speed -> - aiMoveSpeed.updateAndGet(v -> new Double((double) (v + (speed.getAmplifier() + 1) * (double) -0.15f * aiMoveSpeed.get())))); - f5 = aiMoveSpeed.get() * f; - } else { - f5 = sprint ? 0.026f : 0.02f; - } + aiMoveSpeed += (getPlayer().getPotionHandler() + .getEffectByType(PotionEffectType.SPEED) + .map(p -> p.getAmplifier() + 1).orElse(0)) + * 0.20000000298023224D * aiMoveSpeed; + aiMoveSpeed += (getPlayer().getPotionHandler() + .getEffectByType(PotionEffectType.SLOW) + .map(p -> p.getAmplifier() + 1).orElse(0)) + * -0.15000000596046448D * aiMoveSpeed; - double vX = pvX; - double vZ = pvZ; - double vXZ = 0; + f5 = aiMoveSpeed * f; + } else { + f5 = sprint ? 0.026f : 0.02f; + } - List> predictions = new ArrayList<>(); + double vX = pvX; + double vZ = pvZ; - double moveStrafe = 0, moveForward = 0; - for (double forward : moveValues) { - for(double strafe : moveValues) { - double s2 = strafe; - double f2 = forward; + List> predictions = new ArrayList<>(); + + double moveStrafe = 0, moveForward = 0; + for (double forward : moveValues) { + for(double strafe : moveValues) { + moveFlying(strafe, forward, f5); + + predictions.add(new Tuple<>(new Double[]{forward, strafe}, new Double[]{pvX, pvZ})); + + pvX = vX; + pvZ = vZ; + } + } + + Optional> velocity = predictions.stream() + .filter(tuple -> { + double deltaX = Math.abs(tuple.two[0] - getPlayer().getMovement().getDeltaX()); + double deltaZ = Math.abs(tuple.two[1] - getPlayer().getMovement().getDeltaZ()); + + return (deltaX * deltaX + deltaZ * deltaZ) < 0.005; + }) + .min(Comparator.comparing(tuple -> { + double deltaX = Math.abs(tuple.two[0] - getPlayer().getMovement().getDeltaX()); + double deltaZ = Math.abs(tuple.two[1] - getPlayer().getMovement().getDeltaZ()); + + return (deltaX * deltaX + deltaZ * deltaZ); + })); + + found = true; + if(!velocity.isPresent()) { + Speed speedCheck = (Speed) getPlayer().findCheck(Speed.class); + double s2 = speedCheck.strafe; + double f2 = speedCheck.forward; + + moveStrafe = s2; + moveForward = f2; moveFlying(s2, f2, f5); + } else { + Tuple tuple = velocity.get(); - predictions.add(new Tuple<>(new Double[]{f2, s2}, new Double[]{pvX, pvZ})); - - pvX = vX; - pvZ = vZ; + moveForward = tuple.one[0]; + moveStrafe = tuple.one[1]; + pvX = tuple.two[0]; + pvZ = tuple.two[1]; } - } - Optional> velocity = predictions.stream() - .filter(tuple -> { - double deltaX = Math.abs(tuple.two[0] - getPlayer().getMovement().getDeltaX()); - double deltaZ = Math.abs(tuple.two[1] - getPlayer().getMovement().getDeltaZ()); + double pvXZ = Math.hypot(pvX, pvZ); - return (deltaX * deltaX + deltaZ * deltaZ) < 0.005; - }) - .min(Comparator.comparing(tuple -> { - double deltaX = Math.abs(tuple.two[0] - getPlayer().getMovement().getDeltaX()); - double deltaZ = Math.abs(tuple.two[1] - getPlayer().getMovement().getDeltaZ()); + if(pvXZ < 0.2) break check; + double ratio = getPlayer().getMovement().getDeltaXZ() / pvXZ; - return (deltaX * deltaX + deltaZ * deltaZ); - })); + if((ratio < 0.996) && pvX != 0 + && pvZ != 0 + && getPlayer().getCreation().isPassed(3000L) + && getPlayer().getMovement().getLastTeleport().isPassed(1) + && !getPlayer().getBlockInformation().blocksNear) { + if(++buffer > 20) { + flag("pct=%.2f buffer=%.1f forward=%.2f strafe=%.2f", + ratio * 100, buffer, moveStrafe, moveForward); + buffer = 21; + } + } else if(buffer > 0) buffer-= 0.5; - found = true; - if(!velocity.isPresent()) { - Speed speedCheck = (Speed) getPlayer().findCheck(Speed.class); - double s2 = speedCheck.strafe; - double f2 = speedCheck.forward; + debug("ratio=%.3f dxz=%.4f vxz=%.4f vxz=%.4g,%.4f buffer=%.1f ticks=%s strafe=%.2f forward=%.2f " + + "found=%s lastV=%s", ratio, getPlayer().getMovement().getDeltaXZ(), pvXZ, pvX, pvZ, + buffer, ticks, moveStrafe, moveForward, + found, getPlayer().getInfo().getVelocity().getPassed()); - moveStrafe = s2; - moveForward = f2; + pvX *= drag; + pvZ *= drag; - moveFlying(s2, f2, f5); - } else { - Tuple tuple = velocity.get(); - - moveForward = tuple.one[0]; - moveStrafe = tuple.one[1]; - pvX = tuple.two[0]; - pvZ = tuple.two[1]; - } - - double pvXZ = Math.sqrt(pvX * pvX + pvZ * pvZ); - double ratio = getPlayer().getMovement().getDeltaXZ() / pvXZ; - - if((ratio < 0.996) && pvX != 0 - && pvZ != 0 - && getPlayer().getCreation().isPassed(3000L) - && getPlayer().getMovement().getLastTeleport().isPassed(1) - && !getPlayer().getBlockInformation().blocksNear) { - if(++buffer > 30) { - flag("pct=%.2f buffer=%.1f forward=%.2f strafe=%.2f", - ratio * 100, buffer, moveStrafe, moveForward); - buffer = 31; + if(++ticks > 6) { + ticks = 0; + pvX = pvZ = 0; } - } else if(buffer > 0) buffer-= 0.5; - debug("ratio=%.3f dx=%.4f dz=%.4f buffer=%.1f ticks=%s strafe=%.2f forward=%.2f " + - "found=%s lastV=%s", ratio, getPlayer().getMovement().getDeltaX(), getPlayer().getMovement().getDeltaZ(), - buffer, ticks, moveStrafe, moveForward, - found, getPlayer().getInfo().getVelocity().getPassed()); - - pvX *= drag; - pvZ *= drag; - - if(++ticks > 6) { - ticks = 0; - pvX = pvZ = 0; + if(Math.abs(pvX) < 0.005) pvX = 0; + if(Math.abs(pvZ) < 0.005) pvZ = 0; } - - if(Math.abs(pvX) < 0.005) pvX = 0; - if(Math.abs(pvZ) < 0.005) pvZ = 0; } sprint = getPlayer().getInfo().isSprinting(); useEntity = false; + fromFriction = getPlayer().getInfo().getBlockBelow() + .map(b -> CraftMagicNumbers.getBlock(b.getType()).frictionFactor).orElse(0.6f); } private void moveFlying(double strafe, double forward, double friction) { diff --git a/src/main/java/dev/brighten/ac/command/AnticheatCommand.java b/src/main/java/dev/brighten/ac/command/AnticheatCommand.java index 30c6fc2..88f13dc 100644 --- a/src/main/java/dev/brighten/ac/command/AnticheatCommand.java +++ b/src/main/java/dev/brighten/ac/command/AnticheatCommand.java @@ -2,6 +2,7 @@ package dev.brighten.ac.command; import co.aikar.commands.*; import co.aikar.commands.annotation.*; +import co.aikar.commands.bukkit.contexts.OnlinePlayer; import dev.brighten.ac.Anticheat; import dev.brighten.ac.check.Check; import dev.brighten.ac.check.CheckData; @@ -146,9 +147,10 @@ public class AnticheatCommand extends BaseCommand { @Subcommand("debug") @CommandCompletion("@checks|none @players") @Description("Debug a player") + @Syntax("[check] [player]") @CommandPermission("anticheat.command.debug") - public void onDebug(APlayer sender, @Single String check, @Optional APlayer targetPlayer) { - APlayer target = targetPlayer != null ? targetPlayer : sender; + public void onDebug(Player sender, @Single String check, @Optional OnlinePlayer targetPlayer) { + Player target = targetPlayer != null ? targetPlayer.player : sender; if(check.equals("none")) { synchronized (Check.debugInstances) { Check.debugInstances.forEach((nameKey, list) -> { @@ -156,35 +158,35 @@ public class AnticheatCommand extends BaseCommand { while(iterator.hasNext()) { val tuple = iterator.next(); - if(tuple.one.equals(target.getUuid())) { + if(tuple.two.equals(target.getUniqueId())) { iterator.remove(); - sender.getBukkitPlayer().spigot() + sender.spigot() .sendMessage(new ChatBuilder( "&cTurned off debug for check &f%s &con target &f%s", nameKey, - target.getBukkitPlayer().getName()).build()); + target.getName()).build()); } } }); } } else { if(!Anticheat.INSTANCE.getCheckManager().isCheck(check)) { - sender.getBukkitPlayer().sendMessage(Color.Red + "Check \"" + check + "\" is not a valid check!"); + sender.sendMessage(Color.Red + "Check \"" + check + "\" is not a valid check!"); return; } synchronized (Check.debugInstances) { Check.debugInstances.compute(check.replace("_", " "), (key, list) -> { if(list == null) list = new ArrayList<>(); - list.add(new Tuple<>(target.getUuid(), sender.getUuid())); + list.add(new Tuple<>(target.getUniqueId(), sender.getUniqueId())); return list; }); - sender.getBukkitPlayer().spigot() + sender.spigot() .sendMessage(new ChatBuilder( - "&aTurned on debug for check &f%s &con target &f%s", + "&aTurned on debug for check &f%s &aon target &f%s", check.replace("_", " "), - target.getBukkitPlayer().getName()).build()); + target.getName()).build()); } } } diff --git a/src/main/java/dev/brighten/ac/data/APlayer.java b/src/main/java/dev/brighten/ac/data/APlayer.java index d6f9190..e6df594 100644 --- a/src/main/java/dev/brighten/ac/data/APlayer.java +++ b/src/main/java/dev/brighten/ac/data/APlayer.java @@ -67,6 +67,8 @@ public class APlayer { @Getter private Object playerConnection; + public int hitsToCancel; + public final Map>> instantTransaction = new HashMap<>(); public final List keepAliveStamps = new ArrayList<>(); 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 7269b3d..b3555ff 100644 --- a/src/main/java/dev/brighten/ac/data/handlers/BlockInformation.java +++ b/src/main/java/dev/brighten/ac/data/handlers/BlockInformation.java @@ -206,8 +206,8 @@ public class BlockInformation { if (blockBox.isCollided(box)) collidesVertically = true; - if(groundBox.copy().expandMin(0, -0.8, 0).expand(0.2, 0, 0.2) - .isIntersected(blockBox)) + if(groundBox.copy().expandMin(0, -0.8, 0).expand(0.4, 0, 0.4) + .isCollided(blockBox)) player.getInfo().setNearGround(true); if(groundBox.isCollided(blockBox)) { 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 6cfda77..d4e15e8 100644 --- a/src/main/java/dev/brighten/ac/data/handlers/GeneralInformation.java +++ b/src/main/java/dev/brighten/ac/data/handlers/GeneralInformation.java @@ -1,5 +1,6 @@ package dev.brighten.ac.data.handlers; +import dev.brighten.ac.utils.KLocation; import dev.brighten.ac.utils.PastLocation; import dev.brighten.ac.utils.objects.evicting.EvictingList; import dev.brighten.ac.utils.timer.Timer; @@ -20,12 +21,13 @@ import java.util.Optional; public class GeneralInformation { private Optional blockOnTo, blockBelow; private Timer lastMove = new TickTimer(), vehicleSwitch = new TickTimer(), - lastSneak = new TickTimer(), velocity = new TickTimer(), - lastElytra = new TickTimer(), blockAbove = new TickTimer(); + lastSneak = new TickTimer(), velocity = new TickTimer(), lastCancel = new TickTimer(), + lastElytra = new TickTimer(), blockAbove = new TickTimer(), lastPlace = new TickTimer(); private LivingEntity target; private boolean serverGround, lastServerGround, nearGround, worldLoaded, generalCancel, inVehicle, creative, sneaking, sprinting, gliding, riptiding, wasOnSlime, onLadder, doingVelocity; private List nearbyEntities = Collections.emptyList(); private PastLocation targetPastLocation = new PastLocation(); + private KLocation lastKnownGoodPosition; private List velocityHistory = Collections.synchronizedList(new EvictingList<>(5)); } 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 9b77931..1db6601 100644 --- a/src/main/java/dev/brighten/ac/data/handlers/MovementHandler.java +++ b/src/main/java/dev/brighten/ac/data/handlers/MovementHandler.java @@ -37,6 +37,7 @@ public class MovementHandler { private float lookX, lookY, lastLookX, lastLookY; @Getter private float deltaYaw, deltaPitch, lDeltaYaw, lDeltaPitch, pitchGCD, lastPitchGCD, yawGCD, lastYawGCD; + @Getter private int moveTicks; private final List posLocs = new ArrayList<>(); @Getter @@ -244,16 +245,18 @@ it // generate a method that processes velocityHistory and compares to current deltaY. private void processVelocity() { //Iterate through player.getInfo().getVelocityHistory() and compare to current deltaY. - val iterator = player.getInfo().getVelocityHistory().iterator(); - while (iterator.hasNext()) { - val velocity = iterator.next(); + synchronized (player.getInfo().getVelocityHistory()) { + val iterator = player.getInfo().getVelocityHistory().iterator(); + while (iterator.hasNext()) { + val velocity = iterator.next(); - if(Math.abs(velocity.getY() - getDeltaY()) < 0.01) { - player.getInfo().getVelocity().reset(); - player.getInfo().setDoingVelocity(false); - player.getOnVelocityTasks().forEach(vectorConsumer -> vectorConsumer.accept(velocity)); - iterator.remove(); - break; + if(Math.abs(velocity.getY() - getDeltaY()) < 0.01) { + player.getInfo().getVelocity().reset(); + player.getInfo().setDoingVelocity(false); + player.getOnVelocityTasks().forEach(vectorConsumer -> vectorConsumer.accept(velocity)); + iterator.remove(); + break; + } } } } diff --git a/src/main/java/dev/brighten/ac/handler/EntityLocationHandler.java b/src/main/java/dev/brighten/ac/handler/EntityLocationHandler.java index be8fc64..897f7fd 100644 --- a/src/main/java/dev/brighten/ac/handler/EntityLocationHandler.java +++ b/src/main/java/dev/brighten/ac/handler/EntityLocationHandler.java @@ -78,7 +78,7 @@ public class EntityLocationHandler { runAction(entity, () -> { //We don't need to do version checking here. Atlas handles this for us. - eloc.newX += (byte)packet.getX(); + eloc.newX += packet.getX(); eloc.newY += packet.getY(); eloc.newZ += packet.getZ(); eloc.newYaw += packet.getYaw(); @@ -155,7 +155,6 @@ public class EntityLocationHandler { if(data.getInfo().getTarget() != null && data.getInfo().getTarget().getEntityId() == entity.getEntityId()) { data.runInstantAction(ia -> { if(!ia.isEnd()) { - action.run(); } else entityLocationMap.get(entity.getUniqueId()).oldLocations.clear(); }); diff --git a/src/main/java/dev/brighten/ac/handler/PacketHandler.java b/src/main/java/dev/brighten/ac/handler/PacketHandler.java index 90a01c0..c429770 100644 --- a/src/main/java/dev/brighten/ac/handler/PacketHandler.java +++ b/src/main/java/dev/brighten/ac/handler/PacketHandler.java @@ -82,23 +82,22 @@ public class PacketHandler { } }); player.getLagInfo().getLastClientTransaction().reset(); - } else { - Optional.ofNullable(player.instantTransaction.remove(packet.b())) - .ifPresent(t -> t.two.accept(t.one)); } + Optional.ofNullable(player.instantTransaction.remove(packet.b())) + .ifPresent(t -> t.two.accept(t.one)); } break; } case FLYING: { WPacketPlayInFlying packet = (WPacketPlayInFlying) packetObject; - player.getEntityLocationHandler().onFlying(); - if(player.getMovement().isExcuseNextFlying()) { player.getMovement().setExcuseNextFlying(false); return; } + player.getEntityLocationHandler().onFlying(); + if(player.getPlayerVersion().isOrAbove(ProtocolVersion.V1_17) && packet.isMoved() && packet.isLooked() && MovementUtils.isSameLocation(new KLocation(packet.getX(), packet.getY(), packet.getZ()), @@ -148,6 +147,12 @@ public class PacketHandler { } break; } + case RESPAWN: { + if(player.getPlayerVersion().isBelow(ProtocolVersion.V1_14)) { + player.runKeepaliveAction(k -> player.getBukkitPlayer().setSprinting(false), 1); + } + break; + } case SERVER_POSITION: { player.getMovement().addPosition((WPacketPlayOutPosition) packetObject); break; diff --git a/src/main/java/dev/brighten/ac/handler/block/BlockUpdateHandler.java b/src/main/java/dev/brighten/ac/handler/block/BlockUpdateHandler.java index 2c6fb10..023f4b4 100644 --- a/src/main/java/dev/brighten/ac/handler/block/BlockUpdateHandler.java +++ b/src/main/java/dev/brighten/ac/handler/block/BlockUpdateHandler.java @@ -33,6 +33,8 @@ public class BlockUpdateHandler { public void onPlace(WPacketPlayInBlockPlace place) { if(!place.getItemStack().getType().isBlock()) return; + player.getInfo().getLastPlace().reset(); + Deque possible = getPossibleMaterials(place.getBlockPos()); possible.add(place.getItemStack().getType()); } diff --git a/src/main/java/dev/brighten/ac/listener/JoinListener.java b/src/main/java/dev/brighten/ac/listener/JoinListener.java index f113ed2..753ade1 100644 --- a/src/main/java/dev/brighten/ac/listener/JoinListener.java +++ b/src/main/java/dev/brighten/ac/listener/JoinListener.java @@ -2,14 +2,15 @@ package dev.brighten.ac.listener; import dev.brighten.ac.Anticheat; import dev.brighten.ac.data.APlayer; -import dev.brighten.ac.handler.thread.ThreadHandler; import dev.brighten.ac.packet.handler.HandlerAbstract; import dev.brighten.ac.packet.wrapper.PacketType; import dev.brighten.ac.utils.Init; import dev.brighten.ac.utils.RunUtils; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerQuitEvent; @@ -26,9 +27,8 @@ public class JoinListener implements Listener { Optional aplayer = Anticheat.INSTANCE.getPlayerRegistry() .getPlayer(event.getPlayer().getUniqueId()); - aplayer.ifPresent(player -> ThreadHandler.INSTANCE.getThread(player) - .runTask(() -> Anticheat.INSTANCE.getPacketHandler() - .process(player, event.getType(), event.getPacket()))); + aplayer.ifPresent(player -> Anticheat.INSTANCE.getPacketHandler() + .process(player, event.getType(), event.getPacket())); }); Anticheat.INSTANCE.getPacketProcessor().process(Anticheat.INSTANCE, EventPriority.HIGHEST, event -> { @@ -74,11 +74,25 @@ public class JoinListener implements Listener { }); } + @EventHandler + public void onDamage(EntityDamageByEntityEvent event) { + if(event.getDamager() instanceof Player) { + APlayer player = Anticheat.INSTANCE.getPlayerRegistry().getPlayer(event.getDamager().getUniqueId()). + orElse(null); + + if(player == null) return; + + if(player.hitsToCancel > 0) { + player.hitsToCancel--; + event.setCancelled(true); + } + } + } @EventHandler public void onJoin(PlayerJoinEvent event) { APlayer player = Anticheat.INSTANCE.getPlayerRegistry().generate(event.getPlayer()); - RunUtils.taskLater(() -> HandlerAbstract.getHandler().add(event.getPlayer()), 3); + RunUtils.taskLater(() -> HandlerAbstract.getHandler().add(event.getPlayer()), 6); player.callEvent(event); } @@ -93,6 +107,7 @@ public class JoinListener implements Listener { @EventHandler public void onQuit(PlayerQuitEvent event) { + HandlerAbstract.getHandler().remove(event.getPlayer()); Anticheat.INSTANCE.getPlayerRegistry().unregister(event.getPlayer().getUniqueId()); } diff --git a/src/main/java/dev/brighten/ac/packet/handler/LegacyHandler.java b/src/main/java/dev/brighten/ac/packet/handler/LegacyHandler.java index 2ff7e77..1d01c07 100644 --- a/src/main/java/dev/brighten/ac/packet/handler/LegacyHandler.java +++ b/src/main/java/dev/brighten/ac/packet/handler/LegacyHandler.java @@ -3,6 +3,7 @@ package dev.brighten.ac.packet.handler; import dev.brighten.ac.Anticheat; import dev.brighten.ac.data.APlayer; import dev.brighten.ac.packet.wrapper.PacketType; +import dev.brighten.ac.packet.wrapper.WPacket; import dev.brighten.ac.utils.reflections.types.WrappedClass; import dev.brighten.ac.utils.reflections.types.WrappedField; import lombok.AllArgsConstructor; @@ -61,12 +62,14 @@ public class LegacyHandler extends HandlerAbstract { @Override public void sendPacket(Player player, Object packet) { - getChannel(player).pipeline().writeAndFlush(packet); + if(packet instanceof WPacket) { + getChannel(player).pipeline().writeAndFlush(((WPacket) packet).getPacket()); + } else getChannel(player).pipeline().writeAndFlush(packet); } @Override public void sendPacket(APlayer player, Object packet) { - sendPacket(player.getBukkitPlayer(), packet); + this.sendPacket(player.getBukkitPlayer(), packet); } @Override diff --git a/src/main/java/dev/brighten/ac/packet/handler/ModernHandler.java b/src/main/java/dev/brighten/ac/packet/handler/ModernHandler.java index 1a09c60..068365f 100644 --- a/src/main/java/dev/brighten/ac/packet/handler/ModernHandler.java +++ b/src/main/java/dev/brighten/ac/packet/handler/ModernHandler.java @@ -4,6 +4,7 @@ import com.google.common.collect.MapMaker; import dev.brighten.ac.Anticheat; import dev.brighten.ac.data.APlayer; import dev.brighten.ac.packet.wrapper.PacketType; +import dev.brighten.ac.packet.wrapper.WPacket; import dev.brighten.ac.packet.wrapper.in.WPacketHandshakingInSetProtocol; import dev.brighten.ac.utils.reflections.impl.MinecraftReflection; import io.netty.channel.*; @@ -94,22 +95,26 @@ public class ModernHandler extends HandlerAbstract { public void remove(Player player) { Channel channel = getChannel(player); - if(channel != null) + if(channel != null) { channel.eventLoop().execute(() -> { - if(channel.pipeline().get(handlerName) != null) { + if (channel.pipeline().get(handlerName) != null) { channel.pipeline().remove(handlerName); } }); + channelCache.remove(player.getName()); + } } @Override public void sendPacket(Player player, Object packet) { - getChannel(player).pipeline().writeAndFlush(packet); + if(packet instanceof WPacket) { + getChannel(player).pipeline().writeAndFlush(((WPacket) packet).getPacket()); + } else getChannel(player).pipeline().writeAndFlush(packet); } @Override public void sendPacket(APlayer player, Object packet) { - sendPacket(player.getBukkitPlayer(), packet); + this.sendPacket(player.getBukkitPlayer(), packet); } @Override 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 88bf2fd..7993ba7 100644 --- a/src/main/java/dev/brighten/ac/packet/listener/PacketProcessor.java +++ b/src/main/java/dev/brighten/ac/packet/listener/PacketProcessor.java @@ -168,14 +168,12 @@ public class PacketProcessor { if(asyncProcessors.containsKey(type) || asyncProcessors.containsKey(PacketType.UNKNOWN)) { asyncInfo = new PacketInfo(player, PacketType.processType(type, packet), type, info.getTimestamp()); asyncInfo.setCancelled(cancelled); - Anticheat.INSTANCE.getScheduler().execute(() -> { - val list = MiscUtils.combine(asyncProcessors.get(type), - asyncProcessors.get(PacketType.UNKNOWN)); + val list = MiscUtils.combine(asyncProcessors.get(type), + asyncProcessors.get(PacketType.UNKNOWN)); - for (ListenerEntry tuple : list) { - tuple.getListener().onEvent(asyncInfo); - } - }); + for (ListenerEntry tuple : list) { + tuple.getListener().onEvent(asyncInfo); + } } return !cancelled; } diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/PacketConverter.java b/src/main/java/dev/brighten/ac/packet/wrapper/PacketConverter.java index e84dcb8..e26b5bb 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/PacketConverter.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/PacketConverter.java @@ -36,4 +36,10 @@ public interface PacketConverter { WPacketPlayOutMultiBlockChange processMultiBlockChange(Object object); WPacketPlayOutEntityVelocity processVelocity(Object object); + + Object processVelocity(WPacketPlayOutEntityVelocity packet); + + WPacketPlayOutWorldParticles processParticles(Object object); + + Object processParticles(WPacketPlayOutWorldParticles packet); } diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/WPacket.java b/src/main/java/dev/brighten/ac/packet/wrapper/WPacket.java index 7df7f3c..9bddb63 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/WPacket.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/WPacket.java @@ -1,6 +1,7 @@ package dev.brighten.ac.packet.wrapper; public interface WPacket { - PacketType getPacketType(); + + Object getPacket(); } diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/impl/Processor_18.java b/src/main/java/dev/brighten/ac/packet/wrapper/impl/Processor_18.java index b0334c1..76b4395 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/impl/Processor_18.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/impl/Processor_18.java @@ -2,6 +2,7 @@ package dev.brighten.ac.packet.wrapper.impl; import dev.brighten.ac.packet.wrapper.PacketConverter; import dev.brighten.ac.packet.wrapper.in.*; +import dev.brighten.ac.packet.wrapper.objects.EnumParticle; import dev.brighten.ac.packet.wrapper.objects.WrappedEnumDirection; import dev.brighten.ac.packet.wrapper.out.*; import dev.brighten.ac.utils.math.IntVector; @@ -15,6 +16,7 @@ import org.bukkit.craftbukkit.v1_8_R3.util.CraftMagicNumbers; import org.bukkit.util.Vector; import java.io.IOException; +import java.util.Arrays; import java.util.stream.Collectors; public class Processor_18 implements PacketConverter { @@ -110,7 +112,7 @@ public class Processor_18 implements PacketConverter { return WPacketPlayOutEntityEffect.builder().entityId(serializer.e()) .effectId(serializer.readByte()) - .duration(serializer.readByte()) + .amplifier(serializer.readByte()) .duration(serializer.e()) .flags(serializer.readByte()).build(); } @@ -195,6 +197,7 @@ public class Processor_18 implements PacketConverter { } return WPacketPlayOutEntity.builder() + .id(id) .x(x / 32D).y(y / 32D).z(z / 32D).yaw(yaw / 256.0F * 360.0F).pitch(pitch / 256.0F * 360.0F) .onGround(ground).moved(moved).looked(looked) .build(); @@ -244,13 +247,7 @@ public class Processor_18 implements PacketConverter { @Override public WPacketPlayOutBlockChange processBlockChange(Object object) { PacketPlayOutBlockChange packet = (PacketPlayOutBlockChange) object; - PacketDataSerializer serial = new PacketDataSerializer(Unpooled.buffer()); - - try { - packet.b(serial); - } catch (IOException e) { - throw new RuntimeException(e); - } + PacketDataSerializer serial = serialize(packet); BlockPosition blockPos = serial.c(); IntVector vecPos = new IntVector(blockPos.getX(), blockPos.getY(), blockPos.getZ()); @@ -265,13 +262,7 @@ public class Processor_18 implements PacketConverter { @Override public WPacketPlayOutMultiBlockChange processMultiBlockChange(Object object) { PacketPlayOutMultiBlockChange packet = (PacketPlayOutMultiBlockChange) object; - PacketDataSerializer serial = new PacketDataSerializer(Unpooled.buffer()); - - try { - packet.b(serial); - } catch (IOException e) { - throw new RuntimeException(e); - } + PacketDataSerializer serial = serialize(packet); final int[] chunkLoc = new int[] {serial.readInt(), serial.readInt()}; final WPacketPlayOutMultiBlockChange.BlockChange[] @@ -305,6 +296,44 @@ public class Processor_18 implements PacketConverter { .build(); } + @Override + public Object processVelocity(WPacketPlayOutEntityVelocity packet) { + return new PacketPlayOutEntityVelocity(packet.getEntityId(), packet.getDeltaX(), packet.getDeltaY(), packet.getDeltaZ()); + } + + @Override + public WPacketPlayOutWorldParticles processParticles(Object object) { + PacketPlayOutWorldParticles packet = (PacketPlayOutWorldParticles) object; + PacketDataSerializer serial = serialize(packet); + + EnumParticle particle = EnumParticle.a(serial.readInt()); + + if(particle == null) particle = EnumParticle.BARRIER; + + int[] data = new int[particle.d()]; + + return WPacketPlayOutWorldParticles.builder() + .particle(particle) + .longD(serial.readBoolean()) + .x(serial.readFloat()) + .y(serial.readFloat()) + .z(serial.readFloat()) + .offsetX(serial.readFloat()) + .offsetY(serial.readFloat()) + .offsetZ(serial.readFloat()) + .speed(serial.readFloat()) + .amount(serial.readInt()) + .data(Arrays.stream(data).map(i -> serial.e()).toArray()) + .build(); + } + + @Override + public Object processParticles(WPacketPlayOutWorldParticles packet) { + return new PacketPlayOutWorldParticles(net.minecraft.server.v1_8_R3.EnumParticle.valueOf(packet.getParticle().name()), + packet.isLongD(), packet.getX(), packet.getY(), packet.getZ(), packet.getOffsetX(), packet.getOffsetY(), packet.getOffsetZ(), + packet.getSpeed(), packet.getAmount(), packet.getData()); + } + private PacketDataSerializer serialize(Packet packet) { PacketDataSerializer serial = new PacketDataSerializer(Unpooled.buffer()); try { diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketHandshakingInSetProtocol.java b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketHandshakingInSetProtocol.java index 4812f7e..efa5749 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketHandshakingInSetProtocol.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketHandshakingInSetProtocol.java @@ -17,6 +17,11 @@ public class WPacketHandshakingInSetProtocol implements WPacket { return PacketType.LOGIN_HANDSHAKE; } + @Override + public Object getPacket() { + return null; + } + public enum EnumProtocol { HANDSHAKING(-1), PLAY(0), diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInAbilities.java b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInAbilities.java index 8868bf3..4403e50 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInAbilities.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInAbilities.java @@ -15,4 +15,9 @@ public class WPacketPlayInAbilities implements WPacket { public PacketType getPacketType() { return PacketType.CLIENT_ABILITIES; } + + @Override + public Object getPacket() { + return null; + } } diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInArmAnimation.java b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInArmAnimation.java index bc13897..11cdaed 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInArmAnimation.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInArmAnimation.java @@ -15,4 +15,9 @@ public class WPacketPlayInArmAnimation implements WPacket { public PacketType getPacketType() { return PacketType.ARM_ANIMATION; } -} + + @Override + public Object getPacket() { + return null; + } +} \ No newline at end of file diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInBlockDig.java b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInBlockDig.java index 0f5e053..36c04ae 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInBlockDig.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInBlockDig.java @@ -20,6 +20,11 @@ public class WPacketPlayInBlockDig implements WPacket { return PacketType.BLOCK_DIG; } + @Override + public Object getPacket() { + return null; + } + public enum EnumDirection { DOWN, UP, diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInBlockPlace.java b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInBlockPlace.java index 5c0a808..72ff0a7 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInBlockPlace.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInBlockPlace.java @@ -21,4 +21,9 @@ public class WPacketPlayInBlockPlace implements WPacket { public PacketType getPacketType() { return PacketType.BLOCK_PLACE; } + + @Override + public Object getPacket() { + return null; + } } diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInCloseWindow.java b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInCloseWindow.java index e0d62bf..342c07e 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInCloseWindow.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInCloseWindow.java @@ -15,4 +15,9 @@ public class WPacketPlayInCloseWindow implements WPacket { public PacketType getPacketType() { return PacketType.CLIENT_CLOSE_WINDOW; } + + @Override + public Object getPacket() { + return null; + } } diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInEntityAction.java b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInEntityAction.java index 3351a77..4afadb1 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInEntityAction.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInEntityAction.java @@ -16,6 +16,11 @@ public class WPacketPlayInEntityAction implements WPacket { return PacketType.ENTITY_ACTION; } + @Override + public Object getPacket() { + return null; + } + public static enum EnumPlayerAction { START_SNEAKING, STOP_SNEAKING, diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInFlying.java b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInFlying.java index 0727622..d5e610d 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInFlying.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInFlying.java @@ -16,4 +16,9 @@ public class WPacketPlayInFlying implements WPacket { public PacketType getPacketType() { return PacketType.FLYING; } + + @Override + public Object getPacket() { + return null; + } } diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInUseEntity.java b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInUseEntity.java index 2623e69..a7768f9 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInUseEntity.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInUseEntity.java @@ -21,6 +21,11 @@ public class WPacketPlayInUseEntity implements WPacket { return PacketType.USE_ENTITY; } + @Override + public Object getPacket() { + return null; + } + public enum EnumHand { MAIN_HAND, OFF_HAND; } diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/objects/EnumParticle.java b/src/main/java/dev/brighten/ac/packet/wrapper/objects/EnumParticle.java new file mode 100644 index 0000000..c1ce170 --- /dev/null +++ b/src/main/java/dev/brighten/ac/packet/wrapper/objects/EnumParticle.java @@ -0,0 +1,113 @@ +package dev.brighten.ac.packet.wrapper.objects; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import java.util.ArrayList; +import java.util.Map; + +public enum EnumParticle { + EXPLOSION_NORMAL("explode", 0, true), + EXPLOSION_LARGE("largeexplode", 1, true), + EXPLOSION_HUGE("hugeexplosion", 2, true), + FIREWORKS_SPARK("fireworksSpark", 3, false), + WATER_BUBBLE("bubble", 4, false), + WATER_SPLASH("splash", 5, false), + WATER_WAKE("wake", 6, false), + SUSPENDED("suspended", 7, false), + SUSPENDED_DEPTH("depthsuspend", 8, false), + CRIT("crit", 9, false), + CRIT_MAGIC("magicCrit", 10, false), + SMOKE_NORMAL("smoke", 11, false), + SMOKE_LARGE("largesmoke", 12, false), + SPELL("spell", 13, false), + SPELL_INSTANT("instantSpell", 14, false), + SPELL_MOB("mobSpell", 15, false), + SPELL_MOB_AMBIENT("mobSpellAmbient", 16, false), + SPELL_WITCH("witchMagic", 17, false), + DRIP_WATER("dripWater", 18, false), + DRIP_LAVA("dripLava", 19, false), + VILLAGER_ANGRY("angryVillager", 20, false), + VILLAGER_HAPPY("happyVillager", 21, false), + TOWN_AURA("townaura", 22, false), + NOTE("note", 23, false), + PORTAL("portal", 24, false), + ENCHANTMENT_TABLE("enchantmenttable", 25, false), + FLAME("flame", 26, false), + LAVA("lava", 27, false), + FOOTSTEP("footstep", 28, false), + CLOUD("cloud", 29, false), + REDSTONE("reddust", 30, false), + SNOWBALL("snowballpoof", 31, false), + SNOW_SHOVEL("snowshovel", 32, false), + SLIME("slime", 33, false), + HEART("heart", 34, false), + BARRIER("barrier", 35, false), + ITEM_CRACK("iconcrack_", 36, false, 2), + BLOCK_CRACK("blockcrack_", 37, false, 1), + BLOCK_DUST("blockdust_", 38, false, 1), + WATER_DROP("droplet", 39, false), + ITEM_TAKE("take", 40, false), + MOB_APPEARANCE("mobappearance", 41, true); + + private final String Q; + private final int R; + private final boolean S; + private final int T; + private static final Map U = Maps.newHashMap(); + private static final String[] V; + + private EnumParticle(String var3, int var4, boolean var5, int var6) { + this.Q = var3; + this.R = var4; + this.S = var5; + this.T = var6; + } + + private EnumParticle(String var3, int var4, boolean var5) { + this(var3, var4, var5, 0); + } + + public static String[] a() { + return V; + } + + public String b() { + return this.Q; + } + + public int c() { + return this.R; + } + + public int d() { + return this.T; + } + + public boolean e() { + return this.S; + } + + public boolean f() { + return this.T > 0; + } + + public static EnumParticle a(int var0) { + return (EnumParticle)U.get(var0); + } + + static { + ArrayList var0 = Lists.newArrayList(); + EnumParticle[] var1 = values(); + int var2 = var1.length; + + for(int var3 = 0; var3 < var2; ++var3) { + EnumParticle var4 = var1[var3]; + U.put(var4.c(), var4); + if (!var4.b().endsWith("_")) { + var0.add(var4.b()); + } + } + + V = (String[])var0.toArray(new String[var0.size()]); + } +} diff --git a/src/main/java/dev/brighten/ac/utils/Helper.java b/src/main/java/dev/brighten/ac/utils/Helper.java index c8bafaa..3e4b259 100644 --- a/src/main/java/dev/brighten/ac/utils/Helper.java +++ b/src/main/java/dev/brighten/ac/utils/Helper.java @@ -1,18 +1,20 @@ package dev.brighten.ac.utils; import dev.brighten.ac.packet.ProtocolVersion; +import dev.brighten.ac.packet.handler.HandlerAbstract; +import dev.brighten.ac.packet.wrapper.objects.EnumParticle; +import dev.brighten.ac.packet.wrapper.out.WPacketPlayOutWorldParticles; import dev.brighten.ac.utils.handlers.PlayerSizeHandler; 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.World; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.util.Vector; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -38,6 +40,114 @@ public class Helper { return PlayerSizeHandler.instance.bounds(player, x, y, z); } + public static void drawRay(RayCollision collision, EnumParticle particle, Collection players) { + for (double i = 0; i < 8; i += 0.2) { + float fx = (float) (collision.originX + (collision.directionX * i)); + float fy = (float) (collision.originY + (collision.directionY * i)); + float fz = (float) (collision.originZ + (collision.directionZ * i)); + + WPacketPlayOutWorldParticles packet = WPacketPlayOutWorldParticles.builder() + .particle(particle) + .x(fx) + .y(fy) + .z(fz) + .offsetX(0) + .offsetY(0) + .offsetZ(0) + .speed(0) + .amount(1) + .longD(true) + .data(new int[0]) + .build(); + players.forEach(p -> HandlerAbstract.getHandler().sendPacket(p, packet)); + } + } + + 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); + Step.GenericStepper z = Step.step((float)box.zMin, 0.241F, (float)box.zMax); + Iterator var6 = x.iterator(); + + while(var6.hasNext()) { + float fx = (Float)var6.next(); + Iterator var8 = y.iterator(); + + label61: + while(var8.hasNext()) { + float fy = (Float)var8.next(); + Iterator var10 = z.iterator(); + + while(true) { + float fz; + int check; + do { + if (!var10.hasNext()) { + continue label61; + } + + fz = (Float)var10.next(); + check = 0; + if (x.first() || x.last()) { + ++check; + } + + if (y.first() || y.last()) { + ++check; + } + + if (z.first() || z.last()) { + ++check; + } + } while(check < 2); + + WPacketPlayOutWorldParticles packet = WPacketPlayOutWorldParticles.builder() + .particle(particle) + .x(fx) + .y(fy) + .z(fz) + .offsetX(0) + .offsetY(0) + .offsetZ(0) + .speed(0) + .amount(1) + .data(new int[0]) + .build(); + + Iterator var14 = players.iterator(); + + while(var14.hasNext()) { + Player p = var14.next(); + HandlerAbstract.getHandler().sendPacket(p, packet); + } + } + } + } + + } + + public static void drawPoint(Vector point, EnumParticle particle, Collection players) { + WPacketPlayOutWorldParticles packet = WPacketPlayOutWorldParticles.builder() + .particle(particle) + .x((float)point.getX()) + .y((float)point.getY()) + .z((float)point.getZ()) + .offsetX(0) + .offsetY(0) + .offsetZ(0) + .speed(0) + .amount(1) + .data(new int[0]) + .build(); + Iterator var4 = players.iterator(); + + while(var4.hasNext()) { + Player p = var4.next(); + HandlerAbstract.getHandler().sendPacket(p, packet); + } + + } + public static SimpleCollisionBox getMovementHitbox(Player player) { return PlayerSizeHandler.instance.bounds(player); } diff --git a/src/main/java/dev/brighten/ac/utils/MathUtils.java b/src/main/java/dev/brighten/ac/utils/MathUtils.java index 50a6324..db3ebc0 100644 --- a/src/main/java/dev/brighten/ac/utils/MathUtils.java +++ b/src/main/java/dev/brighten/ac/utils/MathUtils.java @@ -583,13 +583,12 @@ public class MathUtils { return squareRoot; } - public static Vector getDirection(double yaw, double pitch) { - Vector vector = new Vector(); - vector.setY(-Math.sin(Math.toRadians(pitch))); - double xz = Math.cos(Math.toRadians(pitch)); - vector.setX(-xz * Math.sin(Math.toRadians(yaw))); - vector.setZ(xz * Math.cos(Math.toRadians(yaw))); - return vector; + public static Vector getDirection(float yaw, float pitch) { + float f = MathHelper.cos(-yaw * 0.017453292F - (float)Math.PI); + float f1 = MathHelper.sin(-yaw * 0.017453292F - (float)Math.PI); + float f2 = -MathHelper.cos(-pitch * 0.017453292F); + float f3 = MathHelper.sin(-pitch * 0.017453292F); + return new Vector(f1 * f2, f3, f * f2); } public static float sqrt(float number) { diff --git a/src/main/java/dev/brighten/ac/utils/handlers/PlayerSizeHandler.java b/src/main/java/dev/brighten/ac/utils/handlers/PlayerSizeHandler.java index f149ce6..c86d4eb 100644 --- a/src/main/java/dev/brighten/ac/utils/handlers/PlayerSizeHandler.java +++ b/src/main/java/dev/brighten/ac/utils/handlers/PlayerSizeHandler.java @@ -12,8 +12,6 @@ public interface PlayerSizeHandler { double height(Player player); double width(Player player); - boolean isGliding(Player player); - default SimpleCollisionBox bounds(Player player) { Location l = player.getLocation(); return bounds(player,l.getX(),l.getY(),l.getZ()); diff --git a/src/main/java/dev/brighten/ac/utils/handlers/PlayerSizeHandlerLegacy.java b/src/main/java/dev/brighten/ac/utils/handlers/PlayerSizeHandlerLegacy.java index adf657a..2f6981c 100644 --- a/src/main/java/dev/brighten/ac/utils/handlers/PlayerSizeHandlerLegacy.java +++ b/src/main/java/dev/brighten/ac/utils/handlers/PlayerSizeHandlerLegacy.java @@ -16,11 +16,6 @@ public class PlayerSizeHandlerLegacy implements PlayerSizeHandler { return 0.6; } - @Override - public boolean isGliding(Player player) { - return false; - } - public SimpleCollisionBox bounds(Player player) { Location l = player.getLocation(); return new SimpleCollisionBox().offset(l.getX(), l.getY(), l.getZ()).expand(.3,0,.3).expandMax(0,1.8,0); diff --git a/src/main/java/dev/brighten/ac/utils/handlers/PlayerSizeHandlerModern.java b/src/main/java/dev/brighten/ac/utils/handlers/PlayerSizeHandlerModern.java index 8daa219..53f6d63 100644 --- a/src/main/java/dev/brighten/ac/utils/handlers/PlayerSizeHandlerModern.java +++ b/src/main/java/dev/brighten/ac/utils/handlers/PlayerSizeHandlerModern.java @@ -33,12 +33,6 @@ public class PlayerSizeHandlerModern implements PlayerSizeHandler { return (double) width.invoke(player); } - @Override - @SneakyThrows - public boolean isGliding(Player player) { - return (boolean) gliding.invoke(player); - } - @SneakyThrows public SimpleCollisionBox bounds(Player player) { Location l = player.getLocation(); diff --git a/src/main/java/dev/brighten/ac/utils/world/CollisionBox.java b/src/main/java/dev/brighten/ac/utils/world/CollisionBox.java index bc3d899..8826a82 100644 --- a/src/main/java/dev/brighten/ac/utils/world/CollisionBox.java +++ b/src/main/java/dev/brighten/ac/utils/world/CollisionBox.java @@ -1,6 +1,8 @@ package dev.brighten.ac.utils.world; +import dev.brighten.ac.packet.wrapper.objects.EnumParticle; import dev.brighten.ac.utils.world.types.SimpleCollisionBox; +import org.bukkit.entity.Player; import java.util.List; @@ -11,6 +13,7 @@ public interface CollisionBox { CollisionBox offset(double x, double y, double z); CollisionBox shrink(double x, double y, double z); CollisionBox expand(double x, double y, double z); + void draw(EnumParticle particle, Player... players); void downCast(List list); boolean isNull(); } \ No newline at end of file diff --git a/src/main/java/dev/brighten/ac/utils/world/types/ComplexCollisionBox.java b/src/main/java/dev/brighten/ac/utils/world/types/ComplexCollisionBox.java index 19cf335..8d1e96c 100644 --- a/src/main/java/dev/brighten/ac/utils/world/types/ComplexCollisionBox.java +++ b/src/main/java/dev/brighten/ac/utils/world/types/ComplexCollisionBox.java @@ -1,6 +1,8 @@ package dev.brighten.ac.utils.world.types; +import dev.brighten.ac.packet.wrapper.objects.EnumParticle; import dev.brighten.ac.utils.world.CollisionBox; +import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.Collections; @@ -56,6 +58,12 @@ public class ComplexCollisionBox implements CollisionBox { return this; } + @Override + public void draw(EnumParticle particle, Player... players) { + for (CollisionBox b : boxes) + b.draw(particle,players); + } + @Override public void downCast(List list) { for (CollisionBox box : boxes) diff --git a/src/main/java/dev/brighten/ac/utils/world/types/DynamicCollisionBox.java b/src/main/java/dev/brighten/ac/utils/world/types/DynamicCollisionBox.java index 4edd885..3fa04da 100644 --- a/src/main/java/dev/brighten/ac/utils/world/types/DynamicCollisionBox.java +++ b/src/main/java/dev/brighten/ac/utils/world/types/DynamicCollisionBox.java @@ -1,9 +1,11 @@ package dev.brighten.ac.utils.world.types; import dev.brighten.ac.packet.ProtocolVersion; +import dev.brighten.ac.packet.wrapper.objects.EnumParticle; import dev.brighten.ac.utils.world.CollisionBox; import lombok.Setter; import org.bukkit.block.Block; +import org.bukkit.entity.Player; import java.util.List; @@ -55,6 +57,11 @@ public class DynamicCollisionBox implements CollisionBox { return this; } + @Override + public void draw(EnumParticle particle, Player... players) { + box.fetch(version, block).offset(x,y,z).draw(particle,players); + } + @Override public void downCast(List list) { box.fetch(version,block).offset(x,y,z).downCast(list); diff --git a/src/main/java/dev/brighten/ac/utils/world/types/NoCollisionBox.java b/src/main/java/dev/brighten/ac/utils/world/types/NoCollisionBox.java index e94dd9a..be65d58 100644 --- a/src/main/java/dev/brighten/ac/utils/world/types/NoCollisionBox.java +++ b/src/main/java/dev/brighten/ac/utils/world/types/NoCollisionBox.java @@ -1,6 +1,8 @@ package dev.brighten.ac.utils.world.types; +import dev.brighten.ac.packet.wrapper.objects.EnumParticle; import dev.brighten.ac.utils.world.CollisionBox; +import org.bukkit.entity.Player; import java.util.List; @@ -35,6 +37,11 @@ public class NoCollisionBox implements CollisionBox { return this; } + @Override + public void draw(EnumParticle particle, Player... players) { + + } + @Override public void downCast(List list) { /**/ } diff --git a/src/main/java/dev/brighten/ac/utils/world/types/RayCollision.java b/src/main/java/dev/brighten/ac/utils/world/types/RayCollision.java index 7557907..acd8ff0 100644 --- a/src/main/java/dev/brighten/ac/utils/world/types/RayCollision.java +++ b/src/main/java/dev/brighten/ac/utils/world/types/RayCollision.java @@ -1,7 +1,9 @@ package dev.brighten.ac.utils.world.types; import dev.brighten.ac.packet.ProtocolVersion; +import dev.brighten.ac.packet.wrapper.objects.EnumParticle; import dev.brighten.ac.utils.BlockUtils; +import dev.brighten.ac.utils.Helper; import dev.brighten.ac.utils.Materials; import dev.brighten.ac.utils.Tuple; import dev.brighten.ac.utils.math.RayTrace; @@ -13,9 +15,11 @@ import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; import org.bukkit.util.Vector; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class RayCollision implements CollisionBox { @@ -130,6 +134,11 @@ public class RayCollision implements CollisionBox { return this; } + @Override + public void draw(EnumParticle particle, Player... players) { + Helper.drawRay(this, particle, Arrays.asList(players)); + } + public List boxesOnRay(World world, double distance) { int amount = Math.round((float) (distance / 0.5)); diff --git a/src/main/java/dev/brighten/ac/utils/world/types/SimpleCollisionBox.java b/src/main/java/dev/brighten/ac/utils/world/types/SimpleCollisionBox.java index b79f775..34846a5 100644 --- a/src/main/java/dev/brighten/ac/utils/world/types/SimpleCollisionBox.java +++ b/src/main/java/dev/brighten/ac/utils/world/types/SimpleCollisionBox.java @@ -1,12 +1,16 @@ package dev.brighten.ac.utils.world.types; +import dev.brighten.ac.packet.wrapper.objects.EnumParticle; import dev.brighten.ac.utils.BoundingBox; +import dev.brighten.ac.utils.Helper; import dev.brighten.ac.utils.KLocation; import dev.brighten.ac.utils.reflections.impl.MinecraftReflection; import dev.brighten.ac.utils.world.CollisionBox; import org.bukkit.Location; +import org.bukkit.entity.Player; import org.bukkit.util.Vector; +import java.util.Arrays; import java.util.List; public class SimpleCollisionBox implements CollisionBox { @@ -155,6 +159,11 @@ public class SimpleCollisionBox implements CollisionBox { return this; } + @Override + public void draw(EnumParticle particle, Player... players) { + Helper.drawCuboid(copy().expand(0.025), particle, Arrays.asList(players)); + } + public SimpleCollisionBox expand(double value) { this.xMin -= value; this.yMin -= value;