CompleteConfig.java 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package me.lortseam.completeconfig;
  2. import com.google.common.collect.Sets;
  3. import lombok.NonNull;
  4. import lombok.experimental.UtilityClass;
  5. import lombok.extern.log4j.Log4j2;
  6. import me.lortseam.completeconfig.extensions.CompleteConfigExtension;
  7. import me.lortseam.completeconfig.extensions.Extension;
  8. import me.lortseam.completeconfig.extensions.GuiExtension;
  9. import me.lortseam.completeconfig.extensions.clothbasicmath.ClothBasicMathExtension;
  10. import me.lortseam.completeconfig.util.ReflectionUtils;
  11. import net.fabricmc.api.EnvType;
  12. import net.fabricmc.loader.api.FabricLoader;
  13. import net.fabricmc.loader.api.entrypoint.EntrypointContainer;
  14. import org.apache.commons.lang3.ClassUtils;
  15. import java.lang.reflect.InvocationTargetException;
  16. import java.util.*;
  17. @Log4j2
  18. @UtilityClass
  19. public final class CompleteConfig {
  20. private static final Set<Class<? extends Extension>> validExtensionTypes = Sets.newHashSet(CompleteConfigExtension.class);
  21. private static final Set<Extension> extensions = new HashSet<>();
  22. static {
  23. registerExtensionType(GuiExtension.class, EnvType.CLIENT, "cloth-config2");
  24. registerExtension("cloth-basic-math", ClothBasicMathExtension.class);
  25. for (EntrypointContainer<CompleteConfigExtension> entrypoint : FabricLoader.getInstance().getEntrypointContainers("completeconfig-extension", CompleteConfigExtension.class)) {
  26. registerExtension(entrypoint.getEntrypoint());
  27. }
  28. }
  29. public static void registerExtensionType(Class<? extends Extension> extensionType, EnvType environment, String... mods) {
  30. if(validExtensionTypes.contains(extensionType)) return;
  31. if(environment != null && FabricLoader.getInstance().getEnvironmentType() != environment || Arrays.stream(mods).anyMatch(modID -> !FabricLoader.getInstance().isModLoaded(modID))) return;
  32. validExtensionTypes.add(extensionType);
  33. }
  34. public static void registerExtensionType(Class<? extends Extension> extensionType, String... mods) {
  35. registerExtensionType(extensionType, null, mods);
  36. }
  37. private static void registerExtension(Extension extension) {
  38. extensions.add(extension);
  39. Set<Class<? extends Extension>> children = extension.children();
  40. if(children == null) return;
  41. for (Class<? extends Extension> child : children) {
  42. registerExtension(child);
  43. }
  44. }
  45. private static void registerExtension(Class<? extends Extension> extension) {
  46. if(Collections.disjoint(ClassUtils.getAllInterfaces(extension), validExtensionTypes)) return;
  47. try {
  48. registerExtension(ReflectionUtils.instantiateClass(extension));
  49. } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
  50. logger.error("[CompleteConfig] Failed to instantiate extension " + extension, e);
  51. }
  52. }
  53. public static void registerExtension(@NonNull String modID, @NonNull Class<? extends CompleteConfigExtension> extensionType) {
  54. if(!FabricLoader.getInstance().isModLoaded(modID)) return;
  55. registerExtension(extensionType);
  56. }
  57. public static Collection<Extension> getExtensions() {
  58. return Collections.unmodifiableCollection(extensions);
  59. }
  60. }