From 6bd369845ec778450ae014c3ee364c70c66b9406 Mon Sep 17 00:00:00 2001 From: TheGeneralist <180094941+thegeneralist01@users.noreply.github.com> Date: Sun, 5 Jan 2025 10:44:53 +0100 Subject: [PATCH] Fix vehicles with disappearing drivers --- SceneManager/CollectedPeds/CollectedPed.cs | 28 +++++++-- .../CollectedVehicles/CollectedVehicle.cs | 38 ++++++++++++ SceneManager/EntryPoint.cs | 2 + SceneManager/Paths/Path.cs | 58 ++++++++++--------- SceneManager/SceneManager.csproj | 1 + 5 files changed, 95 insertions(+), 32 deletions(-) create mode 100644 SceneManager/CollectedVehicles/CollectedVehicle.cs diff --git a/SceneManager/CollectedPeds/CollectedPed.cs b/SceneManager/CollectedPeds/CollectedPed.cs index a73d0a7..6860a1b 100644 --- a/SceneManager/CollectedPeds/CollectedPed.cs +++ b/SceneManager/CollectedPeds/CollectedPed.cs @@ -16,6 +16,7 @@ namespace SceneManager.CollectedPeds internal bool Directed { get; set; } = false; internal bool SkipWaypoint { get; private set; } = false; internal bool ReadyForDirectTasks { get; private set; } = true; + internal CollectedVehicle InitialVehicle { get; set; } = null; internal CollectedPed(Ped basePed, Path path, Waypoint waypoint) : base(basePed.Handle) { @@ -286,12 +287,23 @@ namespace SceneManager.CollectedPeds return true; } + public void RemovePedAndVehicleFromPath() + { + if (InitialVehicle != null) + { + Game.LogTrivial("We have the initial vehicle"); + } + Path.DismissPed(v => !v + || (v && v.BoundPed.Handle == this.Handle) + || (v && v.Handle == InitialVehicle.Handle), this, InitialVehicle); + } + internal void Dismiss(Dismiss dismissOption = Utils.Dismiss.FromPath, Path newPath = null) { if(!this) { Game.LogTrivial($"CollectedPed is not valid in Dismiss."); - Path.CollectedPeds.Remove(this); + RemovePedAndVehicleFromPath(); return; } if(Dismissed) @@ -346,14 +358,16 @@ namespace SceneManager.CollectedPeds } if(!this) { - Path.CollectedPeds.Remove(this); + Path.CollectedVehicles.RemoveAll(v => !v || (v && v.BoundPed == this)); + RemovePedAndVehicleFromPath(); return; } if (CurrentVehicle) { CurrentVehicle.Delete(); } - Path.CollectedPeds.Remove(this); + Path.CollectedVehicles.RemoveAll(v => !v || (v && v.BoundPed == this)); + RemovePedAndVehicleFromPath(); } void DismissFromWaypoint() @@ -386,7 +400,8 @@ namespace SceneManager.CollectedPeds if(!this) { Game.LogTrivial($"CollectedPed is not valid in DismissFromPath."); - Path.CollectedPeds.Remove(this); + Path.CollectedVehicles.RemoveAll(v => !v || (v && v.BoundPed == this)); + RemovePedAndVehicleFromPath(); return; } @@ -435,7 +450,7 @@ namespace SceneManager.CollectedPeds LastVehicle.IsSirenSilent = true; } } - Path.CollectedPeds.Remove(this); + RemovePedAndVehicleFromPath(); } //}, "DismissFromPath Fiber"); } @@ -447,7 +462,8 @@ namespace SceneManager.CollectedPeds if (newPath != null) { newPath.CollectedPeds.Add(this); - Path.CollectedPeds.Remove(this); + Path.CollectedVehicles.RemoveAll(v => !v || (v && v.BoundPed == this)); + RemovePedAndVehicleFromPath(); } Tasks.Clear(); } diff --git a/SceneManager/CollectedVehicles/CollectedVehicle.cs b/SceneManager/CollectedVehicles/CollectedVehicle.cs new file mode 100644 index 0000000..a2b2195 --- /dev/null +++ b/SceneManager/CollectedVehicles/CollectedVehicle.cs @@ -0,0 +1,38 @@ +using Rage; +using System.Collections.Generic; +using System.Linq; +using SceneManager.Utils; +using SceneManager.Waypoints; +using SceneManager.Paths; + +namespace SceneManager.CollectedPeds +{ + internal class CollectedVehicle : Vehicle + { + internal CollectedPed BoundPed; + + internal CollectedVehicle(Vehicle baseVehicle, CollectedPed ped) : base(baseVehicle.Handle) + { + Handle = baseVehicle.Handle; + BoundPed = ped; + //GameFiber.StartNew(() => AssignWaypointTasks(), "Task Assignment Fiber"); + } + + public bool OptionalCleanUp() + { + if (!this) return true; + if (!BoundPed + || (BoundPed && (BoundPed.IsDead || !BoundPed.CurrentVehicle || (BoundPed.CurrentVehicle && BoundPed.CurrentVehicle.Handle != Handle)))) + { + if (this.IsOnFire || this.IsDead) + { + this.Repair(); + } + + this.Delete(); + return true; + } + return false; + } + } +} \ No newline at end of file diff --git a/SceneManager/EntryPoint.cs b/SceneManager/EntryPoint.cs index 4dbe239..5cdf56b 100644 --- a/SceneManager/EntryPoint.cs +++ b/SceneManager/EntryPoint.cs @@ -30,7 +30,9 @@ namespace SceneManager Settings.LoadSettings(); GetAssemblyVersion(); MenuManager.InitializeMenus(); + Game.LogTrivial("[DEBUG] After initializing menus."); Hints.DisplayHintsToOpenMenu(); + Game.LogTrivial("[DEBUG] After displaying hints to open the menu."); GameFiber.StartNew(() => UserInput.HandleKeyPress(), "Handle User Input"); diff --git a/SceneManager/Paths/Path.cs b/SceneManager/Paths/Path.cs index ca79d6e..8ddef93 100644 --- a/SceneManager/Paths/Path.cs +++ b/SceneManager/Paths/Path.cs @@ -29,6 +29,7 @@ namespace SceneManager.Paths [XmlArrayItem("Barrier")] public List Barriers { get; set; } = new List(); internal List CollectedPeds { get; } = new List(); + internal List CollectedVehicles { get; } = new List(); internal List BlacklistedVehicles { get; } = new List(); internal Path() @@ -204,40 +205,29 @@ namespace SceneManager.Paths }, "3D Waypoint Line Drawing Fiber"); } - //internal void LoopForVehiclesToBeDismissed() - //{ - // while (PathManager.Paths.Contains(this)) - // { - // foreach (CollectedPed cp in CollectedPeds.Where(x => x && x.CurrentVehicle && (!x.CurrentVehicle.IsDriveable || x.CurrentVehicle.IsUpsideDown || !x.CurrentVehicle.HasDriver))) - // { - // if (cp.CurrentVehicle.HasDriver) - // { - // cp.CurrentVehicle.Driver.Dismiss(); - // } - // cp.CurrentVehicle.Dismiss(); - // } - - // CollectedPeds.RemoveAll(cp => !cp || !cp.CurrentVehicle); - // BlacklistedVehicles.RemoveAll(v => !v); - // GameFiber.Sleep(60000); - // } - //} - internal void CleanupInvalidPedsAndVehicles() { var pedsToDismiss = CollectedPeds.Where(x => x && x.CurrentVehicle && (!x.CurrentVehicle.IsDriveable || x.CurrentVehicle.IsUpsideDown || !x.CurrentVehicle.HasDriver)).ToList(); foreach (CollectedPed cp in pedsToDismiss) { - //if (cp.CurrentVehicle.HasDriver) - //{ - // cp.CurrentVehicle.Driver.Dismiss(); - //} - //cp.CurrentVehicle.Dismiss(); + cp.CurrentVehicle.Dismiss(); cp.Dismiss(); } CollectedPeds.RemoveAll(cp => !cp || !cp.CurrentVehicle); BlacklistedVehicles.RemoveAll(v => !v); + + // Addition: collected vehicles without drivers + //Game.LogTrivial("[DEBUG] Vehicle clean-up."); + foreach(CollectedVehicle veh in CollectedVehicles) + { + if (veh.OptionalCleanUp()) + { + Game.LogTrivial("[DEBUG] Cleaned up a vehicle"); + // Unsure if this is normal code but whatevs + BlacklistedVehicles.RemoveAll(v => v.Handle == veh.Handle); + } + } } internal void LoopWaypointCollection() @@ -290,7 +280,11 @@ namespace SceneManager.Paths lastProcessTime = Game.GameTime; continue; } - CollectedPeds.Add(new CollectedPed(vehicle.Driver, this, waypoint)); + CollectedPed p = new CollectedPed(vehicle.Driver, this, waypoint); + CollectedVehicle v = new CollectedVehicle(vehicle, p); + p.InitialVehicle = v; + CollectedVehicles.Add(v); + CollectedPeds.Add(p); } checksDone++; // Increment the counter inside the vehicle loop @@ -312,6 +306,17 @@ namespace SceneManager.Paths } } + // Remove the ped from the CollectedPeds and its Vehicle from CollectedVehicle arrays + // Not sure what we need this for but it's basically removing the Ped from arrays + // Then, removing the Vehicle and cleaning the vehicle up. + // last arg (for clarity): Collected Ped's InitialVehicle + internal void DismissPed(Predicate vehMatch, CollectedPed collectedPed, CollectedVehicle collectedPedsInitialVehicle) + { + CollectedVehicles.RemoveAll(vehMatch); + CollectedPeds.Remove(collectedPed); + if (collectedPedsInitialVehicle) collectedPedsInitialVehicle.OptionalCleanUp(); + } + internal void Delete() { var pathIndex = Array.IndexOf(PathManager.Paths, this); @@ -329,7 +334,8 @@ namespace SceneManager.Paths foreach (CollectedPed collectedPed in collectedPedsCopy.Where(x => x != null && x && x.CurrentVehicle)) { collectedPed.Dismiss(); - CollectedPeds.Remove(collectedPed); + //CollectedPeds.Remove(collectedPed); + collectedPed.RemovePedAndVehicleFromPath(); } } diff --git a/SceneManager/SceneManager.csproj b/SceneManager/SceneManager.csproj index bf121f6..b36a316 100644 --- a/SceneManager/SceneManager.csproj +++ b/SceneManager/SceneManager.csproj @@ -63,6 +63,7 @@ +