Don't craft suicide when locked and recipe buffer fixes #2379 #2332

This commit is contained in:
Justin Vitale 2021-04-22 22:03:27 +10:00 committed by modmuss50
parent 8703856c11
commit 15f5392a62

View file

@ -27,6 +27,7 @@ package techreborn.blockentity.machine.tier1;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.CraftingInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.recipe.CraftingRecipe;
@ -71,6 +72,7 @@ public class AutoCraftingTableBlockEntity extends PowerAcceptorBlockEntity
public RebornInventory<AutoCraftingTableBlockEntity> inventory = new RebornInventory<>(11, "AutoCraftingTableBlockEntity", 64, this);
private final int OUTPUT_SLOT = 9;
private final int EXTRA_OUTPUT_SLOT = 10;
public int progress;
public int maxProgress = 120;
public int euTick = 10;
@ -79,7 +81,13 @@ public class AutoCraftingTableBlockEntity extends PowerAcceptorBlockEntity
CraftingInventory inventoryCrafting = null;
CraftingRecipe lastRecipe = null;
public boolean locked = true;
Item[] layoutInv = {
null, null, null,
null, null, null,
null, null, null,
};
public boolean locked = false;
public AutoCraftingTableBlockEntity(BlockPos pos, BlockState state) {
super(TRBlockEntities.AUTO_CRAFTING_TABLE, pos, state);
@ -93,6 +101,11 @@ public class AutoCraftingTableBlockEntity extends PowerAcceptorBlockEntity
if (lastRecipe != null && lastRecipe.matches(crafting, world)) return lastRecipe;
Item[] currentInvLayout = getCraftingLayout(crafting);
if(Arrays.equals(layoutInv, currentInvLayout)) return null;
layoutInv = currentInvLayout;
Optional<CraftingRecipe> testRecipe = world.getRecipeManager().getFirstMatch(RecipeType.CRAFTING, crafting, world);
if (testRecipe.isPresent()) {
lastRecipe = testRecipe.get();
@ -102,6 +115,20 @@ public class AutoCraftingTableBlockEntity extends PowerAcceptorBlockEntity
return null;
}
private Item[] getCraftingLayout(CraftingInventory craftingInventory){
Item[] layout = {
null, null, null,
null, null, null,
null, null, null,
};
for (int i = 0; i < 9; i++) {
layout[i] = craftingInventory.getStack(i).getItem();
}
return layout;
}
private CraftingInventory getCraftingInventory() {
if (inventoryCrafting == null) {
inventoryCrafting = new CraftingInventory(new ScreenHandler(null, -1) {
@ -125,11 +152,20 @@ public class AutoCraftingTableBlockEntity extends PowerAcceptorBlockEntity
CraftingInventory crafting = getCraftingInventory();
if (crafting.isEmpty()) return false;
// Don't allow recipe to change (Keep at least one of each slot stocked, assuming it's actually a recipe)
if(locked){
for(int i = 0; i < 9; i++){
if(crafting.getStack(i).getCount() == 1){
return false;
}
}
}
if (!recipe.matches(crafting, world)) return false;
if (!hasOutputSpace(recipe.getOutput(), OUTPUT_SLOT)) return false;
DefaultedList<ItemStack> remainingStacks = world.getRecipeManager().getRemainingStacks(RecipeType.CRAFTING, crafting, world);
DefaultedList<ItemStack> remainingStacks = recipe.getRemainingStacks(crafting);
for (ItemStack stack : remainingStacks){
if (!stack.isEmpty() && !hasRoomForExtraItem(stack)) return false;
}