Links
Tags
Creators
Details
0.5.0+26.1.2
Compatibility
Required content
Changes
The headline: compatibility checking now ships off
compatibilityTier now defaults to Unsafe. Out of the box PathWeaver runs other mods' uninspected pathfinding code on worker threads. Back up worlds you care about.
This is a deliberate risk decision, so here is the reasoning rather than a shrug. Audited honours individual bytecode audits and one bounded call sample; any mod outside that evidence denies every movement family. Measured on a 222-mod pack, Audited left 0 of 187 mob types eligible — and it has been 0 since 0.3.0, because the limit is other mods touching block state, not anything this mod can fix. Shipping it meant shipping something indistinguishable from broken.
What you are accepting: the most likely failure is quiet — a wrong path or a torn read, which you would probably never report. It is not the only possible one. Nothing has been proven about code that was never inspected, so a crash or a corrupted world is not excluded, only less likely.
Both ways back are one setting away: compatibilityTier=Audited for full checking, or trustedMods to name individual mods and keep the scan armed for everything else. A blocking warning at world start names every unaudited mod now running on workers.
Also new
- All six vanilla evaluators dispatch — walking, swimming, flying, amphibious, and the frog's and creaking's.
- A world-start recommendation on small machines. PathWeaver does not make pathfinding cheaper; it moves it. That only pays when a core is free. At 2 cores or fewer it recommends turning the mod off; at 4 or fewer it warns the benefit will be small. Nothing switches off automatically.
/pathweaver statusand/pathweaver mobsanswer in-game whether it is doing anything, and why not.
Fixed
Eight rounds of independent review before publication. The ones that mattered:
- A search could permanently corrupt an amphibious mob's pathfinding costs. Superseding a request left its epilogue owed, and nothing stopped a second search starting — so two
prepare()calls ran against one live mob and the restore inverted. Axolotls, turtles, frogs and drowned kept search-time costs for as long as they stayed loaded, silently. Reproduced in a live server on the previous build, then verified fixed over 170,000 dispatched searches. - A live data race in the A loop.*
Mob.maxUpStep()reads like an accessor and is a read-modify-write on non-volatile attribute state. Present since 0.4.0. The worker is now handed a value instead of a call. - A config carrying the retired
overrideCompatibilityScan: falsemigrated toUnsafe— an explicit "do not bypass the scan" answered by turning the scan off. The test guarding it compared the code to itself and could never fail. - A failed scan is no longer waivable by any tier. If the scanner cannot tell what is installed, everything stays synchronous regardless of the setting.
EvaluatorClonerno longer guesses between matching constructors, and can no longer throw out of the safety gate.- A hard server stop no longer abandons epilogues it could safely have run.
Measured on this jar
1024 zombies in a maze, four paired runs interleaved and order-reversed: mean tick time −41%, p99 −50%, effective TPS 10.9 → 18.6.
Profiled with spark on an identical workload, only the master switch differing: server-thread time in PathFinder.findPath fell from 52.8% of busy time to 0.58%, for 24 ms of main-thread cost per 45 seconds.
Verified with 266 unit tests, four in-game server harnesses and a client harness, plus extended real-mob server sessions and a 371-mod pack booting clean.
Optional dependencies
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:ZQJOU3vB:q7u99Zzt"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:ZQJOU3vB:q7u99Zzt"
}



