From 772e618628763bf228ed4de5e971a9dd9711448b Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 11 Oct 2020 15:00:08 -0600 Subject: [PATCH] Fixed vehicles not being directed from paths/stop waypoints correctly --- SceneManager/AITasking.cs | 44 ++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index f12b8b9..c6c973b 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -16,6 +16,9 @@ namespace SceneManager return; } + collectedVehicle.Path = path; + collectedVehicle.CurrentWaypoint = currentWaypoint; + if (currentWaypoint != null && collectedVehicle.Directed) { float acceptedDistance = GetAcceptedStoppingDistance(path.Waypoints, path.Waypoints.IndexOf(currentWaypoint)); @@ -23,10 +26,24 @@ namespace SceneManager { GameFiber.Yield(); } + if (collectedVehicle.StoppedAtWaypoint) + { + Logger.Log($"Unstucking {collectedVehicle.Vehicle.Model.Name}"); + collectedVehicle.StoppedAtWaypoint = false; + Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, 0f, 1, true); + collectedVehicle.Driver.Tasks.CruiseWithVehicle(5f); + } + collectedVehicle.Driver.Tasks.Clear(); AssignTasksForDirectedDriver(acceptedDistance); LoopWhileDrivingToDirectedWaypoint(acceptedDistance); - collectedVehicle.Directed = false; - Logger.Log($"{collectedVehicle.Vehicle.Model.Name} directed task is complete, directed is now false"); + if(collectedVehicle != null) + { + collectedVehicle.Directed = false; + } + if (collectedVehicle.Vehicle) + { + Logger.Log($"{collectedVehicle.Vehicle.Model.Name} directed task is complete, directed is now false"); + } } if (currentWaypoint.IsStopWaypoint) @@ -38,16 +55,12 @@ namespace SceneManager DriveVehicleToNextWaypoint(collectedVehicle, path, currentWaypoint); } - if (!VehicleAndDriverAreValid(collectedVehicle)) + if (!VehicleAndDriverAreValid(collectedVehicle) || collectedVehicle.Directed) { return; } Logger.Log($"{collectedVehicle.Vehicle.Model.Name} all Path {path.Number} tasks complete."); - if (collectedVehicle.Directed) - { - collectedVehicle.Dismiss(DismissOption.FromDirect); - } - else if(!collectedVehicle.Dismissed) + if(!collectedVehicle.Dismissed) { collectedVehicle.Dismiss(); } @@ -57,7 +70,7 @@ namespace SceneManager //Logger.Log($"{collectedVehicle.Vehicle.Model.Name} distance to collection waypoint: {collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position)}"); Logger.Log($"{collectedVehicle.Vehicle.Model.Name} is driving to path {currentWaypoint.Path.Number} waypoint {currentWaypoint.Number} (directed)"); - Logger.Log($"{collectedVehicle.Vehicle.Model.Name} Dismissed: {collectedVehicle.Dismissed}, Directed: {collectedVehicle.SkipWaypoint}"); + Logger.Log($"{collectedVehicle.Vehicle.Model.Name} Dismissed: {collectedVehicle.Dismissed}, Directed: {collectedVehicle.Directed}"); collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)currentWaypoint.DrivingFlagType, acceptedDistance); } @@ -83,9 +96,11 @@ namespace SceneManager var driver = vehicle.Driver; Logger.Log($"Preparing to run task loop for {collectedVehicle.Vehicle.Model.Name} on path {path.Number}"); + Logger.Log($"Current path: {collectedVehicle.Path.Number}, Current waypoint: {collectedVehicle.CurrentWaypoint.Number}"); for (int currentWaypointTask = currentWaypoint.Number; currentWaypointTask < path.Waypoints.Count; currentWaypointTask++) { - //Logger.Log($"{collectedVehicle.Vehicle.Model.Name} in the task loop"); + Logger.Log($"{collectedVehicle.Vehicle.Model.Name} in the task loop"); + Logger.Log($"Dismissed: {collectedVehicle.Dismissed}, Directed: {collectedVehicle.Directed}, StoppedAtWaypoint: {collectedVehicle.StoppedAtWaypoint}"); collectedVehicle.SkipWaypoint = false; if (collectedVehicle == null || collectedVehicle.Dismissed || collectedVehicle.Directed) @@ -96,6 +111,7 @@ namespace SceneManager if(collectedVehicle.Driver == null || !collectedVehicle.Vehicle.HasDriver || !collectedVehicle.Driver.IsAlive) { Logger.Log($"{vehicle.Model.Name} does not have a driver/driver is null or driver is dead."); + return; } if (path.Waypoints.ElementAtOrDefault(currentWaypointTask) != null && !collectedVehicle.StoppedAtWaypoint) @@ -120,12 +136,12 @@ namespace SceneManager continue; } - if (!collectedVehicle.Dismissed && path.Waypoints.ElementAtOrDefault(currentWaypointTask) != null && path.Waypoints[currentWaypointTask].IsStopWaypoint) + if (!collectedVehicle.Dismissed && !collectedVehicle.Directed && path.Waypoints.ElementAtOrDefault(currentWaypointTask) != null && path.Waypoints[currentWaypointTask].IsStopWaypoint) { StopVehicleAtWaypoint(path.Waypoints[currentWaypointTask], collectedVehicle); } - if (!VehicleAndDriverAreValid(collectedVehicle) || collectedVehicle.Dismissed) + if (!VehicleAndDriverAreValid(collectedVehicle) || collectedVehicle.Dismissed || collectedVehicle.Directed) { return; } @@ -141,7 +157,7 @@ namespace SceneManager void LoopWhileDrivingToWaypoint(int nextWaypoint, float acceptedDistance) { - while (VehicleAndDriverAreValid(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && path.Waypoints.ElementAtOrDefault(nextWaypoint) != null && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(path.Waypoints[nextWaypoint].Position) > acceptedDistance) + while (VehicleAndDriverAreValid(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && !collectedVehicle.Directed && path.Waypoints.ElementAtOrDefault(nextWaypoint) != null && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(path.Waypoints[nextWaypoint].Position) > acceptedDistance) { //Logger.Log($"Looping while {vehicle.Model.Name} drives to waypoint."); GameFiber.Sleep(100); @@ -195,7 +211,7 @@ namespace SceneManager } var stoppingDistance = GetAcceptedStoppingDistance(currentWaypoint.Path.Waypoints, currentWaypoint.Path.Waypoints.IndexOf(currentWaypoint)); - Logger.Log($"{collectedVehicle.Vehicle.Model.Name} stopping at waypoint."); + Logger.Log($"{collectedVehicle.Vehicle.Model.Name} stopping at path {currentWaypoint.Path.Number} waypoint."); Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, stoppingDistance, -1, true); collectedVehicle.StoppedAtWaypoint = true;