public new static bool UpdatePath(ushort segmentID, ref NetSegment data, ItemClass.Service netService, VehicleInfo.VehicleType vehicleType, bool skipQueue) { if (data.m_path == 0u) { return(BusTransportLineAI.StartPathFind(segmentID, ref data, netService, vehicleType, skipQueue)); } if ((data.m_flags & NetSegment.Flags.WaitingPath) == NetSegment.Flags.None) { return(true); } PathManager instance = Singleton <PathManager> .instance; NetManager instance2 = Singleton <NetManager> .instance; byte pathFindFlags = instance.m_pathUnits.m_buffer[(int)((UIntPtr)data.m_path)].m_pathFindFlags; if ((pathFindFlags & 4) != 0) { bool flag = false; PathUnit.Position pathPos; if (instance.m_pathUnits.m_buffer[(int)((UIntPtr)data.m_path)].GetPosition(0, out pathPos)) { flag = TransportLineAI.CheckNodePosition(data.m_startNode, pathPos); } if (instance.m_pathUnits.m_buffer[(int)((UIntPtr)data.m_path)].GetLastPosition(out pathPos)) { TransportLineAI.CheckNodePosition(data.m_endNode, pathPos); } float length = instance.m_pathUnits.m_buffer[(int)((UIntPtr)data.m_path)].m_length; if (length != data.m_averageLength) { data.m_averageLength = length; ushort transportLine = instance2.m_nodes.m_buffer[(int)data.m_startNode].m_transportLine; if (transportLine != 0) { Singleton <TransportManager> .instance.UpdateLine(transportLine); } } if (data.m_lanes != 0u) { instance2.m_lanes.m_buffer[(int)((UIntPtr)data.m_lanes)].m_length = data.m_averageLength * ((!flag) ? 1f : 0.75f); } data.m_flags &= ~NetSegment.Flags.WaitingPath; data.m_flags &= ~NetSegment.Flags.PathFailed; return(true); } if ((pathFindFlags & 8) != 0) { if (data.m_averageLength == 0f) { Vector3 position = instance2.m_nodes.m_buffer[(int)data.m_startNode].m_position; Vector3 position2 = instance2.m_nodes.m_buffer[(int)data.m_endNode].m_position; data.m_averageLength = Vector3.Distance(position, position2); } data.m_flags &= ~NetSegment.Flags.WaitingPath; data.m_flags |= NetSegment.Flags.PathFailed; return(true); } return(false); }
private static bool UpdateMeshDataImpl(ref TransportLine line, ushort lineID) { bool flag = true; int length1 = 0; int num1 = 0; int length2 = 0; float num2 = 0.0f; TransportManager instance1 = Singleton <TransportManager> .instance; NetManager instance2 = Singleton <NetManager> .instance; PathManager instance3 = Singleton <PathManager> .instance; ushort stops = line.m_stops; ushort num3 = stops; int num4 = 0; while ((int)num3 != 0) { ushort num5 = 0; for (int index = 0; index < 8; ++index) { ushort segment = instance2.m_nodes.m_buffer[(int)num3].GetSegment(index); if ((int)segment != 0 && (int)instance2.m_segments.m_buffer[(int)segment].m_startNode == (int)num3) { uint path = instance2.m_segments.m_buffer[(int)segment].m_path; if ((int)path != 0) { byte pathFindFlags = instance3.m_pathUnits.m_buffer[(int)path].m_pathFindFlags; if (((int)pathFindFlags & 4) != 0) { if (!TransportLine.CalculatePathSegmentCount(path, ref num1, ref length2, ref num2)) { TransportLineAI.StartPathFind(segment, ref instance2.m_segments.m_buffer[(int)segment], line.Info.m_netService, line.Info.m_vehicleType, (uint)(line.m_flags & TransportLine.Flags.Temporary) > 0U); flag = false; } } else if (((int)pathFindFlags & 8) == 0) { flag = false; } } num5 = instance2.m_segments.m_buffer[(int)segment].m_endNode; break; } } ++length1; ++num1; num3 = num5; if ((int)num3 != (int)stops && flag) { if (++num4 >= 32768) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + System.Environment.StackTrace); break; } } else { break; } } TransportLineMod._lineData[(int)lineID].Length = num2; if (!flag) { return(flag); } RenderGroup.MeshData meshData = new RenderGroup.MeshData(); meshData.m_vertices = new Vector3[num1 * 8]; meshData.m_normals = new Vector3[num1 * 8]; meshData.m_tangents = new Vector4[num1 * 8]; meshData.m_uvs = new Vector2[num1 * 8]; meshData.m_uvs2 = new Vector2[num1 * 8]; meshData.m_colors = new Color32[num1 * 8]; meshData.m_triangles = new int[num1 * 30]; TransportManager.LineSegment[] lineSegmentArray = new TransportManager.LineSegment[length1]; Bezier3[] bezier3Array = new Bezier3[length2]; int index1 = 0; int num6 = 0; int num7 = 0; float num8 = Mathf.Ceil(num2 / 64f) / num2; float num9 = 0.0f; ushort num10 = stops; Vector3 vector3_1 = new Vector3(100000f, 100000f, 100000f); Vector3 vector3_2 = new Vector3(-100000f, -100000f, -100000f); int num11 = 0; while ((int)num10 != 0) { ushort num5 = 0; for (int index2 = 0; index2 < 8; ++index2) { ushort segment = instance2.m_nodes.m_buffer[(int)num10].GetSegment(index2); if ((int)segment != 0 && (int)instance2.m_segments.m_buffer[(int)segment].m_startNode == (int)num10) { uint path = instance2.m_segments.m_buffer[(int)segment].m_path; if ((int)path != 0 && ((int)instance3.m_pathUnits.m_buffer[(int)path].m_pathFindFlags & 4) != 0) { lineSegmentArray[index1].m_curveStart = num7; Vector3 vector3_3; Vector3 vector3_4; TransportLine.FillPathSegments(path, meshData, bezier3Array, ref num6, ref num7, ref num9, num8, ref vector3_3, ref vector3_4); vector3_1 = Vector3.Min(vector3_1, vector3_3); vector3_2 = Vector3.Max(vector3_2, vector3_4); lineSegmentArray[index1].m_bounds.SetMinMax(vector3_3, vector3_4); lineSegmentArray[index1].m_curveEnd = num7; } num5 = instance2.m_segments.m_buffer[(int)segment].m_endNode; break; } } TransportLine.FillPathNode(instance2.m_nodes.m_buffer[(int)num10].m_position, meshData, num6); ++index1; ++num6; num10 = num5; if ((int)num10 != (int)stops) { if (++num11 >= 32768) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + System.Environment.StackTrace); break; } } else { break; } } do { ; }while (!Monitor.TryEnter((object)instance1.m_lineMeshData, SimulationManager.SYNCHRONIZE_TIMEOUT)); try { instance1.m_lineMeshData[(int)lineID] = (RenderGroup.MeshData[])meshData; instance1.m_lineSegments[(int)lineID] = lineSegmentArray; instance1.m_lineCurves[(int)lineID] = bezier3Array; line.m_bounds.SetMinMax(vector3_1, vector3_2); } finally { Monitor.Exit((object)instance1.m_lineMeshData); } return(flag); }