This repository has been archived on 2024-07-18. You can view files and clone it, but cannot push or open issues or pull requests.
mmm/src/java/mmm/tech/base/alloy_furnace/TBAFBlock.java

460 lines
14 KiB
Java

package mmm.tech.base.alloy_furnace;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.annotation.Nullable;
import mmm.MmmTech;
import mmm.core.CGui;
import mmm.core.CRegistry;
import mmm.core.api.I_RecipeRegistrar;
import mmm.utils.UMaths;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.BlockHorizontal;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool;
import net.minecraft.block.properties.PropertyDirection;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.SoundEvents;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.EnumBlockRenderType;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.Mirror;
import net.minecraft.util.Rotation;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class TBAFBlock
extends BlockContainer
implements I_RecipeRegistrar
{
private static final AxisAlignedBB AABB_BOTTOM = UMaths.makeBlockAABB( 0 , 0 , 0 , 16 , 10 , 16 );
private static final AxisAlignedBB AABB_TOP = UMaths.makeBlockAABB( 4 , 10 , 4 , 12 , 16 , 12 );
public static final PropertyDirection FACING = BlockHorizontal.FACING;
public static final PropertyBool POWERED = PropertyBool.create( "powered" );
private static boolean keepInventory = false;
public final boolean active;
public TBAFBlock( final boolean active )
{
super( Material.ROCK );
this.active = active;
this.setResistance( 17.5f );
this.setHardness( 3.5f );
this.setHarvestLevel( "pickaxe" , 0 );
this.lightOpacity = 0;
this.translucent = false;
this.fullBlock = false;
this.lightValue = active ? 13 : 0;
this.setDefaultState( this.blockState.getBaseState( ) //
.withProperty( TBAFBlock.FACING , EnumFacing.NORTH ) //
.withProperty( TBAFBlock.POWERED , Boolean.valueOf( false ) ) );
CRegistry.setIdentifiers( this , "tech" , "base" , "alloy_furnace" , active ? "active" : "inactive" );
}
@Override
public void registerRecipes( )
{
if ( !this.active ) {
GameRegistry.addShapedRecipe( new ItemStack( MmmTech.MACHINES.ALLOY_FURNACE.ITEM ) , //
"BBB" , //
"BFB" , //
"BBB" , //
'B' , Blocks.BRICK_BLOCK , //
'F' , Blocks.FURNACE );
}
}
// *************************************************************************************************
// TILE ENTITY
// *************************************************************************************************
@Override
public TileEntity createNewTileEntity( final World worldIn , final int meta )
{
return new TBAFTileEntity( );
}
public static void setState( final boolean burning , final World world , final BlockPos pos )
{
final IBlockState iblockstate = world.getBlockState( pos );
final TileEntity tileentity = world.getTileEntity( pos );
TBAFBlock.keepInventory = true;
IBlockState nState;
Block nBlock;
if ( burning ) {
nBlock = MmmTech.MACHINES.ALLOY_FURNACE.ACTIVE;
} else {
nBlock = MmmTech.MACHINES.ALLOY_FURNACE.INACTIVE;
}
nState = nBlock.getDefaultState( ) //
.withProperty( TBAFBlock.FACING , iblockstate.getValue( TBAFBlock.FACING ) ) //
.withProperty( TBAFBlock.POWERED , iblockstate.getValue( TBAFBlock.POWERED ) );
world.setBlockState( pos , nState , 3 );
TBAFBlock.keepInventory = false;
if ( tileentity != null ) {
tileentity.validate( );
world.setTileEntity( pos , tileentity );
}
}
// *************************************************************************************************
// RENDERING AND COLLISIONS
// *************************************************************************************************
@Override
public boolean isOpaqueCube( final IBlockState state )
{
return false;
}
@Override
public boolean isFullCube( final IBlockState state )
{
return false;
}
@Override
public EnumBlockRenderType getRenderType( final IBlockState state )
{
return EnumBlockRenderType.MODEL;
}
@Override
@SideOnly( Side.CLIENT )
public BlockRenderLayer getBlockLayer( )
{
return BlockRenderLayer.CUTOUT;
}
@Override
@SideOnly( Side.CLIENT )
public void randomDisplayTick( final IBlockState stateIn , final World worldIn , final BlockPos pos ,
final Random rand )
{
if ( this.active ) {
if ( rand.nextDouble( ) < .1 ) {
worldIn.playSound( pos.getX( ) + .5 , pos.getY( ) , pos.getZ( ) + .5 ,
SoundEvents.BLOCK_FURNACE_FIRE_CRACKLE , SoundCategory.BLOCKS , 1.f , 1.f , false );
}
if ( rand.nextDouble( ) < .25 ) {
this.spawnFrontParticles( stateIn , worldIn , pos , rand );
}
if ( rand.nextDouble( ) < .5 ) {
for ( int i = 0 ; i < 4 ; i++ ) {
this.spawnTopParticles( stateIn , worldIn , pos , rand );
}
}
}
}
private void spawnTopParticles( final IBlockState stateIn , final World worldIn , final BlockPos pos ,
final Random rand )
{
final double spawnX = pos.getX( ) + .5 + ( rand.nextDouble( ) - .5 ) * 4.5 / 16.;
final double spawnY = pos.getY( ) + ( 15. + 3. * rand.nextDouble( ) ) / 16.;
final double spawnZ = pos.getZ( ) + .5 + ( rand.nextDouble( ) - .5 ) * 4.5 / 16.;
worldIn.spawnParticle( EnumParticleTypes.SMOKE_NORMAL , spawnX , spawnY , spawnZ , 0. , 0. , 0. );
worldIn.spawnParticle( EnumParticleTypes.FLAME , spawnX , spawnY , spawnZ , 0. , 0. , 0. );
}
private void spawnFrontParticles( final IBlockState stateIn , final World worldIn , final BlockPos pos ,
final Random rand )
{
final double cx = pos.getX( ) + .5;
final double cz = pos.getZ( ) + .5;
final double frontOffset = .52;
final double spawnY = pos.getY( ) + ( 4. + rand.nextDouble( ) * 4. ) / 16.;
final double pSide = ( rand.nextDouble( ) - .5 ) * 10. / 16.;
double spawnX , spawnZ;
switch ( stateIn.getValue( TBAFBlock.FACING ) ) {
case WEST:
spawnX = cx - frontOffset;
spawnZ = cz + pSide;
break;
case EAST:
spawnX = cx + frontOffset;
spawnZ = cz + pSide;
break;
case NORTH:
spawnX = cx + pSide;
spawnZ = cz - frontOffset;
break;
case SOUTH:
spawnX = cx + pSide;
spawnZ = cz + frontOffset;
break;
default:
return;
}
worldIn.spawnParticle( EnumParticleTypes.SMOKE_NORMAL , spawnX , spawnY , spawnZ , 0. , 0. , 0. );
worldIn.spawnParticle( EnumParticleTypes.FLAME , spawnX , spawnY , spawnZ , 0. , 0. , 0. );
}
@Override
public AxisAlignedBB getBoundingBox( final IBlockState state , final IBlockAccess source , final BlockPos pos )
{
return Block.FULL_BLOCK_AABB;
}
@Override
public void addCollisionBoxToList( final IBlockState state , final World worldIn , final BlockPos pos ,
final AxisAlignedBB entityBox , final List< AxisAlignedBB > collidingBoxes , final Entity entityIn )
{
Block.addCollisionBoxToList( pos , entityBox , collidingBoxes , TBAFBlock.AABB_TOP );
Block.addCollisionBoxToList( pos , entityBox , collidingBoxes , TBAFBlock.AABB_BOTTOM );
}
// *************************************************************************************************
// ITEM
// *************************************************************************************************
@Override
@Nullable
public Item getItemDropped( final IBlockState state , final Random rand , final int fortune )
{
return MmmTech.MACHINES.ALLOY_FURNACE.ITEM;
}
@Override
public List< ItemStack > getDrops( final IBlockAccess world , final BlockPos pos , final IBlockState state ,
final int fortune )
{
return new ArrayList< ItemStack >( );
}
// *************************************************************************************************
// DIRECTION
// *************************************************************************************************
@Override
protected BlockStateContainer createBlockState( )
{
return new BlockStateContainer( this , new IProperty[] {
TBAFBlock.FACING , TBAFBlock.POWERED
} );
}
@Override
public IBlockState getStateFromMeta( final int meta )
{
final boolean powered = ( meta & 8 ) == 8;
EnumFacing enumfacing = EnumFacing.getFront( meta & 7 );
if ( enumfacing.getAxis( ) == EnumFacing.Axis.Y ) {
enumfacing = EnumFacing.NORTH;
}
return this.getDefaultState( ) //
.withProperty( TBAFBlock.FACING , enumfacing ) //
.withProperty( TBAFBlock.POWERED , powered );
}
@Override
public int getMetaFromState( final IBlockState state )
{
return state.getValue( TBAFBlock.FACING ).getIndex( ) //
| ( state.getValue( TBAFBlock.POWERED ) ? 8 : 0 );
}
@Override
public void onBlockPlacedBy( final World worldIn , final BlockPos pos , final IBlockState state ,
final EntityLivingBase placer , final ItemStack stack )
{
worldIn.setBlockState( pos , state.withProperty( //
TBAFBlock.FACING , placer.getHorizontalFacing( ).getOpposite( ) ) , 2 );
if ( stack.hasDisplayName( ) ) {
final TileEntity tileentity = worldIn.getTileEntity( pos );
if ( tileentity instanceof TBAFTileEntity ) {
( (TBAFTileEntity) tileentity ).setCustomName( stack.getDisplayName( ) );
}
}
}
@Override
public IBlockState onBlockPlaced( final World worldIn , final BlockPos pos , final EnumFacing facing ,
final float hitX , final float hitY , final float hitZ , final int meta , final EntityLivingBase placer )
{
return this.getDefaultState( ).withProperty( //
TBAFBlock.FACING , placer.getHorizontalFacing( ).getOpposite( ) );
}
@Override
public IBlockState withRotation( final IBlockState state , final Rotation rot )
{
return state.withProperty( TBAFBlock.FACING , rot.rotate( state.getValue( TBAFBlock.FACING ) ) );
}
@Override
public IBlockState withMirror( final IBlockState state , final Mirror mirrorIn )
{
return state.withRotation( mirrorIn.toRotation( state.getValue( TBAFBlock.FACING ) ) );
}
// *************************************************************************************************
// SUPPORT REQUIREMENT
// *************************************************************************************************
@Override
public boolean isSideSolid( final IBlockState base_state , final IBlockAccess world , final BlockPos pos ,
final EnumFacing side )
{
return side == EnumFacing.DOWN;
}
// *************************************************************************************************
// INTERACTION
// *************************************************************************************************
@Override
public boolean onBlockActivated( final World worldIn , final BlockPos pos , final IBlockState state ,
final EntityPlayer playerIn , final EnumHand hand , final ItemStack heldItem , final EnumFacing side ,
final float hitX , final float hitY , final float hitZ )
{
final TileEntity te = worldIn.getTileEntity( pos );
if ( ! ( te instanceof TBAFTileEntity ) || playerIn.isSneaking( ) ) {
return false;
}
CGui.openTileEntityGUI( playerIn , worldIn , pos );
return true;
}
@Override
public void breakBlock( final World worldIn , final BlockPos pos , final IBlockState state )
{
if ( !TBAFBlock.keepInventory ) {
final TileEntity tileEntity = worldIn.getTileEntity( pos );
if ( tileEntity instanceof TBAFTileEntity ) {
final TBAFTileEntity afte = (TBAFTileEntity) tileEntity;
afte.cancelAlloying( );
InventoryHelper.dropInventoryItems( worldIn , pos , afte.input );
InventoryHelper.dropInventoryItems( worldIn , pos , afte.fuel );
InventoryHelper.dropInventoryItems( worldIn , pos , afte.output );
final ItemStack stack = new ItemStack( MmmTech.MACHINES.ALLOY_FURNACE.ITEM , 1 );
if ( afte.hasCustomName( ) ) {
stack.setStackDisplayName( afte.getName( ) );
}
InventoryHelper.spawnItemStack( worldIn , pos.getX( ) , pos.getY( ) , pos.getZ( ) , stack );
}
worldIn.updateComparatorOutputLevel( pos , this );
}
super.breakBlock( worldIn , pos , state );
}
// *************************************************************************************************
// REDSTONE
// *************************************************************************************************
@Override
public boolean hasComparatorInputOverride( final IBlockState state )
{
return true;
}
@Override
public int getComparatorInputOverride( final IBlockState blockState , final World worldIn , final BlockPos pos )
{
final TileEntity te = worldIn.getTileEntity( pos );
if ( ! ( te instanceof TBAFTileEntity ) ) {
return 0;
}
return ( (TBAFTileEntity) te ).getComparatorValue( );
}
@Override
public void neighborChanged( final IBlockState state , final World worldIn , final BlockPos pos ,
final Block blockIn )
{
this.checkIfPowered( state , worldIn , pos );
}
@Override
public void onBlockAdded( final World worldIn , final BlockPos pos , final IBlockState state )
{
this.checkIfPowered( state , worldIn , pos );
}
private void checkIfPowered( final IBlockState state , final World worldIn , final BlockPos pos )
{
final boolean powered = worldIn.isBlockPowered( pos );
if ( powered != state.getValue( TBAFBlock.POWERED ).booleanValue( ) ) {
worldIn.setBlockState( pos , state.withProperty( TBAFBlock.POWERED , powered ) , 4 );
}
}
public static boolean isPowered( final int meta )
{
return ( meta & 8 ) == 8;
}
}