Package net.aufdemrand.denizen.objects.properties.entity

Source Code of net.aufdemrand.denizen.objects.properties.entity.EntityAge

package net.aufdemrand.denizen.objects.properties.entity;

import net.aufdemrand.denizen.objects.*;
import net.aufdemrand.denizen.objects.properties.Property;
import net.aufdemrand.denizen.tags.Attribute;
import net.aufdemrand.denizen.utilities.debugging.dB;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.trait.Age;
import org.bukkit.entity.*;

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.isNPC()) {
            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.isNPC()) {
            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() {
        if (isBaby())
            return "baby" + (getLock() ? "|locked": "");
        else if (ageable.getBukkitEntity().getType() != EntityType.ZOMBIE && getLock())
            return "adult|locked";
        else
            return null;
    }

    @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);
        }

    }
}
TOP

Related Classes of net.aufdemrand.denizen.objects.properties.entity.EntityAge

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.