Hey
I'm attempting to store interdependent config data using ForgeConfigSpec API, ie a (variable size) List<MyClass> with MyClass having a String field and a List<String> field.
I'd imagine this would involve implementing a serializer/deserializer, but i'm not entirely sure how to go about it, or if its even possible.
Using the overload for ForgeConfigSpec.Builder.defineList and define that takes a List<String> for the path works somewhat but the number of config values that can be stored this way are hard-coded which is undesirable;
[myClass1]
name = "a"
values = ["a", "b", "c"]
[myClass2]
name = "b"
values = ["c", "b", "a"]
This is what i've tried;
@Mod.EventBusSubscriber(modid = Constants.MODID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class ConfigHandler {
static public final CommonConfig COMMON_CONFIG;
static public final ForgeConfigSpec COMMON_SPEC;
static {
final Pair<CommonConfig, ForgeConfigSpec> serverSpecPair = new ForgeConfigSpec.Builder().configure(CommonConfig::new);
COMMON_CONFIG = serverSpecPair.getLeft();
COMMON_SPEC = serverSpecPair.getRight();
}
@SubscribeEvent
public static void onModConfigEvent(final ModConfigEvent configEvent) {
if (configEvent.getConfig().getSpec() == ConfigHandler.COMMON_SPEC) {
bakeCommonConfig();
}
}
//Common
public static List<MyClass> myClasses;
public static void bakeCommonConfig() {
myClasses = COMMON_CONFIG.myClasses.get()
}
public static class CommonConfig {
public final ForgeConfigSpec.ConfigValue<List<MyClass>> myClasses;
List<MyClass> defaults = Arrays.asList(new MyClass("a", new ArrayList()));
public CommonConfig(ForgeConfigSpec.Builder builder) {
Predicate<Object> validator = o -> o instanceof MyClass;
myClasses = builder.defineList("myClasses", defaults, validator);
}
}
}
public class MyClass {
public String name;
public List<String> values;
public MyClass(String name, List<String> values)
{
this.name = name;
this.values = values;
}
}