aboutsummaryrefslogtreecommitdiff
path: root/forge/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'forge/src/main/java')
-rw-r--r--forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java9
-rw-r--r--forge/src/main/java/me/shedaniel/rei/forge/REIPlugin.java11
-rw-r--r--forge/src/main/java/me/shedaniel/rei/forge/RoughlyEnoughItemsForge.java37
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);
+ }
+ }
}