From 5122d2ba64e67decc414f47b455dadbd273da268 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sun, 16 Jan 2022 01:18:36 +0800 Subject: Introduce the server component version of REI --- .../me/shedaniel/rei/forge/AnnotationUtils.java | 89 ++++++++++++++++++++++ .../me/shedaniel/rei/forge/PluginDetectorImpl.java | 8 +- .../rei/forge/RoughlyEnoughItemsForge.java | 61 --------------- 3 files changed, 93 insertions(+), 65 deletions(-) create mode 100644 forge/src/main/java/me/shedaniel/rei/forge/AnnotationUtils.java (limited to 'forge/src/main') diff --git a/forge/src/main/java/me/shedaniel/rei/forge/AnnotationUtils.java b/forge/src/main/java/me/shedaniel/rei/forge/AnnotationUtils.java new file mode 100644 index 000000000..f315c20b6 --- /dev/null +++ b/forge/src/main/java/me/shedaniel/rei/forge/AnnotationUtils.java @@ -0,0 +1,89 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 shedaniel + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.shedaniel.rei.forge; + +import com.google.common.collect.Lists; +import me.shedaniel.rei.RoughlyEnoughItemsInitializer; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.forgespi.language.IModInfo; +import net.minecraftforge.forgespi.language.ModFileScanData; +import org.apache.commons.lang3.tuple.ImmutableTriple; +import org.apache.commons.lang3.tuple.Triple; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.util.TriConsumer; +import org.objectweb.asm.Type; + +import java.util.List; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +public class AnnotationUtils { + public static final Logger LOGGER = LogManager.getFormatterLogger("REI"); + + public static void scanAnnotation(Class clazz, Predicate> predicate, TriConsumer, Supplier, Class> consumer) { + scanAnnotation(Type.getType(clazz), predicate, consumer); + } + + public static void scanAnnotation(Type annotationType, Predicate> predicate, TriConsumer, Supplier, Class> consumer) { + List, Supplier, Class>> instances = Lists.newArrayList(); + for (ModFileScanData data : ModList.get().getAllScanData()) { + List modIds = data.getIModInfoData().stream() + .flatMap(info -> info.getMods().stream()) + .map(IModInfo::getModId) + .collect(Collectors.toList()); + out: + for (ModFileScanData.AnnotationData annotation : data.getAnnotations()) { + if (annotationType.equals(annotation.getAnnotationType())) { + try { + Class clazz = (Class) Class.forName(annotation.getMemberName()); + if (predicate.test(clazz)) { + instances.add(new ImmutableTriple<>(modIds, () -> { + try { + return clazz.getDeclaredConstructor().newInstance(); + } catch (Throwable throwable) { + AnnotationUtils.LOGGER.error("Failed to load plugin: " + annotation.getMemberName(), throwable); + return null; + } + }, clazz)); + } + } catch (Throwable throwable) { + Throwable t = throwable; + while (t != null) { + if (t.getMessage() != null && t.getMessage().contains("invalid dist DEDICATED_SERVER") && !RoughlyEnoughItemsInitializer.isClient()) + continue out; + t = t.getCause(); + } + AnnotationUtils.LOGGER.error("Failed to load plugin: " + annotation.getMemberName(), throwable); + } + } + } + } + + for (Triple, Supplier, Class> pair : instances) { + consumer.accept(pair.getLeft(), pair.getMiddle(), pair.getRight()); + } + } +} 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 a0944e80b..ae4b2346a 100644 --- a/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java +++ b/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java @@ -74,14 +74,14 @@ public class PluginDetectorImpl { PluginView.getServerInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultPlugin())); PluginView.getServerInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultRuntimePlugin())); PluginView.getServerInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new JEIExtraPlugin())); - RoughlyEnoughItemsForge.scanAnnotation(REIPlugin.class, REIServerPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> { + AnnotationUtils.scanAnnotation(REIPlugin.class, REIServerPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> { ((PluginView) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(modId, plugin.get())); }); } public static void detectCommonPlugins() { EventBuses.registerModEventBus("roughlyenoughitems", FMLJavaModLoadingContext.get().getModEventBus()); - RoughlyEnoughItemsForge.>scanAnnotation(REIPlugin.class, me.shedaniel.rei.api.common.plugins.REIPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> { + AnnotationUtils.>scanAnnotation(REIPlugin.class, me.shedaniel.rei.api.common.plugins.REIPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> { ((PluginView) PluginManager.getInstance()).registerPlugin(wrapPlugin(modId, plugin.get())); }); } @@ -91,7 +91,7 @@ public class PluginDetectorImpl { PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultClientPlugin())); PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultClientRuntimePlugin())); PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new JEIExtraClientPlugin())); - RoughlyEnoughItemsForge.scanAnnotation(REIPlugin.class, REIClientPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> { + AnnotationUtils.scanAnnotation(REIPlugin.class, REIClientPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> { ((PluginView) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(modId, plugin.get())); }); ClientInternals.attachInstance((Supplier>) () -> { @@ -103,7 +103,7 @@ public class PluginDetectorImpl { } return modIds; }, "jeiCompatMods"); - JEIPluginDetector.detect((aClass, consumer) -> RoughlyEnoughItemsForge.scanAnnotation((Class) aClass, c -> true, + JEIPluginDetector.detect((aClass, consumer) -> AnnotationUtils.scanAnnotation((Class) aClass, c -> true, (TriConsumer, Supplier, Class>) (TriConsumer) consumer), PluginView.getClientInstance()::registerPlugin); } } 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 757f6da71..6383e106c 100644 --- a/forge/src/main/java/me/shedaniel/rei/forge/RoughlyEnoughItemsForge.java +++ b/forge/src/main/java/me/shedaniel/rei/forge/RoughlyEnoughItemsForge.java @@ -23,81 +23,20 @@ package me.shedaniel.rei.forge; -import com.google.common.collect.Lists; import me.shedaniel.rei.RoughlyEnoughItemsInitializer; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.data.loading.DatagenModLoader; import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.forgespi.language.IModInfo; -import net.minecraftforge.forgespi.language.ModFileScanData; -import org.apache.commons.lang3.tuple.ImmutableTriple; -import org.apache.commons.lang3.tuple.Triple; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.util.TriConsumer; import org.jetbrains.annotations.ApiStatus; -import org.objectweb.asm.Type; - -import java.util.List; -import java.util.function.Predicate; -import java.util.function.Supplier; -import java.util.stream.Collectors; @Mod("roughlyenoughitems") @ApiStatus.Internal public class RoughlyEnoughItemsForge { - public static final Logger LOGGER = LogManager.getFormatterLogger("REI"); - public RoughlyEnoughItemsForge() { if (!DatagenModLoader.isRunningDataGen()) { RoughlyEnoughItemsInitializer.onInitialize(); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> RoughlyEnoughItemsInitializer::onInitializeClient); } } - - public static void scanAnnotation(Class clazz, Predicate> predicate, TriConsumer, Supplier, Class> consumer) { - scanAnnotation(Type.getType(clazz), predicate, consumer); - } - - public static void scanAnnotation(Type annotationType, Predicate> predicate, TriConsumer, Supplier, Class> consumer) { - List, Supplier, Class>> instances = Lists.newArrayList(); - for (ModFileScanData data : ModList.get().getAllScanData()) { - List modIds = data.getIModInfoData().stream() - .flatMap(info -> info.getMods().stream()) - .map(IModInfo::getModId) - .collect(Collectors.toList()); - out: - for (ModFileScanData.AnnotationData annotation : data.getAnnotations()) { - if (annotationType.equals(annotation.annotationType())) { - try { - Class clazz = (Class) Class.forName(annotation.memberName()); - if (predicate.test(clazz)) { - instances.add(new ImmutableTriple<>(modIds, () -> { - try { - return clazz.getDeclaredConstructor().newInstance(); - } catch (Throwable throwable) { - LOGGER.error("Failed to load plugin: " + annotation.memberName(), throwable); - return null; - } - }, clazz)); - } - } catch (Throwable throwable) { - Throwable t = throwable; - while (t != null) { - if (t.getMessage() != null && t.getMessage().contains("invalid dist DEDICATED_SERVER") && !RoughlyEnoughItemsInitializer.isClient()) - continue out; - t = t.getCause(); - } - LOGGER.error("Failed to load plugin: " + annotation.memberName(), throwable); - } - } - } - } - - for (Triple, Supplier, Class> pair : instances) { - consumer.accept(pair.getLeft(), pair.getMiddle(), pair.getRight()); - } - } } -- cgit