Пример #1
0
        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);
        }
Пример #2
0
    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());
    }
Пример #3
0
        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());
        }
Пример #4
0
 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;
     }
 }
Пример #5
0
    //    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);
        }
    }
Пример #6
0
    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);
            }
        }
    }
Пример #7
0
    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);
                }
            }
        }
    }
Пример #8
0
 void Start()
 {
     curentTarget = route.GetChild(0);
     count        = route.childCount;
     caraicontrol = GetComponent <CarAI>();
     caraicontrol.SetTarget(curentTarget);
 }
Пример #9
0
    void AddCar()
    {
        CarAI car = carPool.Take <CarAI>();

        activeCars.Add(car);
        car.gameObject.SetActive(true);
    }
Пример #10
0
    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;
    }
Пример #11
0
    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;
        }
    }
Пример #12
0
 private void RemoveCar(CarAI car)
 {
     if (car == currentCar)
     {
         currentCar = null;
     }
 }
Пример #13
0
    private void OnCollisionEnter2D(Collision2D other)
    {
        CarAI c = other.transform.GetComponent <CarAI>();

        if (c != null)
        {
            c.TellMngerDied();
        }
    }
Пример #14
0
    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;
        }
    }
Пример #15
0
 private void Update()
 {
     if (currentCar == null)
     {
         if (trafficQueue.Count > 0)
         {
             currentCar      = trafficQueue.Dequeue();
             currentCar.Stop = false;
         }
     }
 }
Пример #16
0
 void OnTriggerStay2D(Collider2D other)
 {
     if (other.tag == "Enemy")
     {
         CarAI ai = other.GetComponent <CarAI>();
         if (ai != null)
         {
             other.GetComponent <CarAI>().GoToNext(nextWP);
         }
     }
 }
Пример #17
0
 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();
         }
     }
 }
Пример #18
0
        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);
        }
Пример #19
0
    // 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];
    }
Пример #20
0
    //충돌한 차를 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 리스폰
    }
Пример #21
0
    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));
    }
Пример #22
0
 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;
    }
Пример #24
0
    /// <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);
    }
Пример #25
0
    // 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;
        }
    }
Пример #27
0
        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);
        }
Пример #28
0
    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;
                }
            }
        }
    }
Пример #29
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()));
         }
     }
 }
Пример #30
0
    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);
        }
    }
Пример #31
0
        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);
        }
Пример #32
0
    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>();
    }
Пример #33
0
        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);
                    }
                }
            }
        }
Пример #34
0
    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);
    }
Пример #35
0
 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);
             }
         }
     }
 }
Пример #36
0
	void Start () {
        curentTarget = route.GetChild(0);
        count = route.childCount;
        caraicontrol = GetComponent<CarAI>();
        caraicontrol.SetTarget(curentTarget);
	}
Пример #37
0
 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;
 }
Пример #38
0
 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;
             }
         }
     }
 }