BloodMagic/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java

222 lines
7.7 KiB
Java
Raw Normal View History

2016-08-14 14:53:25 -04:00
package WayofTime.bloodmagic.block;
2017-08-15 21:30:48 -07:00
import WayofTime.bloodmagic.BloodMagic;
import WayofTime.bloodmagic.api.altar.EnumAltarComponent;
import WayofTime.bloodmagic.api.altar.IAltarComponent;
2017-01-01 21:43:34 -08:00
import WayofTime.bloodmagic.block.base.BlockEnum;
2017-08-15 21:30:48 -07:00
import WayofTime.bloodmagic.block.enums.EnumMimic;
import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks;
import WayofTime.bloodmagic.tile.TileMimic;
import WayofTime.bloodmagic.util.Utils;
2016-08-14 14:53:25 -04:00
import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
2017-01-01 21:43:34 -08:00
import net.minecraft.init.Blocks;
2016-08-14 14:53:25 -04:00
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.EnumBlockRenderType;
2016-08-14 14:53:25 -04:00
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
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.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
2017-08-15 21:30:48 -07:00
import javax.annotation.Nullable;
2016-08-14 14:53:25 -04:00
2017-08-15 21:30:48 -07:00
public class BlockMimic extends BlockEnum<EnumMimic> implements IAltarComponent {
public static final int sentientMimicMeta = 4;
2016-08-14 14:53:25 -04:00
2017-08-15 21:30:48 -07:00
public BlockMimic() {
super(Material.ROCK, EnumMimic.class);
2016-08-14 14:53:25 -04:00
setUnlocalizedName(BloodMagic.MODID + ".mimic.");
setCreativeTab(BloodMagic.TAB_BM);
2016-08-14 14:53:25 -04:00
setHardness(2.0F);
setResistance(5.0F);
setSoundType(SoundType.STONE);
setHarvestLevel("pickaxe", 0);
setLightOpacity(15);
2016-08-14 14:53:25 -04:00
}
@Nullable
2017-01-01 21:43:34 -08:00
@Override
2017-08-15 21:30:48 -07:00
public AxisAlignedBB getCollisionBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) {
switch (this.getMetaFromState(state)) {
case 1:
case 2:
case 3:
case 4:
TileMimic tileMimic = (TileMimic) world.getTileEntity(pos);
if (tileMimic != null && !tileMimic.getStackInSlot(0).isEmpty()) {
Block mimicBlock = Block.getBlockFromItem(tileMimic.getStackInSlot(0).getItem());
if (mimicBlock == Blocks.AIR) {
return FULL_BLOCK_AABB;
}
IBlockState mimicState = mimicBlock.getStateFromMeta(tileMimic.metaOfReplacedBlock);
if (mimicBlock != this) {
return mimicState.getCollisionBoundingBox(world, pos);
}
} else {
return FULL_BLOCK_AABB;
}
2017-08-15 21:30:48 -07:00
case 0:
default:
return NULL_AABB;
}
2016-08-14 14:53:25 -04:00
}
@Override
@SideOnly(Side.CLIENT)
2017-08-15 21:30:48 -07:00
public AxisAlignedBB getSelectedBoundingBox(IBlockState state, World world, BlockPos pos) {
TileMimic tileMimic = (TileMimic) world.getTileEntity(pos);
2017-08-15 21:30:48 -07:00
if (tileMimic != null && !tileMimic.getStackInSlot(0).isEmpty()) {
Block mimicBlock = Block.getBlockFromItem(tileMimic.getStackInSlot(0).getItem());
2017-08-15 21:30:48 -07:00
if (mimicBlock == Blocks.AIR) {
return FULL_BLOCK_AABB;
}
IBlockState mimicState = mimicBlock.getStateFromMeta(tileMimic.getStackInSlot(0).getItemDamage());
2017-08-15 21:30:48 -07:00
if (mimicBlock != this) {
return mimicState.getSelectedBoundingBox(world, pos);
}
}
return FULL_BLOCK_AABB;
}
@Override
2017-08-15 21:30:48 -07:00
public int getLightOpacity(IBlockState state) {
switch (this.getMetaFromState(state)) {
case 2:
case 4:
return 0;
default:
return this.lightOpacity;
}
}
@Override
2017-08-15 21:30:48 -07:00
public int getLightValue(IBlockState state) {
switch (this.getMetaFromState(state)) {
case 3:
return 15;
default:
return this.lightValue;
}
}
@Override
2017-08-15 21:30:48 -07:00
public int getMetaFromState(IBlockState state) {
if (state.getBlock() == this) {
return super.getMetaFromState(state);
}
return state.getBlock().getMetaFromState(state);
}
2016-08-14 14:53:25 -04:00
@Override
2017-01-01 21:43:34 -08:00
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) {
2016-08-14 14:53:25 -04:00
TileMimic mimic = (TileMimic) world.getTileEntity(pos);
2017-01-01 21:43:34 -08:00
return mimic != null && mimic.onBlockActivated(world, pos, state, player, hand, player.getHeldItem(hand), side);
2016-08-14 14:53:25 -04:00
}
@Override
2017-08-15 21:30:48 -07:00
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) {
2016-08-14 14:53:25 -04:00
TileEntity tile = world.getTileEntity(pos);
2017-08-15 21:30:48 -07:00
if (tile instanceof TileMimic) {
2016-08-14 14:53:25 -04:00
TileMimic mimic = (TileMimic) tile;
ItemStack stack = mimic.getStackInSlot(0);
2017-08-15 21:30:48 -07:00
if (stack.getItem() instanceof ItemBlock) {
2016-08-14 14:53:25 -04:00
Block block = ((ItemBlock) stack.getItem()).getBlock();
IBlockState mimicState = block.getStateFromMeta(stack.getItemDamage());
2017-08-15 21:30:48 -07:00
if (block != this) {
if (block.getRenderType(mimicState) == EnumBlockRenderType.ENTITYBLOCK_ANIMATED) {
return RegistrarBloodMagicBlocks.BLOOD_LIGHT.getDefaultState(); //Small and invisible-ish, basically this is returned in order to not render over the animated block (TESR)
}
return block.getActualState(mimicState, world, pos);
}
2016-08-14 14:53:25 -04:00
}
}
return state;
}
@Override
2017-08-15 21:30:48 -07:00
public boolean isFullCube(IBlockState state) {
2016-08-14 14:53:25 -04:00
return false;
}
@Override
2017-08-15 21:30:48 -07:00
public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) {
2016-08-14 14:53:25 -04:00
return false;
}
@Override
2017-08-15 21:30:48 -07:00
public boolean causesSuffocation(IBlockState state) {
2016-08-14 14:53:25 -04:00
return false;
}
@Override
2017-08-15 21:30:48 -07:00
public boolean isOpaqueCube(IBlockState state) {
2016-08-14 14:53:25 -04:00
return false;
}
@Override
2017-08-15 21:30:48 -07:00
public boolean canRenderInLayer(IBlockState state, BlockRenderLayer layer) {
return layer == BlockRenderLayer.CUTOUT_MIPPED || layer == BlockRenderLayer.CUTOUT;
2016-08-14 14:53:25 -04:00
}
@Override
2017-08-15 21:30:48 -07:00
public void breakBlock(World world, BlockPos blockPos, IBlockState blockState) {
TileEntity tile = world.getTileEntity(blockPos);
2017-08-15 21:30:48 -07:00
if (tile instanceof TileMimic) {
TileMimic TileMimic = (TileMimic) world.getTileEntity(blockPos);
if (TileMimic != null)
TileMimic.dropItems();
}
super.breakBlock(world, blockPos, blockState);
}
2016-08-14 14:53:25 -04:00
@Override
2016-10-18 16:38:56 -07:00
public boolean hasTileEntity(IBlockState state) {
return true;
}
@Override
public TileEntity createTileEntity(World world, IBlockState state) {
2016-08-14 14:53:25 -04:00
return new TileMimic();
}
// IAltarComponent
@Nullable
@Override
2017-08-15 21:30:48 -07:00
public EnumAltarComponent getType(World world, IBlockState state, BlockPos pos) {
TileEntity tile = world.getTileEntity(pos);
2017-08-15 21:30:48 -07:00
if (tile instanceof TileMimic) {
TileMimic mimic = (TileMimic) tile;
ItemStack stack = mimic.getStackInSlot(0);
2017-08-15 21:30:48 -07:00
if (stack.getItem() instanceof ItemBlock) {
Block block = ((ItemBlock) stack.getItem()).getBlock();
2017-08-15 21:30:48 -07:00
if (block instanceof IAltarComponent) {
return ((IAltarComponent) block).getType(world, block.getStateFromMeta(mimic.metaOfReplacedBlock), pos);
2017-08-15 21:30:48 -07:00
} else {
for (EnumAltarComponent altarComponent : EnumAltarComponent.values())
if (block == Utils.getBlockForComponent(altarComponent))
return altarComponent;
}
}
}
return null;
}
2016-08-14 14:53:25 -04:00
}