package com.bioxx.tfc2.tileentities;
import java.util.UUID;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ITickable;
import com.bioxx.jmapgen.IslandMap;
import com.bioxx.jmapgen.IslandParameters.Feature;
import com.bioxx.jmapgen.graph.Center;
import com.bioxx.tfc2.Core;
import com.bioxx.tfc2.api.Crop;
import com.bioxx.tfc2.core.Timekeeper;
public class TileCrop extends TileTFC implements ITickable
{
/**
* With this amount of nutrients and a replenishment of 25% per month
* we can support 400 crops for exactly 4 months. If we reduce this to
* 16.6666%, it takes 6 months to fully replenish and we can only support
* 333 for 4 full months. We need to balance this for how much food that
* we intend for players to need to eat.
*/
public static float DEFAULT_NUTRIENTS = 153600f;//192 hours in 1 month * 800 crops
long plantedTimeStamp = 0;
long lastTick = 0;
float growth = 0;
boolean isWild = false;
Crop cropType = Crop.Corn;
UUID farmerID;
int hexID = -1;
Center closestHex;
public TileCrop()
{
plantedTimeStamp = Timekeeper.getInstance().getTotalTicks();
lastTick = plantedTimeStamp;
}
/***********************************************************************************
* 1. Content
***********************************************************************************/
@Override
public void update()
{
Timekeeper time = Timekeeper.getInstance();
if(time.getTotalTicks() > lastTick + Timekeeper.HOUR_LENGTH)
{
lastTick += Timekeeper.HOUR_LENGTH;
IslandMap map = Core.getMapForWorld(getWorld(), getPos());
if(this.closestHex == null && hexID < 0)
{
closestHex = map.getClosestCenter(getPos());
hexID = closestHex.index;
}
else if(this.closestHex == null)
{
this.closestHex = Core.getMapForWorld(getWorld(), getPos()).centers.get(hexID);
}
NBTTagCompound nbt = closestHex.getCustomNBT().getCompoundTag("TFC2_Data");
NBTTagCompound data;
if(!nbt.hasKey("CropData"))
data = new NBTTagCompound();
else
data = nbt.getCompoundTag("CropData");
if(!data.hasKey("nutrients"))
data.setFloat("nutrients", GetMaxNutrients(map));
byte[] hydrationArray = nbt.getByteArray("hydration");
int hydraY = Math.min((int)Math.floor(pos.getY()/4), 64);
boolean isIrrigated = hydrationArray.length == 0 ? false : (hydrationArray[hydraY] & 0xFF) > 100;
float nutrients = data.getFloat("nutrients");
float toGrow = 1f;
if(nutrients < 0)
toGrow -= 0.25f;
if(nutrients < -19200)//48 hours over
toGrow -= 0.25f;
if(nutrients < -38400)//96 hours over
toGrow -= 0.25f;
if(!isIrrigated)
toGrow -= 0.25f;
nutrients -= 1;
growth += toGrow;
worldObj.getMinecraftServer().getPlayerList().sendToAllNearExcept(null, pos.getX(), pos.getY(), pos.getZ(), 200, getWorld().provider.getDimension(), this.getUpdatePacket());
}
}
public static float GetMaxNutrients(IslandMap map)
{
if(map.getParams().hasFeature(Feature.NutrientRich))
return TileCrop.DEFAULT_NUTRIENTS * 2;
return TileCrop.DEFAULT_NUTRIENTS;
}
public int getGrowthStage()
{
float hoursToGrow = 24*cropType.getGrowthPeriod();
return Math.min((int)Math.floor(growth / hoursToGrow * cropType.getGrowthStages()), cropType.getGrowthStages()-1);
}
/***********************************************************************************
* 2. Getters and Setters
***********************************************************************************/
public boolean getIsWild()
{
return isWild;
}
public void setIsWild(boolean w)
{
isWild = w;
}
public Crop getCropType()
{
return this.cropType;
}
public void setCropType(Crop c)
{
this.cropType = c;
}
public void setFarmerID(EntityPlayer player)
{
farmerID = EntityPlayer.getUUID(player.getGameProfile());
}
public Center getClosestHex()
{
return closestHex;
}
public float getGrowth()
{
return growth;
}
/***********************************************************************************
* 3. NBT Methods
***********************************************************************************/
@Override
public void readSyncableNBT(NBTTagCompound nbt)
{
cropType = Crop.fromID(nbt.getInteger("cropType"));
growth = nbt.getFloat("growth");
}
@Override
public void readNonSyncableNBT(NBTTagCompound nbt)
{
isWild = nbt.getBoolean("isWild");
plantedTimeStamp = nbt.getLong("plantedTimeStamp");
farmerID = new UUID(nbt.getLong("farmerID_least"), nbt.getLong("farmerID_most"));
this.hexID = nbt.getInteger("hexID");
}
@Override
public void writeSyncableNBT(NBTTagCompound nbt)
{
nbt.setInteger("cropType", this.cropType.getID());
nbt.setFloat("growth", growth);
}
@Override
public void writeNonSyncableNBT(NBTTagCompound nbt)
{
nbt.setBoolean("isWild", isWild);
nbt.setLong("plantedTimeStamp", plantedTimeStamp);
nbt.setLong("farmerID_least", this.farmerID.getLeastSignificantBits());
nbt.setLong("farmerID_most", this.farmerID.getMostSignificantBits());
nbt.setInteger("hexID", hexID);
}
}