001 package net.minecraft.util; 002 003 import cpw.mods.fml.relauncher.Side; 004 import cpw.mods.fml.relauncher.SideOnly; 005 import net.minecraft.entity.player.EntityPlayer; 006 import net.minecraft.item.ItemFood; 007 import net.minecraft.nbt.NBTTagCompound; 008 009 public 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 }