package me.lortseam.completeconfig; import com.google.common.collect.Sets; import lombok.NonNull; import lombok.experimental.UtilityClass; import lombok.extern.log4j.Log4j2; import me.lortseam.completeconfig.extensions.CompleteConfigExtension; import me.lortseam.completeconfig.extensions.Extension; import me.lortseam.completeconfig.extensions.GuiExtension; import me.lortseam.completeconfig.extensions.clothbasicmath.ClothBasicMathExtension; import me.lortseam.completeconfig.util.ReflectionUtils; import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.entrypoint.EntrypointContainer; import org.apache.commons.lang3.ClassUtils; import java.lang.reflect.InvocationTargetException; import java.util.*; @Log4j2 @UtilityClass public final class CompleteConfig { private static final Set> validExtensionTypes = Sets.newHashSet(CompleteConfigExtension.class); private static final Set extensions = new HashSet<>(); static { registerExtensionType(GuiExtension.class, EnvType.CLIENT, "cloth-config2"); registerExtension("cloth-basic-math", ClothBasicMathExtension.class); for (EntrypointContainer entrypoint : FabricLoader.getInstance().getEntrypointContainers("completeconfig-extension", CompleteConfigExtension.class)) { registerExtension(entrypoint.getEntrypoint()); } } public static void registerExtensionType(Class extensionType, EnvType environment, String... mods) { if(validExtensionTypes.contains(extensionType)) return; if(environment != null && FabricLoader.getInstance().getEnvironmentType() != environment || Arrays.stream(mods).anyMatch(modID -> !FabricLoader.getInstance().isModLoaded(modID))) return; validExtensionTypes.add(extensionType); } public static void registerExtensionType(Class extensionType, String... mods) { registerExtensionType(extensionType, null, mods); } private static void registerExtension(Extension extension) { extensions.add(extension); Set> children = extension.children(); if(children == null) return; for (Class child : children) { registerExtension(child); } } private static void registerExtension(Class extension) { if(Collections.disjoint(ClassUtils.getAllInterfaces(extension), validExtensionTypes)) return; try { registerExtension(ReflectionUtils.instantiateClass(extension)); } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { logger.error("[CompleteConfig] Failed to instantiate extension " + extension, e); } } public static void registerExtension(@NonNull String modID, @NonNull Class extensionType) { if(!FabricLoader.getInstance().isModLoaded(modID)) return; registerExtension(extensionType); } public static Collection getExtensions() { return Collections.unmodifiableCollection(extensions); } }