From d2bbceb1666507611fea0defa1ed320e92891867 Mon Sep 17 00:00:00 2001 From: Morphan1 Date: Wed, 11 Feb 2015 22:34:35 -0500 Subject: [PATCH] Restructure the Denizen entity system Yay! Custom entity possibilities! --- .../EntityTeleportScriptEvent.java | 2 +- .../scriptevents/VehicleMoveScriptEvent.java | 2 +- .../aufdemrand/denizen/objects/dEntity.java | 122 ++++++++++++------ .../aufdemrand/denizen/objects/dLocation.java | 10 +- .../net/aufdemrand/denizen/objects/dNPC.java | 2 +- .../aufdemrand/denizen/objects/dPlayer.java | 2 +- .../properties/entity/EntityAngry.java | 2 +- .../properties/entity/EntityColor.java | 6 +- .../properties/entity/EntityCritical.java | 2 +- .../properties/entity/EntityElder.java | 2 +- .../properties/entity/EntityFirework.java | 2 +- .../properties/entity/EntityFramed.java | 2 +- .../properties/entity/EntityInfected.java | 4 +- .../objects/properties/entity/EntityItem.java | 4 +- .../properties/entity/EntityJumpStrength.java | 2 +- .../properties/entity/EntityKnockback.java | 2 +- .../properties/entity/EntityPainting.java | 2 +- .../properties/entity/EntityPotion.java | 2 +- .../properties/entity/EntityPowered.java | 2 +- .../properties/entity/EntityProfession.java | 2 +- .../properties/entity/EntityRotation.java | 4 +- .../properties/entity/EntitySitting.java | 10 +- .../properties/entity/EntitySkeleton.java | 2 +- .../commands/entity/RemoveCommand.java | 3 +- .../scripts/commands/entity/ShootCommand.java | 16 +-- .../commands/entity/TeleportCommand.java | 2 +- .../scripts/commands/npc/CreateCommand.java | 2 +- .../commands/player/StatisticCommand.java | 2 +- .../core/BukkitWorldScriptHelper.java | 2 +- .../utilities/entity/DenizenEntityType.java | 120 +++++++++++++++++ .../denizen/utilities/entity/Gravity.java | 90 +++---------- 31 files changed, 258 insertions(+), 171 deletions(-) create mode 100644 src/main/java/net/aufdemrand/denizen/utilities/entity/DenizenEntityType.java diff --git a/src/main/java/net/aufdemrand/denizen/events/scriptevents/EntityTeleportScriptEvent.java b/src/main/java/net/aufdemrand/denizen/events/scriptevents/EntityTeleportScriptEvent.java index 266406810d..ffc264ff80 100644 --- a/src/main/java/net/aufdemrand/denizen/events/scriptevents/EntityTeleportScriptEvent.java +++ b/src/main/java/net/aufdemrand/denizen/events/scriptevents/EntityTeleportScriptEvent.java @@ -72,7 +72,7 @@ public boolean couldMatch(ScriptContainer scriptContainer, String s) { @Override public boolean matches(ScriptContainer scriptContainer, String s) { String lower = s.toLowerCase(); - String ename = entity.getEntityType().name().toLowerCase(); + String ename = entity.getEntityType().getLowercaseName(); String ename2 = entity.identifySimple().substring(2); String ename3 = entity.identifySimpleType(); return lower.startsWith(ename + " teleports") diff --git a/src/main/java/net/aufdemrand/denizen/events/scriptevents/VehicleMoveScriptEvent.java b/src/main/java/net/aufdemrand/denizen/events/scriptevents/VehicleMoveScriptEvent.java index 1ec739b939..a86dc8057a 100644 --- a/src/main/java/net/aufdemrand/denizen/events/scriptevents/VehicleMoveScriptEvent.java +++ b/src/main/java/net/aufdemrand/denizen/events/scriptevents/VehicleMoveScriptEvent.java @@ -54,7 +54,7 @@ public boolean couldMatch(ScriptContainer scriptContainer, String s) { @Override public boolean matches(ScriptContainer scriptContainer, String s) { String lower = s.toLowerCase(); - String ename = vehicle.getEntityType().name().toLowerCase(); + String ename = vehicle.getEntityType().getLowercaseName(); String ename2 = vehicle.identifySimple().substring(2); String ename3 = vehicle.identifySimpleType(); return lower.startsWith(ename + " moves") diff --git a/src/main/java/net/aufdemrand/denizen/objects/dEntity.java b/src/main/java/net/aufdemrand/denizen/objects/dEntity.java index 359a015aef..0caf5f726e 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dEntity.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dEntity.java @@ -1,6 +1,8 @@ package net.aufdemrand.denizen.objects; +import net.aufdemrand.denizen.Denizen; import net.aufdemrand.denizen.npc.traits.HealthTrait; +import net.aufdemrand.denizen.utilities.entity.DenizenEntityType; import net.aufdemrand.denizen.utilities.entity.EntityMovement; import net.aufdemrand.denizencore.objects.*; import net.aufdemrand.denizencore.objects.properties.Property; @@ -39,6 +41,7 @@ import org.bukkit.util.Vector; import java.util.ArrayList; +import java.util.List; import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -99,7 +102,7 @@ public static dEntity valueOf(String string, TagContext context) { randomType = EntityType.values()[CoreUtilities.getRandom().nextInt(EntityType.values().length)]; } - return new dEntity(randomType, "RANDOM"); + return new dEntity(DenizenEntityType.getByName(randomType.name()), "RANDOM"); } /////// @@ -180,10 +183,9 @@ else if (entityGroup.matches("P@")) { data2 = m.group(3); } - for (EntityType type : EntityType.values()) { - if (type.name().equalsIgnoreCase(m.group(1))) - // Construct a new 'vanilla' unspawned dEntity - return new dEntity(type, data1, data2); + // Handle custom DenizenEntityTypes + if (DenizenEntityType.isRegistered(m.group(1))) { + return new dEntity(DenizenEntityType.getByName(m.group(1)), data1, data2); } } @@ -233,8 +235,8 @@ public static boolean matches(String arg) { m = entity_with_data.matcher(arg); if (m.matches()) { // Check first word with a valid entity_type (other groups are datas used in constructors) - for (EntityType type : EntityType.values()) - if (type.name().equals(m.group(1))) return true; + if (DenizenEntityType.isRegistered(m.group(1))) + return true; } // No luck otherwise! @@ -249,44 +251,78 @@ public static boolean matches(String arg) { public dEntity(Entity entity) { if (entity != null) { this.entity = entity; - EntityScript = EntityScriptHelper.getEntityScript(entity); + entityScript = EntityScriptHelper.getEntityScript(entity); this.uuid = entity.getUniqueId(); - this.entity_type = entity.getType(); + this.entity_type = DenizenEntityType.getByEntity(entity); if (Depends.citizens != null && net.citizensnpcs.api.CitizensAPI.getNPCRegistry().isNPC(entity)) { this.npc = new dNPC(net.citizensnpcs.api.CitizensAPI.getNPCRegistry().getNPC(entity)); } } else dB.echoError("Entity referenced is null!"); } + @Deprecated public dEntity(EntityType entityType) { if (entityType != null) { this.entity = null; - this.entity_type = entityType; + this.entity_type = DenizenEntityType.getByName(entityType.name()); } else dB.echoError("Entity_type referenced is null!"); } + @Deprecated public dEntity(EntityType entityType, ArrayList mechanisms) { this(entityType); this.mechanisms = mechanisms; } + @Deprecated public dEntity(EntityType entityType, String data1) { if (entityType != null) { this.entity = null; - this.entity_type = entityType; + this.entity_type = DenizenEntityType.getByName(entityType.name()); this.data1 = data1; } else dB.echoError("Entity_type referenced is null!"); } + @Deprecated public dEntity(EntityType entityType, String data1, String data2) { if (entityType != null) { this.entity = null; - this.entity_type = entityType; + this.entity_type = DenizenEntityType.getByName(entityType.name()); this.data1 = data1; this.data2 = data2; } else dB.echoError("Entity_type referenced is null!"); } + public dEntity(DenizenEntityType entityType) { + if (entityType != null) { + this.entity = null; + this.entity_type = entityType; + } else dB.echoError("DenizenEntityType referenced is null!"); + } + + public dEntity(DenizenEntityType entityType, ArrayList mechanisms) { + this(entityType); + this.mechanisms = mechanisms; + } + + public dEntity(DenizenEntityType entityType, String data1) { + if (entityType != null) { + this.entity = null; + this.entity_type = entityType; + this.data1 = data1; + } + else dB.echoError("DenizenEntityType referenced is null!"); + } + + public dEntity(DenizenEntityType entityType, String data1, String data2) { + if (entityType != null) { + this.entity = null; + this.entity_type = entityType; + this.data1 = data1; + this.data2 = data2; + } else dB.echoError("DenizenEntityType referenced is null!"); + } + public dEntity(dNPC npc) { if (Depends.citizens == null) { return; @@ -296,7 +332,7 @@ public dEntity(dNPC npc) { if (npc.isSpawned()) { this.entity = npc.getEntity(); - this.entity_type = npc.getEntity().getType(); + this.entity_type = DenizenEntityType.getByName(npc.getEntityType().name()); this.uuid = entity.getUniqueId(); } } else dB.echoError("NPC referenced is null!"); @@ -309,24 +345,28 @@ public dEntity(dNPC npc) { ///////////////// private Entity entity = null; - private EntityType entity_type = null; + private DenizenEntityType entity_type = null; private String data1 = null; private String data2 = null; private DespawnedEntity despawned_entity = null; private dNPC npc = null; private UUID uuid = null; - private String EntityScript = null; + private String entityScript = null; - public EntityType getEntityType() { + public DenizenEntityType getEntityType() { return entity_type; } - public void setEntityScript(String EntityScript) { - this.EntityScript = EntityScript; + public EntityType getBukkitEntityType() { + return entity_type.getBukkitEntityType(); + } + + public void setEntityScript(String entityScript) { + this.entityScript = entityScript; } public String getEntityScript() { - return EntityScript; + return entityScript; } /** @@ -538,7 +578,7 @@ public String getName() { if (customName != null) return customName; } - return entity_type.name(); + return entity_type.getName(); } /** @@ -663,7 +703,8 @@ public void spawnAt(Location location) { // TODO: Build entity from custom script } // Else, use the entity_type specified/remembered - else entity = location.getWorld().spawnEntity(location, entity_type); + else + entity = entity_type.spawnNewEntity(location); getLivingEntity().teleport(location); getLivingEntity().getEquipment().setArmorContents(despawned_entity.equipment); @@ -676,7 +717,7 @@ public void spawnAt(Location location) { org.bukkit.entity.Entity ent = null; - if (entity_type.name().matches("PLAYER")) { + if (entity_type.getName().equals("PLAYER")) { if (Depends.citizens == null) { dB.echoError("Cannot spawn entity of type PLAYER!"); return; @@ -688,7 +729,7 @@ public void spawnAt(Location location) { uuid = entity.getUniqueId(); } } - else if (entity_type.name().matches("FALLING_BLOCK")) { + else if (entity_type.getName().equals("FALLING_BLOCK")) { Material material = null; @@ -729,16 +770,13 @@ else if (entity_type.name().matches("FALLING_BLOCK")) { } else { - if (entity_type == EntityType.DROPPED_ITEM) - ent = location.getWorld().dropItem(location, new ItemStack(Material.STONE)); - else - ent = location.getWorld().spawnEntity(location, entity_type); + ent = entity_type.spawnNewEntity(location); entity = ent; uuid = entity.getUniqueId(); - if (EntityScript != null) - EntityScriptHelper.setEntityScript(entity, EntityScript); + if (entityScript != null) + EntityScriptHelper.setEntityScript(entity, entityScript); - if (entity_type.name().matches("PIG_ZOMBIE")) { + if (entity_type.getName().equals("PIG_ZOMBIE")) { // Give pig zombies golden swords by default, unless data2 specifies // a different weapon @@ -749,7 +787,7 @@ else if (entity_type.name().matches("FALLING_BLOCK")) { ((PigZombie) entity).getEquipment() .setItemInHand(dItem.valueOf(data1).getItemStack()); } - else if (entity_type.name().matches("SKELETON")) { + else if (entity_type.getName().equals("SKELETON")) { // Give skeletons bows by default, unless data2 specifies // a different weapon @@ -1029,8 +1067,8 @@ else if (isSpawned()) } // Try to identify as an entity script - if (EntityScript != null) - return "e@" + EntityScript; + if (entityScript != null) + return "e@" + entityScript; // Check if an entity_type is available if (entity_type != null) { @@ -1043,7 +1081,7 @@ else if (isSpawned()) if (properties.length() > 0) { propertyOutput = "[" + properties.substring(0, properties.length() - 1) + "]"; } - return "e@" + entity_type.name() + propertyOutput; + return "e@" + entity_type.getLowercaseName() + propertyOutput; } return "null"; @@ -1062,12 +1100,12 @@ public String identifySimple() { return "p@" + getPlayer().getName(); // Try to identify as an entity script - if (EntityScript != null) - return "e@" + EntityScript; + if (entityScript != null) + return "e@" + entityScript; // Check if an entity_type is available if (entity_type != null) - return "e@" + entity_type.name(); + return "e@" + entity_type.getLowercaseName(); return "null"; } @@ -1076,13 +1114,13 @@ public String identifySimple() { public String identifyType() { if (isNPC()) return "npc"; else if (isPlayer()) return "player"; - else return "e@" + entity_type.name(); + else return "e@" + entity_type.getName(); } public String identifySimpleType() { if (isNPC()) return "npc"; else if (isPlayer()) return "player"; - else return entity_type.name(); + else return entity_type.getLowercaseName(); } @Override @@ -1183,7 +1221,7 @@ public String getAttribute(Attribute attribute) { // Returns the type of the entity. // --> if (attribute.startsWith("entity_type")) { - return new Element(entity_type.name()).getAttribute(attribute.fulfill(1)); + return new Element(entity_type.getName()).getAttribute(attribute.fulfill(1)); } // <--[tag] @@ -1229,7 +1267,7 @@ public String getAttribute(Attribute attribute) { // Returns the name of the entity script that spawned this entity, if any. // --> if (attribute.startsWith("script")) { - return new Element(EntityScript == null ? "null": EntityScript) + return new Element(entityScript == null ? "null": entityScript) .getAttribute(attribute.fulfill(1)); } @@ -2058,7 +2096,7 @@ else if ((float) getLivingEntity().getHealth() / maxHealth < 1) // Returns the entity's full description, including all properties. // --> if (attribute.startsWith("describe")) - return new Element("e@" + getEntityType().name().toLowerCase() + return new Element("e@" + getEntityType().getLowercaseName() + PropertyParser.getPropertiesString(this)) .getAttribute(attribute.fulfill(1)); diff --git a/src/main/java/net/aufdemrand/denizen/objects/dLocation.java b/src/main/java/net/aufdemrand/denizen/objects/dLocation.java index 292a63ca8b..9e0bbd25dc 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dLocation.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dLocation.java @@ -3,6 +3,7 @@ import com.google.common.collect.Iterables; import com.mojang.authlib.GameProfile; import net.aufdemrand.denizen.Settings; +import net.aufdemrand.denizen.utilities.entity.DenizenEntityType; import net.aufdemrand.denizencore.objects.*; import net.aufdemrand.denizencore.objects.notable.Notable; import net.aufdemrand.denizen.objects.notable.NotableManager; @@ -495,8 +496,8 @@ public String getAttribute(Attribute attribute) { // --> if (attribute.startsWith("spawner_type")) { if (getBlock().getState() instanceof CreatureSpawner) { - return new dEntity(((CreatureSpawner) getBlock().getState()).getSpawnedType()) - .getAttribute(attribute.fulfill(1)); + return new dEntity(DenizenEntityType.getByName(((CreatureSpawner) getBlock().getState()) + .getSpawnedType().name())).getAttribute(attribute.fulfill(1)); } else return "null"; } @@ -971,8 +972,9 @@ else if (attribute.startsWith("entities") if (Utilities.checkLocation(this, entity.getLocation(), radius)) { dEntity current = new dEntity(entity); if (!ent_list.isEmpty()) { + String type = current.getEntityType().getName(); for (String ent : ent_list) { - if ((entity.getType().name().equals(ent) || + if ((type.equals(ent) || current.identify().equalsIgnoreCase(ent)) && entity.isValid()) { found.add(current); break; @@ -1565,7 +1567,7 @@ public void adjust(Mechanism mechanism) { // --> if (mechanism.matches("spawner_type") && mechanism.requireObject(dEntity.class) && getBlock().getState() instanceof CreatureSpawner) { - ((CreatureSpawner) getBlock().getState()).setSpawnedType(value.asType(dEntity.class).getEntityType()); + ((CreatureSpawner) getBlock().getState()).setSpawnedType(value.asType(dEntity.class).getBukkitEntityType()); } // <--[mechanism] diff --git a/src/main/java/net/aufdemrand/denizen/objects/dNPC.java b/src/main/java/net/aufdemrand/denizen/objects/dNPC.java index 8cf6286bf7..a2559fd1e3 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dNPC.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dNPC.java @@ -1014,7 +1014,7 @@ public void adjust(Mechanism mechanism) { // // --> if (mechanism.matches("set_entity_type") && mechanism.requireObject(dEntity.class)) { - getCitizen().setBukkitEntityType(value.asType(dEntity.class).getEntityType()); + getCitizen().setBukkitEntityType(value.asType(dEntity.class).getBukkitEntityType()); } // <--[mechanism] diff --git a/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java b/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java index 0f956813c0..0f13c665cc 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java @@ -1559,7 +1559,7 @@ else if (getPlayerEntity().getFoodLevel() / maxHunger < 1) return new Element(getPlayerEntity().getStatistic(statistic, ((dMaterial) obj).getMaterial())) .getAttribute(attribute.fulfill(2)); else if (obj instanceof dEntity) - return new Element(getPlayerEntity().getStatistic(statistic, ((dEntity) obj).getEntityType())) + return new Element(getPlayerEntity().getStatistic(statistic, ((dEntity) obj).getBukkitEntityType())) .getAttribute(attribute.fulfill(2)); else return null; diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityAngry.java b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityAngry.java index c49616fbdc..a149ac6d23 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityAngry.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityAngry.java @@ -12,7 +12,7 @@ public class EntityAngry implements Property { public static boolean describes(dObject entity) { - return entity instanceof dEntity && ((dEntity)entity).getEntityType() == EntityType.WOLF; + return entity instanceof dEntity && ((dEntity)entity).getBukkitEntityType() == EntityType.WOLF; } public static EntityAngry getFrom(dObject entity) { diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityColor.java b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityColor.java index d551c80590..3bd286658e 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityColor.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityColor.java @@ -14,7 +14,7 @@ public class EntityColor implements Property { public static boolean describes(dObject entity) { if (!(entity instanceof dEntity)) return false; - EntityType type = ((dEntity) entity).getEntityType(); + EntityType type = ((dEntity) entity).getBukkitEntityType(); return type == EntityType.SHEEP || type == EntityType.HORSE || type == EntityType.WOLF || @@ -40,7 +40,7 @@ private EntityColor(dEntity entity) { dEntity colored; private String getColor() { - EntityType type = colored.getEntityType(); + EntityType type = colored.getBukkitEntityType(); if (type == EntityType.HORSE) return ((Horse) colored.getBukkitEntity()).getColor().name() + "|" + @@ -156,7 +156,7 @@ public void adjust(Mechanism mechanism) { // --> if (mechanism.matches("color")) { - EntityType type = colored.getEntityType(); + EntityType type = colored.getBukkitEntityType(); if (type == EntityType.HORSE) { dList horse_info = mechanism.getValue().asType(dList.class); diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityCritical.java b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityCritical.java index 97d6a92770..2e81ce814f 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityCritical.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityCritical.java @@ -12,7 +12,7 @@ public class EntityCritical implements Property { public static boolean describes(dObject entity) { - return entity instanceof dEntity && ((dEntity)entity).getEntityType() == EntityType.ARROW; + return entity instanceof dEntity && ((dEntity)entity).getBukkitEntityType() == EntityType.ARROW; } public static EntityCritical getFrom(dObject entity) { diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityElder.java b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityElder.java index cad6e37f7c..f829fb9a7e 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityElder.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityElder.java @@ -12,7 +12,7 @@ public class EntityElder implements Property { public static boolean describes(dObject entity) { - return entity instanceof dEntity && ((dEntity)entity).getEntityType() == EntityType.GUARDIAN; + return entity instanceof dEntity && ((dEntity)entity).getBukkitEntityType() == EntityType.GUARDIAN; } public static EntityElder getFrom(dObject entity) { diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityFirework.java b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityFirework.java index d03acb68e7..8b72462f00 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityFirework.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityFirework.java @@ -16,7 +16,7 @@ public class EntityFirework implements Property { public static boolean describes(dObject entity) { - return entity instanceof dEntity && ((dEntity)entity).getEntityType() == EntityType.FIREWORK; + return entity instanceof dEntity && ((dEntity)entity).getBukkitEntityType() == EntityType.FIREWORK; } public static EntityFirework getFrom(dObject entity) { diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityFramed.java b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityFramed.java index 42aa90f7f3..a8730de44f 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityFramed.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityFramed.java @@ -13,7 +13,7 @@ public class EntityFramed implements Property { // TODO: Possibly merge class with EntityItem? public static boolean describes(dObject entity) { - return entity instanceof dEntity && ((dEntity) entity).getEntityType() == EntityType.ITEM_FRAME; + return entity instanceof dEntity && ((dEntity) entity).getBukkitEntityType() == EntityType.ITEM_FRAME; } public static EntityFramed getFrom(dObject entity) { diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityInfected.java b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityInfected.java index d25791173a..7403308f3e 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityInfected.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityInfected.java @@ -17,8 +17,8 @@ public class EntityInfected implements Property { 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; + return ((dEntity) entity).getBukkitEntityType() == EntityType.ZOMBIE + || ((dEntity) entity).getBukkitEntityType() == EntityType.VILLAGER; } public static EntityInfected getFrom(dObject entity) { diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityItem.java b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityItem.java index edc0a69682..180ad73c4b 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityItem.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityItem.java @@ -13,8 +13,8 @@ public class EntityItem implements Property { public static boolean describes(dObject entity) { return entity instanceof dEntity && - ( ((dEntity)entity).getEntityType() == EntityType.DROPPED_ITEM - || ((dEntity)entity).getEntityType() == EntityType.ENDERMAN); + ( ((dEntity)entity).getBukkitEntityType() == EntityType.DROPPED_ITEM + || ((dEntity)entity).getBukkitEntityType() == EntityType.ENDERMAN); } public static EntityItem getFrom(dObject entity) { diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityJumpStrength.java b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityJumpStrength.java index 2e82082bff..6c2f6700f9 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityJumpStrength.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityJumpStrength.java @@ -14,7 +14,7 @@ public class EntityJumpStrength implements Property { public static boolean describes(dObject entity) { return entity instanceof dEntity && - ((dEntity) entity).getEntityType() == EntityType.HORSE; + ((dEntity) entity).getBukkitEntityType() == EntityType.HORSE; } public static EntityJumpStrength getFrom(dObject entity) { diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityKnockback.java b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityKnockback.java index 17079a5efc..e62af8d659 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityKnockback.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityKnockback.java @@ -12,7 +12,7 @@ public class EntityKnockback implements Property { public static boolean describes(dObject entity) { - return entity instanceof dEntity && ((dEntity)entity).getEntityType() == EntityType.ARROW; + return entity instanceof dEntity && ((dEntity)entity).getBukkitEntityType() == EntityType.ARROW; } public static EntityKnockback getFrom(dObject entity) { diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityPainting.java b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityPainting.java index 641ac6ae3f..9f69ba3935 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityPainting.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityPainting.java @@ -13,7 +13,7 @@ public class EntityPainting implements Property { public static boolean describes(dObject entity) { - return entity instanceof dEntity && ((dEntity)entity).getEntityType() == EntityType.PAINTING; + return entity instanceof dEntity && ((dEntity)entity).getBukkitEntityType() == EntityType.PAINTING; } public static EntityPainting getFrom(dObject entity) { diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityPotion.java b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityPotion.java index 449ddc1956..8f30170e66 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityPotion.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityPotion.java @@ -13,7 +13,7 @@ public class EntityPotion implements Property { public static boolean describes(dObject entity) { if (!(entity instanceof dEntity)) return false; // Check if the entity is a SPLASH_POTION, the EntityType alias for ThrownPotion - return ((dEntity) entity).getEntityType() == EntityType.SPLASH_POTION; + return ((dEntity) entity).getBukkitEntityType() == EntityType.SPLASH_POTION; } public static EntityPotion getFrom(dObject entity) { diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityPowered.java b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityPowered.java index be4730d679..0d60502239 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityPowered.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityPowered.java @@ -12,7 +12,7 @@ public class EntityPowered implements Property { public static boolean describes(dObject entity) { - return entity instanceof dEntity && ((dEntity)entity).getEntityType() == EntityType.CREEPER; + return entity instanceof dEntity && ((dEntity)entity).getBukkitEntityType() == EntityType.CREEPER; } public static EntityPowered getFrom(dObject entity) { diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityProfession.java b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityProfession.java index df052e8810..62c0cac21f 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityProfession.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityProfession.java @@ -15,7 +15,7 @@ public class EntityProfession implements Property { 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; + return ((dEntity) entity).getBukkitEntityType() == EntityType.VILLAGER; } public static EntityProfession getFrom(dObject entity) { diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityRotation.java b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityRotation.java index e834ba6388..0f3cf42e54 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityRotation.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntityRotation.java @@ -16,8 +16,8 @@ public class EntityRotation implements Property { 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.PAINTING - || ((dEntity) entity).getEntityType() == EntityType.ITEM_FRAME; + return ((dEntity) entity).getBukkitEntityType() == EntityType.PAINTING + || ((dEntity) entity).getBukkitEntityType() == EntityType.ITEM_FRAME; } public static EntityRotation getFrom(dObject entity) { diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntitySitting.java b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntitySitting.java index d4774359f1..aad596aab3 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntitySitting.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntitySitting.java @@ -14,8 +14,8 @@ public class EntitySitting implements Property { public static boolean describes(dObject entity) { return entity instanceof dEntity && ( - ((dEntity)entity).getEntityType() == EntityType.WOLF - || ((dEntity)entity).getEntityType() == EntityType.OCELOT); + ((dEntity)entity).getBukkitEntityType() == EntityType.WOLF + || ((dEntity)entity).getBukkitEntityType() == EntityType.OCELOT); } public static EntitySitting getFrom(dObject entity) { @@ -40,7 +40,7 @@ private EntitySitting(dEntity entity) { @Override public String getPropertyString() { - if (entity.getEntityType() == EntityType.WOLF) { + if (entity.getBukkitEntityType() == EntityType.WOLF) { if (!((Wolf)entity.getBukkitEntity()).isSitting()) return null; else @@ -77,7 +77,7 @@ public String getAttribute(Attribute attribute) { // If the entity is a wolf or ocelot, returns whether the animal is sitting. // --> if (attribute.startsWith("sitting")) { - if (entity.getEntityType() == EntityType.WOLF) + if (entity.getBukkitEntityType() == EntityType.WOLF) return new Element(((Wolf)entity.getBukkitEntity()).isSitting()) .getAttribute(attribute.fulfill(1)); else @@ -102,7 +102,7 @@ public void adjust(Mechanism mechanism) { // --> if (mechanism.matches("sitting") && mechanism.requireBoolean()) { - if (entity.getEntityType() == EntityType.WOLF) + if (entity.getBukkitEntityType() == EntityType.WOLF) ((Wolf)entity.getBukkitEntity()).setSitting(mechanism.getValue().asBoolean()); else ((Ocelot)entity.getBukkitEntity()).setSitting(mechanism.getValue().asBoolean()); diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntitySkeleton.java b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntitySkeleton.java index 2a9e4d7f31..1d156c1778 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntitySkeleton.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/entity/EntitySkeleton.java @@ -12,7 +12,7 @@ public class EntitySkeleton implements Property { public static boolean describes(dObject entity) { - return entity instanceof dEntity && ((dEntity)entity).getEntityType() == EntityType.SKELETON; + return entity instanceof dEntity && ((dEntity)entity).getBukkitEntityType() == EntityType.SKELETON; } public static EntitySkeleton getFrom(dObject entity) { diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/entity/RemoveCommand.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/entity/RemoveCommand.java index 7f1c80d477..a6f8163f93 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/entity/RemoveCommand.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/entity/RemoveCommand.java @@ -1,6 +1,7 @@ package net.aufdemrand.denizen.scripts.commands.entity; import net.aufdemrand.denizen.BukkitScriptEntryData; +import net.aufdemrand.denizen.utilities.entity.DenizenEntityType; import net.aufdemrand.denizencore.exceptions.CommandExecutionException; import net.aufdemrand.denizencore.exceptions.InvalidArgumentsException; import net.aufdemrand.denizencore.objects.Element; @@ -115,7 +116,7 @@ public void execute(final ScriptEntry scriptEntry) throws CommandExecutionExcept // as our current dEntity, and all other applicable // conditions are met, remove it - if (entity.getEntityType().equals(worldEntity.getType())) { + if (entity.getEntityType().equals(DenizenEntityType.getByEntity(worldEntity))) { if (region != null) { dB.echoError(scriptEntry.getResidingQueue(), "Region support is deprecated!"); diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/entity/ShootCommand.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/entity/ShootCommand.java index e0611c91fe..3ffd5dd690 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/entity/ShootCommand.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/entity/ShootCommand.java @@ -240,21 +240,7 @@ public void execute(final ScriptEntry scriptEntry) throws CommandExecutionExcept final dEntity lastEntity = entities.get(entities.size() - 1); if (gravity == null) { - - String entityType = lastEntity.getEntityType().name(); - - for (Gravity defaultGravity : Gravity.values()) { - - if (defaultGravity.name().equals(entityType)) { - - gravity = new Element(defaultGravity.getGravity()); - } - } - - // If the gravity is still null, use a default value - if (gravity == null) { - gravity = new Element(0.115); - } + gravity = new Element(lastEntity.getEntityType().getGravity()); } if (speed == null) { diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/entity/TeleportCommand.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/entity/TeleportCommand.java index f5a8dccc5f..1c037dca29 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/entity/TeleportCommand.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/entity/TeleportCommand.java @@ -69,7 +69,7 @@ public void execute(final ScriptEntry scriptEntry) throws CommandExecutionExcept for (dEntity entity : entities) { // Call a Bukkit event for compatibility with "on entity teleports" // world event and other plugins - if (entity.isSpawned() && entity.getEntityType() != EntityType.PLAYER) + if (entity.isSpawned() && entity.getBukkitEntityType() != EntityType.PLAYER) Bukkit.getPluginManager().callEvent(new EntityTeleportEvent(entity.getBukkitEntity(), entity.getLocation(), location)); entity.spawnAt(location); } diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/npc/CreateCommand.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/npc/CreateCommand.java index 107cd766ab..d9f6435484 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/npc/CreateCommand.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/npc/CreateCommand.java @@ -60,7 +60,7 @@ public void execute(final ScriptEntry scriptEntry) throws CommandExecutionExcept } else { created = dNPC.mirrorCitizensNPC(CitizensAPI.getNPCRegistry() - .createNPC(type.getEntityType(), name.asString())); + .createNPC(type.getBukkitEntityType(), name.asString())); } // Add the created NPC into the script entry so it can be utilized if need be. diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/player/StatisticCommand.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/player/StatisticCommand.java index 8a443fe30f..b7d4ad6972 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/player/StatisticCommand.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/player/StatisticCommand.java @@ -116,7 +116,7 @@ public void execute(ScriptEntry scriptEntry) throws CommandExecutionException { break; case ENTITY: - EntityType ent = entity.getEntityType(); + EntityType ent = entity.getBukkitEntityType(); switch (act) { case ADD: for (dPlayer player : players.filter(dPlayer.class)) diff --git a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/BukkitWorldScriptHelper.java b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/BukkitWorldScriptHelper.java index a7e6cf91e6..e527fa3014 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/BukkitWorldScriptHelper.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/BukkitWorldScriptHelper.java @@ -3200,7 +3200,7 @@ public void playerEggThrow(PlayerEggThrowEvent event) { } else if (dEntity.matches(determination)) { event.setHatching(true); - event.setHatchingType(dEntity.valueOf(determination).getEntityType()); + event.setHatchingType(dEntity.valueOf(determination).getBukkitEntityType()); } } diff --git a/src/main/java/net/aufdemrand/denizen/utilities/entity/DenizenEntityType.java b/src/main/java/net/aufdemrand/denizen/utilities/entity/DenizenEntityType.java new file mode 100644 index 0000000000..eb15d01ab1 --- /dev/null +++ b/src/main/java/net/aufdemrand/denizen/utilities/entity/DenizenEntityType.java @@ -0,0 +1,120 @@ +package net.aufdemrand.denizen.utilities.entity; + +import net.aufdemrand.denizen.utilities.debugging.dB; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_8_R1.entity.CraftEntity; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +public class DenizenEntityType { + + private static final Map registeredTypes = new HashMap(); + private final EntityType bukkitEntityType; + private final String name; + private final String lowercaseName; + private final double gravity; + private final Method createMethod; + + static { + for (EntityType entityType : EntityType.values()) + registeredTypes.put(entityType.name(), new DenizenEntityType(entityType)); + } + + private DenizenEntityType(EntityType entityType) { + this.bukkitEntityType = entityType; + this.name = entityType.name(); + this.lowercaseName = name.toLowerCase(); + this.gravity = Gravity.getGravity(entityType); + this.createMethod = null; + } + + private DenizenEntityType(String name, Class entityType) { + this(name, entityType, 0.115); + } + + private DenizenEntityType(String name, Class entityType, double gravity) { + EntityType bukkitEntityType = EntityType.UNKNOWN; + if (entityType != null) { + for (EntityType type : EntityType.values()) { + Class clazz = type.getEntityClass(); + if (clazz != null && clazz.isAssignableFrom(entityType)) { + bukkitEntityType = type; + break; + } + } + } + this.bukkitEntityType = bukkitEntityType; + this.name = name.toUpperCase(); + this.lowercaseName = name.toLowerCase(); + this.gravity = gravity; + Method finalMethod = null; + if (entityType != null) { + for (Method method : entityType.getDeclaredMethods()) { + if (method.isAnnotationPresent(DenizenCustomEntity.CreateEntity.class)) { + finalMethod = method; + break; + } + } + } + this.createMethod = finalMethod; + } + + public Entity spawnNewEntity(Location location) { + try { + if (name.equals("DROPPED_ITEM")) + return location.getWorld().dropItem(location, new ItemStack(Material.STONE)); + else if (!isCustom()) + return location.getWorld().spawnEntity(location, bukkitEntityType); + else + return (Entity) createMethod.invoke(null, location); + } catch (Exception e) { + dB.echoError(e); + } + return null; + } + + public String getName() { + return this.name; + } + + public String getLowercaseName() { + return this.lowercaseName; + } + + public double getGravity() { + return this.gravity; + } + + public EntityType getBukkitEntityType() { + return bukkitEntityType; + } + + public static void registerEntityType(String name, Class entityType) { + registeredTypes.put(name.toUpperCase(), new DenizenEntityType(name, entityType)); + } + + public static boolean isRegistered(String name) { + return registeredTypes.containsKey(name.toUpperCase()); + } + + public static DenizenEntityType getByName(String name) { + return registeredTypes.get(name.toUpperCase()); + } + + public static DenizenEntityType getByEntity(Entity entity) { + if (entity instanceof DenizenCustomEntity) + return getByName(((DenizenCustomEntity) entity).getEntityTypeName()); + else + return getByName(entity.getType().name()); + } + + public boolean isCustom() { + return createMethod != null; + } +} diff --git a/src/main/java/net/aufdemrand/denizen/utilities/entity/Gravity.java b/src/main/java/net/aufdemrand/denizen/utilities/entity/Gravity.java index 1be6ef24c2..ae11ba9ca7 100644 --- a/src/main/java/net/aufdemrand/denizen/utilities/entity/Gravity.java +++ b/src/main/java/net/aufdemrand/denizen/utilities/entity/Gravity.java @@ -1,81 +1,21 @@ package net.aufdemrand.denizen.utilities.entity; -public enum Gravity { +import org.bukkit.entity.EntityType; - DROPPED_ITEM("Item", 0.115), - EXPERIENCE_ORB("XPOrb", 0.115), - LEASH_HITCH("LeashKnot", 0.115), - PAINTING("Painting", 0.115), - ARROW("Arrow", 0.118), - SNOWBALL("Snowball", 0.076), - FIREBALL("Fireball", 0.115), - SMALL_FIREBALL("SmallFireball", 0.115), - ENDER_PEARL("ThrownEnderpearl", 0.115), - ENDER_SIGNAL("EyeOfEnderSignal", 0.115), - THROWN_EXP_BOTTLE("ThrownExpBottle", 0.157), - ITEM_FRAME("ItemFrame", 0.115), - WITHER_SKULL("WitherSkull", 0.115), - PRIMED_TNT("PrimedTnt", 0.115), - FALLING_BLOCK("FallingSand", 0.115), - FIREWORK("FireworksRocketEntity", 0.115), - BOAT("Boat", 0.115), - MINECART("MinecartRideable", 0.115), - MINECART_CHEST("MinecartChest", 0.115), - MINECART_FURNACE("MinecartFurnace", 0.115), - MINECART_TNT("MinecartTNT", 0.115), - MINECART_HOPPER("MinecartHopper", 0.115), - MINECART_MOB_SPAWNER("MinecartMobSpawner", 0.115), - CREEPER("Creeper", 0.115), - SKELETON("Skeleton", 0.115), - SPIDER("Spider", 0.115), - GIANT("Giant", 0.115), - ZOMBIE("Zombie", 0.115), - SLIME("Slime", 0.115), - GHAST("Ghast", 0.115), - PIG_ZOMBIE("PigZombie", 0.115), - ENDERMAN("Enderman", 0.115), - CAVE_SPIDER("CaveSpider", 0.115), - SILVERFISH("Silverfish", 0.115), - BLAZE("Blaze", 0.115), - MAGMA_CUBE("LavaSlime", 0.115), - ENDER_DRAGON("EnderDragon", 0.115), - WITHER("WitherBoss", 0.115), - BAT("Bat", 0.115), - WITCH("Witch", 0.115), - PIG("Pig", 0.115), - SHEEP("Sheep", 0.115), - COW("Cow", 0.115), - CHICKEN("Chicken", 0.115), - SQUID("Squid", 0.115), - WOLF("Wolf", 0.115), - MUSHROOM_COW("MushroomCow", 0.115), - SNOWMAN("SnowMan", 0.115), - OCELOT("Ozelot", 0.115), - IRON_GOLEM("VillagerGolem", 0.115), - HORSE("EntityHorse", 0.115), - VILLAGER("Villager", 0.115), - ENDER_CRYSTAL("EnderCrystal", 0.115), - SPLASH_POTION(null, 0.115), - EGG(null, 0.074), - FISHING_HOOK(null, 0.115), - LIGHTNING(null, 0.115), - WEATHER(null, 0.115), - PLAYER(null, 0.115), - COMPLEX_PART(null, 0.115); +public class Gravity { - private String entityName; - private double gravity; - - Gravity(String entityName, double gravity) { - this.entityName = entityName; - this.gravity = gravity; - } - - public String getName() { - return entityName; - } - - public double getGravity() { - return gravity; + public static double getGravity(EntityType entityType) { + switch (entityType) { + case ARROW: + return 0.118; + case SNOWBALL: + return 0.076; + case THROWN_EXP_BOTTLE: + return 0.157; + case EGG: + return 0.074; + default: + return 0.115; + } } }