From 62621f8bddce3778728ef3b236922cc3077c623d Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 18 Dec 2020 18:30:58 +0100 Subject: [PATCH] Mildly problematic - Fixed broken kinetic propagation caused by bracket handling - Fixed crash when fluid-interfacing with a contraption loaded from disk --- .../components/structureMovement/Contraption.java | 7 +++++++ .../bearing/MechanicalBearingTileEntity.java | 3 ++- .../content/contraptions/fluids/pipes/AxisPipeBlock.java | 6 +++--- .../content/contraptions/fluids/pipes/FluidPipeBlock.java | 6 +++--- .../contraptions/relays/elementary/AbstractShaftBlock.java | 6 +++--- .../relays/elementary/BracketedTileEntityBehaviour.java | 7 +++++-- .../contraptions/wrench/IWrenchableWithBracket.java | 4 ++-- 7 files changed, 25 insertions(+), 14 deletions(-) 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 1900365ef..1eaf0cdaa 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 @@ -607,7 +607,14 @@ public abstract class Contraption { int index = 0; for (MountedStorage mountedStorage : storage.values()) handlers[index++] = mountedStorage.getItemHandler(); + + IFluidHandler[] fluidHandlers = new IFluidHandler[fluidStorage.size()]; + index = 0; + for (MountedFluidStorage mountedStorage : fluidStorage.values()) + fluidHandlers[index++] = mountedStorage.getFluidHandler(); + inventory = new CombinedInvWrapper(handlers); + fluidInventory = new CombinedTankWrapper(fluidHandlers); if (nbt.contains("BoundsFront")) bounds = NBTHelper.readAABB(nbt.getList("BoundsFront", 5)); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java index c3250e152..b4dde3bc4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java @@ -123,7 +123,8 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp if (!contraption.assemble(world, pos)) return; - AllTriggers.triggerForNearbyPlayers(AllTriggers.WINDMILL, world, pos, 5); + if (isWindmill()) + AllTriggers.triggerForNearbyPlayers(AllTriggers.WINDMILL, world, pos, 5); if (contraption.getSailBlocks() >= 16 * 8) AllTriggers.triggerForNearbyPlayers(AllTriggers.MAXED_WINDMILL, world, pos, 5); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java index 523ed204c..dde62b1ff 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java @@ -49,7 +49,7 @@ public class AxisPipeBlock extends RotatedPillarBlock implements IWrenchableWith if (blockTypeChanged && !world.isRemote) FluidPropagator.propagateChangedPipe(world, pos, state); if (state != newState && !isMoving) - removeBracket(world, pos).ifPresent(stack -> Block.spawnAsEntity(world, pos, stack)); + removeBracket(world, pos, true).ifPresent(stack -> Block.spawnAsEntity(world, pos, stack)); if (state.hasTileEntity() && (blockTypeChanged || !newState.hasTileEntity())) world.removeTileEntity(pos); } @@ -127,12 +127,12 @@ public class AxisPipeBlock extends RotatedPillarBlock implements IWrenchableWith } @Override - public Optional removeBracket(IBlockReader world, BlockPos pos) { + public Optional removeBracket(IBlockReader world, BlockPos pos, boolean inOnReplacedContext) { BracketedTileEntityBehaviour behaviour = TileEntityBehaviour.get(world, pos, BracketedTileEntityBehaviour.TYPE); if (behaviour == null) return Optional.empty(); BlockState bracket = behaviour.getBracket(); - behaviour.removeBracket(); + behaviour.removeBracket(inOnReplacedContext); if (bracket == Blocks.AIR.getDefaultState()) return Optional.empty(); return Optional.of(new ItemStack(bracket.getBlock())); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java index 11ab68fb5..2ed24acca 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java @@ -103,7 +103,7 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren if (blockTypeChanged && !world.isRemote) FluidPropagator.propagateChangedPipe(world, pos, state); if (state != newState && !isMoving) - removeBracket(world, pos).ifPresent(stack -> Block.spawnAsEntity(world, pos, stack)); + removeBracket(world, pos, true).ifPresent(stack -> Block.spawnAsEntity(world, pos, stack)); if (state.hasTileEntity() && (blockTypeChanged || !newState.hasTileEntity())) world.removeTileEntity(pos); } @@ -260,13 +260,13 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren } @Override - public Optional removeBracket(IBlockReader world, BlockPos pos) { + public Optional removeBracket(IBlockReader world, BlockPos pos, boolean inOnReplacedContext) { BracketedTileEntityBehaviour behaviour = BracketedTileEntityBehaviour.get(world, pos, BracketedTileEntityBehaviour.TYPE); if (behaviour == null) return Optional.empty(); BlockState bracket = behaviour.getBracket(); - behaviour.removeBracket(); + behaviour.removeBracket(inOnReplacedContext); if (bracket == Blocks.AIR.getDefaultState()) return Optional.empty(); return Optional.of(new ItemStack(bracket.getBlock())); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/AbstractShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/AbstractShaftBlock.java index 210ba1029..57a13f56e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/AbstractShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/AbstractShaftBlock.java @@ -55,7 +55,7 @@ public abstract class AbstractShaftBlock extends RotatedPillarKineticBlock imple @SuppressWarnings("deprecation") public void onReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { if (state != newState && !isMoving) - removeBracket(world, pos).ifPresent(stack -> Block.spawnAsEntity(world, pos, stack)); + removeBracket(world, pos, true).ifPresent(stack -> Block.spawnAsEntity(world, pos, stack)); super.onReplaced(state, world, pos, newState, isMoving); } @@ -102,12 +102,12 @@ public abstract class AbstractShaftBlock extends RotatedPillarKineticBlock imple } @Override - public Optional removeBracket(IBlockReader world, BlockPos pos) { + public Optional removeBracket(IBlockReader world, BlockPos pos, boolean inOnReplacedContext) { BracketedTileEntityBehaviour behaviour = TileEntityBehaviour.get(world, pos, BracketedTileEntityBehaviour.TYPE); if (behaviour == null) return Optional.empty(); BlockState bracket = behaviour.getBracket(); - behaviour.removeBracket(); + behaviour.removeBracket(inOnReplacedContext); if (bracket == Blocks.AIR.getDefaultState()) return Optional.empty(); return Optional.of(new ItemStack(bracket.getBlock())); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java index aae3ce480..ef69047a0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java @@ -62,13 +62,16 @@ public class BracketedTileEntityBehaviour extends TileEntityBehaviour { AllTriggers.triggerFor(trigger.apply(state), player); } - public void removeBracket() { + public void removeBracket(boolean inOnReplacedContext) { World world = getWorld(); if (!world.isRemote) world.playEvent(2001, getPos(), Block.getStateId(getBracket())); this.bracket = Optional.empty(); reRender = true; - tileEntity.notifyUpdate(); + if (inOnReplacedContext) + tileEntity.sendData(); + else + tileEntity.notifyUpdate(); } public boolean isBacketPresent() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchableWithBracket.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchableWithBracket.java index 1c6ed8e89..e2c79126c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchableWithBracket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchableWithBracket.java @@ -19,7 +19,7 @@ import net.minecraft.world.World; public interface IWrenchableWithBracket extends IWrenchable { - public Optional removeBracket(IBlockReader world, BlockPos pos); + public Optional removeBracket(IBlockReader world, BlockPos pos, boolean inOnReplacedContext); @Override default ActionResultType onWrenched(BlockState state, ItemUseContext context) { @@ -31,7 +31,7 @@ public interface IWrenchableWithBracket extends IWrenchable { default boolean tryRemoveBracket(ItemUseContext context) { World world = context.getWorld(); BlockPos pos = context.getPos(); - Optional bracket = removeBracket(world, pos); + Optional bracket = removeBracket(world, pos, false); BlockState blockState = world.getBlockState(pos); if (bracket.isPresent()) { PlayerEntity player = context.getPlayer();