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

173 lines
5.9 KiB
Java
Raw Normal View History

package WayofTime.bloodmagic.block;
2017-08-15 21:30:48 -07:00
import WayofTime.bloodmagic.BloodMagic;
2018-03-07 19:43:00 -08:00
import WayofTime.bloodmagic.client.IVariantProvider;
import WayofTime.bloodmagic.soul.IDemonWillGem;
import WayofTime.bloodmagic.soul.IDiscreteDemonWill;
2017-08-15 21:30:48 -07:00
import WayofTime.bloodmagic.tile.TileDemonCrucible;
import WayofTime.bloodmagic.util.Utils;
import com.google.common.collect.Lists;
2017-01-01 21:43:34 -08:00
import net.minecraft.block.Block;
import net.minecraft.block.BlockRenderType;
import net.minecraft.block.BlockState;
import net.minecraft.block.material.Material;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.Hand;
import net.minecraft.util.math.AxisAlignedBB;
2016-03-18 13:16:38 -04:00
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.Vec3d;
2016-03-18 13:16:38 -04:00
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
2017-01-01 21:43:34 -08:00
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
2017-01-01 21:43:34 -08:00
2017-08-15 21:30:48 -07:00
public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBlock {
protected static final AxisAlignedBB BODY = new AxisAlignedBB(2 / 16F, 7 / 16F, 2 / 16F, 14 / 16F, 15 / 16F, 14 / 16F);
private static final AxisAlignedBB[] ARMS = {
new AxisAlignedBB(5 / 16F, 13 / 16F, 0 / 16F, 11 / 16F, 25 / 16F, 2 / 16F), // N
new AxisAlignedBB(14 / 16F, 13 / 16F, 5 / 16F, 16 / 16F, 25 / 16F, 11 / 16F), // E
new AxisAlignedBB(5 / 16F, 13 / 16F, 14 / 16F, 11 / 16F, 25 / 16F, 16 / 16F), // S
new AxisAlignedBB(0 / 16F, 13 / 16F, 5 / 16F, 2 / 16F, 25 / 16F, 11 / 16F) // W
};
private static final AxisAlignedBB[] FEET = {
new AxisAlignedBB(10 / 16F, 0F, 2 / 16F, 14 / 16F, 7 / 16F, 6 / 16F), // NE
new AxisAlignedBB(10 / 16F, 0F, 10 / 16F, 14 / 16F, 7 / 16F, 14 / 16F), // SE
new AxisAlignedBB(2 / 16F, 0F, 10 / 16F, 6 / 16F, 7 / 16F, 14 / 16F), // SW
new AxisAlignedBB(2 / 16F, 0F, 2 / 16F, 6 / 16F, 7 / 16F, 6 / 16F) // NW
};
2017-08-15 21:30:48 -07:00
public BlockDemonCrucible() {
2016-04-24 10:06:28 -07:00
super(Material.ROCK);
2019-01-31 19:10:37 -08:00
setTranslationKey(BloodMagic.MODID + ".demonCrucible");
setCreativeTab(BloodMagic.TAB_BM);
setHardness(2.0F);
setResistance(5.0F);
setHarvestLevel("pickaxe", 0);
// setBlockBounds(0.3F, 0F, 0.3F, 0.72F, 1F, 0.72F);
}
private static List<AxisAlignedBB> getCollisionBoxList(BlockState state) {
ArrayList<AxisAlignedBB> collBox = new ArrayList<>(Arrays.asList(ARMS));
collBox.add(BODY);
collBox.addAll(Arrays.asList(FEET));
return collBox;
}
@Override
public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) {
return BODY;
}
@Override
public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) {
return false;
}
@Override
public boolean isOpaqueCube(BlockState state) {
return false;
}
@Override
public boolean causesSuffocation(BlockState state) {
return false;
}
@Override
public BlockRenderType getRenderType(BlockState state) {
return BlockRenderType.MODEL;
}
@Override
public boolean onBlockActivated(World world, BlockPos pos, BlockState state, PlayerEntity player, Hand hand, Direction side, float hitX, float hitY, float hitZ) {
2017-01-01 21:43:34 -08:00
ItemStack heldItem = player.getHeldItem(hand);
TileDemonCrucible crucible = (TileDemonCrucible) world.getTileEntity(pos);
if (crucible == null || player.isSneaking())
return false;
2017-08-15 21:30:48 -07:00
if (!heldItem.isEmpty()) {
if (!(heldItem.getItem() instanceof IDiscreteDemonWill) && !(heldItem.getItem() instanceof IDemonWillGem)) {
return true;
}
}
Utils.insertItemToTile(crucible, player);
2016-03-18 13:16:38 -04:00
world.notifyBlockUpdate(pos, state, state, 3);
return true;
}
@Override
public void breakBlock(World world, BlockPos blockPos, BlockState blockState) {
TileDemonCrucible tile = (TileDemonCrucible) world.getTileEntity(blockPos);
if (tile != null)
tile.dropItems();
super.breakBlock(world, blockPos, blockState);
}
2016-03-16 15:37:55 -07:00
2017-01-01 21:43:34 -08:00
@Override
public boolean hasTileEntity(BlockState state) {
2017-01-01 21:43:34 -08:00
return true;
}
@Nullable
@Override
public TileEntity createTileEntity(World world, BlockState state) {
2017-01-01 21:43:34 -08:00
return new TileDemonCrucible();
}
2017-08-15 21:24:59 -07:00
@Override
public BlockItem getItem() {
return new BlockItem(this);
2017-08-15 21:24:59 -07:00
}
@Override
public RayTraceResult collisionRayTrace(BlockState blockState, World worldIn, BlockPos pos, Vec3d start, Vec3d end) {
List<RayTraceResult> list = Lists.newArrayList();
for (AxisAlignedBB axisalignedbb : getCollisionBoxList(this.getActualState(blockState, worldIn, pos))) {
list.add(this.rayTrace(pos, start, end, axisalignedbb));
}
RayTraceResult rayTrace = null;
double d1 = 0.0D;
for (RayTraceResult raytraceresult : list) {
if (raytraceresult != null) {
double d0 = raytraceresult.hitVec.squareDistanceTo(end);
if (d0 > d1) {
rayTrace = raytraceresult;
d1 = d0;
}
}
}
return rayTrace;
}
@Override
public void addCollisionBoxToList(BlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List<AxisAlignedBB> collidingBoxes, @Nullable Entity entityIn, boolean bool) {
state = this.getActualState(state, worldIn, pos);
for (AxisAlignedBB axisalignedbb : getCollisionBoxList(state)) {
addCollisionBoxToList(pos, entityBox, collidingBoxes, axisalignedbb);
}
}
}