mirror of
https://github.com/funkemunky/KauriV3.git
synced 2026-06-02 06:22:18 +00:00
Fixing stuff not working
This commit is contained in:
@@ -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()]);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user