diff --git a/pom.xml b/pom.xml
index abac4da..247eee3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
de.srsoftware
web4rail
- 1.4.28
+ 1.4.29
Web4Rail
jar
Java Model Railway Control
diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java
index fab643e..c442c11 100644
--- a/src/main/java/de/srsoftware/web4rail/Route.java
+++ b/src/main/java/de/srsoftware/web4rail/Route.java
@@ -401,6 +401,7 @@ public class Route extends BaseClass {
}
private void freeIgnoring(Vector skipTiles) {
+ if (isNull(context)) return;
Train train = context.train();
Vector reversedPath = reverse(path());
if (isSet(skipTiles)) reversedPath.removeAll(skipTiles);
diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java
index 86273c3..93b138f 100644
--- a/src/main/java/de/srsoftware/web4rail/moving/Train.java
+++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java
@@ -432,10 +432,11 @@ public class Train extends BaseClass implements Comparable {
}
- public void dropTrace(boolean dropStuck) {
+ public Train dropTrace(boolean dropStuck) {
while (!trace.isEmpty()) trace.stream().findFirst().get().free(this);
trace.clear();
if (dropStuck) stuckTrace = null;
+ return this;
}
private BrakeProcess endBrake() {
@@ -453,7 +454,6 @@ public class Train extends BaseClass implements Comparable {
direction = endedRoute.endDirection; // muss vor der Auswertung des Destination-Tags stehen!
Block endBlock = endedRoute.endBlock();
Block startBlock = endedRoute.startBlock();
- shunting = false;
if (endBlock == destination) {
destination = null;
@@ -504,6 +504,7 @@ public class Train extends BaseClass implements Comparable {
if ((!autopilot) || isNull(nextPreparedRoute) || (isSet(waitTime) && waitTime > 0)) setSpeed(0);
route = null;
endBlock.setTrain(this);
+ shunting = false; // wird in setTrain verwendet, muss also danach stehen
currentBlock = endBlock;
trace.add(endBlock);
if (!trace.contains(startBlock)) startBlock.dropTrain(this);
diff --git a/src/main/java/de/srsoftware/web4rail/threads/BrakeProcess.java b/src/main/java/de/srsoftware/web4rail/threads/BrakeProcess.java
index 2e76b7e..a6affc9 100644
--- a/src/main/java/de/srsoftware/web4rail/threads/BrakeProcess.java
+++ b/src/main/java/de/srsoftware/web4rail/threads/BrakeProcess.java
@@ -85,6 +85,7 @@ public class BrakeProcess extends BaseClass implements Runnable{
updateDistance();
LOG.debug("updateTime(): start speed was {} {}.",startSpeed,BaseClass.speedUnit);
Integer newTimeStep = timeStep;
+ if (isNull(newTimeStep)) return;
long calculated;
int step = 32*newTimeStep;
for (int i=0; i<20; i++) {
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Block.java b/src/main/java/de/srsoftware/web4rail/tiles/Block.java
index 05caddc..602b158 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Block.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Block.java
@@ -453,6 +453,15 @@ public abstract class Block extends StretchableTile{
internalContacts.remove(blockContact);
}
+ @Override
+ public boolean setTrain(Train newTrain) {
+ if (isDisabled()) return false;
+ if (isNull(newTrain)) return false;
+ Train occupyingTrain = occupyingTrain();
+ if (isSet(occupyingTrain) && newTrain != occupyingTrain && newTrain.isShunting()) parkedTrains.add(occupyingTrain.dropTrace(false));
+ return super.setTrain(newTrain);
+ }
+
public abstract List startPoints();
@Override
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
index 53ec2f0..5fea179 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
@@ -465,10 +465,10 @@ public abstract class Tile extends BaseClass implements Comparable {
if (isNull(newTrain)) return false;
if (isSet(reservingTrain) && newTrain != reservingTrain) return false;
if (isSet(lockingTrain) && newTrain != lockingTrain) return false;
- if (isSet(occupyingTrain) && newTrain != occupyingTrain) return false;
+ if (isSet(occupyingTrain) && (newTrain != occupyingTrain) && !newTrain.isShunting()) return false;
+ reservingTrain = lockingTrain = null;
if (occupyingTrain == newTrain) return true;
occupyingTrain = newTrain;
- reservingTrain = lockingTrain = null;
plan.place(this);
return true;
}