package net.minecraft.tileentity; import com.google.common.collect.Lists; import java.util.List; import javax.annotation.Nullable; import net.minecraft.item.EnumDyeColor; import net.minecraft.item.ItemBanner; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.play.server.SPacketUpdateTileEntity; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.IWorldNameable; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class TileEntityBanner extends TileEntity implements IWorldNameable { private String name; private EnumDyeColor baseColor = EnumDyeColor.BLACK; /** A list of all the banner patterns. */ private NBTTagList patterns; private boolean patternDataSet; /** A list of all patterns stored on this banner. */ private List patternList; /** A list of all the color values stored on this banner. */ private List colorList; /** This is a String representation of this banners pattern and color lists, used for texture caching. */ private String patternResourceLocation; public void setItemValues(ItemStack stack, boolean p_175112_2_) { this.patterns = null; NBTTagCompound nbttagcompound = stack.getSubCompound("BlockEntityTag"); if (nbttagcompound != null && nbttagcompound.hasKey("Patterns", 9)) { this.patterns = nbttagcompound.getTagList("Patterns", 10).copy(); } this.baseColor = p_175112_2_ ? getColor(stack) : ItemBanner.getBaseColor(stack); this.patternList = null; this.colorList = null; this.patternResourceLocation = ""; this.patternDataSet = true; this.name = stack.hasDisplayName() ? stack.getDisplayName() : null; } /** * Get the name of this object. For players this returns their username */ public String getName() { return this.hasCustomName() ? this.name : "banner"; } /** * Returns true if this thing is named */ public boolean hasCustomName() { return this.name != null && !this.name.isEmpty(); } /** * Get the formatted ChatComponent that will be used for the sender's username in chat */ public ITextComponent getDisplayName() { return (ITextComponent)(this.hasCustomName() ? new TextComponentString(this.getName()) : new TextComponentTranslation(this.getName(), new Object[0])); } public NBTTagCompound writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); compound.setInteger("Base", this.baseColor.getDyeDamage()); if (this.patterns != null) { compound.setTag("Patterns", this.patterns); } if (this.hasCustomName()) { compound.setString("CustomName", this.name); } return compound; } public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); if (compound.hasKey("CustomName", 8)) { this.name = compound.getString("CustomName"); } this.baseColor = EnumDyeColor.byDyeDamage(compound.getInteger("Base")); this.patterns = compound.getTagList("Patterns", 10); this.patternList = null; this.colorList = null; this.patternResourceLocation = null; this.patternDataSet = true; } @Nullable public SPacketUpdateTileEntity getUpdatePacket() { return new SPacketUpdateTileEntity(this.pos, 6, this.getUpdateTag()); } public NBTTagCompound getUpdateTag() { return this.writeToNBT(new NBTTagCompound()); } /** * Retrieves the amount of patterns stored on an ItemStack. If the tag does not exist this value will be 0. */ public static int getPatterns(ItemStack stack) { NBTTagCompound nbttagcompound = stack.getSubCompound("BlockEntityTag"); return nbttagcompound != null && nbttagcompound.hasKey("Patterns") ? nbttagcompound.getTagList("Patterns", 10).tagCount() : 0; } /** * Retrieves the list of patterns for this tile entity. The banner data will be initialized/refreshed before this * happens. */ @SideOnly(Side.CLIENT) public List getPatternList() { this.initializeBannerData(); return this.patternList; } /** * Retrieves the list of colors for this tile entity. The banner data will be initialized/refreshed before this * happens. */ @SideOnly(Side.CLIENT) public List getColorList() { this.initializeBannerData(); return this.colorList; } @SideOnly(Side.CLIENT) public String getPatternResourceLocation() { this.initializeBannerData(); return this.patternResourceLocation; } /** * Establishes all of the basic properties for the banner. This will also apply the data from the tile entities nbt * tag compounds. */ @SideOnly(Side.CLIENT) private void initializeBannerData() { if (this.patternList == null || this.colorList == null || this.patternResourceLocation == null) { if (!this.patternDataSet) { this.patternResourceLocation = ""; } else { this.patternList = Lists.newArrayList(); this.colorList = Lists.newArrayList(); this.patternList.add(BannerPattern.BASE); this.colorList.add(this.baseColor); this.patternResourceLocation = "b" + this.baseColor.getDyeDamage(); if (this.patterns != null) { for (int i = 0; i < this.patterns.tagCount(); ++i) { NBTTagCompound nbttagcompound = this.patterns.getCompoundTagAt(i); BannerPattern bannerpattern = BannerPattern.byHash(nbttagcompound.getString("Pattern")); if (bannerpattern != null) { this.patternList.add(bannerpattern); int j = nbttagcompound.getInteger("Color"); this.colorList.add(EnumDyeColor.byDyeDamage(j)); this.patternResourceLocation = this.patternResourceLocation + bannerpattern.getHashname() + j; } } } } } } /** * Removes all the banner related data from a provided instance of ItemStack. */ public static void removeBannerData(ItemStack stack) { NBTTagCompound nbttagcompound = stack.getSubCompound("BlockEntityTag"); if (nbttagcompound != null && nbttagcompound.hasKey("Patterns", 9)) { NBTTagList nbttaglist = nbttagcompound.getTagList("Patterns", 10); if (!nbttaglist.hasNoTags()) { nbttaglist.removeTag(nbttaglist.tagCount() - 1); if (nbttaglist.hasNoTags()) { stack.getTagCompound().removeTag("BlockEntityTag"); if (stack.getTagCompound().hasNoTags()) { stack.setTagCompound((NBTTagCompound)null); } } } } } public ItemStack getItem() { ItemStack itemstack = ItemBanner.makeBanner(this.baseColor, this.patterns); if (this.hasCustomName()) { itemstack.setStackDisplayName(this.getName()); } return itemstack; } public static EnumDyeColor getColor(ItemStack p_190616_0_) { NBTTagCompound nbttagcompound = p_190616_0_.getSubCompound("BlockEntityTag"); return nbttagcompound != null && nbttagcompound.hasKey("Base") ? EnumDyeColor.byDyeDamage(nbttagcompound.getInteger("Base")) : EnumDyeColor.BLACK; } }