From b2e07e2b8f7a011a6d2dfd8b4f6e9fbf9ed81822 Mon Sep 17 00:00:00 2001 From: Morphan1 Date: Mon, 24 Oct 2016 20:31:00 -0400 Subject: [PATCH] Add dItem.attack_speed tag and mech --- .../denizen/nms/enums/EntityAttribute.java | 39 ++++++ .../denizen/nms/interfaces/ItemHelper.java | 9 ++ .../nms/util/EntityAttributeModifier.java | 52 ++++++++ .../java/net/aufdemrand/denizen/Denizen.java | 1 + .../properties/item/ItemAttackSpeed.java | 123 ++++++++++++++++++ .../nms/helpers/ItemHelper_v1_10_R1.java | 57 +++++++- .../nms/helpers/ItemHelper_v1_8_R3.java | 57 +++++++- .../nms/helpers/ItemHelper_v1_9_R2.java | 57 +++++++- 8 files changed, 389 insertions(+), 6 deletions(-) create mode 100644 nmshandler/src/main/java/net/aufdemrand/denizen/nms/enums/EntityAttribute.java create mode 100644 nmshandler/src/main/java/net/aufdemrand/denizen/nms/util/EntityAttributeModifier.java create mode 100644 plugin/src/main/java/net/aufdemrand/denizen/objects/properties/item/ItemAttackSpeed.java diff --git a/nmshandler/src/main/java/net/aufdemrand/denizen/nms/enums/EntityAttribute.java b/nmshandler/src/main/java/net/aufdemrand/denizen/nms/enums/EntityAttribute.java new file mode 100644 index 0000000000..4a7e9a6926 --- /dev/null +++ b/nmshandler/src/main/java/net/aufdemrand/denizen/nms/enums/EntityAttribute.java @@ -0,0 +1,39 @@ +package net.aufdemrand.denizen.nms.enums; + +import net.aufdemrand.denizencore.utilities.CoreUtilities; + +public enum EntityAttribute { + GENERIC_MAX_HEALTH("generic.maxHealth"), + GENERIC_FOLLOW_RANGE("generic.followRange"), + GENERIC_KNOCKBACK_RESISTANCE("generic.knockbackResistance"), + GENERIC_MOVEMENT_SPEED("generic.movementSpeed"), + GENERIC_ATTACK_DAMAGE("generic.attackDamage"), + GENERIC_ATTACK_SPEED("generic.attackSpeed"), + GENERIC_ARMOR("generic.armor"), + GENERIC_LUCK("generic.luck"), + HORSE_JUMP_STRENGTH("horse.jumpStrength"), + ZOMBIE_SPAWN_REINFORCEMENTS("zombie.spawnReinforcements"); + + private String name; + + EntityAttribute(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public static EntityAttribute getByName(String name) { + if (name == null) { + return null; + } + name = CoreUtilities.toLowerCase(name); + for (EntityAttribute entityAttribute : values()) { + if (name.equals(CoreUtilities.toLowerCase(entityAttribute.name))) { + return entityAttribute; + } + } + return null; + } +} diff --git a/nmshandler/src/main/java/net/aufdemrand/denizen/nms/interfaces/ItemHelper.java b/nmshandler/src/main/java/net/aufdemrand/denizen/nms/interfaces/ItemHelper.java index 96ea1cb9a5..f9a738b444 100644 --- a/nmshandler/src/main/java/net/aufdemrand/denizen/nms/interfaces/ItemHelper.java +++ b/nmshandler/src/main/java/net/aufdemrand/denizen/nms/interfaces/ItemHelper.java @@ -1,10 +1,15 @@ package net.aufdemrand.denizen.nms.interfaces; +import net.aufdemrand.denizen.nms.enums.EntityAttribute; +import net.aufdemrand.denizen.nms.util.EntityAttributeModifier; import net.aufdemrand.denizen.nms.util.PlayerProfile; import net.aufdemrand.denizen.nms.util.jnbt.CompoundTag; import net.aufdemrand.denizen.nms.util.jnbt.Tag; import org.bukkit.inventory.ItemStack; +import java.util.List; +import java.util.Map; + public interface ItemHelper { String getJsonString(ItemStack itemStack); @@ -18,4 +23,8 @@ public interface ItemHelper { CompoundTag getNbtData(ItemStack itemStack); ItemStack setNbtData(ItemStack itemStack, CompoundTag compoundTag); + + Map> getAttributeModifiers(ItemStack itemStack); + + ItemStack setAttributeModifiers(ItemStack itemStack, Map> modifiers); } diff --git a/nmshandler/src/main/java/net/aufdemrand/denizen/nms/util/EntityAttributeModifier.java b/nmshandler/src/main/java/net/aufdemrand/denizen/nms/util/EntityAttributeModifier.java new file mode 100644 index 0000000000..18c797d5ce --- /dev/null +++ b/nmshandler/src/main/java/net/aufdemrand/denizen/nms/util/EntityAttributeModifier.java @@ -0,0 +1,52 @@ +package net.aufdemrand.denizen.nms.util; + +import java.util.UUID; + +public class EntityAttributeModifier { + + private UUID uuid; + private String name; + private Operation operation; + private double amount; + + public EntityAttributeModifier(String name, Operation operation, double amount) { + this(UUID.randomUUID(), name, operation, amount); + } + + public EntityAttributeModifier(UUID uuid, String name, Operation operation, double amount) { + this.uuid = uuid; + this.name = name; + this.operation = operation; + this.amount = amount; + } + + public UUID getUniqueId() { + return uuid; + } + + public String getName() { + return name; + } + + public Operation getOperation() { + return operation; + } + + public double getAmount() { + return amount; + } + + public void setOperation(Operation operation) { + this.operation = operation; + } + + public void setAmount(double amount) { + this.amount = amount; + } + + public enum Operation { + ADD_NUMBER, + ADD_SCALAR, + MULTIPLY_SCALAR_1 + } +} diff --git a/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java b/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java index 268df4779a..700e12b28f 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java @@ -838,6 +838,7 @@ public void onEnable() { // register core dItem properties propertyParser.registerProperty(ItemApple.class, dItem.class); + propertyParser.registerProperty(ItemAttackSpeed.class, dItem.class); propertyParser.registerProperty(ItemBaseColor.class, dItem.class); propertyParser.registerProperty(ItemBook.class, dItem.class); propertyParser.registerProperty(ItemDisplayname.class, dItem.class); diff --git a/plugin/src/main/java/net/aufdemrand/denizen/objects/properties/item/ItemAttackSpeed.java b/plugin/src/main/java/net/aufdemrand/denizen/objects/properties/item/ItemAttackSpeed.java new file mode 100644 index 0000000000..c2f9a28078 --- /dev/null +++ b/plugin/src/main/java/net/aufdemrand/denizen/objects/properties/item/ItemAttackSpeed.java @@ -0,0 +1,123 @@ +package net.aufdemrand.denizen.objects.properties.item; + +import net.aufdemrand.denizen.nms.NMSHandler; +import net.aufdemrand.denizen.nms.enums.EntityAttribute; +import net.aufdemrand.denizen.nms.util.EntityAttributeModifier; +import net.aufdemrand.denizen.objects.dItem; +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.aufdemrand.denizencore.utilities.CoreUtilities; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class ItemAttackSpeed implements Property { + + public static boolean describes(dObject item) { + return item instanceof dItem; + } + + public static ItemAttackSpeed getFrom(dObject item) { + if (!describes(item)) { + return null; + } + else { + return new ItemAttackSpeed((dItem) item); + } + } + + + private ItemAttackSpeed(dItem item) { + this.item = item; + } + + dItem item; + + @Override + public String getPropertyString() { + dList list = new dList(); + Map> modifiers = NMSHandler.getInstance().getItemHelper() + .getAttributeModifiers(item.getItemStack()); + if (modifiers.containsKey(EntityAttribute.GENERIC_ATTACK_SPEED)) { + for (EntityAttributeModifier modifier : modifiers.get(EntityAttribute.GENERIC_ATTACK_SPEED)) { + list.add(modifier.getUniqueId().toString()); + list.add(modifier.getName()); + list.add(modifier.getOperation().name()); + list.add(new Element(modifier.getAmount()).identify()); + } + } + return list.isEmpty() ? null : list.identify(); + } + + @Override + public String getPropertyId() { + return "attack_speed"; + } + + @Override + public String getAttribute(Attribute attribute) { + + if (attribute == null) { + return null; + } + + // <--[tag] + // @attribute + // @returns dList + // @group properties + // @mechanism dItem.attack_speed + // @description + // Gets the attack speed modifiers of the item in the format: + // UUID/NAME/OPERATION/AMOUNT|... + // Available operations: ADD_NUMBER, ADD_SCALAR, MULTIPLY_SCALAR_1 + // --> + if (attribute.startsWith("attack_speed")) { + String string = getPropertyString(); + if (string == null) { + return null; + } + return new Element(string).getAttribute(attribute.fulfill(1)); + } + + return null; + } + + @Override + public void adjust(Mechanism mechanism) { + + // <--[mechanism] + // @object dItem + // @name attack_speed + // @input dList + // @description + // Changes the attack speed modifier using the format: + // UUID/NAME/OPERATION/AMOUNT|... + // Available operations: ADD_NUMBER, ADD_SCALAR, MULTIPLY_SCALAR_1 + // @tags + // + // --> + + if (mechanism.matches("attack_speed")) { + Map> map = NMSHandler.getInstance().getItemHelper() + .getAttributeModifiers(item.getItemStack()); + List modifiers = new ArrayList(); + dList value = mechanism.getValue().asType(dList.class); + for (String string : value) { + List split = CoreUtilities.split(string, '/', 4); + UUID uuid = UUID.fromString(split.get(0)); + String name = split.get(1); + EntityAttributeModifier.Operation operation = EntityAttributeModifier.Operation.valueOf(split.get(2).toUpperCase()); + double amount = new Element(split.get(3)).asDouble(); + modifiers.add(new EntityAttributeModifier(uuid, name, operation, amount)); + } + map.put(EntityAttribute.GENERIC_ATTACK_SPEED, modifiers); + item.setItemStack(NMSHandler.getInstance().getItemHelper().setAttributeModifiers(item.getItemStack(), map)); + } + } +} diff --git a/v1_10_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_10_R1.java b/v1_10_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_10_R1.java index b4aa407b21..377895b2be 100644 --- a/v1_10_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_10_R1.java +++ b/v1_10_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_10_R1.java @@ -3,17 +3,22 @@ import com.google.common.collect.Iterables; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; +import net.aufdemrand.denizen.nms.enums.EntityAttribute; import net.aufdemrand.denizen.nms.impl.jnbt.CompoundTag_v1_10_R1; import net.aufdemrand.denizen.nms.interfaces.ItemHelper; +import net.aufdemrand.denizen.nms.util.EntityAttributeModifier; import net.aufdemrand.denizen.nms.util.PlayerProfile; -import net.aufdemrand.denizen.nms.util.jnbt.CompoundTag; -import net.aufdemrand.denizen.nms.util.jnbt.Tag; +import net.aufdemrand.denizen.nms.util.jnbt.*; import net.minecraft.server.v1_10_R1.GameProfileSerializer; import net.minecraft.server.v1_10_R1.NBTTagCompound; import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftItemStack; import org.bukkit.inventory.ItemStack; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; public class ItemHelper_v1_10_R1 implements ItemHelper { @@ -84,4 +89,52 @@ public ItemStack setNbtData(ItemStack itemStack, CompoundTag compoundTag) { nmsItemStack.setTag(((CompoundTag_v1_10_R1) compoundTag).toNMSTag()); return CraftItemStack.asBukkitCopy(nmsItemStack); } + + @Override + public Map> getAttributeModifiers(ItemStack itemStack) { + Map> modifiers = new HashMap>(); + List modifierList = getNbtData(itemStack).getList("AttributeModifiers"); + for (Tag tag : modifierList) { + if (!(tag instanceof CompoundTag)) { + continue; + } + CompoundTag modifier = (CompoundTag) tag; + EntityAttribute attribute = EntityAttribute.getByName(modifier.getString("AttributeName")); + if (attribute == null) { + continue; + } + if (!modifiers.containsKey(attribute)) { + modifiers.put(attribute, new ArrayList()); + } + UUID uuid = new UUID(modifier.getLong("UUIDMost"), modifier.getLong("UUIDLeast")); + String name = modifier.getString("Name"); + EntityAttributeModifier.Operation operation = EntityAttributeModifier.Operation.values()[modifier.getInt("Operation")]; + if (operation == null) { + continue; + } + double amount = modifier.getDouble("Amount"); + modifiers.get(attribute).add(new EntityAttributeModifier(uuid, name, operation, amount)); + } + return modifiers; + } + + @Override + public ItemStack setAttributeModifiers(ItemStack itemStack, Map> modifiers) { + List modifierList = new ArrayList(getNbtData(itemStack).getList("AttributeModifiers")); + for (Map.Entry> entry : modifiers.entrySet()) { + EntityAttribute attribute = entry.getKey(); + for (EntityAttributeModifier modifier : entry.getValue()) { + Map compound = new HashMap(); + compound.put("AttributeName", new StringTag(attribute.getName())); + UUID uuid = modifier.getUniqueId(); + compound.put("UUIDMost", new LongTag(uuid.getMostSignificantBits())); + compound.put("UUIDLeast", new LongTag(uuid.getLeastSignificantBits())); + compound.put("Name", new StringTag(modifier.getName())); + compound.put("Operation", new IntTag(modifier.getOperation().ordinal())); + compound.put("Amount", new DoubleTag(modifier.getAmount())); + modifierList.add(new CompoundTag_v1_10_R1(compound)); + } + } + return addNbtData(itemStack, "AttributeModifiers", new ListTag(CompoundTag.class, modifierList)); + } } diff --git a/v1_8_R3/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_8_R3.java b/v1_8_R3/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_8_R3.java index cd2607d9c8..fbda7cab8e 100644 --- a/v1_8_R3/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_8_R3.java +++ b/v1_8_R3/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_8_R3.java @@ -3,17 +3,22 @@ import com.google.common.collect.Iterables; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; +import net.aufdemrand.denizen.nms.enums.EntityAttribute; import net.aufdemrand.denizen.nms.impl.jnbt.CompoundTag_v1_8_R3; import net.aufdemrand.denizen.nms.interfaces.ItemHelper; +import net.aufdemrand.denizen.nms.util.EntityAttributeModifier; import net.aufdemrand.denizen.nms.util.PlayerProfile; -import net.aufdemrand.denizen.nms.util.jnbt.CompoundTag; -import net.aufdemrand.denizen.nms.util.jnbt.Tag; +import net.aufdemrand.denizen.nms.util.jnbt.*; import net.minecraft.server.v1_8_R3.GameProfileSerializer; import net.minecraft.server.v1_8_R3.NBTTagCompound; import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack; import org.bukkit.inventory.ItemStack; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; public class ItemHelper_v1_8_R3 implements ItemHelper { @@ -84,4 +89,52 @@ public ItemStack setNbtData(ItemStack itemStack, CompoundTag compoundTag) { nmsItemStack.setTag(((CompoundTag_v1_8_R3) compoundTag).toNMSTag()); return CraftItemStack.asBukkitCopy(nmsItemStack); } + + @Override + public Map> getAttributeModifiers(ItemStack itemStack) { + Map> modifiers = new HashMap>(); + List modifierList = getNbtData(itemStack).getList("AttributeModifiers"); + for (Tag tag : modifierList) { + if (!(tag instanceof CompoundTag)) { + continue; + } + CompoundTag modifier = (CompoundTag) tag; + EntityAttribute attribute = EntityAttribute.getByName(modifier.getString("AttributeName")); + if (attribute == null) { + continue; + } + if (!modifiers.containsKey(attribute)) { + modifiers.put(attribute, new ArrayList()); + } + UUID uuid = new UUID(modifier.getLong("UUIDMost"), modifier.getLong("UUIDLeast")); + String name = modifier.getString("Name"); + EntityAttributeModifier.Operation operation = EntityAttributeModifier.Operation.values()[modifier.getInt("Operation")]; + if (operation == null) { + continue; + } + double amount = modifier.getDouble("Amount"); + modifiers.get(attribute).add(new EntityAttributeModifier(uuid, name, operation, amount)); + } + return modifiers; + } + + @Override + public ItemStack setAttributeModifiers(ItemStack itemStack, Map> modifiers) { + List modifierList = new ArrayList(getNbtData(itemStack).getList("AttributeModifiers")); + for (Map.Entry> entry : modifiers.entrySet()) { + EntityAttribute attribute = entry.getKey(); + for (EntityAttributeModifier modifier : entry.getValue()) { + Map compound = new HashMap(); + compound.put("AttributeName", new StringTag(attribute.getName())); + UUID uuid = modifier.getUniqueId(); + compound.put("UUIDMost", new LongTag(uuid.getMostSignificantBits())); + compound.put("UUIDLeast", new LongTag(uuid.getLeastSignificantBits())); + compound.put("Name", new StringTag(modifier.getName())); + compound.put("Operation", new IntTag(modifier.getOperation().ordinal())); + compound.put("Amount", new DoubleTag(modifier.getAmount())); + modifierList.add(new CompoundTag_v1_8_R3(compound)); + } + } + return addNbtData(itemStack, "AttributeModifiers", new ListTag(CompoundTag.class, modifierList)); + } } diff --git a/v1_9_R2/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_9_R2.java b/v1_9_R2/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_9_R2.java index 0949fb06fb..f7e15b2dd4 100644 --- a/v1_9_R2/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_9_R2.java +++ b/v1_9_R2/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_9_R2.java @@ -3,17 +3,22 @@ import com.google.common.collect.Iterables; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; +import net.aufdemrand.denizen.nms.enums.EntityAttribute; import net.aufdemrand.denizen.nms.impl.jnbt.CompoundTag_v1_9_R2; import net.aufdemrand.denizen.nms.interfaces.ItemHelper; +import net.aufdemrand.denizen.nms.util.EntityAttributeModifier; import net.aufdemrand.denizen.nms.util.PlayerProfile; -import net.aufdemrand.denizen.nms.util.jnbt.CompoundTag; -import net.aufdemrand.denizen.nms.util.jnbt.Tag; +import net.aufdemrand.denizen.nms.util.jnbt.*; import net.minecraft.server.v1_9_R2.GameProfileSerializer; import net.minecraft.server.v1_9_R2.NBTTagCompound; import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftItemStack; import org.bukkit.inventory.ItemStack; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; public class ItemHelper_v1_9_R2 implements ItemHelper { @@ -84,4 +89,52 @@ public ItemStack setNbtData(ItemStack itemStack, CompoundTag compoundTag) { nmsItemStack.setTag(((CompoundTag_v1_9_R2) compoundTag).toNMSTag()); return CraftItemStack.asBukkitCopy(nmsItemStack); } + + @Override + public Map> getAttributeModifiers(ItemStack itemStack) { + Map> modifiers = new HashMap>(); + List modifierList = getNbtData(itemStack).getList("AttributeModifiers"); + for (Tag tag : modifierList) { + if (!(tag instanceof CompoundTag)) { + continue; + } + CompoundTag modifier = (CompoundTag) tag; + EntityAttribute attribute = EntityAttribute.getByName(modifier.getString("AttributeName")); + if (attribute == null) { + continue; + } + if (!modifiers.containsKey(attribute)) { + modifiers.put(attribute, new ArrayList()); + } + UUID uuid = new UUID(modifier.getLong("UUIDMost"), modifier.getLong("UUIDLeast")); + String name = modifier.getString("Name"); + EntityAttributeModifier.Operation operation = EntityAttributeModifier.Operation.values()[modifier.getInt("Operation")]; + if (operation == null) { + continue; + } + double amount = modifier.getDouble("Amount"); + modifiers.get(attribute).add(new EntityAttributeModifier(uuid, name, operation, amount)); + } + return modifiers; + } + + @Override + public ItemStack setAttributeModifiers(ItemStack itemStack, Map> modifiers) { + List modifierList = new ArrayList(getNbtData(itemStack).getList("AttributeModifiers")); + for (Map.Entry> entry : modifiers.entrySet()) { + EntityAttribute attribute = entry.getKey(); + for (EntityAttributeModifier modifier : entry.getValue()) { + Map compound = new HashMap(); + compound.put("AttributeName", new StringTag(attribute.getName())); + UUID uuid = modifier.getUniqueId(); + compound.put("UUIDMost", new LongTag(uuid.getMostSignificantBits())); + compound.put("UUIDLeast", new LongTag(uuid.getLeastSignificantBits())); + compound.put("Name", new StringTag(modifier.getName())); + compound.put("Operation", new IntTag(modifier.getOperation().ordinal())); + compound.put("Amount", new DoubleTag(modifier.getAmount())); + modifierList.add(new CompoundTag_v1_9_R2(compound)); + } + } + return addNbtData(itemStack, "AttributeModifiers", new ListTag(CompoundTag.class, modifierList)); + } }