diff options
| author | shedaniel <daniel@shedaniel.me> | 2021-03-20 17:20:54 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2021-03-20 17:20:54 +0800 |
| commit | 0292fa5317106c46a39cd39e9664936f807b6270 (patch) | |
| tree | f92cf071d1361be177af6c966148b8fd1c26613a | |
| parent | 2cd3f0737b2008e37f8eaadf479312c60d36e7bc (diff) | |
| download | RoughlyEnoughItems-0292fa5317106c46a39cd39e9664936f807b6270.tar.gz RoughlyEnoughItems-0292fa5317106c46a39cd39e9664936f807b6270.tar.bz2 RoughlyEnoughItems-0292fa5317106c46a39cd39e9664936f807b6270.zip | |
Refactor exclusion zones, wrap JEI exclusion zones
Signed-off-by: shedaniel <daniel@shedaniel.me>
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()) |
