aboutsummaryrefslogtreecommitdiff
path: root/runtime/src/main/java/me/shedaniel/rei/impl
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2021-02-05 21:55:26 +0800
committershedaniel <daniel@shedaniel.me>2021-02-05 21:55:26 +0800
commitdc92d0a4d262b633e9f322def3e89ab1a05417ab (patch)
tree75d51513b5d930f0456959c6034ba02e21cf12d5 /runtime/src/main/java/me/shedaniel/rei/impl
parentea634e7ba29146d4ebc2c05b61257fa6c3b0642e (diff)
downloadRoughlyEnoughItems-dc92d0a4d262b633e9f322def3e89ab1a05417ab.tar.gz
RoughlyEnoughItems-dc92d0a4d262b633e9f322def3e89ab1a05417ab.tar.bz2
RoughlyEnoughItems-dc92d0a4d262b633e9f322def3e89ab1a05417ab.zip
More
Signed-off-by: shedaniel <daniel@shedaniel.me>
Diffstat (limited to 'runtime/src/main/java/me/shedaniel/rei/impl')
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/AbstractEntryStack.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/Animator.java5
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java5
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java6
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/DisplayBoundsRegistryImpl.java4
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/ExclusionZonesImpl.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/InternalWidgets.java14
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/RecipeRegistryImpl.java47
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/ScreenHelper.java9
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/SearchArgument.java4
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/entry/EmptyEntryDefinition.java6
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/filtering/FilteringContextImpl.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/filtering/FilteringResult.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/filtering/FilteringRule.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/ManualFilteringRule.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/SearchFilteringRule.java6
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/registry/CategoryRegistryImpl.java73
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/subsets/SubsetsRegistryImpl.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/widgets/ArrowWidget.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/widgets/BurningFireWidget.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/widgets/ButtonWidget.java6
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/widgets/DrawableWidget.java4
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/widgets/FillRectangleDrawableConsumer.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/widgets/LabelWidget.java6
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/widgets/PanelWidget.java6
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/widgets/TextFieldWidget.java642
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/widgets/TexturedDrawableConsumer.java2
29 files changed, 787 insertions, 82 deletions
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/AbstractEntryStack.java b/runtime/src/main/java/me/shedaniel/rei/impl/AbstractEntryStack.java
index 2fb86d66a..d018a34f1 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/AbstractEntryStack.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/AbstractEntryStack.java
@@ -33,7 +33,7 @@ import me.shedaniel.rei.api.ingredient.EntryStack;
import me.shedaniel.rei.api.ingredient.entry.AbstractRenderer;
import me.shedaniel.rei.api.ingredient.entry.ComparisonContext;
import me.shedaniel.rei.api.ingredient.util.EntryStacks;
-import me.shedaniel.rei.api.widgets.Tooltip;
+import me.shedaniel.rei.api.gui.widgets.Tooltip;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/Animator.java b/runtime/src/main/java/me/shedaniel/rei/impl/Animator.java
index d5cf646e7..69d3f0a8f 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/Animator.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/Animator.java
@@ -24,6 +24,7 @@
package me.shedaniel.rei.impl;
import me.shedaniel.clothconfig2.api.ScrollingContainer;
+import me.shedaniel.clothconfig2.impl.EasingMethod;
import net.minecraft.Util;
import org.jetbrains.annotations.ApiStatus;
@@ -65,9 +66,9 @@ public final class Animator extends Number {
public void update(double delta) {
if (duration != 0) {
if (amount < target)
- this.amount = Math.min(ScrollingContainer.ease(amount, target + (target - amount), Math.min(((double) Util.getMillis() - start) / duration * delta * 3.0D, 1.0D), v -> v), target);
+ this.amount = Math.min(ScrollingContainer.ease(amount, target + (target - amount), Math.min(((double) Util.getMillis() - start) / duration * delta * 3.0D, 1.0D), EasingMethod.EasingMethodImpl.LINEAR), target);
else if (amount > target)
- this.amount = Math.max(ScrollingContainer.ease(amount, target - (amount - target), Math.min(((double) Util.getMillis() - start) / duration * delta * 3.0D, 1.0D), v -> v), target);
+ this.amount = Math.max(ScrollingContainer.ease(amount, target - (amount - target), Math.min(((double) Util.getMillis() - start) / duration * delta * 3.0D, 1.0D), EasingMethod.EasingMethodImpl.LINEAR), target);
}
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java
index 5d3b91900..985096137 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java
@@ -32,12 +32,13 @@ import me.shedaniel.rei.api.*;
import me.shedaniel.rei.api.ingredient.EntryStack;
import me.shedaniel.rei.api.ingredient.util.EntryStacks;
import me.shedaniel.rei.api.ingredient.entry.VanillaEntryTypes;
-import me.shedaniel.rei.api.registry.category.DisplayCategory;
+import me.shedaniel.rei.api.registry.display.Display;
+import me.shedaniel.rei.api.registry.display.DisplayCategory;
import me.shedaniel.rei.gui.PreRecipeViewingScreen;
import me.shedaniel.rei.gui.RecipeScreen;
import me.shedaniel.rei.gui.RecipeViewingScreen;
import me.shedaniel.rei.gui.VillagerRecipeViewingScreen;
-import me.shedaniel.rei.gui.config.RecipeScreenType;
+import me.shedaniel.rei.api.gui.config.RecipeScreenType;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java
index ce9372fd7..43e50d7b0 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java
@@ -56,9 +56,9 @@ import me.shedaniel.rei.api.favorites.FavoriteEntry;
import me.shedaniel.rei.gui.ContainerScreenOverlay;
import me.shedaniel.rei.gui.TransformingScreen;
import me.shedaniel.rei.gui.WarningAndErrorScreen;
-import me.shedaniel.rei.gui.config.RecipeScreenType;
-import me.shedaniel.rei.gui.config.SyntaxHighlightingMode;
-import me.shedaniel.rei.gui.config.entry.*;
+import me.shedaniel.rei.api.gui.config.RecipeScreenType;
+import me.shedaniel.rei.api.gui.config.SyntaxHighlightingMode;
+import me.shedaniel.rei.api.gui.config.entry.*;
import me.shedaniel.rei.gui.credits.CreditsScreen;
import me.shedaniel.rei.impl.filtering.FilteringRule;
import me.shedaniel.rei.impl.filtering.rules.ManualFilteringRule;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java
index 5765f81eb..fdfef10c9 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java
@@ -33,7 +33,7 @@ import me.shedaniel.clothconfig2.api.ModifierKeyCode;
import me.shedaniel.rei.api.ConfigObject;
import me.shedaniel.rei.api.ingredient.EntryStack;
import me.shedaniel.rei.api.favorites.FavoriteEntry;
-import me.shedaniel.rei.gui.config.*;
+import me.shedaniel.rei.api.gui.config.*;
import me.shedaniel.rei.impl.filtering.FilteringRule;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/DisplayBoundsRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/DisplayBoundsRegistryImpl.java
index 05d8bc98b..df636a2c1 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/DisplayBoundsRegistryImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/DisplayBoundsRegistryImpl.java
@@ -30,8 +30,8 @@ import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.ExclusionZones;
import me.shedaniel.rei.api.DisplayBoundsRegistry;
import me.shedaniel.rei.api.OverlayDecider;
-import me.shedaniel.rei.gui.config.DisplayPanelLocation;
-import me.shedaniel.rei.utils.CollectionUtils;
+import me.shedaniel.rei.api.gui.config.DisplayPanelLocation;
+import me.shedaniel.rei.api.util.CollectionUtils;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.Minecraft;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java
index a9a5aa386..d5ff03c28 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java
@@ -33,7 +33,7 @@ import me.shedaniel.rei.api.ingredient.util.EntryStacks;
import me.shedaniel.rei.impl.filtering.FilteringContextImpl;
import me.shedaniel.rei.impl.filtering.FilteringContextType;
import me.shedaniel.rei.impl.filtering.FilteringRule;
-import me.shedaniel.rei.utils.CollectionUtils;
+import me.shedaniel.rei.api.util.CollectionUtils;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.core.NonNullList;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/ExclusionZonesImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/ExclusionZonesImpl.java
index 6954b66ad..f9c12dea6 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/ExclusionZonesImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/ExclusionZonesImpl.java
@@ -27,7 +27,7 @@ import com.google.common.collect.Lists;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.ExclusionZones;
import me.shedaniel.rei.api.DisplayBoundsRegistry;
-import me.shedaniel.rei.gui.config.DisplayPanelLocation;
+import me.shedaniel.rei.api.gui.config.DisplayPanelLocation;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.Minecraft;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/InternalWidgets.java b/runtime/src/main/java/me/shedaniel/rei/impl/InternalWidgets.java
index 1f241c0fb..1c4834c05 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/InternalWidgets.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/InternalWidgets.java
@@ -29,14 +29,16 @@ import it.unimi.dsi.fastutil.ints.IntList;
import me.shedaniel.math.Rectangle;
import me.shedaniel.math.impl.PointHelper;
import me.shedaniel.rei.api.*;
-import me.shedaniel.rei.api.registry.category.DisplayCategory;
-import me.shedaniel.rei.api.widgets.Button;
-import me.shedaniel.rei.api.widgets.Widgets;
+import me.shedaniel.rei.api.registry.display.Display;
+import me.shedaniel.rei.api.registry.display.DisplayCategory;
+import me.shedaniel.rei.api.gui.widgets.Button;
+import me.shedaniel.rei.api.gui.widgets.Widgets;
+import me.shedaniel.rei.api.registry.display.TransferDisplayCategory;
import me.shedaniel.rei.gui.toast.CopyRecipeIdentifierToast;
import me.shedaniel.rei.gui.widget.LateRenderable;
-import me.shedaniel.rei.gui.widget.Widget;
-import me.shedaniel.rei.gui.widget.WidgetWithBounds;
-import me.shedaniel.rei.utils.CollectionUtils;
+import me.shedaniel.rei.api.gui.widgets.Widget;
+import me.shedaniel.rei.api.gui.widgets.WidgetWithBounds;
+import me.shedaniel.rei.api.util.CollectionUtils;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.ChatFormatting;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/RecipeRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/RecipeRegistryImpl.java
index e983bc535..ff94be58c 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/RecipeRegistryImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/RecipeRegistryImpl.java
@@ -33,10 +33,14 @@ import me.shedaniel.rei.api.ingredient.EntryIngredient;
import me.shedaniel.rei.api.ingredient.EntryStack;
import me.shedaniel.rei.api.ingredient.util.EntryStacks;
import me.shedaniel.rei.api.plugins.REIPluginV0;
-import me.shedaniel.rei.api.registry.category.DisplayCategory;
+import me.shedaniel.rei.api.registry.CategoryRegistry;
+import me.shedaniel.rei.api.registry.ParentReloadable;
+import me.shedaniel.rei.api.registry.Reloadable;
+import me.shedaniel.rei.api.registry.display.Display;
+import me.shedaniel.rei.api.registry.display.DisplayCategory;
import me.shedaniel.rei.api.subsets.SubsetsRegistry;
+import me.shedaniel.rei.api.util.CollectionUtils;
import me.shedaniel.rei.impl.subsets.SubsetsRegistryImpl;
-import me.shedaniel.rei.utils.CollectionUtils;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.Util;
@@ -58,14 +62,13 @@ import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
-import java.util.stream.Stream;
@ApiStatus.Internal
@Environment(EnvType.CLIENT)
-public class RecipeRegistryImpl implements RecipeRegistry {
- @SuppressWarnings("rawtypes")
- private static final Comparator<Recipe> RECIPE_COMPARATOR = Comparator.comparing((Recipe o) -> o.getId().getNamespace()).thenComparing(o -> o.getId().getPath());
+public class RecipeRegistryImpl implements RecipeRegistry, ParentReloadable {
+ private static final Comparator<Recipe<?>> RECIPE_COMPARATOR = Comparator.comparing((Recipe<?> o) -> o.getId().getNamespace()).thenComparing(o -> o.getId().getPath());
+ private final List<Reloadable> reloadables = new ArrayList<>();
private final List<FocusedStackProvider> focusedStackProviders = Lists.newArrayList();
private final List<AutoTransferHandler> autoTransferHandlers = Lists.newArrayList();
private final List<RecipeFunction<?>> recipeFunctions = Lists.newArrayList();
@@ -74,12 +77,15 @@ public class RecipeRegistryImpl implements RecipeRegistry {
private final Map<ResourceLocation, List<Display>> recipeDisplays = Maps.newHashMap();
private final BiMap<DisplayCategory<?>, ResourceLocation> categories = HashBiMap.create();
private final Map<ResourceLocation, ButtonAreaSupplier> autoCraftAreaSupplierMap = Maps.newHashMap();
- private final Map<ResourceLocation, List<List<? extends EntryStack<?>>>> categoryWorkingStations = Maps.newHashMap();
private final List<DisplayVisibilityHandler> displayVisibilityHandlers = Lists.newArrayList();
private final List<LiveRecipeGenerator<Display>> liveRecipeGenerators = Lists.newArrayList();
private RecipeManager recipeManager;
private boolean arePluginsLoading = false;
+ public RecipeRegistryImpl() {
+ reloadables.add(CategoryRegistry.getInstance());
+ }
+
@Override
public List<EntryStack<?>> findCraftableEntriesByItems(Iterable<? extends EntryStack<?>> inventoryItems) {
List<EntryStack<?>> craftables = new ArrayList<>();
@@ -113,29 +119,6 @@ public class RecipeRegistryImpl implements RecipeRegistry {
}
@Override
- public void registerCategory(DisplayCategory<?> category) {
- categories.put(category, category.getIdentifier());
- recipeDisplays.put(category.getIdentifier(), Lists.newArrayList());
- categoryWorkingStations.put(category.getIdentifier(), Lists.newArrayList());
- }
-
- @SafeVarargs
- @Override
- public final void registerWorkingStations(ResourceLocation category, List<? extends EntryStack<?>>... workingStations) {
- categoryWorkingStations.get(category).addAll(Arrays.asList(workingStations));
- }
-
- @Override
- public void registerWorkingStations(ResourceLocation category, EntryStack<?>... workingStations) {
- categoryWorkingStations.get(category).addAll(Stream.of(workingStations).map(Collections::singletonList).collect(Collectors.toList()));
- }
-
- @Override
- public List<List<? extends EntryStack<?>>> getWorkingStations(ResourceLocation category) {
- return categoryWorkingStations.getOrDefault(category, Collections.emptyList());
- }
-
- @Override
public void registerDisplay(Display display) {
ResourceLocation identifier = Objects.requireNonNull(display.getRecipeCategory());
if (!recipeDisplays.containsKey(identifier))
@@ -347,6 +330,9 @@ public class RecipeRegistryImpl implements RecipeRegistry {
MutablePair<Stopwatch, String> sectionData = new MutablePair<>(Stopwatch.createUnstarted(), "");
startSection(sectionData, "reset-data");
+ for (Reloadable reloadable : reloadables) {
+ reloadable.resetData();
+ }
arePluginsLoading = true;
ScreenHelper.clearLastRecipeScreenData();
recipeCount.setValue(0);
@@ -355,7 +341,6 @@ public class RecipeRegistryImpl implements RecipeRegistry {
this.categories.clear();
this.autoCraftAreaSupplierMap.clear();
this.screenClickAreas.clear();
- this.categoryWorkingStations.clear();
this.recipeFunctions.clear();
this.displayVisibilityHandlers.clear();
this.liveRecipeGenerators.clear();
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/ScreenHelper.java b/runtime/src/main/java/me/shedaniel/rei/impl/ScreenHelper.java
index 23dc8d9af..9cd5ea5f1 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/ScreenHelper.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/ScreenHelper.java
@@ -33,14 +33,15 @@ import me.shedaniel.math.Rectangle;
import me.shedaniel.math.api.Executor;
import me.shedaniel.rei.RoughlyEnoughItemsState;
import me.shedaniel.rei.api.*;
+import me.shedaniel.rei.api.gui.widgets.TextField;
import me.shedaniel.rei.api.ingredient.EntryStack;
-import me.shedaniel.rei.api.widgets.Tooltip;
+import me.shedaniel.rei.api.gui.widgets.Tooltip;
import me.shedaniel.rei.gui.ContainerScreenOverlay;
import me.shedaniel.rei.gui.OverlaySearchField;
import me.shedaniel.rei.gui.RecipeScreen;
import me.shedaniel.rei.gui.WarningAndErrorScreen;
-import me.shedaniel.rei.gui.config.SearchFieldLocation;
-import me.shedaniel.rei.gui.widget.TextFieldWidget;
+import me.shedaniel.rei.api.gui.config.SearchFieldLocation;
+import me.shedaniel.rei.impl.widgets.TextFieldWidget;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@@ -94,7 +95,7 @@ public class ScreenHelper implements ClientModInitializer, REIHelper {
@Override
@Nullable
- public TextFieldWidget getSearchTextField() {
+ public TextField getSearchTextField() {
return searchField;
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/SearchArgument.java b/runtime/src/main/java/me/shedaniel/rei/impl/SearchArgument.java
index 9b5b531e2..469439552 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/SearchArgument.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/SearchArgument.java
@@ -27,12 +27,12 @@ import com.google.common.base.MoreObjects;
import com.google.common.collect.Lists;
import me.shedaniel.math.Point;
import me.shedaniel.rei.api.ingredient.EntryStack;
-import me.shedaniel.rei.api.widgets.Tooltip;
+import me.shedaniel.rei.api.gui.widgets.Tooltip;
import me.shedaniel.rei.impl.search.AlwaysMatchingArgument;
import me.shedaniel.rei.impl.search.Argument;
import me.shedaniel.rei.impl.search.ArgumentsRegistry;
import me.shedaniel.rei.impl.search.MatchStatus;
-import me.shedaniel.rei.utils.CollectionUtils;
+import me.shedaniel.rei.api.util.CollectionUtils;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.Minecraft;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/entry/EmptyEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/impl/entry/EmptyEntryDefinition.java
index 85bcc4090..758fb738f 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/entry/EmptyEntryDefinition.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/entry/EmptyEntryDefinition.java
@@ -29,9 +29,9 @@ import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.ingredient.EntryStack;
import me.shedaniel.rei.api.ingredient.entry.*;
-import me.shedaniel.rei.api.util.Renderer;
-import me.shedaniel.rei.api.widgets.Tooltip;
-import me.shedaniel.rei.utils.ImmutableLiteralText;
+import me.shedaniel.rei.api.util.ImmutableLiteralText;
+import me.shedaniel.rei.api.gui.Renderer;
+import me.shedaniel.rei.api.gui.widgets.Tooltip;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/filtering/FilteringContextImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/filtering/FilteringContextImpl.java
index 38e1ca6b3..a1636fcd4 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/filtering/FilteringContextImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/filtering/FilteringContextImpl.java
@@ -28,7 +28,7 @@ import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import me.shedaniel.rei.api.ingredient.EntryStack;
import me.shedaniel.rei.impl.AmountIgnoredEntryStackWrapper;
-import me.shedaniel.rei.utils.CollectionUtils;
+import me.shedaniel.rei.api.util.CollectionUtils;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/filtering/FilteringResult.java b/runtime/src/main/java/me/shedaniel/rei/impl/filtering/FilteringResult.java
index 6b7377dbf..8da303354 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/filtering/FilteringResult.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/filtering/FilteringResult.java
@@ -26,7 +26,7 @@ package me.shedaniel.rei.impl.filtering;
import com.google.common.collect.Lists;
import me.shedaniel.rei.api.ingredient.EntryStack;
import me.shedaniel.rei.impl.AmountIgnoredEntryStackWrapper;
-import me.shedaniel.rei.utils.CollectionUtils;
+import me.shedaniel.rei.api.util.CollectionUtils;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import org.jetbrains.annotations.ApiStatus;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/filtering/FilteringRule.java b/runtime/src/main/java/me/shedaniel/rei/impl/filtering/FilteringRule.java
index 36a39c62a..e508fd63d 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/filtering/FilteringRule.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/filtering/FilteringRule.java
@@ -24,7 +24,7 @@
package me.shedaniel.rei.impl.filtering;
import com.mojang.serialization.Lifecycle;
-import me.shedaniel.rei.gui.config.entry.FilteringEntry;
+import me.shedaniel.rei.api.gui.config.entry.FilteringEntry;
import me.shedaniel.rei.impl.filtering.rules.ManualFilteringRule;
import me.shedaniel.rei.impl.filtering.rules.SearchFilteringRule;
import net.fabricmc.api.EnvType;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/ManualFilteringRule.java b/runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/ManualFilteringRule.java
index 8f2974715..ebe957db3 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/ManualFilteringRule.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/ManualFilteringRule.java
@@ -32,7 +32,7 @@ import me.shedaniel.rei.api.ingredient.util.EntryStacks;
import me.shedaniel.rei.impl.filtering.AbstractFilteringRule;
import me.shedaniel.rei.impl.filtering.FilteringContext;
import me.shedaniel.rei.impl.filtering.FilteringResult;
-import me.shedaniel.rei.utils.CollectionUtils;
+import me.shedaniel.rei.api.util.CollectionUtils;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TranslatableComponent;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/SearchFilteringRule.java b/runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/SearchFilteringRule.java
index f4d393492..ed7abd4c6 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/SearchFilteringRule.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/SearchFilteringRule.java
@@ -25,13 +25,13 @@ package me.shedaniel.rei.impl.filtering.rules;
import com.google.common.collect.Lists;
import me.shedaniel.rei.api.ingredient.EntryStack;
-import me.shedaniel.rei.gui.config.entry.FilteringEntry;
-import me.shedaniel.rei.gui.config.entry.FilteringRuleOptionsScreen;
+import me.shedaniel.rei.api.gui.config.entry.FilteringEntry;
+import me.shedaniel.rei.api.gui.config.entry.FilteringRuleOptionsScreen;
import me.shedaniel.rei.impl.SearchArgument;
import me.shedaniel.rei.impl.filtering.AbstractFilteringRule;
import me.shedaniel.rei.impl.filtering.FilteringContext;
import me.shedaniel.rei.impl.filtering.FilteringResult;
-import me.shedaniel.rei.utils.CollectionUtils;
+import me.shedaniel.rei.api.util.CollectionUtils;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.ChatFormatting;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/registry/CategoryRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/registry/CategoryRegistryImpl.java
new file mode 100644
index 000000000..2e4fb4fbb
--- /dev/null
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/registry/CategoryRegistryImpl.java
@@ -0,0 +1,73 @@
+package me.shedaniel.rei.impl.registry;
+
+import me.shedaniel.rei.api.ingredient.EntryIngredient;
+import me.shedaniel.rei.api.registry.CategoryRegistry;
+import me.shedaniel.rei.api.registry.Reloadable;
+import me.shedaniel.rei.api.registry.display.Display;
+import me.shedaniel.rei.api.registry.display.DisplayCategory;
+import net.minecraft.resources.ResourceLocation;
+import org.jetbrains.annotations.ApiStatus;
+
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Consumer;
+
+@ApiStatus.Internal
+public class CategoryRegistryImpl implements CategoryRegistry, Reloadable {
+ private final Map<ResourceLocation, Configuration<?>> categories = new ConcurrentHashMap<>();
+
+ @Override
+ public void resetData() {
+ this.categories.clear();
+ }
+
+ @Override
+ public <T extends Display> void register(DisplayCategory<T> category) {
+ this.categories.put(category.getIdentifier(), new Configuration<>(category));
+ }
+
+ @Override
+ public DisplayCategoryConfiguration<?> get(ResourceLocation category) {
+ return this.categories.get(category);
+ }
+
+ @Override
+ public <T extends Display> DisplayCategoryConfiguration<T> get(ResourceLocation category, Class<T> displayClass) {
+ return null;
+ }
+
+ @Override
+ public void configure(ResourceLocation category, Consumer<DisplayCategoryConfiguration<?>> action) {
+
+ }
+
+ @Override
+ public <T extends Display> void configure(ResourceLocation category, Class<T> displayClass, Consumer<DisplayCategoryConfiguration<T>> action) {
+
+ }
+
+ private static class Configuration<T extends Display> implements DisplayCategoryConfiguration<T> {
+ private final DisplayCategory<T> category;
+ private final List&l