DumbassConfigLib is a config library that is used for my mods. If you're a mod developer you can easily implement this library yourself. # Java API To start using the library first include it in your `build.gradle`: ```groovy repositories { ... maven { name = "KaseToatz" url = "https://maven.kasetoatz.com/" } } dependencies { modCompileOnly "com.kasetoatz:dumbassconfiglib:${project.dacl_version}" } ``` Then add dacl_version to your `gradle.properties`, you can check the version on the [versions page](https://modrinth.com/mod/dacl/versions). If you do not want to include this library in your mods folder, replace `modCompileOnly` with `modImplementation`, it is then included inside your mod. ## Creating options Start by creating a new Config class, you can then add your options as public static classes to this class to access them later. You can create options like so: ```java public static final BoolOption TEST_BOOL_OPT = new BoolOption("Test boolean option", "test_bool_opt", false); public static final IntOption TEST_INT_OPT = new IntOption("Test integer option", "test_int_opt", 1); public static final FloatOption TEST_FLOAT_OPT = new FloatOption("Test float option", "test_float_opt", 1.F); ``` The first parameter is the text displayed in the config UI, the second parameter is the unique identifier of the option and the third parameter is the default value. ## Validators For options with an input field you can add a fourth parameter with an `AbstractValidator` to add restrictions to the option's value. To create an integer option that must be between 1 and 100 we can do that like this: ```java public static final IntOption CLAMPED_INT_OPT = new IntOption("Clamped integer option", "clamp_int_opt", 50, new RangeValidator<>(1, 100)); ``` You can also pass null to either the lower or higher bound in `RangeValidator` to remove that restriction. ## Building the config When you're finished creating your options it's time to actually build your config. You can do this using the static `builder` method of `DumbassConfig` like so: ```java public static final DumbassConfig CONFIG = DumbassConfig.builder(Text.literal("Test Screen Title"), "filename.json") .withOption(TEST_BOOL_OPT) .withOption(TEST_INT_OPT) .withOption(TEST_FLOAT_OPT) .build() ``` After building the config, the respective `AbstractOption`'s values are changed when the config is modified, so you can always access them by doing: ```java bool enabled = TEST_BOOL_OPT.getValue(); ``` ## Sub options You can also add sub options that are basically an entirely new screen with it's own options. To create this we can use the `builder` method of the `SubOption` class. We will use CLAMPED_INT_OPT as one of the sub options. ```java public static final SubOption TEST_SUB_OPT = SubOption.builder("Sub Screen Title", "sub_opt") .withOption(CLAMPED_INT_OPT) .build(); ``` We can now add this option to the config builder aswell. We can nest these sub options however deep we want. ## Modmenu support To add our newly created config screen to `modmenu`, we must first add it as a dependency to our mod, you can read how to do so [here](https://modrinth.com/mod/modmenu). Now we can modify our `fabric.mod.json` to set our class as a `modmenu` entrypoint: ```json "entrypoints": { "client": ..., "server": ..., "modmenu": [ "com.kasetoatz.mymod.MyConfig" ] } ``` We can then implement `ModMenuApi` into our class and override `getModConfigScreenFactory` to return our config UI. ```java @Override public ConfigScreenFactory getModConfigScreenFactory() { return CONFIG::getUI; } ``` ## Example ```java public class MyConfig implements ModMenuApi { public static final BoolOption TEST_BOOL_OPT = new BoolOption("Test boolean option", "test_bool_opt", false); public static final IntOption TEST_INT_OPT = new IntOption("Test integer option", "test_int_opt", 1); public static final FloatOption TEST_FLOAT_OPT = new FloatOption("Test float option", "test_float_opt", 1.F); public static final IntOption CLAMPED_INT_OPT = new IntOption("Clamped integer option", "clamp_int_opt", 50, new RangeValidator<>(1, 100)); public static final SubOption TEST_SUB_OPT = SubOption.builder("Sub Screen Title", "sub_opt") .withOption(CLAMPED_INT_OPT) .build(); public static final DumbassConfig CONFIG = DumbassConfig.builder(Text.literal("Test Screen Title"), "filename.json") .withOption(TEST_BOOL_OPT) .withOption(TEST_INT_OPT) .withOption(TEST_FLOAT_OPT) .withOption(TEST_SUB_OPT) .build() @Override public ConfigScreenFactory getModConfigScreenFactory() { return CONFIG::getUI; } } ```