Ver Fonte

Make screen click area a provider, and fix work stations border displayed as light.

Signed-off-by: shedaniel <daniel@shedaniel.me>
shedaniel há 4 anos atrás
pai
commit
56ce7c780d

+ 43 - 2
RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/api/RecipeHelper.java

@@ -261,19 +261,60 @@ public interface RecipeHelper {
      */
     void registerLiveRecipeGenerator(LiveRecipeGenerator<?> liveRecipeGenerator);
     
-    void registerScreenClickArea(Rectangle rectangle, Class<? extends AbstractContainerScreen<?>> screenClass, ResourceLocation... categories);
+    /**
+     * @deprecated Use {@link #registerContainerClickArea(Rectangle, Class, ResourceLocation...)} for the same result.
+     */
+    @Deprecated
+    @ApiStatus.ScheduledForRemoval
+    default void registerScreenClickArea(Rectangle rectangle, Class<? extends AbstractContainerScreen<?>> screenClass, ResourceLocation... categories) {
+        registerContainerClickArea(rectangle, screenClass, categories);
+    }
+    
+    /**
+     * Registers a click area for a container screen.
+     *
+     * @param rectangle   The click area that is offset to the container screen's top left corner.
+     * @param screenClass The class of the screen.
+     * @param categories  The categories of result.
+     * @param <T>         The screen type to be registered to.
+     */
+    default <T extends AbstractContainerScreen<?>> void registerContainerClickArea(Rectangle rectangle, Class<T> screenClass, ResourceLocation... categories) {
+        registerContainerClickArea(screen -> rectangle, screenClass, categories);
+    }
+    
+    /**
+     * Registers a click area for a container screen.
+     *
+     * @param rectangleSupplier The click area supplier that is offset to the container screen's top left corner.
+     * @param screenClass       The class of the screen.
+     * @param categories        The categories of result.
+     * @param <T>               The screen type to be registered to.
+     */
+    <T extends AbstractContainerScreen<?>> void registerContainerClickArea(ScreenClickAreaProvider<T> rectangleSupplier, Class<T> screenClass, ResourceLocation... categories);
+    
+    /**
+     * Registers a click area for a screen.
+     *
+     * @param rectangleSupplier The click area supplier that is offset to the window's top left corner.
+     * @param screenClass       The class of the screen.
+     * @param categories        The categories of result.
+     * @param <T>               The screen type to be registered to.
+     */
+    <T extends Screen> void registerClickArea(ScreenClickAreaProvider<T> rectangleSupplier, Class<T> screenClass, ResourceLocation... categories);
     
     <T extends Recipe<?>> void registerRecipes(ResourceLocation category, Class<T> recipeClass, Function<T, RecipeDisplay> mappingFunction);
     
     <T extends Recipe<?>> void registerRecipes(ResourceLocation category, Function<Recipe, Boolean> recipeFilter, Function<T, RecipeDisplay> mappingFunction);
     
+    @ApiStatus.Internal
     List<RecipeHelper.ScreenClickArea> getScreenClickAreas();
     
     @ApiStatus.Internal
     boolean arePluginsLoading();
     
+    @ApiStatus.Internal
     interface ScreenClickArea {
-        Class<? extends AbstractContainerScreen> getScreenClass();
+        Class<? extends Screen> getScreenClass();
         
         Rectangle getRectangle();
         

+ 34 - 0
RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/api/ScreenClickAreaProvider.java

@@ -0,0 +1,34 @@
+/*
+ * This file is licensed under the MIT License, part of Roughly Enough Items.
+ * Copyright (c) 2018, 2019, 2020 shedaniel
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package me.shedaniel.rei.api;
+
+import me.shedaniel.math.Rectangle;
+import net.minecraft.client.gui.screens.Screen;
+import org.jetbrains.annotations.NotNull;
+
+@FunctionalInterface
+public interface ScreenClickAreaProvider<T extends Screen> {
+    @NotNull
+    Rectangle provide(@NotNull T screen);
+}

+ 1 - 1
RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/api/widgets/Widgets.java

@@ -165,7 +165,7 @@ public final class Widgets {
     
     @NotNull
     public static Panel createCategoryBase(@NotNull Rectangle rectangle) {
-        return Internals.getWidgetsProvider().createPanelWidget(rectangle).yTextureOffset(ConfigObject.getInstance().getRecipeBorderType().getYOffset()).rendering(Widgets::shouldSlotBaseRender);
+        return Internals.getWidgetsProvider().createPanelWidget(rectangle).rendering(Widgets::shouldSlotBaseRender);
     }
     
     private static boolean shouldRecipeBaseRender(@NotNull Panel panel) {

+ 6 - 6
RoughlyEnoughItems-default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java

@@ -395,12 +395,12 @@ public class DefaultPlugin implements REIPluginV0, BuiltinPlugin {
         recipeHelper.removeAutoCraftButton(BEACON);
         recipeHelper.removeAutoCraftButton(BEACON_PAYMENT);
         recipeHelper.removeAutoCraftButton(INFO);
-        recipeHelper.registerScreenClickArea(new Rectangle(88, 32, 28, 23), CraftingScreen.class, CRAFTING);
-        recipeHelper.registerScreenClickArea(new Rectangle(137, 29, 10, 13), InventoryScreen.class, CRAFTING);
-        recipeHelper.registerScreenClickArea(new Rectangle(97, 16, 14, 30), BrewingStandScreen.class, BREWING);
-        recipeHelper.registerScreenClickArea(new Rectangle(78, 32, 28, 23), FurnaceScreen.class, SMELTING);
-        recipeHelper.registerScreenClickArea(new Rectangle(78, 32, 28, 23), SmokerScreen.class, SMOKING);
-        recipeHelper.registerScreenClickArea(new Rectangle(78, 32, 28, 23), BlastFurnaceScreen.class, BLASTING);
+        recipeHelper.registerContainerClickArea(new Rectangle(88, 32, 28, 23), CraftingScreen.class, CRAFTING);
+        recipeHelper.registerContainerClickArea(new Rectangle(137, 29, 10, 13), InventoryScreen.class, CRAFTING);
+        recipeHelper.registerContainerClickArea(new Rectangle(97, 16, 14, 30), BrewingStandScreen.class, BREWING);
+        recipeHelper.registerContainerClickArea(new Rectangle(78, 32, 28, 23), FurnaceScreen.class, SMELTING);
+        recipeHelper.registerContainerClickArea(new Rectangle(78, 32, 28, 23), SmokerScreen.class, SMOKING);
+        recipeHelper.registerContainerClickArea(new Rectangle(78, 32, 28, 23), BlastFurnaceScreen.class, BLASTING);
         FluidSupportProvider.getInstance().registerProvider(itemStack -> {
             Item item = itemStack.getItem();
             if (item instanceof BucketItem)

+ 26 - 18
RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java

@@ -74,10 +74,7 @@ import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Random;
-import java.util.Set;
+import java.util.*;
 
 @ApiStatus.Internal
 public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverlay {
@@ -530,15 +527,20 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl
         }
         RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         this.renderWidgets(matrices, mouseX, mouseY, delta);
-        if (Minecraft.getInstance().screen instanceof AbstractContainerScreen && ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) {
-            AbstractContainerScreen<?> containerScreen = (AbstractContainerScreen<?>) Minecraft.getInstance().screen;
+        if (ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) {
+            List<ResourceLocation> categories = null;
+            Screen screen = Minecraft.getInstance().screen;
             for (RecipeHelper.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas())
-                if (area.getScreenClass().equals(Minecraft.getInstance().screen.getClass()))
-                    if (area.getRectangle().contains(mouseX - containerScreen.leftPos, mouseY - containerScreen.topPos)) {
-                        String collect = CollectionUtils.mapAndJoinToString(area.getCategories(), identifier -> RecipeHelper.getInstance().getCategory(identifier).getCategoryName(), ", ");
-                        TOOLTIPS.add(Tooltip.create(new TranslatableComponent("text.rei.view_recipes_for", collect)));
-                        break;
+                if (area.getScreenClass().equals(screen.getClass()))
+                    if (area.getRectangle().contains(mouseX, mouseY)) {
+                        if (categories == null) {
+                            categories = new ArrayList<>(Arrays.asList(area.getCategories()));
+                        } else categories.addAll(Arrays.asList(area.getCategories()));
                     }
+            if (categories != null && !categories.isEmpty()) {
+                String collect = CollectionUtils.mapAndJoinToString(categories, identifier -> RecipeHelper.getInstance().getCategory(identifier).getCategoryName(), ", ");
+                Tooltip.create(new TranslatableComponent("text.rei.view_recipes_for", collect)).queue();
+            }
         }
     }
     
@@ -767,15 +769,21 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl
                 removeGameModeMenu();
             }
         }
-        if (Minecraft.getInstance().screen instanceof AbstractContainerScreen && ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) {
-            AbstractContainerScreen<?> containerScreen = (AbstractContainerScreen<?>) Minecraft.getInstance().screen;
+        if (ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) {
+            List<ResourceLocation> categories = null;
+            Screen screen = Minecraft.getInstance().screen;
             for (RecipeHelper.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas())
-                if (area.getScreenClass().equals(containerScreen.getClass()))
-                    if (area.getRectangle().contains(mouseX - containerScreen.leftPos, mouseY - containerScreen.topPos)) {
-                        ClientHelper.getInstance().executeViewAllRecipesFromCategories(Arrays.asList(area.getCategories()));
-                        Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F));
-                        return true;
+                if (area.getScreenClass().equals(screen.getClass()))
+                    if (area.getRectangle().contains(mouseX, mouseY)) {
+                        if (categories == null) {
+                            categories = new ArrayList<>(Arrays.asList(area.getCategories()));
+                        } else categories.addAll(Arrays.asList(area.getCategories()));
                     }
+            if (categories != null && !categories.isEmpty()) {
+                ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addCategories(categories).fillPreferredOpenedCategory());
+                Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F));
+                return true;
+            }
         }
         for (GuiEventListener element : widgets)
             if (element != wrappedSubsetsMenu && element != wrappedWeatherMenu && element != wrappedGameModeMenu && element.mouseClicked(mouseX, mouseY, button)) {

+ 22 - 8
RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java

@@ -36,6 +36,7 @@ import me.shedaniel.rei.utils.CollectionUtils;
 import net.fabricmc.api.EnvType;
 import net.fabricmc.api.Environment;
 import net.minecraft.Util;
+import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.screens.Screen;
 import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
 import net.minecraft.resources.ResourceLocation;
@@ -52,6 +53,7 @@ import java.util.*;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -594,8 +596,17 @@ public class RecipeHelperImpl implements RecipeHelper {
     }
     
     @Override
-    public void registerScreenClickArea(Rectangle rectangle, Class<? extends AbstractContainerScreen<?>> screenClass, ResourceLocation... categories) {
-        this.screenClickAreas.add(new ScreenClickAreaImpl(screenClass, rectangle, categories));
+    public <T extends AbstractContainerScreen<?>> void registerContainerClickArea(ScreenClickAreaProvider<T> rectangleSupplier, Class<T> screenClass, ResourceLocation... categories) {
+        registerClickArea(screen -> {
+            Rectangle rectangle = rectangleSupplier.provide(screen).clone();
+            rectangle.translate(screen.leftPos, screen.topPos);
+            return rectangle;
+        }, screenClass, categories);
+    }
+    
+    @Override
+    public <T extends Screen> void registerClickArea(ScreenClickAreaProvider<T> rectangleSupplier, Class<T> screenClass, ResourceLocation... categories) {
+        this.screenClickAreas.add(new ScreenClickAreaImpl(screenClass, () -> rectangleSupplier.provide((T) Minecraft.getInstance().screen), categories));
     }
     
     @Override
@@ -626,24 +637,27 @@ public class RecipeHelperImpl implements RecipeHelper {
     }
     
     private static class ScreenClickAreaImpl implements ScreenClickArea {
-        private Class<? extends AbstractContainerScreen<?>> screenClass;
-        private Rectangle rectangle;
+        private Class<? extends Screen> screenClass;
+        private Supplier<Rectangle> rectangleSupplier;
         private ResourceLocation[] categories;
         
-        private ScreenClickAreaImpl(Class<? extends AbstractContainerScreen<?>> screenClass, Rectangle rectangle, ResourceLocation[] categories) {
+        private ScreenClickAreaImpl(Class<? extends Screen> screenClass, Supplier<Rectangle> rectangleSupplier, ResourceLocation[] categories) {
             this.screenClass = screenClass;
-            this.rectangle = rectangle;
+            this.rectangleSupplier = rectangleSupplier;
             this.categories = categories;
         }
         
-        public Class<? extends AbstractContainerScreen<?>> getScreenClass() {
+        @Override
+        public Class<? extends Screen> getScreenClass() {
             return screenClass;
         }
         
+        @Override
         public Rectangle getRectangle() {
-            return rectangle;
+            return rectangleSupplier.get();
         }
         
+        @Override
         public ResourceLocation[] getCategories() {
             return categories;
         }

+ 1 - 1
gradle.properties

@@ -1,5 +1,5 @@
 org.gradle.jvmargs=-Xmx3G
-mod_version=5.4.5
+mod_version=5.5.0
 supported_version=1.16.2/3
 minecraft_version=1.16.3
 fabricloader_version=0.9.1+build.205