Jump to content

Custom Furnace Spitting Out Items On Block Update


chrisps89

Recommended Posts

I have a custom furnace type block I am working on and I am most of the way there, the problem I have at the moment is focused around the two input slots, When the furnace is inactive and focusing on the inactive block, placing several fuel then placing several ore forces the fuel to be spat out except for 1 of the fuel item. And placing the ore then the fuel forces the ore to be spat out except one item. I guess technically it is two since it sucks 1 of each into the machine for processing too.

 

I used breakpoints to find out when it does this and it is during my updatePyrolysisChamber method in my PyrolysisChamber class, it seems when it picks the new block when the furnace becomes active that it does it, but I cannot track down what part of the code is spitting it out. It spits it quite a bit further than when the block is broken and the items drop out too.

 

This is my PyrolysisChamber Class, and I will post a link to my github with all the files below too, any help is greatly appreciated thanks.

 

https://github.com/chrisps89/chrisps

 

 

 

package com.chrisps.testing.ModBlocks;

 

import java.util.ArrayList;

import java.util.Collection;

import java.util.List;

import java.util.Random;

 

import com.chrisps.testing.testingBaseClass;

import com.chrisps.testing.lib.Constants;

import com.chrisps.testing.tileEntities.TileEntityPyrolysisChamber;

 

import cpw.mods.fml.common.registry.GameRegistry;

import cpw.mods.fml.relauncher.Side;

import cpw.mods.fml.relauncher.SideOnly;

import net.minecraft.block.Block;

import net.minecraft.block.ITileEntityProvider;

import net.minecraft.block.material.Material;

import net.minecraft.client.renderer.texture.IIconRegister;

import net.minecraft.creativetab.CreativeTabs;

import net.minecraft.entity.EntityLivingBase;

import net.minecraft.entity.item.EntityItem;

import net.minecraft.entity.player.EntityPlayer;

import net.minecraft.init.Blocks;

import net.minecraft.item.Item;

import net.minecraft.item.ItemStack;

import net.minecraft.nbt.NBTTagCompound;

import net.minecraft.tileentity.TileEntity;

import net.minecraft.tileentity.TileEntityFurnace;

import net.minecraft.util.IIcon;

import net.minecraft.util.MathHelper;

import net.minecraft.util.ResourceLocation;

import net.minecraft.world.World;

 

public class PyrolysisChamber extends Block implements ITileEntityProvider{

 

public static String name = "pyrolysisChamber";

public static String nameActive = "pyrolysisChamberActive";

private String privateName = "pyrolysisChamber";

private String privateNameActive = "pyrolysisChamberActive";

 

public IIcon Bottom;

public IIcon Top;

public IIcon Front;

public IIcon Back;

public IIcon Left;

public IIcon Right;

 

private final Random random = new Random();

 

private static boolean litCheck;

 

public boolean isActive;

 

protected PyrolysisChamber(boolean active) {

super(Material.rock);

if(!active) {

setBlockName(Constants.MODID + "_" + name);

setCreativeTab(CreativeTabs.tabBlock);

GameRegistry.registerBlock(this, privateName);

setHardness(3.0F);

isActive = active;

} else if (active) {

 

setBlockName(Constants.MODID + "_" + nameActive);

GameRegistry.registerBlock(this, privateNameActive);

setHardness(3.0F);

isActive = active;

}

 

}

 

public enum GUIs {

    PYROLYSISCHAMBER

}

 

@Override

public TileEntity createNewTileEntity(World world, int meta){

return new TileEntityPyrolysisChamber();

}

 

@Override

public boolean hasTileEntity(int metadata){

return true;

}

 

@Override

public void onBlockPlacedBy(World world, int x, int y, int z,

EntityLivingBase entLivBase, ItemStack itemStack) {

int facing = MathHelper

.floor_double(entLivBase.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;

 

if (facing == 0) {

world.setBlockMetadataWithNotify(x, y, z, 2, 2); // South - Front is

// Front.

}

 

if (facing == 1) {

world.setBlockMetadataWithNotify(x, y, z, 5, 2); // West - Front is

// Left.

}

 

if (facing == 2) {

world.setBlockMetadataWithNotify(x, y, z, 3, 2); // North - Back is

// Front.

}

 

if (facing == 3) {

world.setBlockMetadataWithNotify(x, y, z, 4, 2); // East - Front is

// Right

}

 

}

 

 

public void registerBlockIcons(IIconRegister icon) {

Bottom = icon.registerIcon(Constants.MODID + ":" + "pyrolysisChamber0");

Top = icon.registerIcon(Constants.MODID + ":" + "pyrolysisChamber1");

if (!isActive) {

Front = icon.registerIcon(Constants.MODID + ":" + "pyrolysisChamber2");

} else if (isActive) {

Front = icon.registerIcon(Constants.MODID + ":" + "pyrolysisChamber2active");

}

Back = icon.registerIcon(Constants.MODID + ":" + "pyrolysisChamber3");

Left = icon.registerIcon(Constants.MODID + ":" + "pyrolysisChamber4");

Right = icon.registerIcon(Constants.MODID + ":" + "pyrolysisChamber5");

}

 

    public static void updatePyrolysisChamber(boolean active, World world, int x, int y, int z) {

   

        int l = world.getBlockMetadata(x, y, z);

       

        TileEntityPyrolysisChamber tileentity = (TileEntityPyrolysisChamber) world.getTileEntity(x, y, z);

       

      //litCheck = true;

 

        if (active) {

       

            world.setBlock(x, y, z, ModBlocks.pyrolysisChamberActive);

            System.out.println("Block Activated");

           

        } else {

       

            world.setBlock(x, y, z, ModBlocks.pyrolysisChamber);

            System.out.println("Block Deactivated");

        }

 

        //litCheck = false;

       

        world.setBlockMetadataWithNotify(x, y, z, l, 2);

 

        if (tileentity != null) {

       

            tileentity.validate();

            world.setTileEntity(x, y, z, tileentity);

        }

    }

 

@Override

public IIcon getIcon(int side, int meta) {

 

switch (meta) {

case 2:

if (side == 2) {

return Front;

} else if (side == 3) {

return Back;

} else if (side == 4) {

return Right;

} else if (side == 5) {

return Left;

}

case 5:

if (side == 2) {

return Right;

} else if (side == 3) {

return Left;

} else if (side == 4) {

return Back;

} else if (side == 5) {

return Front;

}

case 3:

if (side == 2) {

return Back;

} else if (side == 3) {

return Front;

} else if (side == 4) {

return Left;

} else if (side == 5) {

return Right;

}

case 4:

if (side == 2) {

return Left;

} else if (side == 3) {

return Right;

} else if (side == 4) {

return Front;

} else if (side == 5) {

return Back;

}

case 0:

if (side == 0) {

return Bottom;

} else if (side == 1) {

return Top;

} else if (side == 2) {

return Back;

} else if (side == 3) {

return Front;

} else if (side == 4) {

return Left;

} else if (side == 5) {

return Right;

}

}

return null;

}

 

@Override

public int damageDropped(int meta){

return meta;

}

 

 

    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int meta, float hitX, float hitY, float hitZ) {

            if (world.getTileEntity(x, y, z) != null){

                player.openGui(testingBaseClass.instance, GUIs.PYROLYSISCHAMBER.ordinal(), world, x, y, z);

            return true;

        }

        return true;

    }

   

    public void breakBlock(World world, int x, int y, int z, Block block, int var6) {

   

    if(!isActive) {

    TileEntityPyrolysisChamber tileEntityPyrolysisChamber = (TileEntityPyrolysisChamber)world.getTileEntity(x, y, z);

   

        if (tileEntityPyrolysisChamber != null) {

            for (int i = 0; i < tileEntityPyrolysisChamber.getSizeInventory(); ++i)

            {

                ItemStack itemstack = tileEntityPyrolysisChamber.getStackInSlot(i);

 

                if (itemstack != null)

                {

                    float f = this.random.nextFloat() * 0.4F + 0.1F;

                    float f1 = this.random.nextFloat() * 0.4F + 0.1F;

                    float f2 = this.random.nextFloat() * 0.4F + 0.1F;

 

                    while (itemstack.stackSize > 0) {

                        int j1 = this.random.nextInt(21) + 10;

 

                        if (j1 > itemstack.stackSize)

                        {

                            j1 = itemstack.stackSize;

                        }

 

                        itemstack.stackSize -= j1;

                       

                        EntityItem entityitem = new EntityItem(world, (double)((float)x + f), (double)((float)y + f1), (double)((float)z + f2), new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage()));

 

                        if (itemstack.hasTagCompound())

                        {

                            entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy());

                        }

 

                        float f3 = 0.05F;

                       

                        entityitem.motionX = (double)((float)this.random.nextGaussian() * f3);

                        entityitem.motionY = (double)((float)this.random.nextGaussian() * f3 + 0.2F);

                        entityitem.motionZ = (double)((float)this.random.nextGaussian() * f3);

                       

                        world.spawnEntityInWorld(entityitem);

                    }

                }

            }

        }

 

            world.func_147453_f(x, y, z, block);

            }

 

    super.breakBlock(world, x, y, z, this, var6);

}

   

    public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_)

    {

        return Item.getItemFromBlock(ModBlocks.pyrolysisChamber);

    }

   

    @SideOnly(Side.CLIENT)

    public Item getItem(World world, int x, int y, int z)

    {

        return Item.getItemFromBlock(ModBlocks.pyrolysisChamber);

    }

 

}

 

 

 

 

Link to comment
Share on other sites

In your TileEntity, override shouldRefresh and return true when the second block parameter does not match one of your PyrolysisChamber blocks (the active and inactive one).

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Link to comment
Share on other sites

Thanks for the response, and I tried what you said to the best of my knowledge but I am a little new to modding, coding I'm okay with but still learning some of the ins and outs with forge.

 

I tried it like this:

 

public boolean shouldRefresh(int oldID, int newID, int oldMeta, int newMeta, World world, int x, int y, int z) {

 

Block check = world.getBlock(x, y, z);

 

if(check != blockRefresh || check != blockRefresh2){

return true;

} else {

return false;

}

 

}

 

But I get the impression I likely did it wrong since it didn't make a difference. I created two variable in my tile entity and had them equal to my blocks in my ModBlocks Class then inside the shouldRefresh method you mentioned I got the block and tried comparing it to my blocks. But I think I either got confused or just misunderstood.

 

By second block parameter did you mean what the block was set to once it changed?

 

Sorry if I am asking some stupid questions here, still learning like I said.

 

Edit: It suddenly occurred to me after posting that I make no call to shouldRefresh anywhere. Also I couldn't override the method because I had to overide or implement a supertype method.

 

Edit2: I had my method paramaters messed up fixed that, might be able to get it to work, will update shortly

Link to comment
Share on other sites

1. No need for you to create new variables, just directly reference the fields from your ModBlocks class.

2. shouldRefresh has different parameters, that's why you can't override it. Use your IDE's auto-complete feature or look at the TileEntity class for the right implementation. Hint: The first and second parameters are Block type, not int.

3. You don't need to call it, that's why you should override it

4. By second block parameter I meant the second Block parameter from the (correct) shouldRefresh method.

5. You can shorten your check to one return statement w/o an if-else block.

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Link to comment
Share on other sites

Yeah made some silly mistakes formatting that originally.

 

I have it like this now, which I believe is okay.

 

    @Override

    public boolean shouldRefresh(Block oldBlock, Block newBlock, int oldMeta, int newMeta, World world, int x, int y, int z) {

   

return newBlock != ModBlocks.pyrolysisChamber || newBlock != ModBlocks.pyrolysisChamberActive;

 

}

 

However if that is correct, it sadly made no difference, items still get chucked out the same way.

Link to comment
Share on other sites

That statement is always true, because the block can't be both.

 

"If new block is NOT PCInactive OR new block is NOT PCActive"

 

If block is PCInactive => block is not PCActive => true

If block is PCActive => block is not PCInactive => true

If block is something else => block is neither PCActive nor PCInactive => true

 

You probably want a && in there.

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Link to comment
Share on other sites

Ah of course, another silly mistake that.

 

So hopefully 3rd times the charm?

 

    @Override

    public boolean shouldRefresh(Block oldBlock, Block newBlock, int oldMeta, int newMeta, World world, int x, int y, int z) {

   

return newBlock != ModBlocks.pyrolysisChamber && newBlock != ModBlocks.pyrolysisChamberActive;

}

 

so now its checking if it is not pc and not pca, and returning true, if it isn't equal to either of them, otherwise it's false. Which is what you mentioned I believe...hopefully.

 

However it has no effect, although it is equal to false, at least when the block updates as I tracked it with a print. Should there be a point where my block is neither of them ?

Link to comment
Share on other sites

It is true when you break the block (it changes to air), since that's not an instance of neither of your blocks.

 

Try removing this part:

if (tileentity != null) {
           
    tileentity.validate();
    world.setTileEntity(x, y, z, tileentity);
}

 

and see if that fixes it (you don't need it anyway)

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Link to comment
Share on other sites

Taking that part out causes the gui to close and spit the item i am placing in onto the floor. It only does that when placing the second part in either the fuel or the ore. Thanks for your time and help so far !

 

Hm, that should not happen...

I noticed you're registering your TileEntity in init. Try to do it in preInit after you've initialized your block.

 

Also try to set a breakpoint on the shouldRefresh return and see if it even gets called.

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Link to comment
Share on other sites

I tried moving the tile entity to the pre initialize and I put a print into the shouldRefresh to print the result of newBlock != ModBlocks.pyrolysisChamber && newBlock != ModBlocks.pyrolysisChamberActive, which does seem to be working as planned, for true and false.

 

I tried it commenting out the if (tileentity != null) { code like you said in your previous post but got the same thing with the gui just closing itself and all items falling on the floor. And I tried it with that code in but same original problem prevails sadly.

 

An extra thing I noticed is that if i say shift click 3 coal in and then shift click 3 ore in, it spits both out not just either, except for the 1 ore its processing and 1 coal remains in the fuel slot, however that coal cannot be shift clicked back to my inventory, although it can be dragged in. Not sure if this changes anything but thought I would mention it.

 

I have been looking at trying to save and refresh the inventory when the new block is created but no luck just yet.

 

Edit: I managed to figure out that the 1 coal that gets left in the machine is kind of a ghost item, I printed out the contents of the itemstack in that slot and it prints out 3xcoal etc. but after spitting out items it changes to 0xcoal, even though one shows inside the slot. Still working on it but thought I would update this.

Link to comment
Share on other sites

Taking that part out causes the gui to close and spit the item i am placing in onto the floor. It only does that when placing the second part in either the fuel or the ore. Thanks for your time and help so far !

 

Hm, that should not happen...

I noticed you're registering your TileEntity in init. Try to do it in preInit after you've initialized your block.

 

Also try to set a breakpoint on the shouldRefresh return and see if it even gets called.

 

Could the problem be because I set my variable 'private ItemStack[] pyrolysisChamberItemStacks = new ItemStack[39];' At the top of my tile entity, so every time the tile entity runs it is resetting the itemstackvariable back to 0 and in the process resetting the slots ? Just theorising based on what I am seeing and reading in my code, I am trying to test the theory now.

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Hello everyone, I'm making this post to seek help for my modded block, It's a special block called FrozenBlock supposed to take the place of an old block, then after a set amount of ticks, it's supposed to revert its Block State, Entity, data... to the old block like this :  The problem I have is that the system breaks when handling multi blocks (I tried some fix but none of them worked) :  The bug I have identified is that the function "setOldBlockFields" in the item's "setFrozenBlock" function gets called once for the 1st block of multiblock getting frozen (as it should), but gets called a second time BEFORE creating the first FrozenBlock with the data of the 1st block, hence giving the same data to the two FrozenBlock :   Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=head] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@73681674 BlockEntityData : id:"minecraft:bed",x:3,y:-60,z:-6} Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=3, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=2, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} here is the code inside my custom "freeze" item :    @Override     public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) {         if (!pContext.getLevel().isClientSide() && pContext.getHand() == InteractionHand.MAIN_HAND) {             BlockPos blockPos = pContext.getClickedPos();             BlockPos secondBlockPos = getMultiblockPos(blockPos, pContext.getLevel().getBlockState(blockPos));             if (secondBlockPos != null) {                 createFrozenBlock(pContext, secondBlockPos);             }             createFrozenBlock(pContext, blockPos);             return InteractionResult.SUCCESS;         }         return super.useOn(pContext);     }     public static void createFrozenBlock(UseOnContext pContext, BlockPos blockPos) {         BlockState oldState = pContext.getLevel().getBlockState(blockPos);         BlockEntity oldBlockEntity = oldState.hasBlockEntity() ? pContext.getLevel().getBlockEntity(blockPos) : null;         CompoundTag oldBlockEntityData = oldState.hasBlockEntity() ? oldBlockEntity.serializeNBT() : null;         if (oldBlockEntity != null) {             pContext.getLevel().removeBlockEntity(blockPos);         }         BlockState FrozenBlock = setFrozenBlock(oldState, oldBlockEntity, oldBlockEntityData);         pContext.getLevel().setBlockAndUpdate(blockPos, FrozenBlock);     }     public static BlockState setFrozenBlock(BlockState blockState, @Nullable BlockEntity blockEntity, @Nullable CompoundTag blockEntityData) {         BlockState FrozenBlock = BlockRegister.FROZEN_BLOCK.get().defaultBlockState();         ((FrozenBlock) FrozenBlock.getBlock()).setOldBlockFields(blockState, blockEntity, blockEntityData);         return FrozenBlock;     }  
    • It is an issue with quark - update it to this build: https://www.curseforge.com/minecraft/mc-mods/quark/files/3642325
    • Remove Instant Massive Structures Mod from your server     Add new crash-reports with sites like https://paste.ee/  
    • Update your drivers: https://www.amd.com/en/support/graphics/amd-radeon-r9-series/amd-radeon-r9-200-series/amd-radeon-r9-280x
  • Topics

×
×
  • Create New...

Important Information

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