package com.bioxx.tfc2.core; import java.util.Iterator; import java.util.List; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.FoodStats; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import com.bioxx.tfc2.api.FoodRegistry; import com.bioxx.tfc2.api.FoodRegistry.FoodGroupPair; import com.bioxx.tfc2.api.FoodRegistry.TFCFood; import com.bioxx.tfc2.api.interfaces.IFood; import com.bioxx.tfc2.api.interfaces.IFoodStatsTFC; public class Food { public static final int DRYHOURS = 4; public static final int SMOKEHOURS = 12; private static NBTTagCompound getProcTag(ItemStack is) { if(is.hasTagCompound() && is.getTagCompound().hasKey("Processing Tag")) { return (NBTTagCompound) is.getTagCompound().getTag("Processing Tag"); } else return new NBTTagCompound(); } private static void setProcTag(ItemStack is, NBTTagCompound nbt) { if(!is.hasTagCompound()) is.setTagCompound(new NBTTagCompound()); is.getTagCompound().setTag("Processing Tag", nbt); } private static NBTTagCompound getNBT(ItemStack is) { if (is != null && is.hasTagCompound()) { return is.getTagCompound(); } else if (is != null && !is.hasTagCompound()) { is.setTagCompound(new NBTTagCompound()); return is.getTagCompound(); } else { return new NBTTagCompound(); } } public static boolean areEqual(ItemStack is1, ItemStack is2) { if(isBrined(is1) != isBrined(is2)) return false; if(isPickled(is1) != isPickled(is2)) return false; if(isCooked(is1) != isCooked(is2)) return false; if(isDried(is1) != isDried(is2)) return false; if(isSalted(is1) != isSalted(is2)) return false; return true; } public static boolean isBrined(ItemStack is) { NBTTagCompound nbt = getProcTag(is); return nbt.getBoolean("Brined"); } public static void setBrined(ItemStack is, boolean value) { NBTTagCompound nbt = getProcTag(is); nbt.setBoolean("Brined", value); setProcTag(is, nbt); } public static boolean isPickled(ItemStack is) { NBTTagCompound nbt = getProcTag(is); return nbt.getBoolean("Pickled"); } public static void setPickled(ItemStack is, boolean value) { NBTTagCompound nbt = getProcTag(is); nbt.setBoolean("Pickled", value); setProcTag(is, nbt); } public static boolean isSalted(ItemStack is) { NBTTagCompound nbt = getProcTag(is); return nbt.getBoolean("Salted"); } public static void setSalted(ItemStack is, boolean value) { NBTTagCompound nbt = getProcTag(is); nbt.setBoolean("Salted", value); setProcTag(is, nbt); } public static boolean isCooked(ItemStack is) { NBTTagCompound nbt = getProcTag(is); return nbt.getFloat("Cooked") > 600; } public static float getCooked(ItemStack is) { NBTTagCompound nbt = getProcTag(is); return nbt.getFloat("Cooked"); } public static void setCooked(ItemStack is, float value) { NBTTagCompound nbt = getProcTag(is); nbt.setFloat("Cooked", value); setProcTag(is, nbt); } public static void setDecayTimer(ItemStack is, long value) { NBTTagCompound nbt = getNBT(is); nbt.setLong("Expiration", value); } public static long getDecayTimer(ItemStack is) { NBTTagCompound nbt = getNBT(is); if (nbt.hasKey("Expiration")) return nbt.getLong("Expiration"); else return Timekeeper.getInstance().getTotalTicks(); } public static boolean hasDecayTimer(ItemStack is) { NBTTagCompound nbt = getNBT(is); return nbt.hasKey("Expiration"); } public static boolean isDried(ItemStack is) { NBTTagCompound nbt = getProcTag(is); return nbt.getShort("Dried") >= DRYHOURS; } public static short getDried(ItemStack is) { NBTTagCompound nbt = getProcTag(is); return nbt.getShort("Dried"); } public static void setDried(ItemStack is, int value) { NBTTagCompound nbt = getProcTag(is); nbt.setShort("Dried", (short)value); setProcTag(is, nbt); } public static short getSmokeCounter(ItemStack is) { NBTTagCompound nbt = getProcTag(is); return nbt.getShort("SmokeCounter"); } public static void setSmokeCounter(ItemStack is, int value) { NBTTagCompound nbt = getProcTag(is); nbt.setShort("SmokeCounter", (short)value); setProcTag(is, nbt); } public static int getCookedColorMultiplier(ItemStack is) { float cookedLevel = Food.getCooked(is); int r = 255 - (int)(160 * (Math.max(cookedLevel-600, 0) / 600f)); int b = 255 - (int)(160 * (Math.max(cookedLevel-600, 0) / 600f)); int g = 255 - (int)(160 * (Math.max(cookedLevel-600, 0) / 600f)); return (r << 16) + (b << 8) + g; } public static void setMealSkill(ItemStack is, int val) { if(!is.hasTagCompound()) is.setTagCompound(new NBTTagCompound()); is.getTagCompound().setInteger("mealSkill", val); } public static int getMealSkill(ItemStack is) { return is.getTagCompound().getInteger("mealSkill"); } public static boolean hasMealSkill(ItemStack is) { return is.getTagCompound().hasKey("mealSkill"); } public static long getExpirationTimer(ItemStack is) { if(FoodRegistry.getInstance().hasKey(is.getItem(), is.getItemDamage())) { return Food.getExpirationTimer(FoodRegistry.getInstance().getFood(is.getItem(), is.getItemDamage()), is); } return -1L; } public static long getExpirationTimer(TFCFood food, ItemStack is) { long timer = food.expiration; // Do decay timer altering stuff here return timer; } public static void addInformation(ItemStack is, EntityPlayer player, List arraylist, Item item) { if(FoodRegistry.getInstance().hasKey(is.getItem(), is.getItemDamage())) { TFCFood food = FoodRegistry.getInstance().getFood(is.getItem(), is.getItemDamage()); IFood ifood = (IFood)item; arraylist.add(food.getDisplayString()); long time = Food.getDecayTimer(is)-Timekeeper.getInstance().getTotalTicks(); if(!Food.hasDecayTimer(is)) { arraylist.add(TextFormatting.GREEN+"NO DECAY"); } else if(time <= 0) { arraylist.add(TextFormatting.RED+"Expired x"+Math.min(1+(time / Food.getExpirationTimer(food, is))* (-1), is.stackSize)); } else { String out = String.format("%d:%02d", time/60/20, (time/20) % 60); arraylist.add("Expires: " + out); } } } @SideOnly(Side.CLIENT) public static void getSubItems(Item itemIn, CreativeTabs tab, List subItems) { ItemStack is = new ItemStack(itemIn, 1, 0); Food.setDecayTimer(is, net.minecraft.client.Minecraft.getMinecraft().theWorld.getWorldTime()+ Food.getExpirationTimer(is)); subItems.add(is); } @SideOnly(Side.CLIENT) public static void addDecayTimerForCreative(List<ItemStack> list) { for(ItemStack is : list) { Food.setDecayTimer(is, net.minecraft.client.Minecraft.getMinecraft().theWorld.getWorldTime()+Food.getExpirationTimer(is)); } } public static void addNutrition(FoodStats fs, ItemStack is) { IFoodStatsTFC stats = (IFoodStatsTFC)fs; TFCFood food = FoodRegistry.getInstance().getFood(is.getItem(), is.getItemDamage()); if(food != null && is.getItem() instanceof ItemFood) { ItemFood item = (ItemFood)is.getItem(); Iterator iter = food.foodGroup.iterator(); while(iter.hasNext()) { FoodGroupPair pair = (FoodGroupPair) iter.next(); float amount = pair.amount; amount = Math.min(stats.getNutritionMap().get(pair.foodGroup) + (item.getHealAmount(is) * (pair.amount / 100f)*0.25f), 20); stats.getNutritionMap().put(pair.foodGroup, amount); } } } }