Tags
Creators
Details
0.9-FH1
Compatibility
Changes
FIXED
- Fixed the far-position packet disabler β a position packet far enough to force a server correction used to flip the chunk-loaded gate that silences every check, while every forced correction bought 2 free exempt ticks, a full movement-state reset, and a timer rebase. Combined, that was enough to almost fully disable the anticheat. Impossible position claims (non-finite, out of bounds, or a teleport-distance jump that no pending teleport explains) are now dropped at the door and flagged β the server never sees them, so no correction churn is ever built around them
- Fixed teleport confirmation laundering β confirming a teleport made the next position claim count as a teleport with no positional verification, so a withheld confirm was a free pass to call any position a teleport. Claims must now land within 2 blocks of the confirmed teleport target (vanilla clients land exactly on target)
- Fixed the chunk gate keying on the claimed position β the "unloaded chunk = never judge" rule now applies only to positions reachable from the last accepted one (32 blocks per packet, 3Γ the vanilla server's own correction threshold). Simulation's internal chunk gate got the same treatment β it was the last skip in the disabler's chain
- Fixed live chunk builds reading Bukkit world state from netty threads (Folia-illegal) and firing once per packet with no bound. Requests are now rate-limited to 4 per 2 seconds per player; legitimate misses still retry
- Fixed stairs having no collision at all β "STAIRS" contains "AIR", so every stair block in the game fell into the non-solid list before the shape switch ever ran. Stair collision, step-up and support now work as modeled
- Fixed snow blocks being modeled as 1/8-tall slabs (landing on one read as a ~0.87-block vertical offset β an instant hard flag) and powder snow growing a phantom 1/8 collision floor that fought the sinking context
- Fixed phantom full cubes β crops, short grass (the 1.20.3+ rename matched nothing, so grass plains were invisible walls), bushes, nether portal planes, moving pistons and light blocks all collided like solid blocks. Walking through a wheat field flagged
- Fixed phantom air β nether wart blocks, mangrove and muddy mangrove roots, campfires and soul campfires, barrels, mud and mud bricks, amethyst blocks, chain command blocks and lightning rods had no collision or the wrong shape
- Fixed panes and iron bars having no face collision β a 2/16 center rod instead of thin full-length strips. Pane walls were walk-through in the engine, so touching one flagged the pass-through
- Fixed doors being centered plates instead of flush 3/16 panels at the opposite-of-facing edge, and the open-door hinge sides being swapped β every door bump was up to ~0.44 blocks off from where the client actually stops
- Fixed wall posts and arms β no-up posts were modeled 1.5 tall (vanilla is 1.3125) and LOW side arms 1.5 tall (vanilla is 0.9375, clearable by a normal jump). Both directions flagged
- Fixed cauldrons being solid full cubes instead of hollow β jumping into one read as falling through in every candidate while the client rests on the 5/16 interior floor
- Fixed extended piston heads having no standable surface (they were routed to the skull shape). Standing on piston doors and elevators flagged
- Fixed dripleaf parkour β big dripleaf heads tilt and slide the player off after a short stand. A bounded tilt allowance now covers the slide and the drop
- Fixed the ground friction sampling grid β the inner loop compared Z against X and sampled the wrong columns whenever the player's X/Z block offsets differed
- Fixed spear lunge false flags β the engine judged the lunge window: the SPEAR_LUNGE exemption was missing from Simulation's skip list while the velocity checks honored it. Detection was also display-name based, so renaming any item to contain "spear"/"lunge" farmed 20 ticks of velocity immunity per right-click. Detection is now material-based and covers charged-release lunges (RELEASE_USE_ITEM) and hit-triggered lunges
- Fixed the liquid swim-hop candidate excusing sustained 0.3 rises at any depth β it now requires horizontal motion and surface proximity, matching the vanilla condition (horizontal collision while swimming out)
- Fixed a DebugContext crash when no fresh knockback exists
- Fixed block property lookups crashing on out-of-range global ids from hostile chunks (a packet-thread NPE vector)
- Fixed the punishment branch force-lagbacking before dispatching any command (#29) β a message-only punishment (tell/warn) teleported the player backwards with all lagbacks disabled. The banning state is now reserved for actual removals (banwave queue, ban/kick-family commands); message punishments throttle on a 10-second per-player cooldown instead of muting the whole detection pipeline for 10 seconds
- Fixed plugin-message channel names being rejected by a hardcoded length cutoff (#30) β a modern, syntactically valid namespaced channel longer than the cutoff was refused even though nothing was wrong with it. Channels are now validated per client protocol version: modern clients get namespaced-identifier validation with the 64-character platform bound, legacy clients keep the 20-character bound. Payload bounds unchanged
- Fixed punishment and lagback switches never covering direct packet rejection (#31) β disabling punishment and lagback did not make rejecting checks observational. Rejecting checks now honor the explicit per-check cancel switch (see ADDED)
- Fixed the world model and entity tracker running at full cost regardless of which checks were enabled (#32) β both pipelines are now derived from the enabled-check set, so a clicks-only profile pays nothing for chunk decode, ground probes, environment scans or entity tracking. Click timestamps, transactions, teleport bookkeeping and digging state always run
ADDED
- Added BadPacketI: impossible position claims β every disabler attempt is a blatant-severity flag with the jump distance in the debug line. Honors the per-check cancel switch like every other rejecting check
- Added the position sanity gate: non-finite and out-of-bounds rejection, a 32-blocks-per-packet unexplained-jump threshold, and pending-teleport explainability (pure, unit-tested logic)
- Added per-check "cancel: true/false" in checks.yml for the checks that reject packets outright (Crasher, BadPacket slot/spectate/impossible-move, BedrockReach). Default true β rejection stays the security default. false turns the check observe-only: flags and alerts still fire, packets pass through. Includes a GUI toggle in the check-details menu
- Added check-level processor requirements (requiresWorld / requiresEntityTracking) β the registry aggregates them across enabled checks and recomputes on every GUI toggle and reload
- Added real shapes where approximations hid bugs: piston heads per facing (full-height plate + rod), dynamic pane and iron bar connection strips, hollow cauldrons (four 1/16 walls + 5/16 floor)
- Added a per-tick ground friction cache shared by every consumer (was re-sampled up to five times per packet, nine blocks each)
- Added an early-exit to the Simulation candidate search β the first exact match stops the entire inputΓcandidate brute force; the common legal tick went from hundreds of collision resolves to the first hit
- Added per-thread scratch buffers to the collider β zero per-packet array allocation for ground probes and simulation
- Added a per-player 16-chunk cache so cross-chunk reads stop touching the synchronized global LRU map
- Added NMS snapshot-based live chunk builds with empty-section skipping (was ~98,000 getBlock() calls per chunk)
- Added a bounded dripleaf tilt allowance, stamped like bubble columns
- Added 26 unit tests: channel validation, the collision shape table, position sanity, and teleport queue behavior. Shape routing and geometry are pure functions now, testable without a running server
REMOVED
- Removed the dead MovementProcessor prediction pass β its single-path and multi-input brute force had zero consumers since the Simulation engine took over (this is the "prediction in PlayerData" the profiling report flagged)
- Removed the VelocityQueue legacy API (getActiveVelocity / applyFriction)
- Removed the unused COMPLEX_BLOCKS classification set from WorldUtils
β οΈ Beta Notice
This is a beta release. Expect weird edge cases we haven't seen yet. Some blocks, surfaces, or movement patterns might still false flag in ways we didn't catch in testing.
Found something? Report it on GitHub: https://github.com/TawnyE/TruthfulAC/issues
Include the flag message (the full debug line with pred=, in=, g=, rg=, kb=), what you were doing, what version of Minecraft and PacketEvents you're running. A flag line tells us exactly what the engine was thinking β it's the fastest way to a fix.
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:r0IgCzva:92MMK9dB"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:r0IgCzva:92MMK9dB"
}

