package net.aufdemrand.denizen.objects.properties.entity; import net.aufdemrand.denizen.objects.dEntity; import net.aufdemrand.denizen.utilities.debugging.dB; import net.aufdemrand.denizencore.objects.Element; import net.aufdemrand.denizencore.objects.Mechanism; import net.aufdemrand.denizencore.objects.dList; import net.aufdemrand.denizencore.objects.dObject; import net.aufdemrand.denizencore.objects.properties.Property; import net.aufdemrand.denizencore.tags.Attribute; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.trait.Age; import org.bukkit.entity.Ageable; import org.bukkit.entity.EntityType; import org.bukkit.entity.Zombie; public class EntityAge implements Property { public static boolean describes(dObject entity) { if (!(entity instanceof dEntity)) { return false; } // Check if entity is Ageable, or a Zombie return (((dEntity) entity).getBukkitEntity() instanceof Ageable) || ((dEntity) entity).getBukkitEntity().getType() == EntityType.ZOMBIE; } public static EntityAge getFrom(dObject entity) { if (!describes(entity)) { return null; } else { return new EntityAge((dEntity) entity); } } /////////////////// // Instance Fields and Methods ///////////// private EntityAge(dEntity entity) { ageable = entity; } dEntity ageable; public boolean isBaby() { if (ageable.getBukkitEntity().getType() == EntityType.ZOMBIE) { return ((Zombie) ageable.getBukkitEntity()).isBaby(); } else { return !((Ageable) ageable.getBukkitEntity()).isAdult(); } } public void setBaby(boolean bool) { if (ageable.isCitizensNPC()) { NPC ageable_npc = ageable.getDenizenNPC().getCitizen(); if (!ageable_npc.hasTrait(Age.class)) { ageable_npc.addTrait(Age.class); } ageable_npc.getTrait(Age.class).setAge(bool ? -24000 : 0); } else { if (ageable.getBukkitEntity().getType() == EntityType.ZOMBIE) { ((Zombie) ageable.getBukkitEntity()).setBaby(bool); } else if (bool) { ((Ageable) ageable.getBukkitEntity()).setBaby(); } else { ((Ageable) ageable.getBukkitEntity()).setAdult(); } } } public void setAge(int val) { if (ageable.isCitizensNPC()) { NPC ageable_npc = ageable.getDenizenNPC().getCitizen(); ageable_npc.getTrait(Age.class).setAge(val); } else { if (ageable.getBukkitEntity().getType() == EntityType.ZOMBIE) { ((Zombie) ageable.getBukkitEntity()).setBaby(val >= 0); } else { ((Ageable) ageable.getBukkitEntity()).setAge(val); } } } public int getAge() { if (ageable.getBukkitEntity().getType() == EntityType.ZOMBIE) { return ((Zombie) ageable.getBukkitEntity()).isBaby() ? -24000 : 0; } else { return ((Ageable) ageable.getBukkitEntity()).getAge(); } } public void setLock(boolean bool) { if (ageable.getBukkitEntity().getType() != EntityType.ZOMBIE) { ((Ageable) ageable.getBukkitEntity()).setAgeLock(bool); } } public boolean getLock() { return ageable.getBukkitEntity().getType() == EntityType.ZOMBIE || ((Ageable) ageable.getBukkitEntity()).getAgeLock(); } ///////// // Property Methods /////// @Override public String getPropertyString() { return getAge() + (getLock() ? "|locked" : ""); } @Override public String getPropertyId() { return "age"; } /////////// // dObject Attributes //////// @Override public String getAttribute(Attribute attribute) { if (attribute == null) { return null; } // <--[tag] // @attribute <e@entity.age> // @returns Element(Number) // @mechanism dEntity.age // @group properties // @description // If the entity is ageable, returns the entity's age number (-24000 to 0) // --> if (attribute.startsWith("age")) { return new Element(getAge()) .getAttribute(attribute.fulfill(1)); } // <--[tag] // @attribute <e@entity.is_age_locked> // @returns Element(Boolean) // @mechanism dEntity.age_lock // @group properties // @description // If the entity is ageable, returns whether the entity is age locked. // --> if (attribute.startsWith("is_age_locked")) { return new Element(getLock()) .getAttribute(attribute.fulfill(1)); } // <--[tag] // @attribute <e@entity.is_baby> // @returns Element(Boolean) // @mechanism dEntity.age // @group properties // @description // If the entity is ageable, returns whether the entity is a baby. // --> if (attribute.startsWith("is_baby")) { return new Element(isBaby()) .getAttribute(attribute.fulfill(1)); } return null; } @Override public void adjust(Mechanism mechanism) { // <--[mechanism] // @object dEntity // @name age_lock // @input Element(Boolean) // @description // Sets whether the entity is locked into its current age. // Also available: <@link mechanism dEntity.age> // @tags // <e@entity.age> // <e@entity.is_baby> // <e@entity.is_age_locked> // <e@entity.is_ageable> // --> if (mechanism.matches("age_lock") && mechanism.requireBoolean()) { setLock(mechanism.getValue().asBoolean()); } // <--[mechanism] // @object dEntity // @name age // @input Element // @description // Sets the entity's age. // Inputs can be 'baby', 'adult', or a valid age number (-24000 to 0) // Optionally, add '|locked' or 'unlocked' to lock/unlock the entity into/from the current age. // (EG, age:baby|locked or age:-24000|unlocked) // Also available: <@link mechanism dEntity.age_lock> // @tags // <e@entity.age> // <e@entity.is_baby> // <e@entity.is_age_locked> // <e@entity.is_ageable> // --> if (mechanism.matches("age")) { dList list = mechanism.getValue().asType(dList.class); if (list.size() == 0) { dB.echoError("Missing value for 'age' mechanism!"); return; } if (list.get(0).equalsIgnoreCase("baby")) { setBaby(true); } else if (list.get(0).equalsIgnoreCase("adult")) { setBaby(false); } else if (new Element(list.get(0)).isInt()) { setAge(new Element(list.get(0)).asInt()); } if (list.size() > 1 && list.get(1).equalsIgnoreCase("locked")) { setLock(true); } else if (list.size() > 1 && list.get(1).equalsIgnoreCase("unlocked")) { setLock(false); } } } }