blob: d478e1d3b0bda1142cb1035363e10221bd39300f [file] [log] [blame] [raw]
package net.glowstone.inventory;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.collect.ImmutableMap;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import lombok.Getter;
import lombok.Setter;
import net.glowstone.block.blocktype.BlockBanner;
import net.glowstone.util.nbt.CompoundTag;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.block.banner.Pattern;
import org.bukkit.inventory.meta.BannerMeta;
import org.bukkit.inventory.meta.ItemMeta;
public class GlowMetaBanner extends GlowMetaItem implements BannerMeta {
protected List<Pattern> patterns = new ArrayList<>();
@Getter
@Setter
protected DyeColor baseColor = null;
/**
* Creates an instance by copying from the given {@link ItemMeta}. If that item is another
* {@link BannerMeta}, its patterns are copied; otherwise, the new banner is blank.
* @param meta the {@link ItemMeta} to copy
*/
public GlowMetaBanner(ItemMeta meta) {
super(meta);
if (!(meta instanceof BannerMeta)) {
return;
}
BannerMeta banner = (BannerMeta) meta;
patterns = banner.getPatterns();
baseColor = banner.getBaseColor();
}
@Override
public List<Pattern> getPatterns() {
return new ArrayList<>(patterns);
}
@Override
public void setPatterns(List<Pattern> patterns) {
checkNotNull(patterns, "Pattern cannot be null!");
this.patterns.clear();
this.patterns.addAll(patterns);
}
@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));
if (baseColor != null) {
blockEntityTag.putInt("Base", baseColor.getWoolData());
}
tag.putCompound("BlockEntityTag", blockEntityTag);
}
@Override
void readNbt(CompoundTag tag) {
super.readNbt(tag);
tag.readCompound("BlockEntityTag", blockEntityTag -> {
blockEntityTag.readCompoundList(
"Patterns", patterns -> this.patterns = BlockBanner.fromNbt(patterns));
blockEntityTag.readInt(
"Base", colorInt -> this.baseColor = DyeColor.getByWoolData((byte) colorInt));
});
}
@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);
if (baseColor != null) {
result.put("baseColor", baseColor);
}
return result;
}
}