diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java index c8bfc9585..91c8a10e4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java @@ -435,6 +435,15 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit } } + @SuppressWarnings("deprecation") + @Override + public void remove(boolean keepData) { + if (!world.isRemote && !removed && contraption != null) { + contraption.stop(world); + } + super.remove(keepData); + } + protected abstract StructureTransform makeStructureTransform(); @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index fd27685ce..c71acc94f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -743,7 +743,6 @@ public abstract class Contraption { } public void addBlocksToWorld(World world, StructureTransform transform) { - stop(world); for (boolean nonBrittles : Iterate.trueAndFalse) { for (BlockInfo block : blocks.values()) { if (nonBrittles == BlockMovementTraits.isBrittle(block.state)) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/TranslatingContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/TranslatingContraption.java index 58d77be16..062be299c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/TranslatingContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/TranslatingContraption.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement; +import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -16,7 +17,7 @@ public abstract class TranslatingContraption extends Contraption { public Set getColliders(World world, Direction movementDirection) { if (getBlocks() == null) - return null; + return Collections.EMPTY_SET; if (cachedColliders == null || cachedColliderDirection != movementDirection) { cachedColliders = new HashSet<>(); cachedColliderDirection = movementDirection; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java index 1a63715bb..603f5b5e6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java @@ -78,8 +78,10 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity impleme else sendData(); return; + } else { + if (getSpeed() != 0) + assemble(); } - assemble(); return; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java index 9c67056ee..33041f493 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java @@ -53,9 +53,14 @@ public class PistonContraption extends TranslatingContraption { public boolean assemble(World world, BlockPos pos) { if (!collectExtensions(world, pos, orientation)) return false; + int count = blocks.size(); if (!searchMovedStructure(world, anchor, retract ? orientation.getOpposite() : orientation)) return false; - bounds = bounds.union(pistonExtensionCollisionBox); + if (blocks.size() == count) { // no new blocks added + bounds = pistonExtensionCollisionBox; + } else { + bounds = bounds.union(pistonExtensionCollisionBox); + } startMoving(world); return true; } @@ -112,8 +117,10 @@ public class PistonContraption extends TranslatingContraption { anchor = pos.offset(direction, initialExtensionProgress + 1); extensionLength = extensionsInBack + extensionsInFront; initialExtensionProgress = extensionsInFront; - pistonExtensionCollisionBox = new AxisAlignedBB(end.offset(direction, -extensionsInFront) - .subtract(anchor)); + pistonExtensionCollisionBox = new AxisAlignedBB( + BlockPos.ZERO.offset(direction, -1), + BlockPos.ZERO.offset(direction, -extensionLength - 1)).expand(1, + 1, 1); if (extensionLength == 0) return false; @@ -124,7 +131,7 @@ public class PistonContraption extends TranslatingContraption { BlockPos relPos = pole.pos.offset(direction, -extensionsInFront); BlockPos localPos = relPos.subtract(anchor); getBlocks().put(localPos, new BlockInfo(localPos, pole.state, null)); - pistonExtensionCollisionBox = pistonExtensionCollisionBox.union(new AxisAlignedBB(localPos)); + //pistonExtensionCollisionBox = pistonExtensionCollisionBox.union(new AxisAlignedBB(localPos)); } return true; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartController.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartController.java index 4b60990c1..babe49943 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartController.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartController.java @@ -19,10 +19,16 @@ import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.block.BlockState; +import net.minecraft.block.PoweredRailBlock; import net.minecraft.entity.Entity; import net.minecraft.entity.item.minecart.AbstractMinecartEntity; +import net.minecraft.entity.item.minecart.MinecartEntity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.NBTUtil; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.common.util.Constants.NBT; @@ -78,8 +84,45 @@ public class MinecartController implements INBTSerializable { internalStall.booleanValue() || otherCart == null || !otherCart.isPresent() || otherCart.isStalled(false)); })); - if (!world.isRemote) + if (!world.isRemote) { setStalled(internalStall.booleanValue(), true); + disassemble(cart); + } + } + + private void disassemble(AbstractMinecartEntity cart) { + if (cart instanceof MinecartEntity) { + return; + } + List passengers = cart.getPassengers(); + if (passengers.isEmpty() || !(passengers.get(0) instanceof AbstractContraptionEntity)) { + return; + } + World world = cart.world; + int i = MathHelper.floor(cart.getX()); + int j = MathHelper.floor(cart.getY()); + int k = MathHelper.floor(cart.getZ()); + if (world.getBlockState(new BlockPos(i, j - 1, k)) + .isIn(BlockTags.RAILS)) { + --j; + } + BlockPos blockpos = new BlockPos(i, j, k); + BlockState blockstate = world.getBlockState(blockpos); + if (cart.canUseRail() && blockstate.isIn(BlockTags.RAILS) + && blockstate.getBlock() instanceof PoweredRailBlock + && ((PoweredRailBlock) blockstate.getBlock()) + .isActivatorRail()) { + if (cart.isBeingRidden()) { + cart.removePassengers(); + } + + if (cart.getRollingAmplitude() == 0) { + cart.setRollingDirection(-cart.getRollingDirection()); + cart.setRollingAmplitude(10); + cart.setDamage(50.0F); + cart.velocityChanged = true; + } + } } public boolean isFullyCoupled() {