Documentation
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) { }

On this page