package net.glowstone.inventory;
import com.google.common.collect.ImmutableMap;
import net.glowstone.block.blocktype.BlockBanner;
import net.glowstone.util.nbt.CompoundTag;
import net.glowstone.util.nbt.TagType;
import org.apache.commons.lang3.Validate;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.block.banner.Pattern;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.meta.BannerMeta;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class GlowMetaBanner extends GlowMetaItem implements BannerMeta {
private List<Pattern> patterns = new ArrayList<>();
public GlowMetaBanner(GlowMetaItem meta) {
super(meta);
if (meta == null || !(meta instanceof GlowMetaBanner)) {
return;
}
GlowMetaBanner banner = (GlowMetaBanner) meta;
this.patterns = banner.patterns;
}
@Override
public void setPatterns(List<Pattern> patterns) {
Validate.notNull(patterns, "Pattern cannot be null!");
this.patterns = patterns;
}
@Override
public List<Pattern> getPatterns() {
return patterns;
}
@Override
public DyeColor getBaseColor() {
return getPattern(0).getColor(); // TODO: multiple colors?
}
@Override
public void setBaseColor(DyeColor dyeColor) {
/// TODO: where does this go? each org.bukkit.block.banner.Pattern has a "color"
}
@Override
public void addPattern(Pattern pattern) {
patterns.add(pattern);
}
@Override
public Pattern getPattern(int i) {
return patterns.get(i);
}
@Override
public Pattern removePattern(int i) {
return patterns.remove(i);
}
@Override
public void setPattern(int i, Pattern pattern) {
patterns.set(i, pattern);
}
@Override
public int numberOfPatterns() {
return patterns.size();
}
@Override
void writeNbt(CompoundTag tag) {
super.writeNbt(tag);
CompoundTag blockEntityTag = new CompoundTag();
blockEntityTag.putCompoundList("Patterns", BlockBanner.toNBT(patterns));
tag.putCompound("BlockEntityTag", blockEntityTag);
}
@Override
void readNbt(CompoundTag tag) {
super.readNbt(tag);
if (tag.isCompound("BlockEntityTag")) {
CompoundTag blockEntityTag = tag.getCompound("BlockEntityTag");
if (blockEntityTag.isList("Patterns", TagType.COMPOUND)) {
List<CompoundTag> patterns = blockEntityTag.getCompoundList("Patterns");
this.patterns = BlockBanner.fromNBT(patterns);
}
}
}
@Override
public void addItemFlags(ItemFlag... itemFlags) {
//To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void removeItemFlags(ItemFlag... itemFlags) {
//To change body of implemented methods use File | Settings | File Templates.
}
@Override
public Set<ItemFlag> getItemFlags() {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public boolean hasItemFlag(ItemFlag itemFlag) {
return false; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public ItemMeta clone() {
return new GlowMetaBanner(this);
}
@Override
public boolean isApplicable(Material material) {
return material == Material.BANNER;
}
@Override
public Map<String, Object> serialize() {
Map<String, Object> result = super.serialize();
result.put("meta-type", "BANNER");
List<Map<String, String>> patternsList = new ArrayList<>();
for (Pattern pattern : patterns) {
patternsList.add(ImmutableMap.of(pattern.getPattern().toString(), pattern.getColor().toString()));
}
result.put("pattern", patternsList);
return result;
}
}