package squeek.applecore.api.hunger;
import squeek.applecore.api.AppleCoreAPI;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.FoodStats;
import net.minecraft.world.EnumDifficulty;
import net.minecraftforge.common.MinecraftForge;
import cpw.mods.fml.common.eventhandler.Cancelable;
import cpw.mods.fml.common.eventhandler.Event;
import static cpw.mods.fml.common.eventhandler.Event.Result;
import static cpw.mods.fml.common.eventhandler.Event.HasResult;
/**
* Base class for all StarvationEvent events.<br>
* <br>
* All children of this event are fired on the {@link MinecraftForge#EVENT_BUS}.
*/
public abstract class StarvationEvent extends Event
{
public final EntityPlayer player;
public StarvationEvent(EntityPlayer player)
{
this.player = player;
}
/**
* Fired each FoodStats update to determine whether or not starvation is allowed for the {@link #player}.
*
* This event is fired in {@link FoodStats#onUpdate}.<br>
* <br>
* This event is not {@link Cancelable}.<br>
* <br>
* This event uses the {@link Result}. {@link HasResult}<br>
* {@link Result#DEFAULT} will use the vanilla conditionals.
* {@link Result#ALLOW} will allow starvation without condition.
* {@link Result#DENY} will deny starvation without condition.
*/
@HasResult
public static class AllowStarvation extends StarvationEvent
{
public AllowStarvation(EntityPlayer player)
{
super(player);
}
}
/**
* Fired every time the starve tick period is retrieved to allow control over its value.
*
* This event is fired in {@link FoodStats#onUpdate} and in {@link AppleCoreAPI}.<br>
* <br>
* {@link #starveTickPeriod} contains the number of ticks between starvation damage being done.<br>
* <br>
* This event is not {@link Cancelable}.<br>
* <br>
* This event does not have a {@link Result}. {@link HasResult}<br>
*/
public static class GetStarveTickPeriod extends StarvationEvent
{
public int starveTickPeriod = 80;
public GetStarveTickPeriod(EntityPlayer player)
{
super(player);
}
}
/**
* Fired once the time since last starvation damage reaches starveTickPeriod (see {@link GetStarveTickPeriod}),
* in order to control how much starvation damage to do.
*
* This event is fired in {@link FoodStats#onUpdate}.<br>
* <br>
* {@link #starveDamage} contains the amount of damage to deal from starvation.<br>
* <br>
* This event is {@link Cancelable}.<br>
* If this event is canceled, it will skip dealing starvation damage.<br>
* <br>
* This event does not have a {@link Result}. {@link HasResult}<br>
*/
@Cancelable
public static class Starve extends StarvationEvent
{
public float starveDamage = 1f;
public Starve(EntityPlayer player)
{
super(player);
EnumDifficulty difficulty = player.worldObj.difficultySetting;
boolean shouldDoDamage = player.getHealth() > 10.0F || difficulty == EnumDifficulty.HARD || player.getHealth() > 1.0F && difficulty == EnumDifficulty.NORMAL;
if (!shouldDoDamage)
starveDamage = 0f;
}
}
}