Fixing stuff not working

This commit is contained in:
Dawson
2022-08-16 11:46:39 -04:00
parent 20978a30e1
commit bf0fb79547
42 changed files with 667 additions and 224 deletions
+14 -4
View File
@@ -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;
@@ -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<Vector> 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!");
}
}
}
@@ -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();
}
}
@@ -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());
}
}
}
@@ -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();
}
@@ -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<Double> 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<Tuple<Double[], Double[]>> 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<Tuple<Double[], Double[]>> 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<Tuple<Double[],Double[]>> 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<Double[], Double[]> 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<Tuple<Double[],Double[]>> 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<Double[], Double[]> 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) {
@@ -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());
}
}
}
@@ -67,6 +67,8 @@ public class APlayer {
@Getter
private Object playerConnection;
public int hitsToCancel;
public final Map<Short, Tuple<InstantAction, Consumer<InstantAction>>> instantTransaction = new HashMap<>();
public final List<NormalAction> keepAliveStamps = new ArrayList<>();
@@ -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)) {
@@ -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<Block> 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<Entity> nearbyEntities = Collections.emptyList();
private PastLocation targetPastLocation = new PastLocation();
private KLocation lastKnownGoodPosition;
private List<Vector> velocityHistory = Collections.synchronizedList(new EvictingList<>(5));
}
@@ -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<KLocation> 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;
}
}
}
}
@@ -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();
});
@@ -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;
@@ -33,6 +33,8 @@ public class BlockUpdateHandler {
public void onPlace(WPacketPlayInBlockPlace place) {
if(!place.getItemStack().getType().isBlock()) return;
player.getInfo().getLastPlace().reset();
Deque<Material> possible = getPossibleMaterials(place.getBlockPos());
possible.add(place.getItemStack().getType());
}
@@ -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> 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());
}
@@ -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
@@ -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
@@ -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;
}
@@ -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);
}
@@ -1,6 +1,7 @@
package dev.brighten.ac.packet.wrapper;
public interface WPacket {
PacketType getPacketType();
Object getPacket();
}
@@ -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 {
@@ -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),
@@ -15,4 +15,9 @@ public class WPacketPlayInAbilities implements WPacket {
public PacketType getPacketType() {
return PacketType.CLIENT_ABILITIES;
}
@Override
public Object getPacket() {
return null;
}
}
@@ -15,4 +15,9 @@ public class WPacketPlayInArmAnimation implements WPacket {
public PacketType getPacketType() {
return PacketType.ARM_ANIMATION;
}
}
@Override
public Object getPacket() {
return null;
}
}
@@ -20,6 +20,11 @@ public class WPacketPlayInBlockDig implements WPacket {
return PacketType.BLOCK_DIG;
}
@Override
public Object getPacket() {
return null;
}
public enum EnumDirection {
DOWN,
UP,
@@ -21,4 +21,9 @@ public class WPacketPlayInBlockPlace implements WPacket {
public PacketType getPacketType() {
return PacketType.BLOCK_PLACE;
}
@Override
public Object getPacket() {
return null;
}
}
@@ -15,4 +15,9 @@ public class WPacketPlayInCloseWindow implements WPacket {
public PacketType getPacketType() {
return PacketType.CLIENT_CLOSE_WINDOW;
}
@Override
public Object getPacket() {
return null;
}
}
@@ -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,
@@ -16,4 +16,9 @@ public class WPacketPlayInFlying implements WPacket {
public PacketType getPacketType() {
return PacketType.FLYING;
}
@Override
public Object getPacket() {
return null;
}
}
@@ -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;
}
@@ -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<Integer, EnumParticle> 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()]);
}
}
+113 -3
View File
@@ -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<? extends Player> 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<? extends Player> players) {
Step.GenericStepper<Float> x = Step.step((float)box.xMin, 0.241F, (float)box.xMax);
Step.GenericStepper<Float> y = Step.step((float)box.yMin, 0.241F, (float)box.yMax);
Step.GenericStepper<Float> 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<? extends Player> var14 = players.iterator();
while(var14.hasNext()) {
Player p = var14.next();
HandlerAbstract.getHandler().sendPacket(p, packet);
}
}
}
}
}
public static void drawPoint(Vector point, EnumParticle particle, Collection<? extends Player> 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<? extends Player> 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);
}
@@ -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) {
@@ -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());
@@ -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);
@@ -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();
@@ -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<SimpleCollisionBox> list);
boolean isNull();
}
@@ -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<SimpleCollisionBox> list) {
for (CollisionBox box : boxes)
@@ -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<SimpleCollisionBox> list) {
box.fetch(version,block).offset(x,y,z).downCast(list);
@@ -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<SimpleCollisionBox> list) { /**/ }
@@ -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<CollisionBox> boxesOnRay(World world, double distance) {
int amount = Math.round((float) (distance / 0.5));
@@ -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;