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 }