1
Fork 0
mirror of https://github.com/thegeneralist01/Scene-Manager-DevRepo synced 2026-01-11 07:30:40 +01:00

Fix vehicles with disappearing drivers

This commit is contained in:
TheGeneralist 2025-01-05 10:44:53 +01:00
parent b6131c0b0e
commit 6bd369845e
No known key found for this signature in database
GPG key ID: C391D4D52D630F45
5 changed files with 95 additions and 32 deletions

View file

@ -16,6 +16,7 @@ namespace SceneManager.CollectedPeds
internal bool Directed { get; set; } = false; internal bool Directed { get; set; } = false;
internal bool SkipWaypoint { get; private set; } = false; internal bool SkipWaypoint { get; private set; } = false;
internal bool ReadyForDirectTasks { get; private set; } = true; internal bool ReadyForDirectTasks { get; private set; } = true;
internal CollectedVehicle InitialVehicle { get; set; } = null;
internal CollectedPed(Ped basePed, Path path, Waypoint waypoint) : base(basePed.Handle) internal CollectedPed(Ped basePed, Path path, Waypoint waypoint) : base(basePed.Handle)
{ {
@ -286,12 +287,23 @@ namespace SceneManager.CollectedPeds
return true; 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) internal void Dismiss(Dismiss dismissOption = Utils.Dismiss.FromPath, Path newPath = null)
{ {
if(!this) if(!this)
{ {
Game.LogTrivial($"CollectedPed is not valid in Dismiss."); Game.LogTrivial($"CollectedPed is not valid in Dismiss.");
Path.CollectedPeds.Remove(this); RemovePedAndVehicleFromPath();
return; return;
} }
if(Dismissed) if(Dismissed)
@ -346,14 +358,16 @@ namespace SceneManager.CollectedPeds
} }
if(!this) if(!this)
{ {
Path.CollectedPeds.Remove(this); Path.CollectedVehicles.RemoveAll(v => !v || (v && v.BoundPed == this));
RemovePedAndVehicleFromPath();
return; return;
} }
if (CurrentVehicle) if (CurrentVehicle)
{ {
CurrentVehicle.Delete(); CurrentVehicle.Delete();
} }
Path.CollectedPeds.Remove(this); Path.CollectedVehicles.RemoveAll(v => !v || (v && v.BoundPed == this));
RemovePedAndVehicleFromPath();
} }
void DismissFromWaypoint() void DismissFromWaypoint()
@ -386,7 +400,8 @@ namespace SceneManager.CollectedPeds
if(!this) if(!this)
{ {
Game.LogTrivial($"CollectedPed is not valid in DismissFromPath."); Game.LogTrivial($"CollectedPed is not valid in DismissFromPath.");
Path.CollectedPeds.Remove(this); Path.CollectedVehicles.RemoveAll(v => !v || (v && v.BoundPed == this));
RemovePedAndVehicleFromPath();
return; return;
} }
@ -435,7 +450,7 @@ namespace SceneManager.CollectedPeds
LastVehicle.IsSirenSilent = true; LastVehicle.IsSirenSilent = true;
} }
} }
Path.CollectedPeds.Remove(this); RemovePedAndVehicleFromPath();
} }
//}, "DismissFromPath Fiber"); //}, "DismissFromPath Fiber");
} }
@ -447,7 +462,8 @@ namespace SceneManager.CollectedPeds
if (newPath != null) if (newPath != null)
{ {
newPath.CollectedPeds.Add(this); newPath.CollectedPeds.Add(this);
Path.CollectedPeds.Remove(this); Path.CollectedVehicles.RemoveAll(v => !v || (v && v.BoundPed == this));
RemovePedAndVehicleFromPath();
} }
Tasks.Clear(); Tasks.Clear();
} }

View file

@ -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;
}
}
}

View file

@ -30,7 +30,9 @@ namespace SceneManager
Settings.LoadSettings(); Settings.LoadSettings();
GetAssemblyVersion(); GetAssemblyVersion();
MenuManager.InitializeMenus(); MenuManager.InitializeMenus();
Game.LogTrivial("[DEBUG] After initializing menus.");
Hints.DisplayHintsToOpenMenu(); Hints.DisplayHintsToOpenMenu();
Game.LogTrivial("[DEBUG] After displaying hints to open the menu.");
GameFiber.StartNew(() => UserInput.HandleKeyPress(), "Handle User Input"); GameFiber.StartNew(() => UserInput.HandleKeyPress(), "Handle User Input");

View file

@ -29,6 +29,7 @@ namespace SceneManager.Paths
[XmlArrayItem("Barrier")] [XmlArrayItem("Barrier")]
public List<Barrier> Barriers { get; set; } = new List<Barrier>(); public List<Barrier> Barriers { get; set; } = new List<Barrier>();
internal List<CollectedPed> CollectedPeds { get; } = new List<CollectedPed>(); internal List<CollectedPed> CollectedPeds { get; } = new List<CollectedPed>();
internal List<CollectedVehicle> CollectedVehicles { get; } = new List<CollectedVehicle>();
internal List<Vehicle> BlacklistedVehicles { get; } = new List<Vehicle>(); internal List<Vehicle> BlacklistedVehicles { get; } = new List<Vehicle>();
internal Path() internal Path()
@ -204,40 +205,29 @@ namespace SceneManager.Paths
}, "3D Waypoint Line Drawing Fiber"); }, "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() internal void CleanupInvalidPedsAndVehicles()
{ {
var pedsToDismiss = CollectedPeds.Where(x => x && x.CurrentVehicle && (!x.CurrentVehicle.IsDriveable || x.CurrentVehicle.IsUpsideDown || !x.CurrentVehicle.HasDriver)).ToList(); var pedsToDismiss = CollectedPeds.Where(x => x && x.CurrentVehicle && (!x.CurrentVehicle.IsDriveable || x.CurrentVehicle.IsUpsideDown || !x.CurrentVehicle.HasDriver)).ToList();
foreach (CollectedPed cp in pedsToDismiss) foreach (CollectedPed cp in pedsToDismiss)
{ {
//if (cp.CurrentVehicle.HasDriver) cp.CurrentVehicle.Dismiss();
//{
// cp.CurrentVehicle.Driver.Dismiss();
//}
//cp.CurrentVehicle.Dismiss();
cp.Dismiss(); cp.Dismiss();
} }
CollectedPeds.RemoveAll(cp => !cp || !cp.CurrentVehicle); CollectedPeds.RemoveAll(cp => !cp || !cp.CurrentVehicle);
BlacklistedVehicles.RemoveAll(v => !v); 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() internal void LoopWaypointCollection()
@ -290,7 +280,11 @@ namespace SceneManager.Paths
lastProcessTime = Game.GameTime; lastProcessTime = Game.GameTime;
continue; 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 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<CollectedVehicle> vehMatch, CollectedPed collectedPed, CollectedVehicle collectedPedsInitialVehicle)
{
CollectedVehicles.RemoveAll(vehMatch);
CollectedPeds.Remove(collectedPed);
if (collectedPedsInitialVehicle) collectedPedsInitialVehicle.OptionalCleanUp();
}
internal void Delete() internal void Delete()
{ {
var pathIndex = Array.IndexOf(PathManager.Paths, this); 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)) foreach (CollectedPed collectedPed in collectedPedsCopy.Where(x => x != null && x && x.CurrentVehicle))
{ {
collectedPed.Dismiss(); collectedPed.Dismiss();
CollectedPeds.Remove(collectedPed); //CollectedPeds.Remove(collectedPed);
collectedPed.RemovePedAndVehicleFromPath();
} }
} }

View file

@ -63,6 +63,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="API\Functions.cs" /> <Compile Include="API\Functions.cs" />
<Compile Include="CollectedVehicles\CollectedVehicle.cs" />
<Compile Include="Menus\DriverMenu.cs" /> <Compile Include="Menus\DriverMenu.cs" />
<Compile Include="Menus\ExportPathMenu.cs" /> <Compile Include="Menus\ExportPathMenu.cs" />
<Compile Include="Menus\ImportPathMenu.cs" /> <Compile Include="Menus\ImportPathMenu.cs" />