aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2021-03-20 17:20:54 +0800
committershedaniel <daniel@shedaniel.me>2021-03-20 17:20:54 +0800
commit0292fa5317106c46a39cd39e9664936f807b6270 (patch)
treef92cf071d1361be177af6c966148b8fd1c26613a
parent2cd3f0737b2008e37f8eaadf479312c60d36e7bc (diff)
downloadRoughlyEnoughItems-0292fa5317106c46a39cd39e9664936f807b6270.tar.gz
RoughlyEnoughItems-0292fa5317106c46a39cd39e9664936f807b6270.tar.bz2
RoughlyEnoughItems-0292fa5317106c46a39cd39e9664936f807b6270.zip
Refactor exclusion zones, wrap JEI exclusion zones
Signed-off-by: shedaniel <daniel@shedaniel.me>
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/registry/screen/DisplayBoundsProvider.java13
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/registry/screen/ExclusionZones.java7
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/registry/screen/ExclusionZonesProvider.java10
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/registry/screen/FocusedStackProvider.java3
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/registry/screen/ScreenRegistry.java5
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java6
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultPotionEffectExclusionZones.java22
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultRecipeBookExclusionZones.java15
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java9
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java10
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/gui/plugin/DefaultRuntimePlugin.java17
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/ExclusionZonesImpl.java15
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/REIHelperImpl.java6
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/ScreenRegistryImpl.java14
15 files changed, 74 insertions, 80 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/registry/screen/DisplayBoundsProvider.java b/api/src/main/java/me/shedaniel/rei/api/registry/screen/DisplayBoundsProvider.java
index 007aded8c..049df6379 100644
--- a/api/src/main/java/me/shedaniel/rei/api/registry/screen/DisplayBoundsProvider.java
+++ b/api/src/main/java/me/shedaniel/rei/api/registry/screen/DisplayBoundsProvider.java
@@ -24,7 +24,6 @@
package me.shedaniel.rei.api.registry.screen;
import me.shedaniel.math.Rectangle;
-import net.minecraft.client.gui.screens.Screen;
public interface DisplayBoundsProvider<T> extends OverlayDecider {
/**
@@ -32,16 +31,4 @@ public interface DisplayBoundsProvider<T> extends OverlayDecider {
* @return the boundary of the base container panel.
*/
Rectangle getScreenBounds(T screen);
-
- /**
- * Gets the base supported class for the bounds handler
- *
- * @return the base class
- */
- Class<? extends Screen> getBaseSupportedClass();
-
- @Override
- default <R extends Screen> boolean isHandingScreen(Class<R> screen) {
- return getBaseSupportedClass().isAssignableFrom(screen);
- }
} \ No newline at end of file
diff --git a/api/src/main/java/me/shedaniel/rei/api/registry/screen/ExclusionZones.java b/api/src/main/java/me/shedaniel/rei/api/registry/screen/ExclusionZones.java
index d564a6080..415407646 100644
--- a/api/src/main/java/me/shedaniel/rei/api/registry/screen/ExclusionZones.java
+++ b/api/src/main/java/me/shedaniel/rei/api/registry/screen/ExclusionZones.java
@@ -28,7 +28,6 @@ import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import java.util.List;
-import java.util.function.Supplier;
@Environment(EnvType.CLIENT)
public interface ExclusionZones extends OverlayDecider {
@@ -49,8 +48,8 @@ public interface ExclusionZones extends OverlayDecider {
/**
* Register an exclusion zone
*
- * @param screenClass the screen
- * @param supplier the exclusion zone supplier, returns the list of exclusion zones
+ * @param screenClass the screen class
+ * @param provider the exclusion zone provider, returns a collection of exclusion zones
*/
- void register(Class<?> screenClass, Supplier<List<Rectangle>> supplier);
+ <T> void register(Class<? extends T> screenClass, ExclusionZonesProvider<? extends T> provider);
}
diff --git a/api/src/main/java/me/shedaniel/rei/api/registry/screen/ExclusionZonesProvider.java b/api/src/main/java/me/shedaniel/rei/api/registry/screen/ExclusionZonesProvider.java
new file mode 100644
index 000000000..99f86703f
--- /dev/null
+++ b/api/src/main/java/me/shedaniel/rei/api/registry/screen/ExclusionZonesProvider.java
@@ -0,0 +1,10 @@
+package me.shedaniel.rei.api.registry.screen;
+
+import me.shedaniel.math.Rectangle;
+
+import java.util.Collection;
+
+@FunctionalInterface
+public interface ExclusionZonesProvider<T> {
+ Collection<Rectangle> provide(T screen);
+}
diff --git a/api/src/main/java/me/shedaniel/rei/api/registry/screen/FocusedStackProvider.java b/api/src/main/java/me/shedaniel/rei/api/registry/screen/FocusedStackProvider.java
index 6e0c682fd..2d31a4a4a 100644
--- a/api/src/main/java/me/shedaniel/rei/api/registry/screen/FocusedStackProvider.java
+++ b/api/src/main/java/me/shedaniel/rei/api/registry/screen/FocusedStackProvider.java
@@ -23,6 +23,7 @@
package me.shedaniel.rei.api.registry.screen;
+import me.shedaniel.math.Point;
import me.shedaniel.rei.api.ingredient.EntryStack;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.world.InteractionResultHolder;
@@ -38,7 +39,7 @@ public interface FocusedStackProvider extends Comparable<FocusedStackProvider> {
}
@NotNull
- InteractionResultHolder<EntryStack<?>> provide(Screen screen);
+ InteractionResultHolder<EntryStack<?>> provide(Screen screen, Point mouse);
@Override
default int compareTo(@NotNull FocusedStackProvider o) {
diff --git a/api/src/main/java/me/shedaniel/rei/api/registry/screen/ScreenRegistry.java b/api/src/main/java/me/shedaniel/rei/api/registry/screen/ScreenRegistry.java
index b4d89b033..4484e5050 100644
--- a/api/src/main/java/me/shedaniel/rei/api/registry/screen/ScreenRegistry.java
+++ b/api/src/main/java/me/shedaniel/rei/api/registry/screen/ScreenRegistry.java
@@ -23,6 +23,7 @@
package me.shedaniel.rei.api.registry.screen;
+import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.gui.config.DisplayPanelLocation;
import me.shedaniel.rei.api.ingredient.EntryStack;
@@ -55,7 +56,7 @@ public interface ScreenRegistry extends Reloadable {
*
* @return the list of registered overlay deciders
*/
- <R extends Screen> List<OverlayDecider> getDeciders(Class<R> screenClass);
+ <R extends Screen> List<OverlayDecider> getDeciders(R screen);
/**
* Gets all registered overlay deciders
@@ -81,7 +82,7 @@ public interface ScreenRegistry extends Reloadable {
*/
<T extends Screen> Rectangle getOverlayBounds(DisplayPanelLocation location, T screen);
- @Nullable <T extends Screen> EntryStack<?> getFocusedStack(T screen);
+ @Nullable <T extends Screen> EntryStack<?> getFocusedStack(T screen, Point mouse);
ExclusionZones exclusionZones();
diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java
index 121ca47ba..585d13dc9 100644
--- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java
+++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java
@@ -387,10 +387,10 @@ public class DefaultPlugin implements REIPlugin, BuiltinPlugin {
public Rectangle getScreenBounds(AbstractContainerScreen<?> screen) {
return new Rectangle(screen.leftPos, screen.topPos, screen.imageWidth, screen.imageHeight);
}
-
+
@Override
- public Class<? extends Screen> getBaseSupportedClass() {
- return AbstractContainerScreen.class;
+ public <R extends Screen> boolean isHandingScreen(Class<R> screen) {
+ return AbstractContainerScreen.class.isAssignableFrom(screen);
}
});
diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultPotionEffectExclusionZones.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultPotionEffectExclusionZones.java
index f46d5433b..49f8bad48 100644
--- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultPotionEffectExclusionZones.java
+++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultPotionEffectExclusionZones.java
@@ -25,11 +25,10 @@ package me.shedaniel.rei.plugin;
import com.google.common.collect.Ordering;
import me.shedaniel.math.Rectangle;
+import me.shedaniel.rei.api.registry.screen.ExclusionZonesProvider;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.screens.Screen;
-import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.gui.screens.inventory.EffectRenderingInventoryScreen;
import net.minecraft.world.effect.MobEffectInstance;
@@ -37,29 +36,26 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
-import java.util.function.Supplier;
@Environment(EnvType.CLIENT)
-public class DefaultPotionEffectExclusionZones implements Supplier<List<Rectangle>> {
+public class DefaultPotionEffectExclusionZones implements ExclusionZonesProvider<EffectRenderingInventoryScreen<?>> {
@Override
- public List<Rectangle> get() {
- Screen screen = Minecraft.getInstance().screen;
- if (!(screen instanceof EffectRenderingInventoryScreen) || !((EffectRenderingInventoryScreen<?>) screen).doRenderEffects)
+ public Collection<Rectangle> provide(EffectRenderingInventoryScreen<?> screen) {
+ if (!screen.doRenderEffects)
return Collections.emptyList();
Collection<MobEffectInstance> activePotionEffects = Minecraft.getInstance().player.getActiveEffects();
if (activePotionEffects.isEmpty())
return Collections.emptyList();
- AbstractContainerScreen<?> containerScreen = (AbstractContainerScreen<?>) screen;
- List<Rectangle> list = new ArrayList<>();
- int x = containerScreen.leftPos - 124;
- int y = containerScreen.topPos;
+ List<Rectangle> zones = new ArrayList<>();
+ int x = screen.leftPos - 124;
+ int y = screen.topPos;
int height = 33;
if (activePotionEffects.size() > 5)
height = 132 / (activePotionEffects.size() - 1);
for (MobEffectInstance instance : Ordering.natural().sortedCopy(activePotionEffects)) {
- list.add(new Rectangle(x, y, 166, height));
+ zones.add(new Rectangle(x, y, 166, height));
y += height;
}
- return list;
+ return zones;
}
}
diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultRecipeBookExclusionZones.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultRecipeBookExclusionZones.java
index 7702c923a..0e3b3c956 100644
--- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultRecipeBookExclusionZones.java
+++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultRecipeBookExclusionZones.java
@@ -25,29 +25,27 @@ package me.shedaniel.rei.plugin;
import com.google.common.collect.Lists;
import me.shedaniel.math.Rectangle;
+import me.shedaniel.rei.api.registry.screen.ExclusionZonesProvider;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent;
import net.minecraft.client.gui.screens.recipebook.RecipeUpdateListener;
import net.minecraft.world.inventory.RecipeBookMenu;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
-import java.util.function.Supplier;
@Environment(EnvType.CLIENT)
-public class DefaultRecipeBookExclusionZones implements Supplier<List<Rectangle>> {
-
+public class DefaultRecipeBookExclusionZones implements ExclusionZonesProvider<RecipeUpdateListener> {
@Override
- public List<Rectangle> get() {
- Screen screen = Minecraft.getInstance().screen;
- if (!(screen instanceof RecipeUpdateListener) || !(screen instanceof AbstractContainerScreen) || !(((AbstractContainerScreen<?>) screen).getMenu() instanceof RecipeBookMenu) ||
+ public Collection<Rectangle> provide(RecipeUpdateListener screen) {
+ if (!(screen instanceof AbstractContainerScreen) || !(((AbstractContainerScreen<?>) screen).getMenu() instanceof RecipeBookMenu) ||
!Minecraft.getInstance().player.getRecipeBook().isOpen(((RecipeBookMenu<?>) ((AbstractContainerScreen<?>) screen).getMenu()).getRecipeBookType()))
return Collections.emptyList();
- RecipeBookComponent recipeBookWidget = ((RecipeUpdateListener) screen).getRecipeBookComponent();
+ RecipeBookComponent recipeBookWidget = screen.getRecipeBookComponent();
AbstractContainerScreen<?> containerScreen = (AbstractContainerScreen<?>) screen;
List<Rectangle> l = Lists.newArrayList(new Rectangle(containerScreen.leftPos - 4 - 145, containerScreen.topPos, 4 + 145 + 30, containerScreen.imageHeight));
int size = recipeBookWidget.tabButtons.size();
@@ -55,5 +53,4 @@ public class DefaultRecipeBookExclusionZones implements Supplier<List<Rectangle>
l.add(new Rectangle(containerScreen.leftPos - 4 - 145 - 30, containerScreen.topPos, 30, size * 27));
return l;
}
-
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
index 926e36a91..20fe06192 100644
--- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
+++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
@@ -443,15 +443,16 @@ public class RoughlyEnoughItemsCore {
if (!REIHelper.getInstance().getOverlay().isPresent()) return true;
if (screen == null) return true;
if (screen != Minecraft.getInstance().screen) return true;
- return shouldReturn(screen.getClass());
+ return _shouldReturn(screen);
}
- private boolean shouldReturn(Class<? extends Screen> screen) {
+ private boolean _shouldReturn(Screen screen) {
try {
+ Class<? extends Screen> screenClass = screen.getClass();
for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders()) {
- if (!decider.isHandingScreen(screen))
+ if (!decider.isHandingScreen(screen.getClass()))
continue;
- InteractionResult result = decider.shouldScreenBeOverlaid(screen);
+ InteractionResult result = decider.shouldScreenBeOverlaid(screenClass);
if (result != InteractionResult.PASS) {
return result == InteractionResult.FAIL || REIHelper.getInstance().getPreviousScreen() == null;
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
index a31a704e7..bd5f85ef4 100644
--- a/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
+++ b/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
@@ -489,7 +489,7 @@ public class ContainerScreenOverlay extends REIOverlay {
return getBottomSideSearchFieldArea(widthRemoved);
default:
case CENTER: {
- for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(Minecraft.getInstance().screen.getClass())) {
+ for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(Minecraft.getInstance().screen)) {
if (decider instanceof DisplayBoundsProvider) {
Rectangle containerBounds = ((DisplayBoundsProvider<Screen>) decider).getScreenBounds(Minecraft.getInstance().screen);
return getBottomCenterSearchFieldArea(containerBounds, widthRemoved);
@@ -545,7 +545,7 @@ public class ContainerScreenOverlay extends REIOverlay {
ENTRY_LIST_WIDGET.updateSearch(REIHelperImpl.getSearchField().getText(), true);
init();
} else {
- for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(minecraft.screen.getClass())) {
+ for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(minecraft.screen)) {
if (decider != null && decider.shouldRecalculateArea(ConfigObject.getInstance().getDisplayPanelLocation(), bounds)) {
init();
break;
@@ -707,7 +707,7 @@ public class ContainerScreenOverlay extends REIOverlay {
REIHelper.getInstance().toggleOverlayVisible();
return true;
}
- EntryStack<?> stack = ScreenRegistry.getInstance().getFocusedStack(Minecraft.getInstance().screen);
+ EntryStack<?> stack = ScreenRegistry.getInstance().getFocusedStack(Minecraft.getInstance().screen, PointHelper.ofMouse());
if (stack != null && !stack.isEmpty()) {
stack = stack.copy();
if (ConfigObject.getInstance().getRecipeKeybind().matchesKey(keyCode, scanCode)) {
@@ -760,7 +760,7 @@ public class ContainerScreenOverlay extends REIOverlay {
REIHelper.getInstance().toggleOverlayVisible();
return true;
}
- EntryStack<?> stack = ScreenRegistry.getInstance().getFocusedStack(Minecraft.getInstance().screen);
+ EntryStack<?> stack = ScreenRegistry.getInstance().getFocusedStack(Minecraft.getInstance().screen, PointHelper.ofMouse());
if (stack != null && !stack.isEmpty()) {
stack = stack.copy();
if (ConfigObject.getInstance().getRecipeKeybind().matchesMouse(button)) {
@@ -844,7 +844,7 @@ public class ContainerScreenOverlay extends REIOverlay {
@Override
public boolean isNotInExclusionZones(double mouseX, double mouseY) {
- for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(Minecraft.getInstance().screen.getClass())) {
+ for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(Minecraft.getInstance().screen)) {
InteractionResult in = decider.isInZone(mouseX, mouseY);
if (in != InteractionResult.PASS)
return in == InteractionResult.SUCCESS;
diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/plugin/DefaultRuntimePlugin.java b/runtime/src/main/java/me/shedaniel/rei/gui/plugin/DefaultRuntimePlugin.java
index cd2062d7b..f716f5886 100644
--- a/runtime/src/main/java/me/shedaniel/rei/gui/plugin/DefaultRuntimePlugin.java
+++ b/runtime/src/main/java/me/shedaniel/rei/gui/plugin/DefaultRuntimePlugin.java
@@ -116,17 +116,18 @@ public class DefaultRuntimePlugin implements REIPlugin {
@Override
public void registerScreens(ScreenRegistry registry) {
ExclusionZones zones = registry.exclusionZones();
- zones.register(RecipeViewingScreen.class, () -> {
- Panel widget = ((RecipeViewingScreen) Minecraft.getInstance().screen).getWorkingStationsBaseWidget();
+ zones.register(RecipeViewingScreen.class, screen -> {
+ Panel widget = screen.getWorkingStationsBaseWidget();
if (widget == null)
return Collections.emptyList();
return Collections.singletonList(widget.getBounds().clone());
});
- zones.register(Screen.class, () -> {
+ zones.register(Screen.class, screen -> {
FavoritesListWidget widget = ContainerScreenOverlay.getFavoritesListWidget();
if (widget != null) {
- if (widget.favoritePanelButton.isVisible())
+ if (widget.favoritePanelButton.isVisible()) {
return Collections.singletonList(widget.favoritePanelButton.bounds);
+ }
}
return Collections.emptyList();
});
@@ -135,12 +136,12 @@ public class DefaultRuntimePlugin implements REIPlugin {
public Rectangle getScreenBounds(AbstractRecipeViewingScreen screen) {
return screen.getBounds();
}
-
+
@Override
- public Class<? extends Screen> getBaseSupportedClass() {
- return AbstractRecipeViewingScreen.class;
+ public <R extends Screen> boolean isHandingScreen(Class<R> screen) {
+ return AbstractRecipeViewingScreen.class.isAssignableFrom(screen);
}
-
+
@Override
public InteractionResult shouldScreenBeOverlaid(Class<?> screen) {
return InteractionResult.SUCCESS;
diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
index d135b4733..005f670be 100644
--- a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
+++ b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
@@ -137,7 +137,7 @@ public class EntryListWidget extends WidgetWithBounds {
static boolean notSteppingOnExclusionZones(int left, int top, int width, int height, Rectangle listArea) {
Minecraft instance = Minecraft.getInstance();
- for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(instance.screen.getClass())) {
+ for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(instance.screen)) {
InteractionResult fit = canItemSlotWidgetFit(left, top, width, height, decider);
if (fit != InteractionResult.PASS)
return fit == InteractionResult.SUCCESS;
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 8bdd2c472..e7cc29564 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/ExclusionZonesImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/ExclusionZonesImpl.java
@@ -29,6 +29,7 @@ import com.google.common.collect.Multimap;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.gui.config.DisplayPanelLocation;
import me.shedaniel.rei.api.registry.screen.ExclusionZones;
+import me.shedaniel.rei.api.registry.screen.ExclusionZonesProvider;
import me.shedaniel.rei.api.registry.screen.ScreenRegistry;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@@ -49,7 +50,7 @@ public class ExclusionZonesImpl implements ExclusionZones {
private static final Comparator<? super Rectangle> RECTANGLE_COMPARER = Comparator.comparingLong(Rectangle::hashCode);
private long lastArea = -1;
- private Multimap<Class<?>, Supplier<List<Rectangle>>> list = HashMultimap.create();
+ private Multimap<Class<?>, Supplier<Collection<Rectangle>>> list = HashMultimap.create();
@Override
public <R extends Screen> boolean isHandingScreen(Class<R> screen) {
@@ -65,9 +66,9 @@ public class ExclusionZonesImpl implements ExclusionZones {
public InteractionResult isInZone(double mouseX, double mouseY) {
Class<? extends Screen> screenClass = Minecraft.getInstance().screen.getClass();
- for (Map.Entry<Class<?>, Collection<Supplier<List<Rectangle>>>> collectionEntry : list.asMap().entrySet()) {
+ for (Map.Entry<Class<?>, Collection<Supplier<Collection<Rectangle>>>> collectionEntry : list.asMap().entrySet()) {
if (collectionEntry.getKey().isAssignableFrom(screenClass)) {
- for (Supplier<List<Rectangle>> listSupplier : collectionEntry.getValue()) {
+ for (Supplier<Collection<Rectangle>> listSupplier : collectionEntry.getValue()) {
for (Rectangle zone : listSupplier.get()) {
if (zone.contains(mouseX, mouseY)) {
return InteractionResult.FAIL;
@@ -97,9 +98,9 @@ public class ExclusionZonesImpl implements ExclusionZones {
@Override
public List<Rectangle> getExclusionZones(Class<?> currentScreenClass, boolean sort) {
List<Rectangle> rectangles = Lists.newArrayList();
- for (Map.Entry<Class<?>, Collection<Supplier<List<Rectangle>>>> collectionEntry : list.asMap().entrySet()) {
+ for (Map.Entry<Class<?>, Collection<Supplier<Collection<Rectangle>>>> collectionEntry : list.asMap().entrySet()) {
if (collectionEntry.getKey().isAssignableFrom(currentScreenClass)) {
- for (Supplier<List<Rectangle>> listSupplier : collectionEntry.getValue()) {
+ for (Supplier<Collection<Rectangle>> listSupplier : collectionEntry.getValue()) {
rectangles.addAll(listSupplier.get());
}
}
@@ -116,8 +117,8 @@ public class ExclusionZonesImpl implements ExclusionZones {
}
@Override
- public void register(Class<?> screenClass, Supplier<List<Rectangle>> supplier) {
- list.put(screenClass, supplier);
+ public <T> void register(Class<? extends T> screenClass, ExclusionZonesProvider<? extends T> provider) {
+ list.put(screenClass, () -> ((ExclusionZonesProvider<T>) provider).provide((T) Minecraft.getInstance().screen));
}
private long areasHashCode(Rectangle rectangle, List<Rectangle> exclusionZones) {
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/REIHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/REIHelperImpl.java
index cef610c4a..0884d70d7 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/REIHelperImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/REIHelperImpl.java
@@ -29,10 +29,10 @@ import com.mojang.blaze3d.platform.Window;
import me.shedaniel.architectury.event.events.GuiEvent;
import me.shedaniel.architectury.event.events.client.ClientTickEvent;
import me.shedaniel.math.Rectangle;
-import me.shedaniel.rei.api.config.ConfigManager;
-import me.shedaniel.rei.api.config.ConfigObject;
import me.shedaniel.rei.api.REIHelper;
import me.shedaniel.rei.api.REIOverlay;
+import me.shedaniel.rei.api.config.ConfigManager;
+import me.shedaniel.rei.api.config.ConfigObject;
import me.shedaniel.rei.api.gui.config.SearchFieldLocation;
import me.shedaniel.rei.api.gui.widgets.TextField;
import me.shedaniel.rei.api.gui.widgets.Tooltip;
@@ -175,7 +175,7 @@ public class REIHelperImpl implements REIHelper {
@Override
public SearchFieldLocation getContextualSearchFieldLocation() {
Window window = Minecraft.getInstance().getWindow();
- for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(Minecraft.getInstance().screen.getClass())) {
+ for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(Minecraft.getInstance().screen)) {
if (decider instanceof DisplayBoundsProvider) {
Rectangle containerBounds = ((DisplayBoundsProvider<Screen>) decider).getScreenBounds(Minecraft.getInstance().screen);
if (window.getGuiScaledHeight() - 20 <= containerBounds.getMaxY()) {
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/ScreenRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/ScreenRegistryImpl.java
index bc21380b8..ff7dca9a2 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/ScreenRegistryImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/ScreenRegistryImpl.java
@@ -26,9 +26,8 @@ package me.shedaniel.rei.impl;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.mojang.blaze3d.platform.Window;
+import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
-import me.shedaniel.rei.api.registry.screen.FocusedStackProvider;
-import me.shedaniel.rei.api.registry.screen.SimpleClickArea;
import me.shedaniel.rei.api.gui.config.DisplayPanelLocation;
import me.shedaniel.rei.api.ingredient.EntryStack;
import me.shedaniel.rei.api.ingredient.util.EntryStacks;
@@ -70,7 +69,8 @@ public class ScreenRegistryImpl implements ScreenRegistry {
}
@Override
- public <R extends Screen> List<OverlayDecider> getDeciders(Class<R> screenClass) {
+ public <R extends Screen> List<OverlayDecider> getDeciders(R screen) {
+ Class<? extends Screen> screenClass = screen.getClass();
List<OverlayDecider> possibleCached = cache.get(screenClass);
if (possibleCached != null) {
return possibleCached;
@@ -97,7 +97,7 @@ public class ScreenRegistryImpl implements ScreenRegistry {
Window window = Minecraft.getInstance().getWindow();
int scaledWidth = window.getGuiScaledWidth();
int scaledHeight = window.getGuiScaledHeight();
- for (OverlayDecider decider : getDeciders(screen.getClass())) {
+ for (OverlayDecider decider : getDeciders(screen)) {
if (decider instanceof DisplayBoundsProvider) {
Rectangle containerBounds = ((DisplayBoundsProvider<T>) decider).getScreenBounds(screen);
if (location == DisplayPanelLocation.LEFT) {
@@ -114,9 +114,9 @@ public class ScreenRegistryImpl implements ScreenRegistry {
@Nullable
@Override
- public <T extends Screen> EntryStack<?> getFocusedStack(T screen) {
+ public <T extends Screen> EntryStack<?> getFocusedStack(T screen, Point mouse) {
for (FocusedStackProvider provider : focusedStackProviders) {
- InteractionResultHolder<EntryStack<?>> result = Objects.requireNonNull(provider.provide(screen));
+ InteractionResultHolder<EntryStack<?>> result = Objects.requireNonNull(provider.provide(screen, mouse));
if (result.getResult() == InteractionResult.SUCCESS) {
if (result != null && !result.getObject().isEmpty())
return result.getObject();
@@ -211,7 +211,7 @@ public class ScreenRegistryImpl implements ScreenRegistry {
registerFocusedStack(new FocusedStackProvider() {
@Override
@NotNull
- public InteractionResultHolder<EntryStack<?>> provide(Screen screen) {
+ public InteractionResultHolder<EntryStack<?>> provide(Screen screen, Point mouse) {
if (screen instanceof AbstractContainerScreen) {
AbstractContainerScreen<?> containerScreen = (AbstractContainerScreen<?>) screen;
if (containerScreen.hoveredSlot != null && !containerScreen.hoveredSlot.getItem().isEmpty())