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