aetherESDownload

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")]
FieldWhat it is for
id ("my_mod")The internal name. Pick one and never change it: settings, registries and crash reports use it.
versionRaise it when you publish changes.
DependsWhat your mod needs to work. If missing, your mod does not start and it is logged.
SuggestsMods that go well with yours. Informational only.
LoadAfterAsks to load after another mod, if installed.
BreaksYour 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:

InterfaceWhen it runsUse it for
IPreLaunchEntrypointAs early as possibleAdvanced low-level things
IModInitializerWhen mods loadRegistering blocks, items and recipes
IClientModInitializerOn the first frame, game aliveUI, keys, scene objects, Harmony
ISceneModInitializerEvery scene loadSetting 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.