package joshie.harvest.cooking.item; import joshie.harvest.api.cooking.IngredientStack; import joshie.harvest.api.cooking.Recipe; import joshie.harvest.api.cooking.Utensil; import joshie.harvest.cooking.HFCooking; import joshie.harvest.cooking.item.ItemMeal.Meal; import joshie.harvest.cooking.recipe.RecipeHF; import joshie.harvest.cooking.recipe.RecipeMaker; import joshie.harvest.core.HFCore; import joshie.harvest.core.HFTab; import joshie.harvest.core.base.item.ItemHFFoodEnum; import joshie.harvest.core.helpers.TextHelper; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.SoundEvents; import net.minecraft.item.EnumAction; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.*; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import java.util.*; import static joshie.harvest.cooking.recipe.RecipeBuilder.FOOD_LEVEL; import static joshie.harvest.cooking.recipe.RecipeBuilder.SATURATION_LEVEL; import static joshie.harvest.core.lib.HFModInfo.MODID; import static joshie.harvest.core.registry.ShippingRegistry.SELL_VALUE; import static net.minecraft.util.text.TextFormatting.DARK_GRAY; public class ItemMeal extends ItemHFFoodEnum<ItemMeal, Meal> { private static final EnumMap<Meal, Recipe> MEAL_TO_RECIPE = new EnumMap<>(Meal.class); public static final Meal[] MEALS = Meal.values(); public ItemMeal() { super(HFTab.COOKING, Meal.class); } public enum Meal implements IStringSerializable { PANCAKE_SAVOURY, FRIES_FRENCH, POPCORN, CORNFLAKES, EGGPLANT_HAPPY, EGG_SCRAMBLED(true), OMELET, OMELET_RICE, TOAST_FRENCH, DOUGHNUT, FISH_GRILLED, PANCAKE, POTSTICKER, RISOTTO, JUICE_PINEAPPLE, JUICE_TOMATO, MILK_STRAWBERRY, JUICE_VEGETABLE, LATTE_VEGETABLE, KETCHUP(true), BUTTER(true), FISHSTICKS, TURNIP_PICKLED, CUCUMBER_PICKLED, SALAD, SANDWICH, SUSHI, SASHIMI(true), SASHIMI_CHIRASHI, MILK_HOT, CHOCOLATE_HOT, EGG_BOILED, SPINACH_BOILED, POTATO_CANDIED, DUMPLINGS, NOODLES, SOUP_RICE, PORRIDGE, EGG_OVERRICE, STEW, STEW_PUMPKIN, STEW_FISH, CORN_BAKED, RICEBALLS_TOASTED, TOAST, DINNERROLL, DORIA, COOKIES(true), COOKIES_CHOCOLATE, CAKE_CHOCOLATE, //0.6+ Meals BURNT_COUNTER(HFCooking.COUNTER), BURNT_FRYING_PAN(HFCooking.FRYING_PAN), BURNT_MIXER(HFCooking.MIXER), BURNT_OVEN(HFCooking.OVEN), BURNT_POT(HFCooking.POT), //Burnt as separate metadata STIR_FRY, RICE_FRIED, SOUFFLE_APPLE, BREAD_CURRY, NOODLES_THICK_FRIED, TEMPURA, CURRY_DRY, JUICE_GRAPE, JUICE_PEACH, JUICE_BANANA, JUICE_ORANGE, JUICE_APPLE, JUICE_FRUIT, LATTE_FRUIT, JUICE_MIX, LATTE_MIX, SANDWICH_FRUIT, RICE_BAMBOO, RICE_MATSUTAKE, RICE_MUSHROOM, BREAD_RAISIN, ICE_CREAM, JAM_STRAWBERRY, JAM_APPLE, JAM_GRAPE, MARMALADE, NOODLES_TEMPURA, RICE_TEMPURA, BUN_JAM, SWEET_POTATOES, CAKE, PIE_APPLE, SALAD_HERB, SOUP_HERB, SANDWICH_HERB; private final boolean hasAltTexture; private final Utensil utensil; Meal() { this.hasAltTexture = false; this.utensil = null; } Meal(boolean hasAltTexture) { this.hasAltTexture = hasAltTexture; this.utensil = null; } Meal (Utensil utensil) { this.hasAltTexture = false; this.utensil = utensil; } public boolean hasAltTexture() { return hasAltTexture; } public Utensil getUtensil() { return utensil; } @Override public String getName() { return name().toLowerCase(Locale.ENGLISH); } } public ItemStack getRandomMeal(Random rand) { boolean first = rand.nextBoolean(); if (first) return getCreativeStack(MEALS[rand.nextInt(50)]); else return getCreativeStack(MEALS[55 + rand.nextInt(35)]); } private Recipe getRecipeFromMeal(Meal meal) { if (MEAL_TO_RECIPE.size() == 0) { for (Meal ameal: MEALS) { MEAL_TO_RECIPE.put(ameal, Recipe.REGISTRY.get(new ResourceLocation(MODID, ameal.getName()))); } } return MEAL_TO_RECIPE.get(meal); } public ItemStack getStackFromRecipe(RecipeHF recipeHF) { Meal meal = Meal.valueOf(recipeHF.getResource().getResourcePath().toUpperCase(Locale.ENGLISH)); return new ItemStack(this, 1, meal.ordinal()); } @Override public String getItemStackDisplayName(ItemStack stack) { Meal meal = getEnumFromStack(stack); if (meal.getUtensil() != null) return DARK_GRAY + meal.getUtensil().getBurntName(); Recipe impl = getRecipeFromMeal(meal); return impl != null ? impl.getDisplayName() : "Corrupted Meal"; } @Override @SuppressWarnings("ConstantConditions") public int getHealAmount(ItemStack stack) { return stack.hasTagCompound() ? stack.getTagCompound().getInteger(FOOD_LEVEL) : 0; } @Override @SuppressWarnings("ConstantConditions") public float getSaturationModifier(ItemStack stack) { return stack.hasTagCompound() ? stack.getTagCompound().getFloat(SATURATION_LEVEL) : 0; } @Override @SideOnly(Side.CLIENT) @SuppressWarnings("ConstantConditions") public void addInformation(ItemStack stack, EntityPlayer player, List<String> list, boolean debug) { if (HFCore.DEBUG_MODE && debug) { if (stack.hasTagCompound()) { list.add(TextHelper.translate("meal.hunger") + " : " + stack.getTagCompound().getInteger(FOOD_LEVEL)); list.add(TextHelper.translate("meal.sat") + " : " + stack.getTagCompound().getFloat(SATURATION_LEVEL)); list.add(TextHelper.translate("meal.sell") + " : " + stack.getTagCompound().getLong(SELL_VALUE)); } } } @Override public ItemStack onItemUseFinish(ItemStack stack, World world, EntityLivingBase entityLiving) { if (stack.hasTagCompound() && entityLiving instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entityLiving; if (!player.capabilities.isCreativeMode) --stack.stackSize; player.getFoodStats().addStats(this, stack); world.playSound(null, player.posX, player.posY, player.posZ, SoundEvents.ENTITY_PLAYER_BURP, SoundCategory.PLAYERS, 0.5F, world.rand.nextFloat() * 0.1F + 0.9F); return stack; } return stack; } @Override public int getMaxItemUseDuration(ItemStack stack) { if (stack.hasTagCompound()) { Recipe recipe = getRecipeFromMeal(getEnumFromStack(stack)); return recipe == null ? 32 : recipe.getEatTimer(); } else return 32; } @Override public EnumAction getItemUseAction(ItemStack stack) { if (stack.hasTagCompound()) { Recipe recipe = getRecipeFromMeal(getEnumFromStack(stack)); return recipe == null ? EnumAction.NONE : recipe.getAction(); } else return EnumAction.NONE; } @Override public ActionResult<ItemStack> onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) { if (player.canEat(false)) { player.setActiveHand(hand); return new ActionResult<>(EnumActionResult.SUCCESS, stack); } else { return new ActionResult<>(EnumActionResult.FAIL, stack); } } public ItemStack getCreativeStack(Meal meal, int amount) { Recipe recipe = getRecipeFromMeal(meal); if (recipe != null) { ArrayList<IngredientStack> stacks = new ArrayList<>(); stacks.addAll(recipe.getRequired()); ItemStack stack = RecipeMaker.BUILDER.build(recipe, stacks).get(0); stack.stackSize = amount; return stack; } return null; } @Override public ItemStack getCreativeStack(Meal meal) { return getCreativeStack(meal, 1); } @Override public int getSortValue(ItemStack stack) { return 100; } @Override @SideOnly(Side.CLIENT) public void registerModels(Item item, String name) {} }