public override void SimulationStep(ushort vehicleID, ref Vehicle vehicleData, ref Vehicle.Frame frameData, ushort leaderID, ref Vehicle leaderData, int lodPhysics) { frameData.m_blinkState = (((vehicleData.m_flags & Vehicle.Flags.Emergency2) == Vehicle.Flags.None) ? 0f : 10f); this.TryCollectCrime(vehicleID, ref vehicleData, ref frameData); CustomCarAI.SimulationStep(this, vehicleID, ref vehicleData, ref frameData, leaderID, ref leaderData, lodPhysics); if ((vehicleData.m_flags & Vehicle.Flags.Stopped) != Vehicle.Flags.None) { if (this.CanLeave(vehicleID, ref vehicleData)) { vehicleData.m_flags &= ~Vehicle.Flags.Stopped; vehicleData.m_flags |= Vehicle.Flags.Leaving; } } else { if ((vehicleData.m_flags & Vehicle.Flags.Arriving) != Vehicle.Flags.None && vehicleData.m_targetBuilding != 0 && (vehicleData.m_flags & (Vehicle.Flags.Emergency2 | Vehicle.Flags.WaitingPath | Vehicle.Flags.GoingBack | Vehicle.Flags.WaitingTarget)) == Vehicle.Flags.None) { this.ArriveAtTarget(vehicleID, ref vehicleData); } } if ((vehicleData.m_flags & Vehicle.Flags.GoingBack) == Vehicle.Flags.None && this.ShouldReturnToSource(vehicleID, ref vehicleData)) { this.SetTarget(vehicleID, ref vehicleData, 0); } }
public override void SimulationStep(ushort vehicleID, ref Vehicle vehicleData, ref Vehicle.Frame frameData, ushort leaderID, ref Vehicle leaderData, int lodPhysics) { if ((CSLTraffic.Options & OptionsManager.ModOptions.UseRealisticSpeeds) == OptionsManager.ModOptions.UseRealisticSpeeds) { if (CustomCarAI.sm_speedData[vehicleID].speedMultiplier == 0 || CustomCarAI.sm_speedData[vehicleID].currentPath != vehicleData.m_path) { CustomCarAI.sm_speedData[vehicleID].currentPath = vehicleData.m_path; CustomCarAI.sm_speedData[vehicleID].SetRandomSpeedMultiplier(0.7f, 1.15f); } CustomCarAI.sm_speedData[vehicleID].ApplySpeedMultiplier(this.m_info); } CustomCarAI.SimulationStep(this, vehicleID, ref vehicleData, ref frameData, leaderID, ref leaderData, lodPhysics); if ((vehicleData.m_flags & Vehicle.Flags.Stopped) != Vehicle.Flags.None && this.CanLeave(vehicleID, ref vehicleData)) { vehicleData.m_flags &= ~Vehicle.Flags.Stopped; vehicleData.m_flags |= Vehicle.Flags.Leaving; } if ((vehicleData.m_flags & (Vehicle.Flags.TransferToSource | Vehicle.Flags.GoingBack)) == Vehicle.Flags.TransferToSource && this.ShouldReturnToSource(vehicleID, ref vehicleData)) { this.SetTarget(vehicleID, ref vehicleData, 0); } if ((CSLTraffic.Options & OptionsManager.ModOptions.UseRealisticSpeeds) == OptionsManager.ModOptions.UseRealisticSpeeds) { CustomCarAI.sm_speedData[vehicleID].RestoreVehicleSpeed(this.m_info); } }
public override void SimulationStep(ushort vehicleID, ref Vehicle vehicleData, ref Vehicle.Frame frameData, ushort leaderID, ref Vehicle leaderData, int lodPhysics) { if ((CSLTraffic.Options & OptionsManager.ModOptions.UseRealisticSpeeds) == OptionsManager.ModOptions.UseRealisticSpeeds) { if (CustomCarAI.sm_speedData[vehicleID].speedMultiplier == 0 || CustomCarAI.sm_speedData[vehicleID].currentPath != vehicleData.m_path) { CustomCarAI.sm_speedData[vehicleID].currentPath = vehicleData.m_path; CustomCarAI.sm_speedData[vehicleID].SetRandomSpeedMultiplier(0.6f, 1.4f); } CustomCarAI.sm_speedData[vehicleID].ApplySpeedMultiplier(this.m_info); } if ((vehicleData.m_flags & Vehicle.Flags.Stopped) != Vehicle.Flags.None) { vehicleData.m_waitCounter += 1; if (this.CanLeave(vehicleID, ref vehicleData)) { vehicleData.m_flags &= ~Vehicle.Flags.Stopped; vehicleData.m_waitCounter = 0; } } CustomCarAI.SimulationStep(this, vehicleID, ref vehicleData, ref frameData, leaderID, ref leaderData, lodPhysics); if ((CSLTraffic.Options & OptionsManager.ModOptions.UseRealisticSpeeds) == OptionsManager.ModOptions.UseRealisticSpeeds) { CustomCarAI.sm_speedData[vehicleID].RestoreVehicleSpeed(this.m_info); } }
public override void SimulationStep(ushort vehicleID, ref Vehicle vehicleData, ref Vehicle.Frame frameData, ushort leaderID, ref Vehicle leaderData, int lodPhysics) { if ((CSLTraffic.Options & OptionsManager.ModOptions.UseRealisticSpeeds) == OptionsManager.ModOptions.UseRealisticSpeeds) { if (CustomCarAI.sm_speedData[vehicleID].speedMultiplier == 0 || CustomCarAI.sm_speedData[vehicleID].currentPath != vehicleData.m_path) { CustomCarAI.sm_speedData[vehicleID].currentPath = vehicleData.m_path; if ((vehicleData.m_flags & Vehicle.Flags.Emergency2) == Vehicle.Flags.Emergency2) { CustomCarAI.sm_speedData[vehicleID].SetRandomSpeedMultiplier(1f, 1.75f); } else { CustomCarAI.sm_speedData[vehicleID].SetRandomSpeedMultiplier(0.7f, 1.1f); } } CustomCarAI.sm_speedData[vehicleID].ApplySpeedMultiplier(this.m_info); } if (this.m_info.m_class.m_level >= ItemClass.Level.Level4) { CustomCarAI.SimulationStep(this, vehicleID, ref vehicleData, ref frameData, leaderID, ref leaderData, lodPhysics); if ((vehicleData.m_flags & Vehicle.Flags.Stopped) != Vehicle.Flags.None && this.CanLeave(vehicleID, ref vehicleData)) { vehicleData.m_flags &= ~Vehicle.Flags.Stopped; vehicleData.m_flags |= Vehicle.Flags.Leaving; } if ((vehicleData.m_flags & Vehicle.Flags.GoingBack) == Vehicle.Flags.None && this.ShouldReturnToSource(vehicleID, ref vehicleData)) { this.SetTarget(vehicleID, ref vehicleData, 0); } } else { frameData.m_blinkState = (((vehicleData.m_flags & Vehicle.Flags.Emergency2) == Vehicle.Flags.None) ? 0f : 10f); this.TryCollectCrime(vehicleID, ref vehicleData, ref frameData); CustomCarAI.SimulationStep(this, vehicleID, ref vehicleData, ref frameData, leaderID, ref leaderData, lodPhysics); if ((vehicleData.m_flags & Vehicle.Flags.Stopped) != Vehicle.Flags.None) { if (this.CanLeave(vehicleID, ref vehicleData)) { vehicleData.m_flags &= ~Vehicle.Flags.Stopped; vehicleData.m_flags |= Vehicle.Flags.Leaving; } } else if ((vehicleData.m_flags & Vehicle.Flags.Arriving) != Vehicle.Flags.None && vehicleData.m_targetBuilding != 0 && (vehicleData.m_flags & (Vehicle.Flags.Emergency2 | Vehicle.Flags.WaitingPath | Vehicle.Flags.GoingBack | Vehicle.Flags.WaitingTarget)) == Vehicle.Flags.None) { this.ArriveAtTarget(vehicleID, ref vehicleData); } if ((vehicleData.m_flags & Vehicle.Flags.GoingBack) == Vehicle.Flags.None && this.ShouldReturnToSource(vehicleID, ref vehicleData)) { this.SetTarget(vehicleID, ref vehicleData, 0); } } if ((CSLTraffic.Options & OptionsManager.ModOptions.UseRealisticSpeeds) == OptionsManager.ModOptions.UseRealisticSpeeds) { CustomCarAI.sm_speedData[vehicleID].RestoreVehicleSpeed(this.m_info); } }
public override void SimulationStep(ushort vehicleID, ref Vehicle vehicleData, ref Vehicle.Frame frameData, ushort leaderID, ref Vehicle leaderData, int lodPhysics) { if ((CSLTraffic.Options & OptionsManager.ModOptions.UseRealisticSpeeds) == OptionsManager.ModOptions.UseRealisticSpeeds) { if (m_speedData.currentPath != vehicleData.m_path) { m_speedData.currentPath = vehicleData.m_path; m_speedData.SetRandomSpeedMultiplier(0.65f, 1.05f); } m_speedData.ApplySpeedMultiplier(this.m_info); } if ((vehicleData.m_flags & Vehicle.Flags.Stopped) != Vehicle.Flags.None) { vehicleData.m_waitCounter += 1; if (this.CanLeave(vehicleID, ref vehicleData)) { vehicleData.m_flags &= ~Vehicle.Flags.Stopped; vehicleData.m_flags |= Vehicle.Flags.Leaving; vehicleData.m_waitCounter = 0; } } CustomCarAI.SimulationStep(this, vehicleID, ref vehicleData, ref frameData, leaderID, ref leaderData, lodPhysics); if ((vehicleData.m_flags & Vehicle.Flags.GoingBack) == Vehicle.Flags.None && this.ShouldReturnToSource(vehicleID, ref vehicleData)) { this.SetTransportLine(vehicleID, ref vehicleData, 0); } if ((CSLTraffic.Options & OptionsManager.ModOptions.UseRealisticSpeeds) == OptionsManager.ModOptions.UseRealisticSpeeds) { m_speedData.RestoreVehicleSpeed(this.m_info); } }
protected override bool StartPathFind(ushort vehicleID, ref Vehicle vehicleData, Vector3 startPos, Vector3 endPos, bool startBothWays, bool endBothWays) { RoadManager.VehicleType vehicleType = RoadManager.VehicleType.PoliceCar; if ((vehicleData.m_flags & Vehicle.Flags.Emergency2) != Vehicle.Flags.None) vehicleType |= RoadManager.VehicleType.Emergency; return CustomCarAI.StartPathFind(this, vehicleID, ref vehicleData, startPos, endPos, startBothWays, endBothWays, vehicleType); }
public override void SimulationStep(ushort vehicleID, ref Vehicle vehicleData, ushort leaderID, ref Vehicle leaderData, int lodPhysics) { if ((CSLTraffic.Options & OptionsManager.ModOptions.UseRealisticSpeeds) == OptionsManager.ModOptions.UseRealisticSpeeds) { if (CustomCarAI.sm_speedData[vehicleID].speedMultiplier == 0 || CustomCarAI.sm_speedData[vehicleID].currentPath != vehicleData.m_path) { CustomCarAI.sm_speedData[vehicleID].currentPath = vehicleData.m_path; CustomCarAI.sm_speedData[vehicleID].SetRandomSpeedMultiplier(0.7f, 1.1f); } CustomCarAI.sm_speedData[vehicleID].ApplySpeedMultiplier(this.m_info); } if ((vehicleData.m_flags & Vehicle.Flags.Spawned) != Vehicle.Flags.None) { Vehicle.Frame lastFrameData = vehicleData.GetLastFrameData(); if (this.m_info.m_isLargeVehicle) { int num = Mathf.Clamp((int)(lastFrameData.m_position.x / 320f + 27f), 0, 53); int num2 = Mathf.Clamp((int)(lastFrameData.m_position.z / 320f + 27f), 0, 53); CustomCarAI.SimulationStep(this, vehicleID, ref vehicleData, ref lastFrameData, leaderID, ref leaderData, lodPhysics); int num3 = Mathf.Clamp((int)(lastFrameData.m_position.x / 320f + 27f), 0, 53); int num4 = Mathf.Clamp((int)(lastFrameData.m_position.z / 320f + 27f), 0, 53); if ((num3 != num || num4 != num2) && (vehicleData.m_flags & Vehicle.Flags.Spawned) != Vehicle.Flags.None) { Singleton <VehicleManager> .instance.RemoveFromGrid(vehicleID, ref vehicleData, true, num, num2); Singleton <VehicleManager> .instance.AddToGrid(vehicleID, ref vehicleData, true, num3, num4); } } else { int num5 = Mathf.Clamp((int)(lastFrameData.m_position.x / 32f + 270f), 0, 539); int num6 = Mathf.Clamp((int)(lastFrameData.m_position.z / 32f + 270f), 0, 539); CustomCarAI.SimulationStep(this, vehicleID, ref vehicleData, ref lastFrameData, leaderID, ref leaderData, lodPhysics); int num7 = Mathf.Clamp((int)(lastFrameData.m_position.x / 32f + 270f), 0, 539); int num8 = Mathf.Clamp((int)(lastFrameData.m_position.z / 32f + 270f), 0, 539); if ((num7 != num5 || num8 != num6) && (vehicleData.m_flags & Vehicle.Flags.Spawned) != Vehicle.Flags.None) { Singleton <VehicleManager> .instance.RemoveFromGrid(vehicleID, ref vehicleData, false, num5, num6); Singleton <VehicleManager> .instance.AddToGrid(vehicleID, ref vehicleData, false, num7, num8); } } if ((vehicleData.m_flags & (Vehicle.Flags.Created | Vehicle.Flags.Deleted)) == Vehicle.Flags.Created) { this.FrameDataUpdated(vehicleID, ref vehicleData, ref lastFrameData); vehicleData.SetFrameData(Singleton <SimulationManager> .instance.m_currentFrameIndex, lastFrameData); } } if ((CSLTraffic.Options & OptionsManager.ModOptions.UseRealisticSpeeds) == OptionsManager.ModOptions.UseRealisticSpeeds) { CustomCarAI.sm_speedData[vehicleID].RestoreVehicleSpeed(this.m_info); } }
public override void SimulationStep(ushort vehicleID, ref Vehicle vehicleData, ref Vehicle.Frame frameData, ushort leaderID, ref Vehicle leaderData, int lodPhysics) { CustomCarAI.SimulationStep(this, vehicleID, ref vehicleData, ref frameData, leaderID, ref leaderData, lodPhysics); if ((vehicleData.m_flags & Vehicle.Flags.Stopped) != Vehicle.Flags.None && this.CanLeave(vehicleID, ref vehicleData)) { vehicleData.m_flags &= ~Vehicle.Flags.Stopped; vehicleData.m_flags |= Vehicle.Flags.Leaving; } if ((vehicleData.m_flags & (Vehicle.Flags.TransferToSource | Vehicle.Flags.GoingBack)) == Vehicle.Flags.TransferToSource && this.ShouldReturnToSource(vehicleID, ref vehicleData)) { this.SetTarget(vehicleID, ref vehicleData, 0); } }
public override void SimulationStep(ushort vehicleID, ref Vehicle vehicleData, ref Vehicle.Frame frameData, ushort leaderID, ref Vehicle leaderData, int lodPhysics) { if ((vehicleData.m_flags & Vehicle.Flags.Stopped) != Vehicle.Flags.None) { vehicleData.m_waitCounter += 1; if (this.CanLeave(vehicleID, ref vehicleData)) { vehicleData.m_flags &= ~Vehicle.Flags.Stopped; vehicleData.m_flags |= Vehicle.Flags.Leaving; vehicleData.m_waitCounter = 0; } } CustomCarAI.SimulationStep(this, vehicleID, ref vehicleData, ref frameData, leaderID, ref leaderData, lodPhysics); if ((vehicleData.m_flags & Vehicle.Flags.GoingBack) == Vehicle.Flags.None && this.ShouldReturnToSource(vehicleID, ref vehicleData)) { this.SetTransportLine(vehicleID, ref vehicleData, 0); } }
protected override bool StartPathFind(ushort vehicleID, ref Vehicle vehicleData, Vector3 startPos, Vector3 endPos, bool startBothWays, bool endBothWays) { if ((vehicleData.m_flags & Vehicle.Flags.Emergency2) == Vehicle.Flags.None) { return(CustomCarAI.StartPathFind(this, vehicleID, ref vehicleData, startPos, endPos, startBothWays, endBothWays, true)); } else { VehicleInfo info = this.m_info; NetInfo.LaneType laneTypes = NetInfo.LaneType.Vehicle | ((NetInfo.LaneType)((byte)32)) | ((NetInfo.LaneType)((byte)64)); PathUnit.Position startPosA; PathUnit.Position startPosB; float num; float num2; PathUnit.Position endPosA; PathUnit.Position endPosB; float num3; float num4; if (CustomPathManager.FindPathPosition(startPos, ItemClass.Service.Road, laneTypes, info.m_vehicleType, 32f, out startPosA, out startPosB, out num, out num2) && CustomPathManager.FindPathPosition(endPos, ItemClass.Service.Road, laneTypes, info.m_vehicleType, 32f, out endPosA, out endPosB, out num3, out num4)) { if (!startBothWays || num < 10f) { startPosB = default(PathUnit.Position); } if (!endBothWays || num3 < 10f) { endPosB = default(PathUnit.Position); } uint path; if ((Singleton <PathManager> .instance as CustomPathManager).CreatePath(out path, ref Singleton <SimulationManager> .instance.m_randomizer, Singleton <SimulationManager> .instance.m_currentBuildIndex, startPosA, startPosB, endPosA, endPosB, laneTypes, info.m_vehicleType, 20000f, this.IsHeavyVehicle(), this.IgnoreBlocked(vehicleID, ref vehicleData), false, false, true)) { if (vehicleData.m_path != 0u) { Singleton <PathManager> .instance.ReleasePath(vehicleData.m_path); } vehicleData.m_path = path; vehicleData.m_flags |= Vehicle.Flags.WaitingPath; return(true); } } return(false); } }
public override void SimulationStep(ushort vehicleID, ref Vehicle vehicleData, ushort leaderID, ref Vehicle leaderData, int lodPhysics) { if ((vehicleData.m_flags & Vehicle.Flags.Spawned) != Vehicle.Flags.None) { Vehicle.Frame lastFrameData = vehicleData.GetLastFrameData(); if (this.m_info.m_isLargeVehicle) { int num = Mathf.Clamp((int)(lastFrameData.m_position.x / 320f + 27f), 0, 53); int num2 = Mathf.Clamp((int)(lastFrameData.m_position.z / 320f + 27f), 0, 53); CustomCarAI.SimulationStep(this, vehicleID, ref vehicleData, ref lastFrameData, leaderID, ref leaderData, lodPhysics); int num3 = Mathf.Clamp((int)(lastFrameData.m_position.x / 320f + 27f), 0, 53); int num4 = Mathf.Clamp((int)(lastFrameData.m_position.z / 320f + 27f), 0, 53); if ((num3 != num || num4 != num2) && (vehicleData.m_flags & Vehicle.Flags.Spawned) != Vehicle.Flags.None) { Singleton <VehicleManager> .instance.RemoveFromGrid(vehicleID, ref vehicleData, true, num, num2); Singleton <VehicleManager> .instance.AddToGrid(vehicleID, ref vehicleData, true, num3, num4); } } else { int num5 = Mathf.Clamp((int)(lastFrameData.m_position.x / 32f + 270f), 0, 539); int num6 = Mathf.Clamp((int)(lastFrameData.m_position.z / 32f + 270f), 0, 539); CustomCarAI.SimulationStep(this, vehicleID, ref vehicleData, ref lastFrameData, leaderID, ref leaderData, lodPhysics); int num7 = Mathf.Clamp((int)(lastFrameData.m_position.x / 32f + 270f), 0, 539); int num8 = Mathf.Clamp((int)(lastFrameData.m_position.z / 32f + 270f), 0, 539); if ((num7 != num5 || num8 != num6) && (vehicleData.m_flags & Vehicle.Flags.Spawned) != Vehicle.Flags.None) { Singleton <VehicleManager> .instance.RemoveFromGrid(vehicleID, ref vehicleData, false, num5, num6); Singleton <VehicleManager> .instance.AddToGrid(vehicleID, ref vehicleData, false, num7, num8); } } if ((vehicleData.m_flags & (Vehicle.Flags.Created | Vehicle.Flags.Deleted)) == Vehicle.Flags.Created) { this.FrameDataUpdated(vehicleID, ref vehicleData, ref lastFrameData); vehicleData.SetFrameData(Singleton <SimulationManager> .instance.m_currentFrameIndex, lastFrameData); } } }
public override void SimulationStep(ushort vehicleID, ref Vehicle vehicleData, ref Vehicle.Frame frameData, ushort leaderID, ref Vehicle leaderData, int lodPhysics) { if ((CSLTraffic.Options & OptionsManager.ModOptions.UseRealisticSpeeds) == OptionsManager.ModOptions.UseRealisticSpeeds) { if (m_speedData.currentPath != vehicleData.m_path) { m_speedData.currentPath = vehicleData.m_path; m_speedData.SetRandomSpeedMultiplier(0.75f, 0.95f); } m_speedData.ApplySpeedMultiplier(this.m_info); } if ((vehicleData.m_flags & Vehicle.Flags.TransferToSource) != Vehicle.Flags.None) { if ((int)vehicleData.m_transferSize < this.m_cargoCapacity) { this.TryCollectGarbage(vehicleID, ref vehicleData, ref frameData); } if ((int)vehicleData.m_transferSize >= this.m_cargoCapacity && (vehicleData.m_flags & Vehicle.Flags.GoingBack) == Vehicle.Flags.None && vehicleData.m_targetBuilding != 0) { this.SetTarget(vehicleID, ref vehicleData, 0); } } CustomCarAI.SimulationStep(this, vehicleID, ref vehicleData, ref frameData, leaderID, ref leaderData, lodPhysics); if ((vehicleData.m_flags & Vehicle.Flags.Arriving) != Vehicle.Flags.None && vehicleData.m_targetBuilding != 0 && (vehicleData.m_flags & (Vehicle.Flags.WaitingPath | Vehicle.Flags.GoingBack | Vehicle.Flags.WaitingTarget)) == Vehicle.Flags.None) { this.ArriveAtTarget(vehicleID, ref vehicleData); } if ((vehicleData.m_flags & (Vehicle.Flags.TransferToSource | Vehicle.Flags.GoingBack)) == Vehicle.Flags.TransferToSource && this.ShouldReturnToSource(vehicleID, ref vehicleData)) { this.SetTarget(vehicleID, ref vehicleData, 0); } if ((CSLTraffic.Options & OptionsManager.ModOptions.UseRealisticSpeeds) == OptionsManager.ModOptions.UseRealisticSpeeds) { m_speedData.RestoreVehicleSpeed(this.m_info); } }
public override void SimulationStep(ushort vehicleID, ref Vehicle vehicleData, ref Vehicle.Frame frameData, ushort leaderID, ref Vehicle leaderData, int lodPhysics) { if ((vehicleData.m_flags & Vehicle.Flags.TransferToSource) != Vehicle.Flags.None) { if ((int)vehicleData.m_transferSize < this.m_cargoCapacity) { this.TryCollectGarbage(vehicleID, ref vehicleData, ref frameData); } if ((int)vehicleData.m_transferSize >= this.m_cargoCapacity && (vehicleData.m_flags & Vehicle.Flags.GoingBack) == Vehicle.Flags.None && vehicleData.m_targetBuilding != 0) { this.SetTarget(vehicleID, ref vehicleData, 0); } } CustomCarAI.SimulationStep(this, vehicleID, ref vehicleData, ref frameData, leaderID, ref leaderData, lodPhysics); if ((vehicleData.m_flags & Vehicle.Flags.Arriving) != Vehicle.Flags.None && vehicleData.m_targetBuilding != 0 && (vehicleData.m_flags & (Vehicle.Flags.WaitingPath | Vehicle.Flags.GoingBack | Vehicle.Flags.WaitingTarget)) == Vehicle.Flags.None) { this.ArriveAtTarget(vehicleID, ref vehicleData); } if ((vehicleData.m_flags & (Vehicle.Flags.TransferToSource | Vehicle.Flags.GoingBack)) == Vehicle.Flags.TransferToSource && this.ShouldReturnToSource(vehicleID, ref vehicleData)) { this.SetTarget(vehicleID, ref vehicleData, 0); } }
public override void SimulationStep(ushort vehicleID, ref Vehicle vehicleData, ref Vehicle.Frame frameData, ushort leaderID, ref Vehicle leaderData, int lodPhysics) { if ((CSLTraffic.Options & OptionsManager.ModOptions.UseRealisticSpeeds) == OptionsManager.ModOptions.UseRealisticSpeeds) { if (m_speedData.currentPath != vehicleData.m_path) { m_speedData.currentPath = vehicleData.m_path; if ((vehicleData.m_flags & Vehicle.Flags.Emergency2) == Vehicle.Flags.Emergency2) { m_speedData.SetRandomSpeedMultiplier(1f, 1.5f); } else { m_speedData.SetRandomSpeedMultiplier(0.7f, 1.05f); } } m_speedData.ApplySpeedMultiplier(this.m_info); } frameData.m_blinkState = (((vehicleData.m_flags & Vehicle.Flags.Emergency2) == Vehicle.Flags.None) ? 0f : 10f); CustomCarAI.SimulationStep(this, vehicleID, ref vehicleData, ref frameData, leaderID, ref leaderData, lodPhysics); if ((vehicleData.m_flags & Vehicle.Flags.Stopped) != Vehicle.Flags.None && this.CanLeave(vehicleID, ref vehicleData)) { vehicleData.m_flags &= ~Vehicle.Flags.Stopped; vehicleData.m_flags |= Vehicle.Flags.Leaving; } if ((vehicleData.m_flags & Vehicle.Flags.GoingBack) == Vehicle.Flags.None && this.ShouldReturnToSource(vehicleID, ref vehicleData)) { this.SetTarget(vehicleID, ref vehicleData, 0); } if ((CSLTraffic.Options & OptionsManager.ModOptions.UseRealisticSpeeds) == OptionsManager.ModOptions.UseRealisticSpeeds) { m_speedData.RestoreVehicleSpeed(this.m_info); } }
protected override bool StartPathFind(ushort vehicleID, ref Vehicle vehicleData, Vector3 startPos, Vector3 endPos, bool startBothWays, bool endBothWays) { return(CustomCarAI.StartPathFind(this, vehicleID, ref vehicleData, startPos, endPos, startBothWays, endBothWays, RoadManager.VehicleType.Bus)); }
public static void SimulationStep(CarAI carAI, ushort vehicleID, ref Vehicle vehicleData, ref Vehicle.Frame frameData, ushort leaderID, ref Vehicle leaderData, int lodPhysics) { uint currentFrameIndex = Singleton <SimulationManager> .instance.m_currentFrameIndex; frameData.m_position += frameData.m_velocity * 0.5f; frameData.m_swayPosition += frameData.m_swayVelocity * 0.5f; float acceleration = carAI.m_info.m_acceleration; float braking = carAI.m_info.m_braking; float magnitude = frameData.m_velocity.magnitude; Vector3 vector = vehicleData.m_targetPos0 - (Vector4)frameData.m_position; float sqrMagnitude = vector.sqrMagnitude; float num = (magnitude + acceleration) * (0.5f + 0.5f * (magnitude + acceleration) / braking) + carAI.m_info.m_generatedInfo.m_size.z * 0.5f; float num2 = Mathf.Max(magnitude + acceleration, 5f); if (lodPhysics >= 2 && (ulong)(currentFrameIndex >> 4 & 3u) == (ulong)((long)(vehicleID & 3))) { num2 *= 2f; } float num3 = Mathf.Max((num - num2) / 3f, 1f); float num4 = num2 * num2; float num5 = num3 * num3; int i = 0; bool flag = false; if ((sqrMagnitude < num4 || vehicleData.m_targetPos3.w < 0.01f) && (leaderData.m_flags & (Vehicle.Flags.WaitingPath | Vehicle.Flags.Stopped)) == Vehicle.Flags.None) { if (leaderData.m_path != 0u) { CustomVehicleAI.UpdatePathTargetPositions(carAI, vehicleID, ref vehicleData, frameData.m_position, ref i, 4, num4, num5); if ((leaderData.m_flags & Vehicle.Flags.Spawned) == Vehicle.Flags.None) { frameData = vehicleData.m_frame0; return; } } if ((leaderData.m_flags & Vehicle.Flags.WaitingPath) == Vehicle.Flags.None) { while (i < 4) { float minSqrDistance; Vector3 refPos; if (i == 0) { minSqrDistance = num4; refPos = frameData.m_position; flag = true; } else { minSqrDistance = num5; refPos = vehicleData.GetTargetPos(i - 1); } int num6 = i; carAI.UpdateBuildingTargetPositions(vehicleID, ref vehicleData, refPos, leaderID, ref leaderData, ref i, minSqrDistance); if (i == num6) { break; } } if (i != 0) { Vector4 targetPos = vehicleData.GetTargetPos(i - 1); while (i < 4) { vehicleData.SetTargetPos(i++, targetPos); } } } vector = vehicleData.m_targetPos0 - (Vector4)frameData.m_position; sqrMagnitude = vector.sqrMagnitude; } if (leaderData.m_path != 0u && (leaderData.m_flags & Vehicle.Flags.WaitingPath) == Vehicle.Flags.None) { NetManager instance = Singleton <NetManager> .instance; byte b = leaderData.m_pathPositionIndex; byte lastPathOffset = leaderData.m_lastPathOffset; if (b == 255) { b = 0; } float num7 = 1f + leaderData.CalculateTotalLength(leaderID); PathManager instance2 = Singleton <PathManager> .instance; PathUnit.Position pathPos; if (instance2.m_pathUnits.m_buffer[(int)((UIntPtr)leaderData.m_path)].GetPosition(b >> 1, out pathPos)) { instance.m_segments.m_buffer[(int)pathPos.m_segment].AddTraffic(Mathf.RoundToInt(num7 * 2.5f)); bool flag2 = false; if ((b & 1) == 0 || lastPathOffset == 0) { uint laneID = PathManager.GetLaneID(pathPos); if (laneID != 0u) { Vector3 b2 = instance.m_lanes.m_buffer[(int)((UIntPtr)laneID)].CalculatePosition((float)pathPos.m_offset * 0.003921569f); float num8 = 0.5f * magnitude * magnitude / carAI.m_info.m_braking + carAI.m_info.m_generatedInfo.m_size.z * 0.5f; if (Vector3.Distance(frameData.m_position, b2) >= num8 - 1f) { instance.m_lanes.m_buffer[(int)((UIntPtr)laneID)].ReserveSpace(num7); flag2 = true; } } } if (!flag2 && instance2.m_pathUnits.m_buffer[(int)((UIntPtr)leaderData.m_path)].GetNextPosition(b >> 1, out pathPos)) { uint laneID2 = PathManager.GetLaneID(pathPos); if (laneID2 != 0u) { instance.m_lanes.m_buffer[(int)((UIntPtr)laneID2)].ReserveSpace(num7); } } } /* -------------------- Congestion Changes ------------------------- */ // Not everything is new. Changes are commented if ((ulong)(currentFrameIndex >> 4 & 15u) == (ulong)((long)(leaderID & 15))) { bool flag3 = false; uint path = leaderData.m_path; int num9 = b >> 1; int j = 0, count = 0; // the count variable is used to keep track of how many of the next 5 lanes are congested //int j = 0; while (j < 5) { bool flag4; if (PathUnit.GetNextPosition(ref path, ref num9, out pathPos, out flag4)) { uint laneID3 = PathManager.GetLaneID(pathPos); if (laneID3 != 0 && !instance.m_lanes.m_buffer[(int)((UIntPtr)laneID3)].CheckSpace(num7)) { j++; ++count; // this lane is congested so increase count continue; } } if (flag4) { (carAI as IVehicle).InvalidPath(vehicleID, ref vehicleData, leaderID, ref leaderData); // flag it as not congested and set count to -1 so that it is neither congested nor completely clear // this is needed here because, contrary to the default code, it does not leave the cycle below if ((CSLTraffic.Options & OptionsManager.ModOptions.ImprovedAI) == OptionsManager.ModOptions.ImprovedAI) { flag3 = true; count = -1; break; } } flag3 = true; ++j; if ((CSLTraffic.Options & OptionsManager.ModOptions.ImprovedAI) != OptionsManager.ModOptions.ImprovedAI) { break; } // the default code would leave the cycle at this point since it found a non congested lane. // this has been changed so that vehicles detect congestions a few lanes in advance. // I am yet to test the performance impact this particular "feature" has. } if ((CSLTraffic.Options & OptionsManager.ModOptions.ImprovedAI) == OptionsManager.ModOptions.ImprovedAI) { // if at least 2 out of the next 5 lanes are congested and it hasn't tried to find a new path yet, then calculates a new path and flags it as such // the amounf of congested lanes necessary to calculate a new path can be tweaked to reduce the amount of new paths being calculated, if performance in bigger cities is severely affected if (count >= 2 && (leaderData.m_flags & (Vehicle.Flags) 1073741824) == 0) { leaderData.m_flags |= (Vehicle.Flags) 1073741824; (carAI as IVehicle).InvalidPath(vehicleID, ref vehicleData, leaderID, ref leaderData); } // if none of the next 5 lanes is congested and the vehicle has already searched for a new path, then it successfully avoided a congestion and the flag is cleared else if (count == 0 && (leaderData.m_flags & (Vehicle.Flags) 1073741824) != 0) { leaderData.m_flags &= ~((Vehicle.Flags) 1073741824); } // default congestion behavior else if (!flag3) { leaderData.m_flags |= Vehicle.Flags.Congestion; } } else if (!flag3) { leaderData.m_flags |= Vehicle.Flags.Congestion; } } /* ----------------------------------------------------------------- */ } float num10; if ((leaderData.m_flags & Vehicle.Flags.Stopped) != Vehicle.Flags.None) { num10 = 0f; } else { num10 = vehicleData.m_targetPos0.w; } Quaternion rotation = Quaternion.Inverse(frameData.m_rotation); vector = rotation * vector; Vector3 vector2 = rotation * frameData.m_velocity; Vector3 a = Vector3.forward; Vector3 vector3 = Vector3.zero; Vector3 zero = Vector3.zero; float num11 = 0f; float num12 = 0f; bool flag5 = false; float num13 = 0f; if (sqrMagnitude > 1f) { a = VectorUtils.NormalizeXZ(vector, out num13); if (num13 > 1f) { Vector3 vector4 = vector; num2 = Mathf.Max(magnitude, 2f); num4 = num2 * num2; if (sqrMagnitude > num4) { vector4 *= num2 / Mathf.Sqrt(sqrMagnitude); } bool flag6 = false; if (vector4.z < Mathf.Abs(vector4.x)) { if (vector4.z < 0f) { flag6 = true; } float num14 = Mathf.Abs(vector4.x); if (num14 < 1f) { vector4.x = Mathf.Sign(vector4.x); if (vector4.x == 0f) { vector4.x = 1f; } num14 = 1f; } vector4.z = num14; } float b3; a = VectorUtils.NormalizeXZ(vector4, out b3); num13 = Mathf.Min(num13, b3); float num15 = 1.57079637f * (1f - a.z); if (num13 > 1f) { num15 /= num13; } float num16 = num13; if (vehicleData.m_targetPos0.w < 0.1f) { num10 = (carAI as IVehicle).CalculateTargetSpeed(vehicleID, ref vehicleData, 1000f, num15); num10 = Mathf.Min(num10, CalculateMaxSpeed(num16, Mathf.Min(vehicleData.m_targetPos0.w, vehicleData.m_targetPos1.w), braking * 0.9f)); } else { num10 = Mathf.Min(num10, (carAI as IVehicle).CalculateTargetSpeed(vehicleID, ref vehicleData, 1000f, num15)); num10 = Mathf.Min(num10, CalculateMaxSpeed(num16, vehicleData.m_targetPos1.w, braking * 0.9f)); } num16 += VectorUtils.LengthXZ(vehicleData.m_targetPos1 - vehicleData.m_targetPos0); num10 = Mathf.Min(num10, CalculateMaxSpeed(num16, vehicleData.m_targetPos2.w, braking * 0.9f)); num16 += VectorUtils.LengthXZ(vehicleData.m_targetPos2 - vehicleData.m_targetPos1); num10 = Mathf.Min(num10, CalculateMaxSpeed(num16, vehicleData.m_targetPos3.w, braking * 0.9f)); num16 += VectorUtils.LengthXZ(vehicleData.m_targetPos3 - vehicleData.m_targetPos2); if (vehicleData.m_targetPos3.w < 0.01f) { num16 = Mathf.Max(0f, num16 - carAI.m_info.m_generatedInfo.m_size.z * 0.5f); } num10 = Mathf.Min(num10, CalculateMaxSpeed(num16, 0f, braking * 0.9f)); if (!DisableCollisionCheck(leaderID, ref leaderData)) { CustomCarAI.CheckOtherVehicles(carAI, vehicleID, ref vehicleData, ref frameData, ref num10, ref flag5, ref zero, num, braking * 0.9f, lodPhysics); } if (flag6) { num10 = -num10; } if (num10 < magnitude) { float num17 = Mathf.Max(acceleration, Mathf.Min(braking, magnitude)); num11 = Mathf.Max(num10, magnitude - num17); } else { float num18 = Mathf.Max(acceleration, Mathf.Min(braking, -magnitude)); num11 = Mathf.Min(num10, magnitude + num18); } } } else { if (magnitude < 0.1f && flag && carAI.ArriveAtDestination(leaderID, ref leaderData)) { leaderData.Unspawn(leaderID); if (leaderID == vehicleID) { frameData = leaderData.m_frame0; } return; } } if ((leaderData.m_flags & Vehicle.Flags.Stopped) == Vehicle.Flags.None && num10 < 0.1f) { flag5 = true; } if (flag5) { vehicleData.m_blockCounter = (byte)Mathf.Min((int)(vehicleData.m_blockCounter + 1), 255); if ((vehicleData.m_blockCounter == 100 || vehicleData.m_blockCounter == 150) && (CSLTraffic.Options & OptionsManager.ModOptions.NoDespawn) == OptionsManager.ModOptions.NoDespawn) { vehicleData.m_blockCounter++; } } else { vehicleData.m_blockCounter = 0; } if (num13 > 1f) { num12 = Mathf.Asin(a.x) * Mathf.Sign(num11); vector3 = a * num11; } else { num11 = 0f; Vector3 b4 = Vector3.ClampMagnitude(vector * 0.5f - vector2, braking); vector3 = vector2 + b4; } bool flag7 = (currentFrameIndex + (uint)leaderID & 16u) != 0u; Vector3 a2 = vector3 - vector2; Vector3 vector5 = frameData.m_rotation * vector3; frameData.m_velocity = vector5 + zero; frameData.m_position += frameData.m_velocity * 0.5f; frameData.m_swayVelocity = frameData.m_swayVelocity * (1f - carAI.m_info.m_dampers) - a2 * (1f - carAI.m_info.m_springs) - frameData.m_swayPosition * carAI.m_info.m_springs; frameData.m_swayPosition += frameData.m_swayVelocity * 0.5f; frameData.m_steerAngle = num12; frameData.m_travelDistance += vector3.z; frameData.m_lightIntensity.x = 5f; frameData.m_lightIntensity.y = ((a2.z >= -0.1f) ? 0.5f : 5f); frameData.m_lightIntensity.z = ((num12 >= -0.1f || !flag7) ? 0f : 5f); frameData.m_lightIntensity.w = ((num12 <= 0.1f || !flag7) ? 0f : 5f); frameData.m_underground = ((vehicleData.m_flags & Vehicle.Flags.Underground) != Vehicle.Flags.None); frameData.m_transition = ((vehicleData.m_flags & Vehicle.Flags.Transition) != Vehicle.Flags.None); if ((vehicleData.m_flags & Vehicle.Flags.Parking) != Vehicle.Flags.None && num13 <= 1f && flag) { Vector3 forward = vehicleData.m_targetPos1 - vehicleData.m_targetPos0; if (forward.sqrMagnitude > 0.01f) { frameData.m_rotation = Quaternion.LookRotation(forward); } } else { if (num11 > 0.1f) { if (vector5.sqrMagnitude > 0.01f) { frameData.m_rotation = Quaternion.LookRotation(vector5); } } else { if (num11 < -0.1f && vector5.sqrMagnitude > 0.01f) { frameData.m_rotation = Quaternion.LookRotation(-vector5); } } } }
protected override bool StartPathFind(ushort vehicleID, ref Vehicle vehicleData, Vector3 startPos, Vector3 endPos, bool startBothWays, bool endBothWays) { return CustomCarAI.StartPathFind(this, vehicleID, ref vehicleData, startPos, endPos, startBothWays, endBothWays, true); }
protected override bool StartPathFind(ushort vehicleID, ref Vehicle vehicleData, Vector3 startPos, Vector3 endPos, bool startBothWays, bool endBothWays) { if ((vehicleData.m_flags & (Vehicle.Flags.TransferToSource | Vehicle.Flags.GoingBack)) != Vehicle.Flags.None) { if ((CSLTraffic.Options & OptionsManager.ModOptions.AllowTrucksInPedestrianRoads) != OptionsManager.ModOptions.None) { return(CustomCarAI.StartPathFind(this, vehicleID, ref vehicleData, startPos, endPos, startBothWays, endBothWays, true)); } return(CustomCarAI.StartPathFind(this, vehicleID, ref vehicleData, startPos, endPos, startBothWays, endBothWays, false)); } PathUnit.Position startPosA; PathUnit.Position startPosB; float num; float num2; NetInfo.LaneType laneTypes = NetInfo.LaneType.Vehicle; if ((CSLTraffic.Options & OptionsManager.ModOptions.AllowTrucksInPedestrianRoads) != OptionsManager.ModOptions.None) { laneTypes |= ((NetInfo.LaneType)((byte)32)); } bool flag = PathManager.FindPathPosition(startPos, ItemClass.Service.Road, laneTypes, VehicleInfo.VehicleType.Car, 32f, out startPosA, out startPosB, out num, out num2); PathUnit.Position position; PathUnit.Position position2; float num3; float num4; if (PathManager.FindPathPosition(startPos, ItemClass.Service.PublicTransport, NetInfo.LaneType.Vehicle, VehicleInfo.VehicleType.Train | VehicleInfo.VehicleType.Ship, 32f, out position, out position2, out num3, out num4)) { if (!flag || num3 < num) { startPosA = position; startPosB = position2; num = num3; num2 = num4; } flag = true; } PathUnit.Position endPosA; PathUnit.Position endPosB; float num5; float num6; bool flag2 = PathManager.FindPathPosition(endPos, ItemClass.Service.Road, laneTypes, VehicleInfo.VehicleType.Car, 32f, out endPosA, out endPosB, out num5, out num6); PathUnit.Position position3; PathUnit.Position position4; float num7; float num8; if (PathManager.FindPathPosition(endPos, ItemClass.Service.PublicTransport, NetInfo.LaneType.Vehicle, VehicleInfo.VehicleType.Train | VehicleInfo.VehicleType.Ship, 32f, out position3, out position4, out num7, out num8)) { if (!flag2 || num7 < num5) { endPosA = position3; endPosB = position4; num5 = num7; num6 = num8; } flag2 = true; } if (flag && flag2) { CustomPathManager instance = (CustomPathManager)Singleton <PathManager> .instance; if (!startBothWays || num < 10f) { startPosB = default(PathUnit.Position); } if (!endBothWays || num5 < 10f) { endPosB = default(PathUnit.Position); } laneTypes = NetInfo.LaneType.Vehicle | NetInfo.LaneType.Cargo; if ((CSLTraffic.Options & OptionsManager.ModOptions.AllowTrucksInPedestrianRoads) != OptionsManager.ModOptions.None) { laneTypes |= ((NetInfo.LaneType)((byte)32)); } VehicleInfo.VehicleType vehicleTypes = VehicleInfo.VehicleType.Car | VehicleInfo.VehicleType.Train | VehicleInfo.VehicleType.Ship; uint path; if (instance.CreatePath(out path, ref Singleton <SimulationManager> .instance.m_randomizer, Singleton <SimulationManager> .instance.m_currentBuildIndex, startPosA, startPosB, endPosA, endPosB, laneTypes, vehicleTypes, 20000f, this.IsHeavyVehicle(), this.IgnoreBlocked(vehicleID, ref vehicleData), false, false, true)) { if (vehicleData.m_path != 0u) { instance.ReleasePath(vehicleData.m_path); } vehicleData.m_path = path; vehicleData.m_flags |= Vehicle.Flags.WaitingPath; return(true); } } return(false); }
public override void SimulationStep(ushort vehicleID, ref Vehicle vehicleData, ref Vehicle.Frame frameData, ushort leaderID, ref Vehicle leaderData, int lodPhysics) { if ((CSLTraffic.Options & OptionsManager.ModOptions.UseRealisticSpeeds) == OptionsManager.ModOptions.UseRealisticSpeeds) { if (CustomCarAI.sm_speedData[vehicleID].speedMultiplier == 0 || CustomCarAI.sm_speedData[vehicleID].currentPath != vehicleData.m_path) { CustomCarAI.sm_speedData[vehicleID].currentPath = vehicleData.m_path; if ((vehicleData.m_flags & Vehicle.Flags.Emergency2) == Vehicle.Flags.Emergency2) { CustomCarAI.sm_speedData[vehicleID].SetRandomSpeedMultiplier(1f, 1.75f); } else { CustomCarAI.sm_speedData[vehicleID].SetRandomSpeedMultiplier(0.65f, 1f); } } CustomCarAI.sm_speedData[vehicleID].ApplySpeedMultiplier(this.m_info); } frameData.m_blinkState = (((vehicleData.m_flags & (Vehicle.Flags.Emergency1 | Vehicle.Flags.Emergency2)) == Vehicle.Flags.None) ? 0f : 10f); CustomCarAI.SimulationStep(this, vehicleID, ref vehicleData, ref frameData, leaderID, ref leaderData, lodPhysics); bool flag = false; if (vehicleData.m_targetBuilding != 0) { BuildingManager instance = Singleton <BuildingManager> .instance; Vector3 a = instance.m_buildings.m_buffer[(int)vehicleData.m_targetBuilding].CalculateSidewalkPosition(); flag = ((a - frameData.m_position).sqrMagnitude < 4096f); bool flag2 = (vehicleData.m_flags & Vehicle.Flags.Stopped) != Vehicle.Flags.None || frameData.m_velocity.sqrMagnitude < 0.0100000007f; if (flag && (vehicleData.m_flags & Vehicle.Flags.Emergency2) != Vehicle.Flags.None) { vehicleData.m_flags = ((vehicleData.m_flags & ~Vehicle.Flags.Emergency2) | Vehicle.Flags.Emergency1); } if (flag && flag2) { if (vehicleData.m_blockCounter > 8) { vehicleData.m_blockCounter = 8; } if (vehicleData.m_blockCounter == 8 && (vehicleData.m_flags & Vehicle.Flags.Stopped) == Vehicle.Flags.None) { this.ArriveAtTarget(leaderID, ref leaderData); } if (this.ExtinguishFire(vehicleID, ref vehicleData, vehicleData.m_targetBuilding, ref Singleton <BuildingManager> .instance.m_buildings.m_buffer[(int)vehicleData.m_targetBuilding])) { this.SetTarget(vehicleID, ref vehicleData, 0); } } else { if (instance.m_buildings.m_buffer[(int)vehicleData.m_targetBuilding].m_fireIntensity == 0) { this.SetTarget(vehicleID, ref vehicleData, 0); } } } if ((vehicleData.m_flags & Vehicle.Flags.Stopped) != Vehicle.Flags.None && !flag && this.CanLeave(vehicleID, ref vehicleData)) { vehicleData.m_flags &= ~Vehicle.Flags.Stopped; vehicleData.m_flags |= Vehicle.Flags.Leaving; } if ((vehicleData.m_flags & Vehicle.Flags.GoingBack) == Vehicle.Flags.None) { if (this.ShouldReturnToSource(vehicleID, ref vehicleData)) { this.SetTarget(vehicleID, ref vehicleData, 0); } } else { if ((ulong)(Singleton <SimulationManager> .instance.m_currentFrameIndex >> 4 & 15u) == (ulong)((long)(vehicleID & 15)) && !this.ShouldReturnToSource(vehicleID, ref vehicleData)) { TransferManager.TransferOffer offer = default(TransferManager.TransferOffer); offer.Priority = 3; offer.Vehicle = vehicleID; offer.Position = frameData.m_position; offer.Amount = 1; offer.Active = true; Singleton <TransferManager> .instance.AddIncomingOffer((TransferManager.TransferReason) vehicleData.m_transferType, offer); } } if ((CSLTraffic.Options & OptionsManager.ModOptions.UseRealisticSpeeds) == OptionsManager.ModOptions.UseRealisticSpeeds) { CustomCarAI.sm_speedData[vehicleID].RestoreVehicleSpeed(this.m_info); } }
private static void CheckOtherVehicles(CarAI carAI, ushort vehicleID, ref Vehicle vehicleData, ref Vehicle.Frame frameData, ref float maxSpeed, ref bool blocked, ref Vector3 collisionPush, float maxDistance, float maxBraking, int lodPhysics) { Vector3 vector = vehicleData.m_targetPos3 - (Vector4)frameData.m_position; Vector3 rhs = frameData.m_position + Vector3.ClampMagnitude(vector, maxDistance); Vector3 min = Vector3.Min(vehicleData.m_segment.Min(), rhs); Vector3 max = Vector3.Max(vehicleData.m_segment.Max(), rhs); VehicleManager instance = Singleton <VehicleManager> .instance; int num = Mathf.Max((int)((min.x - 10f) / 32f + 270f), 0); int num2 = Mathf.Max((int)((min.z - 10f) / 32f + 270f), 0); int num3 = Mathf.Min((int)((max.x + 10f) / 32f + 270f), 539); int num4 = Mathf.Min((int)((max.z + 10f) / 32f + 270f), 539); for (int i = num2; i <= num4; i++) { for (int j = num; j <= num3; j++) { ushort num5 = instance.m_vehicleGrid[i * 540 + j]; int num6 = 0; while (num5 != 0) { num5 = CustomCarAI.CheckOtherVehicle(vehicleID, ref vehicleData, ref frameData, ref maxSpeed, ref blocked, ref collisionPush, maxBraking, num5, ref instance.m_vehicles.m_buffer[(int)num5], min, max, lodPhysics); if (++num6 > 16384) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + Environment.StackTrace); break; } } } } if (lodPhysics == 0 && (CSLTraffic.Options & OptionsManager.ModOptions.noStopForCrossing) != OptionsManager.ModOptions.noStopForCrossing) { CitizenManager instance2 = Singleton <CitizenManager> .instance; float num7 = 0f; Vector3 vector2 = vehicleData.m_segment.b; Vector3 lhs = vehicleData.m_segment.b - vehicleData.m_segment.a; for (int k = 0; k < 4; k++) { Vector3 vector3 = vehicleData.GetTargetPos(k); Vector3 vector4 = vector3 - vector2; if (Vector3.Dot(lhs, vector4) > 0f) { float magnitude = vector4.magnitude; if (magnitude > 0.01f) { Segment3 segment = new Segment3(vector2, vector3); min = segment.Min(); max = segment.Max(); int num8 = Mathf.Max((int)((min.x - 3f) / 8f + 1080f), 0); int num9 = Mathf.Max((int)((min.z - 3f) / 8f + 1080f), 0); int num10 = Mathf.Min((int)((max.x + 3f) / 8f + 1080f), 2159); int num11 = Mathf.Min((int)((max.z + 3f) / 8f + 1080f), 2159); for (int l = num9; l <= num11; l++) { for (int m = num8; m <= num10; m++) { ushort num12 = instance2.m_citizenGrid[l * 2160 + m]; int num13 = 0; while (num12 != 0) { num12 = CustomCarAI.CheckCitizen(segment, num7, magnitude, ref maxSpeed, ref blocked, maxBraking, num12, ref instance2.m_instances.m_buffer[(int)num12], min, max); if (++num13 > 65536) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + Environment.StackTrace); break; } } } } } lhs = vector4; num7 += magnitude; vector2 = vector3; } } } }
protected override bool StartPathFind(ushort vehicleID, ref Vehicle vehicleData, Vector3 startPos, Vector3 endPos, bool startBothWays, bool endBothWays) { if ((vehicleData.m_flags & (Vehicle.Flags.TransferToSource | Vehicle.Flags.GoingBack)) != Vehicle.Flags.None) { return(CustomCarAI.StartPathFind(this, vehicleID, ref vehicleData, startPos, endPos, startBothWays, endBothWays, RoadManager.VehicleType.CargoTruck)); } bool allowUnderground = (vehicleData.m_flags & (Vehicle.Flags.Underground | Vehicle.Flags.Transition)) != Vehicle.Flags.None; PathUnit.Position startPosA; PathUnit.Position startPosB; float num; float num2; bool flag = CustomPathManager.FindPathPosition(startPos, ItemClass.Service.Road, NetInfo.LaneType.Vehicle, VehicleInfo.VehicleType.Car, allowUnderground, 32f, out startPosA, out startPosB, out num, out num2, RoadManager.VehicleType.CargoTruck); PathUnit.Position position; PathUnit.Position position2; float num3; float num4; if (CustomPathManager.FindPathPosition(startPos, ItemClass.Service.PublicTransport, NetInfo.LaneType.Vehicle, VehicleInfo.VehicleType.Train | VehicleInfo.VehicleType.Ship, allowUnderground, 32f, out position, out position2, out num3, out num4, RoadManager.VehicleType.CargoTruck)) { if (!flag || num3 < num) { startPosA = position; startPosB = position2; num = num3; num2 = num4; } flag = true; } PathUnit.Position endPosA; PathUnit.Position endPosB; float num5; float num6; bool flag2 = CustomPathManager.FindPathPosition(endPos, ItemClass.Service.Road, NetInfo.LaneType.Vehicle, VehicleInfo.VehicleType.Car, false, 32f, out endPosA, out endPosB, out num5, out num6, RoadManager.VehicleType.CargoTruck); PathUnit.Position position3; PathUnit.Position position4; float num7; float num8; if (CustomPathManager.FindPathPosition(endPos, ItemClass.Service.PublicTransport, NetInfo.LaneType.Vehicle, VehicleInfo.VehicleType.Train | VehicleInfo.VehicleType.Ship, false, 32f, out position3, out position4, out num7, out num8, RoadManager.VehicleType.CargoTruck)) { if (!flag2 || num7 < num5) { endPosA = position3; endPosB = position4; num5 = num7; num6 = num8; } flag2 = true; } if (flag && flag2) { if (!startBothWays || num < 10f) { startPosB = default(PathUnit.Position); } if (!endBothWays || num5 < 10f) { endPosB = default(PathUnit.Position); } NetInfo.LaneType laneTypes = NetInfo.LaneType.Vehicle | NetInfo.LaneType.CargoVehicle; VehicleInfo.VehicleType vehicleTypes = VehicleInfo.VehicleType.Car | VehicleInfo.VehicleType.Train | VehicleInfo.VehicleType.Ship; uint path; bool createPathResult; CustomPathManager customPathManager = Singleton <PathManager> .instance as CustomPathManager; if (customPathManager != null) { createPathResult = customPathManager.CreatePath(out path, ref Singleton <SimulationManager> .instance.m_randomizer, Singleton <SimulationManager> .instance.m_currentBuildIndex, startPosA, startPosB, endPosA, endPosB, laneTypes, vehicleTypes, 20000f, this.IsHeavyVehicle(), this.IgnoreBlocked(vehicleID, ref vehicleData), false, false, RoadManager.VehicleType.CargoTruck); } else { createPathResult = Singleton <PathManager> .instance.CreatePath(out path, ref Singleton <SimulationManager> .instance.m_randomizer, Singleton <SimulationManager> .instance.m_currentBuildIndex, startPosA, startPosB, endPosA, endPosB, laneTypes, vehicleTypes, 20000f, this.IsHeavyVehicle(), this.IgnoreBlocked(vehicleID, ref vehicleData), false, false); } if (createPathResult) { if (vehicleData.m_path != 0u) { Singleton <PathManager> .instance.ReleasePath(vehicleData.m_path); } vehicleData.m_path = path; vehicleData.m_flags |= Vehicle.Flags.WaitingPath; return(true); } } return(false); }
public static void SimulationStep(CarAI carAI, ushort vehicleID, ref Vehicle vehicleData, ref Vehicle.Frame frameData, ushort leaderID, ref Vehicle leaderData, int lodPhysics) { uint currentFrameIndex = Singleton <SimulationManager> .instance.m_currentFrameIndex; frameData.m_position += frameData.m_velocity * 0.5f; frameData.m_swayPosition += frameData.m_swayVelocity * 0.5f; float acceleration = carAI.m_info.m_acceleration; float braking = carAI.m_info.m_braking; float magnitude = frameData.m_velocity.magnitude; Vector3 vector = vehicleData.m_targetPos0 - (Vector4)frameData.m_position; float sqrMagnitude = vector.sqrMagnitude; float num = (magnitude + acceleration) * (0.5f + 0.5f * (magnitude + acceleration) / braking) + carAI.m_info.m_generatedInfo.m_size.z * 0.5f; float num2 = Mathf.Max(magnitude + acceleration, 5f); if (lodPhysics >= 2 && (ulong)(currentFrameIndex >> 4 & 3u) == (ulong)((long)(vehicleID & 3))) { num2 *= 2f; } float num3 = Mathf.Max((num - num2) / 3f, 1f); float num4 = num2 * num2; float num5 = num3 * num3; int i = 0; bool flag = false; if ((sqrMagnitude < num4 || vehicleData.m_targetPos3.w < 0.01f) && (leaderData.m_flags & (Vehicle.Flags.WaitingPath | Vehicle.Flags.Stopped)) == Vehicle.Flags.None) { if (leaderData.m_path != 0u) { CustomVehicleAI.UpdatePathTargetPositions(carAI, vehicleID, ref vehicleData, frameData.m_position, ref i, 4, num4, num5); if ((leaderData.m_flags & Vehicle.Flags.Spawned) == Vehicle.Flags.None) { frameData = vehicleData.m_frame0; return; } } if ((leaderData.m_flags & Vehicle.Flags.WaitingPath) == Vehicle.Flags.None) { while (i < 4) { float minSqrDistance; Vector3 refPos; if (i == 0) { minSqrDistance = num4; refPos = frameData.m_position; flag = true; } else { minSqrDistance = num5; refPos = vehicleData.GetTargetPos(i - 1); } int num6 = i; carAI.UpdateBuildingTargetPositions(vehicleID, ref vehicleData, refPos, leaderID, ref leaderData, ref i, minSqrDistance); if (i == num6) { break; } } if (i != 0) { Vector4 targetPos = vehicleData.GetTargetPos(i - 1); while (i < 4) { vehicleData.SetTargetPos(i++, targetPos); } } } vector = vehicleData.m_targetPos0 - (Vector4)frameData.m_position; sqrMagnitude = vector.sqrMagnitude; } if (leaderData.m_path != 0u && (leaderData.m_flags & Vehicle.Flags.WaitingPath) == Vehicle.Flags.None) { NetManager instance = Singleton <NetManager> .instance; byte b = leaderData.m_pathPositionIndex; byte lastPathOffset = leaderData.m_lastPathOffset; if (b == 255) { b = 0; } float num7 = 1f + leaderData.CalculateTotalLength(leaderID); PathManager instance2 = Singleton <PathManager> .instance; PathUnit.Position pathPos; if (instance2.m_pathUnits.m_buffer[(int)((UIntPtr)leaderData.m_path)].GetPosition(b >> 1, out pathPos)) { instance.m_segments.m_buffer[(int)pathPos.m_segment].AddTraffic(Mathf.RoundToInt(num7 * 2.5f)); bool flag2 = false; if ((b & 1) == 0 || lastPathOffset == 0) { uint laneID = PathManager.GetLaneID(pathPos); if (laneID != 0u) { Vector3 b2 = instance.m_lanes.m_buffer[(int)((UIntPtr)laneID)].CalculatePosition((float)pathPos.m_offset * 0.003921569f); float num8 = 0.5f * magnitude * magnitude / carAI.m_info.m_braking + carAI.m_info.m_generatedInfo.m_size.z * 0.5f; if (Vector3.Distance(frameData.m_position, b2) >= num8 - 1f) { instance.m_lanes.m_buffer[(int)((UIntPtr)laneID)].ReserveSpace(num7); flag2 = true; } } } if (!flag2 && instance2.m_pathUnits.m_buffer[(int)((UIntPtr)leaderData.m_path)].GetNextPosition(b >> 1, out pathPos)) { uint laneID2 = PathManager.GetLaneID(pathPos); if (laneID2 != 0u) { instance.m_lanes.m_buffer[(int)((UIntPtr)laneID2)].ReserveSpace(num7); } } } if ((ulong)(currentFrameIndex >> 4 & 15u) == (ulong)((long)(leaderID & 15))) { bool flag3 = false; uint path = leaderData.m_path; int num9 = b >> 1; int j = 0; while (j < 5) { bool flag4; if (PathUnit.GetNextPosition(ref path, ref num9, out pathPos, out flag4)) { uint laneID3 = PathManager.GetLaneID(pathPos); if (laneID3 != 0u && !instance.m_lanes.m_buffer[(int)((UIntPtr)laneID3)].CheckSpace(num7)) { j++; continue; } } if (flag4) { (carAI as IVehicle).InvalidPath(vehicleID, ref vehicleData, leaderID, ref leaderData); } flag3 = true; break; } if (!flag3) { leaderData.m_flags |= Vehicle.Flags.Congestion; } } } float num10; if ((leaderData.m_flags & Vehicle.Flags.Stopped) != Vehicle.Flags.None) { num10 = 0f; } else { num10 = vehicleData.m_targetPos0.w; } Quaternion rotation = Quaternion.Inverse(frameData.m_rotation); vector = rotation * vector; Vector3 vector2 = rotation * frameData.m_velocity; Vector3 a = Vector3.forward; Vector3 vector3 = Vector3.zero; Vector3 zero = Vector3.zero; float num11 = 0f; float num12 = 0f; bool flag5 = false; float num13 = 0f; if (sqrMagnitude > 1f) { a = VectorUtils.NormalizeXZ(vector, out num13); if (num13 > 1f) { Vector3 vector4 = vector; num2 = Mathf.Max(magnitude, 2f); num4 = num2 * num2; if (sqrMagnitude > num4) { vector4 *= num2 / Mathf.Sqrt(sqrMagnitude); } bool flag6 = false; if (vector4.z < Mathf.Abs(vector4.x)) { if (vector4.z < 0f) { flag6 = true; } float num14 = Mathf.Abs(vector4.x); if (num14 < 1f) { vector4.x = Mathf.Sign(vector4.x); if (vector4.x == 0f) { vector4.x = 1f; } num14 = 1f; } vector4.z = num14; } float b3; a = VectorUtils.NormalizeXZ(vector4, out b3); num13 = Mathf.Min(num13, b3); float num15 = 1.57079637f * (1f - a.z); if (num13 > 1f) { num15 /= num13; } float num16 = num13; if (vehicleData.m_targetPos0.w < 0.1f) { num10 = (carAI as IVehicle).CalculateTargetSpeed(vehicleID, ref vehicleData, 1000f, num15); num10 = Mathf.Min(num10, CalculateMaxSpeed(num16, Mathf.Min(vehicleData.m_targetPos0.w, vehicleData.m_targetPos1.w), braking * 0.9f)); } else { num10 = Mathf.Min(num10, (carAI as IVehicle).CalculateTargetSpeed(vehicleID, ref vehicleData, 1000f, num15)); num10 = Mathf.Min(num10, CalculateMaxSpeed(num16, vehicleData.m_targetPos1.w, braking * 0.9f)); } num16 += VectorUtils.LengthXZ(vehicleData.m_targetPos1 - vehicleData.m_targetPos0); num10 = Mathf.Min(num10, CalculateMaxSpeed(num16, vehicleData.m_targetPos2.w, braking * 0.9f)); num16 += VectorUtils.LengthXZ(vehicleData.m_targetPos2 - vehicleData.m_targetPos1); num10 = Mathf.Min(num10, CalculateMaxSpeed(num16, vehicleData.m_targetPos3.w, braking * 0.9f)); num16 += VectorUtils.LengthXZ(vehicleData.m_targetPos3 - vehicleData.m_targetPos2); if (vehicleData.m_targetPos3.w < 0.01f) { num16 = Mathf.Max(0f, num16 - carAI.m_info.m_generatedInfo.m_size.z * 0.5f); } num10 = Mathf.Min(num10, CalculateMaxSpeed(num16, 0f, braking * 0.9f)); if (!DisableCollisionCheck(leaderID, ref leaderData)) { CustomCarAI.CheckOtherVehicles(carAI, vehicleID, ref vehicleData, ref frameData, ref num10, ref flag5, ref zero, num, braking * 0.9f, lodPhysics); } if (flag6) { num10 = -num10; } if (num10 < magnitude) { float num17 = Mathf.Max(acceleration, Mathf.Min(braking, magnitude)); num11 = Mathf.Max(num10, magnitude - num17); } else { float num18 = Mathf.Max(acceleration, Mathf.Min(braking, -magnitude)); num11 = Mathf.Min(num10, magnitude + num18); } } } else { if (magnitude < 0.1f && flag && carAI.ArriveAtDestination(leaderID, ref leaderData)) { leaderData.Unspawn(leaderID); if (leaderID == vehicleID) { frameData = leaderData.m_frame0; } return; } } if ((leaderData.m_flags & Vehicle.Flags.Stopped) == Vehicle.Flags.None && num10 < 0.1f) { flag5 = true; } if (flag5) { vehicleData.m_blockCounter = (byte)Mathf.Min((int)(vehicleData.m_blockCounter + 1), 255); if ((vehicleData.m_blockCounter == 100 || vehicleData.m_blockCounter == 150) && (CSLTraffic.Options & OptionsManager.ModOptions.NoDespawn) == OptionsManager.ModOptions.NoDespawn) { vehicleData.m_blockCounter++; } } else { vehicleData.m_blockCounter = 0; } if (num13 > 1f) { num12 = Mathf.Asin(a.x) * Mathf.Sign(num11); vector3 = a * num11; } else { num11 = 0f; Vector3 b4 = Vector3.ClampMagnitude(vector * 0.5f - vector2, braking); vector3 = vector2 + b4; } bool flag7 = (currentFrameIndex + (uint)leaderID & 16u) != 0u; Vector3 a2 = vector3 - vector2; Vector3 vector5 = frameData.m_rotation * vector3; frameData.m_velocity = vector5 + zero; frameData.m_position += frameData.m_velocity * 0.5f; frameData.m_swayVelocity = frameData.m_swayVelocity * (1f - carAI.m_info.m_dampers) - a2 * (1f - carAI.m_info.m_springs) - frameData.m_swayPosition * carAI.m_info.m_springs; frameData.m_swayPosition += frameData.m_swayVelocity * 0.5f; frameData.m_steerAngle = num12; frameData.m_travelDistance += vector3.z; frameData.m_lightIntensity.x = 5f; frameData.m_lightIntensity.y = ((a2.z >= -0.1f) ? 0.5f : 5f); frameData.m_lightIntensity.z = ((num12 >= -0.1f || !flag7) ? 0f : 5f); frameData.m_lightIntensity.w = ((num12 <= 0.1f || !flag7) ? 0f : 5f); frameData.m_underground = ((vehicleData.m_flags & Vehicle.Flags.Underground) != Vehicle.Flags.None); frameData.m_transition = ((vehicleData.m_flags & Vehicle.Flags.Transition) != Vehicle.Flags.None); if ((vehicleData.m_flags & Vehicle.Flags.Parking) != Vehicle.Flags.None && num13 <= 1f && flag) { Vector3 forward = vehicleData.m_targetPos1 - vehicleData.m_targetPos0; if (forward.sqrMagnitude > 0.01f) { frameData.m_rotation = Quaternion.LookRotation(forward); } } else { if (num11 > 0.1f) { if (vector5.sqrMagnitude > 0.01f) { frameData.m_rotation = Quaternion.LookRotation(vector5); } } else { if (num11 < -0.1f && vector5.sqrMagnitude > 0.01f) { frameData.m_rotation = Quaternion.LookRotation(-vector5); } } } }