Links
Tags
Creators
Details
0.3.1
Compatibility
Required content
Changes
Crash fixes, and a suite that catches them.
0.3.0 shipped two crashes that nothing in the build could see. Update if you are on 0.3.0.
- Fixed: the client crashed on launch.
WorldRendererParticleMixinshadowed a field namedminecraft; the field inWorldRendererisclient. A@Shadowis not checked at compile time — it is checked the moment the game loads the target class, andWorldRendereris built duringMinecraft.init(), so every client died at startup withInvalidMixinException: @Shadow field minecraft was not located. - Fixed: tags that reference other tags crashed with a
StackOverflowError. Resolving a#namespace:tagentry called the publicblocksIn/itemsIn, which re-enter the tag cache — and the cache is not populated until resolution finishes, so resolution restarted from the top and recursed until the stack died. Any pack whose tag files reference each other hit it. The resolver now reads code-registered membership straight from its own map. - Changed: contextual tool tiers receive the player —
.tier((stack, block, player) -> ...), where the old form took(stack, block). The documentation always advertised "a tool that is weaker in the nether", but the lambda had no way to reach a world, so it could not actually be written. The player carries one, and both harvest hooks already had it. It isnullonly when a tier is asked for outside a harvest;RetroToolTier.of(stack, block)still exists and passesnull. - New launch smoke suite:
./gradlew smokeTest(clientSmokeTest,serverSmokeTest, and both again under-Pstationapi). Each one boots the game, reads RetroAPI's mixin configs, and force-loads every class RetroAPI mixes into withinitialize = false— so every mixin is applied and every injector runs, in one pass, in seconds. Mixin only validates a mixin when the game happens to load its target, which is exactly why a broken@Shadowon a render class can ship: nothing in a build, and nothing in a data-level test, ever loads it. The client run also asserts the particle registry resolves and that the world-renderer hook is present in the class. The server half runs in CI; the client half needs a display. - The test mod now registers a particle and ships tag files that reference other tags, so both crashes are covered by a test that would have caught them.
Full feature set: https://matthewperiut.github.io/retroapi/features-0.3.0.html
Built and validated with -Pstationapi on Ornithe (b1.7.3): all four smoke suites pass (client 56/65 and server 45/45 mixin targets applied, 60/69 and 47/47 with StationAPI), plus the headless populate self-check and the vanilla↔StationAPI conversion round-trip.
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:iFaqJ8QH:1U6p8VNY"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:iFaqJ8QH:1U6p8VNY"
}


