Exemplo n.º 1
0
 public string GetLocalizedWheelTypeName(VehicleWheelType wheelType)
 {
     InputArgument[] arguments = new InputArgument[] { "mod_mnu", 10 };
     if (!Function.Call <bool>(Hash.HAS_THIS_ADDITIONAL_TEXT_LOADED, arguments))
     {
         InputArgument[] argumentArray2 = new InputArgument[] { 10, true };
         Function.Call(Hash.CLEAR_ADDITIONAL_TEXT, argumentArray2);
         InputArgument[] argumentArray3 = new InputArgument[] { "mod_mnu", 10 };
         Function.Call(Hash.REQUEST_ADDITIONAL_TEXT, argumentArray3);
     }
     if (!_wheelNames.ContainsKey(wheelType))
     {
         throw new ArgumentException("Wheel Type is undefined", "wheelType");
     }
     return(!Game.DoesGXTEntryExist(_wheelNames[wheelType].Item1) ? _wheelNames[wheelType].Item2 : Game.GetGXTEntry(_wheelNames[wheelType].Item1));
 }
Exemplo n.º 2
0
 public string GetLocalizedWheelTypeName(VehicleWheelType wheelType)
 {
     if (!Function.Call <bool>(Hash.HAS_THIS_ADDITIONAL_TEXT_LOADED, "mod_mnu", 10))
     {
         Function.Call(Hash.CLEAR_ADDITIONAL_TEXT, 10, true);
         Function.Call(Hash.REQUEST_ADDITIONAL_TEXT, "mod_mnu", 10);
     }
     if (_wheelNames.ContainsKey(wheelType))
     {
         if (Game.DoesGXTEntryExist(_wheelNames[wheelType].Item1))
         {
             return(Game.GetGXTEntry(_wheelNames[wheelType].Item1));
         }
         return(_wheelNames[wheelType].Item2);
     }
     throw new ArgumentException("Wheel Type is undefined", "wheelType");
 }
Exemplo n.º 3
0
 public string GetLocalizedWheelTypeName(VehicleWheelType wheelType)
 {
     if (!API.HasThisAdditionalTextLoaded("mod_mnu", 10))
     {
         API.ClearAdditionalText(10, true);
         API.RequestAdditionalText("mod_mnu", 10);
     }
     if (_wheelNames.ContainsKey(wheelType))
     {
         if (Game.DoesGXTEntryExist(_wheelNames[wheelType].Item1))
         {
             return(Game.GetGXTEntry(_wheelNames[wheelType].Item1));
         }
         return(_wheelNames[wheelType].Item2);
     }
     throw new ArgumentException("Wheel Type is undefined", "wheelType");
 }
Exemplo n.º 4
0
        private static string GetWheelTypeName(VehicleWheelType wheelType)
        {
            var typeNames = new[]
            {
                "CMOD_WHE1_5",
                "CMOD_WHE1_3",
                "CMOD_WHE1_2",
                "CMOD_WHE1_6",
                "CMOD_WHE1_4",
                "CMOD_WHE1_7",
                "CMOD_WHE1_0",
                "CMOD_WHE1_1",
                "CMOD_WHE1_8",
                "CMOD_WHE1_9"
            };

            return(typeNames[(int)wheelType]);
        }
Exemplo n.º 5
0
 public VehicleData(int handle, int hash, Vector3 rotation, Vector3 position, VehicleColor primaryColor, VehicleColor secondaryColor, int health, float engineHealth, float heading, VehicleNeonLight[] neonLights, List <Tuple <VehicleMod, int> > mods, VehicleToggleMod[] toggleMods, VehicleWindowTint windowTint, VehicleWheelType wheelType, Color neonColor, int livery, bool wheels1, bool wheels2)
 {
     Handle         = handle;
     Hash           = hash;
     Rotation       = rotation;
     Position       = position;
     PrimaryColor   = primaryColor;
     SecondaryColor = secondaryColor;
     Health         = health;
     EngineHealth   = engineHealth;
     Heading        = heading;
     NeonLights     = neonLights;
     Mods           = mods;
     ToggleMods     = toggleMods;
     WindowTint     = windowTint;
     WheelType      = wheelType;
     NeonColor      = neonColor;
     Livery         = livery;
     Wheels1        = wheels1;
     Wheels2        = wheels2;
 }
Exemplo n.º 6
0
        public static void InstallRandomMods(this Vehicle vehicle)
        {
            vehicle.Mods.InstallModKit();

            for (int i = 0; i <= 100; i++)
            {
                NativeFunction.CallByName <uint>("SET_VEHICLE_MOD", vehicle, i, Globals.Random.Next(NativeFunction.CallByName <int>("GET_NUM_VEHICLE_MODS", vehicle, i)), false);
            }

            vehicle.Mods.HasTurbo           = Globals.Random.Next(2) == 1;
            vehicle.Mods.HasXenonHeadlights = Globals.Random.Next(2) == 1;
            ToggleMod(vehicle, VehicleModType.TireSmoke, Globals.Random.Next(2) == 1);
            vehicle.SetTyreSmokeColor(Color.FromArgb(MathHelper.GetRandomInteger(1, 255), MathHelper.GetRandomInteger(1, 255), MathHelper.GetRandomInteger(1, 255)));

            VehicleWheelType wheelType = default(VehicleWheelType).GetRandomElement <VehicleWheelType>();

            vehicle.Mods.SetWheelMod(wheelType, Globals.Random.Next(vehicle.Mods.GetWheelModCount(wheelType)), Globals.Random.Next(2) == 1);


            EWindowTint windTint = default(EWindowTint).GetRandomElement <EWindowTint>();

            vehicle.SetWindowsTint(windTint);

            vehicle.SetColors(default(EPaint).GetRandomElement <EPaint>(), default(EPaint).GetRandomElement <EPaint>());

            vehicle.SetExtraColors(default(EPaint).GetRandomElement <EPaint>(), default(EPaint).GetRandomElement <EPaint>());

            foreach (ENeonLights neon in Enum.GetValues(typeof(ENeonLights)))
            {
                vehicle.ToggleNeonLight(neon, Globals.Random.Next(2) == 1);
            }

            vehicle.SetNeonLightsColor(Color.FromArgb(Globals.Random.Next(1, 256), Globals.Random.Next(1, 256), Globals.Random.Next(1, 256)));

            NativeFunction.CallByHash <uint>(0xf40dd601a65f7f19, vehicle, (int)default(EPaint).GetRandomElement <EPaint>()); //_SET_VEHICLE_INTERIOR_COLOUR
            NativeFunction.CallByHash <uint>(0x6089cdf6a57f326c, vehicle, (int)default(EPaint).GetRandomElement <EPaint>()); //_SET_VEHICLE_DASHBOARD_COLOUR
        }
Exemplo n.º 7
0
        private void SpawnAllEntities()
        {
            foreach (Model model in VehicleModels)
            {
                Vector3 vehspawn;
                float   vehheading;
                if (Vehicles.Count == 0)
                {
                    vehspawn = SpawnPoint; vehheading = SpawnHeading;
                }
                else
                {
                    vehspawn   = Vehicles[Vehicles.Count - 1].GetOffsetPosition(Vector3.RelativeBack * 6f);
                    vehheading = Vehicles[Vehicles.Count - 1].Heading;
                }
                Vehicle veh = new Vehicle(model, vehspawn, vehheading);
                veh.MakePersistent();
                int randomNumber = AssortedCalloutsHandler.rnd.Next(4);

                if (randomNumber == 0)
                {
                    veh.Mods.InstallModKit();
                    veh.Mods.ApplyAllMods();
                }
                else
                {
                    veh.Mods.InstallModKit();

                    veh.Mods.EngineModIndex = veh.Mods.EngineModCount - 1;

                    veh.Mods.ExhaustModIndex = veh.Mods.ExhaustModCount - 1;

                    veh.Mods.TransmissionModIndex = veh.Mods.TransmissionModCount - 1;

                    VehicleWheelType wheelType = MathHelper.Choose(VehicleWheelType.Sport, VehicleWheelType.SUV, VehicleWheelType.HighEnd);
                    int wheelModIndex          = MathHelper.GetRandomInteger(veh.Mods.GetWheelModCount(wheelType));
                    veh.Mods.SetWheelMod(wheelType, wheelModIndex, true);

                    veh.Mods.HasTurbo = true;

                    veh.Mods.HasXenonHeadlights = true;
                }
                Ped driver = veh.CreateRandomDriver();
                driver.MakeMissionPed();

                if (Suspects.Count == 0)
                {
                    driver.Tasks.CruiseWithVehicle(veh, 80f, VehicleDrivingFlags.Emergency);
                }
                else
                {
                    Rage.Native.NativeFunction.Natives.TASK_VEHICLE_CHASE(driver, Suspects[0]);
                    Rage.Native.NativeFunction.Natives.SET_TASK_VEHICLE_CHASE_BEHAVIOR_FLAG(driver, 32, 1);
                    Rage.Native.NativeFunction.Natives.SET_TASK_VEHICLE_CHASE_IDEAL_PURSUIT_DISTANCE(driver, 20f);
                }
                NativeFunction.Natives.SET_VEHICLE_FORWARD_SPEED(veh, 9f);
                GameFiber.Wait(1000);
                Vehicles.Add(veh);
                Suspects.Add(driver);
                //SuspectBlips.Add(driver.AttachBlip());
            }
        }
        public void SaveVehicle(Vehicle vehicle)
        {
            if (this._vehicleCollection == null)
            {
                this.Deserialize();
            }
            VehicleData vehicleData = this._vehicleCollection.ToList <VehicleData>().Find((Predicate <VehicleData>)(v => v.Handle == ((Entity)vehicle).get_Handle()));

            if (vehicleData != null)
            {
                PlayerVehicles.UpdateDataSpecific(vehicleData, vehicle);
                this.Serialize(true);
            }
            else
            {
                // ISSUE: method pointer
                VehicleNeonLight[] array1            = ((IEnumerable <VehicleNeonLight>)Enumerable.Where <VehicleNeonLight>((IEnumerable <M0>)Enum.GetValues(typeof(VehicleNeonLight)), (Func <M0, bool>) new Func <VehicleNeonLight, bool>((object)vehicle, __methodptr(IsNeonLightsOn)))).ToArray <VehicleNeonLight>();
                VehicleMod[]       values            = (VehicleMod[])Enum.GetValues(typeof(VehicleMod));
                List <Tuple <VehicleMod, int> > mods = new List <Tuple <VehicleMod, int> >();
                ((IEnumerable <VehicleMod>)values).ToList <VehicleMod>().ForEach((Action <VehicleMod>)(h =>
                {
                    int mod = vehicle.GetMod(h);
                    if (mod == -1)
                    {
                        return;
                    }
                    mods.Add(new Tuple <VehicleMod, int>(h, mod));
                }));
                // ISSUE: method pointer
                VehicleToggleMod[] array2             = ((IEnumerable <VehicleToggleMod>)Enumerable.Where <VehicleToggleMod>((IEnumerable <M0>)Enum.GetValues(typeof(VehicleToggleMod)), (Func <M0, bool>) new Func <VehicleToggleMod, bool>((object)vehicle, __methodptr(IsToggleModOn)))).ToArray <VehicleToggleMod>();
                int                handle             = ((Entity)vehicle).get_Handle();
                Model              model              = ((Entity)vehicle).get_Model();
                int                hash               = ((Model) ref model).get_Hash();
                Vector3            rotation           = ((Entity)vehicle).get_Rotation();
                Vector3            position           = ((Entity)vehicle).get_Position();
                VehicleColor       primaryColor       = vehicle.get_PrimaryColor();
                VehicleColor       secondaryColor     = vehicle.get_SecondaryColor();
                int                health             = ((Entity)vehicle).get_Health();
                double             engineHealth       = (double)vehicle.get_EngineHealth();
                double             heading            = (double)((Entity)vehicle).get_Heading();
                VehicleNeonLight[] neonLights         = array1;
                List <Tuple <VehicleMod, int> > mods1 = mods;
                VehicleToggleMod[] toggleMods         = array2;
                VehicleWindowTint  windowTint         = vehicle.get_WindowTint();
                VehicleWheelType   wheelType          = vehicle.get_WheelType();
                Color neonLightsColor = vehicle.get_NeonLightsColor();
                M0    m0_1            = Function.Call <int>((Hash)3150587921134411402L, new InputArgument[1]
                {
                    InputArgument.op_Implicit(((Entity)vehicle).get_Handle())
                });
                M0 m0_2 = Function.Call <bool>((Hash) - 5507252750051666468L, new InputArgument[2]
                {
                    InputArgument.op_Implicit(((Entity)vehicle).get_Handle()),
                    InputArgument.op_Implicit(23)
                });
                M0 m0_3 = Function.Call <bool>((Hash) - 5507252750051666468L, new InputArgument[2]
                {
                    InputArgument.op_Implicit(((Entity)vehicle).get_Handle()),
                    InputArgument.op_Implicit(24)
                });
                this._vehicleCollection.Add(new VehicleData(handle, hash, rotation, position, primaryColor, secondaryColor, health, (float)engineHealth, (float)heading, neonLights, mods1, toggleMods, windowTint, wheelType, neonLightsColor, (int)m0_1, (bool)m0_2, (bool)m0_3));
                this._vehicles.Add(vehicle);
                ((Entity)vehicle).set_IsPersistent(true);
                new EntityEventWrapper((Entity)vehicle).Died += new EntityEventWrapper.OnDeathEvent(this.WrapperOnDied);
                PlayerVehicles.AddBlipToVehicle(vehicle);
            }
        }
            // TODO: Only check what's valid for a vehicle model once (i.e. save into a Dictionary with Model key)
            public override void Refresh()
            {
                _menuItems.Clear();
                if (serviceVehicle != null)
                {
                    try
                    {
                        //Log.Debug($"X {VehicleHashNames.Count()}");
                        VehicleColor     primaryColor     = serviceVehicle.Mods.PrimaryColor;
                        VehicleColor     secondaryColor   = serviceVehicle.Mods.SecondaryColor;
                        VehicleColor     pearlescentColor = serviceVehicle.Mods.PearlescentColor;
                        VehicleColor     RimColor         = serviceVehicle.Mods.RimColor;
                        VehicleWheelType WheelType        = (VehicleWheelType)Function.Call <int>(Hash.GET_VEHICLE_WHEEL_TYPE, serviceVehicle.Handle);
                        int LiveryCount = serviceVehicle.Mods.LiveryCount;
                        int Livery      = serviceVehicle.Mods.Livery;

                        // R/G/B selection?
                        //System.Drawing.Color NeonLightsColor = vehicle.Mods.NeonLightsColor;

                        // Do we even want this one?
                        //LicensePlateStyle LicensePlateStyle = vehicle.Mods.LicensePlateStyle;

                        // I have gotten several requests not to implement tire smoke (realism level -150)
                        //Log.Debug($"{selectedVehicleIndex}");
                        VehicleMod[] AllMods = serviceVehicle.Mods.GetAllMods();
                        _menuItems.Add(new MenuItemHorNamedSelector
                        {
                            Title       = "Vehicle",
                            Description = "Activate to replace your current vehicle.",
                            state       = selectedVehicleIndex,
                            Type        = MenuItemHorizontalSelectorType.NumberAndBar,
                            wrapAround  = true,
                            optionList  = VehicleHashNames,
                            OnChange    = (selectedAlternative, selName, item) => { selectedVehicleIndex = (item as MenuItemHorNamedSelector).state; },
                            OnActivate  = new Action <int, string, MenuItemHorNamedSelector>(async(selectedAlternative, selName, menuItem) => { await ReplaceCurrentVehicleByIndex(selectedAlternative); })
                        });
                        if (LiveryCount != -1)
                        {
                            if (Livery == -1)
                            {
                                serviceVehicle.Mods.Livery = 1;
                            }
                            _menuItems.Add(new MenuItemHorSelector <int>
                            {
                                Title              = $@"Livery",
                                state              = selectedLivery,
                                Type               = MenuItemHorizontalSelectorType.NumberAndBar,
                                wrapAround         = true,
                                minState           = 1,
                                maxState           = LiveryCount,
                                overrideDetailWith = serviceVehicle.Mods.LocalizedLiveryName != "" ? $"{serviceVehicle.Mods.LocalizedLiveryName}" : "",
                                OnChange           = new Action <int, MenuItemHorSelector <int> >((selectedAlternative, menuItem) => { serviceVehicle.Mods.Livery = selectedAlternative; selectedLivery = selectedAlternative; })
                            });
                        }
                        _menuItems.Add(new MenuItemHorNamedSelector
                        {
                            Title      = $"Primary Color",
                            state      = VehicleColorValues.Contains(primaryColor) ? VehicleColorValues.IndexOf(primaryColor) : 0,
                            Type       = MenuItemHorizontalSelectorType.NumberAndBar,
                            wrapAround = true,
                            optionList = VehicleColorNames,
                            OnChange   = new Action <int, string, MenuItemHorNamedSelector>(async(selectedAlternative, selName, menuItem) => { await SetColorByIndex(selectedAlternative, 0); })
                        });
                        _menuItems.Add(new MenuItemHorNamedSelector
                        {
                            Title      = $"Secondary Color",
                            state      = VehicleColorValues.Contains(secondaryColor) ? VehicleColorValues.IndexOf(secondaryColor) : 0,
                            Type       = MenuItemHorizontalSelectorType.NumberAndBar,
                            wrapAround = true,
                            optionList = VehicleColorNames,
                            OnChange   = new Action <int, string, MenuItemHorNamedSelector>(async(selectedAlternative, selName, menuItem) => { await SetColorByIndex(selectedAlternative, 1); })
                        });
                        _menuItems.Add(new MenuItemHorNamedSelector
                        {
                            Title      = $"Pearlescent Color",
                            state      = VehicleColorValues.Contains(pearlescentColor) ? VehicleColorValues.IndexOf(pearlescentColor) : 0,
                            Type       = MenuItemHorizontalSelectorType.NumberAndBar,
                            wrapAround = true,
                            optionList = VehicleColorNames,
                            OnChange   = new Action <int, string, MenuItemHorNamedSelector>(async(selectedAlternative, selName, menuItem) => { await SetColorByIndex(selectedAlternative, 2); })
                        });
                        _menuItems.Add(new MenuItemHorNamedSelector
                        {
                            Title      = $"Rim Color",
                            state      = VehicleColorValues.Contains(RimColor) ? VehicleColorValues.IndexOf(RimColor) : 0,
                            Type       = MenuItemHorizontalSelectorType.NumberAndBar,
                            wrapAround = true,
                            optionList = VehicleColorNames,
                            OnChange   = new Action <int, string, MenuItemHorNamedSelector>(async(selectedAlternative, selName, menuItem) => { await SetColorByIndex(selectedAlternative, 3); })
                        });
                        var allowedWheelTypes = serviceVehicle.Mods.AllowedWheelTypes.ToList();
                        if (allowedWheelTypes.Contains(VehicleWheelType.HighEnd))
                        {
                            allowedWheelTypes.Remove(VehicleWheelType.HighEnd);                                                       // Removing for now, seems to not want to set this
                        }
                        // Wheel Types not a thing for bikes I believe; real and front wheel already a mod category
                        if (serviceVehicle.Model.IsCar && allowedWheelTypes.Count() > 0)
                        {
                            _menuItems.Add(new MenuItemHorNamedSelector
                            {
                                Title      = $"Wheel Type",
                                state      = allowedWheelTypes.ToList().Contains(WheelType) ? (int)WheelType : (int)allowedWheelTypes[0],
                                Type       = MenuItemHorizontalSelectorType.NumberAndBar,
                                wrapAround = true,
                                optionList = allowedWheelTypes.Select(i => $"{i}").ToList(),
                                OnChange   = new Action <int, string, MenuItemHorNamedSelector>((selectedAlternative, selName, menuItem) => { serviceVehicle.Mods.WheelType = (VehicleWheelType)selectedAlternative; serviceVehicle.Mods[VehicleModType.FrontWheel].Index = 0; })
                            });
                        }
                        AllMods.Where(m => m.ModType != VehicleModType.Engine && m.ModType != VehicleModType.Transmission && m.ModType != VehicleModType.Brakes).ToList().ForEach(m =>
                        {
                            try
                            {
                                _menuItems.Add(new MenuItemHorSelector <int>
                                {
                                    Title              = $@"{m.LocalizedModTypeName}",
                                    state              = (m.Index >= -1 && m.Index <= m.ModCount - 1) ? m.Index : 0,
                                    Type               = MenuItemHorizontalSelectorType.NumberAndBar,
                                    wrapAround         = true,
                                    minState           = -1,
                                    maxState           = m.ModCount - 1,
                                    overrideDetailWith = m.LocalizedModName,
                                    OnChange           = new Action <int, MenuItemHorSelector <int> >((selectedAlternative, menuItem) => { m.Index = selectedAlternative; })
                                });
                                if (m.ModType == VehicleModType.FrontWheel)
                                {
                                    _menuItems.Add(new MenuItemCheckbox
                                    {
                                        Title       = $"Special Tire Variation",
                                        Description = "This will only work for some wheels.",
                                        state       = m.Variation,
                                        OnActivate  = new Action <bool, MenuItemCheckbox>((selectedAlternative, menuItem) => { m.Variation = selectedAlternative; })
                                    });
                                }
                            }
                            catch (Exception ex)
                            {
                                Log.Error($"[COPVEHICLEMENU] Exception in vehicle mods code; {ex.Message}");
                            }
                        });

                        // Yes, there are this many extra indices
                        // TODO: Save these for each vehicle after iterating once; this is the first iteration
                        // No performance hit on my own PC though
                        Enumerable.Range(0, 50).ToList().ForEach(i =>
                        {
                            try
                            {
                                if (Function.Call <bool>(Hash.DOES_EXTRA_EXIST, serviceVehicle.Handle, i))
                                {
                                    _menuItems.Add(new MenuItemCheckbox
                                    {
                                        Title      = $"Extra #{i + 1}",
                                        state      = Function.Call <bool>(Hash.IS_VEHICLE_EXTRA_TURNED_ON, serviceVehicle.Handle, i),
                                        OnActivate = new Action <bool, MenuItemCheckbox>((selectedAlternative, menuItem) => { Function.Call(Hash.SET_VEHICLE_EXTRA, serviceVehicle.Handle, i, selectedAlternative ? 0 : -1); })
                                    });
                                }
                            }
                            catch (Exception ex)
                            {
                                Log.Error($"[COPVEHICLEMENU] Exception in extras code; {ex.Message}");
                            }
                        });
                        int firstVisibleItem = visibleItems.IndexOf(menuItems.First());
                        int lastVisibleItem  = visibleItems.IndexOf(menuItems.Last());
                        visibleItems = _menuItems.Slice(firstVisibleItem, lastVisibleItem);
                        //if (lastVisibleItem - firstVisibleItem >= _menuItems.Count)
                        //    visibleItems = _menuItems;
                        //else
                        //{
                        //    visibleItems = _menuItems.Slice(firstVisibleItem, firstVisibleItem + Math.Min(Math.Max(lastVisibleItem - firstVisibleItem, _menuItems.Count - 1 - firstVisibleItem), numVisibleItems));
                        //}

                        menuItems     = _menuItems;
                        SelectedIndex = SelectedIndex; // refreshes state
                    }
                    catch (Exception ex)
                    {
                        Log.Error($"[COPVEHICLEMENU] Outer exception {ex.Message}");
                    }
                }
                else
                {
                    if (!currentlySelectedVehicleOnFoot.IsBetween(0, VehicleHashValues.Count - 1))
                    {
                        currentlySelectedVehicleOnFoot = 0;
                    }
                    _menuItems.Add(new MenuItemHorNamedSelector
                    {
                        Title       = $"Spawn Vehicle",
                        Description = "Activate to spawn vehicle.",
                        state       = currentlySelectedVehicleOnFoot,
                        Type        = MenuItemHorizontalSelectorType.NumberAndBar,
                        wrapAround  = true,
                        optionList  = VehicleHashNames,
                        OnChange    = new Action <int, string, MenuItemHorNamedSelector>((selectedAlternative, selName, menuItem) => { selectedVehicleIndex = currentlySelectedVehicleOnFoot = selectedAlternative; }),
                        OnActivate  = new Action <int, string, MenuItemHorNamedSelector>(async(selectedAlternative, selName, menuItem) => { await ReplaceCurrentVehicleByIndex(selectedAlternative); })
                    });
                    menuItems     = _menuItems;
                    SelectedIndex = SelectedIndex; // refreshes state
                }
            }
Exemplo n.º 10
0
        /// <summary>
        /// Having a method with the same name as the class calls this method when the class is created
        /// </summary>
        public StreetRace(bool createBlip, bool showMessage) : base(showMessage, "Creating street race event.")
        {
            SpawnPoint = World.GetNextPositionOnStreet(Game.LocalPlayer.Character.Position.Around2D(100f));
            while (Vector3.Distance(Game.LocalPlayer.Character.Position, SpawnPoint) < 90f)
            {
                GameFiber.Yield();
                SpawnPoint = World.GetNextPositionOnStreet(Game.LocalPlayer.Character.Position.Around2D(100f));
            }

            drvPed1 = new Ped(SpawnPoint);

            Vector3 directionFromVehicleToPed = (Game.LocalPlayer.Character.Position - drvPed1.Position);

            directionFromVehicleToPed.Normalize();

            float heading = MathHelper.ConvertDirectionToHeading(directionFromVehicleToPed);

            drvPed1.Heading = heading;

            SpawnPoint1     = drvPed1.GetOffsetPosition(Vector3.RelativeBack * 10f);
            drvPed2         = new Ped(SpawnPoint1);
            drvPed2.Heading = drvPed1.Heading;
            drvPed1.BlockPermanentEvents = true;
            drvPed2.BlockPermanentEvents = true;
            drvPed1.IsPersistent         = true;
            drvPed2.IsPersistent         = true;

            vehRacer1              = new Vehicle(carModels1[MathHelper.GetRandomInteger(carModels1.Length - 1)], SpawnPoint);
            vehRacer1.Heading      = drvPed1.Heading;
            vehRacer1.IsPersistent = true;
            vehRacer1.RandomiseLicencePlate();

            if (vehRacer1.Exists())
            {
                Random rnd = new Random();

                int randomNumber = rnd.Next(4);

                if (randomNumber == 1)
                {
                    vehRacer1.Mods.InstallModKit();
                    vehRacer1.Mods.ApplyAllMods();
                }
                else
                {
                    vehRacer1.Mods.InstallModKit();

                    vehRacer1.Mods.EngineModIndex = vehRacer1.Mods.EngineModCount - 1;

                    vehRacer1.Mods.ExhaustModIndex = vehRacer1.Mods.ExhaustModCount - 1;

                    vehRacer1.Mods.TransmissionModIndex = vehRacer1.Mods.TransmissionModCount - 1;

                    VehicleWheelType wheelType = MathHelper.Choose(VehicleWheelType.Sport, VehicleWheelType.SUV, VehicleWheelType.HighEnd);
                    int wheelModIndex          = MathHelper.GetRandomInteger(vehRacer1.Mods.GetWheelModCount(wheelType));
                    vehRacer1.Mods.SetWheelMod(wheelType, wheelModIndex, true);

                    vehRacer1.Mods.HasTurbo = true;

                    vehRacer1.Mods.HasXenonHeadlights = true;
                }
            }


            vehRacer2              = new Vehicle(carModels2[MathHelper.GetRandomInteger(carModels2.Length - 1)], SpawnPoint1);
            vehRacer2.Heading      = drvPed2.Heading;
            vehRacer2.IsPersistent = true;
            vehRacer2.RandomiseLicencePlate();
            if (vehRacer2.Exists())
            {
                Random rnd = new Random();

                int randomNumber = rnd.Next(4);

                if (randomNumber == 1)
                {
                    vehRacer2.Mods.InstallModKit();
                    vehRacer2.Mods.ApplyAllMods();
                }
                else
                {
                    vehRacer2.Mods.InstallModKit();

                    vehRacer2.Mods.EngineModIndex = vehRacer2.Mods.EngineModCount - 1;


                    vehRacer2.Mods.ExhaustModIndex = vehRacer2.Mods.ExhaustModCount - 1;

                    vehRacer2.Mods.TransmissionModIndex = vehRacer2.Mods.TransmissionModCount - 1;

                    VehicleWheelType wheelType = MathHelper.Choose(VehicleWheelType.Sport, VehicleWheelType.SUV, VehicleWheelType.HighEnd);
                    int wheelModIndex          = MathHelper.GetRandomInteger(vehRacer2.Mods.GetWheelModCount(wheelType));
                    vehRacer2.Mods.SetWheelMod(wheelType, wheelModIndex, true);

                    vehRacer2.Mods.HasTurbo = true;

                    vehRacer2.Mods.HasXenonHeadlights = true;
                }
            }
            if (createBlip)
            {
                drvBlip1       = drvPed1.AttachBlip();
                drvBlip1.Color = System.Drawing.Color.Beige;
                drvBlip1.Scale = 0.7f;

                drvBlip2       = drvPed2.AttachBlip();
                drvBlip2.Color = System.Drawing.Color.Beige;
                drvBlip2.Scale = 0.7f;
            }


            MainLogic();
        }