Jump to content

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


Recommended Posts

Posted (edited)

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
Posted (edited)

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
Posted
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.

Posted (edited)
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
Posted
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.

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • hello, I've been trying to resolve this problem on curseforge for a while because I can't find a solution, can someone help me? I put the logs of the problem above:       [23Jan2025 06:58:39.109] [main/INFO][cpw.mods.modlauncher.Launcher/MODLAUNCHER]: ModLauncher running: args [--username, cochon93, --version, forge-47.3.10, --gameDir, C:\Users\claey\curseforge\minecraft\Instances\create, --assetsDir, C:\Users\claey\curseforge\minecraft\Install\assets, --assetIndex, 5, --uuid, fd8a812c9e7a4ecbb8c750f0b8ffddf4, --accessToken, ????????, --clientId, OWM0NDE0ZmMtOWJiMS00OTBhLWIxYWYtMmI0ODM4Y2FkYTFl, --xuid, 2535422576924500, --userType, msa, --versionType, release, --width, 1024, --height, 768, --quickPlayPath, C:\Users\claey\curseforge\minecraft\Install\quickPlay\java\1737611916744.json, --launchTarget, forgeclient, --fml.forgeVersion, 47.3.10, --fml.mcVersion, 1.20.1, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20230612.114412] [23Jan2025 06:58:39.124] [main/INFO][cpw.mods.modlauncher.Launcher/MODLAUNCHER]: ModLauncher 10.0.9+10.0.9+main.dcd20f30 starting: java version 17.0.13 by Eclipse Adoptium; OS Windows 11 arch amd64 version 10.0 [23Jan2025 06:58:42.749] [main/INFO][net.minecraftforge.fml.loading.ImmediateWindowHandler/]: Loading ImmediateWindowProvider fmlearlywindow [23Jan2025 06:58:42.835] [main/INFO][EARLYDISPLAY/]: Trying GL version 4.6 [23Jan2025 06:58:43.030] [main/INFO][EARLYDISPLAY/]: Requested GL version 4.6 got version 4.6 [23Jan2025 06:58:43.145] [main/INFO][mixin/]: SpongePowered MIXIN Subsystem Version=0.8.5 Source=union:/C:/Users/claey/curseforge/minecraft/Install/libraries/org/spongepowered/mixin/0.8.5/mixin-0.8.5.jar%23100!/ Service=ModLauncher Env=CLIENT [23Jan2025 06:58:43.195] [pool-2-thread-1/INFO][EARLYDISPLAY/]: GL info: NVIDIA GeForce RTX 4060 Laptop GPU/PCIe/SSE2 GL version 4.6.0 NVIDIA 561.03, NVIDIA Corporation [23Jan2025 06:58:44.664] [main/WARN][net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file C:\Users\claey\curseforge\minecraft\Install\libraries\net\minecraftforge\fmlcore\1.20.1-47.3.10\fmlcore-1.20.1-47.3.10.jar is missing mods.toml file [23Jan2025 06:58:44.668] [main/WARN][net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file C:\Users\claey\curseforge\minecraft\Install\libraries\net\minecraftforge\javafmllanguage\1.20.1-47.3.10\javafmllanguage-1.20.1-47.3.10.jar is missing mods.toml file [23Jan2025 06:58:44.670] [main/WARN][net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file C:\Users\claey\curseforge\minecraft\Install\libraries\net\minecraftforge\lowcodelanguage\1.20.1-47.3.10\lowcodelanguage-1.20.1-47.3.10.jar is missing mods.toml file [23Jan2025 06:58:44.674] [main/WARN][net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file C:\Users\claey\curseforge\minecraft\Install\libraries\net\minecraftforge\mclanguage\1.20.1-47.3.10\mclanguage-1.20.1-47.3.10.jar is missing mods.toml file [23Jan2025 06:58:45.326] [main/WARN][net.minecraftforge.jarjar.selection.JarSelector/]: Attempted to select two dependency jars from JarJar which have the same identification: Mod File: and Mod File: . Using Mod File: [23Jan2025 06:58:45.329] [main/WARN][net.minecraftforge.jarjar.selection.JarSelector/]: Attempted to select a dependency jar for JarJar which was passed in as source: cloth_config. Using Mod File: C:\Users\claey\curseforge\minecraft\Instances\create\mods\cloth-config-11.1.136-forge.jar [23Jan2025 06:58:45.329] [main/INFO][net.minecraftforge.fml.loading.moddiscovery.JarInJarDependencyLocator/]: Found 48 dependencies adding them to mods collection     thank you very much for your help
    • After adding all my mods and everything loading up fine, I go to create a singleplayer world and it load to 100 then crashes saying: The game crashed: exception in server tick loop Error: java.lang.NoClassDefFoundError: net/luckperms/api/LuckPermsProvider Crash Report: https://pastebin.com/nmTTFBB4
    • i have just made a modpack and i accidentally added a few fabric mods and after deleting them i can no longer launch the pack if any one could help these are my latest logs [22:42:24] [main/INFO]:additionalClassesLocator: [optifine., net.optifine.] [22:42:25] [main/INFO]:Compatibility level set to JAVA_17 [22:42:25] [main/ERROR]:Mixin config epicsamurai.mixins.json does not specify "minVersion" property [22:42:25] [main/INFO]:Launching target 'forgeclient' with arguments [--version, forge-43.4.0, --gameDir, C:\Users\Mytht\curseforge\minecraft\Instances\overseer (1), --assetsDir, C:\Users\Mytht\curseforge\minecraft\Install\assets, --uuid, 4c176bf14d4041cba29572aa4333ca1d, --username, mythtitan0, --assetIndex, 1.19, --accessToken, ????????, --clientId, MGJiMTEzNGEtMjc3Mi00ODE0LThlY2QtNzFiODMyODEyYjM4, --xuid, 2535469006485684, --userType, msa, --versionType, release, --width, 854, --height, 480] [22:42:25] [main/WARN]:Reference map 'insanelib.refmap.json' for insanelib.mixins.json could not be read. If this is a development environment you can ignore this message [22:42:25] [main/WARN]:Reference map 'corpsecurioscompat.refmap.json' for gravestonecurioscompat.mixins.json could not be read. If this is a development environment you can ignore this message [22:42:25] [main/WARN]:Reference map 'nitrogen_internals.refmap.json' for nitrogen_internals.mixins.json could not be read. If this is a development environment you can ignore this message [22:42:25] [main/WARN]:Reference map 'arclight.mixins.refmap.json' for epicsamurai.mixins.json could not be read. If this is a development environment you can ignore this message [22:42:25] [main/WARN]:Reference map 'simplyswords-common-refmap.json' for simplyswords-common.mixins.json could not be read. If this is a development environment you can ignore this message [22:42:25] [main/WARN]:Reference map 'simplyswords-forge-refmap.json' for simplyswords.mixins.json could not be read. If this is a development environment you can ignore this message [22:42:25] [main/WARN]:Reference map '${refmap_target}refmap.json' for corgilib.forge.mixins.json could not be read. If this is a development environment you can ignore this message [22:42:25] [main/WARN]:Reference map 'MysticPotions-forge-refmap.json' for mysticpotions.mixins.json could not be read. If this is a development environment you can ignore this message [22:42:26] [main/WARN]:Reference map 'packetfixer-forge-forge-refmap.json' for packetfixer-forge.mixins.json could not be read. If this is a development environment you can ignore this message [22:42:26] [main/WARN]:Error loading class: atomicstryker/multimine/client/MultiMineClient (java.lang.ClassNotFoundException: atomicstryker.multimine.client.MultiMineClient) [22:42:26] [main/WARN]:@Mixin target atomicstryker.multimine.client.MultiMineClient was not found treechop.forge.compat.mixins.json:MultiMineMixin [22:42:26] [main/WARN]:Error loading class: com/simibubi/create/content/contraptions/components/fan/AirCurrent (java.lang.ClassNotFoundException: com.simibubi.create.content.contraptions.components.fan.AirCurrent) [22:42:26] [main/WARN]:Error loading class: shadows/apotheosis/ench/table/ApothEnchantContainer (java.lang.ClassNotFoundException: shadows.apotheosis.ench.table.ApothEnchantContainer) [22:42:26] [main/WARN]:@Mixin target shadows.apotheosis.ench.table.ApothEnchantContainer was not found origins_classes.mixins.json:common.apotheosis.ApotheosisEnchantmentMenuMixin [22:42:26] [main/WARN]:Error loading class: se/mickelus/tetra/blocks/workbench/WorkbenchTile (java.lang.ClassNotFoundException: se.mickelus.tetra.blocks.workbench.WorkbenchTile) [22:42:26] [main/WARN]:@Mixin target se.mickelus.tetra.blocks.workbench.WorkbenchTile was not found origins_classes.mixins.json:common.tetra.WorkbenchTileMixin [22:42:27] [main/WARN]:Error loading class: tfar/davespotioneering/blockentity/AdvancedBrewingStandBlockEntity (java.lang.ClassNotFoundException: tfar.davespotioneering.blockentity.AdvancedBrewingStandBlockEntity) [22:42:27] [main/WARN]:@Mixin target tfar.davespotioneering.blockentity.AdvancedBrewingStandBlockEntity was not found itemproductionlib.mixins.json:davespotioneering/AdvancedBrewingStandBlockEntityMixin [22:42:27] [main/WARN]:Error loading class: fuzs/visualworkbench/world/inventory/ModCraftingMenu (java.lang.ClassNotFoundException: fuzs.visualworkbench.world.inventory.ModCraftingMenu) [22:42:27] [main/WARN]:@Mixin target fuzs.visualworkbench.world.inventory.ModCraftingMenu was not found itemproductionlib.mixins.json:visualworkbench/ModCraftingMenuMixin [22:42:27] [main/WARN]:Error loading class: fuzs/easymagic/world/inventory/ModEnchantmentMenu (java.lang.ClassNotFoundException: fuzs.easymagic.world.inventory.ModEnchantmentMenu) [22:42:27] [main/WARN]:@Mixin target fuzs.easymagic.world.inventory.ModEnchantmentMenu was not found skilltree.mixins.json:easymagic/ModEnchantmentMenuMixin [22:42:27] [main/WARN]:Error loading class: shadows/apotheosis/ench/table/ApothEnchantmentMenu (java.lang.ClassNotFoundException: shadows.apotheosis.ench.table.ApothEnchantmentMenu) [22:42:27] [main/WARN]:@Mixin target shadows.apotheosis.ench.table.ApothEnchantmentMenu was not found skilltree.mixins.json:apotheosis/ApothEnchantContainerMixin [22:42:27] [main/WARN]:Error loading class: shadows/apotheosis/adventure/affix/socket/SocketingRecipe (java.lang.ClassNotFoundException: shadows.apotheosis.adventure.affix.socket.SocketingRecipe) [22:42:27] [main/WARN]:@Mixin target shadows.apotheosis.adventure.affix.socket.SocketingRecipe was not found skilltree.mixins.json:apotheosis/SocketingRecipeMixin [22:42:27] [main/WARN]:Error loading class: shadows/apotheosis/adventure/affix/socket/gem/bonus/AttributeBonus (java.lang.ClassNotFoundException: shadows.apotheosis.adventure.affix.socket.gem.bonus.AttributeBonus) [22:42:27] [main/WARN]:@Mixin target shadows.apotheosis.adventure.affix.socket.gem.bonus.AttributeBonus was not found skilltree.mixins.json:apotheosis/AttributeBonusMixin [22:42:27] [main/WARN]:Error loading class: shadows/apotheosis/adventure/affix/socket/gem/bonus/EnchantmentBonus (java.lang.ClassNotFoundException: shadows.apotheosis.adventure.affix.socket.gem.bonus.EnchantmentBonus) [22:42:27] [main/WARN]:@Mixin target shadows.apotheosis.adventure.affix.socket.gem.bonus.EnchantmentBonus was not found skilltree.mixins.json:apotheosis/EnchantmentBonusMixin [22:42:27] [main/WARN]:Error loading class: shadows/apotheosis/adventure/client/AdventureModuleClient (java.lang.ClassNotFoundException: shadows.apotheosis.adventure.client.AdventureModuleClient) [22:42:27] [main/WARN]:@Mixin target shadows.apotheosis.adventure.client.AdventureModuleClient was not found skilltree.mixins.json:apotheosis/AdventureModuleClientMixin [22:42:27] [main/WARN]:Error loading class: me/shedaniel/rei/RoughlyEnoughItemsCoreClient (java.lang.ClassNotFoundException: me.shedaniel.rei.RoughlyEnoughItemsCoreClient) [22:42:27] [main/WARN]:Error loading class: com/replaymod/replay/ReplayHandler (java.lang.ClassNotFoundException: com.replaymod.replay.ReplayHandler) [22:42:27] [main/WARN]:Error loading class: net/coderbot/iris/pipeline/newshader/ExtendedShader (java.lang.ClassNotFoundException: net.coderbot.iris.pipeline.newshader.ExtendedShader) [22:42:27] [main/WARN]:Error loading class: net/irisshaders/iris/pipeline/programs/ExtendedShader (java.lang.ClassNotFoundException: net.irisshaders.iris.pipeline.programs.ExtendedShader) [22:42:27] [main/INFO]:Initializing MixinExtras via com.llamalad7.mixinextras.service.MixinExtrasServiceImpl(version=0.3.6).
    • My Mohist server crashed as well but all it says in logs is " C:\Minecraft Mohist server>java -Xm6G -jar mohist.jar nogul  Error: Unable to access jarfile mohist.jar   C:\Minecraft Mohist server>PAUSE press any key to continue  .  .  . " Any ideas? i have the server file that its looking for where its looking for it.
  • Topics

×
×
  • Create New...

Important Information

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