aboutsummaryrefslogtreecommitdiff
path: root/runtime/src/main/java
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 /runtime/src/main/java
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>
Diffstat (limited to 'runtime/src/main/java')
-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
7 files changed, 38 insertions, 35 deletions
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())