diff options
| author | shedaniel <daniel@shedaniel.me> | 2021-11-21 19:10:50 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2021-11-21 19:10:50 +0800 |
| commit | 85e72e9a9bc70cf283ba872172985b338be59233 (patch) | |
| tree | bce73cb38c00b73d1323c7a014701ee638f2224b /default-plugin/src | |
| parent | a437fe0560478c636526862679ba1098688bf2c1 (diff) | |
| parent | c4cdd997f981d0a3b763140d1515a73941b18f5c (diff) | |
| download | RoughlyEnoughItems-85e72e9a9bc70cf283ba872172985b338be59233.tar.gz RoughlyEnoughItems-85e72e9a9bc70cf283ba872172985b338be59233.tar.bz2 RoughlyEnoughItems-85e72e9a9bc70cf283ba872172985b338be59233.zip | |
Merge remote-tracking branch 'origin/6.x-1.17' into 7.x-1.18
# Conflicts:
# api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfo.java
# gradle.properties
# runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TooltipArgumentType.java
# runtime/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java
Diffstat (limited to 'default-plugin/src')
7 files changed, 143 insertions, 49 deletions
diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/autocrafting/recipebook/DefaultRecipeBookHandler.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/autocrafting/recipebook/DefaultRecipeBookHandler.java index 9de8162ae..a93333703 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/autocrafting/recipebook/DefaultRecipeBookHandler.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/autocrafting/recipebook/DefaultRecipeBookHandler.java @@ -66,7 +66,7 @@ public class DefaultRecipeBookHandler implements TransferHandler { if (craftingDisplay.getHeight() > h || craftingDisplay.getWidth() > w) return Result.createFailed(new TranslatableComponent("error.rei.transfer.too_small", h, w)); if (!context.getMinecraft().player.getRecipeBook().contains(recipe)) - return Result.createFailed(new TranslatableComponent("error.rei.recipe.not.unlocked")); + return Result.createNotApplicable(); if (!context.isActuallyCrafting()) return Result.createSuccessful(); context.getMinecraft().setScreen(context.getContainerScreen()); @@ -79,7 +79,7 @@ public class DefaultRecipeBookHandler implements TransferHandler { if (defaultDisplay.getOptionalRecipe().isPresent()) { Recipe<?> recipe = (defaultDisplay).getOptionalRecipe().get(); if (!context.getMinecraft().player.getRecipeBook().contains(recipe)) - return Result.createFailed(new TranslatableComponent("error.rei.recipe.not.unlocked")); + return Result.createNotApplicable(); if (!context.isActuallyCrafting()) return Result.createSuccessful(); context.getMinecraft().setScreen(context.getContainerScreen()); diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java index 779b21e0b..15c55430d 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java @@ -69,9 +69,8 @@ import me.shedaniel.rei.plugin.common.displays.brewing.DefaultBrewingDisplay; import me.shedaniel.rei.plugin.common.displays.cooking.DefaultBlastingDisplay; import me.shedaniel.rei.plugin.common.displays.cooking.DefaultSmeltingDisplay; import me.shedaniel.rei.plugin.common.displays.cooking.DefaultSmokingDisplay; +import me.shedaniel.rei.plugin.common.displays.crafting.DefaultCraftingDisplay; import me.shedaniel.rei.plugin.common.displays.crafting.DefaultCustomDisplay; -import me.shedaniel.rei.plugin.common.displays.crafting.DefaultShapedDisplay; -import me.shedaniel.rei.plugin.common.displays.crafting.DefaultShapelessDisplay; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; @@ -236,8 +235,7 @@ public class DefaultClientPlugin implements REIClientPlugin, BuiltinClientPlugin @Override public void registerDisplays(DisplayRegistry registry) { - registry.registerRecipeFiller(ShapelessRecipe.class, RecipeType.CRAFTING, DefaultShapelessDisplay::new); - registry.registerRecipeFiller(ShapedRecipe.class, RecipeType.CRAFTING, DefaultShapedDisplay::new); + registry.registerRecipeFiller(CraftingRecipe.class, RecipeType.CRAFTING, DefaultCraftingDisplay::of); registry.registerRecipeFiller(SmeltingRecipe.class, RecipeType.SMELTING, DefaultSmeltingDisplay::new); registry.registerRecipeFiller(SmokingRecipe.class, RecipeType.SMOKING, DefaultSmokingDisplay::new); registry.registerRecipeFiller(BlastingRecipe.class, RecipeType.BLASTING, DefaultBlastingDisplay::new); diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/cooking/DefaultCookingCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/cooking/DefaultCookingCategory.java index e1ced8889..aa07f60ba 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/cooking/DefaultCookingCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/cooking/DefaultCookingCategory.java @@ -24,8 +24,6 @@ package me.shedaniel.rei.plugin.client.categories.cooking; import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; -import it.unimi.dsi.fastutil.ints.IntList; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.DisplayRenderer; @@ -33,13 +31,12 @@ import me.shedaniel.rei.api.client.gui.Renderer; import me.shedaniel.rei.api.client.gui.SimpleDisplayRenderer; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; -import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory; +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.plugin.common.displays.cooking.DefaultCookingDisplay; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.gui.GuiComponent; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; @@ -48,7 +45,7 @@ import java.util.Collections; import java.util.List; @Environment(EnvType.CLIENT) -public class DefaultCookingCategory implements TransferDisplayCategory<DefaultCookingDisplay> { +public class DefaultCookingCategory implements DisplayCategory<DefaultCookingDisplay> { private CategoryIdentifier<? extends DefaultCookingDisplay> identifier; private EntryStack<?> logo; private String categoryName; @@ -60,17 +57,6 @@ public class DefaultCookingCategory implements TransferDisplayCategory<DefaultCo } @Override - public void renderRedSlots(PoseStack matrices, List<Widget> widgets, Rectangle bounds, DefaultCookingDisplay display, IntList redSlots) { - Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); - matrices.pushPose(); - matrices.translate(0, 0, 400); - if (redSlots.contains(0)) { - GuiComponent.fill(matrices, startPoint.x + 1, startPoint.y + 1, startPoint.x + 1 + 16, startPoint.y + 1 + 16, 1090453504); - } - matrices.popPose(); - } - - @Override public List<Widget> setupDisplay(DefaultCookingDisplay display, Rectangle bounds) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); double cookingTime = display.getCookingTime(); diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/DefaultCraftingCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/DefaultCraftingCategory.java index fdedcff29..188ceff9c 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/DefaultCraftingCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/DefaultCraftingCategory.java @@ -24,8 +24,6 @@ package me.shedaniel.rei.plugin.client.categories.crafting; import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; -import it.unimi.dsi.fastutil.ints.IntList; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.Renderer; @@ -33,7 +31,6 @@ import me.shedaniel.rei.api.client.gui.widgets.Slot; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.registry.display.DisplayCategory; -import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.DisplayMerger; import me.shedaniel.rei.api.common.entry.EntryStack; @@ -51,7 +48,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; @Environment(EnvType.CLIENT) -public class DefaultCraftingCategory implements TransferDisplayCategory<DefaultCraftingDisplay<?>> { +public class DefaultCraftingCategory implements DisplayCategory<DefaultCraftingDisplay<?>> { @Override public CategoryIdentifier<? extends DefaultCraftingDisplay<?>> getCategoryIdentifier() { return BuiltinPlugin.CRAFTING; @@ -92,28 +89,6 @@ public class DefaultCraftingCategory implements TransferDisplayCategory<DefaultC } @Override - public void renderRedSlots(PoseStack matrices, List<Widget> widgets, Rectangle bounds, DefaultCraftingDisplay<?> display, IntList redSlots) { -// @Nullable -// Screen previousScreen = REIRuntime.getInstance().getPreviousScreen(); -// if (!(previousScreen instanceof AbstractContainerScreen)) return; -// AbstractContainerMenu containerMenu = ((AbstractContainerScreen<?>) previousScreen).getMenu(); -// MenuInfo<AbstractContainerMenu, DefaultCraftingDisplay> info = (MenuInfo<AbstractContainerMenu, DefaultCraftingDisplay>) MenuInfoRegistry.getInstance().get(getCategoryIdentifier(), containerMenu.getClass()); -// if (info == null) { -// return; -// } -// matrices.pushPose(); -// matrices.translate(0, 0, 400); -// Point startPoint = new Point(bounds.getCenterX() - 58, bounds.getCenterY() - 27); -// int width = info.getCraftingWidth(containerMenu); -// for (int slot : redSlots) { -// int x = slot % width; -// int y = Mth.floor(slot / (float) width); -// GuiComponent.fill(matrices, startPoint.x + 1 + x * 18, startPoint.y + 1 + y * 18, startPoint.x + 1 + x * 18 + 16, startPoint.y + 1 + y * 18 + 16, 0x60ff0000); -// } -// matrices.popPose(); - } - - @Override @Nullable public DisplayMerger<DefaultCraftingDisplay<?>> getDisplayMerger() { return DisplayCategory.getContentMerger(); diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCraftingDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCraftingDisplay.java index 2fc43dbaf..7138394e2 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCraftingDisplay.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCraftingDisplay.java @@ -23,21 +23,34 @@ package me.shedaniel.rei.plugin.common.displays.crafting; +import dev.architectury.injectables.annotations.ExpectPlatform; +import dev.architectury.injectables.annotations.PlatformOnly; +import dev.architectury.platform.Platform; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay; import me.shedaniel.rei.api.common.display.basic.BasicDisplay; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; +import me.shedaniel.rei.api.common.transfer.info.MenuInfo; +import me.shedaniel.rei.api.common.transfer.info.MenuSerializationContext; import me.shedaniel.rei.api.common.transfer.info.simple.SimpleGridMenuInfo; import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.api.common.util.EntryIngredients; import me.shedaniel.rei.plugin.common.BuiltinPlugin; +import net.minecraft.core.NonNullList; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.ShapedRecipe; +import net.minecraft.world.item.crafting.ShapelessRecipe; +import org.apache.commons.lang3.tuple.Pair; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Optional; @@ -49,6 +62,37 @@ public abstract class DefaultCraftingDisplay<C extends Recipe<?>> extends BasicD this.recipe = recipe; } + @Nullable + public static DefaultCraftingDisplay<?> of(Recipe<?> recipe) { + if (recipe instanceof ShapelessRecipe) { + return new DefaultShapelessDisplay((ShapelessRecipe) recipe); + } else if (recipe instanceof ShapedRecipe) { + return new DefaultShapedDisplay((ShapedRecipe) recipe); + } else if (!recipe.isSpecial()) { + NonNullList<Ingredient> ingredients = recipe.getIngredients(); + Pair<Integer, Integer> size = Platform.isFabric() ? null : getSize(recipe); + + if (!ingredients.isEmpty()) { + if (size == null) { + return new DefaultCustomDisplay(recipe, EntryIngredients.ofIngredients(recipe.getIngredients()), + Collections.singletonList(EntryIngredients.of(recipe.getResultItem()))); + } else { + return new DefaultCustomShapedDisplay(recipe, EntryIngredients.ofIngredients(recipe.getIngredients()), + Collections.singletonList(EntryIngredients.of(recipe.getResultItem())), + size.getLeft(), size.getRight()); + } + } + } + + return null; + } + + @ExpectPlatform + @PlatformOnly(PlatformOnly.FORGE) + private static Pair<Integer, Integer> getSize(Recipe<?> recipe) { + throw new AssertionError(); + } + @Override public CategoryIdentifier<?> getCategoryIdentifier() { return BuiltinPlugin.CRAFTING; @@ -94,4 +138,17 @@ public abstract class DefaultCraftingDisplay<C extends Recipe<?>> extends BasicD return BasicDisplay.Serializer.<DefaultCraftingDisplay<?>>ofSimple(DefaultCustomDisplay::simple) .inputProvider(display -> display.getOrganisedInputEntries(3, 3)); } + + @Override + public List<EntryIngredient> getInputEntries(MenuSerializationContext<?, ?, ?> context, MenuInfo<?, ?> info, boolean fill) { + List<EntryIngredient> list = new ArrayList<>(3 * 3); + for (int i = 0; i < 3 * 3; i++) { + list.add(EntryIngredient.empty()); + } + List<EntryIngredient> inputEntries = getInputEntries(); + for (int i = 0; i < inputEntries.size(); i++) { + list.set(getSlotWithSize(this, i, 3), inputEntries.get(i)); + } + return list; + } } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCustomDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCustomDisplay.java index 45cd6eed4..51cd02767 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCustomDisplay.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCustomDisplay.java @@ -24,12 +24,16 @@ package me.shedaniel.rei.plugin.common.displays.crafting; import me.shedaniel.rei.api.common.entry.EntryIngredient; -import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.registry.RecipeManagerContext; +import me.shedaniel.rei.api.common.transfer.info.MenuInfo; +import me.shedaniel.rei.api.common.transfer.info.MenuSerializationContext; +import me.shedaniel.rei.api.common.transfer.info.simple.SimpleGridMenuInfo; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.crafting.Recipe; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.BitSet; import java.util.List; import java.util.Optional; @@ -61,6 +65,28 @@ public class DefaultCustomDisplay extends DefaultCraftingDisplay<Recipe<?>> { } @Override + public List<EntryIngredient> getInputEntries(MenuSerializationContext<?, ?, ?> context, MenuInfo<?, ?> info, boolean fill) { + if (fill && info instanceof SimpleGridMenuInfo) { + List<EntryIngredient> out = new ArrayList<>(); + int craftingWidth = ((SimpleGridMenuInfo<AbstractContainerMenu, ?>) info).getCraftingWidth(context.getMenu()); + int craftingHeight = ((SimpleGridMenuInfo<AbstractContainerMenu, ?>) info).getCraftingHeight(context.getMenu()); + for (int i = 0; i < 9; i++) { + if (i < inputs.size()) { + int x = i % 3; + if (x < craftingWidth) { + out.add(inputs.get(i)); + if (out.size() > craftingWidth * craftingHeight) break; + } + } + } + while (out.size() < craftingWidth * craftingHeight) out.add(EntryIngredient.empty()); + return out; + } + + return super.getInputEntries(context, info, fill); + } + + @Override public int getWidth() { return width; } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCustomShapedDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCustomShapedDisplay.java new file mode 100644 index 000000000..18296bd1e --- /dev/null +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCustomShapedDisplay.java @@ -0,0 +1,52 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021 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.plugin.common.displays.crafting; + +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import net.minecraft.world.item.crafting.Recipe; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Optional; + +public class DefaultCustomShapedDisplay extends DefaultCraftingDisplay<Recipe<?>> { + private int width; + private int height; + + public DefaultCustomShapedDisplay(@Nullable Recipe<?> possibleRecipe, List<EntryIngredient> input, List<EntryIngredient> output, int width, int height) { + super(input, output, Optional.ofNullable(possibleRecipe)); + this.width = width; + this.height = height; + } + + @Override + public int getWidth() { + return width; + } + + @Override + public int getHeight() { + return height; + } +} |
