diff --git a/src/main/java/me/parsell/glowstonewire/common/GlowstoneWireBlock.java b/src/main/java/me/parsell/glowstonewire/common/GlowstoneWireBlock.java index 57560a5..5acf48d 100644 --- a/src/main/java/me/parsell/glowstonewire/common/GlowstoneWireBlock.java +++ b/src/main/java/me/parsell/glowstonewire/common/GlowstoneWireBlock.java @@ -7,6 +7,7 @@ import com.google.common.collect.Maps; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.block.ShapeContext; import net.minecraft.block.enums.WireConnection; import net.minecraft.entity.player.PlayerEntity; @@ -24,6 +25,7 @@ import net.minecraft.util.math.Direction; import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; import net.minecraft.world.World; +import net.minecraft.world.WorldView; public class GlowstoneWireBlock extends Block{ // These are the states of the wires coming off our block @@ -32,21 +34,21 @@ public class GlowstoneWireBlock extends Block{ public static final net.minecraft.state.property.EnumProperty WIRE_CONNECTION_SOUTH; public static final net.minecraft.state.property.EnumProperty WIRE_CONNECTION_WEST; - // Locally defined DIRECTION <-> WIRE_CONNECTION_DIRECTION - public static final Map> DIRECTION_TO_WIRE_CONNECTION_PROPERTY; + // Locally defined DIRECTION <-> WIRE_CONNECTION_DIRECTION + public static final Map> DIRECTION_TO_WIRE_CONNECTION_PROPERTY; // Determines the hitbox for our block public static final VoxelShape DOT_SHAPE; - // Full sided state - private BlockState FULL_STATE; + // Full sided state + private BlockState FULL_STATE; public GlowstoneWireBlock(Settings settings) { super(settings); // Set these properties to be none as start, so we start with a dot this.setDefaultState((BlockState)((BlockState)((BlockState)((BlockState)((BlockState)((BlockState)this.stateManager.getDefaultState()).with(WIRE_CONNECTION_NORTH, WireConnection.NONE)).with(WIRE_CONNECTION_EAST, WireConnection.NONE)).with(WIRE_CONNECTION_SOUTH, WireConnection.NONE)).with(WIRE_CONNECTION_WEST, WireConnection.NONE))); - this.FULL_STATE = (BlockState)((BlockState)((BlockState)((BlockState)this.getDefaultState().with(WIRE_CONNECTION_NORTH, WireConnection.SIDE)).with(WIRE_CONNECTION_EAST, WireConnection.SIDE)).with(WIRE_CONNECTION_SOUTH, WireConnection.SIDE)).with(WIRE_CONNECTION_WEST, WireConnection.SIDE); - } + this.FULL_STATE = (BlockState)((BlockState)((BlockState)((BlockState)this.getDefaultState().with(WIRE_CONNECTION_NORTH, WireConnection.SIDE)).with(WIRE_CONNECTION_EAST, WireConnection.SIDE)).with(WIRE_CONNECTION_SOUTH, WireConnection.SIDE)).with(WIRE_CONNECTION_WEST, WireConnection.SIDE); + } // Make sure out block has the properties for us to manage protected void appendProperties(StateManager.Builder builder) { @@ -55,82 +57,102 @@ public class GlowstoneWireBlock extends Block{ private static boolean isFullyConnected(BlockState state) { return ((WireConnection)state.get(WIRE_CONNECTION_NORTH)).isConnected() && - ((WireConnection)state.get(WIRE_CONNECTION_SOUTH)).isConnected() && - ((WireConnection)state.get(WIRE_CONNECTION_EAST)).isConnected() && - ((WireConnection)state.get(WIRE_CONNECTION_WEST)).isConnected(); + ((WireConnection)state.get(WIRE_CONNECTION_SOUTH)).isConnected() && + ((WireConnection)state.get(WIRE_CONNECTION_EAST)).isConnected() && + ((WireConnection)state.get(WIRE_CONNECTION_WEST)).isConnected(); } private static boolean isNotConnected(BlockState state) { return !((WireConnection)state.get(WIRE_CONNECTION_NORTH)).isConnected() && - !((WireConnection)state.get(WIRE_CONNECTION_SOUTH)).isConnected() && - !((WireConnection)state.get(WIRE_CONNECTION_EAST)).isConnected() && - !((WireConnection)state.get(WIRE_CONNECTION_WEST)).isConnected(); + !((WireConnection)state.get(WIRE_CONNECTION_SOUTH)).isConnected() && + !((WireConnection)state.get(WIRE_CONNECTION_EAST)).isConnected() && + !((WireConnection)state.get(WIRE_CONNECTION_WEST)).isConnected(); } - public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - return DOT_SHAPE; - } + public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + return DOT_SHAPE; + } - public BlockState getPlacecmentState(ItemPlacementContext ctx){ - return this.getDefaultState(); - } + public BlockState getPlacecmentState(ItemPlacementContext ctx){ + return this.getDefaultState(); + } - public BlockState rotate(BlockState state, BlockRotation rotation) { - switch(rotation) { - case CLOCKWISE_180: - return (BlockState)((BlockState)((BlockState)((BlockState)state.with(WIRE_CONNECTION_NORTH, state.get(WIRE_CONNECTION_SOUTH))).with(WIRE_CONNECTION_EAST, state.get(WIRE_CONNECTION_WEST))).with(WIRE_CONNECTION_SOUTH, state.get(WIRE_CONNECTION_NORTH))).with(WIRE_CONNECTION_WEST, state.get(WIRE_CONNECTION_EAST)); - case COUNTERCLOCKWISE_90: - return (BlockState)((BlockState)((BlockState)((BlockState)state.with(WIRE_CONNECTION_NORTH, state.get(WIRE_CONNECTION_EAST))).with(WIRE_CONNECTION_EAST, state.get(WIRE_CONNECTION_SOUTH))).with(WIRE_CONNECTION_SOUTH, state.get(WIRE_CONNECTION_WEST))).with(WIRE_CONNECTION_WEST, state.get(WIRE_CONNECTION_NORTH)); - case CLOCKWISE_90: - return (BlockState)((BlockState)((BlockState)((BlockState)state.with(WIRE_CONNECTION_NORTH, state.get(WIRE_CONNECTION_WEST))).with(WIRE_CONNECTION_EAST, state.get(WIRE_CONNECTION_NORTH))).with(WIRE_CONNECTION_SOUTH, state.get(WIRE_CONNECTION_EAST))).with(WIRE_CONNECTION_WEST, state.get(WIRE_CONNECTION_SOUTH)); - default: - return state; - } + public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + BlockPos blockPos = pos.down(); + BlockState blockState = world.getBlockState(blockPos); + return this.canRunOnTop(world, blockPos, blockState); + } + + private boolean canRunOnTop(BlockView world, BlockPos pos, BlockState floor) { + return floor.isSideSolidFullSquare(world, pos, Direction.UP) || floor.isOf(Blocks.HOPPER); + } + + public BlockState rotate(BlockState state, BlockRotation rotation) { + switch(rotation) { + case CLOCKWISE_180: + return (BlockState)((BlockState)((BlockState)((BlockState)state.with(WIRE_CONNECTION_NORTH, state.get(WIRE_CONNECTION_SOUTH))).with(WIRE_CONNECTION_EAST, state.get(WIRE_CONNECTION_WEST))).with(WIRE_CONNECTION_SOUTH, state.get(WIRE_CONNECTION_NORTH))).with(WIRE_CONNECTION_WEST, state.get(WIRE_CONNECTION_EAST)); + case COUNTERCLOCKWISE_90: + return (BlockState)((BlockState)((BlockState)((BlockState)state.with(WIRE_CONNECTION_NORTH, state.get(WIRE_CONNECTION_EAST))).with(WIRE_CONNECTION_EAST, state.get(WIRE_CONNECTION_SOUTH))).with(WIRE_CONNECTION_SOUTH, state.get(WIRE_CONNECTION_WEST))).with(WIRE_CONNECTION_WEST, state.get(WIRE_CONNECTION_NORTH)); + case CLOCKWISE_90: + return (BlockState)((BlockState)((BlockState)((BlockState)state.with(WIRE_CONNECTION_NORTH, state.get(WIRE_CONNECTION_WEST))).with(WIRE_CONNECTION_EAST, state.get(WIRE_CONNECTION_NORTH))).with(WIRE_CONNECTION_SOUTH, state.get(WIRE_CONNECTION_EAST))).with(WIRE_CONNECTION_WEST, state.get(WIRE_CONNECTION_SOUTH)); + default: + return state; + } } public BlockState mirror(BlockState state, BlockMirror mirror) { - switch(mirror) { - case LEFT_RIGHT: - return (BlockState)((BlockState)state.with(WIRE_CONNECTION_NORTH, state.get(WIRE_CONNECTION_SOUTH))).with(WIRE_CONNECTION_SOUTH, state.get(WIRE_CONNECTION_NORTH)); - case FRONT_BACK: - return (BlockState)((BlockState)state.with(WIRE_CONNECTION_EAST, state.get(WIRE_CONNECTION_WEST))).with(WIRE_CONNECTION_WEST, state.get(WIRE_CONNECTION_EAST)); - default: - return super.mirror(state, mirror); - } + switch(mirror) { + case LEFT_RIGHT: + return (BlockState)((BlockState)state.with(WIRE_CONNECTION_NORTH, state.get(WIRE_CONNECTION_SOUTH))).with(WIRE_CONNECTION_SOUTH, state.get(WIRE_CONNECTION_NORTH)); + case FRONT_BACK: + return (BlockState)((BlockState)state.with(WIRE_CONNECTION_EAST, state.get(WIRE_CONNECTION_WEST))).with(WIRE_CONNECTION_WEST, state.get(WIRE_CONNECTION_EAST)); + default: + return super.mirror(state, mirror); + } } - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit){ - if(isNotConnected(state)) - world.setBlockState(pos, FULL_STATE, 3); - else - world.setBlockState(pos, this.getDefaultState(), 3); - System.out.println("onUse"); - return ActionResult.SUCCESS; - } + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit){ + if(isNotConnected(state)) + world.setBlockState(pos, FULL_STATE, 3); + else + world.setBlockState(pos, this.getDefaultState(), 3); + System.out.println("onUse"); + return ActionResult.SUCCESS; + } - public void update(World world, BlockPos pos, BlockState state){ - System.out.println("Update"); - } + public void update(World world, BlockPos pos, BlockState state){ + System.out.println("Update"); + + } - // isnt system.out BUT will update neighors? - public void updateNeighbors(World world, BlockPos pos){ - System.out.println("Update neighbors"); - if (world.getBlockState(pos).isOf(this)) { - world.updateNeighborsAlways(pos, this); - Direction[] var3 = Direction.values(); - int var4 = var3.length; + // Check if I'm this, + // then update all my neighbors + // then tell my neighbors to update all their neighbors (why?) + public void updateNeighbors(World world, BlockPos pos){ + if (world.getBlockState(pos).isOf(this)) { + world.updateNeighborsAlways(pos, this); + //Direction[] d = Direction.values(); + //int dl = d.length; - for(int var5 = 0; var5 < var4; ++var5) { - Direction direction = var3[var5]; - world.updateNeighborsAlways(pos.offset(direction), this); - } + //for(int i = 0; i < dl; ++i) { + // Direction direction = d[i]; + // world.updateNeighborsAlways(pos.offset(direction), this); + //} - } - } + } + } - public void neighborUpdate(BlockState state, World world, BlockPos pos, Block block, BlockPos fromPos, boolean notify){ - System.out.println("Neighbor update"); - } + public void neighborUpdate(BlockState state, World world, BlockPos pos, Block block, BlockPos fromPos, boolean notify){ + if (!world.isClient) { + if (state.canPlaceAt(world, pos)) { + this.update(world, pos, state); + } else { + dropStacks(state, world, pos); + world.removeBlock(pos, false); + } + + } + } static { WIRE_CONNECTION_NORTH = Properties.NORTH_WIRE_CONNECTION; @@ -138,9 +160,9 @@ public class GlowstoneWireBlock extends Block{ WIRE_CONNECTION_SOUTH = Properties.SOUTH_WIRE_CONNECTION; WIRE_CONNECTION_WEST = Properties.WEST_WIRE_CONNECTION; - DIRECTION_TO_WIRE_CONNECTION_PROPERTY = Maps.newEnumMap((Map)ImmutableMap.of(Direction.NORTH, WIRE_CONNECTION_NORTH, Direction.EAST, WIRE_CONNECTION_EAST, Direction.SOUTH, WIRE_CONNECTION_SOUTH, Direction.WEST, WIRE_CONNECTION_WEST)); - - DOT_SHAPE = Block.createCuboidShape(3.0D, 0.0D, 3.0D, 13.0D, 1.0D, 13.0D); + DIRECTION_TO_WIRE_CONNECTION_PROPERTY = Maps.newEnumMap((Map)ImmutableMap.of(Direction.NORTH, WIRE_CONNECTION_NORTH, Direction.EAST, WIRE_CONNECTION_EAST, Direction.SOUTH, WIRE_CONNECTION_SOUTH, Direction.WEST, WIRE_CONNECTION_WEST)); + + DOT_SHAPE = Block.createCuboidShape(3.0D, 0.0D, 3.0D, 13.0D, 1.0D, 13.0D); } } \ No newline at end of file