XeroAntiCheat v1.0.8 bug fixes

- SpiderCheck: fixed Location mutation bug - bodyBlock was reading y-1 (same as feetBlock) and headBlock was reading y instead of y+1. Now uses block coordinates directly.
- ConfigManager: decay task no longer reads YamlConfiguration from background thread. decayRate is now volatile and refreshed on reload from main thread only.
- JesusCheck, SpeedCheck, NoFallCheck: loc.subtract() now uses .clone() to prevent silent Location mutation.
- VelocityCheck: decrementVelocityCheckTicks() moved past the minExpected threshold check to avoid consuming a tick on packets that are immediately discarded.
This commit is contained in:
2026-03-15 03:39:39 -03:00
parent 71daf9ffc1
commit daccfedae6
23 changed files with 866 additions and 22 deletions

57
.classpath Normal file
View File

@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-21">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="target/generated-sources/annotations">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="target/generated-test-sources/test-annotations">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>

52
.factorypath Normal file
View File

@@ -0,0 +1,52 @@
<factorypath>
<factorypathentry kind="VARJAR" id="M2_REPO/io/papermc/paper/paper-api/1.21.1-R0.1-SNAPSHOT/paper-api-1.21.1-R0.1-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/com/mojang/brigadier/1.2.9/brigadier-1.2.9.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/32.1.2-jre/guava-32.1.2-jre.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/com/google/errorprone/error_prone_annotations/2.18.0/error_prone_annotations-2.18.0.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/com/google/j2objc/j2objc-annotations/2.8/j2objc-annotations-2.8.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/net/md-5/bungeecord-chat/1.20-R0.2-deprecated+build.18/bungeecord-chat-1.20-R0.2-deprecated+build.18.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/2.2/snakeyaml-2.2.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/joml/joml/1.10.5/joml-1.10.5.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/it/unimi/dsi/fastutil/8.5.6/fastutil-8.5.6.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-api/2.17.1/log4j-api-2.17.1.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/2.0.9/slf4j-api-2.0.9.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/maven/maven-resolver-provider/3.9.6/maven-resolver-provider-3.9.6.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/maven/maven-model/3.9.6/maven-model-3.9.6.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/maven/maven-model-builder/3.9.6/maven-model-builder-3.9.6.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/codehaus/plexus/plexus-interpolation/1.26/plexus-interpolation-1.26.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/maven/maven-artifact/3.9.6/maven-artifact-3.9.6.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/maven/maven-builder-support/3.9.6/maven-builder-support-3.9.6.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/eclipse/sisu/org.eclipse.sisu.inject/0.9.0.M2/org.eclipse.sisu.inject-0.9.0.M2.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/maven/maven-repository-metadata/3.9.6/maven-repository-metadata-3.9.6.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/maven/resolver/maven-resolver-api/1.9.18/maven-resolver-api-1.9.18.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/maven/resolver/maven-resolver-spi/1.9.18/maven-resolver-spi-1.9.18.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/maven/resolver/maven-resolver-util/1.9.18/maven-resolver-util-1.9.18.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/maven/resolver/maven-resolver-impl/1.9.18/maven-resolver-impl-1.9.18.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/maven/resolver/maven-resolver-named-locks/1.9.18/maven-resolver-named-locks-1.9.18.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/codehaus/plexus/plexus-utils/3.5.1/plexus-utils-3.5.1.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/javax/inject/javax.inject/1/javax.inject-1.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/jspecify/jspecify/1.0.0/jspecify-1.0.0.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/net/kyori/adventure-api/4.17.0/adventure-api-4.17.0.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/net/kyori/adventure-key/4.17.0/adventure-key-4.17.0.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/net/kyori/examination-api/1.3.0/examination-api-1.3.0.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/net/kyori/examination-string/1.3.0/examination-string-1.3.0.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/jetbrains/annotations/24.1.0/annotations-24.1.0.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/net/kyori/adventure-text-minimessage/4.17.0/adventure-text-minimessage-4.17.0.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/net/kyori/adventure-text-serializer-gson/4.17.0/adventure-text-serializer-gson-4.17.0.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/net/kyori/adventure-text-serializer-json/4.17.0/adventure-text-serializer-json-4.17.0.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/net/kyori/option/1.0.0/option-1.0.0.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/com/google/auto/service/auto-service-annotations/1.1.1/auto-service-annotations-1.1.1.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/net/kyori/adventure-text-serializer-legacy/4.17.0/adventure-text-serializer-legacy-4.17.0.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/net/kyori/adventure-text-serializer-plain/4.17.0/adventure-text-serializer-plain-4.17.0.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/net/kyori/adventure-text-logger-slf4j/4.17.0/adventure-text-logger-slf4j-4.17.0.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/checkerframework/checker-qual/3.33.0/checker-qual-3.33.0.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/ow2/asm/asm/9.7.1/asm-9.7.1.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/ow2/asm/asm-commons/9.7.1/asm-commons-9.7.1.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/org/ow2/asm/asm-tree/9.7.1/asm-tree-9.7.1.jar" enabled="true" runInBatchMode="false"/>
</factorypath>

3
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

34
.project Normal file
View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>xeroanticheat</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
<filteredResources>
<filter>
<id>1773547794034</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>

View File

@@ -0,0 +1,4 @@
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/main/resources=UTF-8
encoding/<project>=UTF-8

View File

@@ -0,0 +1,4 @@
eclipse.preferences.version=1
org.eclipse.jdt.apt.aptEnabled=true
org.eclipse.jdt.apt.genSrcDir=target/generated-sources/annotations
org.eclipse.jdt.apt.genTestSrcDir=target/generated-test-sources/test-annotations

View File

@@ -0,0 +1,9 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=21
org.eclipse.jdt.core.compiler.compliance=21
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
org.eclipse.jdt.core.compiler.processAnnotations=enabled
org.eclipse.jdt.core.compiler.release=disabled
org.eclipse.jdt.core.compiler.source=21

View File

@@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

View File

@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xeroth</groupId>
<artifactId>xeroanticheat</artifactId>
<name>XeroAntiCheat</name>
<version>1.0.8</version>
<description>Lightweight, accurate anti-cheat for Paper 1.21.x</description>
<build>
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
</resource>
</resources>
<finalName>${project.name}</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<source>21</source>
<target>21</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>net.kyori.adventure</pattern>
<shadedPattern>com.xeroth.xeroanticheat.adventure</shadedPattern>
</relocation>
<relocation>
<pattern>org.sqlite</pattern>
<shadedPattern>com.xeroth.xeroanticheat.sqlite</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>papermc</id>
<url>https://repo.papermc.io/repository/maven-public/</url>
</repository>
<repository>
<id>dmulloy2-repo</id>
<url>https://repo.dmulloy2.net/repository/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.21.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.comphenix.protocol</groupId>
<artifactId>ProtocolLib</artifactId>
<version>5.3.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.target>21</maven.compiler.target>
<maven.compiler.source>21</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

View File

@@ -6,7 +6,7 @@
<groupId>com.xeroth</groupId>
<artifactId>xeroanticheat</artifactId>
<version>1.0.7</version>
<version>1.0.8</version>
<packaging>jar</packaging>
<name>XeroAntiCheat</name>

View File

@@ -231,6 +231,8 @@ public final class XeroAntiCheat extends JavaPlugin {
public void reload() {
configManager.loadConfig();
violationManager.clearAll();
violationManager.setDecayRate(
configManager.getDouble("violation.decay_rate", 0.5));
getLogger().info("Configuration reloaded!");
}

View File

@@ -34,8 +34,6 @@ public class VelocityCheck extends Check {
Vector expected = data.getLastServerVelocity();
if (expected == null || data.getVelocityCheckTicks() <= 0) return;
data.decrementVelocityCheckTicks();
double expectedHorizontal = Math.sqrt(
expected.getX() * expected.getX() + expected.getZ() * expected.getZ());
@@ -45,6 +43,8 @@ public class VelocityCheck extends Check {
return;
}
data.decrementVelocityCheckTicks();
PlayerData.PositionSnapshot curr = data.getLastPosition();
PlayerData.PositionSnapshot prev = data.getSecondLastPosition();
if (curr == null || prev == null) return;

View File

@@ -37,7 +37,7 @@ public class JesusCheck extends Check {
// Get block below player
Location loc = player.getLocation();
Material blockBelow = loc.subtract(0, 1, 0).getBlock().getType();
Material blockBelow = loc.clone().subtract(0, 1, 0).getBlock().getType();
// Check if player is on water or lava
boolean onWater = blockBelow == Material.WATER;

View File

@@ -54,7 +54,7 @@ public class NoFallCheck extends Check {
// Check for damage-reducing blocks
Location loc = player.getLocation();
Material blockBelow = loc.subtract(0, 1, 0).getBlock().getType();
Material blockBelow = loc.clone().subtract(0, 1, 0).getBlock().getType();
// Blocks that reduce/cancel fall damage
if (blockBelow == Material.WATER ||

View File

@@ -130,7 +130,7 @@ public class SpeedCheck extends Check {
// Soul sand slows
Location loc = player.getLocation();
Material blockBelow = loc.subtract(0, 1, 0).getBlock().getType();
Material blockBelow = loc.clone().subtract(0, 1, 0).getBlock().getType();
if (blockBelow == Material.SOUL_SAND || blockBelow == Material.SOUL_SOIL) {
baseSpeed *= 0.75;
}

View File

@@ -3,7 +3,6 @@ package com.xeroth.xeroanticheat.checks.movement;
import com.xeroth.xeroanticheat.XeroAntiCheat;
import com.xeroth.xeroanticheat.check.Check;
import com.xeroth.xeroanticheat.data.PlayerData;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
@@ -47,17 +46,15 @@ public class SpiderCheck extends Check {
return;
}
// Get blocks around player
Location loc = player.getLocation();
// Get blocks around player using block coordinates (no Location mutation)
org.bukkit.World world = player.getWorld();
int blockX = player.getLocation().getBlockX();
int blockY = player.getLocation().getBlockY();
int blockZ = player.getLocation().getBlockZ();
// Check block at feet
Material feetBlock = loc.subtract(0, 1, 0).getBlock().getType();
// Check block at body level
Material bodyBlock = loc.getBlock().getType();
// Check block above head
Material headBlock = loc.add(0, 1, 0).getBlock().getType();
Material feetBlock = world.getBlockAt(blockX, blockY - 1, blockZ).getType();
Material bodyBlock = world.getBlockAt(blockX, blockY, blockZ).getType();
Material headBlock = world.getBlockAt(blockX, blockY + 1, blockZ).getType();
// Check if any of these blocks are climbable
boolean feetClimbable = isClimbable(feetBlock);

View File

@@ -22,13 +22,17 @@ public class ViolationManager {
private final Map<UUID, PlayerData> playerDataCache = new ConcurrentHashMap<>();
private final MiniMessage miniMessage = MiniMessage.miniMessage();
private double decayRate;
private volatile double decayRate;
public ViolationManager(XeroAntiCheat plugin) {
this.plugin = plugin;
this.decayRate = plugin.getConfigManager().getDouble("violation.decay_rate", 0.5);
}
public void setDecayRate(double rate) {
this.decayRate = rate;
}
/**
* Get or create player data for a player
*/
@@ -89,8 +93,6 @@ public class ViolationManager {
* Decay all violation levels for all players
*/
public void decayAll() {
decayRate = plugin.getConfigManager().getDouble("violation.decay_rate", 0.5);
for (PlayerData data : playerDataCache.values()) {
for (String checkName : data.getViolationLevels().keySet()) {
data.decayViolation(checkName, decayRate);

View File

@@ -1,5 +1,5 @@
name: XeroAntiCheat
version: 1.0.7
version: 1.0.8
main: com.xeroth.xeroanticheat.XeroAntiCheat
author: Xeroth
description: Lightweight, accurate anti-cheat for Paper 1.21.x

339
target/classes/config.yml Normal file
View File

@@ -0,0 +1,339 @@
# XeroAntiCheat Configuration File
# Version: 1.0.0
# Target: Paper 1.21.x (compatible with 1.20-1.22)
# ==========================================
# GENERAL SETTINGS
# ==========================================
# Enable or disable the anti-cheat
enabled: true
# Enable debug mode (logs additional information)
debug: false
# Number of async threads for background tasks
async_task_threads: 2
# Database settings
database:
# Set to false to disable SQLite logging (flat-file log always active)
enabled: true
# ==========================================
# VIOLATION SYSTEM
# ==========================================
violation:
# Time in seconds between violation level decay
decay_interval: 30
# Amount to reduce VL by each decay interval
decay_rate: 0.5
# ==========================================
# CHECK CONFIGURATION
# ==========================================
# Movement Checks
checks:
# ----------------------------------------
# SPEED CHECK
# Detects horizontal movement faster than possible
# ----------------------------------------
speed:
enabled: true
# Base maximum speed (blocks per tick)
max_speed: 0.56
# Ping compensation factor (scales latency leniency)
ping_factor: 1.0
# Number of ticks to buffer for rolling average
buffer_ticks: 5
# VL thresholds
warn_vl: 10
kick_vl: 25
tempban_vl: 50
permban_vl: 100
# ----------------------------------------
# FLY CHECK
# Detects flying without elytra/creative/spectator
# ----------------------------------------
fly:
enabled: true
# Number of ticks to allow for stepping/slabs
fall_buffer: 10
# Maximum ground desync ticks before flagging
ground_desync_threshold: 3
warn_vl: 10
kick_vl: 25
tempban_vl: 50
permban_vl: 100
# ----------------------------------------
# JESUS CHECK (NoWaterWalk)
# Detects walking on water without Frost Walker
# ----------------------------------------
jesus:
enabled: true
warn_vl: 10
kick_vl: 25
tempban_vl: 50
permban_vl: 100
# ----------------------------------------
# NOFALL CHECK
# Detects no fall damage after falling >3 blocks
# ----------------------------------------
nofall:
enabled: true
# Minimum fall distance to track
min_fall_distance: 3
warn_vl: 10
kick_vl: 25
tempban_vl: 50
permban_vl: 100
# ----------------------------------------
# TIMER CHECK (Blink/Packet Timer)
# Detects packet timing anomalies
# ----------------------------------------
timer:
enabled: true
# Maximum packets per second allowed
max_packets_per_second: 22
# Milliseconds of no packets before flagging blink
blink_threshold_ms: 500
warn_vl: 10
kick_vl: 25
tempban_vl: 50
permban_vl: 100
# ----------------------------------------
# SPIDER CHECK
# Detects climbing non-climbable blocks
# ----------------------------------------
spider:
enabled: true
warn_vl: 10
kick_vl: 25
tempban_vl: 50
permban_vl: 100
# ----------------------------------------
# GLIDE CHECK (ElytraHack)
# Detects glide-like movement without elytra
# ----------------------------------------
glide:
enabled: true
# Minimum horizontal speed for glide detection
min_horizontal_speed: 0.5
# Maximum Y decrease per tick for glide curve
max_y_decrease: 0.1
warn_vl: 10
kick_vl: 25
tempban_vl: 50
permban_vl: 100
# ----------------------------------------
# KILLAURA CHECK
# Detects impossible combat angles/rotations
# ----------------------------------------
killaura:
enabled: true
# Maximum angle in degrees from look direction
max_angle: 100
# Maximum rotation change between attacks
max_rotation_change: 45
# Window for multi-target detection (ms)
multitarget_window_ms: 100
warn_vl: 10
kick_vl: 25
tempban_vl: 50
permban_vl: 100
# ----------------------------------------
# REACH CHECK
# Detects attacking beyond reach
# ----------------------------------------
reach:
enabled: true
# Maximum reach in blocks (survival)
max_reach: 3.2
# Maximum reach in blocks (creative)
creative_max_reach: 5.0
# Ping compensation factor
ping_factor: 1.0
warn_vl: 10
kick_vl: 25
tempban_vl: 50
permban_vl: 100
# ----------------------------------------
# CRITICAL CHECK
# Detects critical hits without being airborne
# ----------------------------------------
critical:
enabled: true
# Allow legitimate jump-crits
allow_jump_crits: true
warn_vl: 10
kick_vl: 25
tempban_vl: 50
permban_vl: 100
# ----------------------------------------
# AUTOCLICKER CHECK
# Detects excessive CPS or perfect patterns
# ----------------------------------------
autoclicker:
enabled: true
# Maximum clicks per second
max_cps: 20
# Minimum variance (lower = more suspicious)
min_variance: 2.0
warn_vl: 10
kick_vl: 25
tempban_vl: 50
permban_vl: 100
# ----------------------------------------
# FASTPLACE CHECK
# Detects block placement too fast
# ----------------------------------------
fastplace:
enabled: true
# Maximum blocks per second
max_blocks_per_second: 20
warn_vl: 10
kick_vl: 25
tempban_vl: 50
permban_vl: 100
# ----------------------------------------
# PHASE CHECK
# Detects players clipping through solid blocks
# ----------------------------------------
phase:
enabled: true
# Minimum movement distance before ray-cast runs (blocks)
min_distance: 0.5
# Maximum movement delta — larger values are treated as teleports
max_distance: 5.0
warn_vl: 5
kick_vl: 15
tempban_vl: 30
permban_vl: 60
# ----------------------------------------
# VELOCITY CHECK
# Detects players ignoring server-sent knockback (requires ProtocolLib)
# ----------------------------------------
velocity:
enabled: true
# Minimum server-sent velocity magnitude to check
min_expected_velocity: 0.15
# Player must move at least 20% of expected knockback
min_displacement_ratio: 0.2
warn_vl: 8
kick_vl: 20
tempban_vl: 40
permban_vl: 80
# ----------------------------------------
# SCAFFOLD CHECK
# Detects automated scaffolding
# ----------------------------------------
scaffold:
enabled: true
# Minimum pitch angle for suspicious placement
min_pitch: 75
# Number of signals required to flag
signals_required: 2
# Signal 4: Max yaw change (degrees) between placements
rotation_lock_threshold: 2.0
# Signal 4: Min horizontal speed (blocks/tick) required
min_move_speed: 0.15
# Signal 5: StdDev below this triggers signal (too-perfect timing)
min_placement_variance_ms: 30.0
# Signal 5: Min blocks/sec before signal 5 is evaluated
min_bps_for_variance_check: 5
warn_vl: 10
kick_vl: 25
tempban_vl: 50
permban_vl: 100
# ----------------------------------------
# FASTEAT CHECK
# Detects eating faster than possible
# ----------------------------------------
fasteat:
enabled: true
# Maximum eating duration in ticks (32 = 1.6s)
max_eat_ticks: 32
warn_vl: 10
kick_vl: 25
tempban_vl: 50
permban_vl: 100
# ----------------------------------------
# INVENTORYMOVE CHECK
# Detects movement while inventory open
# ----------------------------------------
inventorymove:
enabled: true
warn_vl: 10
kick_vl: 25
tempban_vl: 50
permban_vl: 100
# ==========================================
# PUNISHMENT SETTINGS
# ==========================================
punishments:
# Commands to execute for each punishment level
# Use %player% for player name, %reason% for reason
kick_command: "kick %player% &c[XAC] Illegal activity detected"
tempban_command: "tempban %player% 30d %reason%"
permban_command: "ban %player% %reason%"
# Default reason for bans
default_reason: "[XeroAntiCheat] Suspicious activity"
# ==========================================
# ALERT SYSTEM
# ==========================================
alerts:
# Enable or disable alert broadcasts
enabled: true
# Alert format (MiniMessage)
# Available placeholders: %player%, %check%, %vl%
format: "<dark_red>[<red>XAC<dark_red>] <white>%player% <red>failed <white>%check% <red>(VL: <white>%vl%<red>)"
# Staff-only alert format
staff_format: "<gray>[%time%] %message%"
# ==========================================
# COMMANDS
# ==========================================
commands:
# Permission required for admin commands
reload_permission: "xac.admin"
# Permission to bypass all checks
bypass_permission: "xac.bypass"
# Permission to receive alerts
alerts_permission: "xac.alerts"
# ==========================================
# TPS COMPENSATION
# ==========================================
tps:
# Enable TPS-based threshold scaling
enabled: true
# Minimum TPS to apply compensation
min_tps_threshold: 18.0

185
target/classes/plugin.yml Normal file
View File

@@ -0,0 +1,185 @@
name: XeroAntiCheat
version: 1.0.8
main: com.xeroth.xeroanticheat.XeroAntiCheat
author: Xeroth
description: Lightweight, accurate anti-cheat for Paper 1.21.x
api-version: 1.21
softdepend:
- ProtocolLib
commands:
xac:
description: XeroAntiCheat main command
usage: /xac <reload|status|punish|clearviolations|verbose|alerts|version>
permission: xac.command.version
aliases: [xeroanticheat, anticheat]
permissions:
# ── Wildcards ────────────────────────────────────────────────────────────
xac.*:
description: Grants all XeroAntiCheat permissions including bypass
default: false
children:
xac.admin: true
xac.bypass: true
xac.admin:
description: Grants all staff commands and alert access (does NOT grant bypass)
default: op
children:
xac.command.reload: true
xac.command.status: true
xac.command.punish: true
xac.command.clearviolations: true
xac.command.verbose: true
xac.command.alerts: true
xac.command.version: true
xac.alerts: true
# ── Commands ─────────────────────────────────────────────────────────────
xac.command.reload:
description: Reload XAC configuration
default: op
xac.command.status:
description: View a player's violation levels and ping
default: op
xac.command.punish:
description: Manually trigger a punishment for a player
default: op
xac.command.clearviolations:
description: Clear all violation levels for a player
default: op
xac.command.verbose:
description: Toggle verbose per-flag output for a specific player
default: op
xac.command.alerts:
description: Toggle receiving anti-cheat alerts in chat
default: op
xac.command.version:
description: Show the plugin version
default: true
# ── Alerts ───────────────────────────────────────────────────────────────
xac.alerts:
description: Receive alerts for all checks
default: op
children:
xac.alerts.movement: true
xac.alerts.combat: true
xac.alerts.misc: true
xac.alerts.movement:
description: Receive alerts for movement checks only
default: false
xac.alerts.combat:
description: Receive alerts for combat checks only
default: false
xac.alerts.misc:
description: Receive alerts for misc checks only
default: false
# ── Bypass ───────────────────────────────────────────────────────────────
xac.bypass:
description: Bypass all anti-cheat checks
default: false
children:
xac.bypass.movement: true
xac.bypass.combat: true
xac.bypass.misc: true
xac.bypass.movement:
description: Bypass all movement checks
default: false
children:
xac.bypass.speed: true
xac.bypass.fly: true
xac.bypass.jesus: true
xac.bypass.nofall: true
xac.bypass.timer: true
xac.bypass.spider: true
xac.bypass.glide: true
xac.bypass.phase: true
xac.bypass.combat:
description: Bypass all combat checks
default: false
children:
xac.bypass.killaura: true
xac.bypass.reach: true
xac.bypass.critical: true
xac.bypass.autoclicker: true
xac.bypass.velocity: true
xac.bypass.misc:
description: Bypass all miscellaneous checks
default: false
children:
xac.bypass.fastplace: true
xac.bypass.scaffold: true
xac.bypass.fasteat: true
xac.bypass.inventorymove: true
xac.bypass.speed:
description: Bypass SpeedCheck
default: false
xac.bypass.fly:
description: Bypass FlyCheck
default: false
xac.bypass.jesus:
description: Bypass JesusCheck
default: false
xac.bypass.nofall:
description: Bypass NoFallCheck
default: false
xac.bypass.timer:
description: Bypass TimerCheck
default: false
xac.bypass.spider:
description: Bypass SpiderCheck
default: false
xac.bypass.glide:
description: Bypass GlideCheck
default: false
xac.bypass.phase:
description: Bypass PhaseCheck
default: false
xac.bypass.killaura:
description: Bypass KillAuraCheck
default: false
xac.bypass.reach:
description: Bypass ReachCheck
default: false
xac.bypass.critical:
description: Bypass CriticalCheck
default: false
xac.bypass.autoclicker:
description: Bypass AutoClickerCheck
default: false
xac.bypass.velocity:
description: Bypass VelocityCheck (requires ProtocolLib)
default: false
xac.bypass.fastplace:
description: Bypass FastPlaceCheck
default: false
xac.bypass.scaffold:
description: Bypass ScaffoldCheck
default: false
xac.bypass.fasteat:
description: Bypass FastEatCheck
default: false
xac.bypass.inventorymove:
description: Bypass InventoryMoveCheck
default: false

View File

@@ -0,0 +1,3 @@
artifactId=xeroanticheat
groupId=com.xeroth
version=1.0.8

View File

@@ -0,0 +1,37 @@
com/xeroth/xeroanticheat/command/XACCommand$1Cmd.class
com/xeroth/xeroanticheat/data/PlayerData$PositionSnapshot.class
com/xeroth/xeroanticheat/check/Check.class
com/xeroth/xeroanticheat/listener/CombatListener.class
com/xeroth/xeroanticheat/XeroAntiCheat.class
com/xeroth/xeroanticheat/data/PlayerData$RotationSnapshot.class
com/xeroth/xeroanticheat/manager/DatabaseManager.class
com/xeroth/xeroanticheat/checks/misc/ScaffoldCheck.class
com/xeroth/xeroanticheat/protocol/PacketListener$2.class
com/xeroth/xeroanticheat/command/XACCommand.class
com/xeroth/xeroanticheat/manager/PunishmentManager.class
com/xeroth/xeroanticheat/checks/combat/VelocityCheck.class
com/xeroth/xeroanticheat/listener/MovementListener.class
com/xeroth/xeroanticheat/checks/movement/SpiderCheck.class
com/xeroth/xeroanticheat/checks/combat/AutoClickerCheck.class
com/xeroth/xeroanticheat/checks/movement/PhaseCheck.class
com/xeroth/xeroanticheat/protocol/PacketListener$1.class
com/xeroth/xeroanticheat/manager/ViolationManager.class
com/xeroth/xeroanticheat/checks/misc/FastEatCheck.class
com/xeroth/xeroanticheat/checks/misc/InventoryMoveCheck.class
com/xeroth/xeroanticheat/protocol/PacketListener.class
com/xeroth/xeroanticheat/checks/movement/JesusCheck.class
com/xeroth/xeroanticheat/manager/ConfigManager.class
com/xeroth/xeroanticheat/checks/movement/SpeedCheck.class
com/xeroth/xeroanticheat/checks/movement/GlideCheck.class
com/xeroth/xeroanticheat/checks/movement/FlyCheck.class
com/xeroth/xeroanticheat/data/PlayerData$VelocitySnapshot.class
com/xeroth/xeroanticheat/manager/CheckManager.class
com/xeroth/xeroanticheat/checks/movement/NoFallCheck.class
com/xeroth/xeroanticheat/protocol/PacketListener$3.class
com/xeroth/xeroanticheat/listener/MiscListener.class
com/xeroth/xeroanticheat/data/PlayerData.class
com/xeroth/xeroanticheat/checks/combat/ReachCheck.class
com/xeroth/xeroanticheat/checks/misc/FastPlaceCheck.class
com/xeroth/xeroanticheat/checks/movement/TimerCheck.class
com/xeroth/xeroanticheat/checks/combat/CriticalCheck.class
com/xeroth/xeroanticheat/checks/combat/KillAuraCheck.class

View File

@@ -0,0 +1,30 @@
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/XeroAntiCheat.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/check/Check.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/checks/combat/AutoClickerCheck.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/checks/combat/CriticalCheck.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/checks/combat/KillAuraCheck.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/checks/combat/ReachCheck.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/checks/combat/VelocityCheck.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/checks/misc/FastEatCheck.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/checks/misc/FastPlaceCheck.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/checks/misc/InventoryMoveCheck.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/checks/misc/ScaffoldCheck.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/checks/movement/FlyCheck.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/checks/movement/GlideCheck.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/checks/movement/JesusCheck.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/checks/movement/NoFallCheck.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/checks/movement/PhaseCheck.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/checks/movement/SpeedCheck.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/checks/movement/SpiderCheck.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/checks/movement/TimerCheck.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/command/XACCommand.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/data/PlayerData.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/listener/CombatListener.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/listener/MiscListener.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/listener/MovementListener.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/manager/CheckManager.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/manager/ConfigManager.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/manager/DatabaseManager.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/manager/PunishmentManager.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/manager/ViolationManager.java
/home/axel/Músicas/Java/src/main/java/com/xeroth/xeroanticheat/protocol/PacketListener.java