2025-02-24 16:08:22 -05:00
|
|
|
|
package noppes.npcs.attribute;
|
|
|
|
|
|
|
|
|
|
|
|
import net.minecraft.item.ItemStack;
|
|
|
|
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2025-02-24 20:07:32 -05:00
|
|
|
|
* Provides helper functions to write/read item attributes to/from NBT.
|
|
|
|
|
|
* Non–magic attributes are stored under a compound tag (TAG_ROOT),
|
|
|
|
|
|
* and magic attributes are stored as a compound mapping (by magic ID) under specific keys.
|
2025-02-24 16:08:22 -05:00
|
|
|
|
*/
|
2025-02-25 17:14:55 -05:00
|
|
|
|
public class ItemAttributeHelper {
|
|
|
|
|
|
public static final String TAG_ROOT = "RPGCoreAttributes";
|
2025-02-24 16:08:22 -05:00
|
|
|
|
|
2025-02-25 17:14:55 -05:00
|
|
|
|
/**
|
|
|
|
|
|
* Applies a non–magic attribute to an item.
|
|
|
|
|
|
*/
|
2025-02-24 16:08:22 -05:00
|
|
|
|
public static void applyAttribute(ItemStack item, String attributeKey, double value) {
|
2025-02-24 20:07:32 -05:00
|
|
|
|
if (item == null) return;
|
|
|
|
|
|
if (item.stackTagCompound == null) {
|
2025-02-24 16:08:22 -05:00
|
|
|
|
item.stackTagCompound = new NBTTagCompound();
|
|
|
|
|
|
}
|
|
|
|
|
|
NBTTagCompound root = item.stackTagCompound;
|
|
|
|
|
|
NBTTagCompound attrTag;
|
2025-02-24 20:07:32 -05:00
|
|
|
|
if (root.hasKey(TAG_ROOT)) {
|
2025-02-24 16:08:22 -05:00
|
|
|
|
attrTag = root.getCompoundTag(TAG_ROOT);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
attrTag = new NBTTagCompound();
|
|
|
|
|
|
}
|
|
|
|
|
|
attrTag.setDouble(attributeKey, value);
|
|
|
|
|
|
root.setTag(TAG_ROOT, attrTag);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-02-25 17:14:55 -05:00
|
|
|
|
/**
|
|
|
|
|
|
* Removes a non–magic attribute from an item.
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static void removeAttribute(ItemStack item, String attributeKey) {
|
|
|
|
|
|
if (item == null || item.stackTagCompound == null) return;
|
|
|
|
|
|
NBTTagCompound root = item.stackTagCompound;
|
|
|
|
|
|
if (root.hasKey(TAG_ROOT)) {
|
|
|
|
|
|
NBTTagCompound attrTag = root.getCompoundTag(TAG_ROOT);
|
|
|
|
|
|
attrTag.removeTag(attributeKey);
|
|
|
|
|
|
// If no attributes remain, remove the root tag.
|
|
|
|
|
|
if (attrTag.func_150296_c().isEmpty()) {
|
|
|
|
|
|
root.removeTag(TAG_ROOT);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Reads non–magic attributes from an item.
|
|
|
|
|
|
*/
|
2025-02-24 16:08:22 -05:00
|
|
|
|
public static Map<String, Double> readAttributes(ItemStack item) {
|
|
|
|
|
|
Map<String, Double> map = new HashMap<>();
|
2025-02-24 20:07:32 -05:00
|
|
|
|
if (item == null || item.stackTagCompound == null) return map;
|
2025-02-24 16:08:22 -05:00
|
|
|
|
NBTTagCompound root = item.stackTagCompound;
|
2025-02-24 20:07:32 -05:00
|
|
|
|
if (root.hasKey(TAG_ROOT)) {
|
2025-02-24 16:08:22 -05:00
|
|
|
|
NBTTagCompound attrTag = root.getCompoundTag(TAG_ROOT);
|
|
|
|
|
|
Set<String> keys = attrTag.func_150296_c();
|
2025-02-24 20:07:32 -05:00
|
|
|
|
for (String key : keys) {
|
2025-02-24 16:08:22 -05:00
|
|
|
|
map.put(key, attrTag.getDouble(key));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return map;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-02-25 17:14:55 -05:00
|
|
|
|
/**
|
|
|
|
|
|
* Reads a magic attribute map from an item.
|
|
|
|
|
|
* The given attributeTag is the key under which the compound is stored (e.g., MAGIC_DAMAGE_FLAT).
|
|
|
|
|
|
*/
|
2025-02-24 16:08:22 -05:00
|
|
|
|
public static Map<Integer, Double> readMagicAttributeMap(ItemStack item, String attributeTag) {
|
|
|
|
|
|
Map<Integer, Double> map = new HashMap<>();
|
2025-02-24 20:07:32 -05:00
|
|
|
|
if (item == null || item.stackTagCompound == null) return map;
|
|
|
|
|
|
if (item.stackTagCompound.hasKey(attributeTag)) {
|
2025-02-24 16:08:22 -05:00
|
|
|
|
NBTTagCompound magicMap = item.stackTagCompound.getCompoundTag(attributeTag);
|
|
|
|
|
|
Set<String> keys = magicMap.func_150296_c();
|
2025-02-24 20:07:32 -05:00
|
|
|
|
for (String key : keys) {
|
2025-02-24 16:08:22 -05:00
|
|
|
|
try {
|
|
|
|
|
|
int magicId = Integer.parseInt(key);
|
|
|
|
|
|
map.put(magicId, magicMap.getDouble(key));
|
2025-02-24 20:07:32 -05:00
|
|
|
|
} catch (NumberFormatException e) {
|
2025-02-24 16:08:22 -05:00
|
|
|
|
// Skip invalid key.
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return map;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-02-25 17:14:55 -05:00
|
|
|
|
/**
|
|
|
|
|
|
* Applies (writes) a magic attribute to an item.
|
|
|
|
|
|
* This is essentially the same as writeMagicAttribute.
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static void applyMagicAttribute(ItemStack item, String attributeTag, int magicId, double value) {
|
|
|
|
|
|
writeMagicAttribute(item, attributeTag, magicId, value);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Writes a magic attribute value to the given attributeTag.
|
|
|
|
|
|
*/
|
2025-02-24 16:08:22 -05:00
|
|
|
|
public static void writeMagicAttribute(ItemStack item, String attributeTag, int magicId, double value) {
|
2025-02-24 20:07:32 -05:00
|
|
|
|
if (item == null) return;
|
|
|
|
|
|
if (item.stackTagCompound == null)
|
2025-02-24 16:08:22 -05:00
|
|
|
|
item.stackTagCompound = new NBTTagCompound();
|
|
|
|
|
|
NBTTagCompound magicMap;
|
2025-02-24 20:07:32 -05:00
|
|
|
|
if (item.stackTagCompound.hasKey(attributeTag)) {
|
2025-02-24 16:08:22 -05:00
|
|
|
|
magicMap = item.stackTagCompound.getCompoundTag(attributeTag);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
magicMap = new NBTTagCompound();
|
|
|
|
|
|
}
|
|
|
|
|
|
magicMap.setDouble(String.valueOf(magicId), value);
|
|
|
|
|
|
item.stackTagCompound.setTag(attributeTag, magicMap);
|
|
|
|
|
|
}
|
2025-02-25 17:14:55 -05:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Removes a magic attribute value from the given attributeTag.
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static void removeMagicAttribute(ItemStack item, String attributeTag, int magicId) {
|
|
|
|
|
|
if (item == null || item.stackTagCompound == null)
|
|
|
|
|
|
return;
|
|
|
|
|
|
NBTTagCompound root = item.stackTagCompound;
|
|
|
|
|
|
if (root.hasKey(attributeTag)) {
|
|
|
|
|
|
NBTTagCompound magicMap = root.getCompoundTag(attributeTag);
|
|
|
|
|
|
magicMap.removeTag(String.valueOf(magicId));
|
|
|
|
|
|
// If the magic map is empty, remove the tag.
|
|
|
|
|
|
if (magicMap.func_150296_c().isEmpty())
|
|
|
|
|
|
root.removeTag(attributeTag);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-02-24 16:08:22 -05:00
|
|
|
|
}
|