From d9ce6ce995128e64d079145b96273235c4fec783 Mon Sep 17 00:00:00 2001 From: techno-sam Date: Sun, 9 Apr 2023 07:14:46 -0700 Subject: [PATCH] Track API? Fix placement --- .../logistics/trains/BezierConnection.java | 14 +++++++++++ .../trains/track/TrackPlacement.java | 24 ++++++++++++------- .../trains/track/TrackTileEntity.java | 3 +++ 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java b/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java index fa06d3fa4..10b2fbead 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java @@ -72,6 +72,20 @@ public class BezierConnection implements Iterable, IHa hasGirder, trackMaterial); } + private static boolean coupleEquals(Couple a, Couple b) { + return (a.getFirst().equals(b.getFirst()) && a.getSecond().equals(b.getSecond())) || (a.getFirst() instanceof Vec3 aFirst && a.getSecond() instanceof Vec3 aSecond && b.getFirst() instanceof Vec3 bFirst && b.getSecond() instanceof Vec3 bSecond && aFirst.closerThan(bFirst, 1e-6) && aSecond.closerThan(bSecond, 1e-6)); + } + + public boolean equalsSansMaterial(BezierConnection other) { + return equalsSansMaterialInner(other) || equalsSansMaterialInner(other.secondary()); + } + + private boolean equalsSansMaterialInner(BezierConnection other) { + return this == other || (other != null && coupleEquals(this.tePositions, other.tePositions) && coupleEquals(this.starts, other.starts) + && coupleEquals(this.axes, other.axes) && coupleEquals(this.normals, other.normals) + && this.hasGirder == other.hasGirder); + } + public BezierConnection(CompoundTag compound, BlockPos localTo) { this(Couple.deserializeEach(compound.getList("Positions", Tag.TAG_COMPOUND), NbtUtils::readBlockPos) .map(b -> b.offset(localTo)), diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java index 9ea76b131..d23751c15 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java @@ -501,8 +501,8 @@ public class TrackPlacement { return onto; } - private static BlockState copyProperties(BlockState from, BlockState onto, Function keepFrom) { - return keepFrom.apply(from) ? copyProperties(from, onto) : from; + private static BlockState copyProperties(BlockState from, BlockState onto, boolean keepFrom) { + return keepFrom ? from : copyProperties(from, onto); } private static PlacementInfo placeTracks(Level level, PlacementInfo info, BlockState state1, BlockState state2, @@ -556,16 +556,22 @@ public class TrackPlacement { return info; if (!simulate) { - BlockState stateAtPos = level.getBlockState(targetPos1); BlockState onto = info.getMaterial().getTrackBlock().getDefaultState(); - level.setBlock(targetPos1, ProperWaterloggedBlock.withWater(level, - copyProperties((stateAtPos.getBlock() == state1.getBlock() ? stateAtPos : state1), onto, AllTags.AllBlockTags.TRACKS::matches).setValue(TrackBlock.HAS_TE, true), - targetPos1), 3); + var relevantState = state1; + BlockState stateAtPos = level.getBlockState(targetPos1); + var stateAtPosVar = stateAtPos; +// BlockState injectorAllocatedLocal30 = (BlockState)(stateAtPos.getBlock() == state1.getBlock() ? stateAtPos : state1).setValue(TrackBlock.HAS_TE, true); + relevantState = copyProperties(relevantState, onto); + var modifiedBlock = (AllTags.AllBlockTags.TRACKS.matches(stateAtPosVar) ? stateAtPosVar : relevantState).setValue(TrackBlock.HAS_TE, true); + level.setBlock(targetPos1, ProperWaterloggedBlock.withWater(level, modifiedBlock, targetPos1), 3); + relevantState = state2; stateAtPos = level.getBlockState(targetPos2); - level.setBlock(targetPos2, ProperWaterloggedBlock.withWater(level, - copyProperties((stateAtPos.getBlock() == state2.getBlock() ? stateAtPos : state2), onto, AllTags.AllBlockTags.TRACKS::matches).setValue(TrackBlock.HAS_TE, true), - targetPos2), 3); + stateAtPosVar = stateAtPos; +// BlockState injectorAllocatedLocal30 = (BlockState)(stateAtPos.getBlock() == state1.getBlock() ? stateAtPos : state1).setValue(TrackBlock.HAS_TE, true); + relevantState = copyProperties(relevantState, onto); + modifiedBlock = (AllTags.AllBlockTags.TRACKS.matches(stateAtPosVar) ? stateAtPosVar : relevantState).setValue(TrackBlock.HAS_TE, true); + level.setBlock(targetPos2, ProperWaterloggedBlock.withWater(level, modifiedBlock, targetPos2), 3); } BlockEntity te1 = level.getBlockEntity(targetPos1); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackTileEntity.java index a20c241cf..317ca94a6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackTileEntity.java @@ -113,6 +113,9 @@ public class TrackTileEntity extends SmartTileEntity implements ITransformableTE } public void addConnection(BezierConnection connection) { + // don't replace existing connections with different materials + if (connections.containsKey(connection.getKey()) && connection.equalsSansMaterial(connections.get(connection.getKey()))) + return; connections.put(connection.getKey(), connection); level.scheduleTick(worldPosition, getBlockState().getBlock(), 1); notifyUpdate();