package org.bukkit.attribute; import java.util.HashMap; import java.util.Map; import java.util.UUID; import org.apache.commons.lang.Validate; import org.bukkit.configuration.serialization.ConfigurationSerializable; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.util.NumberConversions; /** * Concrete implementation of an attribute modifier. */ public class AttributeModifier implements ConfigurationSerializable { private final UUID uuid; private final String name; private final double amount; private final Operation operation; private final EquipmentSlot slot; public AttributeModifier(String name, double amount, Operation operation) { this(UUID.randomUUID(), name, amount, operation); } public AttributeModifier(UUID uuid, String name, double amount, Operation operation) { this(uuid, name, amount, operation, null); } public AttributeModifier(UUID uuid, String name, double amount, Operation operation, EquipmentSlot slot) { Validate.notNull(uuid, "UUID cannot be null"); Validate.notEmpty(name, "Name cannot be empty"); Validate.notNull(operation, "Operation cannot be null"); this.uuid = uuid; this.name = name; this.amount = amount; this.operation = operation; this.slot = slot; } /** * Get the unique ID for this modifier. * * @return unique id */ public UUID getUniqueId() { return uuid; } /** * Get the name of this modifier. * * @return name */ public String getName() { return name; } /** * Get the amount by which this modifier will apply its {@link Operation}. * * @return modification amount */ public double getAmount() { return amount; } /** * Get the operation this modifier will apply. * * @return operation */ public Operation getOperation() { return operation; } /** * Get the {@link EquipmentSlot} this AttributeModifier is active on, * or null if this modifier is applicable for any slot. * * @return the slot */ public EquipmentSlot getSlot() { return slot; } @Override public Map serialize() { Map data = new HashMap(); data.put("uuid", uuid.toString()); data.put("name", name); data.put("operation", operation.ordinal()); data.put("amount", amount); if (slot != null) { data.put("slot", slot.name()); } return data; } @Override public boolean equals(Object other) { if (!(other instanceof AttributeModifier)) { return false; } AttributeModifier mod = (AttributeModifier) other; boolean slots = (this.slot != null ? (this.slot == mod.slot) : mod.slot != null); return this.uuid.equals(mod.uuid) && this.name.equals(mod.name) && this.amount == mod.amount && this.operation == mod.operation && slots; } @Override public String toString() { return "AttributeModifier{" + "uuid=" + this.uuid.toString() + ", name=" + this.name + ", operation=" + this.operation.name() + ", amount=" + this.amount + ", slot=" + (this.slot != null ? this.slot.name() : "") + "}"; } public static AttributeModifier deserialize(Map args) { if (args.containsKey("slot")) { return new AttributeModifier(UUID.fromString((String) args.get("uuid")), (String) args.get("name"), NumberConversions.toDouble(args.get("amount")), Operation.values()[NumberConversions.toInt(args.get("operation"))], EquipmentSlot.valueOf((args.get("slot").toString().toUpperCase()))); } return new AttributeModifier(UUID.fromString((String) args.get("uuid")), (String) args.get("name"), NumberConversions.toDouble(args.get("amount")), Operation.values()[NumberConversions.toInt(args.get("operation"))]); } /** * Enumerable operation to be applied. */ public enum Operation { /** * Adds (or subtracts) the specified amount to the base value. */ ADD_NUMBER, /** * Adds this scalar of amount to the base value. */ ADD_SCALAR, /** * Multiply amount by this value, after adding 1 to it. */ MULTIPLY_SCALAR_1; } }