public static NetworkFilter GetNetworkFilter(NetInfo info) { foreach (NetworkFilter nf in Filters.NetworkFilters.Values) { //Debug.Log($"ai:{ai}, count:{(nf.aiType == null ? 0 : nf.aiType.Count)}"); if (nf.aiTypes != null) { foreach (Type t in nf.aiTypes) { if (info.GetAI().GetType() == t || info.GetAI().GetType().IsSubclassOf(t)) { if (nf.excludeClasses == null) { return(nf); } if (!nf.excludeClasses.Contains(info.m_class.name)) { return(nf); } } } } } return(Filters.NetworkFilters.GetValueSafe("Others")); }
/// <summary> /// Populates the given parent dictionaries with parent/child network info. /// </summary> /// <param name="parentDict"></param> internal static void GetParents(Dictionary <NetInfo, NetInfo> slopeParents, Dictionary <NetInfo, NetInfo> elevatedParents, Dictionary <NetInfo, NetInfo> bridgeParents, Dictionary <NetInfo, NetInfo> tunnelParents) { // Iterate through all loaded net prefabs. for (uint i = 0; i < PrefabCollection <NetInfo> .LoadedCount(); ++i) { NetInfo prefab = PrefabCollection <NetInfo> .GetLoaded(i); if (prefab.GetAI() is RoadAI roadAI) { // Road networks. RecordParent(slopeParents, roadAI.m_slopeInfo, prefab); RecordParent(elevatedParents, roadAI.m_elevatedInfo, prefab); RecordParent(bridgeParents, roadAI.m_bridgeInfo, prefab); RecordParent(tunnelParents, roadAI.m_tunnelInfo, prefab); } else if (prefab.GetAI() is TrainTrackAI railAI) { // Rail networks. RecordParent(slopeParents, railAI.m_slopeInfo, prefab); RecordParent(elevatedParents, railAI.m_elevatedInfo, prefab); RecordParent(bridgeParents, railAI.m_bridgeInfo, prefab); RecordParent(tunnelParents, railAI.m_tunnelInfo, prefab); } else if (prefab.GetAI() is PedestrianPathAI pathAI) { // Rail networks. RecordParent(slopeParents, pathAI.m_slopeInfo, prefab); RecordParent(elevatedParents, pathAI.m_elevatedInfo, prefab); RecordParent(bridgeParents, pathAI.m_bridgeInfo, prefab); RecordParent(tunnelParents, pathAI.m_tunnelInfo, prefab); } } }
public static NetworkFilter GetNetworkFilter(NetInfo info) { foreach (NetworkFilter nf in Filters.NetworkFilters.Values) { if (nf.aiTypes != null) { foreach (Type t in nf.aiTypes) { if (info.GetAI().GetType() == t || info.GetAI().GetType().IsSubclassOf(t)) { if (nf.excludeClasses == null) { return(nf); } if (!nf.excludeClasses.Contains(info.m_class.name)) { return(nf); } } } } } return(Filters.NetworkFilters["Others"]); }
public static bool GenerateSegmentNameInternal(ushort segmentID, ref string __result, ref List <ushort> usedQueue, bool removePrefix) { LogUtils.DoLog($"[START {segmentID}]" + __result); if ((NetManager.instance.m_segments.m_buffer[segmentID].m_flags & NetSegment.Flags.CustomName) != 0) { if (usedQueue.Count == 0) { return(true); } else { InstanceID id = default; id.NetSegment = segmentID; __result = Singleton <InstanceManager> .instance.GetName(id); return(false); } } NetSegment segment = NetManager.instance.m_segments.m_buffer[segmentID]; NetInfo info = segment.Info; PrefabAI ai = info.GetAI(); string format = null; Randomizer randomizer = new Randomizer(segment.m_nameSeed); ushort district = (ushort)(DistrictManager.instance.GetDistrict(segment.m_middlePosition) & 0xFF); Xml.AdrDistrictConfig districtConfig = AdrController.CurrentConfig.GetConfigForDistrict(district); Xml.AdrDistrictConfig cityConfig = AdrController.CurrentConfig.GetConfigForDistrict(0); if ((info.m_vehicleTypes & VehicleInfo.VehicleType.Car) != VehicleInfo.VehicleType.None) { string filenamePrefix = districtConfig.RoadConfig?.QualifierFile ?? ""; ; if ((filenamePrefix == null || !AdrController.LoadedLocalesRoadPrefix.ContainsKey(filenamePrefix)) && district > 0) { filenamePrefix = cityConfig.RoadConfig?.QualifierFile; } if (filenamePrefix != null && AdrController.LoadedLocalesRoadPrefix.ContainsKey(filenamePrefix)) { LocaleStruct.RoadPrefixFileIndexer currentPrefixFile = AdrController.LoadedLocalesRoadPrefix[filenamePrefix]; format = currentPrefixFile.GetPrefix(ai, info.m_forwardVehicleLaneCount == 0 || info.m_backwardVehicleLaneCount == 0, info.m_forwardVehicleLaneCount == info.m_backwardVehicleLaneCount, info.m_halfWidth * 2, (byte)(info.m_forwardVehicleLaneCount + info.m_backwardVehicleLaneCount), randomizer, segmentID); } LogUtils.DoLog("selectedPrefix = {0}", format); if (format == null) { string key = DefaultPrefix(info, ai); uint rangeFormat = Locale.Count(key); format = Locale.Get(key, randomizer.Int32(rangeFormat)); } } if (format == null) { return(true); } if (removePrefix) { format = Regex.Replace(format, "(?!\\{)(\\w+|\\.)(?!\\})", ""); if (format.IsNullOrWhiteSpace()) { return(true); } } string genName = ""; string sourceRoad = ""; string targetRoad = ""; string sourceKm = ""; string sourceKmWithDecimal = ""; string sourceDistrict = ""; string targetDistrict = ""; string direction = ""; if (format.Contains("{0}")) { GetGeneratedRoadName(segment, ai, district, out genName); if (genName == null) { return(true); } } ushort sourceSeg = 0; ushort targetSeg = 0; if (format.Contains("{1}") || format.Contains("{2}") || format.Contains("{3}") || format.Contains("{4}") || format.Contains("{7}")) { SegmentUtils.GetSegmentRoadEdges(segmentID, true, true, true, out ComparableRoad startRef, out ComparableRoad endRef, out _); sourceSeg = startRef.segmentReference; targetSeg = endRef.segmentReference; if (format.Contains("{1}")) { if (!usedQueue.Contains(sourceSeg)) { usedQueue.Add(sourceSeg); GenerateSegmentNameInternal(sourceSeg, ref sourceRoad, ref usedQueue, false); } } if (format.Contains("{2}")) { if (!usedQueue.Contains(targetSeg)) { usedQueue.Add(targetSeg); GenerateSegmentNameInternal(targetSeg, ref targetRoad, ref usedQueue, false); } } if (format.Contains("{3}") || format.Contains("{4}")) { float km = GetNumberAt(startRef.segmentReference, NetManager.instance.m_segments.m_buffer[startRef.segmentReference].m_startNode == startRef.nodeReference) / 1000f; sourceKm = km.ToString("0"); sourceKmWithDecimal = km.ToString("0.0"); } if (format.Contains("{7}"))//direction { int cardinalDirection = SegmentUtils.GetCardinalDirection(startRef, endRef); direction = Locale.Get("K45_CARDINAL_POINT_SHORT", cardinalDirection.ToString()); } } if (format.Contains("{5}") || format.Contains("{6}")) { GetSegmentRoadEdges(segmentID, false, false, false, out ComparableRoad startRef, out ComparableRoad endRef, out _); if (format.Contains("{5}"))//source district { sourceDistrict = GetDistrictAt(startRef); } if (format.Contains("{6}"))//target district { targetDistrict = GetDistrictAt(endRef); } } if (AddressesMod.DebugMode) { __result = $"[{segmentID}] " + StringUtils.SafeFormat(format, genName, sourceSeg, targetSeg, sourceKm, sourceKmWithDecimal, sourceDistrict, targetDistrict, direction)?.Trim(); } else { __result = StringUtils.SafeFormat(format, genName, sourceRoad, targetRoad, sourceKm, sourceKmWithDecimal, sourceDistrict, targetDistrict, direction)?.Trim(); } LogUtils.DoLog($"[END {segmentID}]" + __result); return(false); }
internal IEnumerator <object> UpdateDo() { yield return(new WaitForSeconds(0.05f)); ActionStatus.text = ActionQueue.instance.current == null ? "" : $"{ActionQueue.instance.current.GetType()}"; ToolStatus.text = $"{MoveItTool.ToolState} ({MoveItTool.MT_Tool}.{MoveItTool.AlignToolPhase}), POProc:{MoveItTool.POProcessing}"; SelectedLarge.text = $"Objects Selected: {Action.selection.Count}"; ushort[] types = new ushort[8]; foreach (Instance instance in Action.selection) { if (instance is MoveableBuilding) { types[0]++; } else if (instance is MoveableProp) { PropInfo info = (PropInfo)PropLayer.Manager.GetInfo(instance.id).Prefab; if (info.m_isDecal) { types[2]++; } else if (Filters.IsSurface(info)) { types[3]++; } else { types[1]++; } } else if (instance is MoveableTree) { types[4]++; } else if (instance is MoveableProc) { types[5]++; } else if (instance is MoveableNode) { types[6]++; } else if (instance is MoveableSegment) { types[7]++; } else { throw new Exception($"Instance is invalid type (<{instance.GetType()}>)"); } } SelectedSmall.text = $"B:{types[0]}, P:{types[1]}, D:{types[2]}, S:{types[3]}, T:{types[4]}, PO:{types[5]}, N:{types[6]}, S:{types[7]}\n "; // End with updating the hovered item if (id == null) { yield break; } if (id == InstanceID.Empty) { lastId = id; HoverLarge.textColor = new Color32(255, 255, 255, 255); yield break; } if (lastId == id) { yield break; } HoverLarge.textColor = new Color32(127, 217, 255, 255); HoverLarge.text = ""; HoverSmall.text = ""; if (id.Building > 0) { BuildingInfo info = BuildingManager.instance.m_buildings.m_buffer[id.Building].Info; HoverLarge.text = $"B:{id.Building} {info.name}"; HoverLarge.tooltip = info.name; HoverSmall.text = $"{info.GetType()} ({info.GetAI().GetType()})\n{info.m_class.name}\n({info.m_class.m_service}.{info.m_class.m_subService})"; } else if (id.Prop > 0) { string type = "P"; PropInfo info = (PropInfo)PropLayer.Manager.GetInfo(id).Prefab; if (info.m_isDecal) { type = "D"; } HoverLarge.text = $"{type}:{PropLayer.Manager.GetId(id)} {info.name}"; HoverLarge.tooltip = info.name; HoverSmall.text = $"{info.GetType()}\n{info.m_class.name}"; } else if (id.NetLane > 0) { IInfo info = MoveItTool.PO.GetProcObj(id.NetLane).Info; HoverLarge.text = $"PO:{id.NetLane} {info.Name}"; HoverLarge.tooltip = info.Name; HoverSmall.text = $"\n"; } else if (id.Tree > 0) { TreeInfo info = TreeManager.instance.m_trees.m_buffer[id.Tree].Info; HoverLarge.text = $"T:{id.Tree} {info.name}"; HoverLarge.tooltip = info.name; HoverSmall.text = $"{info.GetType()}\n{info.m_class.name}"; } else if (id.NetNode > 0) { NetInfo info = NetManager.instance.m_nodes.m_buffer[id.NetNode].Info; HoverLarge.text = $"N:{id.NetNode} {info.name}"; HoverLarge.tooltip = info.name; HoverSmall.text = $"{info.GetType()} ({info.GetAI().GetType()})\n{info.m_class.name}"; } else if (id.NetSegment > 0) { NetInfo info = NetManager.instance.m_segments.m_buffer[id.NetSegment].Info; HoverLarge.text = $"S:{id.NetSegment} {info.name}"; HoverLarge.tooltip = info.name; HoverSmall.text = $"{info.GetType()} ({info.GetAI().GetType()})\n{info.m_class.name}"; } lastId = id; }
internal void Update() { if (!MoveItTool.showDebugPanel) { return; } ToolStatus.text = $"{MoveItTool.instance.ToolState} (align:{MoveItTool.instance.AlignMode}.{MoveItTool.instance.AlignToolPhase})"; SelectedLarge.text = $"Objects Selected: {Action.selection.Count}"; ushort[] types = new ushort[8]; foreach (Instance instance in Action.selection) { if (instance is MoveableBuilding) { types[0]++; } else if (instance is MoveableProp) { PropInfo info = PropManager.instance.m_props.m_buffer[instance.id.Prop].Info; if (info.m_isDecal) { types[2]++; } else if (Filters.IsSurface(info)) { types[3]++; } else { types[1]++; } } else if (instance is MoveableTree) { types[4]++; } else if (instance is MoveableProc) { types[5]++; } else if (instance is MoveableNode) { types[6]++; } else if (instance is MoveableSegment) { types[7]++; } else { throw new Exception($"Instance is invalid type (<{instance.GetType()}>)"); } } SelectedSmall.text = $"B:{types[0]}, P:{types[1]}, D:{types[2]}, S:{types[3]}, T:{types[4]}, PO:{types[5]}, N:{types[6]}, S:{types[7]}\n "; // End with updating the hovered item if (id == null) { return; } if (id == InstanceID.Empty) { lastId = id; HoverLarge.textColor = new Color32(255, 255, 255, 255); return; } if (lastId == id) { return; } HoverLarge.textColor = new Color32(127, 217, 255, 255); HoverLarge.text = ""; HoverSmall.text = ""; if (id.Building > 0) { BuildingInfo info = BuildingManager.instance.m_buildings.m_buffer[id.Building].Info; HoverLarge.text = $"B:{id.Building} {info.name}"; HoverSmall.text = $"{info.GetType()} ({info.GetAI().GetType()})\n{info.m_class.name}\n({info.m_class.m_service}.{info.m_class.m_subService})"; } else if (id.Prop > 0) { string type = "P"; PropInfo info = PropManager.instance.m_props.m_buffer[id.Prop].Info; if (info.m_isDecal) { type = "D"; } HoverLarge.text = $"{type}:{id.Prop} {info.name}"; HoverSmall.text = $"{info.GetType()}\n{info.m_class.name}"; } else if (id.NetLane > 0) { IInfo info = MoveItTool.PO.GetProcObj(id.NetLane).Info; HoverLarge.text = $"{id.NetLane}: {info.Name}"; HoverSmall.text = $"\n"; } else if (id.Tree > 0) { TreeInfo info = TreeManager.instance.m_trees.m_buffer[id.Tree].Info; HoverLarge.text = $"T:{id.Tree} {info.name}"; HoverSmall.text = $"{info.GetType()}\n{info.m_class.name}"; } else if (id.NetNode > 0) { NetInfo info = NetManager.instance.m_nodes.m_buffer[id.NetNode].Info; HoverLarge.text = $"N:{id.NetNode} {info.name}"; HoverSmall.text = $"{info.GetType()} ({info.GetAI().GetType()})\n{info.m_class.name}"; } else if (id.NetSegment > 0) { NetInfo info = NetManager.instance.m_segments.m_buffer[id.NetSegment].Info; HoverLarge.text = $"S:{id.NetSegment} {info.name}"; HoverSmall.text = $"{info.GetType()} ({info.GetAI().GetType()})\n{info.m_class.name}"; } lastId = id; }
internal void Update() { if (!MoveItTool.showDebugPanel) { return; } ToolStatus.text = $"{MoveItTool.instance.ToolState} (align:{MoveItTool.instance.AlignMode}.{MoveItTool.instance.AlignToolPhase})"; // End with updating the hovered item if (id == null) { return; } if (id == InstanceID.Empty) { lastId = id; HoverLarge.textColor = new Color32(255, 255, 255, 255); return; } if (lastId == id) { return; } HoverLarge.textColor = new Color32(127, 217, 255, 255); HoverLarge.text = ""; HoverSmall.text = ""; if (id.Building > 0) { BuildingInfo info = BuildingManager.instance.m_buildings.m_buffer[id.Building].Info; HoverLarge.text = $"B:{id.Building} {info.name}"; HoverSmall.text = $"{info.GetType()} ({info.GetAI().GetType()})\n{info.m_class.name}\n({info.m_class.m_service}.{info.m_class.m_subService})"; if (isModToolsEnabled()) { ModTools.Id = id; } } else if (id.Prop > 0) { string type = "P"; PropInfo info = PropManager.instance.m_props.m_buffer[id.Prop].Info; if (info.m_isDecal) { type = "D"; } HoverLarge.text = $"{type}:{id.Prop} {info.name}"; HoverSmall.text = $"{info.GetType()}\n{info.m_class.name}"; if (isModToolsEnabled()) { ModTools.Id = id; } } else if (id.NetLane > 0) { IInfo info = MoveItTool.PO.GetProcObj(id.NetLane).Info; HoverLarge.text = $"{id.NetLane}: {info.Name}"; HoverSmall.text = $"\n"; if (isModToolsEnabled()) { ModTools.Id = id; } } else if (id.Tree > 0) { TreeInfo info = TreeManager.instance.m_trees.m_buffer[id.Tree].Info; HoverLarge.text = $"T:{id.Tree} {info.name}"; HoverSmall.text = $"{info.GetType()}\n{info.m_class.name}"; if (isModToolsEnabled()) { ModTools.Id = id; } } else if (id.NetNode > 0) { NetInfo info = NetManager.instance.m_nodes.m_buffer[id.NetNode].Info; HoverLarge.text = $"N:{id.NetNode} {info.name}"; HoverSmall.text = $"{info.GetType()} ({info.GetAI().GetType()})\n{info.m_class.name}"; if (isModToolsEnabled()) { ModTools.Id = id; } } else if (id.NetSegment > 0) { NetInfo info = NetManager.instance.m_segments.m_buffer[id.NetSegment].Info; HoverLarge.text = $"S:{id.NetSegment} {info.name}"; HoverSmall.text = $"{info.GetType()} ({info.GetAI().GetType()})\n{info.m_class.name}"; if (isModToolsEnabled()) { ModTools.Id = id; } } lastId = id; }
public void Update(InstanceID instanceId) { id = instanceId; if (!MITE.Settings.ShowDebugPanel) { return; } if (id == null) { return; } if (id == InstanceID.Empty) { lastId = id; HoverLarge.textColor = new Color32(255, 255, 255, 255); return; } if (lastId == id) { return; } HoverLarge.textColor = new Color32(127, 217, 255, 255); HoverLarge.text = ""; HoverSmall.text = ""; if (id.Building > 0) { BuildingInfo info = BuildingManager.instance.m_buildings.m_buffer[id.Building].Info; HoverLarge.text = $"B:{id.Building} {info.name}"; HoverSmall.text = $"{info.GetType()} ({info.GetAI().GetType()})\n{info.m_class.name}\n({info.m_class.m_service}.{info.m_class.m_subService})"; if (isModToolsEnabled()) { ModTools.Id = id; } } if (id.Prop > 0) { string type = "P"; PropInfo info = PropManager.instance.m_props.m_buffer[id.Prop].Info; if (info.m_isDecal) { type = "D"; } HoverLarge.text = $"{type}:{id.Prop} {info.name}"; HoverSmall.text = $"{info.GetType()}\n{info.m_class.name}"; if (isModToolsEnabled()) { ModTools.Id = id; } } if (id.Tree > 0) { TreeInfo info = TreeManager.instance.m_trees.m_buffer[id.Tree].Info; HoverLarge.text = $"T:{id.Tree} {info.name}"; HoverSmall.text = $"{info.GetType()}\n{info.m_class.name}"; if (isModToolsEnabled()) { ModTools.Id = id; } } if (id.NetNode > 0) { NetInfo info = NetManager.instance.m_nodes.m_buffer[id.NetNode].Info; HoverLarge.text = $"N:{id.NetNode} {info.name}"; HoverSmall.text = $"{info.GetType()} ({info.GetAI().GetType()})\n{info.m_class.name}"; if (isModToolsEnabled()) { ModTools.Id = id; } } if (id.NetSegment > 0) { NetInfo info = NetManager.instance.m_segments.m_buffer[id.NetSegment].Info; HoverLarge.text = $"S:{id.NetSegment} {info.name}"; HoverSmall.text = $"{info.GetType()} ({info.GetAI().GetType()})\n{info.m_class.name}"; if (isModToolsEnabled()) { ModTools.Id = id; } } lastId = id; }
public ComparableRoad(ushort segmentId, bool startNode) { NetSegment segment = NetManager.instance.m_segments.m_buffer[segmentId]; if (startNode) { nodeReference = segment.m_startNode; } else { nodeReference = segment.m_endNode; } bool entering = startNode != ((NetManager.instance.m_segments.m_buffer[segmentId].m_flags & NetSegment.Flags.Invert) != 0); NetNode node = NetManager.instance.m_nodes.m_buffer[nodeReference]; isPassing = false; segmentReference = 0; for (int i = 0; i < 7; i++) { ushort segment1 = node.GetSegment(i); if (segment1 > 0 && segment1 != segmentId) { for (int j = i + 1; j < 8; j++) { ushort segment2 = node.GetSegment(j); if (segment2 > 0 && segment2 != segmentId) { isPassing = IsSameName(segment1, segment2, true); if (isPassing) { segmentReference = segment1; break; } } } if (isPassing) { break; } } } if (!isPassing) { for (int i = 0; i < 7; i++) { ushort segment1 = node.GetSegment(i); if (segment1 > 0 && segment1 != segmentId) { NetSegment segment1Obj = NetManager.instance.m_segments.m_buffer[segment1]; bool isSegment1StartNode = segment1Obj.m_startNode == nodeReference; bool isSegment1Entering = isSegment1StartNode != ((NetManager.instance.m_segments.m_buffer[segment1].m_flags & NetSegment.Flags.Invert) != 0); if (!(segment1Obj.Info.GetAI() is RoadBaseAI seg1Ai)) { continue; } bool isSegment1TwoWay = segment1Obj.Info.m_hasBackwardVehicleLanes && segment1Obj.Info.m_hasForwardVehicleLanes; if (!isSegment1TwoWay && isSegment1Entering == entering) { LogUtils.DoLog($"IGNORED: {segment1} (Tw=>{isSegment1TwoWay},entering=>{entering},s1entering=>{isSegment1Entering})"); continue; } if (segmentReference == 0) { segmentReference = segment1; } else { NetSegment segmentRefObj = NetManager.instance.m_segments.m_buffer[segmentReference]; if (!(segmentRefObj.Info.GetAI() is RoadBaseAI roadAi)) { continue; } if (!roadAi.m_highwayRules && seg1Ai.m_highwayRules) { segmentReference = segment1; continue; } if (roadAi.m_highwayRules && !seg1Ai.m_highwayRules) { continue; } int laneCount1 = (segment1Obj.Info.m_forwardVehicleLaneCount + segment1Obj.Info.m_backwardVehicleLaneCount); int laneCountRef = (segmentRefObj.Info.m_forwardVehicleLaneCount + segmentRefObj.Info.m_backwardVehicleLaneCount); if (laneCount1 > laneCountRef) { segmentReference = segment1; continue; } if (laneCount1 < laneCountRef) { continue; } if (segment1Obj.Info.m_halfWidth > segmentRefObj.Info.m_halfWidth) { segmentReference = segment1; continue; } } } } } if (segmentReference > 0) { NetSegment segmentRefObj = NetManager.instance.m_segments.m_buffer[segmentReference]; NetInfo infoRef = segmentRefObj.Info; isHighway = infoRef.GetAI() is RoadBaseAI aiRef && aiRef.m_highwayRules; width = infoRef.m_halfWidth * 2; lanes = infoRef.m_backwardVehicleLaneCount + infoRef.m_forwardVehicleLaneCount; } else { isHighway = false; width = 0; lanes = 0; } }
public static bool IsSameName(ushort segment1, ushort segment2, bool requireSameDirection, bool requireSameSize, bool requireSameHigwayFlag, bool requireSameDistrict = false, bool requireSameAI = false) { NetManager nm = NetManager.instance; NetInfo info = nm.m_segments.m_buffer[segment1].Info; NetInfo info2 = nm.m_segments.m_buffer[segment2].Info; if (info.m_class.m_service != info2.m_class.m_service) { return(false); } if (info.m_class.m_subService != info2.m_class.m_subService) { return(false); } if (requireSameDirection) { NetSegment seg1 = nm.m_segments.m_buffer[segment1]; NetSegment seg2 = nm.m_segments.m_buffer[segment2]; if (!(seg1.Info.m_hasBackwardVehicleLanes && seg1.Info.m_hasForwardVehicleLanes) || !(seg2.Info.m_hasBackwardVehicleLanes && seg2.Info.m_hasForwardVehicleLanes)) { if ((seg1.m_endNode == seg2.m_endNode || seg1.m_startNode == seg2.m_startNode) && (nm.m_segments.m_buffer[segment1].m_flags & NetSegment.Flags.Invert) == (nm.m_segments.m_buffer[segment2].m_flags & NetSegment.Flags.Invert)) { return(false); } if ((seg1.m_endNode == seg2.m_startNode || seg1.m_startNode == seg2.m_endNode) && (nm.m_segments.m_buffer[segment1].m_flags & NetSegment.Flags.Invert) != (nm.m_segments.m_buffer[segment2].m_flags & NetSegment.Flags.Invert)) { return(false); } } } if (requireSameSize) { if (!((info.m_forwardVehicleLaneCount == info2.m_backwardVehicleLaneCount && info2.m_forwardVehicleLaneCount == info.m_backwardVehicleLaneCount) || (info2.m_forwardVehicleLaneCount == info.m_forwardVehicleLaneCount && info2.m_backwardVehicleLaneCount == info.m_backwardVehicleLaneCount))) { return(false); } } if (requireSameAI) { if (info.GetAI().GetType() != info2.GetAI().GetType()) { return(false); } } else if (requireSameHigwayFlag) { if ((info.GetAI() as RoadBaseAI)?.m_highwayRules != (info2.GetAI() as RoadBaseAI)?.m_highwayRules) { return(false); } } if (requireSameDistrict) { Vector3 pos1 = nm.m_segments.m_buffer[segment1].m_middlePosition; Vector3 pos2 = nm.m_segments.m_buffer[segment2].m_middlePosition; if (DistrictManager.instance.GetDistrict(pos1) != DistrictManager.instance.GetDistrict(pos2)) { return(false); } } bool customName1 = (nm.m_segments.m_buffer[segment1].m_flags & NetSegment.Flags.CustomName) != NetSegment.Flags.None; bool customName2 = (nm.m_segments.m_buffer[segment2].m_flags & NetSegment.Flags.CustomName) != NetSegment.Flags.None; if (customName1 != customName2) { return(false); } if (customName1) { InstanceID id = default; id.NetSegment = segment1; string name = Singleton <InstanceManager> .instance.GetName(id); id.NetSegment = segment2; string name2 = Singleton <InstanceManager> .instance.GetName(id); return(name == name2); } ushort nameSeed = nm.m_segments.m_buffer[segment1].m_nameSeed; ushort nameSeed2 = nm.m_segments.m_buffer[segment2].m_nameSeed; return(nameSeed == nameSeed2); }