Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions Anticheat/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@
</properties>

<repositories>
<repository>
<id>maven-central</id>
<url>https://nexus.funkemunky.cc/repository/maven-central/</url>
</repository>
<repository>
<id>viaversion-repo</id>
<url>https://repo.viaversion.com</url>
Expand All @@ -27,10 +31,6 @@
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>evokegames</id>
<url>https://maven.evokegames.gg/snapshots</url>
</repository>
<repository>
<id>aikar</id>
<url>https://repo.aikar.co/content/groups/aikar/</url>
Expand Down Expand Up @@ -267,7 +267,7 @@
<dependency>
<groupId>com.github.retrooper</groupId>
<artifactId>packetevents-spigot</artifactId>
<version>2.9.4</version>
<version>2.11.1</version>
<scope>compile</scope>
</dependency>
<dependency>
Expand Down
8 changes: 7 additions & 1 deletion Anticheat/src/main/java/dev/brighten/ac/Anticheat.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
import dev.brighten.ac.handler.entity.FakeEntityTracker;
import dev.brighten.ac.handler.keepalive.KeepaliveProcessor;
import dev.brighten.ac.handler.keepalive.actions.ActionManager;
import dev.brighten.ac.handler.protocol.Protocol;
import dev.brighten.ac.handler.protocol.impl.NoAPI;
import dev.brighten.ac.logging.LoggerManager;
import dev.brighten.ac.utils.*;
import dev.brighten.ac.utils.annotation.ConfigSetting;
Expand All @@ -30,6 +32,7 @@
import dev.brighten.ac.utils.world.WorldInfo;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.PackagePrivate;
import org.bukkit.Bukkit;
import org.bukkit.World;
Expand Down Expand Up @@ -116,6 +119,9 @@ public class Anticheat extends JavaPlugin {
private final RollingAverageDouble tps = new RollingAverageDouble(4, 20);
private final Map<UUID, WorldInfo> worldInfoMap = new HashMap<>();

@Setter
private Protocol protocol = new NoAPI();

private final List<BaseCommand> commands = new ArrayList<>();

public static boolean allowDebug = true;
Expand Down Expand Up @@ -252,7 +258,7 @@ public void onDisable() {
} catch (IllegalStateException e) {
Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "Check ID unregister failed", e);
}
commandManager.getScheduler().cancelLocaleTask();

Copilot AI Feb 20, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed call to commandManager.getScheduler().cancelLocaleTask() without explanation. This could cause resource leaks if the locale task is not properly cancelled on plugin disable.

Suggested change
// Ensure any scheduled locale task is cancelled on plugin disable
commandManager.getScheduler().cancelLocaleTask();

Copilot uses AI. Check for mistakes.
commandPropertiesManager = null;

try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,5 @@
int punishVl() default 10;

ClientVersion minVersion() default ClientVersion.V_1_8;
ClientVersion maxVersion() default ClientVersion.V_1_21_7;
ClientVersion maxVersion() default ClientVersion.V_1_21_11;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
import com.github.retrooper.packetevents.protocol.particle.type.ParticleTypes;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.util.Vector3d;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerFlying;
import dev.brighten.ac.Anticheat;
Expand All @@ -19,7 +20,6 @@
import dev.brighten.ac.utils.timer.impl.TickTimer;
import dev.brighten.ac.utils.world.EntityData;
import dev.brighten.ac.utils.world.types.SimpleCollisionBox;
import org.bukkit.util.Vector;

import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
Expand All @@ -46,7 +46,7 @@ public Hitbox(APlayer player) {
if(packet.getAction() != WrapperPlayClientInteractEntity.InteractAction.ATTACK)
return;

Optional<TrackedEntity> entity = player.getEntityLocationHandler().getTrackedEntity(packet.getEntityId());
Optional<TrackedEntity> entity = player.getWorldTracker().getCurrentWorld().get().getTrackedEntity(packet.getEntityId());
if(entity.isEmpty() || !allowedEntityTypes.contains(entity.get().getEntityType())) return;

attacks.add(new Tuple<>(entity.get(),
Expand Down Expand Up @@ -118,15 +118,15 @@ public Hitbox(APlayer player) {
boolean didSneakOrElytra = player.getInfo().getLastSneak().isNotPassed(40)
|| player.getInfo().getLastElytra().isNotPassed(40);

List<Vector> directions = new ArrayList<>(Arrays.asList(MathUtils.getDirection(
List<Vector3d> directions = new ArrayList<>(Arrays.asList(MathUtils.getDirection(
player.getMovement().getTo().getLoc().getYaw(),
player.getMovement().getTo().getLoc().getPitch()),
MathUtils.getDirection(player.getMovement().getFrom().getLoc().getYaw(),
player.getMovement().getTo().getLoc().getPitch())));

if(!didSneakOrElytra) {
to.add(0, 1.62f, 0);
for (Vector direction : directions) {
for (Vector3d direction : directions) {
for (SimpleCollisionBox targetBox : boxes) {
final AxisAlignedBB vanillaBox = new AxisAlignedBB(targetBox);

Expand All @@ -143,7 +143,7 @@ public Hitbox(APlayer player) {
}
//Checking all possible eyeheights since client actions notoriously desync from the server side
} else {
for (Vector direction : directions) {
for (Vector3d direction : directions) {
for (double eyeHeight : player.getMovement().getEyeHeights()) {
for (SimpleCollisionBox targetBox : boxes) {
final AxisAlignedBB vanillaBox = new AxisAlignedBB(targetBox);
Expand Down Expand Up @@ -180,7 +180,7 @@ public Hitbox(APlayer player) {

debug("buffer: %.3f distance=%.2f hits=%s sneaking=%s", buffer, distance, hits,
player.getInfo().isSneaking());
} else if(player.getEntityLocationHandler().streak > 1) {
} else if(player.getEntityTrackHandler().streak > 1) {
if (++hbuffer > 5) {
flag("%.1f;%.1f;%.1f", entity.getNewEntityLocation().x, entity.getNewEntityLocation().y, entity.getNewEntityLocation().z);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package dev.brighten.ac.check.impl.combat.killaura;

import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientAnimation;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity;
import dev.brighten.ac.api.check.CheckType;
Expand Down Expand Up @@ -29,10 +28,10 @@ public KABot(APlayer player) {

@Bind
WAction<WrapperPlayClientInteractEntity> packet = packet -> {
val optional = player.getEntityLocationHandler().getTrackedEntity(packet.getEntityId());
val optional = player.getWorldTracker().getCurrentWorld().get().getTrackedEntity(packet.getEntityId());

if(optional.isPresent()
&& (player.getEntityLocationHandler().clientHasEntity.get()
&& (player.getEntityTrackHandler().clientHasEntity.get()
|| !optional.get().getFakeMobs().isEmpty())) {
if(++buffer > 3) {
flag("Attacked player without attacking bot!");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package dev.brighten.ac.check.impl.combat.killaura;

import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.util.Vector3d;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity;
import dev.brighten.ac.api.check.CheckType;
import dev.brighten.ac.check.Check;
Expand All @@ -13,7 +13,6 @@
import dev.brighten.ac.utils.world.EntityData;
import dev.brighten.ac.utils.world.types.RayCollision;
import dev.brighten.ac.utils.world.types.SimpleCollisionBox;
import org.bukkit.util.Vector;

/**
* @author funkemunky
Expand Down Expand Up @@ -43,14 +42,13 @@ public KATrace(APlayer player) {
return;
}

var trackedEntity = player.getEntityLocationHandler().getTrackedEntity(player.getInfo().getTarget().getEntityId());
var trackedEntity = player.getWorldTracker().getCurrentWorld().get().getTrackedEntity(player.getInfo().getTarget().getEntityId());

if(trackedEntity.isEmpty()) {
return;
}
// Getting the target's bounding box
SimpleCollisionBox targetBox = (SimpleCollisionBox) EntityData.getEntityBox(player.getInfo().getTarget()
.getLocation(), trackedEntity.get());
SimpleCollisionBox targetBox = (SimpleCollisionBox) EntityData.getEntityBox(player.getInfo().getTarget().getLocation(), trackedEntity.get());

if(targetBox == null) return;

Expand All @@ -59,12 +57,12 @@ public KATrace(APlayer player) {
// Setting the player's eye height based on their sneak status
origin.add(0, player.getEyeHeight(), 0);

final Vector originVec = origin.toVector();
final Vector3d originVec = origin.toVector();

// Setting a trace based on their view direction
RayCollision collision = new RayCollision(originVec, origin.getDirection());

Vector targetPoint = collision.collisionPoint(targetBox);
Vector3d targetPoint = collision.collisionPoint(targetBox);
//If the ray isn't collided, we might as well not run this check. Just a simple boxes on array check
if(targetPoint == null) return;

Expand All @@ -84,7 +82,7 @@ public KATrace(APlayer player) {
continue;

// We want to shrink the box slightly since there is a bit of a margin of error in the ray trace.
Vector point = collision.collisionPoint(box.copy().shrink(0.005f, 0.005f, 0.005f));
Vector3d point = collision.collisionPoint(box.copy().shrink(0.005f, 0.005f, 0.005f));

if (point != null && originVec.distanceSquared(point) < dist - 0.2) {
rayCollidedOnBlock = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public KACalc(APlayer player) {
@Bind
WAction<WrapperPlayClientPlayerFlying> flying = packet -> {
if(player.getInfo().getTarget() == null || player.getInfo().lastAttack.isPassed(40)) return;
Optional<TrackedEntity> optional = player.getEntityLocationHandler()
Optional<TrackedEntity> optional = player.getWorldTracker().getCurrentWorld().get()
.getTrackedEntity(player.getInfo().getTarget().getEntityId());

if(optional.isEmpty()) return;
Expand All @@ -46,7 +46,7 @@ public KACalc(APlayer player) {
KLocation originKLoc = player.getMovement().getTo().getLoc().clone()
.add(0, player.getInfo().isSneaking() ? 1.54f : 1.62f, 0);

double halfHeight = player.getInfo().getTarget().getEyeHeight() / 2;
double halfHeight = player.getInfo().getTarget().getPose().eyeHeight / 2;
KLocation targetLocation = new KLocation(current.getX(), current.getY(), current.getZ());
var rotations = MathUtils
.getRotation(originKLoc, targetLocation.clone().add(0, halfHeight, 0));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.brighten.ac.check.impl.movement;

import com.github.retrooper.packetevents.protocol.teleport.RelativeFlag;
import com.github.retrooper.packetevents.util.Vector3d;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerFlying;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerPlayerPositionAndLook;
import dev.brighten.ac.Anticheat;
Expand All @@ -18,7 +19,6 @@
import dev.brighten.ac.utils.objects.evicting.EvictingSet;
import dev.brighten.ac.utils.world.types.SimpleCollisionBox;
import org.bukkit.Location;
import org.bukkit.util.Vector;

import java.util.List;
import java.util.Set;
Expand All @@ -31,7 +31,7 @@ public Phase(APlayer player) {
}

private int ticks;
private final Set<Vector> POSITIONS = new EvictingSet<>(10);
private final Set<Vector3d> POSITIONS = new EvictingSet<>(10);
private Location teleportLoc = null;

@Bind
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.brighten.ac.check.impl.movement.speed;

import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.potion.PotionTypes;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerFlying;
import dev.brighten.ac.api.check.CheckType;
import dev.brighten.ac.check.Check;
Expand Down Expand Up @@ -36,11 +37,11 @@ public class Speed extends Check {

moveFactor+= (float) (moveFactor * 0.30000001192092896D);

if(player.getPotionHandler().hasPotionEffect(PotionEffectType.SPEED))
if(player.getPotionHandler().hasPotionEffect(PotionTypes.SPEED))
moveFactor += (float) ((PlayerUtils.getPotionEffectLevel(player.getBukkitPlayer(), PotionEffectType.SPEED)
* (0.200000000298023224D)) * moveFactor);

if(player.getPotionHandler().hasPotionEffect(PotionEffectType.SLOW))
if(player.getPotionHandler().hasPotionEffect(PotionTypes.SLOWNESS))
moveFactor += (float) ((PlayerUtils.getPotionEffectLevel(player.getBukkitPlayer(), PotionEffectType.SLOW)
* (-0.15000000596046448D)) * moveFactor);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package dev.brighten.ac.check.impl.movement.velocity;

import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.potion.PotionTypes;
import com.github.retrooper.packetevents.util.Vector3i;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerFlying;
import dev.brighten.ac.api.check.CheckType;
import dev.brighten.ac.check.Check;
Expand All @@ -12,12 +14,10 @@
import dev.brighten.ac.utils.KLocation;
import dev.brighten.ac.utils.MathUtils;
import dev.brighten.ac.utils.annotation.Bind;
import dev.brighten.ac.utils.math.IntVector;
import dev.brighten.ac.utils.timer.Timer;
import dev.brighten.ac.utils.timer.impl.TickTimer;
import lombok.val;
import me.hydro.emulator.util.mcp.MathHelper;
import org.bukkit.potion.PotionEffectType;

import java.util.ArrayList;
import java.util.List;
Expand Down Expand Up @@ -61,8 +61,8 @@ public VelocityB(APlayer player) {
val underBlockLoc = previousFrom != null
? player.getMovement().getFrom().getLoc() : player.getMovement().getTo().getLoc();

WrappedBlock underMaterial = player.getBlockUpdateHandler()
.getBlock(new IntVector(MathHelper.floor_double(underBlockLoc.getX()),
WrappedBlock underMaterial = player.getWorldTracker()
.getBlock(new Vector3i(MathHelper.floor_double(underBlockLoc.getX()),
MathHelper.floor_double(underBlockLoc.getY() - 1),
MathHelper.floor_double(underBlockLoc.getZ())));

Expand All @@ -87,8 +87,8 @@ public VelocityB(APlayer player) {
double pmotionx = 0, pmotionz = 0;
boolean onGround = player.getMovement().getFrom().isOnGround();

val speed = player.getPotionHandler().getEffectByType(PotionEffectType.SPEED);
val slow = player.getPotionHandler().getEffectByType(PotionEffectType.SLOW);
val speed = player.getPotionHandler().getEffectByType(PotionTypes.SPEED);
val slow = player.getPotionHandler().getEffectByType(PotionTypes.SLOWNESS);

for (Iteration iteration : iterations) {
float forward = iteration.f, strafe = iteration.s;
Expand Down Expand Up @@ -138,9 +138,9 @@ public VelocityB(APlayer player) {
aiMoveSpeed += aiMoveSpeed * 0.30000001192092896D;

if (speed.isPresent())
aiMoveSpeed += (speed.get().getAmplifier() + 1) * 0.20000000298023224D * aiMoveSpeed;
aiMoveSpeed += (speed.get().properties().amplifier() + 1) * 0.20000000298023224D * aiMoveSpeed;
if (slow.isPresent())
aiMoveSpeed += (slow.get().getAmplifier() + 1) * -0.15000000596046448D * aiMoveSpeed;
aiMoveSpeed += (slow.get().properties().amplifier() + 1) * -0.15000000596046448D * aiMoveSpeed;

float f5;
if (onGround) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.brighten.ac.check.impl.world;

import com.github.retrooper.packetevents.util.Vector3d;
import com.github.retrooper.packetevents.util.Vector3i;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerBlockPlacement;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerFlying;
import dev.brighten.ac.api.check.CheckType;
Expand Down Expand Up @@ -35,7 +36,7 @@ public BlockA(APlayer player) {
WAction<WrapperPlayClientPlayerBlockPlacement> blockPlace = packet -> {
Vector3d loc = packet.getBlockPosition().toVector3d();

WrappedBlock block = player.getBlockUpdateHandler().getBlock(loc);
WrappedBlock block = player.getWorldTracker().getBlock(new Vector3i(MathUtils.floor(loc.getX()), MathUtils.floor(loc.getY()), MathUtils.floor(loc.getZ())));

CollisionBox box = BlockData.getData(block.getType()).getBox(player, block, player.getPlayerVersion());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@
import dev.brighten.ac.handler.block.WrappedBlock;
import dev.brighten.ac.utils.KLocation;
import dev.brighten.ac.utils.annotation.Bind;
import dev.brighten.ac.utils.math.IntVector;
import dev.brighten.ac.utils.timer.Timer;
import dev.brighten.ac.utils.timer.impl.TickTimer;
import dev.brighten.ac.utils.world.BlockData;

import java.util.*;
import java.util.HashMap;
import java.util.Map;

@CheckData(name = "Block (D)", checkId = "blockc", type = CheckType.INTERACT)
public class BlockD extends Check {
Expand All @@ -45,7 +45,7 @@ public BlockD(APlayer player) {
packet.getFace().getModY(),
packet.getFace().getModZ());

WrappedBlock block = new WrappedBlock(new IntVector(packet.getBlockPosition()),
WrappedBlock block = new WrappedBlock(packet.getBlockPosition(),
placedType,
WrappedBlockState.getDefaultState(placedType));
blockPlaceLocations.put(blockpos, block);
Expand Down
Loading
Loading