diff options
Diffstat (limited to 'forge/src/main/java')
3 files changed, 57 insertions, 0 deletions
diff --git a/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java b/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java index 044bfd081..4aace1982 100644 --- a/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java +++ b/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java @@ -1,11 +1,15 @@ package me.shedaniel.rei.forge; +import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.gui.plugin.DefaultRuntimePlugin; +import me.shedaniel.rei.jeicompat.JEIPluginDetector; import me.shedaniel.rei.plugin.DefaultPlugin; import me.shedaniel.rei.plugin.DefaultServerContainerPlugin; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import java.util.function.Consumer; + import static me.shedaniel.rei.RoughlyEnoughItemsCore.registerPlugin; public class PluginDetectorImpl { @@ -17,5 +21,10 @@ public class PluginDetectorImpl { public static void detectClientPlugins() { registerPlugin(new DefaultPlugin()); registerPlugin(new DefaultRuntimePlugin()); + RoughlyEnoughItemsForge.scanAnnotation(REIPlugin.class, plugin -> { + registerPlugin(((me.shedaniel.rei.api.plugins.REIPlugin) plugin)); + }); + JEIPluginDetector.detect((aClass, consumer) -> RoughlyEnoughItemsForge.scanAnnotation((Class<Object>) aClass, (Consumer<Object>) consumer), + RoughlyEnoughItemsCore::registerPlugin); } } diff --git a/forge/src/main/java/me/shedaniel/rei/forge/REIPlugin.java b/forge/src/main/java/me/shedaniel/rei/forge/REIPlugin.java new file mode 100644 index 000000000..a4acbaa46 --- /dev/null +++ b/forge/src/main/java/me/shedaniel/rei/forge/REIPlugin.java @@ -0,0 +1,11 @@ +package me.shedaniel.rei.forge; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface REIPlugin { +} diff --git a/forge/src/main/java/me/shedaniel/rei/forge/RoughlyEnoughItemsForge.java b/forge/src/main/java/me/shedaniel/rei/forge/RoughlyEnoughItemsForge.java index 9147eb8f2..d96afb6b4 100644 --- a/forge/src/main/java/me/shedaniel/rei/forge/RoughlyEnoughItemsForge.java +++ b/forge/src/main/java/me/shedaniel/rei/forge/RoughlyEnoughItemsForge.java @@ -1,17 +1,54 @@ package me.shedaniel.rei.forge; +import com.google.common.collect.Lists; import me.shedaniel.architectury.platform.forge.EventBuses; import me.shedaniel.rei.RoughlyEnoughItemsInitializer; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.forgespi.language.ModFileScanData; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.ApiStatus; +import org.objectweb.asm.Type; + +import java.util.List; +import java.util.function.Consumer; @Mod("roughlyenoughitems") +@ApiStatus.Internal public class RoughlyEnoughItemsForge { + public static final Logger LOGGER = LogManager.getFormatterLogger("REI"); + public RoughlyEnoughItemsForge() { EventBuses.registerModEventBus("roughlyenoughitems", FMLJavaModLoadingContext.get().getModEventBus()); RoughlyEnoughItemsInitializer.onInitialize(); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> RoughlyEnoughItemsInitializer::onInitializeClient); } + + public static <T> void scanAnnotation(Class<T> clazz, Consumer<T> consumer) { + scanAnnotation(Type.getType(clazz), consumer); + } + + public static <T> void scanAnnotation(Type annotationType, Consumer<T> consumer) { + List<T> instances = Lists.newArrayList(); + for (ModFileScanData data : ModList.get().getAllScanData()) { + for (ModFileScanData.AnnotationData annotation : data.getAnnotations()) { + if (annotationType.equals(annotation.getAnnotationType())) { + try { + T instance = (T) Class.forName(annotation.getMemberName()).getDeclaredConstructor().newInstance(); + instances.add(instance); + } catch (Throwable throwable) { + LOGGER.error("Failed to load plugin: " + annotation.getMemberName(), throwable); + } + } + } + } + + for (T instance : instances) { + consumer.accept(instance); + } + } } |
