package pneumaticCraft.common.block.pneumaticPlants;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.block.BlockFlower;
import net.minecraft.block.IGrowable;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import pneumaticCraft.common.block.BlockPressureTube;
import pneumaticCraft.common.config.Config;
import pneumaticCraft.common.item.ItemPlasticPlants;
import pneumaticCraft.common.item.Itemss;
import pneumaticCraft.common.network.NetworkHandler;
import pneumaticCraft.common.network.PacketSpawnParticle;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public abstract class BlockPneumaticPlantBase extends BlockFlower implements IGrowable{
IIcon[] texture;
protected BlockPneumaticPlantBase(){
super(0);
setTickRandomly(true);
float var3 = 0.5F;
setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, 0.25F, 0.5F + var3);
setCreativeTab((CreativeTabs)null);
setHardness(0.0F);
setStepSound(Block.soundTypeGrass);
disableStats();
if(isPlantHanging()) {
setBlockBounds(0, 0.75F, 0, 1, 1, 1);
}
BlockPlants.allPlants.add(this);
}
@Override
public void registerBlockIcons(IIconRegister register){
texture = new IIcon[7];
for(int i = 0; i < 7; i++) {
texture[i] = register.registerIcon(getTextureString() + i);
}
}
/**
* returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks)
*/
@Override
@SideOnly(Side.CLIENT)
public void getSubBlocks(Item p_149666_1_, CreativeTabs p_149666_2_, List p_149666_3_){}
/**
* From the specified side and block metadata retrieves the blocks texture.
* Args: side, metadata
*/
@Override
public IIcon getIcon(int side, int meta){
if(meta == 14) return texture[6];
return texture[meta % 7];
}
protected abstract String getTextureString();
protected abstract boolean canGrowWithLightValue(int lightValue);
protected boolean skipGrowthCheck(World world, int x, int y, int z){
return false;
}
public boolean isPlantHanging(){
return false;
}
public void executeFullGrownEffect(World world, int x, int y, int z, Random rand){}
// make this method public
public boolean canPlantGrowOnThisBlock(Block block, World world, int x, int y, int z){
return block.canSustainPlant(world, x, y, z, ForgeDirection.UP, this);
}
/**
* Ticks the block if it's been scheduled
* metadata mapping: 0-6 = world generated plants, 7-13 = player dropped plants.
*/
@Override
public void updateTick(World world, int x, int y, int z, Random rand){
super.updateTick(world, x, y, z, rand);
if(!world.isRemote) {
float var7 = getGrowthRate(world, x, y, z);
if(canGrowWithLightValue(world.getBlockLightValue(x, y, z)) && rand.nextInt((int)(25.0F / var7) + 1) == 0 || skipGrowthCheck(world, x, y, z)) {
int meta = world.getBlockMetadata(x, y, z);
if(meta < 13) {
if(meta != 6) {//let world generated full-grown plants not grow.
++meta;
world.setBlockMetadataWithNotify(x, y, z, meta, 3);
}
} else if(meta == 13 && rand.nextInt(5) == 0) {
world.setBlockMetadataWithNotify(x, y, z, 6, 0);
} else {
// if the plant is allowed to execute the full grown effect
// do so.
if(Config.configPlantFullGrownEffect[getSeedDamage()] || skipGrowthCheck(world, x, y, z)) executeFullGrownEffect(world, x, y, z, rand);
}
}
}
}
protected void spawnParticle(String particleName, World world, double spawnX, double spawnY, double spawnZ, double spawnMotX, double spawnMotY, double spawnMotZ){
NetworkHandler.sendToAllAround(new PacketSpawnParticle(particleName, spawnX, spawnY, spawnZ, spawnMotX, spawnMotY, spawnMotZ), world);
}
@Override
public boolean canBlockStay(World par1World, int par2, int par3, int par4){
Block soil = par1World.getBlock(par2, par3 - (isPlantHanging() ? -1 : 1), par4);
return canGrowWithLightValue(par1World.getFullBlockLightValue(par2, par3, par4)) && soil != null && canPlantGrowOnThisBlock(soil, par1World, par2, par3, par4);
}
/**
* Gets the growth rate for the crop. Setup to encourage rows by halving
* growth rate if there is diagonals, crops on different sides that aren't
* opposing, and by adding growth for every crop next to this one (and for
* crop below this one). Args: x, y, z
*/
protected float getGrowthRate(World world, int x, int y, int z){
float growthFactor = 1.0F;
Block var6 = world.getBlock(x, y, z - 1);
Block var7 = world.getBlock(x, y, z + 1);
Block var8 = world.getBlock(x - 1, y, z);
Block var9 = world.getBlock(x + 1, y, z);
Block var10 = world.getBlock(x - 1, y, z - 1);
Block var11 = world.getBlock(x + 1, y, z - 1);
Block var12 = world.getBlock(x + 1, y, z + 1);
Block var13 = world.getBlock(x - 1, y, z + 1);
boolean var14 = var8 == this || var9 == this;
boolean var15 = var6 == this || var7 == this;
boolean var16 = var10 == this || var11 == this || var12 == this || var13 == this;
for(int var17 = x - 1; var17 <= x + 1; ++var17) {
for(int var18 = z - 1; var18 <= z + 1; ++var18) {
Block var19 = world.getBlock(var17, y - 1, var18);
float var20 = 0.0F;
if(var19.canSustainPlant(world, var17, y - (isPlantHanging() ? -1 : 1), var18, ForgeDirection.UP, this)) {
var20 = 1.0F;
if(var19.isFertile(world, var17, y - (isPlantHanging() ? -1 : 1), var18)) {
var20 = 3.0F;
}
}
if(var17 != x || var18 != z) {
var20 /= 4.0F;
}
growthFactor += var20;
}
}
if(var16 || var14 && var15) {
growthFactor /= 2.0F;
}
return growthFactor;
}
/**
* The type of render function that is called for this block
*/
@Override
public int getRenderType(){
return 1;// flower rendertype
}
/**
* Generate a seed ItemStack for this crop.
*/
protected abstract int getSeedDamage();
/**
* Get the block's damage value (for use with pick block).
*/
@Override
public int getDamageValue(World par1World, int par2, int par3, int par4){
return getSeedDamage();
}
@Override
@SideOnly(Side.CLIENT)
/**
* only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative)
*/
public Item getItem(World par1World, int par2, int par3, int par4){
return Itemss.plasticPlant;
}
@Override
protected void dropBlockAsItem(World world, int x, int y, int z, ItemStack stack){
if(!world.isRemote && world.getGameRules().getGameRuleBooleanValue("doTileDrops")) {
if(captureDrops.get()) {
capturedDrops.get().add(stack);
return;
}
float f = 0.7F;
double d0 = world.rand.nextFloat() * f + (1.0F - f) * 0.5D;
double d1 = world.rand.nextFloat() * f + (1.0F - f) * 0.5D;
double d2 = world.rand.nextFloat() * f + (1.0F - f) * 0.5D;
EntityItem entityitem = new EntityItem(world, x + d0, y + d1, z + d2, stack);
entityitem.delayBeforeCanPickup = 10;
world.spawnEntityInWorld(entityitem);
ItemPlasticPlants.markInactive(entityitem);
}
}
@Override
public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune){
ArrayList<ItemStack> ret = new ArrayList<ItemStack>();// super.getBlockDropped(world,
// x, y, z,
// metadata,
// fortune);
int seedDamage = getSeedDamage();
ret.add(new ItemStack(Itemss.plasticPlant, 1, seedDamage));
if(metadata == 6 || metadata == 13) {
ret.add(new ItemStack(Itemss.plasticPlant, world.rand.nextInt(2) + 1, seedDamage));
}
return ret;
}
public void attemptFarmByAirGrate(World world, int x, int y, int z){
int meta = world.getBlockMetadata(x, y, z);
if(meta == 6 || meta == 13) { // only do this for mature plants
dropBlockAsItem(world, x, y, z, getDrops(world, x, y, z, 0, 0).get(0));
world.setBlockMetadataWithNotify(x, y, z, world.rand.nextInt(5), 3);
}
}
@Override
public MovingObjectPosition collisionRayTrace(World world, int x, int y, int z, Vec3 startVect, Vec3 endVect){
Block b = world.getBlock((int)Math.floor(endVect.xCoord), (int)Math.floor(endVect.yCoord), (int)Math.floor(endVect.zCoord));
if(b instanceof BlockPressureTube) return null; // AirGrate farming support; seeds won't get stuck in plants
return super.collisionRayTrace(world, x, y, z, startVect, endVect);
}
/*
* @SideOnly(Side.CLIENT) public int idPicked(World par1World, int par2, int
* par3, int par4) { return this.getSeedItem(); }
*/
/**
* can this grow when bonemealed?
*/
@Override
public boolean func_149851_a(World world, int x, int y, int z, boolean isRemote){
return canApplyBonemeal(world.getBlockMetadata(x, y, z));
}
/**
* can we still grow (as opposed to: already mature)?
*/
@Override
public boolean func_149852_a(World world, Random random, int x, int y, int z){
return canApplyBonemeal(world.getBlockMetadata(x, y, z));
}
private boolean canApplyBonemeal(int meta){
return meta <= 13;
}
/**
* execute a growth step
*/
@Override
public void func_149853_b(World world, Random rand, int x, int y, int z){
executeGrowthStep(world, x, y, z, rand);
}
private void executeGrowthStep(World world, int x, int y, int z, Random rand){
int meta = world.getBlockMetadata(x, y, z);
if(meta == 6 || meta == 13) {
world.setBlockMetadataWithNotify(x, y, z, 13, 0);
executeFullGrownEffect(world, x, y, z, world.rand);
} else {
int l = meta + MathHelper.getRandomIntegerInRange(world.rand, 2, 5);
if(meta < 6 && l > 6) {
l = 6;
} else if(meta > 6 && l > 13) {
l = 13;
}
world.setBlockMetadataWithNotify(x, y, z, l, 3);
}
}
}