Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -27,6 +32,8 @@
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.ElevatorMovementType;
import de.mrjulsen.crn.data.TrainExitSide;
import de.mrjulsen.crn.data.StationTag.ClientStationTag;
import de.mrjulsen.crn.data.StationTag.StationInfo;
Expand Down Expand Up @@ -59,6 +66,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;
Expand Down Expand Up @@ -111,6 +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("", "", "", "", ElevatorMovementType.STANDING_STILL);

// OTHER
private int syncTicks = 0;
Expand Down Expand Up @@ -184,6 +193,10 @@ public CarriageData getCarriageData() {
return carriageData;
}

public ElevatorData getElevatorData() {
return elevatorData;
}

public long getLastRefreshedTime() {
return lastRefreshedTime;
}
Expand Down Expand Up @@ -502,8 +515,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();
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);

Expand All @@ -520,7 +553,43 @@ 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 = "";

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();
}
}

ElevatorMovementType directionSign = ElevatorMovementType.STANDING_STILL;
if (!elevator.arrived) {
double actualY = elevator.entity.getY() + elevator.getContactYOffset();
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);

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;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -13,7 +13,7 @@ public interface IContraptionBlockEntity<T extends BlockEntity> {
* @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);
}
3 changes: 3 additions & 0 deletions common/src/main/java/de/mrjulsen/crn/data/ElevatorData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package de.mrjulsen.crn.data;

public record ElevatorData(String currentShortName, String currentLongName, String destinationShortName, String destinationLongName, ElevatorMovementType sign) {}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<BlockEntity> beList = new LinkedHashSet<>();

for (StructureBlockInfo info : entity.getContraption().getBlocks().values()) {
Expand All @@ -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());
}
}

Expand Down
18 changes: 18 additions & 0 deletions common/src/main/java/de/mrjulsen/crn/util/VariableManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,24 @@ 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")) {
return blockEntity.getElevatorData().sign().getArrow();
} else if (variable.equals("elevator.sign.triangle")) {
return blockEntity.getElevatorData().sign().getTriangle();
}
}

TrainDisplayData train = blockEntity.getTrainData();

if (variable.equals("via")) {
Expand Down