From 0292fa5317106c46a39cd39e9664936f807b6270 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 20 Mar 2021 17:20:54 +0800 Subject: Refactor exclusion zones, wrap JEI exclusion zones Signed-off-by: shedaniel --- .../java/me/shedaniel/rei/RoughlyEnoughItemsCore.java | 9 +++++---- .../me/shedaniel/rei/gui/ContainerScreenOverlay.java | 10 +++++----- .../shedaniel/rei/gui/plugin/DefaultRuntimePlugin.java | 17 +++++++++-------- .../me/shedaniel/rei/gui/widget/EntryListWidget.java | 2 +- .../java/me/shedaniel/rei/impl/ExclusionZonesImpl.java | 15 ++++++++------- .../main/java/me/shedaniel/rei/impl/REIHelperImpl.java | 6 +++--- .../java/me/shedaniel/rei/impl/ScreenRegistryImpl.java | 14 +++++++------- 7 files changed, 38 insertions(+), 35 deletions(-) (limited to 'runtime/src') 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 screen) { + private boolean _shouldReturn(Screen screen) { try { + Class 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) 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 getBaseSupportedClass() { - return AbstractRecipeViewingScreen.class; + public boolean isHandingScreen(Class 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 RECTANGLE_COMPARER = Comparator.comparingLong(Rectangle::hashCode); private long lastArea = -1; - private Multimap, Supplier>> list = HashMultimap.create(); + private Multimap, Supplier>> list = HashMultimap.create(); @Override public boolean isHandingScreen(Class screen) { @@ -65,9 +66,9 @@ public class ExclusionZonesImpl implements ExclusionZones { public InteractionResult isInZone(double mouseX, double mouseY) { Class screenClass = Minecraft.getInstance().screen.getClass(); - for (Map.Entry, Collection>>> collectionEntry : list.asMap().entrySet()) { + for (Map.Entry, Collection>>> collectionEntry : list.asMap().entrySet()) { if (collectionEntry.getKey().isAssignableFrom(screenClass)) { - for (Supplier> listSupplier : collectionEntry.getValue()) { + for (Supplier> 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 getExclusionZones(Class currentScreenClass, boolean sort) { List rectangles = Lists.newArrayList(); - for (Map.Entry, Collection>>> collectionEntry : list.asMap().entrySet()) { + for (Map.Entry, Collection>>> collectionEntry : list.asMap().entrySet()) { if (collectionEntry.getKey().isAssignableFrom(currentScreenClass)) { - for (Supplier> listSupplier : collectionEntry.getValue()) { + for (Supplier> listSupplier : collectionEntry.getValue()) { rectangles.addAll(listSupplier.get()); } } @@ -116,8 +117,8 @@ public class ExclusionZonesImpl implements ExclusionZones { } @Override - public void register(Class screenClass, Supplier> supplier) { - list.put(screenClass, supplier); + public void register(Class screenClass, ExclusionZonesProvider provider) { + list.put(screenClass, () -> ((ExclusionZonesProvider) provider).provide((T) Minecraft.getInstance().screen)); } private long areasHashCode(Rectangle rectangle, List 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) 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 List getDeciders(Class screenClass) { + public List getDeciders(R screen) { + Class screenClass = screen.getClass(); List 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) decider).getScreenBounds(screen); if (location == DisplayPanelLocation.LEFT) { @@ -114,9 +114,9 @@ public class ScreenRegistryImpl implements ScreenRegistry { @Nullable @Override - public EntryStack getFocusedStack(T screen) { + public EntryStack getFocusedStack(T screen, Point mouse) { for (FocusedStackProvider provider : focusedStackProviders) { - InteractionResultHolder> result = Objects.requireNonNull(provider.provide(screen)); + InteractionResultHolder> 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> provide(Screen screen) { + public InteractionResultHolder> provide(Screen screen, Point mouse) { if (screen instanceof AbstractContainerScreen) { AbstractContainerScreen containerScreen = (AbstractContainerScreen) screen; if (containerScreen.hoveredSlot != null && !containerScreen.hoveredSlot.getItem().isEmpty()) -- cgit