Skip to content

Commit

Permalink
Merge pull request #8 from Craxy/TrafficLights
Browse files Browse the repository at this point in the history
Fix: Keep removed traffic lights on big roads after loading a saved game
  • Loading branch information
bernardd authored Apr 20, 2022
2 parents cea617b + c189be5 commit ba16cf3
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 39 deletions.
47 changes: 45 additions & 2 deletions Crossings/CrossingTool.cs
Original file line number Diff line number Diff line change
Expand Up @@ -218,17 +218,60 @@ 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);
}
}

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<NetManager>.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()
Expand Down
53 changes: 16 additions & 37 deletions Crossings/UpdateNodeFlags.cs
Original file line number Diff line number Diff line change
@@ -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<NetManager>.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;
}
}
}

0 comments on commit ba16cf3

Please sign in to comment.