Jump to content

-Solved- [1.12.2] Removing Item from Slot resets the Tile Entity


Haoming

Recommended Posts

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 by Haoming
Solved
Link to comment
Share on other sites

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 by Haoming
Found the issue
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 by Haoming
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.