353 lines
10 KiB
Java
353 lines
10 KiB
Java
package mods.tinker.tconstruct.blocks;
|
|
|
|
import java.util.List;
|
|
import java.util.Random;
|
|
|
|
import mods.tinker.tconstruct.TContent;
|
|
import mods.tinker.tconstruct.client.blockrender.OreberryRender;
|
|
import mods.tinker.tconstruct.library.TConstructRegistry;
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.block.BlockLeavesBase;
|
|
import net.minecraft.block.material.Material;
|
|
import net.minecraft.client.renderer.texture.IconRegister;
|
|
import net.minecraft.creativetab.CreativeTabs;
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.entity.item.EntityItem;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.util.AxisAlignedBB;
|
|
import net.minecraft.util.DamageSource;
|
|
import net.minecraft.util.Icon;
|
|
import net.minecraft.world.IBlockAccess;
|
|
import net.minecraft.world.World;
|
|
import net.minecraftforge.common.EnumPlantType;
|
|
import net.minecraftforge.common.ForgeDirection;
|
|
import net.minecraftforge.common.IPlantable;
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
|
|
public class OreberryBush extends BlockLeavesBase implements IPlantable
|
|
{
|
|
Random random;
|
|
public Icon[] fastIcons;
|
|
public Icon[] fancyIcons;
|
|
public String[] textureNames;
|
|
public String[] oreTypes;
|
|
public int itemMeat;
|
|
private int subitems;
|
|
|
|
public OreberryBush(int id, String[] textureNames, int meta, int sub, String[] oreTypes)
|
|
{
|
|
super(id, Material.leaves, false);
|
|
this.textureNames = textureNames;
|
|
this.itemMeat = meta;
|
|
this.subitems = sub;
|
|
this.oreTypes = oreTypes;
|
|
this.setTickRandomly(true);
|
|
random = new Random();
|
|
this.setHardness(0.3F);
|
|
this.setStepSound(Block.soundMetalFootstep);
|
|
this.setCreativeTab(TConstructRegistry.blockTab);
|
|
}
|
|
|
|
/* Berries show up at meta 12-15 */
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
@Override
|
|
public void registerIcons (IconRegister iconRegister)
|
|
{
|
|
this.fastIcons = new Icon[textureNames.length];
|
|
this.fancyIcons = new Icon[textureNames.length];
|
|
|
|
for (int i = 0; i < this.fastIcons.length; i++)
|
|
{
|
|
this.fastIcons[i] = iconRegister.registerIcon("tinker:crops/" + textureNames[i] + "_fast");
|
|
this.fancyIcons[i] = iconRegister.registerIcon("tinker:crops/" + textureNames[i] + "_fancy");
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public Icon getIcon (int side, int metadata)
|
|
{
|
|
if (graphicsLevel)
|
|
{
|
|
if (metadata < 12)
|
|
{
|
|
return fancyIcons[metadata % 4];
|
|
}
|
|
else
|
|
{
|
|
return fancyIcons[metadata % 4 + 4];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (metadata < 12)
|
|
{
|
|
return fastIcons[metadata % 4];
|
|
}
|
|
else
|
|
{
|
|
return fastIcons[metadata % 4 + 4];
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Bushes are stored by size then type */
|
|
@Override
|
|
public int damageDropped (int metadata)
|
|
{
|
|
return metadata % 4;
|
|
}
|
|
|
|
/* The following methods define a berry bush's size depending on metadata */
|
|
@Override
|
|
public AxisAlignedBB getCollisionBoundingBoxFromPool (World world, int x, int y, int z)
|
|
{
|
|
int l = world.getBlockMetadata(x, y, z);
|
|
if (l < 4)
|
|
{
|
|
return AxisAlignedBB.getBoundingBox((double) x + 0.25D, y, (double) z + 0.25D, (double) x + 0.75D, (double) y + 0.5D, (double) z + 0.75D);
|
|
}
|
|
else if (l < 8)
|
|
{
|
|
return AxisAlignedBB.getBoundingBox((double) x + 0.125D, y, (double) z + 0.125D, (double) x + 0.875D, (double) y + 0.75D, (double) z + 0.875D);
|
|
}
|
|
else
|
|
{
|
|
return AxisAlignedBB.getBoundingBox(x, y, z, (double) x + 1.0D, (double) y + 1.0D, (double) z + 1.0D);
|
|
}
|
|
}
|
|
|
|
public AxisAlignedBB getSelectedBoundingBoxFromPool (World world, int x, int y, int z)
|
|
{
|
|
int l = world.getBlockMetadata(x, y, z);
|
|
if (l < 4)
|
|
{
|
|
return AxisAlignedBB.getBoundingBox((double) x + 0.25D, y, (double) z + 0.25D, (double) x + 0.75D, (double) y + 0.5D, (double) z + 0.75D);
|
|
}
|
|
else if (l < 8)
|
|
{
|
|
return AxisAlignedBB.getBoundingBox((double) x + 0.125D, y, (double) z + 0.125D, (double) x + 0.875D, (double) y + 0.75D, (double) z + 0.875D);
|
|
}
|
|
else
|
|
{
|
|
return AxisAlignedBB.getBoundingBox(x, y, z, (double) x + 1.0D, (double) y + 1.0D, (double) z + 1.0D);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void setBlockBoundsBasedOnState (IBlockAccess iblockaccess, int x, int y, int z)
|
|
{
|
|
int md = iblockaccess.getBlockMetadata(x, y, z);
|
|
|
|
float minX;
|
|
float minY = 0F;
|
|
float minZ;
|
|
float maxX;
|
|
float maxY;
|
|
float maxZ;
|
|
|
|
if (md < 4)
|
|
{
|
|
minX = minZ = 0.25F;
|
|
maxX = maxZ = 0.75F;
|
|
maxY = 0.5F;
|
|
}
|
|
else
|
|
|
|
if (md < 8)
|
|
{
|
|
minX = minZ = 0.125F;
|
|
maxX = maxZ = 0.875F;
|
|
maxY = 0.75F;
|
|
}
|
|
|
|
else
|
|
{
|
|
minX = minZ = 0.0F;
|
|
maxX = maxZ = 1.0F;
|
|
maxY = 1.0F;
|
|
}
|
|
setBlockBounds(minX, minY, minZ, maxX, maxY, maxZ);
|
|
}
|
|
|
|
/* Left-click harvests berries */
|
|
@Override
|
|
public void onBlockClicked (World world, int x, int y, int z, EntityPlayer player)
|
|
{
|
|
if (!world.isRemote)
|
|
{
|
|
int meta = world.getBlockMetadata(x, y, z);
|
|
if (meta >= 12)
|
|
{
|
|
world.setBlock(x, y, z, blockID, meta - 4, 3);
|
|
EntityItem entityitem = new EntityItem(world, player.posX, player.posY - 1.0D, player.posZ, new ItemStack(TContent.oreBerries, 1, meta % 4 + itemMeat));
|
|
world.spawnEntityInWorld(entityitem);
|
|
entityitem.onCollideWithPlayer(player);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Right-click harvests berries */
|
|
@Override
|
|
public boolean onBlockActivated (World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9)
|
|
{
|
|
/*if (world.isRemote)
|
|
return false;*/
|
|
|
|
int meta = world.getBlockMetadata(x, y, z);
|
|
if (meta >= 12)
|
|
{
|
|
if (world.isRemote)
|
|
return true;
|
|
|
|
world.setBlock(x, y, z, blockID, meta - 4, 3);
|
|
EntityItem entityitem = new EntityItem(world, player.posX, player.posY - 1.0D, player.posZ, new ItemStack(TContent.oreBerries, 1, meta % 4 + itemMeat));
|
|
world.spawnEntityInWorld(entityitem);
|
|
entityitem.onCollideWithPlayer(player);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* Render logic */
|
|
|
|
@Override
|
|
public boolean isOpaqueCube ()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public void setGraphicsLevel (boolean flag)
|
|
{
|
|
graphicsLevel = flag;
|
|
}
|
|
|
|
@Override
|
|
public boolean renderAsNormalBlock ()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public int getRenderType ()
|
|
{
|
|
return OreberryRender.model;
|
|
}
|
|
|
|
public boolean shouldSideBeRendered (IBlockAccess iblockaccess, int x, int y, int z, int meta)
|
|
{
|
|
if (meta > 7 || graphicsLevel)
|
|
{
|
|
return super.shouldSideBeRendered(iblockaccess, x, y, z, meta);
|
|
}
|
|
else
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/* Bush growth */
|
|
|
|
@Override
|
|
public void updateTick (World world, int x, int y, int z, Random random1)
|
|
{
|
|
if (world.isRemote)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (random1.nextInt(20) == 0)// && world.getBlockLightValue(x, y, z) <= 8)
|
|
{
|
|
int meta = world.getBlockMetadata(x, y, z);
|
|
if (world.getFullBlockLightValue(x, y, z) < 13)
|
|
{
|
|
if (meta < 12)
|
|
{
|
|
world.setBlock(x, y, z, blockID, meta + 4, 3);
|
|
}
|
|
if (meta > 7)
|
|
{
|
|
|
|
}
|
|
}
|
|
else if (meta < 8)
|
|
{
|
|
world.setBlock(x, y, z, blockID, meta + 4, 3);
|
|
}
|
|
}
|
|
}
|
|
|
|
public boolean canSustainPlant(World world, int x, int y, int z, ForgeDirection direction, IPlantable plant)
|
|
{
|
|
if (plant instanceof OreberryBush)
|
|
return (world.getBlockMetadata(x, y, z) > 7);
|
|
return super.canSustainPlant(world, x, y, z, direction, plant);
|
|
}
|
|
|
|
public boolean canPlaceBlockAt(World world, int x, int y, int z)
|
|
{
|
|
if (world.getFullBlockLightValue(x, y, z) < 13)
|
|
return super.canPlaceBlockAt(world, x, y, z);
|
|
return false;
|
|
}
|
|
|
|
/* Resistance to fire */
|
|
|
|
@Override
|
|
public int getFlammability (IBlockAccess world, int x, int y, int z, int metadata, ForgeDirection face)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
public boolean isFlammable (IBlockAccess world, int x, int y, int z, int metadata, ForgeDirection face)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public int getFireSpreadSpeed (World world, int x, int y, int z, int metadata, ForgeDirection face)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* returns a list of items with the same ID, but different meta (eg: dye returns 16 items)
|
|
*/
|
|
@SideOnly(Side.CLIENT)
|
|
@Override
|
|
public void getSubBlocks (int par1, CreativeTabs par2CreativeTabs, List par3List)
|
|
{
|
|
for (int var4 = 8; var4 < 8+subitems; ++var4)
|
|
{
|
|
par3List.add(new ItemStack(par1, 1, var4));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public EnumPlantType getPlantType (World world, int x, int y, int z)
|
|
{
|
|
return EnumPlantType.Cave;
|
|
}
|
|
|
|
@Override
|
|
public int getPlantID (World world, int x, int y, int z)
|
|
{
|
|
return this.blockID;
|
|
}
|
|
|
|
@Override
|
|
public int getPlantMetadata (World world, int x, int y, int z)
|
|
{
|
|
return world.getBlockMetadata(x, y, z) - 4;
|
|
}
|
|
|
|
public void onEntityCollidedWithBlock (World world, int i, int j, int k, Entity entity)
|
|
{
|
|
if (!(entity instanceof EntityItem))
|
|
entity.attackEntityFrom(DamageSource.cactus, 1);
|
|
}
|
|
}
|