Hey
I'm currently working on my first mod, which is based on 1.8. Until this point I was able to figure out everything by reading tutorials or the vanilla code, but now I am stuck and I just can't figure out what to do...
I want to create a container (an olive press) to which you can add olives by right-clicking on it. So I followed Tutorials and created a custom TileEntityPress, with read and write (I also copied some code from TileEntityNote as it seemed to be similar to what I need).
I also added a function which should add a given amount of olives to the olives stored. When I call this function in onActivatedBlock, it adds the given Olives (tested with system.out) but as soon as I click on the block again, it starts at 0 Olives. So the message is always:
"New olive count: 1"
Here are my files, I hope someone can help
TileEntityPress:
package bgag.guenthi57.bgag.tile;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
public class TileEntityPress extends TileEntity{
public int olives;
public void writeToNBT(NBTTagCompound compound)
{
super.writeToNBT(compound);
compound.setInteger("olives", this.olives);
}
public void readFromNBT(NBTTagCompound compound)
{
super.readFromNBT(compound);
this.olives = compound.getInteger("olives");
}
public void changeOlivesCount(int count, World world, Block block)
{
this.olives = this.olives + count;
this.markDirty();
}
}
BlockOlivePress (don't be confused by the long code, there are some other functions which all work correctly):
package bgag.guenthi57.bgag.blocks;
import bgag.guenthi57.bgag.init.BundiGunthiBlocks;
import bgag.guenthi57.bgag.init.BundiGunthiItems;
import bgag.guenthi57.bgag.tile.TileEntityPress;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyInteger;
import net.minecraft.block.state.BlockState;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityNote;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.world.World;
public class BlockOlivePress extends BlockContainer {
public static final PropertyInteger PRESS = PropertyInteger.create("press", 0, 3);
public BlockOlivePress(Material materialIn) {
super(materialIn);
this.setHardness(0.8F);
this.setDefaultState(this.blockState.getBaseState().withProperty(PRESS, Integer.valueOf(0)));
// TODO Auto-generated constructor stub
}
@Override
public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
{
return this.getDefaultState().withProperty(PRESS, Integer.valueOf(0));
}
protected BlockState createBlockState()
{
return new BlockState(this, new IProperty[] {PRESS});
}
public void onBlockAdded(World world,BlockPos pos,IBlockState state) {
if (world.getBlockState(pos.up()).getBlock() == Blocks.air) {
world.setBlockState(pos.up(), BundiGunthiBlocks.olive_press_top.getDefaultState());
} else if (!(world.getBlockState(pos.up()).getBlock() == Blocks.air || world.getBlockState(pos.up()).getBlock() == BundiGunthiBlocks.olive_press_top)){
world.destroyBlock(pos, true);
}
}
public void onBlockDestroyedByPlayer(World world, BlockPos pos, IBlockState state) {
if (world.getBlockState(pos.up()).getBlock() == BundiGunthiBlocks.olive_press_top) {
world.destroyBlock(pos.up(), false);
}
}
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float hitX, float hitY, float hitZ) {
if (player.getHeldItem().getItem() == BundiGunthiItems.olives) {
TileEntity tileentity = world.getTileEntity(pos);
if (tileentity instanceof TileEntityPress)
{
TileEntityPress tileentitypress = (TileEntityPress)tileentity;
int old = tileentitypress.olives;
if (player.isSneaking()) {
tileentitypress.changeOlivesCount(player.getHeldItem().stackSize, world, state.getBlock());
} else {
tileentitypress.changeOlivesCount(1, world, state.getBlock());
}
System.out.println("New olive count: " + tileentitypress.olives);
}
}
if (((Integer)state.getValue(PRESS)).intValue() >= 3) {
world.setBlockState(pos, state.withProperty(PRESS, Integer.valueOf(0)));
} else {
world.setBlockState(pos, state.withProperty(PRESS, Integer.valueOf(((Integer)state.getValue(PRESS)).intValue()) + 1));
}
return super.onBlockActivated(world, pos, state, player, side, hitX, hitY, hitZ);
}
public IBlockState getStateFromMeta(int meta)
{
return this.getDefaultState().withProperty(PRESS, Integer.valueOf((meta)));
}
public int getMetaFromState(IBlockState state)
{
int i = ((Integer)state.getValue(PRESS)).intValue();
return i;
}
public boolean isFullCube() {
return false;
}
public boolean isOpaqueCube()
{
return false;
}
public int getRenderType()
{
return 3;
}
@Override
public TileEntity createNewTileEntity(World worldIn, int meta) {
// TODO Auto-generated method stub
return new TileEntityPress();
}
}
I also registered the TileEntity as:
GameRegistry.registerTileEntity(TileEntityPress.class, "olive_press_bottom");
Thanks to everyone who tries to help
guenthi57