ModdingSettings
Creating a Handler
Add custom settings handlers to your mod
Edit nox.mod.json
{
"type": "mod",
"id": "my.mod",
"version": "1.0.0",
"relations": [
{
"id": "settings",
"type": "depends",
"version": ">=1.0.0",
"register": "git+https://github.com/AtelierVR/nox.settings.git"
}
],
"constraints": [
{ "type": "after", "id": "settings" }
]
}Create the .asmdef
{
"name": "My.Mod",
"references": [
"Nox.Settings",
"Nox.CCK.Settings"
]
}Implement (Button example)
public class MyButton : ButtonHandler {
public MyButton() {
SetLabel("settings.entry.my_mod.general.log.label");
SetButtonText("settings.entry.my_mod.general.log.action");
}
public override string[] GetPath()
=> new[] { "my-mod", "general", "log" };
protected override GameObject GetPrefab()
=> Main.CoreAPI.AssetAPI.GetAsset<GameObject>(
"settings:prefabs/button.prefab");
public override void OnClick(IContext context)
=> Logger.Log("Button clicked!");
}Register
public class Main : IMainModInitializer {
public static Main Instance;
public IMainModCoreAPI CoreAPI;
public static ISettingAPI SettingAPI =>
Instance.CoreAPI.ModAPI
.GetMod("settings")
?.GetInstance<ISettingAPI>();
private MyButton _button;
public void OnInitializeMain(IMainModCoreAPI api) {
Instance = this;
CoreAPI = api;
_button = new MyButton();
SettingAPI?.Add(_button);
}
public void OnDisposeMain() {
SettingAPI?.Remove(_button.GetPath());
Instance = null;
CoreAPI = null;
}
}Advanced Patterns
Path structure — ["category", "group", "entry"]. Category maps to icon (category.png in Assets/settings/icons/).
Conditional visibility:
public override bool IsActive() => condition;React to changes:
public override void OnUpdated(IHandler h) { }Custom prefab:
public override GameObject GetContent(RectTransform t, IMenu m) { }