aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2021-03-09 21:30:12 +0800
committershedaniel <daniel@shedaniel.me>2021-03-09 21:30:12 +0800
commit64bc9937d6ec04c6d66240a84b4fb345026c0b12 (patch)
tree62e055c5cc64875300bdf69ac9a4400fb4b28dd9
parent69d386214f5d3471a3ef1e5533037cdc32648c57 (diff)
downloadRoughlyEnoughItems-64bc9937d6ec04c6d66240a84b4fb345026c0b12.tar.gz
RoughlyEnoughItems-64bc9937d6ec04c6d66240a84b4fb345026c0b12.tar.bz2
RoughlyEnoughItems-64bc9937d6ec04c6d66240a84b4fb345026c0b12.zip
Very primitive background rendering for JEI plugins
Signed-off-by: shedaniel <daniel@shedaniel.me>
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/REIOverlay.java3
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStack.java17
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStackProvider.java21
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStackVisitor.java23
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggingContext.java25
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/gui/widgets/Widget.java1
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/gui/widgets/WidgetWithBounds.java2
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/ingredient/EntryStack.java7
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryDefinition.java1
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryTypeRegistry.java8
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryIngredients.java21
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryStacks.java8
-rwxr-xr-xbuild.gradle9
-rw-r--r--fabric/src/main/java/me/shedaniel/rei/fabric/RoughlyEnoughItemsFabric.java6
-rw-r--r--fabric/src/main/resources/roughlyenoughitems.accessWidener1
-rw-r--r--forge/build.gradle10
-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
-rw-r--r--forge/src/main/resources/META-INF/accesstransformer.cfg54
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java5
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/api/gui/config/entry/FilteringScreen.java5
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java119
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/gui/CurrentDraggingStack.java125
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java4
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java33
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java289
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/EntryTypeRegistryImpl.java11
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/ExclusionZonesImpl.java42
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/registry/CategoryRegistryImpl.java4
-rwxr-xr-xsettings.gradle2
32 files changed, 646 insertions, 269 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/REIOverlay.java b/api/src/main/java/me/shedaniel/rei/api/REIOverlay.java
index 24eaf15bd..c9dc4c16e 100644
--- a/api/src/main/java/me/shedaniel/rei/api/REIOverlay.java
+++ b/api/src/main/java/me/shedaniel/rei/api/REIOverlay.java
@@ -23,9 +23,12 @@
package me.shedaniel.rei.api;
+import me.shedaniel.rei.api.gui.drag.DraggingContext;
import org.jetbrains.annotations.ApiStatus;
@ApiStatus.Experimental
public interface REIOverlay {
void queueReloadOverlay();
+
+ DraggingContext getDraggingContext();
}
diff --git a/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStack.java b/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStack.java
new file mode 100644
index 000000000..8d38fb4c8
--- /dev/null
+++ b/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStack.java
@@ -0,0 +1,17 @@
+package me.shedaniel.rei.api.gui.drag;
+
+import com.mojang.blaze3d.vertex.PoseStack;
+import me.shedaniel.math.Rectangle;
+import me.shedaniel.rei.api.ingredient.EntryStack;
+
+public interface DraggableStack {
+ EntryStack<?> getStack();
+
+ void drag();
+
+ void release(boolean accepted);
+
+ default void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) {
+ getStack().render(matrices, bounds, mouseX, mouseY, delta);
+ }
+} \ No newline at end of file
diff --git a/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStackProvider.java b/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStackProvider.java
new file mode 100644
index 000000000..7b799b26a
--- /dev/null
+++ b/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStackProvider.java
@@ -0,0 +1,21 @@
+package me.shedaniel.rei.api.gui.drag;
+
+import org.jetbrains.annotations.Nullable;
+
+import java.util.function.Supplier;
+
+@FunctionalInterface
+public interface DraggableStackProvider {
+ static DraggableStackProvider from(Supplier<Iterable<DraggableStackProvider>> providers) {
+ return (context, mouseX, mouseY) -> {
+ for (DraggableStackProvider provider : providers.get()) {
+ DraggableStack stack = provider.getHoveredStack(context, mouseX, mouseY);
+ if (stack != null) return stack;
+ }
+ return null;
+ };
+ }
+
+ @Nullable
+ DraggableStack getHoveredStack(DraggingContext context, double mouseX, double mouseY);
+} \ No newline at end of file
diff --git a/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStackVisitor.java b/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStackVisitor.java
new file mode 100644
index 000000000..e0e64bf9a
--- /dev/null
+++ b/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggableStackVisitor.java
@@ -0,0 +1,23 @@
+package me.shedaniel.rei.api.gui.drag;
+
+import java.util.Optional;
+import java.util.function.Supplier;
+
+@FunctionalInterface
+public interface DraggableStackVisitor {
+ static DraggableStackVisitor from(Supplier<Iterable<DraggableStackVisitor>> visitors) {
+ return (stack) -> {
+ for (DraggableStackVisitor visitor : visitors.get()) {
+ Optional<Acceptor> acceptor = visitor.visitDraggedStack(stack);
+ if (acceptor.isPresent()) return acceptor;
+ }
+ return Optional.empty();
+ };
+ }
+
+ Optional<Acceptor> visitDraggedStack(DraggableStack stack);
+
+ interface Acceptor {
+ void accept(DraggableStack stack);
+ }
+}
diff --git a/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggingContext.java b/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggingContext.java
new file mode 100644
index 000000000..cd9bc3a32
--- /dev/null
+++ b/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggingContext.java
@@ -0,0 +1,25 @@
+package me.shedaniel.rei.api.gui.drag;
+
+import me.shedaniel.math.Point;
+import me.shedaniel.rei.api.REIHelper;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.function.Supplier;
+
+public interface DraggingContext {
+ static DraggingContext getInstance() {
+ return REIHelper.getInstance().getOverlay().get().getDraggingContext();
+ }
+
+ default boolean isDraggingStack() {
+ return getCurrentStack() != null;
+ }
+
+ @Nullable
+ DraggableStack getCurrentStack();
+
+ @Nullable
+ Point getCurrentPosition();
+
+ void registerRenderBackToPosition(DraggableStack stack, Supplier<Point> position);
+}
diff --git a/api/src/main/java/me/shedaniel/rei/api/gui/widgets/Widget.java b/api/src/main/java/me/shedaniel/rei/api/gui/widgets/Widget.java
index abe4454ae..ddb4d0d26 100644
--- a/api/src/main/java/me/shedaniel/rei/api/gui/widgets/Widget.java
+++ b/api/src/main/java/me/shedaniel/rei/api/gui/widgets/Widget.java
@@ -75,6 +75,7 @@ public abstract class Widget extends AbstractContainerEventHandler implements ne
}
@Override
+ @Deprecated
public void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) {
render(matrices, mouseX, mouseY, delta);
}
diff --git a/api/src/main/java/me/shedaniel/rei/api/gui/widgets/WidgetWithBounds.java b/api/src/main/java/me/shedaniel/rei/api/gui/widgets/WidgetWithBounds.java
index 17b178bb3..b427d8a47 100644
--- a/api/src/main/java/me/shedaniel/rei/api/gui/widgets/WidgetWithBounds.java
+++ b/api/src/main/java/me/shedaniel/rei/api/gui/widgets/WidgetWithBounds.java
@@ -27,7 +27,6 @@ import me.shedaniel.math.Rectangle;
import org.jetbrains.annotations.NotNull;
public abstract class WidgetWithBounds extends Widget {
-
@NotNull
public abstract Rectangle getBounds();
@@ -35,5 +34,4 @@ public abstract class WidgetWithBounds extends Widget {
public boolean containsMouse(double mouseX, double mouseY) {
return getBounds().contains(mouseX, mouseY);
}
-
}
diff --git a/api/src/main/java/me/shedaniel/rei/api/ingredient/EntryStack.java b/api/src/main/java/me/shedaniel/rei/api/ingredient/EntryStack.java
index 913dded0d..9e62eb9a1 100644
--- a/api/src/main/java/me/shedaniel/rei/api/ingredient/EntryStack.java
+++ b/api/src/main/java/me/shedaniel/rei/api/ingredient/EntryStack.java
@@ -29,11 +29,11 @@ import com.mojang.serialization.Dynamic;
import com.mojang.serialization.JsonOps;
import me.shedaniel.architectury.utils.Fraction;
import me.shedaniel.rei.api.gui.Renderer;
-import me.shedaniel.rei.api.util.TextRepresentable;
import me.shedaniel.rei.api.ingredient.entry.ComparisonContext;
import me.shedaniel.rei.api.ingredient.entry.EntryDefinition;
import me.shedaniel.rei.api.ingredient.entry.EntryRenderer;
import me.shedaniel.rei.api.ingredient.entry.EntryType;
+import me.shedaniel.rei.api.util.TextRepresentable;
import me.shedaniel.rei.impl.Internals;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@@ -202,4 +202,9 @@ public interface EntryStack<T> extends TextRepresentable, Renderer {
setAmount(getAmount().simplify());
return this;
}
+
+ @ApiStatus.NonExtendable
+ default <O> EntryStack<O> cast() {
+ return (EntryStack<O>) this;
+ }
}
diff --git a/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryDefinition.java b/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryDefinition.java
index dcb72f0fe..f2d22668f 100644
--- a/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryDefinition.java
+++ b/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryDefinition.java
@@ -49,7 +49,6 @@ public interface EntryDefinition<T> {
boolean isEmpty(EntryStack<T> entry, T value);
- @NotNull
T copy(EntryStack<T> entry, T value);
int hash(EntryStack<T> entry, T value, ComparisonContext context);
diff --git a/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryTypeRegistry.java b/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryTypeRegistry.java
index 2fd9f0bbb..2397b46a5 100644
--- a/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryTypeRegistry.java
+++ b/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryTypeRegistry.java
@@ -25,11 +25,11 @@ package me.shedaniel.rei.api.ingredient.entry;
import me.shedaniel.rei.api.plugins.PluginManager;
import me.shedaniel.rei.api.registry.Reloadable;
-import me.shedaniel.rei.impl.Internals;
import net.minecraft.resources.ResourceLocation;
-import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.Set;
+
public interface EntryTypeRegistry extends Reloadable {
static EntryTypeRegistry getInstance() {
return PluginManager.getInstance().get(EntryTypeRegistry.class);
@@ -75,6 +75,10 @@ public interface EntryTypeRegistry extends Reloadable {
@Nullable
EntryDefinition<?> get(ResourceLocation id);
+ Set<ResourceLocation> keySet();
+
+ Set<EntryDefinition<?>> values();
+
<A, B> void registerBridge(EntryType<A> original, EntryType<B> destination, EntryTypeBridge<A, B> bridge);
<A, B> Iterable<EntryTypeBridge<A, B>> getBridgesFor(EntryType<A> original, EntryType<B> destination);
diff --git a/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryIngredients.java b/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryIngredients.java
index 0407ae215..bbd401247 100644
--- a/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryIngredients.java
+++ b/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryIngredients.java
@@ -24,10 +24,13 @@
package me.shedaniel.rei.api.ingredient.util;
import com.google.common.collect.ImmutableList;
+import me.shedaniel.architectury.fluid.FluidStack;
import me.shedaniel.architectury.utils.Fraction;
import me.shedaniel.rei.api.gui.Renderer;
import me.shedaniel.rei.api.ingredient.EntryIngredient;
import me.shedaniel.rei.api.ingredient.EntryStack;
+import me.shedaniel.rei.api.ingredient.entry.EntryDefinition;
+import me.shedaniel.rei.api.ingredient.entry.EntryType;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.level.ItemLike;
@@ -65,10 +68,28 @@ public final class EntryIngredients {
return EntryIngredient.of(EntryStacks.of(fluid, amount));
}
+ public static EntryIngredient of(FluidStack stack) {
+ return EntryIngredient.of(EntryStacks.of(stack));
+ }
+
public static EntryIngredient of(Renderer renderer) {
return EntryIngredient.of(EntryStacks.of(renderer));
}
+ public static <T> EntryIngredient of(EntryType<T> type, Collection<T> values) {
+ return of(type.getDefinition(), values);
+ }
+
+ public static <T> EntryIngredient of(EntryDefinition<T> definition, Collection<T> values) {
+ if (values.size() == 0) return EntryIngredient.empty();
+ if (values.size() == 1) return EntryIngredient.of(EntryStack.of(definition, values.iterator().next()));
+ List<EntryStack<T>> result = new ArrayList<>(values.size());
+ for (T value : values) {
+ result.add(EntryStack.of(definition, value));
+ }
+ return EntryIngredient.of(result);
+ }
+
public static EntryIngredient ofItems(Collection<ItemLike> stacks) {
if (stacks.size() == 0) return EntryIngredient.empty();
if (stacks.size() == 1) return EntryIngredient.of(EntryStacks.of(stacks.iterator().next()));
diff --git a/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryStacks.java b/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryStacks.java
index 18144e5df..30b6af005 100644
--- a/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryStacks.java
+++ b/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryStacks.java
@@ -26,9 +26,9 @@ package me.shedaniel.rei.api.ingredient.util;
import com.google.common.collect.ImmutableList;
import me.shedaniel.architectury.fluid.FluidStack;
import me.shedaniel.architectury.utils.Fraction;
+import me.shedaniel.rei.api.gui.Renderer;
import me.shedaniel.rei.api.ingredient.EntryStack;
import me.shedaniel.rei.api.ingredient.entry.*;
-import me.shedaniel.rei.api.gui.Renderer;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Ingredient;
@@ -57,6 +57,10 @@ public final class EntryStacks {
return EntryStack.of(VanillaEntryTypes.FLUID, FluidStack.create(fluid, amount));
}
+ public static EntryStack<FluidStack> of(FluidStack stack) {
+ return EntryStack.of(VanillaEntryTypes.FLUID, stack);
+ }
+
public static EntryStack<ItemStack> of(ItemStack stack) {
return EntryStack.of(VanillaEntryTypes.ITEM, stack);
}
@@ -67,7 +71,7 @@ public final class EntryStacks {
public static EntryStack<?> of(Renderer renderer) {
if (renderer instanceof EntryStack) {
- return (EntryStack<Renderer>) renderer;
+ return (EntryStack<?>) renderer;
}
return EntryStack.of(BuiltinEntryTypes.RENDERING, renderer);
diff --git a/build.gradle b/build.gradle
index 5c5d0c67c..be2737ac4 100755
--- a/build.gradle
+++ b/build.gradle
@@ -1,6 +1,6 @@
plugins {
- id("architectury-plugin") version("3.0.89")
- id("forgified-fabric-loom") version("0.6.71") apply false
+ id("architectury-plugin") version("3.0.97")
+ id("forgified-fabric-loom") version("0.6-SNAPSHOT") apply false
id("org.cadixdev.licenser") version("0.5.0")
id("com.matthewprenger.cursegradle") version("1.4.0")
id("java")
@@ -37,15 +37,10 @@ allprojects {
sourceCompatibility = targetCompatibility = 1.8
repositories {
- mavenLocal()
maven { url "https://maven.shedaniel.me" }
maven { url "https://maven.terraformersmc.com/releases" }
}
- architectury {
- transformerVersion = "2.1.9999"
- }
-
license {
header rootProject.file("HEADER")
include "**/*.java"
diff --git a/fabric/src/main/java/me/shedaniel/rei/fabric/RoughlyEnoughItemsFabric.java b/fabric/src/main/java/me/shedaniel/rei/fabric/RoughlyEnoughItemsFabric.java
index 7172ec864..11266d68e 100644
--- a/fabric/src/main/java/me/shedaniel/rei/fabric/RoughlyEnoughItemsFabric.java
+++ b/fabric/src/main/java/me/shedaniel/rei/fabric/RoughlyEnoughItemsFabric.java
@@ -1,16 +1,16 @@
package me.shedaniel.rei.fabric;
import me.shedaniel.rei.impl.IssuesDetector;
-import net.fabricmc.api.ModInitializer;
+import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.loader.api.FabricLoader;
import org.apache.logging.log4j.Logger;
import java.lang.reflect.Field;
import java.util.Locale;
-public class RoughlyEnoughItemsFabric implements ModInitializer {
+public class RoughlyEnoughItemsFabric implements ClientModInitializer {
@Override
- public void onInitialize() {
+ public void onInitializeClient() {
IssuesDetector.register(() -> {
try {
FabricLoader instance = FabricLoader.getInstance();
diff --git a/fabric/src/main/resources/roughlyenoughitems.accessWidener b/fabric/src/main/resources/roughlyenoughitems.accessWidener
index 4a5503b87..8accdb958 100644
--- a/fabric/src/main/resources/roughlyenoughitems.accessWidener
+++ b/fabric/src/main/resources/roughlyenoughitems.accessWidener
@@ -30,4 +30,3 @@ accessible method net/minecraft/client/gui/screens/Screen
accessible method net/minecraft/client/gui/screens/Screen init ()V
accessible method net/minecraft/client/gui/screens/Screen insertText (Ljava/lang/String;Z)V
accessible method net/minecraft/client/gui/screens/Screen isValidCharacterForName (Ljava/lang/String;CI)Z
-accessible method net/minecraft/tags/TagContainer get (Lnet/minecraft/resources/ResourceKey;)Lnet/minecraft/tags/TagCollection;
diff --git a/forge/build.gradle b/forge/build.gradle
index d81a635c2..ee643b74b 100644
--- a/forge/build.gradle
+++ b/forge/build.gradle
@@ -12,6 +12,10 @@ processResources {
inputs.property "version", project.version
}
+repositories {
+ maven { url "https://www.cursemaven.com" }
+}
+
dependencies {
forge("net.minecraftforge:forge:${rootProject.minecraft_version}-${rootProject.forge_version}")
modApi("me.shedaniel.cloth:cloth-config-forge:${cloth_config_version}")
@@ -20,7 +24,13 @@ dependencies {
implementation(project(path: ":api")) { transitive = false }
implementation(project(path: ":default-plugin")) { transitive = false }
implementation(project(path: ":runtime")) { transitive = false }
+ implementation(project(path: ":jei-compatibility-layer")) { transitive = false }
developmentForge(project(path: ":api")) { transitive = false }
developmentForge(project(path: ":default-plugin")) { transitive = false }
developmentForge(project(path: ":runtime")) { transitive = false }
+ developmentForge(project(path: ":jei-compatibility-layer")) { transitive = false }
+
+ modRuntime("curse.maven:chiselsbits-231095:3176033")
+ modRuntime("curse.maven:jumbofurnace-390880:3120970")
+ modRuntime("curse.maven:cyclic-239286:3221427")
}
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);
+ }
+ }
}
diff --git a/forge/src/main/resources/META-INF/accesstransformer.cfg b/forge/src/main/resources/META-INF/accesstransformer.cfg
index f4a298c9e..2648dd607 100644
--- a/forge/src/main/resources/META-INF/accesstransformer.cfg
+++ b/forge/src/main/resources/META-INF/accesstransformer.cfg
@@ -1,23 +1,31 @@
-public net.minecraft.client.gui.recipebook.RecipeBookGui field_191915_z #ghostRecipe
-public net.minecraft.client.gui.AbstractGui func_238461_a_(Lnet/minecraft/util/math/vector/Matrix4f;IIIIIFFFF)V #innerBlit
-public net.minecraft.client.gui.screen.Screen field_230710_m_ #buttons
-public net.minecraft.entity.player.PlayerInventory field_184440_g #compartments
-public net.minecraft.client.gui.screen.inventory.ContainerScreen field_147007_t #isQuickCrafting
-public net.minecraft.client.gui.widget.button.ImageButton field_191750_o #resourceLocation
-public net.minecraft.item.ItemGroup field_78034_o #langId
-public net.minecraft.item.crafting.SmithingRecipe field_234837_a_ #base
-public net.minecraft.item.crafting.SmithingRecipe field_234838_b_ #addition
-public net.minecraft.client.gui.DisplayEffectsScreen field_147045_u #doRenderEffects
-public net.minecraft.client.gui.recipebook.RecipeBookGui field_193018_j #tabButtons
-public net.minecraft.client.gui.screen.inventory.ContainerScreen field_147006_u #hoveredSlot
-public net.minecraft.client.r