From 9c8b7ab315865f7b6e924e47286f9eba1019946f Mon Sep 17 00:00:00 2001 From: Justin Parsell Date: Fri, 22 Oct 2021 03:16:09 -0400 Subject: [PATCH] Fixed hitboxes, fixed connection issues --- .../glowstonewire/GlowstoneWireClient.java | 4 +- .../common/GlowstoneWireBlock.java | 116 ++++++++++-------- 2 files changed, 63 insertions(+), 57 deletions(-) diff --git a/src/main/java/me/parsell/glowstonewire/GlowstoneWireClient.java b/src/main/java/me/parsell/glowstonewire/GlowstoneWireClient.java index 6301831..f3da845 100644 --- a/src/main/java/me/parsell/glowstonewire/GlowstoneWireClient.java +++ b/src/main/java/me/parsell/glowstonewire/GlowstoneWireClient.java @@ -10,8 +10,6 @@ public class GlowstoneWireClient implements ClientModInitializer { @Override public void onInitializeClient(){ BlockRenderLayerMap.INSTANCE.putBlock(glowBlocks.GLOWSTONEWIRE, RenderLayer.getCutout()); - ColorProviderRegistry.BLOCK.register((state, world, pos, tintIndex) -> { - return 0xFFFF00; - }, glowBlocks.GLOWSTONEWIRE); + ColorProviderRegistry.BLOCK.register((state, world, pos, tintIndex) -> {return 0xffbc5e;}, glowBlocks.GLOWSTONEWIRE); } } \ No newline at end of file diff --git a/src/main/java/me/parsell/glowstonewire/common/GlowstoneWireBlock.java b/src/main/java/me/parsell/glowstonewire/common/GlowstoneWireBlock.java index 274b5c0..2ecbf6e 100644 --- a/src/main/java/me/parsell/glowstonewire/common/GlowstoneWireBlock.java +++ b/src/main/java/me/parsell/glowstonewire/common/GlowstoneWireBlock.java @@ -4,6 +4,7 @@ import java.util.Map; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; +import com.google.common.collect.UnmodifiableIterator; import org.jetbrains.annotations.Nullable; @@ -45,14 +46,20 @@ public class GlowstoneWireBlock extends Block{ // Determines the hitbox for our block public static final VoxelShape DOT_VOXELSHAPE; - private static final Map field_24414; - private static final Map field_24415; + private static final Map DIRECTION_HITBOX, UP_HITBOX; + private final Map STATE_TO_VOXELSHAPE = Maps.newHashMap(); 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, GlowWireConnection.NONE)).with(WIRE_CONNECTION_EAST, GlowWireConnection.NONE)).with(WIRE_CONNECTION_SOUTH, GlowWireConnection.NONE)).with(WIRE_CONNECTION_WEST, GlowWireConnection.NONE))); + + UnmodifiableIterator stateItr = this.getStateManager().getStates().iterator(); + while(stateItr.hasNext()) { + BlockState state = (BlockState)stateItr.next(); + this.STATE_TO_VOXELSHAPE.put(state, determineVoxelShape(state)); + } } // Make sure out block has the properties for us to manage @@ -68,13 +75,6 @@ public class GlowstoneWireBlock extends Block{ ((GlowWireConnection)state.get(WIRE_CONNECTION_WEST)).isConnected(); } - private static boolean hasUpConnection(BlockState state) { - return ((GlowWireConnection)state.get(WIRE_CONNECTION_NORTH)).isConnectedUp() || - ((GlowWireConnection)state.get(WIRE_CONNECTION_SOUTH)).isConnectedUp() || - ((GlowWireConnection)state.get(WIRE_CONNECTION_EAST)).isConnectedUp() || - ((GlowWireConnection)state.get(WIRE_CONNECTION_WEST)).isConnectedUp(); - } - private BlockState determineState(WorldAccess world, BlockState state, BlockPos pos){ Iterator dirItr = Direction.Type.HORIZONTAL.iterator(); while(dirItr.hasNext()){ @@ -87,7 +87,10 @@ public class GlowstoneWireBlock extends Block{ private GlowWireConnection determineConnection(WorldAccess world, BlockPos pos, Direction direction){ if((world.getBlockState(pos.offset(direction).up()).isOf(this) && world.isAir(pos.up()))) // If offset+up is me && if up is air if(!world.getBlockState(pos.offset(direction).up()).get(DIRECTION_TO_WIRE_CONNECTION.get(direction.getOpposite())).isBroken()) //if offset+up is not broken - return GlowWireConnection.UP; + if(world.getBlockState(pos.offset(direction)).hasSidedTransparency()) + return GlowWireConnection.SIDE; + else + return GlowWireConnection.UP; if(world.getBlockState(pos.offset(direction).down()).isOf(this) && world.isAir(pos.offset(direction))) // if offset+down is me && if offset is air if(!world.getBlockState(pos.offset(direction).down()).get(DIRECTION_TO_WIRE_CONNECTION.get(direction.getOpposite())).isBroken()) //if offset+down is not broken return GlowWireConnection.SIDE; @@ -97,22 +100,31 @@ public class GlowstoneWireBlock extends Block{ return GlowWireConnection.NONE; } - // TODO: Fix this @Override public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + return STATE_TO_VOXELSHAPE.get(state); + } + + public VoxelShape determineVoxelShape(BlockState state){ VoxelShape voxelShape = DOT_VOXELSHAPE; - Iterator var3 = Direction.Type.HORIZONTAL.iterator(); - - while(var3.hasNext()) { - Direction direction = (Direction)var3.next(); + + Iterator dirItr1 = Direction.Type.HORIZONTAL.iterator(); + while(dirItr1.hasNext()) { + Direction direction = (Direction)dirItr1.next(); GlowWireConnection wireConnection = state.get(DIRECTION_TO_WIRE_CONNECTION.get(direction)); - if (wireConnection == GlowWireConnection.SIDE) { - voxelShape = VoxelShapes.union(voxelShape, (VoxelShape)field_24414.get(direction)); + if(state.equals(this.getDefaultState().with(DIRECTION_TO_WIRE_CONNECTION.get(direction), GlowWireConnection.SIDE))) { + voxelShape = VoxelShapes.union(voxelShape, (VoxelShape)DIRECTION_HITBOX.get(direction)); + return VoxelShapes.union(voxelShape, DIRECTION_HITBOX.get(direction.getOpposite())); + } else if (state.equals(this.getDefaultState().with(DIRECTION_TO_WIRE_CONNECTION.get(direction), GlowWireConnection.UP))) { + voxelShape = VoxelShapes.union(voxelShape, (VoxelShape)UP_HITBOX.get(direction)); + return VoxelShapes.union(voxelShape, DIRECTION_HITBOX.get(direction.getOpposite())); + } else if (wireConnection == GlowWireConnection.SIDE) { + voxelShape = VoxelShapes.union(voxelShape, (VoxelShape)DIRECTION_HITBOX.get(direction)); } else if (wireConnection == GlowWireConnection.UP) { - voxelShape = VoxelShapes.union(voxelShape, (VoxelShape)field_24415.get(direction)); + voxelShape = VoxelShapes.union(voxelShape, (VoxelShape)UP_HITBOX.get(direction)); } } - + return voxelShape; } @@ -166,58 +178,37 @@ public class GlowstoneWireBlock extends Block{ world.setBlockState(pos, state); // These call neighborUpdate not getStateForNeighborUpdate!! //world.updateNeighborsAlways(pos, this); // Update those around me - world.updateNeighborsAlways(pos.down(), this); // Update those below me - world.updateNeighborsAlways(pos.up(), this); // Update those above me + world.updateNeighbors(pos.down(), this); // Update those below me + world.updateNeighbors(pos.up(), this); // Update those above me return ActionResult.SUCCESS; } return ActionResult.PASS; } - @Override // Update the link in the direction of the update, and if it's a block above me, break all links that are UP, down carry on as normal (i will break so dont do anything) - public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { - System.out.println("State for Neighbor Update"); - if (direction == Direction.DOWN) - return state; // Do nothing - else if(direction == Direction.UP){ - if(!hasUpConnection(state)) - return state; - Iterator dirItr = Direction.Type.HORIZONTAL.iterator(); - while(dirItr.hasNext()){ - Direction dir = dirItr.next(); - if(!state.get(DIRECTION_TO_WIRE_CONNECTION.get(dir)).isBroken()) - state = state.with(DIRECTION_TO_WIRE_CONNECTION.get(dir), determineConnection(world, pos, dir)); - } - return state; - } else if(state.get(DIRECTION_TO_WIRE_CONNECTION.get(direction)).isBroken()) - return state; - return state.with(DIRECTION_TO_WIRE_CONNECTION.get(direction), determineConnection(world, pos, direction)); - } - @Override // Get the state I should place in, and update those around me (above/below) as needed public BlockState getPlacementState(ItemPlacementContext ctx){ - System.out.println("Placement"); return determineState(ctx.getWorld(), this.getDefaultState(), ctx.getBlockPos()); } @Override public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { - Iterator dirItr = Direction.Type.HORIZONTAL.iterator(); - while(dirItr.hasNext()){ - Direction dir = dirItr.next(); - if (state.get(DIRECTION_TO_WIRE_CONNECTION.get(dir)).isConnectedUp()) { - BlockPos posOffset = pos.offset(dir).offset(Direction.UP); - world.getBlockState(posOffset).neighborUpdate(world, posOffset, this, pos, false); - } - } + world.updateNeighbors(pos.offset(Direction.UP), state.getBlock()); + world.updateNeighbors(pos.offset(Direction.DOWN), state.getBlock()); + } + + @Override // This causes w/e issue that tracks deal with. + public void onBroken(WorldAccess world, BlockPos pos, BlockState state) { + world.updateNeighbors(pos.offset(Direction.UP), state.getBlock()); + world.updateNeighbors(pos.offset(Direction.DOWN), state.getBlock()); } @Override // Called when I get told to update, so I should see what/why I need to update. I also use this to determine if I need to be drop or not. public void neighborUpdate(BlockState state, World world, BlockPos pos, Block block, BlockPos fromPos, boolean notify) { - System.out.println(pos + " Neighbor Update from " + fromPos); if (!world.isClient) { if(!state.canPlaceAt(world, pos)) { dropStacks(state, world, pos); world.removeBlock(pos, false); + this.onBroken(world, pos, state); } else { Iterator dirItr = Direction.Type.HORIZONTAL.iterator(); while(dirItr.hasNext()){ @@ -236,10 +227,27 @@ public class GlowstoneWireBlock extends Block{ WIRE_CONNECTION_SOUTH = EnumProperty.of("south", GlowWireConnection.class); WIRE_CONNECTION_WEST = EnumProperty.of("west", GlowWireConnection.class); - DIRECTION_TO_WIRE_CONNECTION = 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)); + DIRECTION_TO_WIRE_CONNECTION = 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_VOXELSHAPE = Block.createCuboidShape(3.0D, 0.0D, 3.0D, 13.0D, 1.0D, 13.0D); - field_24414 = Maps.newEnumMap((Map)ImmutableMap.of(Direction.NORTH, Block.createCuboidShape(3.0D, 0.0D, 0.0D, 13.0D, 1.0D, 13.0D), Direction.SOUTH, Block.createCuboidShape(3.0D, 0.0D, 3.0D, 13.0D, 1.0D, 16.0D), Direction.EAST, Block.createCuboidShape(3.0D, 0.0D, 3.0D, 16.0D, 1.0D, 13.0D), Direction.WEST, Block.createCuboidShape(0.0D, 0.0D, 3.0D, 13.0D, 1.0D, 13.0D))); - field_24415 = Maps.newEnumMap((Map)ImmutableMap.of(Direction.NORTH, VoxelShapes.union((VoxelShape)field_24414.get(Direction.NORTH), Block.createCuboidShape(3.0D, 0.0D, 0.0D, 13.0D, 16.0D, 1.0D)), Direction.SOUTH, VoxelShapes.union((VoxelShape)field_24414.get(Direction.SOUTH), Block.createCuboidShape(3.0D, 0.0D, 15.0D, 13.0D, 16.0D, 16.0D)), Direction.EAST, VoxelShapes.union((VoxelShape)field_24414.get(Direction.EAST), Block.createCuboidShape(15.0D, 0.0D, 3.0D, 16.0D, 16.0D, 13.0D)), Direction.WEST, VoxelShapes.union((VoxelShape)field_24414.get(Direction.WEST), Block.createCuboidShape(0.0D, 0.0D, 3.0D, 1.0D, 16.0D, 13.0D)))); + + DIRECTION_HITBOX = Maps.newEnumMap((Map)ImmutableMap.of( + Direction.NORTH, Block.createCuboidShape(3.0D, 0.0D, 0.0D, 13.0D, 1.0D, 13.0D), + Direction.SOUTH, Block.createCuboidShape(3.0D, 0.0D, 3.0D, 13.0D, 1.0D, 16.0D), + Direction.EAST, Block.createCuboidShape(3.0D, 0.0D, 3.0D, 16.0D, 1.0D, 13.0D), + Direction.WEST, Block.createCuboidShape(0.0D, 0.0D, 3.0D, 13.0D, 1.0D, 13.0D)) + ); + + UP_HITBOX = Maps.newEnumMap((Map)ImmutableMap.of( + Direction.NORTH, VoxelShapes.union((VoxelShape)DIRECTION_HITBOX.get(Direction.NORTH), Block.createCuboidShape(3.0D, 0.0D, 0.0D, 13.0D, 16.0D, 1.0D)), + Direction.SOUTH, VoxelShapes.union((VoxelShape)DIRECTION_HITBOX.get(Direction.SOUTH), Block.createCuboidShape(3.0D, 0.0D, 15.0D, 13.0D, 16.0D, 16.0D)), + Direction.EAST, VoxelShapes.union((VoxelShape)DIRECTION_HITBOX.get(Direction.EAST), Block.createCuboidShape(15.0D, 0.0D, 3.0D, 16.0D, 16.0D, 13.0D)), + Direction.WEST, VoxelShapes.union((VoxelShape)DIRECTION_HITBOX.get(Direction.WEST), Block.createCuboidShape(0.0D, 0.0D, 3.0D, 1.0D, 16.0D, 13.0D))) + ); } } \ No newline at end of file