package net.glowstone.entity; import com.flowpowered.networking.Message; import net.glowstone.entity.meta.MetadataIndex; import net.glowstone.entity.meta.MetadataMap; import net.glowstone.net.message.play.entity.EntityMetadataMessage; import org.bukkit.Location; import org.bukkit.entity.Ageable; import org.bukkit.entity.EntityType; import java.util.List; /** * Represents a creature that ages, such as a sheep. */ public class GlowAgeable extends GlowCreature implements Ageable { private static final int AGE_BABY = -24000; private static final int AGE_ADULT = 0; private static final int BREEDING_AGE = 6000; protected float width, height; private int age = 0; private boolean ageLocked = false; /** * Creates a new ageable monster. * @param location The location of the monster. * @param type The type of monster. */ public GlowAgeable(Location location, EntityType type) { super(location, type); } @Override public void pulse() { super.pulse(); if (this.ageLocked) { setScaleForAge(!isAdult()); } else { int currentAge = this.age; if (currentAge < AGE_ADULT) { currentAge++; setAge(currentAge); } else if (currentAge > AGE_ADULT) { currentAge--; setAge(currentAge); } } } @Override public final int getAge() { return this.age; } @Override public final void setAge(int age) { this.age = age; this.setScaleForAge(isAdult()); } @Override public final boolean getAgeLock() { return this.ageLocked; } @Override public final void setAgeLock(boolean ageLocked) { this.ageLocked = ageLocked; } @Override public final void setBaby() { if (isAdult()) { setAge(AGE_BABY); } } @Override public final void setAdult() { if (!isAdult()) { setAge(AGE_ADULT); } } @Override public final boolean isAdult() { return this.age >= AGE_ADULT; } @Override public final boolean canBreed() { return this.age == AGE_ADULT; } @Override public void setBreed(boolean breed) { if (breed) { setAge(AGE_ADULT); } else if (isAdult()) { setAge(BREEDING_AGE); } } public void setScaleForAge(boolean isAdult) { setScale(isAdult ? 1.0F : 0.5F); } @Override public List<Message> createSpawnMessage() { List<Message> messages = super.createSpawnMessage(); MetadataMap map = new MetadataMap(GlowAgeable.class); map.set(MetadataIndex.AGE, this.getAge()); messages.add(new EntityMetadataMessage(id, map.getEntryList())); return messages; } protected final void setScale(float scale) { setSize(this.height * scale, this.width * scale); } }