aboutsummaryrefslogtreecommitdiff
path: root/forge/src/main/java
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2022-09-28 18:24:32 +0800
committershedaniel <daniel@shedaniel.me>2022-09-28 18:24:32 +0800
commitbb8a668ee836470f242615bdbfedaaca059beacf (patch)
treedeb8c7c463a7f5a07b7c10d7c0023342b97a4f6d /forge/src/main/java
parent21da31adf62e7d995c120799d235aa9f8ec256d5 (diff)
downloadRoughlyEnoughItems-bb8a668ee836470f242615bdbfedaaca059beacf.tar.gz
RoughlyEnoughItems-bb8a668ee836470f242615bdbfedaaca059beacf.tar.bz2
RoughlyEnoughItems-bb8a668ee836470f242615bdbfedaaca059beacf.zip
Changes to how plugins are located, should be smarter and easier
Diffstat (limited to 'forge/src/main/java')
-rw-r--r--forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java132
1 files changed, 110 insertions, 22 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 d4286ac02..2681299da 100644
--- a/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java
+++ b/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java
@@ -24,6 +24,8 @@
package me.shedaniel.rei.forge;
import com.google.common.base.Suppliers;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Iterators;
import dev.architectury.platform.forge.EventBuses;
import me.shedaniel.rei.api.client.plugins.REIClientPlugin;
import me.shedaniel.rei.api.common.plugins.PluginManager;
@@ -68,12 +70,29 @@ public class PluginDetectorImpl implements PluginDetector {
private static final Supplier<List<Map.Entry<REIPluginProvider<me.shedaniel.rei.api.common.plugins.REIPlugin<?>>, List<String>>>> loaderProvided =
Suppliers.memoize(() -> getPluginsLoader(REIPluginLoader.class));
+ private static final Supplier<List<Map.Entry<REIPluginProvider<me.shedaniel.rei.api.common.plugins.REIPlugin<?>>, List<String>>>> loaderProvidedCommon =
+ Suppliers.memoize(() -> getPluginsLoader(REIPluginLoaderCommon.class));
+ private static final Supplier<List<Map.Entry<REIPluginProvider<me.shedaniel.rei.api.common.plugins.REIPlugin<?>>, List<String>>>> loaderProvidedDist;
+
+ static {
+ Supplier<List<Map.Entry<REIPluginProvider<me.shedaniel.rei.api.common.plugins.REIPlugin<?>>, List<String>>>> dist;
+ if (FMLEnvironment.dist == Dist.CLIENT) {
+ dist = Suppliers.memoize(() -> getPluginsLoader(REIPluginLoaderClient.class));
+ } else if (FMLEnvironment.dist == Dist.DEDICATED_SERVER) {
+ dist = Suppliers.memoize(() -> getPluginsLoader(REIPluginLoaderDedicatedServer.class));
+ } else throw new IllegalStateException("Unknown environment: " + FMLEnvironment.dist);
+ loaderProvidedDist = dist;
+ }
@NotNull
private static <T, P extends me.shedaniel.rei.api.common.plugins.REIPlugin<?>> List<Map.Entry<REIPluginProvider<P>, List<String>>> getPluginsLoader(Class<T> annotation) {
List<Map.Entry<REIPluginProvider<P>, List<String>>> list = new ArrayList<>();
AnnotationUtils.<T, REIPluginProvider<P>>scanAnnotation(annotation, REIPluginProvider.class::isAssignableFrom, (modId, provider, clazz) -> {
- list.add(new AbstractMap.SimpleEntry<>(provider.get(), modId));
+ try {
+ list.add(new AbstractMap.SimpleEntry<>(provider.get(), modId));
+ } catch (Throwable throwable) {
+ throwable.printStackTrace();
+ }
});
return list;
}
@@ -82,41 +101,73 @@ public class PluginDetectorImpl implements PluginDetector {
public void detectServerPlugins() {
PluginView.getServerInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultPluginImpl()));
PluginView.getServerInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultRuntimePlugin()));
+
+ // Legacy Annotation
AnnotationUtils.<REIPlugin, REIServerPlugin>scanAnnotation(REIPlugin.class, REIServerPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> {
((PluginView<REIServerPlugin>) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(modId, plugin.get()));
});
+
+ // Common plugins
+ AnnotationUtils.<REIPluginCommon, REIServerPlugin>scanAnnotation(REIPluginCommon.class, REIServerPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> {
+ ((PluginView<REIServerPlugin>) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(modId, plugin.get()));
+ });
+
+ // Dist plugins
if (FMLEnvironment.dist == Dist.DEDICATED_SERVER) {
AnnotationUtils.<REIPluginDedicatedServer, REIServerPlugin>scanAnnotation(REIPluginDedicatedServer.class, REIServerPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> {
((PluginView<REIServerPlugin>) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(modId, plugin.get()));
});
+ } else {
+ AnnotationUtils.<REIPluginClient, REIServerPlugin>scanAnnotation(REIPluginClient.class, REIServerPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> {
+ ((PluginView<REIServerPlugin>) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(modId, plugin.get()));
+ });
}
+
+ // Loaders
for (Map.Entry<REIPluginProvider<me.shedaniel.rei.api.common.plugins.REIPlugin<?>>, List<String>> entry : loaderProvided.get()) {
- REIPluginProvider<me.shedaniel.rei.api.common.plugins.REIPlugin<?>> provider = entry.getKey();
- Collection<me.shedaniel.rei.api.common.plugins.REIPlugin<?>> objects = provider.provide();
- for (me.shedaniel.rei.api.common.plugins.REIPlugin<?> plugin : objects) {
- ((PluginView) PluginManager.getInstance()).registerPlugin(wrapPlugin(entry.getValue(), plugin));
- if (plugin instanceof REIServerPlugin) {
- ((PluginView<REIServerPlugin>) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(entry.getValue(), (REIServerPlugin) plugin));
- }
- }
+ ((PluginView<REIServerPlugin>) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(entry.getValue(), wrapAndFilter(entry.getKey(), REIServerPlugin.class)));
}
- if (FMLEnvironment.dist == Dist.DEDICATED_SERVER) {
- for (Map.Entry<REIPluginProvider<REIServerPlugin>, List<String>> entry : PluginDetectorImpl.<REIPluginLoaderDedicatedServer, REIServerPlugin>getPluginsLoader(REIPluginLoaderDedicatedServer.class)) {
- ((PluginView<REIServerPlugin>) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(entry.getValue(), entry.getKey()));
- }
+ for (Map.Entry<REIPluginProvider<me.shedaniel.rei.api.common.plugins.REIPlugin<?>>, List<String>> entry : loaderProvidedCommon.get()) {
+ ((PluginView<REIServerPlugin>) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(entry.getValue(), wrapAndFilter(entry.getKey(), REIServerPlugin.class)));
+ }
+ for (Map.Entry<REIPluginProvider<me.shedaniel.rei.api.common.plugins.REIPlugin<?>>, List<String>> entry : loaderProvidedDist.get()) {
+ ((PluginView<REIServerPlugin>) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(entry.getValue(), wrapAndFilter(entry.getKey(), REIServerPlugin.class)));
}
}
@Override
public void detectCommonPlugins() {
EventBuses.registerModEventBus("roughlyenoughitems", FMLJavaModLoadingContext.get().getModEventBus());
+
+ // Legacy Annotation
AnnotationUtils.<REIPlugin, me.shedaniel.rei.api.common.plugins.REIPlugin<?>>scanAnnotation(REIPlugin.class, me.shedaniel.rei.api.common.plugins.REIPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> {
((PluginView) PluginManager.getInstance()).registerPlugin(wrapPlugin(modId, plugin.get()));
});
+
+ // Common plugins
AnnotationUtils.<REIPluginCommon, me.shedaniel.rei.api.common.plugins.REIPlugin<?>>scanAnnotation(REIPluginCommon.class, me.shedaniel.rei.api.common.plugins.REIPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> {
((PluginView) PluginManager.getInstance()).registerPlugin(wrapPlugin(modId, plugin.get()));
});
- for (Map.Entry<REIPluginProvider<me.shedaniel.rei.api.common.plugins.REIPlugin<?>>, List<String>> entry : PluginDetectorImpl.getPluginsLoader(REIPluginLoaderCommon.class)) {
+
+ // Dist plugins
+ if (FMLEnvironment.dist == Dist.CLIENT) {
+ AnnotationUtils.<REIPluginClient, me.shedaniel.rei.api.common.plugins.REIPlugin>scanAnnotation(REIPluginClient.class, me.shedaniel.rei.api.common.plugins.REIPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> {
+ ((PluginView) PluginManager.getInstance()).registerPlugin(wrapPlugin(modId, plugin.get()));
+ });
+ } else if (FMLEnvironment.dist == Dist.DEDICATED_SERVER) {
+ AnnotationUtils.<REIPluginDedicatedServer, me.shedaniel.rei.api.common.plugins.REIPlugin>scanAnnotation(REIPluginDedicatedServer.class, me.shedaniel.rei.api.common.plugins.REIPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> {
+ ((PluginView) PluginManager.getInstance()).registerPlugin(wrapPlugin(modId, plugin.get()));
+ });
+ }
+
+ // Loaders
+ for (Map.Entry<REIPluginProvider<me.shedaniel.rei.api.common.plugins.REIPlugin<?>>, List<String>> entry : loaderProvided.get()) {
+ ((PluginView) PluginManager.getInstance()).registerPlugin(wrapPlugin(entry.getValue(), entry.getKey()));
+ }
+ for (Map.Entry<REIPluginProvider<me.shedaniel.rei.api.common.plugins.REIPlugin<?>>, List<String>> entry : loaderProvidedCommon.get()) {
+ ((PluginView) PluginManager.getInstance()).registerPlugin(wrapPlugin(entry.getValue(), entry.getKey()));
+ }
+ for (Map.Entry<REIPluginProvider<me.shedaniel.rei.api.common.plugins.REIPlugin<?>>, List<String>> entry : loaderProvidedDist.get()) {
((PluginView) PluginManager.getInstance()).registerPlugin(wrapPlugin(entry.getValue(), entry.getKey()));
}
}
@@ -127,23 +178,60 @@ public class PluginDetectorImpl implements PluginDetector {
return () -> () -> {
PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultClientPluginImpl()));
PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultClientRuntimePlugin()));
+
+ // Legacy Annotation
AnnotationUtils.<REIPlugin, REIClientPlugin>scanAnnotation(REIPlugin.class, REIClientPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> {
((PluginView<REIClientPlugin>) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(modId, plugin.get()));
});
+
+ // Common plugins
+ AnnotationUtils.<REIPluginCommon, REIClientPlugin>scanAnnotation(REIPluginCommon.class, REIClientPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> {
+ ((PluginView<REIClientPlugin>) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(modId, plugin.get()));
+ });
+
+ // Dist plugins
AnnotationUtils.<REIPluginClient, REIClientPlugin>scanAnnotation(REIPluginClient.class, REIClientPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> {
((PluginView<REIClientPlugin>) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(modId, plugin.get()));
});
+
+ // Loaders
for (Map.Entry<REIPluginProvider<me.shedaniel.rei.api.common.plugins.REIPlugin<?>>, List<String>> entry : loaderProvided.get()) {
- REIPluginProvider<me.shedaniel.rei.api.common.plugins.REIPlugin<?>> provider = entry.getKey();
- Collection<me.shedaniel.rei.api.common.plugins.REIPlugin<?>> objects = provider.provide();
- for (me.shedaniel.rei.api.common.plugins.REIPlugin<?> plugin : objects) {
- if (plugin instanceof REIClientPlugin) {
- ((PluginView<REIClientPlugin>) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(entry.getValue(), (REIClientPlugin) plugin));
+ ((PluginView<REIClientPlugin>) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(entry.getValue(), wrapAndFilter(entry.getKey(), REIClientPlugin.class)));
+ }
+ for (Map.Entry<REIPluginProvider<me.shedaniel.rei.api.common.plugins.REIPlugin<?>>, List<String>> entry : loaderProvidedCommon.get()) {
+ ((PluginView<REIClientPlugin>) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(entry.getValue(), wrapAndFilter(entry.getKey(), REIClientPlugin.class)));
+ }
+ for (Map.Entry<REIPluginProvider<me.shedaniel.rei.api.common.plugins.REIPlugin<?>>, List<String>> entry : loaderProvidedDist.get()) {
+ ((PluginView<REIClientPlugin>) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(entry.getValue(), wrapAndFilter(entry.getKey(), REIClientPlugin.class)));
+ }
+ };
+ }
+
+ private static <P extends me.shedaniel.rei.api.common.plugins.REIPlugin<P>> REIPluginProvider<P> wrapAndFilter(REIPluginProvider<?> provider, Class<P> clazz) {
+ return new REIPluginProvider<>() {
+ @Override
+ public Collection<P> provide() {
+ return new AbstractCollection<>() {
+ @Override
+ public Iterator<P> iterator() {
+ return Iterables.filter(provider.provide(), clazz).iterator();
+ }
+
+ @Override
+ public int size() {
+ return Iterators.size(iterator());
}
- }
+ };
+ }
+
+ @Override
+ public Class<P> getPluginProviderClass() {
+ return clazz;
}
- for (Map.Entry<REIPluginProvider<REIClientPlugin>, List<String>> entry : PluginDetectorImpl.<REIPluginLoaderClient, REIClientPlugin>getPluginsLoader(REIPluginLoaderClient.class)) {
- ((PluginView<REIClientPlugin>) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(entry.getValue(), entry.getKey()));
+
+ @Override
+ public String getPluginProviderName() {
+ return provider.getPluginProviderName();
}
};
}