diff --git a/README.MD b/README.MD new file mode 100644 index 0000000..21aa5df --- /dev/null +++ b/README.MD @@ -0,0 +1,110 @@ +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; + } +} +``` \ No newline at end of file