package choonster.testmod3.world.gen; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.EnumDyeColor; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.BannerPattern; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityBanner; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.WorldProvider; import net.minecraft.world.chunk.IChunkGenerator; import net.minecraft.world.chunk.IChunkProvider; import net.minecraftforge.fml.common.IWorldGenerator; import java.util.Random; /** * Generates Banners with a specific pattern in chunks with coordinates divisible by 16. Only generates in dimensions that return true from {@link WorldProvider#isSurfaceWorld}. * <p> * Test for this thread: * http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/modification-development/2535868-banner-nbt-tags * * @author Choonster */ public class WorldGenBanner implements IWorldGenerator { private final ItemStack bannerStack = createBannerStack(); /** * Create the Banner ItemStack used as a template for the generated banners. * * @return A Banner ItemStack with the appropriate NBT data */ protected ItemStack createBannerStack() { final ItemStack bannerStack = new ItemStack(Items.BANNER); final NBTTagCompound bannerData = bannerStack.getOrCreateSubCompound("BlockEntityTag"); final NBTTagList patternsList = new NBTTagList(); bannerData.setTag("Patterns", patternsList); patternsList.appendTag(createPatternTag(BannerPattern.GRADIENT_UP, EnumDyeColor.MAGENTA)); patternsList.appendTag(createPatternTag(BannerPattern.FLOWER, EnumDyeColor.BLACK)); bannerData.setInteger("Base", EnumDyeColor.PINK.getDyeDamage()); return bannerStack; } /** * Create a compound tag for the specified pattern and colour. * * @param pattern The pattern * @param color The colour * @return The compound tag */ protected NBTTagCompound createPatternTag(BannerPattern pattern, EnumDyeColor color) { final NBTTagCompound tag = new NBTTagCompound(); tag.setString("Pattern", pattern.getHashname()); tag.setInteger("Color", color.getDyeDamage()); return tag; } /** * Generate a Banner on top of the topmost block at the specified x and z position * * @param world The world * @param pos The position */ private void generateBanner(World world, BlockPos pos) { final BlockPos newPos = world.getTopSolidOrLiquidBlock(pos); world.setBlockState(newPos, Blocks.STANDING_BANNER.getDefaultState()); final TileEntity tileEntity = world.getTileEntity(newPos); if (tileEntity instanceof TileEntityBanner) { ((TileEntityBanner) tileEntity).setItemValues(bannerStack, true); // Read the base colour from NBT rather than metadata } } @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { if (world.provider.isSurfaceWorld() && chunkX % 16 == 0 && chunkZ % 16 == 0) { final BlockPos basePos = new BlockPos(chunkX * 16, 0, chunkZ * 16); generateBanner(world, basePos); } } }