460 lines
14 KiB
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;
|
|
}
|
|
}
|