diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 135c7a6e9..994bb0612 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -30,7 +30,7 @@ jobs: if: endswith(github.ref_name, 'master') && github.ref_protected && github.ref_type == 'branch' runs-on: ubuntu-latest env: - APPVEYOR_BUILD_VERSION: '3.6.2' + APPVEYOR_BUILD_VERSION: '3.6.3' CURSETOKEN: ${{ secrets.CURSETOKEN }} steps: - uses: actions/checkout@v3 diff --git a/changelog.md b/changelog.md index 0308af702..86d983f43 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,10 @@ # Changelog +## [1.12.2 - 3.6.3] +* fix: threads blocking each other +* ref: better system for pathway updateing and signal setting +* fix: wrong lamp in wn signal + ## [1.12.2 - 3.6.2] * feat: added train length signs * feat: added trainnumber element diff --git a/src/main/java/com/troblecodings/signals/handler/NameHandler.java b/src/main/java/com/troblecodings/signals/handler/NameHandler.java index bd710ef7f..ab1c81f5d 100644 --- a/src/main/java/com/troblecodings/signals/handler/NameHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/NameHandler.java @@ -144,9 +144,7 @@ private static ByteBuffer packToBuffer(final BlockPos pos, final String name) { } public static boolean isNameLoaded(final StateInfo info) { - synchronized (ALL_NAMES) { - return ALL_NAMES.containsKey(info); - } + return ALL_NAMES.containsKey(info); } public static void runTaskWhenNameLoaded(final StateInfo info, @@ -154,9 +152,11 @@ public static void runTaskWhenNameLoaded(final StateInfo info, if (!info.isValid() || info.worldNullOrClientSide()) return; if (isNameLoaded(info)) { + final String name; synchronized (ALL_NAMES) { - listener.update(info, ALL_NAMES.get(info), ChangedState.UPDATED); + name = ALL_NAMES.get(info); } + listener.update(info, name, ChangedState.UPDATED); } else { synchronized (TASKS_WHEN_LOAD) { final List list = TASKS_WHEN_LOAD.computeIfAbsent(info, @@ -361,12 +361,13 @@ public static void loadNames(final List infos, ALL_NAMES.put(info.info, name); } sendToAll(info.info, name); + final List tasks; synchronized (TASKS_WHEN_LOAD) { - final List tasks = TASKS_WHEN_LOAD.remove(info.info); - if (tasks != null) { - tasks.forEach(listener -> listener.update(info.info, name, - ChangedState.ADDED_TO_CACHE)); - } + tasks = TASKS_WHEN_LOAD.remove(info.info); + } + if (tasks != null) { + tasks.forEach(listener -> listener.update(info.info, name, + ChangedState.ADDED_TO_CACHE)); } }); }); diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index b5b3be404..ad4265c98 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -113,9 +113,11 @@ public static void runTaskWhenSignalLoaded(final SignalStateInfo info, if (!info.isValid() || info.worldNullOrClientSide()) return; if (isSignalLoaded(info)) { + final Map properties; synchronized (CURRENTLY_LOADED_STATES) { - listener.update(info, CURRENTLY_LOADED_STATES.get(info), ChangedState.UPDATED); + properties = CURRENTLY_LOADED_STATES.get(info); } + listener.update(info, properties, ChangedState.UPDATED); } else { synchronized (TASKS_WHEN_LOAD) { final List list = TASKS_WHEN_LOAD.computeIfAbsent(info, @@ -560,12 +562,13 @@ public static void loadSignals(final List signals, } sendToAll(info.info, properties); updateListeners(info.info, properties, ChangedState.ADDED_TO_CACHE); + final List tasks; synchronized (TASKS_WHEN_LOAD) { - final List tasks = TASKS_WHEN_LOAD.remove(info.info); - if (tasks != null) { - tasks.forEach(listener -> listener.update(info.info, properties, - ChangedState.ADDED_TO_CACHE)); - } + tasks = TASKS_WHEN_LOAD.remove(info.info); + } + if (tasks != null) { + tasks.forEach(listener -> listener.update(info.info, properties, + ChangedState.ADDED_TO_CACHE)); } }); }); diff --git a/src/main/java/com/troblecodings/signals/signalbox/InterSignalBoxPathway.java b/src/main/java/com/troblecodings/signals/signalbox/InterSignalBoxPathway.java index 6d1302b13..1d1d0f83a 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/InterSignalBoxPathway.java +++ b/src/main/java/com/troblecodings/signals/signalbox/InterSignalBoxPathway.java @@ -211,6 +211,7 @@ public boolean tryBlock(final BlockPos position) { pathwayToBlock = (InterSignalBoxPathway) pw; pathwayToBlock.setPathStatus(EnumPathUsage.BLOCKED); pathwayToBlock.updateTrainNumber(trainNumber); + otherGrid.updateToNet(pathwayToBlock); }); } return result; diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java index c7b77ac96..39fba3e44 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java @@ -131,6 +131,7 @@ protected void resetPathway(final SignalBoxPathway pathway) { updatePrevious(pathway); this.startsToPath.remove(pathway.getFirstPoint()); this.endsToPath.remove(pathway.getLastPoint()); + pathway.postReset(); } protected void updateToNet(final SignalBoxPathway pathway) { @@ -182,9 +183,19 @@ protected void addPathway(final PathwayData data) { } protected void updatePrevious(final SignalBoxPathway pathway) { - SignalBoxPathway previousPath = endsToPath.get(pathway.getFirstPoint()); - if (previousPath != null) { + SignalBoxPathway previousPath = pathway; + int count = 0; + while ((previousPath = endsToPath.get(previousPath.getFirstPoint())) != null) { + if (count > endsToPath.size()) { + break; + } previousPath.setSignals(); + count++; + } + if (count == 0) { + if (OpenSignalsMain.isDebug()) { + OpenSignalsMain.getLogger().debug("Could not find previous! " + pathway); + } } } diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java index 91d6f76b7..1bf9e7432 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java @@ -43,7 +43,6 @@ public class SignalBoxPathway implements IChunkLoadable { protected final PathwayData data; - protected final SignalConfig config; protected boolean isBlocked; protected boolean isAutoPathway = false; @@ -58,7 +57,6 @@ public void setTile(final SignalBoxTileEntity tile) { } public SignalBoxPathway(final PathwayData data) { - this.config = new SignalConfig(this); this.data = data; this.originalFirstPoint = new Point(data.getFirstPoint()); updatePathwayToAutomatic(); @@ -205,7 +203,7 @@ protected void setSignals(final SignalStateInfo lastSignal) { if (first == null) return; final SignalStateInfo firstInfo = new SignalStateInfo(world, startSignal.pos, first); - config.change(new ConfigInfo(firstInfo, lastSignal, data)); + SignalConfig.change(new ConfigInfo(firstInfo, lastSignal, data)); updatePreSignals(); } final SignalBoxPathway next = getNextPathway(); @@ -225,9 +223,9 @@ protected void setSignals(final SignalStateInfo lastSignal) { new SignalStateInfo(world, position.pos, current), lastSignal, data, position.isRepeater); if (position.guiMode.equals(EnumGuiMode.HP)) { - config.loadDisable(info); + SignalConfig.loadDisable(info); } else { - config.change(info); + SignalConfig.change(info); } }); updateSignalStates(); @@ -237,10 +235,6 @@ private void updatePreSignals() { final MainSignalIdentifier startSignal = data.getStartSignal(); if (startSignal == null) return; - final SignalBoxPathway next = getNextPathway(); - if (next != null && (next.isEmptyOrBroken() || next.isBlocked)) { - return; - } final StateInfo identifier = new StateInfo(tile.getWorld(), tile.getPos()); final Signal first = SignalBoxHandler.getSignal(identifier, startSignal.pos); if (first == null) @@ -251,7 +245,7 @@ private void updatePreSignals() { final Signal current = SignalBoxHandler.getSignal(identifier, posIdent.pos); if (current == null) return; - config.change( + SignalConfig.change( new ConfigInfo(new SignalStateInfo(tile.getWorld(), posIdent.pos, current), firstInfo, data, posIdent.isRepeater)); }); @@ -445,11 +439,14 @@ public void resetPathway(final @Nullable Point point) { resetAllTrainNumbers(); sendTrainNumberUpdates(); resetProtectionWay(); - final SignalBoxPathway next = getNextPathway(); - if (next != null) { - next.updatePreSignals(); - next.updateSignalStates(); - } + } + } + + public void postReset() { + final SignalBoxPathway next = getNextPathway(); + if (next != null) { + next.updatePreSignals(); + next.updateSignalStates(); } } @@ -610,6 +607,8 @@ private void sendTrainNumberUpdates() { buffer.putInt(trainNumberDisplays.size()); trainNumberDisplays.forEach(ident -> { final SignalBoxNode node = grid.getNode(ident.point); + if (node == null) + return; node.getPoint().writeNetwork(buffer); node.writeNetwork(buffer); }); @@ -621,9 +620,15 @@ private void resetAllTrainNumbers() { } private void resetAllTrainNumbers(final List trainNumberDisplays) { - if (grid != null && trainNumberDisplays != null) - trainNumberDisplays.forEach(ident -> grid.getNode(ident.point).getOption(ident.mode) - .orElse(new PathOptionEntry()).removeEntry(PathEntryType.TRAINNUMBER)); + if (grid != null && trainNumberDisplays != null) { + trainNumberDisplays.forEach(ident -> { + final SignalBoxNode node = grid.getNode(ident.point); + if (node == null) + return; + node.getOption(ident.mode).orElse(new PathOptionEntry()) + .removeEntry(PathEntryType.TRAINNUMBER); + }); + } } public void deactivateAllOutputsOnPathway() { diff --git a/src/main/java/com/troblecodings/signals/signalbox/config/SignalConfig.java b/src/main/java/com/troblecodings/signals/signalbox/config/SignalConfig.java index 340bc0888..87daa4a87 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/config/SignalConfig.java +++ b/src/main/java/com/troblecodings/signals/signalbox/config/SignalConfig.java @@ -18,20 +18,16 @@ import com.troblecodings.signals.handler.SignalStateHandler; import com.troblecodings.signals.handler.SignalStateInfo; import com.troblecodings.signals.properties.PredicatedPropertyBase.ConfigProperty; -import com.troblecodings.signals.signalbox.SignalBoxPathway; public final class SignalConfig { private static final LoadHolder> LOAD_HOLDER = new LoadHolder<>( SignalConfig.class); - private final SignalBoxPathway pathway; - - public SignalConfig(final SignalBoxPathway pathway) { - this.pathway = pathway; + private SignalConfig() { } - public void change(final ConfigInfo info) { + public static void change(final ConfigInfo info) { final Signal currentSignal = info.currentinfo.signal; if (info.type.equals(PathType.NORMAL)) { if (info.nextinfo != null && info.nextinfo.isValid()) { @@ -55,7 +51,7 @@ public void change(final ConfigInfo info) { } } - private void loadDefault(final ConfigInfo info) { + private static void loadDefault(final ConfigInfo info) { if (!info.currentinfo.isValid()) return; final List defaultValues = OneSignalPredicateConfigParser.DEFAULTCONFIGS @@ -88,7 +84,7 @@ public static void reset(final ResetInfo info) { }); } - public void loadDisable(final ConfigInfo info) { + public static void loadDisable(final ConfigInfo info) { final List disableValues = OneSignalPredicateConfigParser.DISABLECONFIGS .get(info.currentinfo.signal); if (disableValues != null) { @@ -96,7 +92,7 @@ public void loadDisable(final ConfigInfo info) { } } - private void changeIfPresent(final List values, final ConfigInfo info) { + private static void changeIfPresent(final List values, final ConfigInfo info) { loadSignalAndRunTask(info.currentinfo, (stateInfo, oldProperties, _u) -> { if (info.nextinfo != null) { loadSignalAndRunTask(info.nextinfo, (nextInfo, nextProperties, _u2) -> { @@ -106,10 +102,9 @@ private void changeIfPresent(final List values, final ConfigInfo changeSignals(values, info, oldProperties, null); } }); - } - private void changeSignals(final List values, final ConfigInfo info, + private static void changeSignals(final List values, final ConfigInfo info, final Map oldProperties, final Map nextProperties) { final Map, Object> object = new HashMap<>(); @@ -127,11 +122,10 @@ private void changeSignals(final List values, final ConfigInfo i }); if (!propertiesToSet.isEmpty()) { SignalStateHandler.setStates(info.currentinfo, propertiesToSet); - pathway.updatePrevious(); } } - private void loadWithoutPredicate(final List values, + private static void loadWithoutPredicate(final List values, final SignalStateInfo current) { if (values != null) { loadSignalAndRunTask(current, (info, oldProperties, _u) -> { @@ -141,9 +135,9 @@ private void loadWithoutPredicate(final List values, .filter(entry -> oldProperties.containsKey(entry.getKey())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); }); - if (!propertiesToSet.isEmpty()) + if (!propertiesToSet.isEmpty()) { SignalStateHandler.setStates(current, propertiesToSet); - pathway.updatePrevious(); + } }); } } diff --git a/src/main/resources/assets/opensignals/modeldefinitions/wnsignal.json b/src/main/resources/assets/opensignals/modeldefinitions/wnsignal.json index 658f6e7b5..1c19eb6fc 100644 --- a/src/main/resources/assets/opensignals/modeldefinitions/wnsignal.json +++ b/src/main/resources/assets/opensignals/modeldefinitions/wnsignal.json @@ -83,7 +83,8 @@ { "blockstate":"hasandis(WNTYPE) && with(WNCROSS.BLINK)", "retexture":{ - "lamp_1": "lamp_white_blink" + "lamp_1_north": "lamp_white_blink", + "lamp_1_south": "lamp_white_blink" } } ]