SSCL Wiki

A Basic Example

This example shows a small Fabric mod using SSCL with several types of config values.

The example uses one config file, but a mod can register multiple configs when needed.

Mod Class

package com.example.mymod;

import net.fabricmc.api.ModInitializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ExampleMod implements ModInitializer {
	public static final String MOD_ID = "mymod";
	public static final Logger LOGGER =
			LoggerFactory.getLogger(MOD_ID);

	@Override
	public void onInitialize() {
		ExampleModConfig.initialize();

		LOGGER.info("MyMod initialized.");
	}
}

Config Class

package com.example.mymod;

import smilenotalive.sscl.SSCL;
import smilenotalive.sscl.config.BooleanValue;
import smilenotalive.sscl.config.Config;
import smilenotalive.sscl.config.ConfigCategory;
import smilenotalive.sscl.config.ConfigSide;
import smilenotalive.sscl.config.DoubleValue;
import smilenotalive.sscl.config.IntValue;
import smilenotalive.sscl.config.ListValue;

import java.util.List;

public final class ExampleModConfig {
	public static final Config CONFIG = SSCL.create(
			ExampleMod.MOD_ID,
			"MyMod/config.toml",
			ConfigSide.COMMON
	);

	public static final ConfigCategory GENERAL = CONFIG
			.category("general")
			.comment("General mod settings.");

	public static final BooleanValue ENABLED = GENERAL
			.bool("enabled", true)
			.comment("Whether the mod is enabled.")
			.tooltip("Turns the mod on or off.");

	public static final IntValue DISTANCE = GENERAL
			.intValue("distance", 8)
			.min(1)
			.max(32)
			.comment("Maximum working distance.")
			.tooltip("Controls how far the mod can reach.");

	public static final DoubleValue SCALE = GENERAL
			.doubleValue("scale", 1.0)
			.min(0.5)
			.max(2.0)
			.decimals(2)
			.comment("Interface scale.")
			.tooltip("Controls the size of the interface.");

	public static final ListValue<String> NAMES = GENERAL
			.stringList(
					"names",
					List.of("Steve", "Alex")
			)
			.comment("Names used by the mod.")
			.tooltip("Names available to the feature.");

	public static void initialize() {
	}

	private ExampleModConfig() {
	}
}

Generated TOML

The resulting config looks like:

[general]

# General mod settings.

# Whether the mod is enabled.
enabled = true

# Maximum working distance.
# Range: 1 - 32
distance = 8

# Interface scale.
# Range: 0.5 - 2.0
scale = 1.0

# Names used by the mod.
names = ["Steve", "Alex"]

Reading Values

The values can be accessed anywhere in the mod:

if (ExampleModConfig.ENABLED.get()) {
	int distance = ExampleModConfig.DISTANCE.get();
	double scale = ExampleModConfig.SCALE.get();
	List<String> names = ExampleModConfig.NAMES.get();
}

Changing Values

Values can also be changed at runtime:

ExampleModConfig.DISTANCE.set(16);

ExampleModConfig.NAMES.set(
		List.of("Steve", "Alex", "Herobrine")
);

The new values are held in memory until the config is saved.

ExampleModConfig.CONFIG.save();

Multiple Configs

A mod does not have to keep everything in one file.

For example:

public static final Config CLIENT_CONFIG = SSCL.create(
		ExampleMod.MOD_ID,
		"MyMod/client.toml",
		ConfigSide.CLIENT
);

public static final Config SERVER_CONFIG = SSCL.create(
		ExampleMod.MOD_ID,
		"MyMod/server.toml",
		ConfigSide.SERVER
);

These become separate files:

config/
└── MyMod/
	├── client.toml
	└── server.toml

When a mod has multiple configs, SSCL displays them as separate tabs in Mod Menu.