-
Notifications
You must be signed in to change notification settings - Fork 0
Rubric Quick Start
Minimal mod using Rubric. Both Fabric and NeoForge entry points are shown; the config definition itself is loader-neutral. Assumes you've already followed Installation.
Annotate a plain Java class. Public no-arg constructor, public fields with default values.
package com.example.mymod;
import com.oliveryasuna.mc.rubric.api.Format;
import com.oliveryasuna.mc.rubric.api.annotation.*;
@Config(id = "mymod", name = "mymod", format = Format.TOML, version = 1)
public final class MyModConfig {
@Comment("Master toggle for the demo feature.")
public boolean enabled = true;
@Comment("Tick interval — server-authoritative.")
@Range(min = 50, max = 5_000)
@Sync(Sync.Scope.SERVER)
public int tickIntervalMillis = 200;
@Comment("Client-only display opacity.")
@Range(min = 0.0, max = 1.0)
public double opacity = 0.8;
@Comment("Quality preset.")
@OneOf({"low", "medium", "high"})
public String quality = "medium";
public MyModConfig() { super(); }
}Rubric infers everything else from the class: boolean/double/String become toggles/sliders/text fields in the GUI, @Range sizes the slider bounds, @OneOf becomes a dropdown.
Rubric's loader integration has already bootstrapped the runtime by the time your mod's constructor / onInitialize runs — you just call Rubric.register.
package com.example.mymod;
import com.oliveryasuna.mc.rubric.core.ConfigHandle;
import com.oliveryasuna.mc.rubric.core.Rubric;
import net.fabricmc.api.ModInitializer;
public final class MyMod implements ModInitializer {
private static ConfigHandle<MyModConfig> config;
public static MyModConfig config() {
return config.get();
}
@Override
public void onInitialize() {
config = Rubric.register(MyModConfig.class, null);
}
}package com.example.mymod;
import com.oliveryasuna.mc.rubric.core.ConfigHandle;
import com.oliveryasuna.mc.rubric.core.Rubric;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.common.Mod;
@Mod(MyMod.MOD_ID)
public final class MyMod {
public static final String MOD_ID = "mymod";
private static ConfigHandle<MyModConfig> config;
public static MyModConfig config() {
return config.get();
}
public MyMod(final IEventBus modEventBus) {
config = Rubric.register(MyModConfig.class, null);
}
}That's it. On first launch the config file is created at <gameDir>/config/mymod.toml.
if(MyMod.config().enabled) {
// ...
}MyMod.config().manager().getEvents().subscribe(event -> {
if("opacity".equals(event.path())) {
// opacity changed at runtime — repaint your overlay
}
});Or listen for reloads (config file edited externally, or the user hits Save in the GUI):
MyMod.config().manager().addReloadListener((previous, current) -> {
// called on every reload after the first, on the main thread
});Nothing extra to do on Fabric — Rubric's ModMenu / Catalogue integration surfaces your config automatically as long as the @Config#id ("mymod" above) matches your loader mod id (fabric.mod.json#id).
On NeoForge, register the mod-list Config button in your client-side class via NG's standard extension point:
package com.example.mymod;
import com.oliveryasuna.mc.rubric.neoforge.gui.RubricGui;
import net.minecraft.client.Minecraft;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.ModContainer;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
@Mod(value = MyMod.MOD_ID, dist = Dist.CLIENT)
public final class MyModClient {
public MyModClient(final IEventBus modEventBus, final ModContainer container) {
container.registerExtensionPoint(
IConfigScreenFactory.class,
(mc, parent) -> RubricGui.openFor(Minecraft.getInstance(), parent, MyMod.config().manager())
);
}
}If you own more than one config, register each — Rubric groups them under a chooser sub-screen behind your single mod entry (see Frontends for the details).
- Annotations — every knob Rubric reads from your class.
- Concepts — the vocabulary you'll see in Rubric's own APIs and Javadoc.
-
Sync — server-authoritative values (like
tickIntervalMillisabove). -
Migration — writing steps for
version = 2when the schema changes.
Rubric
Reference
Runtime
GUI
Help