Skip to content

Commit

Permalink
Add dItem.attack_speed tag and mech
Browse files Browse the repository at this point in the history
  • Loading branch information
Morphan1 committed Oct 25, 2016
1 parent 708e508 commit b2e07e2
Show file tree
Hide file tree
Showing 8 changed files with 389 additions and 6 deletions.
@@ -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;
}
}
@@ -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);
Expand All @@ -18,4 +23,8 @@ public interface ItemHelper {
CompoundTag getNbtData(ItemStack itemStack);

ItemStack setNbtData(ItemStack itemStack, CompoundTag compoundTag);

Map<EntityAttribute, List<EntityAttributeModifier>> getAttributeModifiers(ItemStack itemStack);

ItemStack setAttributeModifiers(ItemStack itemStack, Map<EntityAttribute, List<EntityAttributeModifier>> modifiers);
}
@@ -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
}
}
1 change: 1 addition & 0 deletions plugin/src/main/java/net/aufdemrand/denizen/Denizen.java
Expand Up @@ -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);
Expand Down
@@ -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<EntityAttribute, List<EntityAttributeModifier>> 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 <i@item.attack_speed>
// @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
// <i@item.attack_speed>
// -->

if (mechanism.matches("attack_speed")) {
Map<EntityAttribute, List<EntityAttributeModifier>> map = NMSHandler.getInstance().getItemHelper()
.getAttributeModifiers(item.getItemStack());
List<EntityAttributeModifier> modifiers = new ArrayList<EntityAttributeModifier>();
dList value = mechanism.getValue().asType(dList.class);
for (String string : value) {
List<String> 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));
}
}
}
Expand Up @@ -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 {

Expand Down Expand Up @@ -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<EntityAttribute, List<EntityAttributeModifier>> getAttributeModifiers(ItemStack itemStack) {
Map<EntityAttribute, List<EntityAttributeModifier>> modifiers = new HashMap<EntityAttribute, List<EntityAttributeModifier>>();
List<Tag> 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<EntityAttributeModifier>());
}
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<EntityAttribute, List<EntityAttributeModifier>> modifiers) {
List<Tag> modifierList = new ArrayList<Tag>(getNbtData(itemStack).getList("AttributeModifiers"));
for (Map.Entry<EntityAttribute, List<EntityAttributeModifier>> entry : modifiers.entrySet()) {
EntityAttribute attribute = entry.getKey();
for (EntityAttributeModifier modifier : entry.getValue()) {
Map<String, Tag> compound = new HashMap<String, Tag>();
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));
}
}

0 comments on commit b2e07e2

Please sign in to comment.