From b1a9993b165af7ff6c8ae3378a05435d4e82bfbd Mon Sep 17 00:00:00 2001 From: reidbhuntley Date: Tue, 11 Jan 2022 13:04:08 -0500 Subject: [PATCH] Encased belt blocks --- .../contraptions/base/KineticTileEntity.java | 2 +- .../gantry/GantryCarriageBlock.java | 9 --- .../relays/advanced/GantryShaftBlock.java | 21 ++++--- .../advanced/GantryShaftTileEntity.java | 29 +++++++--- .../advanced/sequencer/Instruction.java | 6 +- .../SequencedGearshiftTileEntity.java | 18 ++---- .../encased/AdjustablePulleyTileEntity.java | 27 +++++---- .../relays/encased/EncasedBeltBlock.java | 51 ++++++++--------- .../relays/gearbox/GearboxBlock.java | 13 ++--- .../relays/gearbox/GearshiftTileEntity.java | 4 +- .../contraptions/solver/AllConnections.java | 57 +++++-------------- .../solver/ConnectionsBuilder.java | 43 +++++++++----- .../solver/KineticConnections.java | 49 +++++++++------- .../contraptions/solver/KineticNode.java | 18 +++--- 14 files changed, 174 insertions(+), 173 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index 3ae6e85a2..ef76a41e5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -75,7 +75,7 @@ public class KineticTileEntity extends SmartTileEntity updateInitialConnections(state); } - protected void updateInitialConnections(BlockState state) { + public void updateInitialConnections(BlockState state) { if (state.getBlock() instanceof IRotate rotate) { initialConnections = rotate.buildInitialConnections(ConnectionsBuilder.builder(), state).build(); if (getLevel() != null && !getLevel().isClientSide) { 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 5cc138012..0212e000b 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 @@ -130,15 +130,6 @@ public class GantryCarriageBlock extends DirectionalAxisKineticBlock implements return Axis.Y; } - public static Axis getValidGantryPinionAxis(BlockState state, Axis shaftAxis) { - Axis facingAxis = state.getValue(FACING) - .getAxis(); - for (Axis axis : Iterate.axes) - if (axis != shaftAxis && axis != facingAxis) - return axis; - return Axis.Y; - } - @Override public Class getTileEntityClass() { return GantryCarriageTileEntity.class; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java index 32b05dd4a..7c02b5b9e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java @@ -8,6 +8,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; +import com.simibubi.create.content.contraptions.solver.ConnectionsBuilder; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; @@ -175,12 +176,17 @@ public class GantryShaftBlock extends DirectionalKineticBlock implements ITE kte.updateConnections(state)); } } } @@ -227,8 +233,9 @@ public class GantryShaftBlock extends DirectionalKineticBlock implements ITE getSpeedModifier() { + float getSpeedModifier() { return switch (instruction) { - case TURN_ANGLE, TURN_DISTANCE -> Optional.of(speedModifier); - default -> Optional.empty(); + case TURN_ANGLE, TURN_DISTANCE -> speedModifier.value; + default -> 0; }; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java index 13375f0a9..55bfad52b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java @@ -162,23 +162,17 @@ public class SequencedGearshiftTileEntity extends KineticTileEntity { ConnectionsBuilder builder = ConnectionsBuilder.builder(); if (isVirtual()) return builder.withFullShaft(facing.getAxis()).build(); - builder = builder.withHalfShaft(facing.getOpposite()); + builder = builder.withHalfShaft(facing.getOpposite(), 1); - Optional modifier = getModifier(); - if (modifier.isEmpty() || isRemoved()) return builder.build(); + float modifier = getModifier(); + if (modifier == 0 || isRemoved()) return builder.build(); - AllConnections.Shafts shaft = switch(modifier.get()) { - case FORWARD_FAST -> AllConnections.Shafts.SHAFT_X2; - case FORWARD -> AllConnections.Shafts.SHAFT; - case BACK -> AllConnections.Shafts.SHAFT_REV; - case BACK_FAST -> AllConnections.Shafts.SHAFT_REV_X2; - }; - return builder.withHalfShaft(shaft, facing).build(); + return builder.withHalfShaft(facing, modifier).build(); } - public Optional getModifier() { + public float getModifier() { if (currentInstruction >= instructions.size() || isIdle()) - return Optional.empty(); + return 0; return instructions.get(currentInstruction).getSpeedModifier(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyTileEntity.java index f5f4e97b5..b730bdc5e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyTileEntity.java @@ -2,6 +2,9 @@ package com.simibubi.create.content.contraptions.relays.encased; import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.solver.ConnectionsBuilder; +import com.simibubi.create.content.contraptions.solver.KineticConnections; + import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -11,10 +14,12 @@ public class AdjustablePulleyTileEntity extends KineticTileEntity { int signal; boolean signalChanged; + KineticConnections connections; public AdjustablePulleyTileEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); signal = 0; + updateConnections(state); setLazyTickRate(40); } @@ -26,12 +31,14 @@ public class AdjustablePulleyTileEntity extends KineticTileEntity { @Override protected void read(CompoundTag compound, boolean clientPacket) { - signal = compound.getInt("Signal"); + analogSignalChanged(compound.getInt("Signal")); super.read(compound, clientPacket); } - public float getModifier() { - return getModifierForSignal(signal); + protected float getModifier() { + if (signal == 0) + return 1; + return 1 + ((signal + 1) / 16f); } public void neighbourChanged() { @@ -60,16 +67,16 @@ public class AdjustablePulleyTileEntity extends KineticTileEntity { } protected void analogSignalChanged(int newSignal) { - //detachKinetics(); - //removeSource(); signal = newSignal; - //attachKinetics(); + updateConnections(getBlockState()); } - protected float getModifierForSignal(int newPower) { - if (newPower == 0) - return 1; - return 1 + ((newPower + 1) / 16f); + private void updateConnections(BlockState state) { + connections = EncasedBeltBlock.encasedBeltConnections(state, getModifier()).build(); } + @Override + public KineticConnections getConnections() { + return connections; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedBeltBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedBeltBlock.java index 003622452..42583b927 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedBeltBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedBeltBlock.java @@ -4,6 +4,8 @@ import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock; +import com.simibubi.create.content.contraptions.solver.AllConnections; +import com.simibubi.create.content.contraptions.solver.ConnectionsBuilder; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; @@ -121,8 +123,12 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock implements ITE kte.updateInitialConnections(newState)); + + return newState; } @Override @@ -164,39 +170,30 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock implements ITE genConnections(Direction dir) { + return List.of(new Entry(dir.getNormal(), SHAFT.type(dir.getOpposite()), 1)); + } + }, + + ENCASED_BELT("encased_belt") { + @Override + public List genConnections(Direction dir) { + return List.of(new Entry(dir.getNormal(), ENCASED_BELT.type(dir.getOpposite()), 1)); + } + }, + GANTRY_RACK("gantry_rack") { @Override public List genConnections(Direction dir) { return List.of(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/solver/ConnectionsBuilder.java b/src/main/java/com/simibubi/create/content/contraptions/solver/ConnectionsBuilder.java index e8903e4e6..92f7a68d6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/solver/ConnectionsBuilder.java +++ b/src/main/java/com/simibubi/create/content/contraptions/solver/ConnectionsBuilder.java @@ -2,11 +2,13 @@ package com.simibubi.create.content.contraptions.solver; import net.minecraft.core.Direction; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; public class ConnectionsBuilder { - private final Set connections = new HashSet<>(); + private final Map connections = new HashMap<>(); public static ConnectionsBuilder builder() { return new ConnectionsBuilder(); @@ -16,32 +18,31 @@ public class ConnectionsBuilder { return new KineticConnections(connections); } - public ConnectionsBuilder withHalfShaft(AllConnections.Shafts shaft, Direction dir) { - connections.add(KineticConnectionsRegistry.getConnectionType(shaft.type(dir)).get()); + public ConnectionsBuilder withDirectional(AllConnections.Directional directional, Direction dir, float mod) { + connections.put(KineticConnectionsRegistry.getConnectionType(directional.type(dir)).get(), mod); return this; } - public ConnectionsBuilder withHalfShaft(Direction dir) { - return withHalfShaft(AllConnections.Shafts.SHAFT, dir); - } - - public ConnectionsBuilder withFullShaft(Direction.Axis axis) { - return this.withHalfShaft(AllConnections.pos(axis)).withHalfShaft(AllConnections.neg(axis)); - } - public ConnectionsBuilder withDirectional(AllConnections.Directional directional, Direction dir) { - connections.add(KineticConnectionsRegistry.getConnectionType(directional.type(dir)).get()); + return withDirectional(directional, dir, 1); + } + + public ConnectionsBuilder withAxial(AllConnections.Axial axial, Direction.Axis axis, float mod) { + connections.put(KineticConnectionsRegistry.getConnectionType(axial.type(axis)).get(), mod); return this; } public ConnectionsBuilder withAxial(AllConnections.Axial axial, Direction.Axis axis) { - connections.add(KineticConnectionsRegistry.getConnectionType(axial.type(axis)).get()); + return withAxial(axial, axis, 1); + } + + public ConnectionsBuilder withDirAxial(AllConnections.DirAxial dirAxial, Direction dir, boolean first, float mod) { + connections.put(KineticConnectionsRegistry.getConnectionType(dirAxial.type(dir, first)).get(), mod); return this; } public ConnectionsBuilder withDirAxial(AllConnections.DirAxial dirAxial, Direction dir, boolean first) { - connections.add(KineticConnectionsRegistry.getConnectionType(dirAxial.type(dir, first)).get()); - return this; + return withDirAxial(dirAxial, dir, first, 1); } public ConnectionsBuilder withLargeCog(Direction.Axis axis) { @@ -51,4 +52,16 @@ public class ConnectionsBuilder { public ConnectionsBuilder withSmallCog(Direction.Axis axis) { return withAxial(AllConnections.Axial.SMALL_COG, axis); } + + public ConnectionsBuilder withHalfShaft(Direction dir, float mod) { + return withDirectional(AllConnections.Directional.SHAFT, dir, mod); + } + + public ConnectionsBuilder withHalfShaft(Direction dir) { + return withHalfShaft(dir, 1); + } + + public ConnectionsBuilder withFullShaft(Direction.Axis axis) { + return this.withHalfShaft(AllConnections.pos(axis)).withHalfShaft(AllConnections.neg(axis)); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/solver/KineticConnections.java b/src/main/java/com/simibubi/create/content/contraptions/solver/KineticConnections.java index 6ba1ba708..a4937ba02 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/solver/KineticConnections.java +++ b/src/main/java/com/simibubi/create/content/contraptions/solver/KineticConnections.java @@ -1,51 +1,49 @@ package com.simibubi.create.content.contraptions.solver; +import com.simibubi.create.foundation.utility.Pair; + import net.minecraft.core.Direction; import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.StringTag; import net.minecraft.nbt.Tag; + +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Stream; public class KineticConnections { - private final Set connections; + private final Map connections; - public KineticConnections(Set connections) { + public KineticConnections(Map connections) { this.connections = connections; } public static KineticConnections empty() { - return new KineticConnections(Set.of()); + return new KineticConnections(Map.of()); } - public Stream stream() { - return connections.stream(); + public Set> entries() { + return connections.entrySet(); } public boolean hasStressOnlyConnections() { - return connections.stream() - .flatMap(c -> c.getRatios().values().stream() + return entries().stream() + .flatMap(c -> c.getKey().getRatios().values().stream() .flatMap(m -> m.values().stream())) .anyMatch(r -> r == 0); } public float getShaftSpeedModifier(Direction face) { - Vec3i offset = face.getNormal(); - KineticConnection shaft = KineticConnectionsRegistry - .getConnectionType(AllConnections.Shafts.SHAFT.type(face.getOpposite())).get(); + .getConnectionType(AllConnections.Directional.SHAFT.type(face)).get(); - return stream() - .flatMap(c -> Optional.ofNullable(c.getRatios().get(offset)) - .flatMap(r -> Optional.ofNullable(r.get(shaft))) - .stream()) - .findFirst() - .orElse(0f); + return Optional.ofNullable(connections.get(shaft)).orElse(0f); } @Override @@ -63,18 +61,25 @@ public class KineticConnections { public CompoundTag save(CompoundTag tag) { ListTag connectionsTags = new ListTag(); - for (KineticConnection connection : connections) { - connectionsTags.add(StringTag.valueOf(connection.name())); + for (Map.Entry entry : connections.entrySet()) { + CompoundTag entryTag = new CompoundTag(); + entryTag.putString("Name", entry.getKey().name()); + if (entry.getValue() != 1) { + entryTag.putFloat("Mod", entry.getValue()); + } + connectionsTags.add(entryTag); } tag.put("Connections", connectionsTags); return tag; } public static KineticConnections load(CompoundTag tag) { - Set connections = new HashSet<>(); - tag.getList("Connections", Tag.TAG_STRING).forEach(t -> { - KineticConnectionsRegistry.getConnectionType(t.getAsString()) - .ifPresent(connections::add); + Map connections = new HashMap<>(); + tag.getList("Connections", Tag.TAG_COMPOUND).forEach(t -> { + CompoundTag ct = (CompoundTag) t; + String name = ct.getString("Name"); + float mod = ct.contains("Mod") ? ct.getFloat("Mod") : 1; + KineticConnectionsRegistry.getConnectionType(name).ifPresent(c -> connections.put(c, mod)); }); return new KineticConnections(connections); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/solver/KineticNode.java b/src/main/java/com/simibubi/create/content/contraptions/solver/KineticNode.java index 96b1eb230..e0b86d0bd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/solver/KineticNode.java +++ b/src/main/java/com/simibubi/create/content/contraptions/solver/KineticNode.java @@ -160,17 +160,21 @@ public class KineticNode { * the connecting node and the second value is the speed ratio of the connection */ private Stream> getAllActiveConnections() { - return connections.stream() - .flatMap(from -> from.getRatios().entrySet().stream() + return connections.entries().stream() + .flatMap(from -> from.getKey().getRatios().entrySet().stream() .map(e -> { Vec3i offset = e.getKey(); return solver.getNode(pos.offset(offset)).flatMap(node -> { Map ratios = e.getValue(); - return node.getConnections().stream() - .map(ratios::get) - .filter(Objects::nonNull) - .findFirst() - .map(r -> Pair.of(node, r)); + for (Map.Entry to : node.getConnections().entries()) { + Float ratio = ratios.get(to.getKey()); + if (ratio != null) { + float fromMod = from.getValue(); + float toMod = to.getValue(); + return Optional.of(Pair.of(node, ratio * fromMod / toMod)); + } + } + return Optional.empty(); }); }) )