package minefantasy.mf2.item.food; import java.text.DecimalFormat; import java.util.List; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.stamina.StaminaBar; import minefantasy.mf2.hunger.HungerSystemMF; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.mechanics.TierHelper; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; import net.minecraft.world.World; import cpw.mods.fml.common.registry.GameRegistry; public class ItemFoodMF extends ItemFood { private static final String eatDelayNBT = "MF_EatenFoodDelay"; private float staminaRestore = 0F; private Item leftOver; private float mfSaturation = 0F; protected int hungerLevel; protected float saturationLevel; public ItemFoodMF(String name, int hunger, float saturation, boolean isMeat) { super(hunger, 0F, isMeat); hungerLevel = hunger; saturationLevel = saturation; setCreativeTab(CreativeTabMF.tabFood); GameRegistry.registerItem(this, "MF2_food_"+name, MineFantasyII.MODID); this.setUnlocalizedName(name); this.setTextureName("minefantasy2:food/"+name); } public ItemFoodMF(String name, int hunger, float saturation, float saturation2, boolean isMeat, int rarity) { this(name, hunger, saturation, isMeat); this.mfSaturation = saturation2 * FoodListMF.satModifier; itemRarity = rarity; } @Override protected void onFoodEaten(ItemStack food, World world, EntityPlayer consumer) { super.onFoodEaten(food, world, consumer); if(StaminaBar.isSystemActive) { if(staminaRestore > 0) { StaminaBar.modifyStaminaValue(consumer, staminaRestore); } if(staminaSeconds > 0) { StaminaBar.buffStamina(consumer, staminaBuff, staminaSeconds); } if(staminaRegenSeconds > 0) { StaminaBar.buffStaminaRegen(consumer, staminaRegenBuff, staminaRegenSeconds); } } if(mfSaturation > 0 && consumer.getFoodStats().getFoodLevel() >= 20)//Only apply saturation at full food level { HungerSystemMF.applySaturation(consumer, mfSaturation); } if(this == FoodListMF.berriesJuicy) { PotionEffect poison = consumer.getActivePotionEffect(Potion.poison); if(poison != null) { poison.addCurativeItem(food); consumer.curePotionEffects(food); } } } public ItemFoodMF setRarity(int i) { itemRarity = i; return this; } public ItemFoodMF setStaminaRestore(float f) { staminaRestore = f; hasEffect = true; return this; } public ItemFoodMF setStaminaModifier(float buff, float hours) { int secondsLasting = (int) (hours*3600F); staminaBuff = buff; staminaSeconds = secondsLasting; staminaInMinutes = secondsLasting > 60; staminaInHours = secondsLasting > 3600; hasEffect = true; return this; } public ItemFoodMF setStaminaRegenModifier(float buff, float minutesLasting) { int secondsLasting = (int) (minutesLasting*60F); staminaRegenBuff = buff; staminaRegenSeconds = secondsLasting; staminaRegenInMinutes = secondsLasting > 60; hasEffect = true; return this; } public static final DecimalFormat decimal_format = new DecimalFormat("#.#"); @Override public void addInformation(ItemStack weapon, EntityPlayer user, List list, boolean extra) { super.addInformation(weapon, user, list, extra); if(MineFantasyII.isDebug()) { int pts = TierHelper.getPointsWorthForFood(hungerLevel, mfSaturation, staminaBuff, staminaSeconds, staminaRegenBuff, staminaRegenSeconds); list.add("Points: " + pts); list.add("Recommended Tier: " + (pts <= 10 ? 0 : (int)Math.ceil(pts/50F))); int lvl =(Math.max(0, (Math.round(pts/5F))-10)); list.add("Level: " + lvl); } list.add(StatCollector.translateToLocalFormatted("food.stat.hunger.name", hungerLevel)); if(mfSaturation > 0) { list.add(StatCollector.translateToLocalFormatted("food.stat.saturation.name", decimal_format.format(mfSaturation))); } if(hasEffect) { list.add(""); list.add(EnumChatFormatting.WHITE + StatCollector.translateToLocal("food.stat.list.name")); if(staminaRestore > 0) { list.add(StatCollector.translateToLocalFormatted("food.stat.staminaPlus.name", (int)staminaRestore)); } if(staminaBuff > 0) { if(staminaInHours) { list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffHours.name", decimal_format.format(staminaBuff), decimal_format.format(staminaSeconds/3600F))); } else if(staminaInMinutes) { list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffMinutes.name", decimal_format.format(staminaBuff), decimal_format.format(staminaSeconds/60F))); } else { list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffSeconds.name", decimal_format.format(staminaBuff), decimal_format.format(staminaSeconds))); } } if(staminaRegenBuff > 0) { if(staminaRegenInMinutes) { list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffRegenMinutes.name", decimal_format.format(staminaRegenBuff), decimal_format.format(staminaRegenSeconds/60F))); } else { list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffRegenSeconds.name", decimal_format.format(staminaRegenBuff), decimal_format.format(staminaRegenSeconds))); } } } if(this == FoodListMF.berriesJuicy) { list.add(StatCollector.translateToLocal("food.stat.cure.poison")); } } public int itemRarity; @Override public EnumRarity getRarity(ItemStack item) { int lvl = itemRarity+1; if(item.isItemEnchanted()) { if(lvl == 0) { lvl++; } lvl ++; } if(lvl >= ToolListMF.rarity.length) { lvl = ToolListMF.rarity.length-1; } return ToolListMF.rarity[lvl]; } private boolean hasEffect = false; private float staminaBuff = 0F; private int staminaSeconds = 0; private boolean staminaInMinutes = false; private boolean staminaInHours = false; private float staminaRegenBuff = 0F; private int staminaRegenSeconds = 0; private boolean staminaRegenInMinutes = false; private static final String leftOverNbt = "MF_Food_leftover"; public ItemFoodMF setReturnItem(Item item) { leftOver = item; return this; } @Override public ItemStack onEaten(ItemStack food, World world, EntityPlayer consumer) { ItemStack left = getLeftOver(food); if(left != null) { if(food.stackSize == 1) { consumer.getFoodStats().func_151686_a(this, food); world.playSoundAtEntity(consumer, "random.burp", 0.5F, world.rand.nextFloat() * 0.1F + 0.9F); this.onFoodEaten(food, world, consumer); return left; } if(!consumer.inventory.addItemStackToInventory(left) && !consumer.worldObj.isRemote) { consumer.entityDropItem(left, 1.0F); } } setEatDelay(consumer, 10); return super.onEaten(food, world, consumer); } public static void setLeftOver(ItemStack food, ItemStack leftover) { if(!food.hasTagCompound()) { food.setTagCompound(new NBTTagCompound()); } NBTTagCompound savedItem = new NBTTagCompound(); leftover.writeToNBT(savedItem); food.getTagCompound().setTag(leftOverNbt, savedItem); } protected ItemStack getLeftOver(ItemStack food) { if(food.hasTagCompound() && food.getTagCompound().hasKey(leftOverNbt)) { return ItemStack.loadItemStackFromNBT(food.getTagCompound().getCompoundTag(leftOverNbt)); } if(leftOver != null) { return new ItemStack(leftOver); } return getContainerItem(food); } @Override public void getSubItems(Item item, CreativeTabs tab, List list) { ItemStack food = new ItemStack(item); if(this.getUnlocalizedName().contains("stew")) { setLeftOver(food, new ItemStack(Items.bowl)); } list.add(food); } private int useTime = 32; public ItemFoodMF setEatTime(int i) { useTime = i; return this; } @Override public int getMaxItemUseDuration(ItemStack item) { return useTime; } public static void onTick(EntityPlayer player) { int time = getEatDelay(player); if(time > 0) { time --; setEatDelay(player, time); } } private static void setEatDelay(EntityPlayer player, int time) { player.getEntityData().setInteger(eatDelayNBT , time); } private static int getEatDelay(EntityPlayer player) { if(player.getEntityData().hasKey(eatDelayNBT)) { return player.getEntityData().getInteger(eatDelayNBT); } return 0; } @Override public ItemStack onItemRightClick(ItemStack food, World world, EntityPlayer user) { if(getEatDelay(user) > 0) { return food; } return super.onItemRightClick(food, world, user); } }