001package net.minecraft.util;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005import net.minecraft.entity.player.EntityPlayer;
006import net.minecraft.item.ItemFood;
007import net.minecraft.nbt.NBTTagCompound;
008
009public class FoodStats
010{
011    /** The player's food level. */
012    private int foodLevel = 20;
013
014    /** The player's food saturation. */
015    private float foodSaturationLevel = 5.0F;
016
017    /** The player's food exhaustion. */
018    private float foodExhaustionLevel;
019
020    /** The player's food timer value. */
021    private int foodTimer = 0;
022    private int prevFoodLevel = 20;
023
024    /**
025     * Args: int foodLevel, float foodSaturationModifier
026     */
027    public void addStats(int par1, float par2)
028    {
029        this.foodLevel = Math.min(par1 + this.foodLevel, 20);
030        this.foodSaturationLevel = Math.min(this.foodSaturationLevel + (float)par1 * par2 * 2.0F, (float)this.foodLevel);
031    }
032
033    /**
034     * Eat some food.
035     */
036    public void addStats(ItemFood par1ItemFood)
037    {
038        this.addStats(par1ItemFood.getHealAmount(), par1ItemFood.getSaturationModifier());
039    }
040
041    /**
042     * Handles the food game logic.
043     */
044    public void onUpdate(EntityPlayer par1EntityPlayer)
045    {
046        int var2 = par1EntityPlayer.worldObj.difficultySetting;
047        this.prevFoodLevel = this.foodLevel;
048
049        if (this.foodExhaustionLevel > 4.0F)
050        {
051            this.foodExhaustionLevel -= 4.0F;
052
053            if (this.foodSaturationLevel > 0.0F)
054            {
055                this.foodSaturationLevel = Math.max(this.foodSaturationLevel - 1.0F, 0.0F);
056            }
057            else if (var2 > 0)
058            {
059                this.foodLevel = Math.max(this.foodLevel - 1, 0);
060            }
061        }
062
063        if (this.foodLevel >= 18 && par1EntityPlayer.shouldHeal())
064        {
065            ++this.foodTimer;
066
067            if (this.foodTimer >= 80)
068            {
069                par1EntityPlayer.heal(1);
070                this.foodTimer = 0;
071            }
072        }
073        else if (this.foodLevel <= 0)
074        {
075            ++this.foodTimer;
076
077            if (this.foodTimer >= 80)
078            {
079                if (par1EntityPlayer.getHealth() > 10 || var2 >= 3 || par1EntityPlayer.getHealth() > 1 && var2 >= 2)
080                {
081                    par1EntityPlayer.attackEntityFrom(DamageSource.starve, 1);
082                }
083
084                this.foodTimer = 0;
085            }
086        }
087        else
088        {
089            this.foodTimer = 0;
090        }
091    }
092
093    /**
094     * Reads food stats from an NBT object.
095     */
096    public void readNBT(NBTTagCompound par1NBTTagCompound)
097    {
098        if (par1NBTTagCompound.hasKey("foodLevel"))
099        {
100            this.foodLevel = par1NBTTagCompound.getInteger("foodLevel");
101            this.foodTimer = par1NBTTagCompound.getInteger("foodTickTimer");
102            this.foodSaturationLevel = par1NBTTagCompound.getFloat("foodSaturationLevel");
103            this.foodExhaustionLevel = par1NBTTagCompound.getFloat("foodExhaustionLevel");
104        }
105    }
106
107    /**
108     * Writes food stats to an NBT object.
109     */
110    public void writeNBT(NBTTagCompound par1NBTTagCompound)
111    {
112        par1NBTTagCompound.setInteger("foodLevel", this.foodLevel);
113        par1NBTTagCompound.setInteger("foodTickTimer", this.foodTimer);
114        par1NBTTagCompound.setFloat("foodSaturationLevel", this.foodSaturationLevel);
115        par1NBTTagCompound.setFloat("foodExhaustionLevel", this.foodExhaustionLevel);
116    }
117
118    /**
119     * Get the player's food level.
120     */
121    public int getFoodLevel()
122    {
123        return this.foodLevel;
124    }
125
126    @SideOnly(Side.CLIENT)
127    public int getPrevFoodLevel()
128    {
129        return this.prevFoodLevel;
130    }
131
132    /**
133     * If foodLevel is not max.
134     */
135    public boolean needFood()
136    {
137        return this.foodLevel < 20;
138    }
139
140    /**
141     * adds input to foodExhaustionLevel to a max of 40
142     */
143    public void addExhaustion(float par1)
144    {
145        this.foodExhaustionLevel = Math.min(this.foodExhaustionLevel + par1, 40.0F);
146    }
147
148    /**
149     * Get the player's food saturation level.
150     */
151    public float getSaturationLevel()
152    {
153        return this.foodSaturationLevel;
154    }
155
156    @SideOnly(Side.CLIENT)
157    public void setFoodLevel(int par1)
158    {
159        this.foodLevel = par1;
160    }
161
162    @SideOnly(Side.CLIENT)
163    public void setFoodSaturationLevel(float par1)
164    {
165        this.foodSaturationLevel = par1;
166    }
167}