public static bool Prefix(CarAI __instance, ushort vehicleID, ref Vehicle vehicleData, PathUnit.Position position, uint laneID, byte offset, out Vector3 pos, out Vector3 dir, out float maxSpeed) { // NON-STOCK CODE START VehicleAICommons.CustomCalculateSegmentPosition(__instance, vehicleID, ref vehicleData, position, laneID, offset, out pos, out dir, out maxSpeed); maxSpeed = Constants.ManagerFactory.VehicleBehaviorManager.CalcMaxSpeed( vehicleID, ref Constants.ManagerFactory.ExtVehicleManager.ExtVehicles[vehicleID], __instance.m_info, position, ref position.m_segment.ToSegment(), pos, maxSpeed, false); // NON-STOCK CODE END return(false); }
void Awake() { Time.timeScale = 1; _globalManager = GameObject.Find("GlobalManager").GetComponent <GlobalManager>(); _globalManager.manager = gameObject.GetComponent <Manager>(); prompt = GameObject.Find("Prompt"); car = GameObject.Find("Player"); destination = GameObject.Find("Destination"); gameOverUi = GameObject.Find("GameOverUi"); tempUi = GameObject.Find("TempUi"); power1 = GameObject.Find("Power1"); power2 = GameObject.Find("Power2"); stars = GameObject.Find("StarsScore"); starsPoint = GameObject.Find("StarsPoint").GetComponent <Transform>(); error0 = GameObject.Find("0error"); error1 = GameObject.Find("1error"); error2 = GameObject.Find("2error"); _carAi = car.GetComponent <CarAI>(); prompt.SetActive(false); gameOverUi.SetActive(false); instructions = GameObject.Find("Instructions"); currentSceneIndex = SceneManager.GetActiveScene().buildIndex; pause = gameObject.GetComponent <Pause>(); StartCoroutine(InstructionPopUp()); }
public void Initialize(Track track, MLPNeuralNetwork controller) { var carAi = new CarAI(random, controller); // Load the simulation simulation = appService.Kernel.Get <RacingSimulationLogic>(); simulation.SetTrack(track); // Add the 1:1 trained AI to the list of cars var cars = new List <ICarController>() { carAi }; // Spawn 100 mutated versions of our AI for (int i = 0; i < 100; i++) { var car = carAi.Clone(); car.Mutate(); cars.Add((CarAI)car); } // Initialize the simulation simulation.SetCars(cars); simulation.ResetCars(); // If the visualization is turned on, create it, set the track and add the cars. simulationVisualization = appService.Kernel.Get <RacingSimulationVisualization>(); simulationVisualization.SetTrack(track); simulationVisualization.InitializeCars(simulation.GetCars()); }
void spawnCars() { if (myJunct.free && spawning) { if (spawnTimer < spawnDelay) { spawnTimer += Time.deltaTime; } else if (carsSpawned < spawnsPerLight) { Debug.Log("got here"); CarAI newCar = findNonActiveCar().GetComponent <CarAI>(); newCar.gameObject.SetActive(true); newCar.Restart(); carsSpawned++; spawnTimer = 0; } } else if (myJunct.free && turned) { Debug.Log("changing the light, spawning new cars"); spawning = true; turned = false; carsSpawned = 0; } else if (!myJunct.free) { Debug.Log("the light is red"); spawning = false; turned = true; } }
// void OnTriggerEnter(Collider other){ // if (enabled && networkView.enabled && networkView.isMine && other.tag == "Road") // { // if(!carB) // carB = GetComponent<CarB>(); // if(carB && carB.round == 3) // { // if(!gameState) // gameState = FindObjectOfType(typeof(PlayGameController)) as PlayGameController; // if(!property) // property = GetComponent<CarProperty>(); // if(!carAI) // carAI = GetComponent<CarAI>(); // if(!isSendWin) // { // if(gameState && !gameState.IsBalanceState()) { // networkView.enabled = false; // // gameState.SendWin(property.GetDriftTime(), property.GetUseEnergy(), property.GetBeHitTime(), property.ownerGUPID); // // isSendWin = true; // } // // } // carB.SetSteer(0); // carB.SetThrottle(0); //// carB.SetEnableUserInput(false); //// Camera.main.GetComponent<UserInterfaceControl>().enabled = false; // carB.Wait(true); // carAI.enabled = false; // property.SetShowRank(false); // } // } // } void FinishRound() { if (enabled && networkView.enabled && networkView.isMine) { if(!gameState) gameState = FindObjectOfType(typeof(PlayGameController)) as PlayGameController; if(!property) property = GetComponent<CarProperty>(); if(!carAI) carAI = GetComponent<CarAI>(); if(!isSendWin) { if(gameState && !gameState.IsBalanceState()) { networkView.enabled = false; gameState.SendWin(property.GetDriftTime(), property.GetUseEnergy(), property.GetBeHitTime(), property.ownerGUPID); isSendWin = true; } } // carB.SetSteer(0); // carB.SetThrottle(0); // carB.SetEnableUserInput(false); // Camera.main.GetComponent<UserInterfaceControl>().enabled = false; // carB.Wait(true); carAI.enabled = false; property.SetShowRank(false); } }
protected override void OnTriggerEnter(Collider other) { CarAI ai = other.GetComponent <CarAI>(); CarController car = other.GetComponent <CarController>(); if (car != null) { if (ai != null) { AIWins = true; } else { if (AIWins) { manager.AIWins(); } else { manager.PlayerWins(); } Destroy(gameObject); } } }
void OnTriggerEnter(Collider other) { Car car = other.gameObject.GetComponent <Car>(); if (car) { car.AdjustSpeedByPosition(); if (checkPointNum == car.nextCheckpoint) { car.CheckpointPassed(); } else if (checkPointNum != car.currentCheckpoint) { car.Respawn(Vector3.zero); } CarAI carAI = other.gameObject.GetComponent <CarAI>(); if (carAI) { float brakeProb = car.brakeProbability; if (Random.value < brakeProb) { car.Brake(brakeFactor); } } } }
void Start() { curentTarget = route.GetChild(0); count = route.childCount; caraicontrol = GetComponent <CarAI>(); caraicontrol.SetTarget(curentTarget); }
void AddCar() { CarAI car = carPool.Take <CarAI>(); activeCars.Add(car); car.gameObject.SetActive(true); }
private void Awake() { rb = GetComponent <Rigidbody>(); CarAI ai = GetComponent <CarAI>(); if (ai != null) { AIEnabled = true; } CustomizerCar cc = GetComponent <CustomizerCar>(); if (cc != null) { customizerCar = true; } dataHolder = FindObjectOfType <CarDataHolder>(); if (!AIEnabled) { body = dataHolder.body; engine = dataHolder.engine; aero = dataHolder.aero; tire = dataHolder.tire; } Setup(); defaultDownForce = downwardForce; }
void Start() { if (Auto) { Transform[] children = GetComponentsInChildren <Transform>(true); foreach (Transform child in children) { if (child.name == "a_Skid") { carSkidSound = child.gameObject.GetComponent <AudioSource>(); } if (child.name == "Front_Ray_SlowCar") { Front_Ray = child; } } carController = GetComponent <CarController>(); carAI = GetComponent <CarAI>(); foreach (GameObject obj in carController.Wheel_X_Rotate) { Grp_Wheels.Add(obj.transform.parent.gameObject); listCurrentTrail.Add(null); } rayDistance = carController.SpringHeight; } }
private void RemoveCar(CarAI car) { if (car == currentCar) { currentCar = null; } }
private void OnCollisionEnter2D(Collision2D other) { CarAI c = other.transform.GetComponent <CarAI>(); if (c != null) { c.TellMngerDied(); } }
public void Generate() { Transform CarsContainer = new GameObject().transform; CarsContainer.parent = transform; CarsContainer.gameObject.name = "CarsContainer"; CarsContainer.localPosition = Vector3.zero; CarsContainer.localScale = Vector3.one; CarsContainer.localRotation = Quaternion.identity; generatedCars = new GameObject[modelCount]; for (int i = 0; i < modelCount; i++) { Material[] material = new Material[4]; material[0] = materialTemplates[Random.Range(0, materialTemplates.Length)]; material[1] = materialTemplates[Random.Range(0, materialTemplates.Length)]; material[2] = materialTemplates[Random.Range(0, materialTemplates.Length)]; material[3] = glass; generatedCars[i] = Instantiate(carBase); generatedCars[i].name = "car_" + i.ToString(); generatedCars[i].transform.parent = CarsContainer; generatedCars[i].transform.localScale = Vector3.one; generatedCars[i].transform.localRotation = Quaternion.identity; generatedCars[i].SetActive(false); CarAI p = generatedCars[i].GetComponent <CarAI>(); p.pool = carPool; p.traffic = carTrafic; Transform model = generatedCars[i].GetComponent <Car>().model; GameObject front = Instantiate(frontTemplates[Random.Range(0, frontTemplates.Length)]); front.name = "front"; front.transform.parent = model; front.transform.localPosition = Vector3.zero; front.transform.localScale = Vector3.one; Material[] m = { material[0], material[1], material[2] }; front.GetComponent <MeshRenderer>().materials = m; GameObject middle = Instantiate(middleTemplates[Random.Range(0, middleTemplates.Length)]); middle.name = "middle"; middle.transform.parent = model; middle.transform.localPosition = Vector3.zero; middle.transform.localScale = Vector3.one; middle.GetComponent <MeshRenderer>().materials = material; GameObject back = Instantiate(backTemplates[Random.Range(0, backTemplates.Length)]); back.name = "back"; back.transform.parent = model; back.transform.localPosition = Vector3.zero; back.transform.localScale = Vector3.one; back.GetComponent <MeshRenderer>().materials = material; } }
private void Update() { if (currentCar == null) { if (trafficQueue.Count > 0) { currentCar = trafficQueue.Dequeue(); currentCar.Stop = false; } } }
void OnTriggerStay2D(Collider2D other) { if (other.tag == "Enemy") { CarAI ai = other.GetComponent <CarAI>(); if (ai != null) { other.GetComponent <CarAI>().GoToNext(nextWP); } } }
private void CheckCars() { for (int c = activeCars.Count - 1; c >= 0; --c) { CarAI car = activeCars[c]; if (Vector3.Distance(car.transform.position, trafficCenter) > city.transform.lossyScale.x * maxCarDistanceInCells) { car.ResetParticle(); } } }
public static IIndividual SpawnCarController( CarConfiguration carConfiguration, Random random, List <float> initialWeights = null) { var networkStructure = new int[] { carConfiguration.NumberOfRays, 12, 12, 4 }; var controller = new CarAI(networkStructure, random, initialWeights); controller.Initalize(carConfiguration); return(controller); }
// Start is called before the first frame update void Start() { int carNum = 0; car = Transform.Instantiate(tm.Carlist[carNum], transform.position + transform.forward * spawnOffset, transform.rotation, tm.transform); carAI = car.GetComponent <CarAI>(); carAI.nf = transform.GetComponent <NodeFollower>(); //carAI.speed = tm.CarSpeeds[carNum]; //carAI.steering = tm.CarSteers[carNum]; //carAI.stopDist = tm.CarStopDists[carNum]; }
//충돌한 차를 2초~10초 후에 리스폰하는 coroutine private IEnumerator PushBurningCar() { CarAI car_ai = gameObject.GetComponent <CarAI>(); Random.InitState((int)System.DateTime.Now.Ticks); float respawn_time = Random.Range(2, 10); //2~10 범위 내에서 랜덤값 복사 yield return(new WaitForSeconds(respawn_time)); //위의 값만큼 대기. Burn.SetActive(false); //대기 완료 후에 폭발 이펙트 비활성화. car_ai.PositionReset(); //해당하는 npc 리스폰 }
public static NeuralNetwork DeserializeNeuralNetwork(CarAI carAI) { if (carAI.jsonFile == null) { throw new NullReferenceException("File path cannot be null if you want to deserialize network!"); } var deserializeObject = JsonConvert.DeserializeObject <NeuralNetworkDto>(carAI.jsonFile.text); return(NeuralNetwork.Of(deserializeObject, carAI.inputsAmount, carAI.neuronsInHiddenLayerCount, carAI.outputsAmount, carAI.ActivationsFunctions)); }
private void Awake() { _transform = transform; _gameObject = gameObject; _cacheManager = CacheManager.Instance; Movement = new CarPhysics(this); AI = new CarAI(this); _camera = CameraManager.Instance.MainCamera.GetComponent <CameraController>(); _rigidBody = GetComponent <Rigidbody>(); EngineRunning = true; _currentVehicleHealthGroup = 1; }
/// <summary> /// Instantiates a CarAI object and sets its path /// </summary> /// <param name="jsonPath"></param> private void SpawnNonAPICar(List <Node> path) { CarAI car = CarPrefabs[UnityEngine.Random.Range(0, CarPrefabs.Length)].GetPooledInstance <CarAI>(); car.transform.localScale.Set(0.25f, 0.15f, 0.25f); car.NonAPICar = true; car.Init(); car.Pather.Map = Map; car.Pather.Path = path; car.SetNextEdge(0); car.Pather.PathReady = true; }
/// <summary> /// Spawn a car if the timer allows. /// </summary> private void Spawn() { if (!canSpawn) { return; } StartCoroutine(DelaySpawn()); var house2spawn = houses [Random.Range(0, houses.Count - 1)]; GameObject c = (GameObject)Instantiate(carPrefab, house2spawn.position, house2spawn.rotation); CarAI mycar = c.GetComponent <CarAI> (); mycar.startTravel(houses [Random.Range(0, houses.Count - 1)].position); }
// Update is called once per frame void Update() { CarAI car = transform.parent.parent.GetComponent <CarAI>(); if (Parameters.display) { text.text = (car.fitness * (car.checkpoints / 4)).ToString() + " : " + car.checkpoints.ToString(); } else { text.text = ""; } }
public void createCars(int ammount) { cars = new CarAI[ammount]; for (int i = 0; i < ammount; i++) { Vector3 pos = getRandomPos(); CarAI temp = Instantiate(carPrefab, pos, Quaternion.identity) as CarAI; temp.transform.parent = transform; //add to waypoints array cars[i] = temp; } }
public static bool StartPathFind(CarAI carAI, ushort vehicleID, ref Vehicle vehicleData, Vector3 startPos, Vector3 endPos, bool startBothWays, bool endBothWays, RoadManager.VehicleType vehicleType) { VehicleInfo info = carAI.m_info; bool allowUnderground = (vehicleData.m_flags & (Vehicle.Flags.Underground | Vehicle.Flags.Transition)) != Vehicle.Flags.None; 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, NetInfo.LaneType.Vehicle, info.m_vehicleType, allowUnderground, 32f, out startPosA, out startPosB, out num, out num2, vehicleType) && CustomPathManager.FindPathPosition(endPos, ItemClass.Service.Road, NetInfo.LaneType.Vehicle, info.m_vehicleType, false, 32f, out endPosA, out endPosB, out num3, out num4, vehicleType)) { if (!startBothWays || num < 10f) { startPosB = default(PathUnit.Position); } if (!endBothWays || num3 < 10f) { endPosB = default(PathUnit.Position); } 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, NetInfo.LaneType.Vehicle, info.m_vehicleType, 20000f, (carAI as IVehicle).IsHeavyVehicle(), (carAI as IVehicle).IgnoreBlocked(vehicleID, ref vehicleData), false, false, vehicleType); } else { createPathResult = Singleton <PathManager> .instance.CreatePath(out path, ref Singleton <SimulationManager> .instance.m_randomizer, Singleton <SimulationManager> .instance.m_currentBuildIndex, startPosA, startPosB, endPosA, endPosB, NetInfo.LaneType.Vehicle, info.m_vehicleType, 20000f, (carAI as IVehicle).IsHeavyVehicle(), (carAI as IVehicle).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); }
private void Update() { if (!carAI && GetComponent <CarAI>() && GetComponent <CarAI>().enabled == true) { carAI = GetComponent <CarAI>(); } // Check if the Big Impact is enabled if (!carAI && !carControl.raceIsFinished) { if (carControl.rb && carControl.rb.velocity.magnitude >= carControl.MaxSpeed) { BigImpactGauge = Mathf.MoveTowards(BigImpactGauge, TimeToEnableBigImpact, Time.deltaTime); if (TimeToEnableBigImpact == BigImpactGauge) { b_CheckBigImpactStep_One = true; } } else { BigImpactGauge = 0; TurnGauge = 0; b_CheckBigImpactStep_One = false; } // Check if the car turn left or right when big impact is enabled if (b_CheckBigImpactStep_One) { if (!carAI && carControl && carControl.turnDirection != 0) { b_CheckBigImpactStep_Two = true; TurnGauge = Mathf.MoveTowards(TurnGauge, TimeToTurnBeforeImpact, Time.deltaTime); if (TurnGauge == TimeToTurnBeforeImpact) { b_CheckBigImpactStep_One = false; b_CheckBigImpactStep_Two = false; BigImpactGauge = 0; } } if (!carAI && carControl && carControl.turnDirection == 0 && TurnGauge != 0) { b_CheckBigImpactStep_One = false; b_CheckBigImpactStep_Two = false; BigImpactGauge = 0; } } } }
void OnTriggerEnter(Collider other) { if (other.tag == "Car") { CarAI car = other.gameObject.GetComponent <CarAI> (); if (car.isGoingToSensor() || sensors.Count == 0) { car.setInitialDestination(); } else { car.setDestination(getClosestSensorPosition(car.getInitialDestination())); } } }
protected virtual void OnTriggerEnter(Collider other) { CarAI ai = other.GetComponent <CarAI>(); CarController car = other.GetComponent <CarController>(); if (car != null) { if (ai != null) { manager.AIWinning(); } else { manager.PlayerWinning(); } Destroy(gameObject); } }
public static bool StartPathFind(CarAI carAI, ushort vehicleID, ref Vehicle vehicleData, Vector3 startPos, Vector3 endPos, bool startBothWays, bool endBothWays, bool usePedestrianRoads) { VehicleInfo info = carAI.m_info; NetInfo.LaneType laneTypes = NetInfo.LaneType.Vehicle; if (usePedestrianRoads) { laneTypes |= ((NetInfo.LaneType)((byte)32)); } 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, (carAI as IVehicle).IsHeavyVehicle(), (carAI as IVehicle).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); }
void Start() { //Destroy existing rigidbody, we don't want anyone to mess with it. if(rigidbody) Destroy(rigidbody); //setup rigidbody gameObject.AddComponent<Rigidbody>(); rigidbody.mass = mass; rigidbody.drag = drag; rigidbody.angularDrag = 0.05f; rigidbody.centerOfMass = new Vector3(rigidbody.centerOfMass.x, cogY, rigidbody.centerOfMass.z); rigidbody.interpolation = RigidbodyInterpolation.Interpolate; // rigidbody.constraints = RigidbodyConstraints.FreezeRotationZ; //start engine noise audio.loop = true; audio.Play(); SMCamera = Camera.main.GetComponent<SmoothFollow>(); //setup wheels wheels=new WheelData[4 + otherWheels.Length]; for(int i=0;i<4 + otherWheels.Length;i++) wheels[i] = new WheelData(); wheels[0].graphic = wheelFL; wheels[1].graphic = wheelFR; wheels[2].graphic = wheelBL; wheels[3].graphic = wheelBR; for(int i=0;i < otherWheels.Length;i++) { wheels[i + 4].graphic = otherWheels[i]; } wheels[0].maxSteerAngle = 30.0f; wheels[1].maxSteerAngle = 30.0f; wheels[2].powered = true; wheels[3].powered = true; wheels[2].handbraked = true; wheels[3].handbraked = true; foreach(WheelData w in wheels) { if(w.graphic == null) Debug.Log("You need to assign all four wheels for the car script!"); if(!w.graphic.transform.IsChildOf(transform)) Debug.Log("Wheels need to be children of the Object with the car script"); w.originalRotation = w.graphic.localRotation; //create collider GameObject colliderObject = new GameObject("WheelCollider"); colliderObject.transform.parent = transform; colliderObject.transform.localPosition = w.graphic.localPosition; colliderObject.transform.localRotation = w.graphic.localRotation; w.coll = colliderObject.AddComponent<WheelCollider>(); w.coll.suspensionDistance = suspensionDistance; JointSpring js = new JointSpring(); js.spring = springs; js.damper = dampers; // w.coll.suspensionSpring.spring = springs; // w.coll.suspensionSpring.damper = dampers; w.coll.suspensionSpring = js; //no grip, as we simulate handling ourselves WheelFrictionCurve forwardwfc = new WheelFrictionCurve(); forwardwfc.stiffness = 0; WheelFrictionCurve sidewaywfc = new WheelFrictionCurve(); sidewaywfc.stiffness = 0; // w.coll.forwardFriction.stiffness = 0; // w.coll.sidewaysFriction.stiffness = 0; w.coll.forwardFriction = forwardwfc; w.coll.sidewaysFriction = sidewaywfc; w.coll.radius = wheelRadius; } //get wheel height (height forces are applied on) // wheelY = wheels[0].graphic.localPosition.y; //find skidmark object skidmarks = FindObjectOfType(typeof(Skidmarks)) as Skidmarks; //shift to first gear = 1; defaultMaxRPM = maxRPM; defaultMaxTorque = maxTorque; carAI = GetComponent<CarAI>(); }
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); } } } }
void Start() { car = GetComponent<DriftCar>(); carB = GetComponent<CarB>(); carAI = GetComponent<CarAI>(); SMCamera = Camera.main.GetComponent<SmoothFollow>(); // if(networkView.enabled) // { // MatchArenaState mas = FindObjectOfType(typeof(MatchArenaState)) as MatchArenaState; // tvcMatchRoom = mas.GetTvCMatchRoom(); // } if(!rank) { rank = FindObjectOfType(typeof(RankManager)) as RankManager; } defaultScale = transform.localScale; if(car) oriGrip = car.handlingTendency; if(rearWheels.Length > 0) { stickWheels = new StickData[rearWheels.Length]; int i = 0; foreach(Transform wheel in rearWheels) { stickWheels[i] = new StickData(wheel); i++; } } /*SkillIcon[0] = levelTwo.GetIcon()[0]; SkillIcon = levelTwo.GetIcon()[1]; SkillIcon[2][0] = levelThree.GetIcon()[0]; SkillIcon[2][1] = levelThree.GetIcon()[1];*/ // while(true) // { // AddEnergy(energyRate); // yield return new WaitForSeconds(1); // } skillProbabilitys = new SkillProbability[4]; for(int i = 0; i < 4; i++) { skillProbabilitys[i] = new SkillProbability(); // skillProbabilitys[i].AddProbability(levelOne.Probability(i)); // skillProbabilitys[i].AddProbability(levelTwo.Probability(i)); // skillProbabilitys[i].AddProbability(levelThree.Probability(i)); foreach(Skill skill in skills) { skillProbabilitys[i].AddProbability(skill.Probability(i)); } } // skillRect = new Rect((Screen.width - (levelOne.SkillIcon.width * resolutionScale.x)) * 0.5f, levelOne.SkillIcon.height * resolutionScale.y, levelOne.SkillIcon.width * resolutionScale.x, levelOne.SkillIcon.height * resolutionScale.y); skillRect = new Rect((Screen.width - (skills[0].SkillIcon.width * resolutionScale.x)) * 0.5f, skills[0].SkillIcon.height * resolutionScale.y, skills[0].SkillIcon.width * resolutionScale.x, skills[0].SkillIcon.height * resolutionScale.y); }
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); } } } }
void Start () { curentTarget = route.GetChild(0); count = route.childCount; caraicontrol = GetComponent<CarAI>(); caraicontrol.SetTarget(curentTarget); }
public static bool StartPathFind(CarAI carAI, ushort vehicleID, ref Vehicle vehicleData, Vector3 startPos, Vector3 endPos, bool startBothWays, bool endBothWays, RoadManager.VehicleType vehicleType) { VehicleInfo info = carAI.m_info; bool allowUnderground = (vehicleData.m_flags & (Vehicle.Flags.Underground | Vehicle.Flags.Transition)) != Vehicle.Flags.None; 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, NetInfo.LaneType.Vehicle, info.m_vehicleType, allowUnderground, 32f, out startPosA, out startPosB, out num, out num2, vehicleType) && CustomPathManager.FindPathPosition(endPos, ItemClass.Service.Road, NetInfo.LaneType.Vehicle, info.m_vehicleType, false, 32f, out endPosA, out endPosB, out num3, out num4, vehicleType)) { if (!startBothWays || num < 10f) { startPosB = default(PathUnit.Position); } if (!endBothWays || num3 < 10f) { endPosB = default(PathUnit.Position); } 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, NetInfo.LaneType.Vehicle, info.m_vehicleType, 20000f, (carAI as IVehicle).IsHeavyVehicle(), (carAI as IVehicle).IgnoreBlocked(vehicleID, ref vehicleData), false, false, vehicleType); else createPathResult = Singleton<PathManager>.instance.CreatePath(out path, ref Singleton<SimulationManager>.instance.m_randomizer, Singleton<SimulationManager>.instance.m_currentBuildIndex, startPosA, startPosB, endPosA, endPosB, NetInfo.LaneType.Vehicle, info.m_vehicleType, 20000f, (carAI as IVehicle).IsHeavyVehicle(), (carAI as IVehicle).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; }
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; } } } }