From f689a5ddde27969c84dfdc8ef7ecde4a7ce2a213 Mon Sep 17 00:00:00 2001 From: black nigger Date: Mon, 30 Mar 2026 20:21:55 +0200 Subject: [PATCH 1/3] feat. Elevator Displays --- .../AdvancedDisplayBlockEntity.java | 73 ++++++++++++++++++- .../blockentity/IContraptionBlockEntity.java | 6 +- .../de/mrjulsen/crn/data/ElevatorData.java | 3 + .../crn/mixin/MountedStorageManagerMixin.java | 5 +- .../de/mrjulsen/crn/util/VariableManager.java | 26 +++++++ 5 files changed, 106 insertions(+), 7 deletions(-) create mode 100644 common/src/main/java/de/mrjulsen/crn/data/ElevatorData.java diff --git a/common/src/main/java/de/mrjulsen/crn/block/blockentity/AdvancedDisplayBlockEntity.java b/common/src/main/java/de/mrjulsen/crn/block/blockentity/AdvancedDisplayBlockEntity.java index 622199e1..8c5fec7a 100644 --- a/common/src/main/java/de/mrjulsen/crn/block/blockentity/AdvancedDisplayBlockEntity.java +++ b/common/src/main/java/de/mrjulsen/crn/block/blockentity/AdvancedDisplayBlockEntity.java @@ -4,6 +4,11 @@ import java.util.List; import java.util.Optional; +import com.simibubi.create.content.contraptions.Contraption; +import com.simibubi.create.content.contraptions.ControlledContraptionEntity; +import com.simibubi.create.content.contraptions.elevator.ElevatorColumn; +import com.simibubi.create.content.contraptions.elevator.ElevatorContactBlockEntity; +import com.simibubi.create.content.contraptions.elevator.ElevatorContraption; import com.simibubi.create.content.decoration.copycat.CopycatBlockEntity; import com.simibubi.create.content.trains.display.FlapDisplayBlock; import com.simibubi.create.content.trains.entity.CarriageContraption; @@ -27,6 +32,7 @@ import de.mrjulsen.crn.client.ber.AdvancedDisplayRenderInstance; import de.mrjulsen.crn.config.ModClientConfig; import de.mrjulsen.crn.data.CarriageData; +import de.mrjulsen.crn.data.ElevatorData; import de.mrjulsen.crn.data.TrainExitSide; import de.mrjulsen.crn.data.StationTag.ClientStationTag; import de.mrjulsen.crn.data.StationTag.StationInfo; @@ -59,6 +65,7 @@ import net.minecraft.nbt.Tag; import net.minecraft.network.Connection; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.util.Mth; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.HorizontalDirectionalBlock; import net.minecraft.world.level.block.entity.BlockEntity; @@ -111,6 +118,7 @@ public class AdvancedDisplayBlockEntity extends CopycatBlockEntity implements private long lastRefreshedTime; private TrainDisplayData trainData = TrainDisplayData.empty(0); private CarriageData carriageData = new CarriageData(0, Direction.NORTH, false); + private ElevatorData elevatorData = new ElevatorData("", "", "", "", ""); // OTHER private int syncTicks = 0; @@ -184,6 +192,10 @@ public CarriageData getCarriageData() { return carriageData; } + public ElevatorData getElevatorData() { + return elevatorData; + } + public long getLastRefreshedTime() { return lastRefreshedTime; } @@ -502,8 +514,28 @@ public void lazyTick() { } } + public int getClosestFloor(ElevatorContraption ec) { + double currentY = ec.entity.getY(); + int currentFloorY = Mth.floor(0.5f + (float)currentY) + ec.getContactYOffset(); + + int closest = -1; + int minDistance = Integer.MAX_VALUE; + + for (var entry : ec.namesList) { + int contactY = entry.getFirst(); // Y-level piętra + int distance = Math.abs(contactY - currentFloorY); + + if (distance < minDistance) { + minDistance = distance; + closest = contactY; + } + } + + return closest; + } + @Override - public void contraptionTick(Level level, BlockPos pos, BlockState state, CarriageContraption carriage) { + public void contraptionTick(Level level, BlockPos pos, BlockState state, Contraption contraption) { assembledOnContraption = true; getRenderer().tick(level, pos, state, this); @@ -520,7 +552,44 @@ public void contraptionTick(Level level, BlockPos pos, BlockState state, Carriag if (level.isClientSide && syncTicks <= 0) { syncTicks = ModClientConfig.DISPLAY_REFRESH_RATE.get(); - if (!(carriage.entity instanceof CarriageContraptionEntity carriageContraption)) { + if (contraption instanceof ElevatorContraption elevator) { + int targetY = elevator.clientYTarget; + int closestY = getClosestFloor(elevator); + + String shortName = "", longName = "", shortNameDest = "", longNameDest = ""; + + // Wyciągamy nazwy z namesList zamiast z BlockEntity + for (var entry : elevator.namesList) { + int contactY = entry.getFirst(); + if (contactY == closestY) { + shortName = entry.getValue().getFirst(); + longName = entry.getValue().getSecond(); + } + if (contactY == targetY) { + shortNameDest = entry.getValue().getFirst(); + longNameDest = entry.getValue().getSecond(); + } + } + + String directionSign = ""; + if (!elevator.arrived) { + double actualY = elevator.entity.getY() + elevator.getContactYOffset(); + if (targetY > actualY + 0.5) directionSign = "up"; + else if (targetY < actualY - 0.5) directionSign = "dn"; + } + + ElevatorData newData = new ElevatorData(shortName.toString(), longName.toString(), shortNameDest.toString(), longNameDest.toString(), directionSign.toString()); + + if (!newData.equals(this.elevatorData)) { + this.elevatorData = newData; + getRenderer().update(level, pos, state, this, EUpdateReason.DATA_CHANGED); + } + } + + if (!(contraption.entity instanceof CarriageContraptionEntity carriageContraption)) { + return; + } + if (!(contraption instanceof CarriageContraption carriage)) { return; } diff --git a/common/src/main/java/de/mrjulsen/crn/block/blockentity/IContraptionBlockEntity.java b/common/src/main/java/de/mrjulsen/crn/block/blockentity/IContraptionBlockEntity.java index 3aefdcf2..cbde7b81 100644 --- a/common/src/main/java/de/mrjulsen/crn/block/blockentity/IContraptionBlockEntity.java +++ b/common/src/main/java/de/mrjulsen/crn/block/blockentity/IContraptionBlockEntity.java @@ -1,6 +1,6 @@ package de.mrjulsen.crn.block.blockentity; -import com.simibubi.create.content.trains.entity.CarriageContraption; +import com.simibubi.create.content.contraptions.Contraption; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; @@ -13,7 +13,7 @@ public interface IContraptionBlockEntity { * @param level * @param pos * @param state - * @param carriage + * @param contraption */ - void contraptionTick(Level level, BlockPos pos, BlockState state, CarriageContraption carriage); + void contraptionTick(Level level, BlockPos pos, BlockState state, Contraption contraption); } diff --git a/common/src/main/java/de/mrjulsen/crn/data/ElevatorData.java b/common/src/main/java/de/mrjulsen/crn/data/ElevatorData.java new file mode 100644 index 00000000..5c52a3c0 --- /dev/null +++ b/common/src/main/java/de/mrjulsen/crn/data/ElevatorData.java @@ -0,0 +1,3 @@ +package de.mrjulsen.crn.data; + +public record ElevatorData(String currentShortName, String currentLongName, String destinationShortName, String destinationLongName, String sign) {} diff --git a/common/src/main/java/de/mrjulsen/crn/mixin/MountedStorageManagerMixin.java b/common/src/main/java/de/mrjulsen/crn/mixin/MountedStorageManagerMixin.java index 09ee04d8..d1b3843f 100644 --- a/common/src/main/java/de/mrjulsen/crn/mixin/MountedStorageManagerMixin.java +++ b/common/src/main/java/de/mrjulsen/crn/mixin/MountedStorageManagerMixin.java @@ -10,6 +10,7 @@ import com.simibubi.create.content.contraptions.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.MountedStorageManager; +import com.simibubi.create.content.contraptions.elevator.ElevatorContraption; import com.simibubi.create.content.trains.entity.CarriageContraption; import de.mrjulsen.crn.CRNPlatformSpecific; @@ -22,7 +23,7 @@ public class MountedStorageManagerMixin { @Inject(method = "tick", remap = false, at = @At(value = "HEAD")) public void onEntityTick(AbstractContraptionEntity entity, CallbackInfo ci) { - if (entity.getContraption() instanceof CarriageContraption carriage) { + if (entity.getContraption() instanceof CarriageContraption || entity.getContraption() instanceof ElevatorContraption) { Set beList = new LinkedHashSet<>(); for (StructureBlockInfo info : entity.getContraption().getBlocks().values()) { @@ -34,7 +35,7 @@ public void onEntityTick(AbstractContraptionEntity entity, CallbackInfo ci) { for (BlockEntity be : beList) { if (be instanceof IContraptionBlockEntity tile) { - tile.contraptionTick(entity.level(), be.getBlockPos(), be.getBlockState(), carriage); + tile.contraptionTick(entity.level(), be.getBlockPos(), be.getBlockState(), entity.getContraption()); } } diff --git a/common/src/main/java/de/mrjulsen/crn/util/VariableManager.java b/common/src/main/java/de/mrjulsen/crn/util/VariableManager.java index 54d3386a..5df8f28f 100644 --- a/common/src/main/java/de/mrjulsen/crn/util/VariableManager.java +++ b/common/src/main/java/de/mrjulsen/crn/util/VariableManager.java @@ -75,6 +75,32 @@ private static String getReplacement(AdvancedDisplayBlockEntity blockEntity, Str // on-board if (blockEntity.assembledOnContraption) { + if (blockEntity.getElevatorData() != null) { + // elevator + if (variable.equals("elevator.current.short")) { + // Used only because the format %elevator.current.short% %elevator.current.sign% fails because short is often an integer. + return blockEntity.getElevatorData().currentShortName() + "\u200C"; + } else if (variable.equals("elevator.current.long")) { + return blockEntity.getElevatorData().currentLongName() + "\u200C"; + } else if (variable.equals("elevator.destination.short")) { + return blockEntity.getElevatorData().destinationShortName() + "\u200C"; + } else if (variable.equals("elevator.destination.long")) { + return blockEntity.getElevatorData().destinationLongName() + "\u200C"; + } else if (variable.equals("elevator.sign")) { + if (blockEntity.getElevatorData().sign() == "up") + return "↑"; + else if (blockEntity.getElevatorData().sign() == "dn") + return "↓"; + else return ""; + } else if (variable.equals("elevator.sign.triangle")) { + if (blockEntity.getElevatorData().sign() == "up") + return "▲"; + else if (blockEntity.getElevatorData().sign() == "dn") + return "▼"; + else return ""; + } + } + TrainDisplayData train = blockEntity.getTrainData(); if (variable.equals("via")) { From 13614b2bd533d8dcd0362a301d259e8c665e958c Mon Sep 17 00:00:00 2001 From: black nigger Date: Mon, 30 Mar 2026 20:26:29 +0200 Subject: [PATCH 2/3] remove polish comments --- .../crn/block/blockentity/AdvancedDisplayBlockEntity.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/common/src/main/java/de/mrjulsen/crn/block/blockentity/AdvancedDisplayBlockEntity.java b/common/src/main/java/de/mrjulsen/crn/block/blockentity/AdvancedDisplayBlockEntity.java index 8c5fec7a..0003935b 100644 --- a/common/src/main/java/de/mrjulsen/crn/block/blockentity/AdvancedDisplayBlockEntity.java +++ b/common/src/main/java/de/mrjulsen/crn/block/blockentity/AdvancedDisplayBlockEntity.java @@ -522,7 +522,7 @@ public int getClosestFloor(ElevatorContraption ec) { int minDistance = Integer.MAX_VALUE; for (var entry : ec.namesList) { - int contactY = entry.getFirst(); // Y-level piętra + int contactY = entry.getFirst(); int distance = Math.abs(contactY - currentFloorY); if (distance < minDistance) { @@ -558,7 +558,6 @@ public void contraptionTick(Level level, BlockPos pos, BlockState state, Contrap String shortName = "", longName = "", shortNameDest = "", longNameDest = ""; - // Wyciągamy nazwy z namesList zamiast z BlockEntity for (var entry : elevator.namesList) { int contactY = entry.getFirst(); if (contactY == closestY) { From b63cdf5fc49b6bfdb9255408052b913f0df59824 Mon Sep 17 00:00:00 2001 From: black nigger Date: Wed, 1 Apr 2026 16:27:45 +0200 Subject: [PATCH 3/3] use enums for arrows --- .../AdvancedDisplayBlockEntity.java | 11 +++++---- .../de/mrjulsen/crn/data/ElevatorData.java | 2 +- .../crn/data/ElevatorMovementType.java | 23 +++++++++++++++++++ .../de/mrjulsen/crn/util/VariableManager.java | 12 ++-------- 4 files changed, 32 insertions(+), 16 deletions(-) create mode 100644 common/src/main/java/de/mrjulsen/crn/data/ElevatorMovementType.java diff --git a/common/src/main/java/de/mrjulsen/crn/block/blockentity/AdvancedDisplayBlockEntity.java b/common/src/main/java/de/mrjulsen/crn/block/blockentity/AdvancedDisplayBlockEntity.java index 0003935b..7848e562 100644 --- a/common/src/main/java/de/mrjulsen/crn/block/blockentity/AdvancedDisplayBlockEntity.java +++ b/common/src/main/java/de/mrjulsen/crn/block/blockentity/AdvancedDisplayBlockEntity.java @@ -33,6 +33,7 @@ import de.mrjulsen.crn.config.ModClientConfig; import de.mrjulsen.crn.data.CarriageData; import de.mrjulsen.crn.data.ElevatorData; +import de.mrjulsen.crn.data.ElevatorMovementType; import de.mrjulsen.crn.data.TrainExitSide; import de.mrjulsen.crn.data.StationTag.ClientStationTag; import de.mrjulsen.crn.data.StationTag.StationInfo; @@ -118,7 +119,7 @@ public class AdvancedDisplayBlockEntity extends CopycatBlockEntity implements private long lastRefreshedTime; private TrainDisplayData trainData = TrainDisplayData.empty(0); private CarriageData carriageData = new CarriageData(0, Direction.NORTH, false); - private ElevatorData elevatorData = new ElevatorData("", "", "", "", ""); + private ElevatorData elevatorData = new ElevatorData("", "", "", "", ElevatorMovementType.STANDING_STILL); // OTHER private int syncTicks = 0; @@ -570,14 +571,14 @@ public void contraptionTick(Level level, BlockPos pos, BlockState state, Contrap } } - String directionSign = ""; + ElevatorMovementType directionSign = ElevatorMovementType.STANDING_STILL; if (!elevator.arrived) { double actualY = elevator.entity.getY() + elevator.getContactYOffset(); - if (targetY > actualY + 0.5) directionSign = "up"; - else if (targetY < actualY - 0.5) directionSign = "dn"; + if (targetY > actualY + 0.5) directionSign = ElevatorMovementType.GOING_UP; + else if (targetY < actualY - 0.5) directionSign = ElevatorMovementType.GOING_DOWN; } - ElevatorData newData = new ElevatorData(shortName.toString(), longName.toString(), shortNameDest.toString(), longNameDest.toString(), directionSign.toString()); + ElevatorData newData = new ElevatorData(shortName.toString(), longName.toString(), shortNameDest.toString(), longNameDest.toString(), directionSign); if (!newData.equals(this.elevatorData)) { this.elevatorData = newData; diff --git a/common/src/main/java/de/mrjulsen/crn/data/ElevatorData.java b/common/src/main/java/de/mrjulsen/crn/data/ElevatorData.java index 5c52a3c0..93fed7af 100644 --- a/common/src/main/java/de/mrjulsen/crn/data/ElevatorData.java +++ b/common/src/main/java/de/mrjulsen/crn/data/ElevatorData.java @@ -1,3 +1,3 @@ package de.mrjulsen.crn.data; -public record ElevatorData(String currentShortName, String currentLongName, String destinationShortName, String destinationLongName, String sign) {} +public record ElevatorData(String currentShortName, String currentLongName, String destinationShortName, String destinationLongName, ElevatorMovementType sign) {} diff --git a/common/src/main/java/de/mrjulsen/crn/data/ElevatorMovementType.java b/common/src/main/java/de/mrjulsen/crn/data/ElevatorMovementType.java new file mode 100644 index 00000000..eab1cdc2 --- /dev/null +++ b/common/src/main/java/de/mrjulsen/crn/data/ElevatorMovementType.java @@ -0,0 +1,23 @@ +package de.mrjulsen.crn.data; + +public enum ElevatorMovementType { + STANDING_STILL("", ""), + GOING_UP("↑", "▲"), + GOING_DOWN("↓", "▼"); + + final String arrow; + final String triangle; + + ElevatorMovementType(String arrow, String triangle) { + this.arrow = arrow; + this.triangle = triangle; + } + + public String getArrow() { + return arrow; + } + + public String getTriangle() { + return triangle; + } +} diff --git a/common/src/main/java/de/mrjulsen/crn/util/VariableManager.java b/common/src/main/java/de/mrjulsen/crn/util/VariableManager.java index 5df8f28f..9b716ae9 100644 --- a/common/src/main/java/de/mrjulsen/crn/util/VariableManager.java +++ b/common/src/main/java/de/mrjulsen/crn/util/VariableManager.java @@ -87,17 +87,9 @@ private static String getReplacement(AdvancedDisplayBlockEntity blockEntity, Str } else if (variable.equals("elevator.destination.long")) { return blockEntity.getElevatorData().destinationLongName() + "\u200C"; } else if (variable.equals("elevator.sign")) { - if (blockEntity.getElevatorData().sign() == "up") - return "↑"; - else if (blockEntity.getElevatorData().sign() == "dn") - return "↓"; - else return ""; + return blockEntity.getElevatorData().sign().getArrow(); } else if (variable.equals("elevator.sign.triangle")) { - if (blockEntity.getElevatorData().sign() == "up") - return "▲"; - else if (blockEntity.getElevatorData().sign() == "dn") - return "▼"; - else return ""; + return blockEntity.getElevatorData().sign().getTriangle(); } }