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