tcr/java/src/game/block/BlockBanner.java

274 lines
8.1 KiB
Java
Raw Normal View History

2025-03-11 00:23:54 +01:00
package game.block;
import game.entity.npc.EntityNPC;
import game.init.Items;
import game.item.Item;
import game.item.ItemStack;
import game.material.Material;
2025-05-04 20:27:55 +02:00
import game.model.Transforms;
2025-03-11 00:23:54 +01:00
import game.nbt.NBTTagCompound;
import game.properties.IProperty;
import game.properties.PropertyDirection;
import game.properties.PropertyInteger;
import game.rng.Random;
import game.tileentity.TileEntity;
import game.tileentity.TileEntityBanner;
import game.world.BlockPos;
import game.world.BoundingBox;
import game.world.Facing;
import game.world.IBlockAccess;
import game.world.IWorldAccess;
import game.world.State;
import game.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};
}
}
}