In front of you lies a general-purpose Mixin loader framework, designed to serve as a way to develop and load mixins on both 1.7.10 and 1.12.2 versions of Minecraft. This is an independent continuation of Legacy Grimoire project. It also superseeds SpongeMixins for 1.7.10 as simpler and more robust solution.
For Normal Average Users:
If you're an end user, you probably came here only because one of your mods requires Grimoire as a dependency. In that case just download latest Grimoire release for your Minecraft version, stick it in your mods folder, and you're good to go!
For Developers:
If you're a developer looking to employ the sacred mixin-loading techniques of almighty Grimoire in your projects... oh boy, have we got a lot in store for you. Witness, for below resides the list of the most notable features our framework currently provides:
- Embedded Sponge Mixin, which allows you to avoid shading full Mixin implementation into your mod. I certainly hope you are aware that shading it is an inherently bad practice;
- Version-independent core. Most of the Grimoire API is completely independent from Minecraft version you are using, and will work in perfectly the same way on both 1.7.10 and 1.12.2;
- Grimmix system, which serves as a way for framework implementers to declare their presence, easily handle important events and programatically communicate with other implementers if such need exists;
- Simple API that provides an option to build mixin configuration at runtime, instead of having to ship it as .json within modfile;
- Mixin configurations are divided in two main categories - those that target Minecraft/Forge, and those that target other mods. They need to be loaded at different time, since at the time of coremod loading where Minecraft-targeting configurations are applied no mods are discovered and added to the classpath yet. Grimoire takes care of loading each configuration at proper time, all you need is to use appropriate lifecycle event for registering your configuration, or properly specify ConfigurationType if you build it at runtime;
- Version-independent EventBus implementation, stripped of unnecessary ASM thingies Forge's bus really needs for some reason, and much more friendly to being extended;
- Integrated Omniconfig API, which serves as convenient version-independent a way to create config files, either via IOmniconfigBuilder or @AnnotationConfig;
- Version-dependent EventHelper integration, which allows you to safely use EventUtils without rendering your mod utterly incompatible with singleplayer;
- Proper development environment support.
Workspace Setup:
Here are the examples of how to setup Grimoire-dependent mod workspace:
- For 1.7.10: https://github.com/Aizistral-Studios/ForgeWorkspaceSetup/tree/1.7.10-grimmix
- For 1.12.2: https://github.com/Aizistral-Studios/ForgeWorkspaceSetup/tree/1.12.2-grimmix
You can find most details over there, and even more on our Wiki. But to praise what was achieved through our hard work, I will mention once more: Grimoire has proper development environment support! Starting a client via runClient task or IDE launch configuration will have Grimoire, all dependent grimmixes and that one grimmix you might be developing yourself properly loaded. Refmap generation also works perfectly fine, so no need to target production-time obfuscated names and sacrifice compatibility with development environment.