Tags
Creators
Details
0.9
Compatibility
Changes
FIXED
- Fixed the movement engine not simulating collisions at all — walls, floors, and ceilings now actually block predicted motion like the client does
- Fixed step-up: the engine used to accept any positive vertical motion under 0.6 blocks as a step. Now it properly simulates the lift, forward, and settle
- Fixed ground detection: the old ±0.75 block support window claimed players were on the ground during full jump arcs. Ground is now collision-derived
- Fixed the sprint-jump boost applying on every ground tick while sprint key was held. It now only applies on the actual takeoff tick
- Fixed knockback double-counting: the engine was re-adding the decayed velocity vector on every tick instead of once at application time
- Fixed elytra physics running for 40 ticks after the glide ended, flagging normal falling
- Fixed elytra transitions: both the elytra and normal engines now run during the 40-tick post-glide window and the best match wins
- Fixed elytra firework boost window being too short (35 → 70 ticks) for level 3 rockets
- Fixed lava climb constant (was 0.3, vanilla is 0.04)
- Fixed bed bounce restitution applying the bed constant (0.75) to slime blocks (vanilla is full reversal)
- Fixed bounce candidate using the truncated landing delta instead of the pre-collision impact velocity
- Fixed soul sand collision height (was 15/16, vanilla is 14/16)
- Fixed soul sand and honey slowdown triggering from a radius scan instead of actual block contact
- Fixed soul sand slowdown not applying through carpets stacked on top (vanilla probes half a block below the feet)
- Fixed water engine: sprint-swimming now skips the gravity step entirely (vanilla behavior)
- Fixed water engine: the -0.003 surface settle now uses the exact vanilla condition window
- Fixed water engine: sneaking in water now adds the flat -0.04 sink
- Fixed water engine: jump-out of shallow water (fluid height ≤ 0.4) now offered as a candidate
- Fixed water engine: lava shallow branch (height ≤ 0.4) applies the 0.5/0.8 drag
- Fixed swim-hop being offered unconditionally. Now requires free space above and near-surface water
- Fixed fence and wall collision shapes: dynamic connection arms now generated from the block state (north/south/east/west booleans) instead of a static center post
- Fixed climbing detection: ladders and vines are now found when the player's bounding box overlaps the climbable's column (2×2 cell check)
- Fixed climbing: sustained climb-pattern motion (0.1176/tick) now offers climb candidates even when the world cache misses the climbable block
- Fixed cobweb NoSlow flagging on the edge of the web. The hard cap no longer overrides the engine when the engine already explained the tick
- Fixed bed standing: beds are 9/16 tall, feet rest exactly on the box top. The support probe now handles flush landings where float rounding puts feet a hair above the surface
- Fixed beds being flagged by GroundSpoof F and G: beds are standable partial blocks, not phantom ground claims
- Fixed slab and stair standing: step-up candidates now offered when a step-family block is provably adjacent (geometry-gated, not unconditional)
- Fixed jumping on slabs: landing ticks with truncated fall motion now accepted by the shape-boundary ground fallback
- Fixed jump height precision: vanilla jumps are exactly 0.42 + 0.1 × boost. Three consecutive takeoffs exceeding this by >0.002 now flag (head-bump contact is exempt)
- Fixed scaffold climbing: holding jump inside a scaffold column sends real 0.42 takeoffs. The engine now offers these when the jump input is held
- Fixed scaffold standing: the client rests at the cell top inside columns. Column support now recognized
- Fixed boat standing: vanilla bobs riders off boat tops with ~0.3-0.56 launch impulses. These are now offered as candidates
- Fixed boat riding: rotation-only packets were zeroing the boat's momentum between vehicle-move packets. Deltas are now preserved while riding
- Fixed boat water/land transitions: intermediate decay candidates added (0.5/0.7 rates)
- Fixed boat mount/dismount: the ~0.41 vertical pop is now a candidate
- Fixed vehicle engine calling Bukkit's getVehicle() from the packet thread (AsyncCatcher crash). Vehicle type is now cached on the main thread
- Fixed reach judging with the previous tick's rotation instead of the rotation the client actually swung with (the attack packet doesn't carry it — it arrives one packet later)
- Fixed reach tolerance: removed the arbitrary +0.02 threshold, keeping only the physically justified box margin
- Fixed hitbox checks running their own independent raycast with the stale rotation. There is now one raycast (ReachA's) and the miss routes to HitboxA
- Fixed hitbox and reach flagging on plugin-spawned NPCs: non-player entities are resynced, never flagged for hitbox verdicts, and reach on them is blatant-only
- Fixed the reach box mutation bug: expanding the tracker's historical boxes in place permanently corrupted them for all checks
- Fixed VelocityA flagging during normal PvP: the player's own input (strafing back toward the attacker) fights the knockback, adding up to 0.16 blocks/tick. The allowed deviation now widens during active knockback
- Fixed VelocityC flagging the same input-vs-knockback pattern on decay ticks
- Fixed the air speed cap firing on knockback-inflated motion: the velocity window widened from 3 to 10 ticks
- Fixed omni-sprint flagging on landing ticks and during active knockback. It now requires no velocity, zero air ticks, and sustained ground
- Fixed wind charge and ender pearl impulses: added kb_carry candidates covering the tick-lag between the impulse ack and the client's application
- Fixed BadPacket8 dig distance using a flat 6.0 cap instead of the attribute-aware block interaction range. Also widened the teleport and velocity grace windows
- Fixed BadPacketA flagging during click spam on the ground. It now requires 5+ air ticks before a flying-without-permission verdict
- Fixed PacketOrderA flagging modern hold-to-place auto-repeat (the client doesn't re-swing per repeat packet). Repeats are exempt
- Fixed KillAuraB flagging legitimate strafing: the directional sprint angle widened from ~53° to ~72°, and landing-tick carryover is exempt
- Fixed the post-attack momentum rule overriding the engine when the engine already explained the tick
- Fixed the changelog YAML corruption that would have crashed the first server boot
- Fixed the stale config snapshot: GUI toggles now take effect immediately because checks read the live map instead of a cached copy
- Fixed 26.x sprint behavior: the PLAYER_INPUT sprint bit leads the client's actual sprint state by one tick on W-tap activation. The engine now tries both sprint accel models
- Fixed the uncertainty bank: removed client-purchasable tolerance (sprint start, yaw jitter, blanket low-speed) that cheaters could farm by toggling state
- Fixed the mirror drift: UncertaintyHandler now delegates to the single source instead of a hand-copied duplicate
ADDED
- Added a full swept-AABB collision engine (Collider) with vanilla clipping, honest step-up, and shared box gathering
- Added known-input era support: on 1.21.2+ the PLAYER_INPUT packet provides exact WASD/jump/sneak/sprint state. The engine runs the precise modern input pipeline (Vec2 normalize, ×0.98, item-use ×0.2, sneak attribute, unit-square clamp) with both sprint models
- Added transaction-bracketed block updates: block changes are applied to each player's world view only when their client confirms processing them
- Added empty-snapshot protection: chunks with zero non-air blocks are never cached (build-race guard)
- Added self-healing poisoned chunks: standing on ground the cache can't see triggers a purge and live rebuild
- Added collision-derived ground truth (down-probe, horizontal micro-probe, feet-cell-solid check)
- Added the debug context system: every flag now carries input states, ground states, regime flags, knockback vector, bounce impact, block column, support probe result, and the engine's predicted motion vector
- Added rich debug to Reach and Hitbox flags: entity type, per-rewind box distances, look-variant distances, rotation delta
- Added shape-boundary ground fallback: feet resting at any 1/16 grid line (all collision tops) with a ground claim and resting/landing motion is recognized as supported
- Added fluid height model: (8-level)/9 with same-fluid-above = 1.0, gating jump-out and swim-hop honestly
- Added bubble column candidates: soul sand up (terminal +0.7) and magma down (terminal -0.49)
- Added piston push tracking: direction-bounded uncertainty windows for 4 ticks after a piston event
- Added geyser column support (26.2+ potent sulfur)
- Added 26.2 movement attribute support: air_drag_modifier, bounciness, friction_modifier read and applied
- Added 26.2 ground accel formula for high-friction blocks (0.216/f³ replacing 0.16277136/f³ when slipperiness > 0.6)
- Added the 26.x empirical calibrations: 0.88 sprint scale and 0.63 post-jump momentum drop as candidate variants
- Added 26.3 block shapes: shelves (full height), straw beds, sulfur spikes, poplar set, wool/concrete stairs and slabs
- Added scaffolding head-hitter exemption (vanilla lets players rise through scaffolding)
- Added ladder-hop candidates (0.1176/0.2) when a climbable sits below the feet
- Added climbable jump candidates while inside scaffold/ladder columns with jump input held
- Added 24-slot candidate arrays (was 12) to prevent overflow when multiple uncertainty sources stack
- Added jump-strength precision verdict: three consecutive over-strength takeoffs flag
- Added ladder and wall dynamic connection shapes (arms toward connected neighbors)
- Added four scaffold checks replacing the old eight: placement line-of-sight (Rotation), placement reach (Reach), tower metronome physics (Motion), and occupied-cell placement (Face)
- Added two-file configuration: config.yml for plugin settings, checks.yml for all detections. Zero YAML reads on the movement hot path
- Added per-check lagback inheritance: lagback: inherit pulls the global profile, true/false forces the check with its own VL. Three-state GUI cycler (Inherit/On/Off)
- Added /banwave (renamed from /bandwave) with the BanwaveManager class
- Added the latency kicker (was config-only, now implemented)
- Added Bedrock client brand detection (geyser/floodgate) alongside the prefix and UUID checks
- Added quit-state cleanup in 8 checks that were leaking per-player maps
- Added measured TPS on Folia (the min-TPS kill-switch now works there)
- Added Folia-aware GUI refresh (per-admin region scheduling)
- Added PacketEvents 2.14.0 support (Minecraft 26.3, protocol 777)
- Added year-based version detection (26.x) in VersionManager
- Added Math.floor-based eye-in-water detection for the swimming transform
- Added entity geometry table (60+ entity types with honest per-type sizes)
- Added main-thread live entity size resolution for NPC/plugin-spawned entities
REMOVED
- Removed ~26,000 lines of unused vendored code
- Removed the dead compensation Scheduler (zero registered consumers)
- Removed the unused StateCacheProcessor and BanStateProcessor
- Removed the unused KeepAlivePacketWrapper and ConfirmTransactionPacketWrapper
- Removed the dead USE_MODERN_PING branches
- Removed the empty event and vector packages
- Removed the unused PhysicsSimulationTool scratch harness
- Removed the dead latency-kicker config ghosts
- Removed the unused LagA reach enforcement (LagA is now pure backtrack pattern detection)
- Removed HitboxA's independent raycast (replaced by the single two-stage raycast)
- Removed 7 of the old 8 scaffold checks (replaced by 4 physics-anchored ones)
- Removed the blank check-type suffix from the Simulation check name
⚠️ 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=, gnd=, 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:YwVkO3JI"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:r0IgCzva:YwVkO3JI"
}

