package common.block; import common.entity.npc.EntityNPC; import common.init.Items; import common.item.Item; import common.item.ItemStack; import common.material.Material; import common.model.Transforms; import common.nbt.NBTTagCompound; import common.properties.IProperty; import common.properties.PropertyDirection; import common.properties.PropertyInteger; import common.rng.Random; import common.tileentity.TileEntity; import common.tileentity.TileEntityBanner; import common.world.BlockPos; import common.world.BoundingBox; import common.world.Facing; import common.world.IBlockAccess; import common.world.IWorldAccess; import common.world.State; import common.world.World; public class BlockBanner extends BlockContainer { public static final PropertyDirection FACING = PropertyDirection.create("facing", Facing.Plane.HORIZONTAL); public static final PropertyInteger ROTATION = PropertyInteger.create("rotation", 0, 15); public BlockBanner() { super(Material.wood); float f = 0.25F; float f1 = 1.0F; this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f1, 0.5F + f); } // /** // * Gets the localized name of this block. Used for the statistics page. // */ // public String getLocalizedName() // { // return "Banner"; // } public boolean isPickStrict() { return true; } public BoundingBox getCollisionBoundingBox(World worldIn, BlockPos pos, State state) { return null; } public BoundingBox getSelectedBoundingBox(World worldIn, BlockPos pos) { this.setBlockBoundsBasedOnState(worldIn, pos); return super.getSelectedBoundingBox(worldIn, pos); } public boolean isFullCube() { return false; } public boolean isPassable(IBlockAccess worldIn, BlockPos pos) { return true; } /** * Used to determine ambient occlusion and culling when rebuilding chunks for render */ public boolean isOpaqueCube() { return false; } /** * Return true if an entity can be spawned inside the block (used to get the player's bed spawn location) */ public boolean canSpawnInBlock() { return true; } /** * Returns a new instance of a block's tile entity class. Called on placing the block. */ public TileEntity createNewTileEntity(World worldIn, int meta) { return new TileEntityBanner(); } /** * Get the Item that this Block should drop when harvested. */ public Item getItemDropped(State state, Random rand, int fortune) { return Items.banner; } public Item getItem(World worldIn, BlockPos pos) { return Items.banner; } public int getDamageValue(World worldIn, BlockPos pos) { TileEntity te = worldIn.getTileEntity(pos); if(te instanceof TileEntityBanner) return ((TileEntityBanner)te).getBaseColor(); return super.getDamageValue(worldIn, pos); } /** * Spawns this Block's drops into the World as EntityItems. */ public void dropBlockAsItemWithChance(World worldIn, BlockPos pos, State state, float chance, int fortune) { TileEntity tileentity = worldIn.getTileEntity(pos); if (tileentity instanceof TileEntityBanner) { ItemStack itemstack = new ItemStack(Items.banner, 1, ((TileEntityBanner)tileentity).getBaseColor()); NBTTagCompound nbttagcompound = new NBTTagCompound(); tileentity.writeToNBT(nbttagcompound); nbttagcompound.removeTag("x"); nbttagcompound.removeTag("y"); nbttagcompound.removeTag("z"); nbttagcompound.removeTag("id"); itemstack.setTagInfo("BlockEntityTag", nbttagcompound); spawnAsEntity(worldIn, pos, itemstack); } else { super.dropBlockAsItemWithChance(worldIn, pos, state, chance, fortune); } } public boolean canPlaceBlockAt(World worldIn, BlockPos pos) { return !this.hasInvalidNeighbor(worldIn, pos) && super.canPlaceBlockAt(worldIn, pos); } public void harvestBlock(World worldIn, EntityNPC player, BlockPos pos, State state, TileEntity te) { if (te instanceof TileEntityBanner) { TileEntityBanner tileentitybanner = (TileEntityBanner)te; ItemStack itemstack = new ItemStack(Items.banner, 1, ((TileEntityBanner)te).getBaseColor()); NBTTagCompound nbttagcompound = new NBTTagCompound(); TileEntityBanner.setBaseColorAndPatterns(nbttagcompound, tileentitybanner.getBaseColor(), tileentitybanner.getPatterns()); itemstack.setTagInfo("BlockEntityTag", nbttagcompound); spawnAsEntity(worldIn, pos, itemstack); } else { super.harvestBlock(worldIn, player, pos, state, (TileEntity)null); } } public Transforms getTransform() { return Transforms.BANNER; } public static class BlockBannerHanging extends BlockBanner { public BlockBannerHanging() { this.setDefaultState(this.getBaseState().withProperty(FACING, Facing.NORTH)); } public void setBlockBoundsBasedOnState(IWorldAccess worldIn, BlockPos pos) { Facing enumfacing = (Facing)worldIn.getState(pos).getValue(FACING); float f = 0.0F; float f1 = 0.78125F; float f2 = 0.0F; float f3 = 1.0F; float f4 = 0.125F; this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); switch (enumfacing) { case NORTH: default: this.setBlockBounds(f2, f, 1.0F - f4, f3, f1, 1.0F); break; case SOUTH: this.setBlockBounds(f2, f, 0.0F, f3, f1, f4); break; case WEST: this.setBlockBounds(1.0F - f4, f, f2, 1.0F, f1, f3); break; case EAST: this.setBlockBounds(0.0F, f, f2, f4, f1, f3); } } public void onNeighborBlockChange(World worldIn, BlockPos pos, State state, Block neighborBlock) { Facing enumfacing = (Facing)state.getValue(FACING); if (!worldIn.getState(pos.offset(enumfacing.getOpposite())).getBlock().getMaterial().isSolid()) { this.dropBlockAsItem(worldIn, pos, state, 0); worldIn.setBlockToAir(pos); } super.onNeighborBlockChange(worldIn, pos, state, neighborBlock); } public State getStateFromMeta(int meta) { Facing enumfacing = Facing.getFront(meta); if (enumfacing.getAxis() == Facing.Axis.Y) { enumfacing = Facing.NORTH; } return this.getState().withProperty(FACING, enumfacing); } public int getMetaFromState(State state) { return ((Facing)state.getValue(FACING)).getIndex(); } protected IProperty[] getProperties() { return new IProperty[] {FACING}; } } public static class BlockBannerStanding extends BlockBanner { public BlockBannerStanding() { this.setDefaultState(this.getBaseState().withProperty(ROTATION, Integer.valueOf(0))); } public void onNeighborBlockChange(World worldIn, BlockPos pos, State state, Block neighborBlock) { if (!worldIn.getState(pos.down()).getBlock().getMaterial().isSolid()) { this.dropBlockAsItem(worldIn, pos, state, 0); worldIn.setBlockToAir(pos); } super.onNeighborBlockChange(worldIn, pos, state, neighborBlock); } public State getStateFromMeta(int meta) { return this.getState().withProperty(ROTATION, Integer.valueOf(meta)); } public int getMetaFromState(State state) { return ((Integer)state.getValue(ROTATION)).intValue(); } protected IProperty[] getProperties() { return new IProperty[] {ROTATION}; } } }