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:
parent
b6131c0b0e
commit
6bd369845e
5 changed files with 95 additions and 32 deletions
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
38
SceneManager/CollectedVehicles/CollectedVehicle.cs
Normal file
38
SceneManager/CollectedVehicles/CollectedVehicle.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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" />
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue