I've been recently working on a custom crafting table that uses energy, and is a tile entity. I'm trying to add custom recipes, but i'm not sure how. I'm stuck on how to detect if there are the correct items in the correct slots. I was also following along with MCJTY's modding tutorial for 1.12.2. Link to the video:
Here are my classes:
Tile Entity class:
public class TileTestCraftingBench extends TileEntity implements ITickable {
private static final int INPUT_SLOTS = 9;
private static final int OUTPUT_SLOTS = 1;
static final int SIZE = INPUT_SLOTS + OUTPUT_SLOTS;
public static final int MAX_PROGRESS = ConfigHandler.MAX_CUTTER_PROGRESS;
private int progress = 0;
@Override
public void update() {
if (!world.isRemote) {
}
}
public int getProgress() {
return progress;
}
public void setProgress(int progress) {
this.progress = progress;
}
private ItemStackHandler inputHandler = new ItemStackHandler(INPUT_SLOTS) {
@Override
protected void onContentsChanged(int slot) {
// We need to tell the tile entity that something has changed so
// that the chest contents is persisted
TileBlackHoleCompactor.this.markDirty();
}
};
private ItemStackHandler outputHandler = new ItemStackHandler(OUTPUT_SLOTS) {
@Override
protected void onContentsChanged(int slot) {
// We need to tell the tile entity that something has changed so
// that the chest contents is persisted
TileBlackHoleCompactor.this.markDirty();
}
};
private CombinedInvWrapper combinedHandler = new CombinedInvWrapper(inputHandler, outputHandler);
@Override
public void readFromNBT(NBTTagCompound compound) {
super.readFromNBT(compound);
if (compound.hasKey("itemsIn")) {
inputHandler.deserializeNBT((NBTTagCompound) compound.getTag("itemsIn"));
}
if (compound.hasKey("itemsOut")) {
outputHandler.deserializeNBT((NBTTagCompound) compound.getTag("itemsOut"));
}
progress = compound.getInteger("progress");
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound compound) {
super.writeToNBT(compound);
compound.setTag("itemsIn", inputHandler.serializeNBT());
compound.setTag("itemsOut", outputHandler.serializeNBT());
compound.setInteger("progress", progress);
return compound;
}
public boolean canInteractWith(EntityPlayer playerIn) {
// If we are too far away from this tile entity you cannot use it
return !isInvalid() && playerIn.getDistanceSq(pos.add(0.5D, 0.5D, 0.5D)) <= 64D;
}
@Override
public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
return true;
}
return super.hasCapability(capability, facing);
}
@Override
public <T> T getCapability(Capability<T> capability, EnumFacing facing) {
if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
if (facing == null) {
return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(combinedHandler);
} else if (facing == EnumFacing.UP) {
return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(inputHandler);
} else {
return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(outputHandler);
}
}
return super.getCapability(capability, facing);
}
}
Container Class:
public class ContainerTestBench extends Container {
private TileTestCraftingBench te;
public ContainerTestBench(IInventory playerInventory, TileTestCraftingBench te) {
this.te = te;
addOwnSlots();
addPlayerSlots(playerInventory);
}
private void addPlayerSlots(IInventory playerInventory) {
// Slots for the main inventory
for (int row = 0; row < 3; ++row) {
for (int col = 0; col < 9; ++col) {
int x = 10 + col * 18;
int y = row * 18 + 70;
this.addSlotToContainer(new Slot(playerInventory, col + row * 9 + 10, x, y));
}
}
// Slots for the hotbar
for (int row = 0; row < 9; ++row) {
int x = 10 + row * 18;
int y = 58 + 70;
this.addSlotToContainer(new Slot(playerInventory, row, x, y));
}
}
private void addOwnSlots() {
IItemHandler itemHandler = this.te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null);
int x = 64;
int y = 9;
int slotIndex = 0;
addSlotToContainer(new SlotItemHandler(itemHandler, slotIndex++, x, y)); x +=18;
addSlotToContainer(new SlotItemHandler(itemHandler, slotIndex++, x, y)); x +=18;
addSlotToContainer(new SlotItemHandler(itemHandler, slotIndex++, x, y));
x = 64;
y = 27;
addSlotToContainer(new SlotItemHandler(itemHandler, slotIndex++, x, y)); x +=18;
addSlotToContainer(new SlotItemHandler(itemHandler, slotIndex++, x, y)); x +=18;
addSlotToContainer(new SlotItemHandler(itemHandler, slotIndex++, x, y));
x = 64;
y = 45;
addSlotToContainer(new SlotItemHandler(itemHandler, slotIndex++, x, y)); x +=18;
addSlotToContainer(new SlotItemHandler(itemHandler, slotIndex++, x, y)); x +=18;
addSlotToContainer(new SlotItemHandler(itemHandler, slotIndex++, x, y));
x = 136;
y = 27;
addSlotToContainer(new SlotItemHandler(itemHandler, slotIndex++, x, y));
}
@Override
public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) {
ItemStack itemstack = ItemStack.EMPTY;
Slot slot = this.inventorySlots.get(index);
if (slot != null && slot.getHasStack()) {
ItemStack itemstack1 = slot.getStack();
itemstack = itemstack1.copy();
if (index < TileTestCraftingBench.SIZE) {
if (!this.mergeItemStack(itemstack1, TileTestCraftingBench.SIZE, this.inventorySlots.size(), true)) {
return ItemStack.EMPTY;
}
} else if (!this.mergeItemStack(itemstack1, 0, TileTestCraftingBench.SIZE, false)) {
return ItemStack.EMPTY;
}
if (itemstack1.isEmpty()) {
slot.putStack(ItemStack.EMPTY);
} else {
slot.onSlotChanged();
}
}
return itemstack;
}
@Override
public boolean canInteractWith(EntityPlayer playerIn) {
return te.canInteractWith(playerIn);
}
}
Any help would be greatly appreciated!