From bb8a668ee836470f242615bdbfedaaca059beacf Mon Sep 17 00:00:00 2001 From: shedaniel Date: Wed, 28 Sep 2022 18:24:32 +0800 Subject: Changes to how plugins are located, should be smarter and easier --- .../me/shedaniel/rei/forge/PluginDetectorImpl.java | 132 +++++++++++++++++---- 1 file changed, 110 insertions(+), 22 deletions(-) (limited to 'forge/src/main/java/me/shedaniel') 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>>> loaderProvided = Suppliers.memoize(() -> getPluginsLoader(REIPluginLoader.class)); + private static final Supplier>, List>>> loaderProvidedCommon = + Suppliers.memoize(() -> getPluginsLoader(REIPluginLoaderCommon.class)); + private static final Supplier>, List>>> loaderProvidedDist; + + static { + Supplier>, List>>> 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 > List, List>> getPluginsLoader(Class annotation) { List, List>> list = new ArrayList<>(); AnnotationUtils.>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.scanAnnotation(REIPlugin.class, REIServerPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> { ((PluginView) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(modId, plugin.get())); }); + + // Common plugins + AnnotationUtils.scanAnnotation(REIPluginCommon.class, REIServerPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> { + ((PluginView) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(modId, plugin.get())); + }); + + // Dist plugins if (FMLEnvironment.dist == Dist.DEDICATED_SERVER) { AnnotationUtils.scanAnnotation(REIPluginDedicatedServer.class, REIServerPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> { ((PluginView) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(modId, plugin.get())); }); + } else { + AnnotationUtils.scanAnnotation(REIPluginClient.class, REIServerPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> { + ((PluginView) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(modId, plugin.get())); + }); } + + // Loaders for (Map.Entry>, List> entry : loaderProvided.get()) { - REIPluginProvider> provider = entry.getKey(); - Collection> 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) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(entry.getValue(), (REIServerPlugin) plugin)); - } - } + ((PluginView) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(entry.getValue(), wrapAndFilter(entry.getKey(), REIServerPlugin.class))); } - if (FMLEnvironment.dist == Dist.DEDICATED_SERVER) { - for (Map.Entry, List> entry : PluginDetectorImpl.getPluginsLoader(REIPluginLoaderDedicatedServer.class)) { - ((PluginView) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(entry.getValue(), entry.getKey())); - } + for (Map.Entry>, List> entry : loaderProvidedCommon.get()) { + ((PluginView) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(entry.getValue(), wrapAndFilter(entry.getKey(), REIServerPlugin.class))); + } + for (Map.Entry>, List> entry : loaderProvidedDist.get()) { + ((PluginView) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(entry.getValue(), wrapAndFilter(entry.getKey(), REIServerPlugin.class))); } } @Override public void detectCommonPlugins() { EventBuses.registerModEventBus("roughlyenoughitems", FMLJavaModLoadingContext.get().getModEventBus()); + + // Legacy Annotation AnnotationUtils.>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.>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>, List> entry : PluginDetectorImpl.getPluginsLoader(REIPluginLoaderCommon.class)) { + + // Dist plugins + if (FMLEnvironment.dist == Dist.CLIENT) { + AnnotationUtils.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.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>, List> entry : loaderProvided.get()) { + ((PluginView) PluginManager.getInstance()).registerPlugin(wrapPlugin(entry.getValue(), entry.getKey())); + } + for (Map.Entry>, List> entry : loaderProvidedCommon.get()) { + ((PluginView) PluginManager.getInstance()).registerPlugin(wrapPlugin(entry.getValue(), entry.getKey())); + } + for (Map.Entry>, List> 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.scanAnnotation(REIPlugin.class, REIClientPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> { ((PluginView) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(modId, plugin.get())); }); + + // Common plugins + AnnotationUtils.scanAnnotation(REIPluginCommon.class, REIClientPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> { + ((PluginView) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(modId, plugin.get())); + }); + + // Dist plugins AnnotationUtils.scanAnnotation(REIPluginClient.class, REIClientPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> { ((PluginView) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(modId, plugin.get())); }); + + // Loaders for (Map.Entry>, List> entry : loaderProvided.get()) { - REIPluginProvider> provider = entry.getKey(); - Collection> objects = provider.provide(); - for (me.shedaniel.rei.api.common.plugins.REIPlugin plugin : objects) { - if (plugin instanceof REIClientPlugin) { - ((PluginView) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(entry.getValue(), (REIClientPlugin) plugin)); + ((PluginView) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(entry.getValue(), wrapAndFilter(entry.getKey(), REIClientPlugin.class))); + } + for (Map.Entry>, List> entry : loaderProvidedCommon.get()) { + ((PluginView) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(entry.getValue(), wrapAndFilter(entry.getKey(), REIClientPlugin.class))); + } + for (Map.Entry>, List> entry : loaderProvidedDist.get()) { + ((PluginView) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(entry.getValue(), wrapAndFilter(entry.getKey(), REIClientPlugin.class))); + } + }; + } + + private static

> REIPluginProvider

wrapAndFilter(REIPluginProvider provider, Class

clazz) { + return new REIPluginProvider<>() { + @Override + public Collection

provide() { + return new AbstractCollection<>() { + @Override + public Iterator

iterator() { + return Iterables.filter(provider.provide(), clazz).iterator(); + } + + @Override + public int size() { + return Iterators.size(iterator()); } - } + }; + } + + @Override + public Class

getPluginProviderClass() { + return clazz; } - for (Map.Entry, List> entry : PluginDetectorImpl.getPluginsLoader(REIPluginLoaderClient.class)) { - ((PluginView) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(entry.getValue(), entry.getKey())); + + @Override + public String getPluginProviderName() { + return provider.getPluginProviderName(); } }; } -- cgit