diff --git a/SceneManager/Object Classes/Barrier.cs b/SceneManager/Object Classes/Barrier.cs deleted file mode 100644 index d894caf..0000000 --- a/SceneManager/Object Classes/Barrier.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using Rage; - -namespace SceneManager -{ - class Barrier - { - internal Rage.Object Object { get; } - internal Model @Model{ get; } - internal Vector3 Position { get; } - internal float Rotation { get; } - - internal Barrier(Rage.Object barrier, Vector3 barrierPosition, float barrierRotation) - { - Object = barrier; - @Model = barrier.Model; - Position = barrierPosition; - Rotation = barrierRotation; - } - } -} diff --git a/SceneManager/Objects/Barrier.cs b/SceneManager/Objects/Barrier.cs new file mode 100644 index 0000000..327c852 --- /dev/null +++ b/SceneManager/Objects/Barrier.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Rage; +using SceneManager.Utils; + +namespace SceneManager.Objects +{ + class Barrier + { + internal Rage.Object Object { get; } + internal Model @Model{ get; } + internal Vector3 Position { get; } + internal float Rotation { get; } + internal bool Invincible { get; } + + internal bool Immobile { get; } + + internal Barrier(Rage.Object barrier, Vector3 barrierPosition, float barrierRotation, bool invincible, bool immobile) + { + Object = barrier; + @Model = barrier.Model; + Position = barrierPosition; + Rotation = barrierRotation; + Invincible = invincible; + Immobile = immobile; + //AddBlocker(); + } + + private void AddBlocker() + { + var blocker = new Rage.Object("prop_barier_conc_01a", Position, Rotation); + blocker.AttachTo(Object, 0, new Vector3(0, 0, 0), new Rotator()); + GameFiber.StartNew(() => + { + while (Object) + { + GameFiber.Yield(); + } + blocker.Delete(); + }); + } + + internal void GoAround() + { + GameFiber.StartNew(() => + { + var collected = new List(); + while (Object) + { + foreach (Vehicle v in World.GetAllVehicles()) + { + if(v && v.IsEngineOn) + { + if(v.HasDriver && v.Driver && v.Driver.IsAlive) + { + if (!collected.Contains(v)) + { + v.Driver.Tasks.Clear(); + v.Driver.Tasks.CruiseWithVehicle(5f, (VehicleDrivingFlags)17039872); + v.Driver.KeepTasks = true; + collected.Add(v); + } + } + } + } + GameFiber.Sleep(1000); + } + }); + } + } +} diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Objects/CollectedVehicle.cs similarity index 95% rename from SceneManager/Object Classes/CollectedVehicle.cs rename to SceneManager/Objects/CollectedVehicle.cs index 914d33d..a43ca29 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Objects/CollectedVehicle.cs @@ -1,8 +1,9 @@ using Rage; using System.Collections.Generic; using System.Linq; +using SceneManager.Utils; -namespace SceneManager +namespace SceneManager.Objects { internal class CollectedVehicle { @@ -64,7 +65,7 @@ namespace SceneManager DriveToNextWaypoint(); } - if (!VehicleAndDriverAreValid() || Directed) + if (!Dismissed && !VehicleAndDriverAreValid() || Directed) { return; } @@ -251,11 +252,6 @@ namespace SceneManager void StopAtWaypoint() { - if (!VehicleAndDriverAreValid()) - { - return; - } - var stoppingDistance = GetAcceptedStoppingDistance(currentWaypoint.Path.Waypoints, currentWaypoint.Path.Waypoints.IndexOf(currentWaypoint)); Game.LogTrivial($"{Vehicle.Model.Name} stopping at path {currentWaypoint.Path.Number} waypoint."); Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(Vehicle, stoppingDistance, -1, true); @@ -280,14 +276,15 @@ namespace SceneManager Game.LogTrivial($"CollectedVehicle is null"); return false; } - if (!Vehicle && !Dismissed) + if (!Vehicle)// && !Dismissed) { Game.LogTrivial($"Vehicle is null"); Dismiss(); return false; } - if (!Driver || !Driver.IsAlive) + if (!Driver || !Driver.CurrentVehicle || !Driver.IsAlive) { + Game.LogTrivial($"Driver is null or dead or not in a vehicle"); Dismiss(); return false; } @@ -297,8 +294,14 @@ namespace SceneManager internal void Dismiss(DismissOption dismissOption = DismissOption.FromPath, Path newPath = null) { - if (!Vehicle || !Driver) + if (!Vehicle) { + Game.LogTrivial($"Vehicle is null."); + return; + } + if (!Driver) + { + Game.LogTrivial($"Driver is null."); return; } @@ -311,27 +314,27 @@ namespace SceneManager if (dismissOption == DismissOption.FromPlayer) { Dismissed = true; - if (Driver) - { + //if (Driver) + //{ Driver.Dismiss(); - } - if (Vehicle) - { + //} + //if (Vehicle) + //{ Vehicle.Dismiss(); Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(Vehicle, 0f, 1, true); - } + //} Path.CollectedVehicles.Remove(this); return; } - if(Vehicle && StoppedAtWaypoint) + if(Driver.CurrentVehicle && StoppedAtWaypoint) { StoppedAtWaypoint = false; - Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(Driver.CurrentVehicle, 0f, 1, true); - if (Driver?.CurrentVehicle) - { + Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(Driver.LastVehicle, 0f, 1, true); + //if (Driver) + //{ Driver.Tasks.CruiseWithVehicle(5f); - } + //} } Driver.Tasks.Clear(); diff --git a/SceneManager/Object Classes/Path.cs b/SceneManager/Objects/Path.cs similarity index 90% rename from SceneManager/Object Classes/Path.cs rename to SceneManager/Objects/Path.cs index b439a92..ac59c7f 100644 --- a/SceneManager/Object Classes/Path.cs +++ b/SceneManager/Objects/Path.cs @@ -3,18 +3,27 @@ using System; using System.Collections.Generic; using System.Drawing; using System.Linq; +using System.Xml.Serialization; +using SceneManager.Utils; +using System.IO; -namespace SceneManager +namespace SceneManager.Objects { - public class Path + internal class Path // Change this to Public for import/export { internal int Number { get; set; } internal bool IsEnabled { get; set; } internal State State { get; set; } - internal List Waypoints = new List(); + + [XmlArray("Waypoints")] + [XmlArrayItem("Waypoint")] + public List Waypoints { get; set; } = new List(); + internal List CollectedVehicles = new List(); private List _blacklistedVehicles = new List(); + private Path() { } + internal Path(int pathNum, State pathState) { Number = pathNum; @@ -22,6 +31,18 @@ namespace SceneManager DrawLinesBetweenWaypoints(); } + internal void Save(string filename) + { + var GAME_DIRECTORY = Directory.GetCurrentDirectory(); + var SAVED_PATHS_DIRECTORY = GAME_DIRECTORY + "/plugins/SceneManager/Saved Paths/"; + if (!Directory.Exists(SAVED_PATHS_DIRECTORY)) + { + Directory.CreateDirectory(SAVED_PATHS_DIRECTORY); + Game.LogTrivial($"New directory created at '/plugins/SceneManager/Saved Paths'"); + } + PathXMLManager.SaveItemToXML(this, SAVED_PATHS_DIRECTORY + filename); + } + private void LowerWaypointBlipsOpacity() { foreach (Waypoint wp in Waypoints) @@ -199,22 +220,14 @@ namespace SceneManager } if (v.HasDriver && v.Driver) { - //Game.LogTrivial($"Driver task status: {v.Driver.Tasks.CurrentTaskStatus}"); if(!v.Driver.IsAlive) { Game.LogTrivial($"Vehicle's driver is dead."); _blacklistedVehicles.Add(v); return false; } - if(v.Driver.IsPersistent) // Persistent drivers are likely spawned from another script and doing something important. + if (v.IsPoliceVehicle && !v.Driver.IsAmbient()) { - Game.LogTrivial($"Vehicle's driver is already persistent and probably being handled by another plugin."); - _blacklistedVehicles.Add(v); - return false; - } - if (v.Driver.Tasks.CurrentTaskStatus == TaskStatus.InProgress && !Rage.Native.NativeFunction.Natives.GET_IS_TASK_ACTIVE(v.Driver, 151)) // Drivers with a non-wander task are probably doing something important - { - Game.LogTrivial($"Vehicle's driver is already tasked and probably being handled by another plugin."); _blacklistedVehicles.Add(v); return false; } diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Objects/Waypoint.cs similarity index 96% rename from SceneManager/Object Classes/Waypoint.cs rename to SceneManager/Objects/Waypoint.cs index 279a4ed..1048df4 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Objects/Waypoint.cs @@ -1,25 +1,28 @@ using Rage; using System.Drawing; using System.Linq; +using SceneManager.Utils; -namespace SceneManager +namespace SceneManager.Objects { - public class Waypoint + internal class Waypoint // Change this to Public for import/export { internal Path Path { get; set; } - internal int Number { get; set; } - internal Vector3 Position { get; set; } - internal float Speed { get; set; } - internal DrivingFlagType DrivingFlagType { get; private set; } - internal bool IsStopWaypoint { get; set; } + public int Number { get; set; } + public Vector3 Position { get; set; } + public float Speed { get; set; } + public DrivingFlagType DrivingFlagType { get; set; } + public bool IsStopWaypoint { get; set; } internal Blip Blip { get; } - internal bool IsCollector { get; set; } - internal float CollectorRadius { get; set; } + public bool IsCollector { get; set; } + public float CollectorRadius { get; set; } internal Blip CollectorRadiusBlip { get; set; } - internal float SpeedZoneRadius { get; set; } + public float SpeedZoneRadius { get; set; } internal uint SpeedZone { get; set; } internal bool EnableWaypointMarker { get; set; } = true; + private Waypoint() { } + internal Waypoint(Path path, int waypointNum, Vector3 waypointPos, float speed, DrivingFlagType drivingFlag, bool stopWaypoint, Blip waypointBlip, bool collector = false, float collectorRadius = 1, float speedZoneRadius = 5) { Path = path;