2025-05-07 18:19:24 +02:00
|
|
|
package common.block;
|
2025-03-11 00:23:54 +01:00
|
|
|
|
2025-05-07 18:19:24 +02:00
|
|
|
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;
|
2025-03-11 00:23:54 +01:00
|
|
|
|
|
|
|
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};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|