diff options
| author | shedaniel <daniel@shedaniel.me> | 2021-04-06 15:47:20 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2021-04-06 15:47:20 +0800 |
| commit | 966bbd7fe43237f9b1aa6cfd94cf5e34a9bcfddf (patch) | |
| tree | 7c19b609f1d61f0afde3947742056dbb8b17a396 /runtime/src/main/java/me/shedaniel/rei/impl | |
| parent | 5b0c5838978fc74f783c6dcff2983af4fb97d912 (diff) | |
| download | RoughlyEnoughItems-966bbd7fe43237f9b1aa6cfd94cf5e34a9bcfddf.tar.gz RoughlyEnoughItems-966bbd7fe43237f9b1aa6cfd94cf5e34a9bcfddf.tar.bz2 RoughlyEnoughItems-966bbd7fe43237f9b1aa6cfd94cf5e34a9bcfddf.zip | |
Expose draggable stacks
Signed-off-by: shedaniel <daniel@shedaniel.me>
Diffstat (limited to 'runtime/src/main/java/me/shedaniel/rei/impl')
17 files changed, 142 insertions, 77 deletions
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java index abaf8443f..96c9741c6 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java @@ -32,6 +32,7 @@ import me.shedaniel.rei.api.client.REIHelper; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.DisplayScreenType; +import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.client.view.Views; @@ -43,7 +44,6 @@ import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.impl.ClientInternals; import me.shedaniel.rei.impl.client.gui.screen.CompositeDisplayViewingScreen; import me.shedaniel.rei.impl.client.gui.screen.DefaultDisplayViewingScreen; -import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; import me.shedaniel.rei.impl.client.gui.screen.UncertainDisplayViewingScreen; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIHelperImpl.java index 568149a11..e9c899a95 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIHelperImpl.java @@ -34,11 +34,11 @@ import me.shedaniel.rei.api.client.REIOverlay; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; +import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; import me.shedaniel.rei.api.client.gui.widgets.TextField; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.impl.client.gui.ContainerScreenOverlay; -import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java index 0c41f834c..7a6e9f32d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java @@ -25,7 +25,6 @@ package me.shedaniel.rei.impl.client.config.entries; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.DefaultVertexFormat; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java index c2c69f1a4..8abd4ea35 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java @@ -23,7 +23,6 @@ package me.shedaniel.rei.impl.client.gui; -import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.mojang.blaze3d.platform.Window; @@ -201,22 +200,17 @@ public class ContainerScreenOverlay extends REIOverlay { } @Override - public DraggingContext getDraggingContext() { + public DraggingContext<?> getDraggingContext() { return draggingStack; } - private static <T> Iterable<T> buildWidgetsTree(Iterable<? extends GuiEventListener> listeners, Class<T> type) { - return Widgets.walk(listeners, type::isInstance); - } - public void init(boolean useless) { init(); } public void init() { - Iterable<DraggableStackProvider> stackProviders = buildWidgetsTree(Iterables.concat(widgets, Minecraft.getInstance().screen.children()), DraggableStackProvider.class); - Iterable<DraggableStackVisitor> stackVisitors = buildWidgetsTree(Iterables.concat(widgets, Minecraft.getInstance().screen.children()), DraggableStackVisitor.class); - draggingStack.set(DraggableStackProvider.from(() -> stackProviders), DraggableStackVisitor.from(() -> stackVisitors)); + draggingStack.set(DraggableStackProvider.from(() -> ScreenRegistry.getInstance().getDraggableProviders()), + DraggableStackVisitor.from(() -> ScreenRegistry.getInstance().getDraggableVisitors())); this.shouldReload = false; //Update Variables diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/CurrentDraggingStack.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/CurrentDraggingStack.java index 4fdbf4976..8086a48cc 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/CurrentDraggingStack.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/CurrentDraggingStack.java @@ -35,20 +35,22 @@ import me.shedaniel.rei.api.client.gui.drag.DraggingContext; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.common.util.Animator; import me.shedaniel.rei.impl.client.gui.widget.LateRenderable; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.screens.Screen; import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.function.Supplier; -public class CurrentDraggingStack extends Widget implements LateRenderable, DraggingContext { - private DraggableStackProvider provider; - private DraggableStackVisitor visitor; +public class CurrentDraggingStack extends Widget implements LateRenderable, DraggingContext<Screen> { + private DraggableStackProvider<Screen> provider; + private DraggableStackVisitor<Screen> visitor; @Nullable private DraggableEntry entry; private final List<RenderBackEntry> backToOriginals = new ArrayList<>(); - public void set(DraggableStackProvider provider, DraggableStackVisitor visitor) { + public void set(DraggableStackProvider<Screen> provider, DraggableStackVisitor<Screen> visitor) { this.provider = provider; this.visitor = visitor; } @@ -119,7 +121,7 @@ public class CurrentDraggingStack extends Widget implements LateRenderable, Drag private boolean drop() { if (entry != null && entry.dragging) { - Optional<DraggableStackVisitor.Acceptor> acceptor = visitor.visitDraggedStack(entry.stack); + Optional<DraggableStackVisitor.Acceptor> acceptor = visitor.visitDraggedStack(this, entry.stack); entry.stack.release(acceptor.isPresent()); acceptor.ifPresent(a -> a.accept(entry.stack)); entry = null; @@ -131,6 +133,11 @@ public class CurrentDraggingStack extends Widget implements LateRenderable, Drag } @Override + public Screen getScreen() { + return Minecraft.getInstance().screen; + } + + @Override @Nullable public DraggableStack getCurrentStack() { return entry != null && entry.dragging ? entry.stack : null; @@ -147,7 +154,7 @@ public class CurrentDraggingStack extends Widget implements LateRenderable, Drag backToOriginals.add(new RenderBackEntry(stack, initialPosition, position)); } - private class DraggableEntry { + private static class DraggableEntry { private final DraggableStack stack; private final Point start; private boolean dragging = false; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java index 79ab2d5cc..81cfb1397 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java @@ -36,7 +36,7 @@ import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.gui.drag.DraggableStack; -import me.shedaniel.rei.api.client.gui.drag.DraggableStackProvider; +import me.shedaniel.rei.api.client.gui.drag.DraggableStackProviderWidget; import me.shedaniel.rei.api.client.gui.drag.DraggingContext; import me.shedaniel.rei.api.client.gui.widgets.Slot; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; @@ -45,6 +45,7 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.impl.client.REIHelperImpl; import me.shedaniel.rei.impl.client.gui.ContainerScreenOverlay; import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.TextComponent; import net.minecraft.resources.ResourceLocation; @@ -59,7 +60,7 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; -public class EntryWidget extends Slot implements DraggableStackProvider { +public class EntryWidget extends Slot implements DraggableStackProviderWidget { @ApiStatus.Internal public static long stackDisplayOffset = 0; protected static final ResourceLocation RECIPE_GUI = new ResourceLocation("roughlyenoughitems", "textures/gui/recipecontainer.png"); @@ -446,7 +447,7 @@ public class EntryWidget extends Slot implements DraggableStackProvider { @Override @Nullable - public DraggableStack getHoveredStack(DraggingContext context, double mouseX, double mouseY) { + public DraggableStack getHoveredStack(DraggingContext<Screen> context, double mouseX, double mouseY) { if (!getCurrentEntry().isEmpty() && containsMouse(mouseX, mouseY)) { return new DraggableStack() { EntryStack<?> stack = getCurrentEntry().copy(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java index d6f45de76..57ccd0b6a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java @@ -42,15 +42,11 @@ import me.shedaniel.rei.api.client.REIHelper; import me.shedaniel.rei.api.client.REIOverlay; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; -import me.shedaniel.rei.api.client.entry.renderer.BatchEntryRenderer; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; import me.shedaniel.rei.api.client.gui.AbstractContainerEventHandler; -import me.shedaniel.rei.api.client.gui.drag.DraggableStack; -import me.shedaniel.rei.api.client.gui.drag.DraggableStackProvider; -import me.shedaniel.rei.api.client.gui.drag.DraggableStackVisitor; -import me.shedaniel.rei.api.client.gui.drag.DraggingContext; +import me.shedaniel.rei.api.client.gui.drag.*; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; @@ -87,7 +83,7 @@ import static me.shedaniel.rei.impl.client.gui.widget.EntryListWidget.entrySize; import static me.shedaniel.rei.impl.client.gui.widget.EntryListWidget.notSteppingOnExclusionZones; @ApiStatus.Internal -public class FavoritesListWidget extends WidgetWithBounds implements DraggableStackProvider, DraggableStackVisitor { +public class FavoritesListWidget extends WidgetWithBounds implements DraggableStackProviderWidget, DraggableStackVisitorWidget { protected final ScrollingContainer scrolling = new ScrollingContainer() { @Override public Rectangle getBounds() { @@ -152,7 +148,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt @Override @Nullable - public DraggableStack getHoveredStack(DraggingContext context, double mouseX, double mouseY) { + public DraggableStack getHoveredStack(DraggingContext<Screen> context, double mouseX, double mouseY) { if (innerBounds.contains(mouseX, mouseY)) { for (Entry entry : entries.values()) { if (entry.getWidget().containsMouse(mouseX, mouseY)) { @@ -211,7 +207,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt } @Override - public Optional<Acceptor> visitDraggedStack(DraggableStack stack) { + public Optional<DraggableStackVisitor.Acceptor> visitDraggedStack(DraggingContext<Screen> context, DraggableStack stack) { if (innerBounds.contains(PointHelper.ofMouse())) { EntrySerializer<?> serializer = stack.getStack().getDefinition().getSerializer(); if (stack instanceof FavoriteDraggableStack || (serializer.supportReading() && serializer.supportSaving())) { @@ -393,7 +389,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt } public int getReleaseIndex() { - DraggingContext context = DraggingContext.getInstance(); + DraggingContext<?> context = DraggingContext.getInstance(); Point position = context.getCurrentPosition(); if (context.isDraggingStack() && currentBounds.contains(position)) { int entrySize = entrySize(); @@ -455,7 +451,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt } public void drop(Entry entry, DraggableStack stack, FavoriteEntry favoriteEntry) { - DraggingContext context = DraggingContext.getInstance(); + DraggingContext<?> context = DraggingContext.getInstance(); double x = context.getCurrentPosition().x; double y = context.getCurrentPosition().y; entry.startedDraggingPosition = null; @@ -544,7 +540,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt if (!hidden) { this.hidden = true; if (!ConfigObject.getInstance().isFavoritesAnimated()) this.size.setAs(0); - else this.size.setTo(0, 1000); + else this.size.setTo(0, 400); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/TabWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/TabWidget.java index 90d5f2035..d8cd4566d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/TabWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/TabWidget.java @@ -30,7 +30,7 @@ import me.shedaniel.rei.api.client.ClientHelper; import me.shedaniel.rei.api.client.REIHelper; import me.shedaniel.rei.api.client.gui.Renderer; import me.shedaniel.rei.api.client.gui.drag.DraggableStack; -import me.shedaniel.rei.api.client.gui.drag.DraggableStackProvider; +import me.shedaniel.rei.api.client.gui.drag.DraggableStackProviderWidget; import me.shedaniel.rei.api.client.gui.drag.DraggingContext; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.Widget; @@ -38,6 +38,7 @@ import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.common.entry.EntryStack; import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; import net.minecraft.resources.ResourceLocation; @@ -49,7 +50,7 @@ import java.util.List; import java.util.function.Predicate; @ApiStatus.Internal -public class TabWidget extends WidgetWithBounds implements DraggableStackProvider { +public class TabWidget extends WidgetWithBounds implements DraggableStackProviderWidget { public static final ResourceLocation CHEST_GUI_TEXTURE = new ResourceLocation("roughlyenoughitems", "textures/gui/recipecontainer.png"); public static final ResourceLocation CHEST_GUI_TEXTURE_DARK = new ResourceLocation("roughlyenoughitems", "textures/gui/recipecontainer_dark.png"); @@ -139,7 +140,7 @@ public class TabWidget extends WidgetWithBounds implements DraggableStackProvide @Override @Nullable - public DraggableStack getHoveredStack(DraggingContext context, double mouseX, double mouseY) { + public DraggableStack getHoveredStack(DraggingContext<Screen> context, double mouseX, double mouseY) { if (isShown() && renderer instanceof EntryStack && containsMouse(mouseX, mouseY)) { return new DraggableStack() { EntryStack<?> stack = ((EntryStack<?>) renderer).copy(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java index 1fa56fe0b..04f44839f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java @@ -36,7 +36,6 @@ import me.shedaniel.rei.impl.common.registry.RecipeManagerContextImpl; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.crafting.Recipe; import org.apache.commons.lang3.mutable.MutableInt; -import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -61,7 +60,7 @@ public class DisplayRegistryImpl extends RecipeManagerContextImpl<REIClientPlugi } @Override - public int getDisplayCount() { + public int displaySize() { return displayCount.getValue(); } @@ -133,8 +132,8 @@ public class DisplayRegistryImpl extends RecipeManagerContextImpl<REIClientPlugi } @Override - public <T, D extends Display> void registerFiller(Class<T> typeClass, Predicate<? extends T> predicate, Function<T, D> mappingFunction) { - fillers.add(new DisplayFiller<>(typeClass, (Predicate<T>) predicate, mappingFunction)); + public <T, D extends Display> void registerFiller(Class<T> typeClass, Predicate<? extends T> predicate, Function<T, D> filler) { + fillers.add(new DisplayFiller<>(typeClass, (Predicate<T>) predicate, filler)); } @Override @@ -153,8 +152,8 @@ public class DisplayRegistryImpl extends RecipeManagerContextImpl<REIClientPlugi List<Recipe<?>> allSortedRecipes = getAllSortedRecipes(); for (int i = allSortedRecipes.size() - 1; i >= 0; i--) { Recipe<?> recipe = allSortedRecipes.get(i); - Display display = tryFillDisplay(recipe); - if (display != null) { + Collection<Display> displays = tryFillDisplay(recipe); + for (Display display : displays) { registerDisplay(0, display); } } @@ -162,14 +161,23 @@ public class DisplayRegistryImpl extends RecipeManagerContextImpl<REIClientPlugi } @Override - @Nullable - public <T> Display tryFillDisplay(T value) { - if (value instanceof Display) return (Display) value; + public <T> Collection<Display> tryFillDisplay(T value) { + if (value instanceof Display) return Collections.singleton((Display) value); + List<Display> displays = null; for (DisplayFiller<?, ?> filler : fillers) { Display display = tryFillDisplayGenerics(filler, value); - if (display != null) return display; + if (display != null) { + if (displays == null) displays = Collections.singletonList(display); + else { + if (!(displays instanceof ArrayList)) displays = new ArrayList<>(displays); + displays.add(display); + } + } } - return null; + if (displays != null) { + return displays; + } + return Collections.emptyList(); } private <T, D extends Display> D tryFillDisplayGenerics(DisplayFiller<T, D> filler, Object value) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/screen/ExclusionZonesImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/screen/ExclusionZonesImpl.java index aab52eb01..bbc097d9d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/screen/ExclusionZonesImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/screen/ExclusionZonesImpl.java @@ -58,8 +58,8 @@ public class ExclusionZonesImpl implements ExclusionZones { } @Override - public float getPriority() { - return -5f; + public double getPriority() { + return -5.0; } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl.java index 941cd8422..026cb405e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl.java @@ -29,6 +29,11 @@ import com.mojang.blaze3d.platform.Window; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.config.DisplayPanelLocation; +import me.shedaniel.rei.api.client.gui.drag.DraggableStackProvider; +import me.shedaniel.rei.api.client.gui.drag.DraggableStackProviderWidget; +import me.shedaniel.rei.api.client.gui.drag.DraggableStackVisitor; +import me.shedaniel.rei.api.client.gui.drag.DraggableStackVisitorWidget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.screen.*; import me.shedaniel.rei.api.common.category.CategoryIdentifier; @@ -55,6 +60,8 @@ import java.util.stream.Collectors; @Environment(EnvType.CLIENT) public class ScreenRegistryImpl implements ScreenRegistry { private Multimap<Class<? extends Screen>, ClickArea<?>> clickAreas = HashMultimap.create(); + private List<DraggableStackProvider<Screen>> draggableStacksProviders = new ArrayList<>(); + private List<DraggableStackVisitor<Screen>> draggableStacksVisitors = new ArrayList<>(); private List<FocusedStackProvider> focusedStackProviders = new ArrayList<>(); private List<OverlayDecider> deciders = new ArrayList<>(); private Map<Class<?>, List<OverlayDecider>> cache = new HashMap<>(); @@ -138,8 +145,14 @@ public class ScreenRegistryImpl implements ScreenRegistry { deciders.add(decider); deciders.sort(Comparator.reverseOrder()); clickAreas.clear(); + draggableStacksProviders.clear(); + draggableStacksVisitors.clear(); cache.clear(); tmpScreen = null; + registerDraggableStackProvider(DraggableStackProviderWidget.from(context -> + Widgets.walk(context.getScreen().children(), DraggableStackProviderWidget.class::isInstance))); + registerDraggableStackVisitor(DraggableStackVisitorWidget.from(context -> + Widgets.walk(context.getScreen().children(), DraggableStackVisitorWidget.class::isInstance))); } @Override @@ -149,6 +162,28 @@ public class ScreenRegistryImpl implements ScreenRegistry { } @Override + public <T extends Screen> void registerDraggableStackProvider(DraggableStackProvider<T> provider) { + draggableStacksProviders.add((DraggableStackProvider<Screen>) provider); + draggableStacksProviders.sort(Comparator.reverseOrder()); + } + + @Override + public <T extends Screen> void registerDraggableStackVisitor(DraggableStackVisitor<T> visitor) { + draggableStacksVisitors.add((DraggableStackVisitor<Screen>) visitor); + draggableStacksVisitors.sort(Comparator.reverseOrder()); + } + + @Override + public Iterable<DraggableStackProvider<Screen>> getDraggableProviders() { + return Collections.unmodifiableList(draggableStacksProviders); + } + + @Override + public Iterable<DraggableStackVisitor<Screen>> getDraggableVisitors() { + return Collections.unmodifiableList(draggableStacksVisitors); + } + + @Override public ExclusionZones exclusionZones() { return exclusionZones; } @@ -209,8 +244,8 @@ public class ScreenRegistryImpl implements ScreenRegistry { } @Override - public float getPriority() { - return -10; + public double getPriority() { + return -10.0; } }); registerFocusedStack(new FocusedStackProvider() { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/ItemComparatorRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/ItemComparatorRegistryImpl.java index 44614c8c9..e6d462cfd 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/ItemComparatorRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/ItemComparatorRegistryImpl.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.impl.common.entry.comparison; +import me.shedaniel.rei.api.common.entry.comparison.ComparisonContext; import me.shedaniel.rei.api.common.entry.comparison.ItemComparator; import me.shedaniel.rei.api.common.entry.comparison.ItemComparatorRegistry; import me.shedaniel.rei.api.common.plugins.REIPlugin; @@ -60,11 +61,21 @@ public class ItemComparatorRegistryImpl implements ItemComparatorRegistry { } @Override - public long hashOf(ItemStack stack) { + public long hashOf(ComparisonContext context, ItemStack stack) { ItemComparator comparator = comparators.get(stack.getItem()); if (comparator != null) { - return comparator.hash(stack); + return comparator.hash(context, stack); } return 1; } + + @Override + public boolean containsComparator(Item item) { + return comparators.containsKey(item); + } + + @Override + public int comparatorSize() { + return this.comparators.size(); + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java index ab584ac21..0275db9a4 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java @@ -49,6 +49,7 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.function.LongPredicate; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -153,7 +154,7 @@ public class EntryRegistryImpl implements EntryRegistry { } @Override - public void registerEntryAfter(@Nullable EntryStack<?> afterEntry, EntryStack<?> stack) { + public void addEntryAfter(@Nullable EntryStack<?> afterEntry, EntryStack<?> stack) { if (reloading) { int index = afterEntry != null ? reloadingRegistry.lastIndexOf(new HashedEntryStackWrapper(afterEntry)) : -1; if (index >= 0) { @@ -168,7 +169,7 @@ public class EntryRegistryImpl implements EntryRegistry { } @Override - public void registerEntriesAfter(@Nullable EntryStack<?> afterEntry, Collection<? extends EntryStack<?>> stacks) { + public void addEntriesAfter(@Nullable EntryStack<?> afterEntry, Collection<? extends EntryStack<?>> stacks) { if (reloading) { int index = afterEntry != null ? reloadingRegistry.lastIndexOf(new HashedEntryStackWrapper(afterEntry)) : -1; if (index >= 0) { @@ -207,4 +208,13 @@ public class EntryRegistryImpl implements EntryRegistry { return entries.removeIf((Predicate<EntryStack<?>>) predicate); } } + + @Override + public boolean removeEntryExactHashIf(LongPredicate predicate) { + if (reloading) { + return reloadingRegistry.removeIf(wrapper -> predicate.test(wrapper.hashExact())); + } else { + return entries.removeIf(stack -> predicate.test(EntryStacks.hashExact(stack))); + } + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/fluid/FluidSupportProviderImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/fluid/ |
