NaturesAura/src/main/java/de/ellpeck/naturesaura/blocks/BlockGoldPowder.java

209 lines
8.1 KiB
Java
Raw Normal View History

2018-10-16 01:36:30 +02:00
package de.ellpeck.naturesaura.blocks;
import de.ellpeck.naturesaura.reg.IColorProvidingBlock;
import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockFaceShape;
import net.minecraft.block.state.BlockStateContainer;
2019-10-20 22:30:49 +02:00
import net.minecraft.block.BlockState;
2018-10-16 01:36:30 +02:00
import net.minecraft.client.renderer.color.IBlockColor;
2019-10-20 22:30:49 +02:00
import net.minecraft.block.Blocks;
2018-10-16 01:36:30 +02:00
import net.minecraft.util.BlockRenderLayer;
2019-10-20 22:30:49 +02:00
import net.minecraft.util.Direction;
2018-10-16 01:36:30 +02:00
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
2019-10-20 22:30:49 +02:00
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
2018-10-16 01:36:30 +02:00
import javax.annotation.Nullable;
public class BlockGoldPowder extends BlockImpl implements IColorProvidingBlock {
public static final PropertyEnum<AttachPos> NORTH = PropertyEnum.create("north", AttachPos.class);
public static final PropertyEnum<AttachPos> EAST = PropertyEnum.create("east", AttachPos.class);
public static final PropertyEnum<AttachPos> SOUTH = PropertyEnum.create("south", AttachPos.class);
public static final PropertyEnum<AttachPos> WEST = PropertyEnum.create("west", AttachPos.class);
protected static final AxisAlignedBB[] AABBS = new AxisAlignedBB[]{
new AxisAlignedBB(0.1875D, 0.0D, 0.1875D, 0.8125D, 0.0625D, 0.8125D),
new AxisAlignedBB(0.1875D, 0.0D, 0.1875D, 0.8125D, 0.0625D, 1.0D),
new AxisAlignedBB(0.0D, 0.0D, 0.1875D, 0.8125D, 0.0625D, 0.8125D),
new AxisAlignedBB(0.0D, 0.0D, 0.1875D, 0.8125D, 0.0625D, 1.0D),
new AxisAlignedBB(0.1875D, 0.0D, 0.0D, 0.8125D, 0.0625D, 0.8125D),
new AxisAlignedBB(0.1875D, 0.0D, 0.0D, 0.8125D, 0.0625D, 1.0D),
new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.8125D, 0.0625D, 0.8125D),
new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.8125D, 0.0625D, 1.0D),
new AxisAlignedBB(0.1875D, 0.0D, 0.1875D, 1.0D, 0.0625D, 0.8125D),
new AxisAlignedBB(0.1875D, 0.0D, 0.1875D, 1.0D, 0.0625D, 1.0D),
new AxisAlignedBB(0.0D, 0.0D, 0.1875D, 1.0D, 0.0625D, 0.8125D),
new AxisAlignedBB(0.0D, 0.0D, 0.1875D, 1.0D, 0.0625D, 1.0D),
new AxisAlignedBB(0.1875D, 0.0D, 0.0D, 1.0D, 0.0625D, 0.8125D),
new AxisAlignedBB(0.1875D, 0.0D, 0.0D, 1.0D, 0.0625D, 1.0D),
new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.0625D, 0.8125D),
new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.0625D, 1.0D)
};
public BlockGoldPowder() {
super("gold_powder", Material.CIRCUITS);
this.setSoundType(SoundType.STONE);
this.setHardness(0F);
this.setDefaultState(this.getDefaultState()
.withProperty(NORTH, AttachPos.NONE)
.withProperty(EAST, AttachPos.NONE)
.withProperty(SOUTH, AttachPos.NONE)
.withProperty(WEST, AttachPos.NONE));
2018-10-16 01:36:30 +02:00
}
@Override
protected BlockStateContainer createBlockState() {
return new BlockStateContainer(this, NORTH, EAST, SOUTH, WEST);
}
@Override
2019-10-20 22:30:49 +02:00
public int getMetaFromState(BlockState state) {
2018-10-16 01:36:30 +02:00
return 0;
}
@Override
public IBlockColor getBlockColor() {
return (state, worldIn, pos, tintIndex) -> 0xf4cb42;
}
@Override
2019-10-20 22:30:49 +02:00
public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) {
2018-10-16 01:36:30 +02:00
return AABBS[getAABBIndex(state.getActualState(source, pos))];
}
2019-10-20 22:30:49 +02:00
private static int getAABBIndex(BlockState state) {
2018-10-16 01:36:30 +02:00
int i = 0;
boolean n = state.getValue(NORTH) != AttachPos.NONE;
boolean e = state.getValue(EAST) != AttachPos.NONE;
boolean s = state.getValue(SOUTH) != AttachPos.NONE;
boolean w = state.getValue(WEST) != AttachPos.NONE;
if (n || s && !n && !e && !w) {
2019-10-20 22:30:49 +02:00
i |= 1 << Direction.NORTH.getHorizontalIndex();
2018-10-16 01:36:30 +02:00
}
if (e || w && !n && !e && !s) {
2019-10-20 22:30:49 +02:00
i |= 1 << Direction.EAST.getHorizontalIndex();
2018-10-16 01:36:30 +02:00
}
if (s || n && !e && !s && !w) {
2019-10-20 22:30:49 +02:00
i |= 1 << Direction.SOUTH.getHorizontalIndex();
2018-10-16 01:36:30 +02:00
}
if (w || e && !n && !s && !w) {
2019-10-20 22:30:49 +02:00
i |= 1 << Direction.WEST.getHorizontalIndex();
2018-10-16 01:36:30 +02:00
}
return i;
}
@Override
2019-10-20 22:30:49 +02:00
public BlockState getActualState(BlockState state, IBlockAccess worldIn, BlockPos pos) {
state = state.withProperty(WEST, this.getAttachPosition(worldIn, pos, Direction.WEST));
state = state.withProperty(EAST, this.getAttachPosition(worldIn, pos, Direction.EAST));
state = state.withProperty(NORTH, this.getAttachPosition(worldIn, pos, Direction.NORTH));
state = state.withProperty(SOUTH, this.getAttachPosition(worldIn, pos, Direction.SOUTH));
2018-10-16 01:36:30 +02:00
return state;
}
2019-10-20 22:30:49 +02:00
private AttachPos getAttachPosition(IBlockAccess worldIn, BlockPos pos, Direction direction) {
2018-10-16 01:36:30 +02:00
BlockPos dirPos = pos.offset(direction);
2019-10-20 22:30:49 +02:00
BlockState state = worldIn.getBlockState(pos.offset(direction));
2018-10-16 01:36:30 +02:00
if (!this.canConnectTo(worldIn.getBlockState(dirPos), direction, worldIn, dirPos)
&& (state.isNormalCube() || !this.canConnectUpwardsTo(worldIn, dirPos.down()))) {
2019-10-20 22:30:49 +02:00
BlockState iblockstate1 = worldIn.getBlockState(pos.up());
2018-10-16 01:36:30 +02:00
if (!iblockstate1.isNormalCube()) {
2019-10-20 22:30:49 +02:00
boolean flag = worldIn.getBlockState(dirPos).isSideSolid(worldIn, dirPos, Direction.UP)
2018-10-16 01:36:30 +02:00
|| worldIn.getBlockState(dirPos).getBlock() == Blocks.GLOWSTONE;
if (flag && this.canConnectUpwardsTo(worldIn, dirPos.up())) {
if (state.isBlockNormalCube()) {
return AttachPos.UP;
}
return AttachPos.SIDE;
}
}
return AttachPos.NONE;
} else {
return AttachPos.SIDE;
}
}
@Override
2019-10-20 22:30:49 +02:00
public AxisAlignedBB getCollisionBoundingBox(BlockState blockState, IBlockAccess worldIn, BlockPos pos) {
2018-10-16 01:36:30 +02:00
return NULL_AABB;
}
@Override
2019-10-20 22:30:49 +02:00
public boolean isOpaqueCube(BlockState state) {
2018-10-16 01:36:30 +02:00
return false;
}
@Override
2019-10-20 22:30:49 +02:00
public boolean isFullCube(BlockState state) {
2018-10-16 01:36:30 +02:00
return false;
}
@Override
public boolean canPlaceBlockAt(World worldIn, BlockPos pos) {
2019-10-20 22:30:49 +02:00
BlockState downState = worldIn.getBlockState(pos.down());
2018-10-16 01:36:30 +02:00
return downState.isTopSolid()
2019-10-20 22:30:49 +02:00
|| downState.getBlockFaceShape(worldIn, pos.down(), Direction.UP) == BlockFaceShape.SOLID
2018-10-16 01:36:30 +02:00
|| worldIn.getBlockState(pos.down()).getBlock() == Blocks.GLOWSTONE;
}
@Override
2019-10-20 22:30:49 +02:00
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos) {
2018-10-16 01:36:30 +02:00
if (!worldIn.isRemote) {
if (!this.canPlaceBlockAt(worldIn, pos)) {
this.dropBlockAsItem(worldIn, pos, state, 0);
worldIn.setBlockToAir(pos);
}
}
}
private boolean canConnectUpwardsTo(IBlockAccess worldIn, BlockPos pos) {
return this.canConnectTo(worldIn.getBlockState(pos), null, worldIn, pos);
}
2019-10-20 22:30:49 +02:00
private boolean canConnectTo(BlockState blockState, @Nullable Direction side, IBlockAccess world, BlockPos pos) {
2018-10-16 01:36:30 +02:00
Block block = blockState.getBlock();
return block == this;
}
@Override
2019-10-20 22:30:49 +02:00
@OnlyIn(Dist.CLIENT)
2018-10-16 01:36:30 +02:00
public BlockRenderLayer getRenderLayer() {
return BlockRenderLayer.CUTOUT;
}
@Override
2019-10-20 22:30:49 +02:00
public BlockFaceShape getBlockFaceShape(IBlockAccess worldIn, BlockState state, BlockPos pos, Direction face) {
2018-10-16 01:36:30 +02:00
return BlockFaceShape.UNDEFINED;
}
private enum AttachPos implements IStringSerializable {
UP("up"),
SIDE("side"),
NONE("none");
private final String name;
AttachPos(String name) {
this.name = name;
}
public String toString() {
return this.getName();
}
@Override
public String getName() {
return this.name;
}
}
}