Repository navigation
MiracleLoader 1.4.1: Transubstantiation (redirect)
1.4.1 fixes one thing: a launcher that starts the loader twice.
A Prism instance set up for MiracleLoader (main class Resurrection) that also got -javaagent:miracle-loader.jar stopped at startup with "Mods were already revealed. Nice try." Now the agent does the work and the main class just hands over to the game. Mods load once. One of the two is still enough.
Everything else is as in 1.4.0:
Transubstantiation: RGCT can now replace one call inside a game method, right where the method makes it, at no cost per call. Mods for 1.3 work as they are.
rgct.target("net.minecraft.client.renderer.LevelRenderer")
.method("extractSectionDrawGroups")
.redirect(ChunkSectionLayer::values, Layers::cached);- Free. The call becomes an
invokedynamicsite, bound once to the replacement. There's no context object, no boxing and no array, and the JIT inlines it as if the game had written it. This is the tool for hot paths, where intercept hooks would make garbage. - Checked by the compiler. The call and the replacement have the same shape (
Redirect.Call0..Call9,Do0..Do9), so the replacement has to fit. It may take wider types, or returnObjectto name a class that moved between versions. - Safe in
transform(). WritingPlayer::getNamethere doesn't loadPlayer. As a mod class loads, RGCT rewrites its redirect lambdas so they are written down by name. This works in Java agent mode too. - One mod per call. Two mods redirecting the same call in the same method stop the game with an error naming both. Redirects show up in the startup report and in
miracle.lock. A call the method never makes gets a warning, the same way a missing method does. - Baking translates them. A redirect of
Player::getNamebecomes one ofo.a::con 1.21.11. - Intercepts of methods without arguments no longer allocate an empty array per call.
Checked
test.sh: 491 of 491, also with the loader as a Java agent. That includes redirects on the obfuscated fake game and the clash error.- Real clients 26.3, 26.2, 26.1.2 and 1.21.11, with Ultra Somnia 0.2. It redirects calls inside the chunk and entity renderers: up to 7 values, with fallbacks per version, translated for 1.21.11.