Improve hitbox checking

This commit is contained in:
raoulvdberge
2020-04-26 16:30:53 +02:00
parent 7394396a0a
commit e0fa6f25e0
6 changed files with 106 additions and 67 deletions

View File

@@ -5,6 +5,7 @@ import com.raoulvdberge.refinedstorage.container.ConstructorContainer;
import com.raoulvdberge.refinedstorage.container.factory.PositionalTileContainerProvider; import com.raoulvdberge.refinedstorage.container.factory.PositionalTileContainerProvider;
import com.raoulvdberge.refinedstorage.tile.ConstructorTile; import com.raoulvdberge.refinedstorage.tile.ConstructorTile;
import com.raoulvdberge.refinedstorage.util.BlockUtils; import com.raoulvdberge.refinedstorage.util.BlockUtils;
import com.raoulvdberge.refinedstorage.util.CollisionUtils;
import com.raoulvdberge.refinedstorage.util.NetworkUtils; import com.raoulvdberge.refinedstorage.util.NetworkUtils;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
@@ -54,41 +55,45 @@ public class ConstructorBlock extends CableBlock {
public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) { public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) {
VoxelShape shape = super.getShape(state, world, pos, ctx); VoxelShape shape = super.getShape(state, world, pos, ctx);
Direction direction = state.get(getDirection().getProperty()); shape = VoxelShapes.or(shape, getHeadShape(state));
if (direction == Direction.NORTH) {
shape = VoxelShapes.or(shape, HEAD_NORTH);
}
if (direction == Direction.EAST) {
shape = VoxelShapes.or(shape, HEAD_EAST);
}
if (direction == Direction.SOUTH) {
shape = VoxelShapes.or(shape, HEAD_SOUTH);
}
if (direction == Direction.WEST) {
shape = VoxelShapes.or(shape, HEAD_WEST);
}
if (direction == Direction.UP) {
shape = VoxelShapes.or(shape, HEAD_UP);
}
if (direction == Direction.DOWN) {
shape = VoxelShapes.or(shape, HEAD_DOWN);
}
return shape; return shape;
} }
private VoxelShape getHeadShape(BlockState state) {
Direction direction = state.get(getDirection().getProperty());
if (direction == Direction.NORTH) {
return HEAD_NORTH;
}
if (direction == Direction.EAST) {
return HEAD_EAST;
}
if (direction == Direction.SOUTH) {
return HEAD_SOUTH;
}
if (direction == Direction.WEST) {
return HEAD_WEST;
}
if (direction == Direction.UP) {
return HEAD_UP;
}
if (direction == Direction.DOWN) {
return HEAD_DOWN;
}
return VoxelShapes.empty();
}
@Override @Override
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult hit) {
if (!world.isRemote) { if (!world.isRemote && CollisionUtils.isInBounds(getHeadShape(state), pos, hit.getHitVec())) {
return NetworkUtils.attemptModify(world, pos, hit.getFace(), player, () -> NetworkHooks.openGui( return NetworkUtils.attemptModify(world, pos, hit.getFace(), player, () -> NetworkHooks.openGui(
(ServerPlayerEntity) player, (ServerPlayerEntity) player,
new PositionalTileContainerProvider<ConstructorTile>( new PositionalTileContainerProvider<ConstructorTile>(

View File

@@ -5,6 +5,7 @@ import com.raoulvdberge.refinedstorage.container.DestructorContainer;
import com.raoulvdberge.refinedstorage.container.factory.PositionalTileContainerProvider; import com.raoulvdberge.refinedstorage.container.factory.PositionalTileContainerProvider;
import com.raoulvdberge.refinedstorage.tile.DestructorTile; import com.raoulvdberge.refinedstorage.tile.DestructorTile;
import com.raoulvdberge.refinedstorage.util.BlockUtils; import com.raoulvdberge.refinedstorage.util.BlockUtils;
import com.raoulvdberge.refinedstorage.util.CollisionUtils;
import com.raoulvdberge.refinedstorage.util.NetworkUtils; import com.raoulvdberge.refinedstorage.util.NetworkUtils;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
@@ -54,39 +55,45 @@ public class DestructorBlock extends CableBlock {
public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) { public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) {
VoxelShape shape = super.getShape(state, world, pos, ctx); VoxelShape shape = super.getShape(state, world, pos, ctx);
shape = VoxelShapes.or(shape, getHeadShape(state));
return shape;
}
private VoxelShape getHeadShape(BlockState state) {
Direction direction = state.get(getDirection().getProperty()); Direction direction = state.get(getDirection().getProperty());
if (direction == Direction.NORTH) { if (direction == Direction.NORTH) {
shape = VoxelShapes.or(shape, HEAD_NORTH); return HEAD_NORTH;
} }
if (direction == Direction.EAST) { if (direction == Direction.EAST) {
shape = VoxelShapes.or(shape, HEAD_EAST); return HEAD_EAST;
} }
if (direction == Direction.SOUTH) { if (direction == Direction.SOUTH) {
shape = VoxelShapes.or(shape, HEAD_SOUTH); return HEAD_SOUTH;
} }
if (direction == Direction.WEST) { if (direction == Direction.WEST) {
shape = VoxelShapes.or(shape, HEAD_WEST); return HEAD_WEST;
} }
if (direction == Direction.UP) { if (direction == Direction.UP) {
shape = VoxelShapes.or(shape, HEAD_UP); return HEAD_UP;
} }
if (direction == Direction.DOWN) { if (direction == Direction.DOWN) {
shape = VoxelShapes.or(shape, HEAD_DOWN); return HEAD_DOWN;
} }
return shape; return VoxelShapes.empty();
} }
@Override @Override
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) {
if (!world.isRemote) { if (!world.isRemote && CollisionUtils.isInBounds(getHeadShape(state), pos, hit.getHitVec())) {
return NetworkUtils.attemptModify(world, pos, hit.getFace(), player, () -> NetworkHooks.openGui( return NetworkUtils.attemptModify(world, pos, hit.getFace(), player, () -> NetworkHooks.openGui(
(ServerPlayerEntity) player, (ServerPlayerEntity) player,
new PositionalTileContainerProvider<DestructorTile>( new PositionalTileContainerProvider<DestructorTile>(

View File

@@ -5,6 +5,7 @@ import com.raoulvdberge.refinedstorage.container.ExporterContainer;
import com.raoulvdberge.refinedstorage.container.factory.PositionalTileContainerProvider; import com.raoulvdberge.refinedstorage.container.factory.PositionalTileContainerProvider;
import com.raoulvdberge.refinedstorage.tile.ExporterTile; import com.raoulvdberge.refinedstorage.tile.ExporterTile;
import com.raoulvdberge.refinedstorage.util.BlockUtils; import com.raoulvdberge.refinedstorage.util.BlockUtils;
import com.raoulvdberge.refinedstorage.util.CollisionUtils;
import com.raoulvdberge.refinedstorage.util.NetworkUtils; import com.raoulvdberge.refinedstorage.util.NetworkUtils;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
@@ -71,33 +72,39 @@ public class ExporterBlock extends CableBlock {
public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) { public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) {
VoxelShape shape = super.getShape(state, world, pos, ctx); VoxelShape shape = super.getShape(state, world, pos, ctx);
shape = VoxelShapes.or(shape, getLineShape(state));
return shape;
}
private VoxelShape getLineShape(BlockState state) {
Direction direction = state.get(getDirection().getProperty()); Direction direction = state.get(getDirection().getProperty());
if (direction == Direction.NORTH) { if (direction == Direction.NORTH) {
shape = VoxelShapes.or(shape, LINE_NORTH); return LINE_NORTH;
} }
if (direction == Direction.EAST) { if (direction == Direction.EAST) {
shape = VoxelShapes.or(shape, LINE_EAST); return LINE_EAST;
} }
if (direction == Direction.SOUTH) { if (direction == Direction.SOUTH) {
shape = VoxelShapes.or(shape, LINE_SOUTH); return LINE_SOUTH;
} }
if (direction == Direction.WEST) { if (direction == Direction.WEST) {
shape = VoxelShapes.or(shape, LINE_WEST); return LINE_WEST;
} }
if (direction == Direction.UP) { if (direction == Direction.UP) {
shape = VoxelShapes.or(shape, LINE_UP); return LINE_UP;
} }
if (direction == Direction.DOWN) { if (direction == Direction.DOWN) {
shape = VoxelShapes.or(shape, LINE_DOWN); return LINE_DOWN;
} }
return shape; return VoxelShapes.empty();
} }
@Nullable @Nullable
@@ -108,8 +115,8 @@ public class ExporterBlock extends CableBlock {
@Override @Override
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult hit) {
if (!world.isRemote) { if (!world.isRemote && CollisionUtils.isInBounds(getLineShape(state), pos, hit.getHitVec())) {
return NetworkUtils.attemptModify(world, pos, hit.getFace(), player, () -> NetworkHooks.openGui( return NetworkUtils.attemptModify(world, pos, hit.getFace(), player, () -> NetworkHooks.openGui(
(ServerPlayerEntity) player, (ServerPlayerEntity) player,
new PositionalTileContainerProvider<ExporterTile>( new PositionalTileContainerProvider<ExporterTile>(

View File

@@ -7,6 +7,7 @@ import com.raoulvdberge.refinedstorage.container.ExternalStorageContainer;
import com.raoulvdberge.refinedstorage.container.factory.PositionalTileContainerProvider; import com.raoulvdberge.refinedstorage.container.factory.PositionalTileContainerProvider;
import com.raoulvdberge.refinedstorage.tile.ExternalStorageTile; import com.raoulvdberge.refinedstorage.tile.ExternalStorageTile;
import com.raoulvdberge.refinedstorage.util.BlockUtils; import com.raoulvdberge.refinedstorage.util.BlockUtils;
import com.raoulvdberge.refinedstorage.util.CollisionUtils;
import com.raoulvdberge.refinedstorage.util.NetworkUtils; import com.raoulvdberge.refinedstorage.util.NetworkUtils;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@@ -51,33 +52,39 @@ public class ExternalStorageBlock extends CableBlock {
public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) { public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) {
VoxelShape shape = super.getShape(state, world, pos, ctx); VoxelShape shape = super.getShape(state, world, pos, ctx);
shape = VoxelShapes.or(shape, getHeadShape(state));
return shape;
}
private VoxelShape getHeadShape(BlockState state) {
Direction direction = state.get(getDirection().getProperty()); Direction direction = state.get(getDirection().getProperty());
if (direction == Direction.NORTH) { if (direction == Direction.NORTH) {
shape = VoxelShapes.or(shape, HEAD_NORTH); return HEAD_NORTH;
} }
if (direction == Direction.EAST) { if (direction == Direction.EAST) {
shape = VoxelShapes.or(shape, HEAD_EAST); return HEAD_EAST;
} }
if (direction == Direction.SOUTH) { if (direction == Direction.SOUTH) {
shape = VoxelShapes.or(shape, HEAD_SOUTH); return HEAD_SOUTH;
} }
if (direction == Direction.WEST) { if (direction == Direction.WEST) {
shape = VoxelShapes.or(shape, HEAD_WEST); return HEAD_WEST;
} }
if (direction == Direction.UP) { if (direction == Direction.UP) {
shape = VoxelShapes.or(shape, HEAD_UP); return HEAD_UP;
} }
if (direction == Direction.DOWN) { if (direction == Direction.DOWN) {
shape = VoxelShapes.or(shape, HEAD_DOWN); return HEAD_DOWN;
} }
return shape; return VoxelShapes.empty();
} }
@Nullable @Nullable
@@ -88,8 +95,8 @@ public class ExternalStorageBlock extends CableBlock {
@Override @Override
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult hit) {
if (!world.isRemote) { if (!world.isRemote && CollisionUtils.isInBounds(getHeadShape(state), pos, hit.getHitVec())) {
return NetworkUtils.attemptModify(world, pos, hit.getFace(), player, () -> NetworkHooks.openGui( return NetworkUtils.attemptModify(world, pos, hit.getFace(), player, () -> NetworkHooks.openGui(
(ServerPlayerEntity) player, (ServerPlayerEntity) player,
new PositionalTileContainerProvider<ExternalStorageTile>( new PositionalTileContainerProvider<ExternalStorageTile>(

View File

@@ -5,6 +5,7 @@ import com.raoulvdberge.refinedstorage.container.ImporterContainer;
import com.raoulvdberge.refinedstorage.container.factory.PositionalTileContainerProvider; import com.raoulvdberge.refinedstorage.container.factory.PositionalTileContainerProvider;
import com.raoulvdberge.refinedstorage.tile.ImporterTile; import com.raoulvdberge.refinedstorage.tile.ImporterTile;
import com.raoulvdberge.refinedstorage.util.BlockUtils; import com.raoulvdberge.refinedstorage.util.BlockUtils;
import com.raoulvdberge.refinedstorage.util.CollisionUtils;
import com.raoulvdberge.refinedstorage.util.NetworkUtils; import com.raoulvdberge.refinedstorage.util.NetworkUtils;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
@@ -71,33 +72,39 @@ public class ImporterBlock extends CableBlock {
public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) { public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) {
VoxelShape shape = super.getShape(state, world, pos, ctx); VoxelShape shape = super.getShape(state, world, pos, ctx);
shape = VoxelShapes.or(shape, getLineShape(state));
return shape;
}
private VoxelShape getLineShape(BlockState state) {
Direction direction = state.get(getDirection().getProperty()); Direction direction = state.get(getDirection().getProperty());
if (direction == Direction.NORTH) { if (direction == Direction.NORTH) {
shape = VoxelShapes.or(shape, LINE_NORTH); return LINE_NORTH;
} }
if (direction == Direction.EAST) { if (direction == Direction.EAST) {
shape = VoxelShapes.or(shape, LINE_EAST); return LINE_EAST;
} }
if (direction == Direction.SOUTH) { if (direction == Direction.SOUTH) {
shape = VoxelShapes.or(shape, LINE_SOUTH); return LINE_SOUTH;
} }
if (direction == Direction.WEST) { if (direction == Direction.WEST) {
shape = VoxelShapes.or(shape, LINE_WEST); return LINE_WEST;
} }
if (direction == Direction.UP) { if (direction == Direction.UP) {
shape = VoxelShapes.or(shape, LINE_UP); return LINE_UP;
} }
if (direction == Direction.DOWN) { if (direction == Direction.DOWN) {
shape = VoxelShapes.or(shape, LINE_DOWN); return LINE_DOWN;
} }
return shape; return VoxelShapes.empty();
} }
@Nullable @Nullable
@@ -108,8 +115,8 @@ public class ImporterBlock extends CableBlock {
@Override @Override
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult hit) {
if (!world.isRemote) { if (!world.isRemote && CollisionUtils.isInBounds(getLineShape(state), pos, hit.getHitVec())) {
return NetworkUtils.attemptModify(world, pos, hit.getFace(), player, () -> NetworkHooks.openGui( return NetworkUtils.attemptModify(world, pos, hit.getFace(), player, () -> NetworkHooks.openGui(
(ServerPlayerEntity) player, (ServerPlayerEntity) player,
new PositionalTileContainerProvider<ImporterTile>( new PositionalTileContainerProvider<ImporterTile>(

View File

@@ -1,13 +1,19 @@
package com.raoulvdberge.refinedstorage.util; package com.raoulvdberge.refinedstorage.util;
import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.shapes.VoxelShape;
public final class CollisionUtils { public final class CollisionUtils {
public static AxisAlignedBB getBounds(int fromX, int fromY, int fromZ, int toX, int toY, int toZ) { public static boolean isInBounds(VoxelShape shape, BlockPos pos, Vec3d hit) {
return new AxisAlignedBB((float) fromX / 16F, (float) fromY / 16F, (float) fromZ / 16F, (float) toX / 16F, (float) toY / 16F, (float) toZ / 16F); AxisAlignedBB aabb = shape.getBoundingBox().offset(pos);
}
public static boolean isInBounds(AxisAlignedBB aabb, float hitX, float hitY, float hitZ) { return hit.x >= aabb.minX
return hitX >= aabb.minX && hitX <= aabb.maxX && hitY >= aabb.minY && hitY <= aabb.maxY && hitZ >= aabb.minZ && hitZ <= aabb.maxZ; && hit.x <= aabb.maxX
&& hit.y >= aabb.minY
&& hit.y <= aabb.maxY
&& hit.z >= aabb.minZ
&& hit.z <= aabb.maxZ;
} }
} }