Ejemplo n.º 1
0
 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"));
 }
Ejemplo n.º 2
0
        /// <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);
                }
            }
        }
Ejemplo n.º 3
0
 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"]);
 }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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;
        }
Ejemplo n.º 6
0
        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;
        }
Ejemplo n.º 7
0
        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;
        }
Ejemplo n.º 8
0
        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;
        }
Ejemplo n.º 9
0
            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;
                }
            }
Ejemplo n.º 10
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);
        }