All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bukkit.craftbukkit.inventory.CraftMetaBanner Maven / Gradle / Ivy

package org.bukkit.craftbukkit.inventory;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import net.minecraft.server.NBTTagCompound;
import net.minecraft.server.NBTTagList;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.block.banner.Pattern;
import org.bukkit.block.banner.PatternType;
import org.bukkit.configuration.serialization.DelegateDeserialization;
import org.bukkit.inventory.meta.BannerMeta;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@DelegateDeserialization(CraftMetaItem.SerializableMeta.class)
public class CraftMetaBanner extends CraftMetaItem implements BannerMeta {

  static final ItemMetaKey BASE = new ItemMetaKey("Base", "base-color");
  static final ItemMetaKey PATTERNS = new ItemMetaKey("Patterns", "patterns");
  static final ItemMetaKey COLOR = new ItemMetaKey("Color", "color");
  static final ItemMetaKey PATTERN = new ItemMetaKey("Pattern", "pattern");

  private DyeColor base;
  private List patterns = new ArrayList();

  CraftMetaBanner(CraftMetaItem meta) {
    super(meta);

    if (!(meta instanceof CraftMetaBanner)) {
      return;
    }

    CraftMetaBanner banner = (CraftMetaBanner) meta;
    base = banner.base;
    patterns = new ArrayList(banner.patterns);
  }

  CraftMetaBanner(NBTTagCompound tag) {
    super(tag);

    if (!tag.hasKey("BlockEntityTag")) {
      return;
    }

    NBTTagCompound entityTag = tag.getCompound("BlockEntityTag");

    base = entityTag.hasKey(BASE.NBT) ? DyeColor.getByDyeData((byte) entityTag.getInt(BASE.NBT)) : null;

    if (entityTag.hasKey(PATTERNS.NBT)) {
      NBTTagList patterns = entityTag.getList(PATTERNS.NBT, 10);
      for (int i = 0; i < Math.min(patterns.size(), 20); i++) {
        NBTTagCompound p = patterns.get(i);
        this.patterns.add(new Pattern(DyeColor.getByDyeData((byte) p.getInt(COLOR.NBT)), PatternType.getByIdentifier(p.getString(PATTERN.NBT))));
      }
    }
  }

  CraftMetaBanner(Map map) {
    super(map);

    String baseStr = SerializableMeta.getString(map, BASE.BUKKIT, true);
    if (baseStr != null) {
      base = DyeColor.valueOf(baseStr);
    }

    Iterable rawPatternList = SerializableMeta.getObject(Iterable.class, map, PATTERNS.BUKKIT, true);
    if (rawPatternList == null) {
      return;
    }

    for (Object obj : rawPatternList) {
      if (!(obj instanceof Pattern)) {
        throw new IllegalArgumentException("Object in pattern list is not valid. " + obj.getClass());
      }
      addPattern((Pattern) obj);
    }
  }

  @Override
  void applyToItem(NBTTagCompound tag) {
    super.applyToItem(tag);

    NBTTagCompound entityTag = new NBTTagCompound();
    if (base != null) {
      entityTag.setInt(BASE.NBT, base.getDyeData());
    }

    NBTTagList newPatterns = new NBTTagList();

    for (Pattern p : patterns) {
      NBTTagCompound compound = new NBTTagCompound();
      compound.setInt(COLOR.NBT, p.getColor().getDyeData());
      compound.setString(PATTERN.NBT, p.getPattern().getIdentifier());
      newPatterns.add(compound);
    }
    entityTag.set(PATTERNS.NBT, newPatterns);

    tag.set("BlockEntityTag", entityTag);
  }

  @Override
  public DyeColor getBaseColor() {
    return base;
  }

  @Override
  public void setBaseColor(DyeColor color) {
    base = color;
  }

  @Override
  public List getPatterns() {
    return new ArrayList(patterns);
  }

  @Override
  public void setPatterns(List patterns) {
    this.patterns = new ArrayList(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
  ImmutableMap.Builder serialize(ImmutableMap.Builder builder) {
    super.serialize(builder);

    if (base != null) {
      builder.put(BASE.BUKKIT, base.toString());
    }

    if (!patterns.isEmpty()) {
      builder.put(PATTERNS.BUKKIT, ImmutableList.copyOf(patterns));
    }

    return builder;
  }

  @Override
  int applyHash() {
    final int original;
    int hash = original = super.applyHash();
    if (base != null) {
      hash = 31 * hash + base.hashCode();
    }
    if (!patterns.isEmpty()) {
      hash = 31 * hash + patterns.hashCode();
    }
    return original != hash ? CraftMetaBanner.class.hashCode() ^ hash : hash;
  }

  @Override
  public boolean equalsCommon(CraftMetaItem meta) {
    if (!super.equalsCommon(meta)) {
      return false;
    }
    if (meta instanceof CraftMetaBanner) {
      CraftMetaBanner that = (CraftMetaBanner) meta;

      return base == that.base && patterns.equals(that.patterns);
    }
    return true;
  }

  @Override
  boolean notUncommon(CraftMetaItem meta) {
    return super.notUncommon(meta) && (meta instanceof CraftMetaBanner || (patterns.isEmpty() && base == null));
  }


  @Override
  boolean isEmpty() {
    return super.isEmpty() && patterns.isEmpty() && base == null;
  }


  @Override
  boolean applicableTo(Material type) {
    return type == Material.BANNER;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy