diff --git a/Crossings/CrossingTool.cs b/Crossings/CrossingTool.cs index 32703fd..ff98ec8 100644 --- a/Crossings/CrossingTool.cs +++ b/Crossings/CrossingTool.cs @@ -218,10 +218,10 @@ private IEnumerator CreateCrossing() yield return null; if (newNode == 0) { NetTool.CreateNode (m_prefab, m_controlPoint, m_controlPoint, m_controlPoint, NetTool.m_nodePositionsSimulation, 0, false, false, true, false, false, false, 0, out newNode, out newSegment, out cost, out productionRate); - NetManager.instance.m_nodes.m_buffer [newNode].m_flags |= (NetNode.Flags)Crossings.CrossingFlag; + AddCrossingToFlags(ref NetManager.instance.m_nodes.m_buffer[newNode]); // Debug.Log ("[Crossings] CreateNode real result: " + errors + " " + newNode + " " + newSegment + " " + cost + " " + productionRate); } else { - NetManager.instance.m_nodes.m_buffer [newNode].m_flags |= (NetNode.Flags)Crossings.CrossingFlag; + AddCrossingToFlags(ref NetManager.instance.m_nodes.m_buffer[newNode]); NetManager.instance.UpdateNode (newNode); // Debug.Log ("[Crossings] Existing Node: " + newNode + " " + NetManager.instance.m_nodes.m_buffer [newNode].m_flags); } @@ -229,6 +229,49 @@ private IEnumerator CreateCrossing() yield return null; } + private static void AddCrossingToFlags(ref NetNode data) + { + data.m_flags |= Crossings.CrossingFlag; + + var ai = data.Info.m_netAI; + + bool wantTrafficLights = ai.WantTrafficLights(); + NetManager netManager = Singleton.instance; + + //Debug.Log("isCrossing: " + isCrossing); + //Debug.Log("wantTrafficLights: " + wantTrafficLights); + + if (!wantTrafficLights) + { + for (int i = 0; i < 8; i++) + { + ushort segment = data.GetSegment(i); + if (segment != 0) + { + NetInfo info = netManager.m_segments.m_buffer[(int)segment].Info; + if (info != null) + { + if ((info.m_vehicleTypes & VehicleInfo.VehicleType.Train) != VehicleInfo.VehicleType.None) + { + // No crossings allowed where there's a railway intersecting + return; + } + + if (info.m_netAI.WantTrafficLights()) + { + wantTrafficLights = true; + } + } + } + } + } + + if (wantTrafficLights) + { + data.m_flags |= NetNode.Flags.TrafficLights | NetNode.Flags.CustomTrafficLights; + } + + } private IEnumerator RemoveCrossing() diff --git a/Crossings/UpdateNodeFlags.cs b/Crossings/UpdateNodeFlags.cs index 6e21ca3..f97a140 100644 --- a/Crossings/UpdateNodeFlags.cs +++ b/Crossings/UpdateNodeFlags.cs @@ -1,52 +1,31 @@ -using ColossalFramework; using HarmonyLib; -using UnityEngine; namespace Crossings { - [HarmonyPatch(typeof(RoadBaseAI))] + [HarmonyPatch(typeof(RoadBaseAI))] [HarmonyPatch(nameof(RoadBaseAI.UpdateNodeFlags))] class UpdateNodeFlags { - static void Postfix(ref RoadBaseAI __instance, ref NetNode data) + static bool Prefix(ref RoadBaseAI __instance, ref NetNode data) { - bool wantTrafficLights = __instance.WantTrafficLights(); - NetManager netManager = Singleton.instance; + var andFlags = + Crossings.CrossingFlag + | NetNode.Flags.TrafficLights + | NetNode.Flags.CustomTrafficLights + ; + var checkFlags = + Crossings.CrossingFlag + | NetNode.Flags.TrafficLights + ; - //Debug.Log("isCrossing: " + isCrossing); - //Debug.Log("wantTrafficLights: " + wantTrafficLights); - - if (!wantTrafficLights) + // Crossing & TrafficLights, but no CustomTrafficLights + if((data.m_flags & andFlags) == checkFlags) { - for (int i = 0; i < 8; i++) - { - ushort segment = data.GetSegment(i); - if (segment != 0) - { - NetInfo info = netManager.m_segments.m_buffer[(int)segment].Info; - if (info != null) - { - if ((info.m_vehicleTypes & VehicleInfo.VehicleType.Train) != VehicleInfo.VehicleType.None) - { - // No crossings allowed where there's a railway intersecting - return; - } - - if (info.m_netAI.WantTrafficLights()) - { - wantTrafficLights = true; - } - } - } - } + data.m_flags |= NetNode.Flags.CustomTrafficLights; } - bool isCrossing = (data.m_flags & (NetNode.Flags)Crossings.CrossingFlag) != NetNode.Flags.None; - - if (wantTrafficLights && isCrossing) - { - data.m_flags |= NetNode.Flags.TrafficLights; - } + // return true -> execute UpdateNodeFlags + return true; } } }