What a mod looks like inside
Your mod does not have to be Aether-only. A regular BepInEx plugin also works in
Aether/Mods: Aether starts it at the right moment. Aether does not lock you in.A mod has two parts: a label saying who it is, and one or more entrypoints saying what it does and when.
The label
It always goes at assembly level ([assembly: …]): that is the only place Aether looks. If you put it on a class, the compiler warns you instead of letting your mod silently never load.
[assembly: AetherMod("my_mod", "1.0.0",
Name = "My Mod",
Author = "Your Name",
Description = "Short description.",
Depends = "aether_ui@0.1.0-alpha")]| Field | What it is for |
|---|---|
id ("my_mod") | The internal name. Pick one and never change it: settings, registries and crash reports use it. |
| version | Raise it when you publish changes. |
Depends | What your mod needs to work. If missing, your mod does not start and it is logged. |
Suggests | Mods that go well with yours. Informational only. |
LoadAfter | Asks to load after another mod, if installed. |
Breaks | Your mod will not start if any of these is installed. |
Entrypoints
They are the doors through which Aether starts your mod. Pick by what you need to do:
| Interface | When it runs | Use it for |
|---|---|---|
IPreLaunchEntrypoint | As early as possible | Advanced low-level things |
IModInitializer | When mods load | Registering blocks, items and recipes |
IClientModInitializer | On the first frame, game alive | UI, keys, scene objects, Harmony |
ISceneModInitializer | Every scene load | Setting up for a specific scene |
A simple mod needs only IModInitializer and IClientModInitializer, as in the template.
Drawing inside Aether’s UI
To show your mod inside Aether’s menu and panels, implement IAetherUiModule and register it with AetherUiModuleRegistry.Register(...). Aether tells it when to start, when to update each frame and when the scene changes. This is a step for after your first mod.