package net.glowstone.inventory;
import net.glowstone.util.nbt.CompoundTag;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class GlowMetaEnchantedBook extends GlowMetaItem implements EnchantmentStorageMeta {
private Map<Enchantment, Integer> storedEnchants;
public GlowMetaEnchantedBook(GlowMetaItem meta) {
super(meta);
if (meta == null || !(meta instanceof GlowMetaEnchantedBook)) return;
GlowMetaEnchantedBook book = (GlowMetaEnchantedBook) meta;
if (book.hasStoredEnchants()) {
storedEnchants = new HashMap<>(book.storedEnchants);
}
}
@Override
public boolean isApplicable(Material material) {
return material == Material.ENCHANTED_BOOK;
}
@Override
public Map<String, Object> serialize() {
Map<String, Object> map = super.serialize();
map.put("meta-type", "ENCHANTED");
if (hasStoredEnchants()) {
serializeEnchants("stored-enchants", map, storedEnchants);
}
return map;
}
@Override
void writeNbt(CompoundTag tag) {
super.writeNbt(tag);
writeNbtEnchants("StoredEnchantments", tag, storedEnchants);
}
@Override
void readNbt(CompoundTag tag) {
super.readNbt(tag);
//TODO currently ignoring level restriction, is that right?
Map<Enchantment, Integer> enchants = readNbtEnchants("StoredEnchantments", tag);
if (enchants != null) {
if (storedEnchants == null)
storedEnchants = enchants;
else
storedEnchants.putAll(enchants);
}
}
@Override
public boolean hasStoredEnchants() {
return storedEnchants != null && !storedEnchants.isEmpty();
}
@Override
public boolean hasStoredEnchant(Enchantment ench) {
return hasStoredEnchants() && storedEnchants.containsKey(ench);
}
@Override
public int getStoredEnchantLevel(Enchantment ench) {
return hasStoredEnchant(ench) ? storedEnchants.get(ench) : 0;
}
@Override
public Map<Enchantment, Integer> getStoredEnchants() {
return hasStoredEnchants() ? Collections.unmodifiableMap(storedEnchants) : Collections.<Enchantment, Integer>emptyMap();
}
@Override
public boolean addStoredEnchant(Enchantment ench, int level, boolean ignoreLevelRestriction) {
if (storedEnchants == null) {
storedEnchants = new HashMap<>(4);
}
if (ignoreLevelRestriction || level >= ench.getStartLevel() && level <= ench.getMaxLevel()) {
Integer old = storedEnchants.put(ench, level);
return old == null || old != level;
}
return false;
}
@Override
public boolean removeStoredEnchant(Enchantment ench) throws IllegalArgumentException {
return hasStoredEnchants() && storedEnchants.remove(ench) != null;
}
@Override
public boolean hasConflictingStoredEnchant(Enchantment ench) {
if (!hasStoredEnchants()) return false;
for (Enchantment e : storedEnchants.keySet()) {
if (e.conflictsWith(ench))
return true;
}
return false;
}
@Override
public GlowMetaEnchantedBook clone() {
return new GlowMetaEnchantedBook(this);
}
}