diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java index e55a28c2f1..9dc5685ec1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java @@ -22,6 +22,8 @@ public abstract class EntityHelper { + public abstract double getDamageTo(LivingEntity attacker, Entity target); + public abstract String getRawHoverText(Entity entity); public List getDiscoveredRecipes(Player player) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java index 7ef6a9e719..89bf46acd9 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java @@ -14,7 +14,6 @@ public abstract class ItemHelper { - public abstract void removeRecipe(NamespacedKey key); public abstract void clearDenizenRecipes(); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java index db746a3f38..d0d57eaa4d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java @@ -2754,6 +2754,25 @@ public ObjectTag run(Attribute attribute, EntityTag object) { } }); + // <--[tag] + // @attribute )]> + // @returns ElementTag(Number) + // @group properties + // @description + // Returns the amount of damage the entity will do based on its held item. + // Optionally, specify a target entity to test how much damage will be done to that specific target (modified based on enchantments). + // --> + registerSpawnedOnlyTag("weapon_damage", new TagRunnable.ObjectForm() { + @Override + public ObjectTag run(Attribute attribute, EntityTag object) { + Entity target = null; + if (attribute.hasContext(1)) { + target = valueOf(attribute.getContext(1)).getBukkitEntity(); + } + return new ElementTag(NMSHandler.getEntityHelper().getDamageTo(object.getLivingEntity(), target)); + } + }); + // <--[tag] // @attribute // @returns ElementTag(Boolean) diff --git a/v1_12/src/main/java/com/denizenscript/denizen/nms/v1_12/helpers/EntityHelperImpl.java b/v1_12/src/main/java/com/denizenscript/denizen/nms/v1_12/helpers/EntityHelperImpl.java index 12317d99fa..902231c39a 100644 --- a/v1_12/src/main/java/com/denizenscript/denizen/nms/v1_12/helpers/EntityHelperImpl.java +++ b/v1_12/src/main/java/com/denizenscript/denizen/nms/v1_12/helpers/EntityHelperImpl.java @@ -10,6 +10,7 @@ import net.minecraft.server.v1_12_R1.*; import org.bukkit.Location; import org.bukkit.World; +import org.bukkit.attribute.Attribute; import org.bukkit.block.BlockFace; import org.bukkit.craftbukkit.v1_12_R1.CraftWorld; import org.bukkit.craftbukkit.v1_12_R1.entity.CraftAnimals; @@ -17,6 +18,7 @@ import org.bukkit.craftbukkit.v1_12_R1.entity.CraftEntity; import org.bukkit.craftbukkit.v1_12_R1.entity.CraftLivingEntity; import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftItemStack; import org.bukkit.entity.*; import org.bukkit.entity.Entity; import org.bukkit.event.entity.EntityTargetEvent; @@ -33,6 +35,22 @@ public class EntityHelperImpl extends EntityHelper { + @Override + public double getDamageTo(LivingEntity attacker, Entity target) { + EnumMonsterType monsterType; + if (target instanceof LivingEntity) { + monsterType = ((CraftLivingEntity) target).getHandle().getMonsterType(); + } + else { + monsterType = EnumMonsterType.UNDEFINED; + } + double damage = attacker.getAttribute(Attribute.GENERIC_ATTACK_DAMAGE).getValue(); + if (attacker.getEquipment() != null && attacker.getEquipment().getItemInMainHand() != null) { + damage += EnchantmentManager.a(CraftItemStack.asNMSCopy(attacker.getEquipment().getItemInMainHand()), monsterType); + } + return damage; + } + public static final MethodHandle ENTITY_HOVER_TEXT_GETTER = ReflectionHelper.getMethodHandle(net.minecraft.server.v1_12_R1.Entity.class, "bv"); @Override diff --git a/v1_13/src/main/java/com/denizenscript/denizen/nms/v1_13/helpers/EntityHelperImpl.java b/v1_13/src/main/java/com/denizenscript/denizen/nms/v1_13/helpers/EntityHelperImpl.java index 38f43174bb..a21386b442 100644 --- a/v1_13/src/main/java/com/denizenscript/denizen/nms/v1_13/helpers/EntityHelperImpl.java +++ b/v1_13/src/main/java/com/denizenscript/denizen/nms/v1_13/helpers/EntityHelperImpl.java @@ -13,6 +13,7 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; +import org.bukkit.attribute.Attribute; import org.bukkit.block.BlockFace; import org.bukkit.craftbukkit.v1_13_R2.CraftWorld; import org.bukkit.craftbukkit.v1_13_R2.block.CraftBlock; @@ -34,6 +35,22 @@ public class EntityHelperImpl extends EntityHelper { + @Override + public double getDamageTo(LivingEntity attacker, Entity target) { + EnumMonsterType monsterType; + if (target instanceof LivingEntity) { + monsterType = ((CraftLivingEntity) target).getHandle().getMonsterType(); + } + else { + monsterType = EnumMonsterType.UNDEFINED; + } + double damage = attacker.getAttribute(Attribute.GENERIC_ATTACK_DAMAGE).getValue(); + if (attacker.getEquipment() != null && attacker.getEquipment().getItemInMainHand() != null) { + damage += EnchantmentManager.a(CraftItemStack.asNMSCopy(attacker.getEquipment().getItemInMainHand()), monsterType); + } + return damage; + } + public static final MethodHandle ENTITY_HOVER_TEXT_GETTER = ReflectionHelper.getMethodHandle(net.minecraft.server.v1_13_R2.Entity.class, "bC"); @Override diff --git a/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/helpers/EntityHelperImpl.java b/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/helpers/EntityHelperImpl.java index 617f443c6e..9af2ca01a0 100644 --- a/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/helpers/EntityHelperImpl.java +++ b/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/helpers/EntityHelperImpl.java @@ -14,6 +14,7 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; +import org.bukkit.attribute.Attribute; import org.bukkit.block.BlockFace; import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; import org.bukkit.craftbukkit.v1_14_R1.block.CraftBlock; @@ -34,6 +35,22 @@ public class EntityHelperImpl extends EntityHelper { + @Override + public double getDamageTo(LivingEntity attacker, Entity target) { + EnumMonsterType monsterType; + if (target instanceof LivingEntity) { + monsterType = ((CraftLivingEntity) target).getHandle().getMonsterType(); + } + else { + monsterType = EnumMonsterType.UNDEFINED; + } + double damage = attacker.getAttribute(Attribute.GENERIC_ATTACK_DAMAGE).getValue(); + if (attacker.getEquipment() != null && attacker.getEquipment().getItemInMainHand() != null) { + damage += EnchantmentManager.a(CraftItemStack.asNMSCopy(attacker.getEquipment().getItemInMainHand()), monsterType); + } + return damage; + } + public static final Field RECIPE_BOOK_DISCOVERED_SET = ReflectionHelper.getFields(RecipeBook.class).get("a"); public static final MethodHandle ENTITY_HOVER_TEXT_GETTER = ReflectionHelper.getMethodHandle(net.minecraft.server.v1_14_R1.Entity.class, "bK");