package net.minecraftforkage.internal; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.EnumAction; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.MinecraftForge; import squeek.applecore.api.IAppleCoreAccessor; import squeek.applecore.api.food.FoodEvent; import squeek.applecore.api.food.FoodValues; import squeek.applecore.api.food.IEdible; import squeek.applecore.api.hunger.ExhaustionEvent; import squeek.applecore.api.hunger.HealthRegenEvent; import squeek.applecore.api.hunger.StarvationEvent; public class AppleCoreAccessor implements IAppleCoreAccessor { @Override public boolean isFood(ItemStack food) { if (food == null) return false; // AppleCore does this Item item = food.getItem(); if(item == null) // AppleCore returns null throw new IllegalArgumentException("Argument is itemstack without item?"); EnumAction action = item.getItemUseAction(food); //// TODO: give items a way to alter this check //if(item instanceof ItemBlock || action == EnumAction.eat || action == EnumAction.drink) { // Actually, why even have that check? What non-edible items are there that have food values? // (TODO: confirm this check can be safely removed, then remove this comment block) if(getUnmodifiedFoodValues(food) != null) return true; //} return false; } @Override public FoodValues getFoodValues(ItemStack stack) { FoodValues originalValues = getUnmodifiedFoodValues(stack); // TODO: AppleCore does this, but what if an event listener wants to add food values to a non-food item? if(originalValues == null) return null; FoodEvent.GetFoodValues event = new FoodEvent.GetFoodValues(stack, originalValues); MinecraftForge.EVENT_BUS.post(event); return event.foodValues; } @Override public FoodValues getFoodValuesForPlayer(ItemStack stack, EntityPlayer player) { FoodValues originalValues = getUnmodifiedFoodValues(stack); // TODO: AppleCore does this, but what if an event listener wants to add food values to a non-food item? if(originalValues == null) return null; FoodEvent.GetPlayerFoodValues event = new FoodEvent.GetPlayerFoodValues(player, stack, originalValues); MinecraftForge.EVENT_BUS.post(event); return event.foodValues; } @Override public FoodValues getUnmodifiedFoodValues(ItemStack stack) { if (stack == null) return null; // AppleCore does this Item item = stack.getItem(); if(item == null) // AppleCore returns null throw new IllegalArgumentException("Argument is itemstack without item?"); if(item instanceof IEdible) return ((IEdible)item).getFoodValues(stack); if(item instanceof ItemFood) { // TODO: make ItemFood implement IEdible (or add IFood) ItemFood asIF = (ItemFood)item; return new FoodValues(asIF.func_150905_g(stack), asIF.func_150906_h(stack)); } if(item == Items.cake) // TODO: make cake item implement IEdible (or add IFood) return new FoodValues(2, 0.1f); return null; } private NBTTagCompound cachedTag = new NBTTagCompound(); @Override public float getExhaustion(EntityPlayer player) { return player.getFoodStats().getExhaustion(); } @Override public float getMaxExhaustion(EntityPlayer player) { ExhaustionEvent.GetMaxExhaustion event = new ExhaustionEvent.GetMaxExhaustion(player); MinecraftForge.EVENT_BUS.post(event); return event.maxExhaustionLevel; } @Override public int getHealthRegenTickPeriod(EntityPlayer player) { HealthRegenEvent.GetRegenTickPeriod event = new HealthRegenEvent.GetRegenTickPeriod(player); MinecraftForge.EVENT_BUS.post(event); return event.regenTickPeriod; } @Override public int getStarveDamageTickPeriod(EntityPlayer player) { StarvationEvent.GetStarveTickPeriod event = new StarvationEvent.GetStarveTickPeriod(player); MinecraftForge.EVENT_BUS.post(event); return event.starveTickPeriod; } }