From 8cabab9788f57a5a0783fa763798d853f6f71e69 Mon Sep 17 00:00:00 2001 From: Jeremy Schroeder Date: Sun, 20 Oct 2013 21:28:04 -0400 Subject: [PATCH] Add dEntity Properties 'infected, age, profession, and framed' --- .../aufdemrand/denizen/objects/dEntity.java | 108 +++++------------ .../denizen/objects/properties/EntityAge.java | 37 +++--- .../objects/properties/EntityFramed.java | 111 ++++++++++++++++++ .../objects/properties/EntityInfected.java | 19 +-- ...rofessional.java => EntityProfession.java} | 21 ++-- .../denizen/objects/properties/ItemColor.java | 11 +- 6 files changed, 192 insertions(+), 115 deletions(-) create mode 100644 src/main/java/net/aufdemrand/denizen/objects/properties/EntityFramed.java rename src/main/java/net/aufdemrand/denizen/objects/properties/{EntityProfessional.java => EntityProfession.java} (68%) diff --git a/src/main/java/net/aufdemrand/denizen/objects/dEntity.java b/src/main/java/net/aufdemrand/denizen/objects/dEntity.java index 4022bca6cc..5bb3802189 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dEntity.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dEntity.java @@ -6,10 +6,7 @@ import net.aufdemrand.denizen.exceptions.CommandExecutionException; import net.aufdemrand.denizen.exceptions.InvalidArgumentsException; -import net.aufdemrand.denizen.objects.properties.EntityAge; -import net.aufdemrand.denizen.objects.properties.EntityInfected; -import net.aufdemrand.denizen.objects.properties.EntityProfessional; -import net.aufdemrand.denizen.objects.properties.Property; +import net.aufdemrand.denizen.objects.properties.*; import net.aufdemrand.denizen.scripts.ScriptEntry; import net.aufdemrand.denizen.scripts.ScriptRegistry; import net.aufdemrand.denizen.scripts.commands.AbstractCommand; @@ -373,8 +370,11 @@ public boolean isLivingEntity() { */ public NPC getNPC() { - - return npc; + if (npc != null) + return npc; + else if (entity != null && CitizensAPI.getNPCRegistry().isNPC(entity)) + return CitizensAPI.getNPCRegistry().getNPC(entity); + else return null; } /** @@ -384,8 +384,11 @@ public NPC getNPC() { */ public dNPC getDenizenNPC() { - - return new dNPC(npc); + if (npc != null) + return new dNPC(npc); + else if (entity != null && CitizensAPI.getNPCRegistry().isNPC(entity)) + return new dNPC(CitizensAPI.getNPCRegistry().getNPC(entity)); + else return null; } /** @@ -395,7 +398,9 @@ public dNPC getDenizenNPC() { */ public boolean isNPC() { - return npc != null; + if (npc != null) return true; + else if (entity != null && CitizensAPI.getNPCRegistry().isNPC(entity)) return true; + else return false; } /** @@ -506,7 +511,7 @@ public dInventory getInventory() { public dInventory getEquipment() { if (isLivingEntity()) return new dInventory(InventoryType.CRAFTING) - .add(getLivingEntity().getEquipment().getArmorContents()); + .add(getLivingEntity().getEquipment().getArmorContents()); else return null; } @@ -900,50 +905,6 @@ public int comparesTo(dEntity entity) { } - - /////////////// - // Properties - //////////// - - private List properties = new ArrayList(); - - public String describe() { - properties.clear(); - - StringBuilder property_string = new StringBuilder(); - - for (Property property : properties) - property_string.append(property.getPropertyString()); - - return identify() + '[' + property_string.toString() + ']'; - } - - public boolean isInfected() { - return EntityInfected.describes(this); - } - - public EntityInfected getInfected() { - return EntityInfected.getFrom(this); - } - - public boolean isProfessional() { - return EntityProfessional.describes(this); - } - - public EntityProfessional getProfessional() { - return EntityProfessional.getFrom(this); - } - - public boolean isAgeable() { - return EntityAge.describes(this); - } - - public EntityAge getAgeable() { - return EntityAge.getFrom(this); - } - - - ///////////////////// // dObject Methods /////////////////// @@ -1178,7 +1139,7 @@ public String getAttribute(Attribute attribute) { // if none. // --> else if (attribute.startsWith("equipment.chestplate") || - attribute.startsWith("equipment.chest")) { + attribute.startsWith("equipment.chest")) { if (getLivingEntity().getEquipment().getChestplate() != null) { return new dItem(getLivingEntity().getEquipment().getChestplate()) .getAttribute(attribute.fulfill(2)); @@ -1193,7 +1154,7 @@ else if (attribute.startsWith("equipment.chestplate") || // if none. // --> else if (attribute.startsWith("equipment.helmet") || - attribute.startsWith("equipment.head")) { + attribute.startsWith("equipment.head")) { if (getLivingEntity().getEquipment().getHelmet() != null) { return new dItem(getLivingEntity().getEquipment().getHelmet()) .getAttribute(attribute.fulfill(2)); @@ -1208,7 +1169,7 @@ else if (attribute.startsWith("equipment.helmet") || // if none. // --> else if (attribute.startsWith("equipment.leggings") || - attribute.startsWith("equipment.legs")) { + attribute.startsWith("equipment.legs")) { if (getLivingEntity().getEquipment().getLeggings() != null) { return new dItem(getLivingEntity().getEquipment().getLeggings()) .getAttribute(attribute.fulfill(2)); @@ -1236,7 +1197,7 @@ else if (attribute.startsWith("equipment")) { // if none. // --> if (attribute.startsWith("item_in_hand") || - attribute.startsWith("iteminhand")) + attribute.startsWith("iteminhand")) return new dItem(getLivingEntity().getEquipment().getItemInHand()) .getAttribute(attribute.fulfill(1)); @@ -1416,7 +1377,7 @@ else return new Element("null") // Otherwise, returns null. // --> if (attribute.startsWith("get_shooter") || - attribute.startsWith("shooter")) { + attribute.startsWith("shooter")) { if (isProjectile() && hasShooter()) return getShooter().getAttribute(attribute.fulfill(1)); else return new Element("null") @@ -1730,30 +1691,19 @@ else if ((float) getLivingEntity().getHealth() / maxHealth < 1) .getAttribute(attribute.fulfill(1)); - ///////////////////// // PROPERTY ATTRIBUTES ///////////////// - if (attribute.startsWith("infected")) { - if (EntityInfected.describes(this)) - return EntityInfected.getFrom(this) - .getAttribute(attribute.fulfill(1)); - else return Attribute.RETURN_NULL; - } - - if (attribute.startsWith("professional")) { - if (EntityProfessional.describes(this)) - return EntityProfessional.getFrom(this) - .getAttribute(attribute.fulfill(1)); - else return Attribute.RETURN_NULL; - } + if (attribute.startsWith("describe")) + return new Element("e@" + getEntityType().name().toLowerCase() + + '[' + PropertyParser.getPropertiesString(this) + ']') + .getAttribute(attribute.fulfill(1)); - if (attribute.startsWith("age")) { - if (EntityAge.describes(this)) - return EntityAge.getFrom(this) - .getAttribute(attribute.fulfill(1)); - else return Attribute.RETURN_NULL; + // Iterate through this object's properties' attributes + for (Property property : PropertyParser.getProperties(this)) { + String returned = property.getAttribute(attribute); + if (returned != null) return returned; } return new Element(identify()).getAttribute(attribute); @@ -1770,7 +1720,7 @@ public void adjust(Mechanism mechanism, Element value) { } if (mechanism.matches("remove_when_far_away")) - getLivingEntity().setRemoveWhenFarAway(value.asBoolean()); + getLivingEntity().setRemoveWhenFarAway(value.asBoolean()); if (mechanism.matches("custom_name")) getLivingEntity().setCustomName(value.asString()); diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/EntityAge.java b/src/main/java/net/aufdemrand/denizen/objects/properties/EntityAge.java index 3b95fafd2a..055e538b72 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/EntityAge.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/EntityAge.java @@ -3,22 +3,25 @@ import net.aufdemrand.denizen.objects.Element; import net.aufdemrand.denizen.objects.dEntity; +import net.aufdemrand.denizen.objects.dObject; 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(dEntity entity) { - return (entity.getBukkitEntity() instanceof Ageable) - || entity.getBukkitEntity().getType() == EntityType.ZOMBIE; + 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(dEntity entity) { + public static EntityAge getFrom(dObject entity) { if (!describes(entity)) return null; - - else return new EntityAge(entity); + else return new EntityAge((dEntity) entity); } @@ -41,9 +44,12 @@ public boolean isBaby() { } public void setBaby(boolean bool) { + dB.log(ageable.isNPC() + " <--- is NPC?"); if (ageable.isNPC()) { NPC ageable_npc = ageable.getNPC(); - ageable_npc.getTrait(Age.class).setAge(bool ? 0 : 1); + if (!ageable_npc.hasTrait(Age.class)) + ageable_npc.addTrait(Age.class); + ageable_npc.getTrait(Age.class).setAge(bool ? -24000 : 1); } else { if (ageable.getBukkitEntity().getType() == EntityType.ZOMBIE) @@ -71,10 +77,10 @@ public void setAge(int val) { } public int getAge() { - if (ageable.getBukkitEntity().getType() == EntityType.ZOMBIE) - return ((Zombie) ageable.getBukkitEntity()).isBaby() ? 0 : 1; - else - return ((Ageable) ageable.getBukkitEntity()).getAge(); + if (ageable.getBukkitEntity().getType() == EntityType.ZOMBIE) + return ((Zombie) ageable.getBukkitEntity()).isBaby() ? 0 : 1; + else + return ((Ageable) ageable.getBukkitEntity()).getAge(); } public void setLock(boolean bool) { @@ -95,7 +101,10 @@ public boolean getLock() { @Override public String getPropertyString() { - return getPropertyId() + '=' + getAge() + ';'; + if (getAge() != 1) + return getPropertyId() + '=' + (getAge() == 0 + ? "baby" : getAge() + ';'); + else return PropertyParser.NONE; } @Override @@ -119,7 +128,7 @@ public String getAttribute(Attribute attribute) { // @description // If the entity is ageable, returns the entity's age number. // --> - if (attribute.startsWith("is_baby")) + if (attribute.startsWith("age")) return new Element(getAge()) .getAttribute(attribute.fulfill(1)); @@ -134,7 +143,7 @@ public String getAttribute(Attribute attribute) { .getAttribute(attribute.fulfill(1)); - return new Element(getAge()).getAttribute(attribute); + return null; } } diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/EntityFramed.java b/src/main/java/net/aufdemrand/denizen/objects/properties/EntityFramed.java new file mode 100644 index 0000000000..fe3a27e4b1 --- /dev/null +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/EntityFramed.java @@ -0,0 +1,111 @@ +package net.aufdemrand.denizen.objects.properties; + + +import net.aufdemrand.denizen.objects.Element; +import net.aufdemrand.denizen.objects.dEntity; +import net.aufdemrand.denizen.objects.dItem; +import net.aufdemrand.denizen.objects.dObject; +import net.aufdemrand.denizen.tags.Attribute; +import org.bukkit.Rotation; +import org.bukkit.entity.*; + +public class EntityFramed implements Property { + + public static boolean describes(dObject entity) { + if (!(entity instanceof dEntity)) return false; + return ((dEntity) entity).getEntityType() == EntityType.ITEM_FRAME; + } + + public static EntityFramed getFrom(dObject entity) { + if (!describes(entity)) return null; + else return new EntityFramed((dEntity) entity); + } + + + /////////////////// + // Instance Fields and Methods + ///////////// + + private EntityFramed(dEntity item) { + item_frame = item; + } + + dEntity item_frame; + + public boolean hasItem() { + return getItemFrameEntity().getItem() != null; + } + + public ItemFrame getItemFrameEntity() { + return (ItemFrame) item_frame.getBukkitEntity(); + } + + public void setItem(dItem item) { + getItemFrameEntity().setItem(item.getItemStack()); + } + + public dItem getItem() { + return new dItem(getItemFrameEntity().getItem()); + } + + + ///////// + // Property Methods + /////// + + @Override + public String getPropertyString() { + return getPropertyId() + '=' + getItem().getMaterial().identify() + + (getItemFrameEntity().getRotation() == Rotation.NONE ? ';' + : '|' + getItemFrameEntity().getRotation().name().toLowerCase() + ';'); + } + + @Override + public String getPropertyId() { + return "framed"; + } + + + /////////// + // dObject Attributes + //////// + + @Override + public String getAttribute(Attribute attribute) { + + if (attribute == null) return "null"; + + // <--[tag] + // @attribute + // @returns dItem + // @description + // returns the material currently framed if the entity is an item frame. + // --> + if (attribute.startsWith("framed_item")) + return getItem() + .getAttribute(attribute.fulfill(1)); + + // <--[tag] + // @attribute + // @returns Element(Boolean) + // @description + // returns true if the entity is an item frame that has an item. + // --> + if (attribute.startsWith("has_framed_item")) + return new Element(hasItem()) + .getAttribute(attribute.fulfill(1)); + + // <--[tag] + // @attribute + // @returns Element + // @description + // returns the rotation of the material currently framed if the entity is an item frame. + // --> + if (attribute.startsWith("framed_item_rotation")) + return new Element(getItemFrameEntity().getRotation().name().toLowerCase()) + .getAttribute(attribute.fulfill(1)); + + return null; + } + +} diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/EntityInfected.java b/src/main/java/net/aufdemrand/denizen/objects/properties/EntityInfected.java index 17ff3b345f..4bc5f68ff4 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/EntityInfected.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/EntityInfected.java @@ -3,6 +3,7 @@ import net.aufdemrand.denizen.objects.Element; import net.aufdemrand.denizen.objects.dEntity; +import net.aufdemrand.denizen.objects.dObject; import net.aufdemrand.denizen.tags.Attribute; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.trait.ZombieModifier; @@ -13,15 +14,16 @@ public class EntityInfected implements Property { - public static boolean describes(dEntity entity) { - return entity.getEntityType() == EntityType.ZOMBIE - || entity.getEntityType() == EntityType.VILLAGER; + public static boolean describes(dObject entity) { + if (!(entity instanceof dEntity)) return false; + // Check if a Villager or Zombie -- the only two EntityTypes that can be 'infected' + return ((dEntity) entity).getEntityType() == EntityType.ZOMBIE + || ((dEntity) entity).getEntityType() == EntityType.VILLAGER; } - public static EntityInfected getFrom(dEntity entity) { + public static EntityInfected getFrom(dObject entity) { if (!describes(entity)) return null; - - else return new EntityInfected(entity); + else return new EntityInfected((dEntity)entity); } @@ -85,7 +87,10 @@ else if (infected.getBukkitEntity() instanceof Zombie) { @Override public String getPropertyString() { - return getPropertyId() + '=' + isInfected() + ';'; + if (isInfected()) + return getPropertyId(); + // Don't describe if not infected.. this is unnecessary. + else return PropertyParser.NONE; } @Override diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/EntityProfessional.java b/src/main/java/net/aufdemrand/denizen/objects/properties/EntityProfession.java similarity index 68% rename from src/main/java/net/aufdemrand/denizen/objects/properties/EntityProfessional.java rename to src/main/java/net/aufdemrand/denizen/objects/properties/EntityProfession.java index 2657303d79..dba034b13f 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/EntityProfessional.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/EntityProfession.java @@ -3,21 +3,24 @@ import net.aufdemrand.denizen.objects.Element; import net.aufdemrand.denizen.objects.dEntity; +import net.aufdemrand.denizen.objects.dObject; import net.aufdemrand.denizen.tags.Attribute; import org.bukkit.entity.EntityType; import org.bukkit.entity.Villager; -public class EntityProfessional implements Property { +public class EntityProfession implements Property { - public static boolean describes(dEntity entity) { - return entity.getEntityType() == EntityType.VILLAGER; + public static boolean describes(dObject entity) { + if (!(entity instanceof dEntity)) return false; + // Check if the entity is a Villager, the only EntityType that can be a Professional + return ((dEntity) entity).getEntityType() == EntityType.VILLAGER; } - public static EntityProfessional getFrom(dEntity entity) { + public static EntityProfession getFrom(dObject entity) { if (!describes(entity)) return null; - else return new EntityProfessional(entity); + else return new EntityProfession((dEntity) entity); } @@ -25,7 +28,7 @@ public static EntityProfessional getFrom(dEntity entity) { // Instance Fields and Methods ///////////// - private EntityProfessional(dEntity entity) { + private EntityProfession(dEntity entity) { professional = entity; } @@ -49,12 +52,12 @@ public void setProfession(Villager.Profession profession) { @Override public String getPropertyString() { - return getPropertyId() + '=' + getProfession() + ';'; + return getPropertyId() + '=' + getProfession().name().toLowerCase() + ';'; } @Override public String getPropertyId() { - return "professional"; + return "profession"; } @@ -75,7 +78,7 @@ public String getAttribute(Attribute attribute) { // Currently, only Villager-type entities can have professions. // --> if (attribute.startsWith("profession")) - return new Element(getProfession().name()) + return new Element(getProfession().name().toLowerCase()) .getAttribute(attribute.fulfill(1)); return null; diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/ItemColor.java b/src/main/java/net/aufdemrand/denizen/objects/properties/ItemColor.java index eaab2e2862..383f92b9e9 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/ItemColor.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/ItemColor.java @@ -3,25 +3,24 @@ import net.aufdemrand.denizen.objects.dColor; import net.aufdemrand.denizen.objects.dItem; +import net.aufdemrand.denizen.objects.dObject; import net.aufdemrand.denizen.tags.Attribute; import org.bukkit.Color; import org.bukkit.material.Colorable; public class ItemColor implements Property { - public static boolean describes(dItem item) { - return item.getItemStack() instanceof Colorable; + public static boolean describes(dObject item) { + if (!(item instanceof dItem)) return false; + return ((dItem) item).getItemStack() instanceof Colorable; } public static ItemColor getFrom(dItem item) { if (!describes(item)) return null; - else return new ItemColor(item); } - - private ItemColor(dItem item) { colorable = item; } @@ -39,7 +38,7 @@ public String getAttribute(Attribute attribute) { if (attribute == null) return "null"; - return color.getAttribute(attribute.fulfill(1)); + return "null"; }