From 8422dbb005ac16df728035d86c2c52acfcbd98af Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 20 Nov 2021 17:50:10 +0800 Subject: Rewrite on how TransferHandler render errors, and fix #580 --- .../autocrafting/DefaultRecipeBookHandler.java | 4 ++-- .../categories/cooking/DefaultCookingCategory.java | 18 ++------------ .../crafting/DefaultCraftingCategory.java | 27 +-------------------- .../displays/crafting/DefaultCraftingDisplay.java | 15 ++++++++++++ .../displays/crafting/DefaultCustomDisplay.java | 28 +++++++++++++++++++++- 5 files changed, 47 insertions(+), 45 deletions(-) (limited to 'default-plugin/src/main/java/me') diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultRecipeBookHandler.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultRecipeBookHandler.java index d143714a6..41cdcf822 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultRecipeBookHandler.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultRecipeBookHandler.java @@ -68,7 +68,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()); @@ -82,7 +82,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/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 { +public class DefaultCookingCategory implements DisplayCategory { private CategoryIdentifier identifier; private EntryStack logo; private String categoryName; @@ -59,17 +56,6 @@ public class DefaultCookingCategory implements TransferDisplayCategory 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 setupDisplay(DefaultCookingDisplay display, Rectangle bounds) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); 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> { +public class DefaultCraftingCategory implements DisplayCategory> { @Override public CategoryIdentifier> getCategoryIdentifier() { return BuiltinPlugin.CRAFTING; @@ -91,28 +88,6 @@ public class DefaultCraftingCategory implements TransferDisplayCategory widgets, Rectangle bounds, DefaultCraftingDisplay display, IntList redSlots) { -// @Nullable -// Screen previousScreen = REIRuntime.getInstance().getPreviousScreen(); -// if (!(previousScreen instanceof AbstractContainerScreen)) return; -// AbstractContainerMenu containerMenu = ((AbstractContainerScreen) previousScreen).getMenu(); -// MenuInfo info = (MenuInfo) 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> getDisplayMerger() { 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..0a2234540 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 @@ -29,6 +29,8 @@ 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.plugin.common.BuiltinPlugin; @@ -94,4 +96,17 @@ public abstract class DefaultCraftingDisplay> extends BasicD return BasicDisplay.Serializer.>ofSimple(DefaultCustomDisplay::simple) .inputProvider(display -> display.getOrganisedInputEntries(3, 3)); } + + @Override + public List getInputEntries(MenuSerializationContext context, MenuInfo info, boolean fill) { + List list = new ArrayList<>(3 * 3); + for (int i = 0; i < 3 * 3; i++) { + list.add(EntryIngredient.empty()); + } + List 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; @@ -60,6 +64,28 @@ public class DefaultCustomDisplay extends DefaultCraftingDisplay> { return new DefaultCustomDisplay(optionalRecipe, input, output); } + @Override + public List getInputEntries(MenuSerializationContext context, MenuInfo info, boolean fill) { + if (fill && info instanceof SimpleGridMenuInfo) { + List out = new ArrayList<>(); + int craftingWidth = ((SimpleGridMenuInfo) info).getCraftingWidth(context.getMenu()); + int craftingHeight = ((SimpleGridMenuInfo) 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; -- cgit