package net.glowstone.entity; import com.flowpowered.network.Message; import net.glowstone.entity.meta.MetadataIndex; import net.glowstone.entity.meta.MetadataMap; import net.glowstone.net.message.play.entity.EntityMetadataMessage; import net.glowstone.net.message.play.player.InteractEntityMessage; import net.glowstone.util.SoundUtil; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Ageable; import org.bukkit.entity.EntityType; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.SpawnEggMeta; 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; private boolean ageLocked; private int forcedAge; private int inLove; private GlowAgeable parent; /** * Creates a new ageable creature. * * @param location The location of the creature. * @param type The type of monster. * @param maxHealth The max health of the creature. */ public GlowAgeable(Location location, EntityType type, double maxHealth) { super(location, type, maxHealth); } @Override public void pulse() { super.pulse(); if (ageLocked) { setScaleForAge(!isAdult()); } else { int currentAge = age; if (currentAge < AGE_ADULT) { currentAge++; setAge(currentAge); } else if (currentAge > AGE_ADULT) { currentAge--; setAge(currentAge); } } } @Override public final int getAge() { return age; } @Override public final void setAge(int age) { this.age = age; setScaleForAge(isAdult()); } @Override public final boolean getAgeLock() { return 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 age >= AGE_ADULT; } @Override public final boolean canBreed() { return 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_ISBABY, !isAdult()); messages.add(new EntityMetadataMessage(id, map.getEntryList())); return messages; } protected final void setScale(float scale) { setSize(height * scale, width * scale); } public int getForcedAge() { return forcedAge; } public void setForcedAge(int forcedAge) { this.forcedAge = forcedAge; } public int getInLove() { return inLove; } public void setInLove(int inLove) { this.inLove = inLove; } @Override public boolean entityInteract(GlowPlayer player, InteractEntityMessage message) { super.entityInteract(player, message); ItemStack item = player.getItemInHand(); // Spawn eggs are used to spawn babies if (item != null && item.getType() == Material.MONSTER_EGG && item.hasItemMeta()) { SpawnEggMeta meta = (SpawnEggMeta) item.getItemMeta(); if (meta.hasSpawnedType() && meta.getSpawnedType() == this.getType()) { this.createBaby(); if (player.getGameMode() == GameMode.SURVIVAL || player.getGameMode() == GameMode.ADVENTURE) { // Consume the egg if (item.getAmount() > 1) { item.setAmount(item.getAmount() - 1); } else { player.getInventory().clear(player.getInventory().getHeldItemSlot()); } } return true; } } return false; } @Override public Ageable createBaby() { Class<? extends GlowEntity> spawn = EntityRegistry.getEntity(getType()); GlowAgeable ageable = (GlowAgeable) getWorld().spawn(getLocation(), spawn, CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); ageable.setBaby(); ageable.setParent(this); return ageable; } @Override public Ageable getParent() { return parent; } @Override public void setParent(Ageable parent) { this.parent = (GlowAgeable) parent; } @Override protected float getSoundPitch() { if (!isAdult()) { return SoundUtil.randomReal(0.2F) + 1.5F; } return super.getSoundPitch(); } }