From dc7c73364e9d2549ca61942569edff9862ca41ad Mon Sep 17 00:00:00 2001 From: LX862 Date: Wed, 13 Dec 2023 22:41:35 +0800 Subject: [PATCH] Improve train jump behavior --- .../java/com/lx862/mtrtm/commands/train.java | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/lx862/mtrtm/commands/train.java b/src/main/java/com/lx862/mtrtm/commands/train.java index 5bcbf0f..74856a3 100644 --- a/src/main/java/com/lx862/mtrtm/commands/train.java +++ b/src/main/java/com/lx862/mtrtm/commands/train.java @@ -122,30 +122,43 @@ private static int jump(CommandContext context, boolean next } else if(isSiding) { targetDistance = distances.get(0); } else { - int i = 0; - IntList validPathIndex = new IntArrayList(); + boolean justOneMorePath = false; + for(int i = 0; i < trainData.train.path.size(); i++) { + int pIndex; + if(next) { + pIndex = i; + } else { + pIndex = trainData.train.path.size() - 1 - i; + } + + PathData path = trainData.train.path.get(pIndex); - for(PathData path : trainData.train.path) { boolean isStoppablePlatform = path.dwellTime > 0 && path.rail.railType == RailType.PLATFORM; + if((isPlatform && isStoppablePlatform) || isPath) { - validPathIndex.add(i); - double dist = distances.get(i); - if(dist > currentRailProgress) { - if(!next) { - boolean last2Path = !isPlatform; - dist = distances.get(validPathIndex.getInt(Math.max(0, validPathIndex.size() - 1 - (last2Path ? 2 : 1)))); - } + double dist = distances.get(pIndex); + if(next && dist > currentRailProgress) { targetDistance = dist; - pathIndex = i; + pathIndex = pIndex; break; } + + if(!next && dist < currentRailProgress) { + + if((trainData.train.getSpeed() == 0) || isPlatform || (trainData.train.getSpeed() > 0 && justOneMorePath) /* 1 more path if train is running */) { + targetDistance = dist; + pathIndex = pIndex; + break; + } + + justOneMorePath = true; + } } - i++; } } if(targetDistance != -1) { - ((TrainAccessorMixin)trainData.train).setNextStoppingIndex(pathIndex); + ((TrainAccessorMixin)trainData.train).setNextStoppingIndex(Math.max(pathIndex, ((TrainAccessorMixin) trainData.train).getNextStoppingIndex())); ((TrainAccessorMixin)trainData.train).setRailProgress(targetDistance); MtrUtil.syncTrainToPlayers(trainData.train, context.getSource().getLevel().players());