Posted September 20, 20196 yr Basically, I make a Machine kinda like Furnace, with a Fuel System and Process System. It contains 2 Input Slot, 1 Fuel Slot, and 1 Output Slot. I want to make it like vanilla Furnace: Removing Input will stop the Process, but the Fuel will keep burning. But when I pick up the first Input, the Fuel stops burning as well. However, this won't happen if I pick up the second Input. Does anyone know how to fix this? I don't know which part of code is wrong, so I will put them if someone ask for them. Video Edited September 20, 20196 yr by Haoming Solved
September 20, 20196 yr Author TileEntity Spoiler public class TileEntityStationBasic extends TileEntity implements IInventory, ITickable { private NonNullList<ItemStack> inventory = NonNullList.<ItemStack>withSize(4, ItemStack.EMPTY); private String customName; private int currentProcessTime = 0; private int runTime = 0; private final int PROCESS_TIME = Reference.BASE_PROCESS_TIME; private EntityPlayerMP player; @Override public String getName() { return this.hasCustomName() ? this.customName : "container.station_basic"; } @Override public boolean hasCustomName() { return this.customName != null && !this.customName.isEmpty(); } public void setCustomName(String customName) { this.customName = customName; } @Override public ITextComponent getDisplayName() { return this.hasCustomName() ? new TextComponentString(this.getName()) : new TextComponentTranslation(this.getName()); } @Override public int getSizeInventory() { return this.inventory.size(); } @Override public ItemStack getStackInSlot(int index) { return (ItemStack) this.inventory.get(index); } @Override public ItemStack decrStackSize(int index, int count) { return ItemStackHelper.getAndSplit(this.inventory, index, count); } @Override public ItemStack removeStackFromSlot(int index) { return ItemStackHelper.getAndRemove(this.inventory, index); } @Override public void setInventorySlotContents(int index, ItemStack stack) { ItemStack itemstack = (ItemStack) this.inventory.get(index); boolean flag = !stack.isEmpty() && stack.isItemEqual(itemstack) && ItemStack.areItemStackTagsEqual(stack, itemstack); this.inventory.set(index, stack); if (stack.getCount() > this.getInventoryStackLimit()) stack.setCount(this.getInventoryStackLimit()); if (index == 0 && !flag) { ItemStack stack_t = (ItemStack) this.inventory.get(index + 1); this.runTime = 0; this.markDirty(); } } @Override public NBTTagCompound writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); compound.setInteger("CurrentProcessTime", (short) this.currentProcessTime); compound.setInteger("RunTime", (short) this.runTime); ItemStackHelper.saveAllItems(compound, this.inventory); if (this.hasCustomName()) compound.setString("CustomName", this.customName); return compound; } @Override public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); this.inventory = NonNullList.<ItemStack>withSize(this.getSizeInventory(), ItemStack.EMPTY); ItemStackHelper.loadAllItems(compound, this.inventory); this.currentProcessTime = compound.getInteger("CurrentProcessTime"); this.runTime = compound.getInteger("RunTime"); if (compound.hasKey("CustomName", 8)) this.setCustomName(compound.getString("CustomName")); } @Override public int getInventoryStackLimit() { return 64; } @Override public void update() { UpdateFuel(); UpdateProcess(); Stations.setState(world, pos); } private void UpdateProcess() { if (this.isValid()) { if (this.runTime > 0) this.currentProcessTime++; } else currentProcessTime = 0; if (this.currentProcessTime >= PROCESS_TIME) processDone(); } private void UpdateFuel() { ItemStack fuel = this.inventory.get(2); if (this.runTime > 0) this.runTime--; else if (!fuel.isEmpty() && this.isValid()) { this.runTime = Reference.BASE_PROCESS_TIME; fuel.shrink(1); } } public void processDone() { this.currentProcessTime = 0; ItemStack[] inputs = new ItemStack[] { this.inventory.get(0), this.inventory.get(1) }; if (inputs[0].isEmpty() || inputs[1].isEmpty()) return; ItemStack result = getResult(inputs[0], inputs[1]); int cost = StationBasicRecipes.getInstance().getIngredientFromResult(result).getCount(); inputs[1].shrink(cost); inputs[0].setItemDamage(inputs[0].getItemDamage() + 1); if (inputs[0].getItemDamage() >= inputs[0].getMaxDamage()) inputs[0].shrink(1); ItemStack output = this.inventory.get(3); if (output.isEmpty()) this.inventory.set(3, result.copy()); else output.grow(result.getCount()); } private ItemStack getResult(ItemStack input1, ItemStack input2) { return StationBasicRecipes.getInstance().getProcessResult(input1, input2); } private boolean isValid() { ItemStack[] inputs = new ItemStack[] { this.inventory.get(0), this.inventory.get(1) }; if (inputs[0].isEmpty() || inputs[1].isEmpty()) return false; else { ItemStack result = getResult(inputs[0], inputs[1]); int cost = StationBasicRecipes.getInstance().getIngredientFromResult(result).getCount(); if (result == null || result.isEmpty()) return false; else if (inputs[1].getCount() < cost) return false; else { ItemStack output = this.inventory.get(3); if (output.isEmpty()) return true; if (!output.isItemEqual(result)) return false; int count = output.getCount() + result.getCount(); return count <= output.getMaxStackSize(); } } } public boolean isEmpty() { for (ItemStack itemstack : this.inventory) { if (!itemstack.isEmpty()) return false; } return true; } public boolean isUsableByPlayer(EntityPlayer player) { return true; } public int getField(int id) { switch (id) { case 1: return this.currentProcessTime; case 2: return this.runTime; default: return 0; } } public void setField(int id, int value) { switch (id) { case 1: this.currentProcessTime = value; break; case 2: this.runTime = value; break; } } @Override public int getFieldCount() { return 4; } @Override public void clear() { this.inventory.clear(); } @Override public void openInventory(EntityPlayer player) { return; } @Override public void closeInventory(EntityPlayer player) { return; } @Override public boolean isItemValidForSlot(int index, ItemStack stack) { return false; } } Edited September 20, 20196 yr by Haoming Found the issue
September 20, 20196 yr Author Apparently I code the setInventorySlotContents part wrong. Now I fixed it...
September 20, 20196 yr 14 minutes ago, Haoming said: implements IInventory Don't use this create an IItemHandler instance in your TileEntity and return it in the getCapability(Capability, EnumFacing) method, VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
September 20, 20196 yr Author 1 minute ago, Animefan8888 said: Don't use this create an IItemHandler instance in your TileEntity and return it in the getCapability(Capability, EnumFacing) method, Uhh... Can you elaborate? Is there an example? Cause I got those codes from an online tutorial... Edited September 20, 20196 yr by Haoming
September 20, 20196 yr Just now, Haoming said: Cause I got those codes from an online tutorial... The tutorial must have been severely outdated. It should look something like this. Then use the IItemHandler instance(items) to insert and extract items from specific slots. private IItemHandler items = new ItemStackHandler(numberOfSlots); public boolean hasCapability(Capability<?> cap, EnumFacing facing) { return cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY ? true : super.hasCapability(cap, facing); } public <T> T getCapability(Capability<T> cap, EnumFacing facing) { if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(items); return super.getCapability(cap, facing); } VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.