Links
Tags
Creators
Details
All versions
1.2.3
Release
SentinelCore - AntyCheat 1.2.33 months ago 325
Compatibility
Minecraft: Java Edition
1.21.x
1.20.x
1.19.x
1.18.x
1.17.x
Platforms
Bukkit
Paper
Purpur
Spigot
Changes
SentinelCore - Changelog
๐ Critical Fix
- Fixed a
NullPointerExceptionspamming the console on nearly everyPlayerMoveEvent.FlightCheck's motion-curve vector returnednullinstead of a "no evidence" result in three of its clean-movement branches (active upward impulse, deviation within tolerance, not enough mismatch samples yet). Thatnullwas passed straight up throughevaluate()intoAbstractEvidenceCheck.handle(), which unconditionally calls.evidence()on it - throwing on effectively every ordinary movement tick where nothing suspicious was happening. This was a pre-existing bug, unrelated to any other recent change; it now correctly returns a pass result instead.
โจ New Features / Calibration Changes
- Active calibration duration is now config-driven. Previously the 1-hour
session length was hardcoded (
MAX_CALIBRATION_TICKS = 72_000inActiveCalibrationManager) and completely ignoredconfig.yml. Added a new key,active-calibration.session-duration-ticks(default72000), which now actually controls how long a player's active calibration session runs.- Note: this is distinct from
calibration.interval-ticks, which only governs the background population-baseline recalibration cycle and was never meant to control per-player session length - that distinction is now also clarified in the config comments.
- Note: this is distinct from
- Full Survival gameplay during calibration. Players being actively calibrated
are no longer locked into a restricted
ADVENTURE-mode, no-PvP, peaceful-difficulty sandbox:- Calibration subjects are now placed in
GameMode.SURVIVALinstead ofADVENTURE. - Removed the quarantine rules blocking item drops and environmental damage (fall, fire, drowning, etc.) - combat damage was never blocked to begin with.
- The calibration world itself now runs with normal difficulty, PvP enabled, and the day/weather cycle and mob spawning turned on, instead of being frozen and peaceful.
- The plugin still collects heuristic data silently in the background throughout - none of the sampling/telemetry pipeline was touched, only the restrictions placed on the player.
- Calibration subjects are now placed in
โ๏ธ Configuration Changes
- Added
active-calibration.session-duration-ticks(default72000= 1 hour). - Added
settings.language(default"en") - global default language for console messages and any player who hasn't picked their own via/ac language <code>. - Raised default noise-reduction thresholds to cut false positives:
general.action-confidence:0.86โ0.95general.action-violations:8.0โ15.0checks.movement.alert-confidence:0.96โ0.98checks.flight.alert-confidence:0.86โ0.95
active-calibration.database.enabledandactive-calibration.ai.enablednow default totrue(both still safely no-op without valid credentials configured).- Added
messages.calibration-resetand new language-bundle keys (commands.language-usage,{available}placeholder inerrors.unsupported-language) โ every player-facing string in these flows is config/language-file driven now, no hardcoded text left in the command handler.
๐ Language System
- New
/ac language <code>command lets a player switch their own message language on the fly (e.g./ac language pl) โ no restart or/ac reloadrequired. - Both short ISO codes (
en,pl,de,es,fr,pt,ru,it,tr,zh,ja,ko,ar) and full locale codes (en_US,pl_PL, ...) are accepted. - Fixed
/ac language <code>silently failing for two-letter codes โ the validator previously only accepted the fullxx_XXform. - Console and any player who hasn't chosen a language now correctly follow the
configured
settings.languagedefault instead of always falling back to English internally.
๐ Other Fixes & Stability
sentinel_calibration_worldcreation, chunk loading, and slot assignment are guaranteed to run on the main thread โ eliminates async-Bukkit-API crashes during calibration.- Player calibration baselines default safely to a neutral multiplier when no
history exists, instead of risking a
NullPointerException. - Database connection loss no longer spams stack traces to console: a single warning is logged on disconnect, data queues into local JSON automatically, and the plugin quietly retries the connection in the background every 15s until it recovers.
- Added exponential backoff (2s โ 4s โ 8s โ capped at 16s) for AI API requests on rate-limiting (HTTP 429) or transient errors, so calibration data is never lost due to a temporary outage.
๐ Notes
- All new subsystems (AI scoring, SQL storage) remain opt-in and safe to leave
disabled; this update flips the packaged config defaults to
enabled: trueโ reviewactive-calibration.*in yourconfig.ymlafter updating if you want to keep them off. - No breaking changes to existing check behavior; only default confidence thresholds were raised (see above), plus the flight-check crash fix.
Compatible with Paper 1.21.1+ (tested against 1.21.11).
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:zhvEipaA:D9S33F8e"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:zhvEipaA:D9S33F8e"
}

