import java.util.Random;
import net.minecraft.server.MinecraftServer;

public class anr extends BlockGrowingPlant
{

	protected int num_growth_stages;
	protected ms a[];
	protected ms iconArrayBlighted[];

	protected anr(int block_id, int num_growth_stages)
	{
		super(block_id);
		this.num_growth_stages = num_growth_stages;
		b(true);
		float var2 = 0.5F;
		setBlockBoundsForAllThreads(0.5F - var2, 0.0D, 0.5F - var2, 0.5F + var2, 0.25D, 0.5F + var2);
		a((ww)null);
		c(0.02F);
		a(j);
		C();
		setCushioning(0.2F);
	}

	public String getMetadataNotes()
	{
		return "Bits 1, 2, and 4 used to track growth, bit 8 set if crop is blighted";
	}

	public boolean isValidMetadata(int metadata)
	{
		return metadata >= 0 && metadata < 16;
	}

	public float getLowestOptimalTemperature()//适宜温度下限,系数
	{
		return 0.8F;
	}

	public float getHighestOptimalTemperature()//适宜温度上限
	{
		return 1.2F;
	}

	public float getHumidityGrowthRateModifier(boolean high_humidity)//湿度
	{
		return 1.0F;
	}

	public boolean isLegalOn(int metadata, aqz block_below, int block_below_metadata)
	{
		return block_below == aF;
	}

	protected int getDeadCropBlockId()
	{
		return aqz.cropsDead.cF;
	}

	public boolean updateTick(abw world, int x, int y, int z, Random rand)//植物生长主函数
	{
		if (super.updateTick(world, x, y, z, rand))
			return true;
		int metadata = world.h(x, y, z);
		float growth_rate = k(world, x, y, z);//调用下面的k函数得到植物生长速率
		if (growth_rate == 0.0F && !aof.m(world, x, y - 1, z))
			if (rand.nextFloat() < 0.05F)
			{
				if (isMature(metadata))
				{
					dropBlockAsEntityItem((new BlockBreakInfo(world, x, y, z)).setDrought());
					return world.c(x, y, z, 0);
				} else
				{
					return world.f(x, y, z, getDeadCropBlockId(), getGrowth(metadata), 3);
				}
			} else
			{
				return false;
			}
		if (isBlighted(metadata))//判断是否枯萎(生病
		{
			if (rand.nextInt(64) == 0) //枯萎几率
				return world.f(x, y, z, getDeadCropBlockId(), isMature(metadata) ? getGrowth(metadata) - 1 : getGrowth(metadata), 3);
			if (rand.nextBoolean())
				return false;
			int dx = rand.nextInt(3) - 1;
			int dy = rand.nextInt(3) - 1;
			int dz = rand.nextInt(3) - 1;
			if ((dx != 0 || dy != 0 || dz != 0) && world.f(x + dx, y + dy, z + dz))
			{
				int block_id = world.a(x + dx, y + dy, z + dz);
				aqz block = aqz.getBlock(block_id);
				if ((block instanceof anr) && !((anr)block).isDead())
				{
					metadata = world.h(x + dx, y + dy, z + dz);
					if (!isBlighted(metadata))
						world.b(x + dx, y + dy, z + dz, setBlighted(metadata, true), 2);
				}
			}
			return false;
		}
		//血月加速枯萎
		if (world.isBloodMoonNight() && !isBlighted(metadata) && rand.nextFloat() < 0.25F && !MinecraftServer.F().V() && (!world.hasStandardFormOpaqueBlockAbove(x, y, z) || world.isOutdoors(x, y, z)) && world.b(x, y, z, setBlighted(metadata, true), 2))
			return true;
		int blv = world.n(x, y + 1, z);
		if (rand.nextFloat() < chanceOfBlightPerRandomTick() * getBlightChanceModifierForBiome(world.a(x, z)) * (1.0F - (float)blv / 16F))
		{
			if (!isBlighted(metadata))
				return world.b(x, y, z, setBlighted(metadata, true), 2);
		} else
		if (isLightLevelSuitableForGrowth(blv))
		{
			if (growth_rate == 0.0F || isMature(metadata))
				return false;
			if (rand.nextInt((int)(25F / growth_rate) + 1) == 0)
			{
				world.b(x, y, z, incrementGrowth(metadata), 2);
				if (rand.nextInt(256) == 0 && aqz.s[world.a(x, y - 1, z)] == aqz.aF)
				{
					metadata = world.h(x, y - 1, z);
					if (aof.isFertilized(metadata))
						world.b(x, y - 1, z, aof.setFertilized(metadata, false), 2);
				}
				return true;
			}
		}
		return false;
	}

	public static float getBlightChanceModifierForBiome(acq biome)//植物生长与温度和是否被自然光照有关
	{
		float temperature = biome.F;
		float delta_temperature;
		if (temperature < 1.0F)
			delta_temperature = 1.0F - temperature;
		else
		if (temperature > 1.2F)
			delta_temperature = temperature - 1.2F;
		else
			delta_temperature = 0.0F;
		return Math.max((1.0F - delta_temperature) * (biome.e() ? 1.5F : 1.0F), 0.0F);
	}

	public boolean fertilize(abw world, int x, int y, int z, ye item_stack)//肥沃的土壤
	{
		yc item = item_stack.b();
		if (item == yc.aY)
		{
			int metadata = world.h(x, y, z);
			return isBlighted(metadata) && world.b(x, y, z, setBlighted(metadata, false), 2);
		} else
		{
			return false;
		}
	}

	public float k(abw par1World, int par2, int par3, int par4)//此函数获取作物生长速率
	{
		aqz block_below = aqz.s[par1World.a(par2, par3 - 1, par4)];
		int block_below_metadata = par1World.h(par2, par3 - 1, par4);
		if (block_below == aqz.aF && aof.getWetness(block_below_metadata) == 0)
			return 0.0F;
		float var5 = 1.0F;
		int var6 = par1World.a(par2, par3, par4 - 1);//判断周围8格作物
		int var7 = par1World.a(par2, par3, par4 + 1);
		int var8 = par1World.a(par2 - 1, par3, par4);
		int var9 = par1World.a(par2 + 1, par3, par4);
		int var10 = par1World.a(par2 - 1, par3, par4 - 1);
		int var11 = par1World.a(par2 + 1, par3, par4 - 1);
		int var12 = par1World.a(par2 + 1, par3, par4 + 1);
		int var13 = par1World.a(par2 - 1, par3, par4 + 1);
		boolean var14 = var8 == cF || var9 == cF;
		boolean var15 = var6 == cF || var7 == cF;
		boolean var16 = var10 == cF || var11 == cF || var12 == cF || var13 == cF;
		for (int var17 = par2 - 1; var17 <= par2 + 1; var17++)
		{
			for (int var18 = par4 - 1; var18 <= par4 + 1; var18++)
			{
				int var19 = par1World.a(var17, par3 - 1, var18);
				float var20 = 0.0F;
				if (var19 == aqz.aF.cF)
				{
					var20 = 1.0F;
					if (par1World.h(var17, par3 - 1, var18) > 0)
						var20 = 3F;
				}
				if (var17 != par2 || var18 != par4)
					var20 /= 4F;
				var5 += var20;
			}

		}

		if (var16 || var14 && var15)
			var5 /= 2.0F;
		if (block_below == aqz.aF && aof.isFertilized(block_below_metadata))
			var5 *= 1.5F;
		acq biome = par1World.a(par2, par4);
		var5 *= getTemperatureGrowthRateModifier(biome.F);
		var5 *= getHumidityGrowthRateModifier(biome.e());
		var5 *= getGlobalGrowthRateModifierFromMITE();
		var5 *= getProximityGrowthRateModifier(par1World, par2, par3, par4);
		return var5;
	}

	public ms a(int side, int metadata)
	{
		return isBlighted(metadata) ? iconArrayBlighted[getGrowthStage(metadata)] : a[getGrowthStage(metadata)];
	}

	public int d()
	{
		return 6;
	}

	protected int j()
	{
		return yc.U.cv;
	}

	protected int k()
	{
		return yc.V.cv;
	}

	protected int getMatureYield()
	{
		return 1;
	}

	public int d(abw par1World, int par2, int par3, int par4)
	{
		return j();
	}

	public void a(mt par1IconRegister)
	{
		a = new ms[num_growth_stages];
		if (chanceOfBlightPerRandomTick() > 0.0F)
			iconArrayBlighted = new ms[num_growth_stages];
		for (int i = 0; i < num_growth_stages; i++)
		{
			a[i] = par1IconRegister.a((new StringBuilder()).append("crops/").append(E()).append("/").append(i).toString());
			if (chanceOfBlightPerRandomTick() > 0.0F)
				iconArrayBlighted[i] = par1IconRegister.a((new StringBuilder()).append("crops/").append(E()).append("/blighted/").append(i).toString());
		}

	}

	public float getBlockHardness(int metadata)
	{
		return metadata != 0 ? super.getBlockHardness(metadata) * (float)(isMature(metadata) ? 2 : 1) : 0.0F;
	}

	public float chanceOfBlightPerRandomTick()
	{
		return 0.0005F;
	}

	public int getBlightBit()
	{
		return 8;
	}

	public int getGrowthBits()
	{
		return 7;
	}

	public int getMaxGrowth()
	{
		return getGrowthBits();
	}

	public int getGrowth(int metadata)
	{
		return metadata & getGrowthBits();
	}

	public int incrementGrowth(int metadata)
	{
		if (getGrowth(metadata) < getMaxGrowth())
			metadata++;
		return metadata;
	}

	public int getGrowthStage(int metadata)
	{
		return getGrowth(metadata);
	}

	public boolean isMature(int metadata)
	{
		return getGrowth(metadata) == getMaxGrowth();
	}

	public boolean isBlighted(int metadata)
	{
		return (metadata & getBlightBit()) != 0;
	}

	public int setBlighted(int metadata, boolean blighted)
	{
		if (blighted)
			metadata |= getBlightBit();
		else
			metadata &= ~getBlightBit();
		return metadata;
	}

	public final void setBlighted(abw world, int x, int y, int z, boolean is_blighted)
	{
		if (isDead())
			return;
		int metadata = world.h(x, y, z);
		if (isBlighted(metadata) != is_blighted)
			world.b(x, y, z, setBlighted(metadata, is_blighted), 2);
	}

	public boolean canBeCarried()
	{
		return false;
	}

	public int dropBlockAsEntityItem(BlockBreakInfo info)
	{
		if (!info.wasHarvestedByPlayer() && !info.wasDrought() && !info.wasSnowedUpon() && !info.wasSelfDropped())
			return 0;
		if (info.wasDrought())
			playCropPopSound(info);
		if (isBlighted(info.getMetadata()))
			return 0;
		ye item_stack = info.getHarvesterItemStack();
		yc item = item_stack != null ? item_stack.b() : null;
		xj tool = (item instanceof xj) ? (xj)item : null;
		float harvesting_enchantment;                 //收获附魔,额外掉落
		if (tool != null && tool.isEffectiveAgainstBlock(this, info.getMetadata()))
			harvesting_enchantment = aaw.getEnchantmentLevelFraction(aau.harvesting, info.getHarvesterItemStack()) * 0.5F;
		else
			harvesting_enchantment = 0.0F;
		int num_drops;
		if (getGrowth(info.getMetadata()) == 0)
			num_drops = dropBlockAsEntityItem(info, j(), 0, 1, 1.0F);
		else
		if (isMature(info.getMetadata()) && !info.wasSelfDropped())
			num_drops = dropBlockAsEntityItem(info, k(), 0, getMatureYield(), 1.0F + harvesting_enchantment);
		else
			return 0;
		if (info.wasSnowedUpon() && num_drops > 0)
			playCropPopSound(info);
		return num_drops;
	}

	public boolean isDead()
	{
		return false;
	}

	public String getNameDisambiguationForReferenceFile(int metadata)
	{
		return isDead() ? "dead" : "living";
	}

	public void makeSoundWhenPlaced(abw world, int x, int y, int z, int metadata)
	{
		ard step_sound = aqz.aF.cS;
		if (step_sound != null)
			world.playSoundAtBlock(x, y, z, step_sound.b(), 0.2F, step_sound.d() * 0.8F);
	}

	public static void playCropPopSound(BlockBreakInfo info)
	{
		info.playSoundEffectAtBlock("random.pop", 0.05F, ((info.world.s.nextFloat() - info.world.s.nextFloat()) * 0.7F + 1.0F) * 2.0F);
	}
}