update to new JEI API

This commit is contained in:
Darkere
2022-07-19 19:20:34 +02:00
committed by Raoul
parent a7cfcbfe89
commit 0d98e98374
9 changed files with 169 additions and 165 deletions

View File

@@ -5,9 +5,10 @@ import com.refinedmods.refinedstorage.apiimpl.network.node.cover.CoverManager;
import com.refinedmods.refinedstorage.item.CoverItem;
import com.refinedmods.refinedstorage.recipe.CoverRecipe;
import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.ingredients.IIngredients;
import mezz.jei.api.recipe.category.extensions.vanilla.crafting.ICustomCraftingCategoryExtension;
import mezz.jei.api.gui.builder.IRecipeLayoutBuilder;
import mezz.jei.api.gui.ingredient.ICraftingGridHelper;
import mezz.jei.api.recipe.IFocusGroup;
import mezz.jei.api.recipe.category.extensions.vanilla.crafting.ICraftingCategoryExtension;
import net.minecraft.core.NonNullList;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.CreativeModeTab;
@@ -16,25 +17,24 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.Block;
import net.minecraftforge.common.Tags;
import net.minecraftforge.common.util.Size2i;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.tags.ITag;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class CoverCraftingCategoryExtension implements ICustomCraftingCategoryExtension {
public class CoverCraftingCategoryExtension implements ICraftingCategoryExtension {
@Override
public void setIngredients(IIngredients ingredients) {
public void setRecipe(IRecipeLayoutBuilder builder, ICraftingGridHelper craftingGridHelper, IFocusGroup focuses) {
List<ItemStack> input = new ArrayList<>();
List<ItemStack> output = new ArrayList<>();
for (Block block : ForgeRegistries.BLOCKS.getValues()) {
Item item = Item.byBlock(block);
if (item == Items.AIR) {
Item item = Item.BY_BLOCK.get(block);
if (item == null || item == Items.AIR) {
continue;
}
NonNullList<ItemStack> subBlocks = NonNullList.create();
@@ -48,15 +48,26 @@ public class CoverCraftingCategoryExtension implements ICustomCraftingCategoryEx
}
}
}
ITag<Item> nuggets = ForgeRegistries.ITEMS.tags().getTag(Tags.Items.NUGGETS_IRON);
ingredients.setInputLists(VanillaTypes.ITEM, Arrays.asList(nuggets.stream().map(ItemStack::new).collect(Collectors.toList()), input));
ingredients.setOutputs(VanillaTypes.ITEM, output);
ITag<Item> nuggetTag = ForgeRegistries.ITEMS.tags().getTag(Tags.Items.NUGGETS_IRON);
List<ItemStack> nuggets = nuggetTag.stream().map(ItemStack::new).toList();
List<List<ItemStack>> inputs = new ArrayList<>(Collections.nCopies(9, new ArrayList<>()));
inputs.set(4, nuggets);
inputs.set(5, input);
craftingGridHelper.setInputs(builder, VanillaTypes.ITEM_STACK, inputs, 3, 3);
craftingGridHelper.setOutputs(builder, VanillaTypes.ITEM_STACK, output);
//builder.createFocusLink(in, out); //waiting on API update
}
@Nullable
@Override
public Size2i getSize() {
return new Size2i(2, 1);
public int getWidth() {
return 3;
}
@Override
public int getHeight() {
return 3;
}
@Nullable
@@ -64,21 +75,4 @@ public class CoverCraftingCategoryExtension implements ICustomCraftingCategoryEx
public ResourceLocation getRegistryName() {
return CoverRecipe.SERIALIZER.getRegistryName();
}
@Override
public void setRecipe(IRecipeLayout recipeLayout, IIngredients ingredients) {
ITag<Item> nuggets = ForgeRegistries.ITEMS.tags().getTag(Tags.Items.NUGGETS_IRON);
ItemStack stack = recipeLayout.getFocus(VanillaTypes.ITEM).getValue();
if (stack.getItem() instanceof CoverItem) {
recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(4, nuggets.stream().map(ItemStack::new).collect(Collectors.toList()));
recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(5, CoverItem.getItem(stack));
recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(0, stack);
} else {
recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(4, nuggets.stream().map(ItemStack::new).collect(Collectors.toList()));
recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(5, stack);
ItemStack output = new ItemStack(RSItems.COVER.get());
CoverItem.setItem(output, stack);
recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(0, output);
}
}
}

View File

@@ -9,8 +9,11 @@ import com.refinedmods.refinedstorage.network.grid.GridTransferMessage;
import com.refinedmods.refinedstorage.screen.grid.GridScreen;
import com.refinedmods.refinedstorage.screen.grid.stack.IGridStack;
import com.refinedmods.refinedstorage.screen.grid.stack.ItemGridStack;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.gui.ingredient.IGuiIngredient;
import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.forge.ForgeTypes;
import mezz.jei.api.gui.ingredient.IRecipeSlotView;
import mezz.jei.api.gui.ingredient.IRecipeSlotsView;
import mezz.jei.api.recipe.RecipeIngredientRole;
import mezz.jei.api.recipe.transfer.IRecipeTransferError;
import mezz.jei.api.recipe.transfer.IRecipeTransferHandler;
import net.minecraft.client.gui.screens.Screen;
@@ -19,11 +22,9 @@ import net.minecraft.world.inventory.CraftingContainer;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.CraftingRecipe;
import net.minecraftforge.fluids.FluidStack;
import org.jetbrains.annotations.Nullable;
import javax.annotation.Nonnull;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
public class GridRecipeTransferHandler implements IRecipeTransferHandler<GridContainerMenu, Object> {
@@ -47,23 +48,22 @@ public class GridRecipeTransferHandler implements IRecipeTransferHandler<GridCon
}
@Override
public IRecipeTransferError transferRecipe(@Nonnull GridContainerMenu container, Object recipe, @Nonnull IRecipeLayout recipeLayout, @Nonnull Player player, boolean maxTransfer, boolean doTransfer) {
public @Nullable IRecipeTransferError transferRecipe(GridContainerMenu container, Object recipe, IRecipeSlotsView recipeSlots, Player player, boolean maxTransfer, boolean doTransfer) {
if (!(container.getScreenInfoProvider() instanceof GridScreen)) {
return null;
}
GridType type = container.getGrid().getGridType();
if (type == GridType.CRAFTING) {
return transferRecipeForCraftingGrid(container, recipe, recipeLayout, player, doTransfer);
return transferRecipeForCraftingGrid(container, recipe, recipeSlots, player, doTransfer);
} else if (type == GridType.PATTERN) {
return transferRecipeForPatternGrid(container, recipe, recipeLayout, player, doTransfer);
return transferRecipeForPatternGrid(container, recipe, recipeSlots, player, doTransfer);
}
return null;
}
private RecipeTransferCraftingGridError transferRecipeForCraftingGrid(GridContainerMenu container, Object recipe, IRecipeLayout recipeLayout, Player player, boolean doTransfer) {
private RecipeTransferCraftingGridError transferRecipeForCraftingGrid(GridContainerMenu container, Object recipe, IRecipeSlotsView recipeLayout, Player player, boolean doTransfer) {
IngredientTracker tracker = createTracker(container, recipeLayout, player, doTransfer);
if (doTransfer) {
@@ -88,7 +88,7 @@ public class GridRecipeTransferHandler implements IRecipeTransferHandler<GridCon
return null;
}
private IRecipeTransferError transferRecipeForPatternGrid(GridContainerMenu container, Object recipe, IRecipeLayout recipeLayout, Player player, boolean doTransfer) {
private IRecipeTransferError transferRecipeForPatternGrid(GridContainerMenu container, Object recipe, IRecipeSlotsView recipeLayout, Player player, boolean doTransfer) {
IngredientTracker tracker = createTracker(container, recipeLayout, player, doTransfer);
if (doTransfer) {
@@ -102,7 +102,7 @@ public class GridRecipeTransferHandler implements IRecipeTransferHandler<GridCon
return null;
}
private IngredientTracker createTracker(GridContainerMenu container, IRecipeLayout recipeLayout, Player player, boolean doTransfer) {
private IngredientTracker createTracker(GridContainerMenu container, IRecipeSlotsView recipeLayout, Player player, boolean doTransfer) {
IngredientTracker tracker = new IngredientTracker(recipeLayout, doTransfer);
// Using IGridView#getStacks will return a *filtered* list of items in the view,
@@ -145,66 +145,74 @@ public class GridRecipeTransferHandler implements IRecipeTransferHandler<GridCon
return System.currentTimeMillis() - lastTransferTimeMs <= TRANSFER_SCROLLBAR_DELAY_MS;
}
private void moveItems(GridContainerMenu gridContainer, Object recipe, IRecipeLayout recipeLayout, IngredientTracker tracker) {
private void moveItems(GridContainerMenu gridContainer, Object recipe, IRecipeSlotsView recipeLayout, IngredientTracker tracker) {
this.lastTransferTimeMs = System.currentTimeMillis();
if (gridContainer.getGrid().getGridType() == GridType.PATTERN && !(recipe instanceof CraftingRecipe)) {
moveForProcessing(recipeLayout, tracker);
} else {
move(gridContainer, recipeLayout, recipe);
move(recipeLayout);
}
}
private void move(GridContainerMenu gridContainer, IRecipeLayout recipeLayout, Object recipe) {
RS.NETWORK_HANDLER.sendToServer(new GridTransferMessage(
recipeLayout.getItemStacks().getGuiIngredients(),
gridContainer.slots.stream().filter(s -> s.container instanceof CraftingContainer).collect(Collectors.toList()),
recipe instanceof CraftingRecipe
));
private void move(IRecipeSlotsView recipeSlotsView) {
List<List<ItemStack>> inputs = recipeSlotsView.getSlotViews(RecipeIngredientRole.INPUT).stream().map(view -> {
//Creating a mutable list
List<ItemStack> stacks = view.getIngredients(VanillaTypes.ITEM_STACK).collect(Collectors.toCollection(ArrayList::new));
//moving the displayed stack to first
Optional<ItemStack> displayStack = view.getDisplayedIngredient(VanillaTypes.ITEM_STACK);
displayStack.ifPresent(stack -> {
int index = stacks.indexOf(stack);
if (index > -1) {
stacks.remove(index);
stacks.add(0, stack);
}
});
return stacks;
}).toList();
RS.NETWORK_HANDLER.sendToServer(new GridTransferMessage(inputs));
}
private void moveForProcessing(IRecipeLayout recipeLayout, IngredientTracker tracker) {
private void moveForProcessing(IRecipeSlotsView recipeLayout, IngredientTracker tracker) {
List<ItemStack> inputs = new LinkedList<>();
List<ItemStack> outputs = new LinkedList<>();
List<FluidStack> fluidInputs = new LinkedList<>();
List<FluidStack> fluidOutputs = new LinkedList<>();
for (IGuiIngredient<ItemStack> guiIngredient : recipeLayout.getItemStacks().getGuiIngredients().values()) {
handleItemIngredient(inputs, outputs, guiIngredient, tracker);
List<IRecipeSlotView> inputSlots = recipeLayout.getSlotViews(RecipeIngredientRole.INPUT);
for (IRecipeSlotView view : inputSlots) {
handleItemIngredient(inputs, view, tracker);
handleFluidIngredient(fluidInputs, view);
}
for (IGuiIngredient<FluidStack> guiIngredient : recipeLayout.getFluidStacks().getGuiIngredients().values()) {
handleFluidIngredient(fluidInputs, fluidOutputs, guiIngredient);
List<IRecipeSlotView> outputSlots = recipeLayout.getSlotViews(RecipeIngredientRole.OUTPUT);
for (IRecipeSlotView view : outputSlots) {
handleItemIngredient(outputs, view, tracker);
handleFluidIngredient(fluidOutputs, view);
}
RS.NETWORK_HANDLER.sendToServer(new GridProcessingTransferMessage(inputs, outputs, fluidInputs, fluidOutputs));
}
private void handleFluidIngredient(List<FluidStack> fluidInputs, List<FluidStack> fluidOutputs, IGuiIngredient<FluidStack> guiIngredient) {
if (guiIngredient != null && guiIngredient.getDisplayedIngredient() != null) {
FluidStack ingredient = guiIngredient.getDisplayedIngredient().copy();
if (guiIngredient.isInput()) {
fluidInputs.add(ingredient);
} else {
fluidOutputs.add(ingredient);
}
private void handleFluidIngredient(List<FluidStack> list, IRecipeSlotView slotView) {
if (slotView != null) {
slotView.getDisplayedIngredient(ForgeTypes.FLUID_STACK).ifPresent(list::add);
}
}
private void handleItemIngredient(List<ItemStack> inputs, List<ItemStack> outputs, IGuiIngredient<ItemStack> guiIngredient, IngredientTracker tracker) {
if (guiIngredient != null && guiIngredient.getDisplayedIngredient() != null) {
ItemStack ingredient = tracker.findBestMatch(guiIngredient.getAllIngredients()).copy();
private void handleItemIngredient(List<ItemStack> list, IRecipeSlotView slotView, IngredientTracker tracker) {
if (slotView != null && slotView.getIngredients(VanillaTypes.ITEM_STACK).findAny().isPresent()) {
ItemStack stack = tracker.findBestMatch(slotView.getIngredients(VanillaTypes.ITEM_STACK).toList());
if (ingredient == ItemStack.EMPTY) {
ingredient = guiIngredient.getDisplayedIngredient().copy();
if (stack.isEmpty() && slotView.getDisplayedIngredient(VanillaTypes.ITEM_STACK).isPresent()) {
stack = slotView.getDisplayedIngredient(VanillaTypes.ITEM_STACK).get();
}
if (guiIngredient.isInput()) {
inputs.add(ingredient);
} else {
outputs.add(ingredient);
if (!stack.isEmpty()) {
list.add(stack);
}
}
}

View File

@@ -1,30 +1,58 @@
package com.refinedmods.refinedstorage.integration.jei;
import com.refinedmods.refinedstorage.RSItems;
import com.refinedmods.refinedstorage.apiimpl.network.node.cover.CoverManager;
import com.refinedmods.refinedstorage.item.CoverItem;
import com.refinedmods.refinedstorage.recipe.HollowCoverRecipe;
import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.ingredients.IIngredients;
import mezz.jei.api.recipe.category.extensions.vanilla.crafting.ICustomCraftingCategoryExtension;
import mezz.jei.api.gui.builder.IRecipeLayoutBuilder;
import mezz.jei.api.gui.ingredient.ICraftingGridHelper;
import mezz.jei.api.recipe.IFocusGroup;
import mezz.jei.api.recipe.category.extensions.vanilla.crafting.ICraftingCategoryExtension;
import net.minecraft.core.NonNullList;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.common.util.Size2i;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.Block;
import net.minecraftforge.registries.ForgeRegistries;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class HollowCoverCraftingCategoryExtension implements ICustomCraftingCategoryExtension {
public class HollowCoverCraftingCategoryExtension implements ICraftingCategoryExtension {
@Override
public void setIngredients(IIngredients ingredients) {
ingredients.setInput(VanillaTypes.ITEM, new ItemStack(RSItems.COVER.get()));
ingredients.setOutput(VanillaTypes.ITEM, new ItemStack(RSItems.HOLLOW_COVER.get()));
}
public void setRecipe(IRecipeLayoutBuilder builder, ICraftingGridHelper craftingGridHelper, IFocusGroup focuses) {
@Nullable
@Override
public Size2i getSize() {
return new Size2i(2, 1);
List<List<ItemStack>> stacks = new ArrayList<>(Collections.nCopies(9, new ArrayList<>()));
List<ItemStack> input = new ArrayList<>();
List<ItemStack> output = new ArrayList<>();
for (Block block : ForgeRegistries.BLOCKS.getValues()) {
Item item = Item.BY_BLOCK.get(block);
if (item == null || item == Items.AIR) {
continue;
}
NonNullList<ItemStack> subBlocks = NonNullList.create();
block.fillItemCategory(CreativeModeTab.TAB_SEARCH, subBlocks);
for (ItemStack subBlock : subBlocks) {
if (CoverManager.isValidCover(subBlock)) {
ItemStack fullCover = new ItemStack(RSItems.COVER.get());
CoverItem.setItem(fullCover, subBlock);
input.add(fullCover);
ItemStack hollowCover = new ItemStack(RSItems.HOLLOW_COVER.get());
CoverItem.setItem(hollowCover, subBlock);
output.add(hollowCover);
}
}
}
stacks.set(4, input);
craftingGridHelper.setInputs(builder, VanillaTypes.ITEM_STACK, stacks, 0, 0);
craftingGridHelper.setOutputs(builder, VanillaTypes.ITEM_STACK, output);
}
@Nullable
@@ -34,18 +62,12 @@ public class HollowCoverCraftingCategoryExtension implements ICustomCraftingCate
}
@Override
public void setRecipe(IRecipeLayout recipeLayout, IIngredients ingredients) {
ItemStack stack = recipeLayout.getFocus(VanillaTypes.ITEM).getValue();
if (stack.getItem() == RSItems.COVER.get()) {
recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(5, stack);
ItemStack output = new ItemStack(RSItems.HOLLOW_COVER.get());
CoverItem.setItem(output, CoverItem.getItem(stack));
recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(0, output);
} else {
ItemStack input = new ItemStack(RSItems.COVER.get());
CoverItem.setItem(input, CoverItem.getItem(stack));
recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(5, input);
recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(0, stack);
}
public int getWidth() {
return 0;
}
@Override
public int getHeight() {
return 0;
}
}

View File

@@ -1,19 +1,18 @@
package com.refinedmods.refinedstorage.integration.jei;
import mezz.jei.api.gui.ingredient.IGuiIngredient;
import net.minecraft.world.item.ItemStack;
import mezz.jei.api.gui.ingredient.IRecipeSlotView;
import java.util.UUID;
class Ingredient {
private final IGuiIngredient<ItemStack> guiIngredient;
private final IRecipeSlotView slotView;
private final int required;
private UUID craftStackId;
private int fulfilled;
public Ingredient(IGuiIngredient<ItemStack> guiIngredient) {
this.guiIngredient = guiIngredient;
this.required = guiIngredient.getAllIngredients().get(0).getCount();
public Ingredient(IRecipeSlotView view, int count) {
this.slotView = view;
this.required = count;
}
public boolean isAvailable() {
@@ -28,8 +27,8 @@ class Ingredient {
return craftStackId != null;
}
public IGuiIngredient<ItemStack> getGuiIngredient() {
return guiIngredient;
public IRecipeSlotView getSlotView() {
return slotView;
}
public UUID getCraftStackId() {

View File

@@ -6,8 +6,10 @@ import com.refinedmods.refinedstorage.api.util.IComparer;
import com.refinedmods.refinedstorage.apiimpl.API;
import com.refinedmods.refinedstorage.item.PatternItem;
import com.refinedmods.refinedstorage.screen.grid.stack.IGridStack;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.gui.ingredient.IGuiIngredient;
import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.gui.ingredient.IRecipeSlotView;
import mezz.jei.api.gui.ingredient.IRecipeSlotsView;
import mezz.jei.api.recipe.RecipeIngredientRole;
import net.minecraft.client.Minecraft;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
@@ -20,12 +22,13 @@ public class IngredientTracker {
private final Map<ResourceLocation, Integer> storedItems = new HashMap<>();
private boolean doTransfer;
public IngredientTracker(IRecipeLayout recipeLayout, boolean doTransfer) {
for (IGuiIngredient<ItemStack> guiIngredient : recipeLayout.getItemStacks().getGuiIngredients().values()) {
if (guiIngredient.isInput() && !guiIngredient.getAllIngredients().isEmpty()) {
ingredients.add(new Ingredient(guiIngredient));
}
public IngredientTracker(IRecipeSlotsView recipeLayout, boolean doTransfer) {
for (IRecipeSlotView slotView : recipeLayout.getSlotViews(RecipeIngredientRole.INPUT)) {
Optional<ItemStack> optionalItemStack = slotView.getIngredients(VanillaTypes.ITEM_STACK).findAny();
optionalItemStack.ifPresent(stack -> ingredients.add(new Ingredient(slotView, stack.getCount())));
}
this.doTransfer = doTransfer;
}
@@ -55,9 +58,8 @@ public class IngredientTracker {
}
Optional<ItemStack> match = ingredient
.getGuiIngredient()
.getAllIngredients()
.stream()
.getSlotView()
.getIngredients(VanillaTypes.ITEM_STACK)
.filter(s -> API.instance().getComparer().isEqual(stack, s, IComparer.COMPARE_NBT))
.findFirst();

View File

@@ -1,7 +1,7 @@
package com.refinedmods.refinedstorage.integration.jei;
import com.mojang.blaze3d.vertex.PoseStack;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.gui.ingredient.IRecipeSlotsView;
import mezz.jei.api.recipe.transfer.IRecipeTransferError;
import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft;
@@ -29,11 +29,11 @@ public class RecipeTransferCraftingGridError implements IRecipeTransferError {
}
@Override
public void showError(PoseStack stack, int mouseX, int mouseY, IRecipeLayout recipeLayout, int recipeX, int recipeY) {
List<Component> message = drawIngredientHighlights(stack, recipeX, recipeY);
public void showError(PoseStack poseStack, int mouseX, int mouseY, IRecipeSlotsView recipeSlotsView, int recipeX, int recipeY) {
List<Component> message = drawIngredientHighlights(poseStack, recipeX, recipeY);
Screen currentScreen = Minecraft.getInstance().screen;
currentScreen.renderComponentTooltip(stack, message, mouseX, mouseY);
currentScreen.renderComponentTooltip(poseStack, message, mouseX, mouseY);
}
protected List<Component> drawIngredientHighlights(PoseStack stack, int recipeX, int recipeY) {
@@ -46,10 +46,10 @@ public class RecipeTransferCraftingGridError implements IRecipeTransferError {
for (Ingredient ingredient : tracker.getIngredients()) {
if (!ingredient.isAvailable()) {
if (ingredient.isCraftable()) {
ingredient.getGuiIngredient().drawHighlight(stack, AUTOCRAFTING_HIGHLIGHT_COLOR.getRGB(), recipeX, recipeY);
ingredient.getSlotView().drawHighlight(stack, AUTOCRAFTING_HIGHLIGHT_COLOR.getRGB());
craftMessage = true;
} else {
ingredient.getGuiIngredient().drawHighlight(stack, MISSING_HIGHLIGHT_COLOR.getRGB(), recipeX, recipeY);
ingredient.getSlotView().drawHighlight(stack, MISSING_HIGHLIGHT_COLOR.getRGB());
missingMessage = true;
}
}

View File

@@ -22,7 +22,7 @@ public class RecipeTransferPatternGridError extends RecipeTransferCraftingGridEr
for (Ingredient ingredient : tracker.getIngredients()) {
if (ingredient.isCraftable()) {
ingredient.getGuiIngredient().drawHighlight(stack, AUTOCRAFTING_HIGHLIGHT_COLOR.getRGB(), recipeX, recipeY);
ingredient.getSlotView().drawHighlight(stack, AUTOCRAFTING_HIGHLIGHT_COLOR.getRGB());
craftMessage = true;
}
}

View File

@@ -1,47 +1,36 @@
package com.refinedmods.refinedstorage.network.grid;
import com.refinedmods.refinedstorage.api.network.grid.GridType;
import com.refinedmods.refinedstorage.api.network.grid.IGrid;
import com.refinedmods.refinedstorage.container.GridContainerMenu;
import com.refinedmods.refinedstorage.util.StackUtils;
import mezz.jei.api.gui.ingredient.IGuiIngredient;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.network.NetworkEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
public class GridTransferMessage {
private final ItemStack[][] recipe = new ItemStack[9][];
private Map<Integer, ? extends IGuiIngredient<ItemStack>> inputs;
private List<Slot> slots;
boolean isCraftingRecipe;
List<List<ItemStack>> inputs;
public GridTransferMessage() {
}
public GridTransferMessage(Map<Integer, ? extends IGuiIngredient<ItemStack>> inputs, List<Slot> slots, boolean isCraftingRecipe) {
public GridTransferMessage(List<List<ItemStack>> inputs) {
this.inputs = inputs;
this.slots = slots;
this.isCraftingRecipe = isCraftingRecipe;
}
public static GridTransferMessage decode(FriendlyByteBuf buf) {
GridTransferMessage msg = new GridTransferMessage();
int slots = buf.readInt();
for (int i = 0; i < slots; i++) {
int numberOfIngredients = buf.readInt();
msg.recipe[i] = new ItemStack[numberOfIngredients];
for (int i = 0; i < slots; ++i) {
int ingredients = buf.readInt();
msg.recipe[i] = new ItemStack[ingredients];
for (int j = 0; j < ingredients; ++j) {
for (int j = 0; j < numberOfIngredients; j++) {
msg.recipe[i][j] = StackUtils.readItemStack(buf);
}
}
@@ -50,29 +39,18 @@ public class GridTransferMessage {
}
public static void encode(GridTransferMessage message, FriendlyByteBuf buf) {
buf.writeInt(message.slots.size());
for (Slot slot : message.slots) {
IGuiIngredient<ItemStack> ingredient = message.inputs.get(slot.getSlotIndex() + (message.isCraftingRecipe ? 1 : 0));
buf.writeInt(message.inputs.size());
for (List<ItemStack> stacks : message.inputs) {
buf.writeInt(stacks.size());
List<ItemStack> ingredients = new ArrayList<>();
if (ingredient != null) {
for (ItemStack possibleStack : ingredient.getAllIngredients()) {
if (possibleStack != null) {
ingredients.add(possibleStack);
}
}
}
buf.writeInt(ingredients.size());
for (ItemStack possibleStack : ingredients) {
for (ItemStack possibleStack : stacks) {
StackUtils.writeItemStack(buf, possibleStack);
}
}
}
public static void handle(GridTransferMessage message, Supplier<NetworkEvent.Context> ctx) {
Player player = ctx.get().getSender();