CompleteConfig.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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.extension.*;
  7. import me.lortseam.completeconfig.extension.clothbasicmath.ClothBasicMathExtension;
  8. import me.lortseam.completeconfig.extension.clothconfig.GuiExtension;
  9. import me.lortseam.completeconfig.extension.minecraft.MinecraftClientExtension;
  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 java.lang.reflect.InvocationTargetException;
  15. import java.util.*;
  16. import java.util.function.Function;
  17. import java.util.stream.Collectors;
  18. @Log4j2(topic = "CompleteConfig")
  19. @UtilityClass
  20. public final class CompleteConfig {
  21. private static final Set<Class<? extends Extension>> validExtensionTypes = Sets.newHashSet(BaseExtension.class);
  22. private static final Set<Extension> extensions = new HashSet<>();
  23. static {
  24. registerExtensionType(ClientExtension.class, EnvType.CLIENT);
  25. registerExtensionType(ServerExtension.class, EnvType.SERVER);
  26. registerExtensionType(GuiExtension.class, EnvType.CLIENT, "cloth-config2");
  27. registerExtension(MinecraftClientExtension.class);
  28. registerExtension("cloth-basic-math", ClothBasicMathExtension.class);
  29. for (EntrypointContainer<BaseExtension> entrypoint : FabricLoader.getInstance().getEntrypointContainers("completeconfig-extension", BaseExtension.class)) {
  30. registerExtension(entrypoint.getEntrypoint());
  31. }
  32. }
  33. /**
  34. * Registers a custom extension type which depends on the environment type and a list of loaded mods.
  35. *
  36. * @param extensionType the extension type
  37. * @param environment the required environment type
  38. * @param mods the required mods
  39. */
  40. public static void registerExtensionType(@NonNull Class<? extends Extension> extensionType, EnvType environment, String... mods) {
  41. if(validExtensionTypes.contains(extensionType)) return;
  42. if(environment != null && FabricLoader.getInstance().getEnvironmentType() != environment || Arrays.stream(mods).anyMatch(modId -> {
  43. return !FabricLoader.getInstance().isModLoaded(Objects.requireNonNull(modId));
  44. })) return;
  45. validExtensionTypes.add(extensionType);
  46. }
  47. /**
  48. * Registers a custom extension type which depends on a list of loaded mods.
  49. *
  50. * @param extensionType the extension type
  51. * @param mods the required mods
  52. */
  53. public static void registerExtensionType(@NonNull Class<? extends Extension> extensionType, String... mods) {
  54. registerExtensionType(extensionType, null, mods);
  55. }
  56. private static void registerExtension(Extension extension) {
  57. extensions.add(extension);
  58. Set<Class<? extends Extension>> children = extension.children();
  59. if(children == null) return;
  60. for (Class<? extends Extension> child : children) {
  61. registerExtension(child);
  62. }
  63. }
  64. private static void registerExtension(Class<? extends Extension> extension) {
  65. if(!validExtensionTypes.containsAll(Arrays.asList(extension.getInterfaces()))) return;
  66. try {
  67. registerExtension(ReflectionUtils.instantiateClass(extension));
  68. } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
  69. logger.error("Failed to instantiate extension " + extension, e);
  70. }
  71. }
  72. /**
  73. * Registers an external CompleteConfig extension. To register an extension provided by your own mod, use the
  74. * {@link BaseExtension} entrypoint.
  75. *
  76. * @param modId the ID of the external mod
  77. * @param extension the extension
  78. *
  79. * @see BaseExtension
  80. */
  81. public static void registerExtension(@NonNull String modId, @NonNull Class<? extends BaseExtension> extension) {
  82. if(!FabricLoader.getInstance().isModLoaded(modId)) return;
  83. registerExtension(extension);
  84. }
  85. public static <E extends Extension, T> Collection<T> collectExtensions(Class<E> extensionType, Function<E, T> function) {
  86. return extensions.stream().filter(extensionType::isInstance).map(extension -> function.apply((E) extension)).filter(Objects::nonNull).collect(Collectors.toSet());
  87. }
  88. }