private static void k9MainLogic() { suspectVehicle = Game.LocalPlayer.Character.IsInAnyVehicle(false) ? InCar() : OnFoot(); if (!suspectVehicle.Exists()) { Game.DisplaySubtitle("No vehicle detected."); return; } Zones.WorldDistricts currentdistrict = Zones.GetWorldDistrict(Game.LocalPlayer.Character.Position); if (currentdistrict == Zones.WorldDistricts.City) { k9VehicleModel = cityK9VehicleModels.PickRandom(); dogHandlerModel = cityHandlerModels.PickRandom(); } else if (currentdistrict == Zones.WorldDistricts.BlaineCounty) { k9VehicleModel = blaineK9VehicleModels.PickRandom(); dogHandlerModel = blaineHandlerModels.PickRandom(); } else if (currentdistrict == Zones.WorldDistricts.LosSantosCountryside) { k9VehicleModel = lsCountyK9VehicleModels.PickRandom(); dogHandlerModel = lsCountyHandlerModels.PickRandom(); } SpawnPoint sp = SpawnPointExtensions.GetVehicleSpawnPointTowardsPositionWithChecks(suspectVehicle.Position, spawnDistance); k9Vehicle = new Vehicle(k9VehicleModel, sp.Position, sp.Heading); k9Vehicle.IsPersistent = true; dogHandler = new Ped(dogHandlerModel, Vector3.Zero, 0); dogHandler.MakeMissionPed(); dogHandler.WarpIntoVehicle(k9Vehicle, -1); k9 = new Ped(k9Model, Vector3.Zero, 0); k9.MakeMissionPed(); if (k9Vehicle.FreePassengerSeatsCount > 2 && k9Vehicle.GetFreeSeatIndex(1, 2) != null) { k9.WarpIntoVehicle(k9Vehicle, k9Vehicle.GetFreeSeatIndex(1, 2).GetValueOrDefault()); } else { k9.WarpIntoVehicle(k9Vehicle, 0); } k9VehicleBlip = k9Vehicle.AttachBlip(); k9VehicleBlip.Color = System.Drawing.Color.Blue; k9VehicleBlip.Flash(1000, 20000); k9SeatIndex = k9.SeatIndex; driveToPosition(dogHandler, k9Vehicle, suspectVehicle.Position); dogHandler.Tasks.LeaveVehicle(LeaveVehicleFlags.None); k9.Tasks.LeaveVehicle(LeaveVehicleFlags.None).WaitForCompletion(6000); k9OutOfVehicle = k9.Position; dogHandler.Tasks.AchieveHeading(ExtensionMethods.CalculateHeadingTowardsEntity(dogHandler, suspectVehicle)).WaitForCompletion(1000); GameFiber.Wait(1000); k9VehicleBlip.Delete(); inspectVehicle(); dogHandler.Tasks.EnterVehicle(k9Vehicle, 5000, -1).WaitForCompletion(); dogHandler.Dismiss(); k9Vehicle.Dismiss(); }
private static void driveToPosition(Ped driver, Vehicle veh, Vector3 pos) { Ped playerPed = Game.LocalPlayer.Character; int drivingLoopCount = 0; bool transportVanTeleported = false; int waitCount = 0; bool forceCloseSpawn = false; GameFiber.StartNew(delegate { while (!forceCloseSpawn) { GameFiber.Yield(); if (Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownComputerCheck(System.Windows.Forms.Keys.H)) // || Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownComputerCheck(multiTransportKey)) { GameFiber.Sleep(500); if (Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownRightNowComputerCheck(System.Windows.Forms.Keys.H))// || Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownRightNowComputerCheck(multiTransportKey)) { GameFiber.Sleep(500); if (Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownRightNowComputerCheck(System.Windows.Forms.Keys.H))// || Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownRightNowComputerCheck(multiTransportKey)) { forceCloseSpawn = true; } else { Game.DisplayNotification("Hold down the ~b~H ~s~to force a close spawn."); } } } } }); Rage.Task driveToPed = null; NativeFunction.Natives.SET_DRIVER_AGGRESSIVENESS(driver, 0f); NativeFunction.Natives.SET_DRIVER_ABILITY(1f); while (Vector3.Distance(veh.Position, pos) > 35f) { veh.Repair(); if (driveToPed != null && !driveToPed.IsActive) { driveToPed = driver.Tasks.DriveToPosition(pos, MathHelper.ConvertKilometersPerHourToMetersPerSecond(60f), VehicleDrivingFlags.DriveAroundVehicles | VehicleDrivingFlags.DriveAroundObjects | VehicleDrivingFlags.AllowMedianCrossing | VehicleDrivingFlags.YieldToCrossingPedestrians); } GameFiber.Wait(600); waitCount++; //If van isn't moving if (!veh.IsBoat) { if (veh.Speed < 0.2f) { driver.Tasks.PerformDrivingManeuver(veh, VehicleManeuver.ReverseStraight, 700).WaitForCompletion(); drivingLoopCount += 2; driver.Tasks.DriveToPosition(pos, MathHelper.ConvertKilometersPerHourToMetersPerSecond(60f), VehicleDrivingFlags.DriveAroundVehicles | VehicleDrivingFlags.DriveAroundObjects | VehicleDrivingFlags.AllowMedianCrossing | VehicleDrivingFlags.YieldToCrossingPedestrians).WaitForCompletion(100); } if (veh.Speed < 2f) { drivingLoopCount++; } //if van is very far away if ((Vector3.Distance(pos, veh.Position) > spawnDistance + 70f)) { drivingLoopCount++; } //If Van is stuck, relocate it if ((drivingLoopCount == 30) || (drivingLoopCount == 31) || (drivingLoopCount == 32) || (drivingLoopCount == 33)) { SpawnPoint sp = SpawnPointExtensions.GetVehicleSpawnPointTowardsPositionWithChecks(suspectVehicle.Position, spawnDistance); Game.Console.Print("Relocating because k9 was stuck..."); veh.Position = sp; veh.Heading = sp; drivingLoopCount = 34; Game.DisplayHelp("K9 taking too long? Hold down ~b~H ~s~to speed it up.", 5000); } // if van is stuck for a 2nd time or takes too long, spawn it very near to the suspect else if ((drivingLoopCount >= 55) || waitCount >= 90 || forceCloseSpawn) { Game.Console.Print("Relocating to a closer position"); Vector3 SpawnPoint = World.GetNextPositionOnStreet(pos.Around2D(15f)); int waitCounter = 0; while ((SpawnPoint.Z - pos.Z < -3f) || (SpawnPoint.Z - pos.Z > 3f) || (Vector3.Distance(SpawnPoint, pos) > 25f)) { waitCounter++; SpawnPoint = World.GetNextPositionOnStreet(pos.Around2D(15f)); GameFiber.Yield(); if (waitCounter >= 500) { SpawnPoint = pos.Around2D(15f); break; } } veh.Position = SpawnPoint; Vector3 directionFromVehicleToPed = (pos - SpawnPoint); directionFromVehicleToPed.Normalize(); float vehicleHeading = MathHelper.ConvertDirectionToHeading(directionFromVehicleToPed); veh.Heading = vehicleHeading; transportVanTeleported = true; break; } } else { NativeFunction.Natives.REQUEST_COLLISION_AT_COORD(veh.Position.X, veh.Position.Y, veh.Position.Z); NativeFunction.Natives.REQUEST_ADDITIONAL_COLLISION_AT_COORD(veh.Position.X, veh.Position.Y, veh.Position.Z); if (waitCount > 85) { break; } if (veh.Speed < 0.2f) { NativeFunction.Natives.SET_VEHICLE_FORWARD_SPEED(veh, 15f); GameFiber.Wait(700); } } } forceCloseSpawn = true; //park the van int reverseCount = 0; Game.HideHelp(); while ((Vector3.Distance(pos, veh.Position) > 21f) && !transportVanTeleported) { Rage.Task parkNearSuspect = driver.Tasks.DriveToPosition(pos, MathHelper.ConvertKilometersPerHourToMetersPerSecond(30f), VehicleDrivingFlags.DriveAroundVehicles | VehicleDrivingFlags.DriveAroundObjects | VehicleDrivingFlags.AllowMedianCrossing | VehicleDrivingFlags.YieldToCrossingPedestrians); parkNearSuspect.WaitForCompletion(800); transportVanTeleported = false; if (Vector3.Distance(pos, veh.Position) > 75f) { Vector3 SpawnPoint = World.GetNextPositionOnStreet(pos.Around(12f)); veh.Position = SpawnPoint; } if (veh.Speed < 0.2f) { reverseCount++; if (reverseCount == 3) { driver.Tasks.PerformDrivingManeuver(veh, VehicleManeuver.ReverseStraight, 1700).WaitForCompletion(); reverseCount = 0; } } if ((veh.IsBoat && veh.DistanceTo(pos) < 25) || ExtensionMethods.IsPointOnWater(pos)) { break; } } GameFiber.Wait(600); }