private static void OnSaveData() { FastList <byte> data = new FastList <byte>(); try { SerializableDataExtension.WriteString(TransportLineMod._dataVersion, data); for (ushort lineID = 0; (int)lineID < 256; ++lineID) { SerializableDataExtension.AddToData(BitConverter.GetBytes(TransportLineMod.GetTargetVehicleCount(lineID)), data); SerializableDataExtension.AddToData(BitConverter.GetBytes(Mathf.Max(TransportLineMod.GetNextSpawnTime(lineID) - SimHelper.instance.SimulationTime, 0.0f)), data); SerializableDataExtension.AddToData(BitConverter.GetBytes(TransportLineMod.GetBudgetControlState(lineID)), data); SerializableDataExtension.AddToData(BitConverter.GetBytes(TransportLineMod.GetDepot(lineID)), data); int num = 0; HashSet <string> prefabs = TransportLineMod.GetPrefabs(lineID); if (prefabs != null) { num = prefabs.Count; } SerializableDataExtension.AddToData(BitConverter.GetBytes(num), data); if (num > 0) { foreach (string s in prefabs) { SerializableDataExtension.WriteString(s, data); } } string[] enqueuedVehicles = TransportLineMod.GetEnqueuedVehicles(lineID); SerializableDataExtension.AddToData(BitConverter.GetBytes(enqueuedVehicles.Length), data); if (enqueuedVehicles.Length != 0) { foreach (string s in enqueuedVehicles) { SerializableDataExtension.WriteString(s, data); } } SerializableDataExtension.WriteBool(TransportLineMod.GetUnbunchingState(lineID), data); } SerializableDataExtension.instance.SerializableData.SaveData(TransportLineMod._dataID, data.ToArray()); } catch (Exception ex) { string msg = "Error while saving transport line data! " + ex.Message + " " + (object)ex.InnerException; Utils.LogError((object)msg); CODebugBase <LogChannel> .Log(LogChannel.Modding, msg, ErrorLevel.Error); } }
private static bool IsUnbunchingDone(ushort vehicleID, ref Vehicle vehicleData) { bool flag; try { if ((int)vehicleData.m_transportLine == 0 || (int)ImprovedPublicTransportMod.Settings.IntervalAggressionFactor == 0 || (!TransportLineMod.GetUnbunchingState(vehicleData.m_transportLine) || (int)vehicleData.m_waitCounter >= (int)(byte)Mathf.Min((int)ImprovedPublicTransportMod.Settings.IntervalAggressionFactor * 6 + 12, (int)byte.MaxValue))) { flag = true; } else { TransportManager instance1 = Singleton <TransportManager> .instance; int length = instance1.m_lines.m_buffer[(int)vehicleData.m_transportLine].CountVehicles(vehicleData.m_transportLine); if (length == 1) { flag = true; } else { ushort currentStop = VehicleManagerMod.m_cachedVehicleData[(int)vehicleID].CurrentStop; if ((int)currentStop != 0 && !NetManagerMod.m_cachedNodeData[(int)currentStop].Unbunching) { flag = true; } else if ((int)vehicleData.m_lastFrame != 0) { flag = false; } else { ushort vehicleID1 = instance1.m_lines.m_buffer[(int)vehicleData.m_transportLine].m_vehicles; VehicleManager instance2 = Singleton <VehicleManager> .instance; float max = 0.0f; ushort[] numArray = new ushort[length]; float[] keys = new float[length]; for (int index = 0; index < length; ++index) { float current; BusAIMod.GetProgressStatus(vehicleID1, ref instance2.m_vehicles.m_buffer[(int)vehicleID1], out current, out max); numArray[index] = vehicleID1; keys[index] = current; vehicleID1 = instance2.m_vehicles.m_buffer[(int)vehicleID1].m_nextLineVehicle; } Array.Sort <float, ushort>(keys, numArray); int index1 = Array.IndexOf <ushort>(numArray, vehicleID); if (index1 == -1) { flag = true; } else { int index2 = index1 + 1; if (index2 == length) { index2 = 0; } float num = keys[index2] - keys[index1]; if ((double)num < 0.0) { num += max; } flag = (double)num > (double)max / (double)length * 0.899999976158142; } } } } } catch (Exception ex) { if (BusAIMod._isDeployed) { Utils.Log((object)(ex.Message + System.Environment.NewLine + System.Environment.StackTrace)); } flag = true; } VehicleManagerMod.m_cachedVehicleData[(int)vehicleID].IsUnbunchingInProgress = !flag; return(flag); }