From 6c942be7f5c4a70925965b428bf6d704be6dc2fa Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 1 Apr 2021 17:43:39 +0200 Subject: [PATCH] Too slippery - Sliding on contraptions now takes its slope into account - Gantry Carriages are now less prone to break when moved near other blocks --- .../structureMovement/ContraptionCollider.java | 11 +++++++---- .../structureMovement/gantry/GantryCarriageBlock.java | 7 ++++--- .../gantry/GantryCarriageTileEntity.java | 7 +++++++ 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java index 5bf21ef7f..286f21f95 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java @@ -285,13 +285,16 @@ public class ContraptionCollider { } if (bounce == 0 && slide > 0 && hasNormal && anyCollision && rotation.hasVerticalRotation()) { - Vec3d motionIn = entityMotionNoTemporal.mul(0, 1, 0) + double slideFactor = collisionNormal.mul(1, 0, 1) + .length() * 1.25f; + Vec3d motionIn = entityMotionNoTemporal.mul(0, .9, 0) .add(0, -.01f, 0); Vec3d slideNormal = collisionNormal.crossProduct(motionIn.crossProduct(collisionNormal)) .normalize(); - entity.setMotion(entityMotion.mul(.8, 0, .8) - .add(slideNormal.scale((.2f + slide) * motionIn.length()) - .add(0, -0.1, 0))); + Vec3d newMotion = entityMotion.mul(.85, 0, .85) + .add(slideNormal.scale((.2f + slide) * motionIn.length() * slideFactor) + .add(0, -.1f - collisionNormal.y * .125f, 0)); + entity.setMotion(newMotion); entityMotion = entity.getMotion(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageBlock.java index 744c803fc..39d223aa2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageBlock.java @@ -43,7 +43,7 @@ public class GantryCarriageBlock extends DirectionalAxisKineticBlock implements super.updateNeighbors(stateIn, worldIn, pos, flags); withTileEntityDo(worldIn, pos, GantryCarriageTileEntity::checkValidGantryShaft); } - + @Override public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { super.onBlockAdded(state, worldIn, pos, oldState, isMoving); @@ -82,9 +82,10 @@ public class GantryCarriageBlock extends DirectionalAxisKineticBlock implements } @Override - public void neighborChanged(BlockState state, World world, BlockPos pos, Block p_220069_4_, BlockPos p_220069_5_, + public void neighborChanged(BlockState state, World world, BlockPos pos, Block p_220069_4_, BlockPos updatePos, boolean p_220069_6_) { - if (!isValidPosition(state, world, pos)) + if (updatePos.equals(pos.offset(state.get(FACING) + .getOpposite())) && !isValidPosition(state, world, pos)) world.destroyBlock(pos, true); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageTileEntity.java index a3d59c9fd..377778a38 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageTileEntity.java @@ -36,6 +36,13 @@ public class GantryCarriageTileEntity extends KineticTileEntity implements IDisp if (shouldAssemble()) queueAssembly(); } + + @Override + public void initialize() { + super.initialize(); + if (!getBlockState().isValidPosition(world, pos)) + world.destroyBlock(pos, true); + } public void queueAssembly() { assembleNextTick = true;