From 071ac92ba05f6d8d9c96737686dc999a28c01e2e Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 8 Jun 2020 15:20:29 -0600 Subject: [PATCH 001/276] -Converted ControlledVehicles from List to Dictionary -Removed ControlledVehicle from collection via dict key at end of AssignTasks --- SceneManager/ControlledVehicle.cs | 4 +- SceneManager/TrafficMenu.cs | 77 ++++++++++++++++--------------- SceneManager/TrafficPathing.cs | 20 ++++---- 3 files changed, 53 insertions(+), 48 deletions(-) diff --git a/SceneManager/ControlledVehicle.cs b/SceneManager/ControlledVehicle.cs index 30f74fa..b7a9492 100644 --- a/SceneManager/ControlledVehicle.cs +++ b/SceneManager/ControlledVehicle.cs @@ -5,6 +5,7 @@ namespace SceneManager public class ControlledVehicle { public Vehicle Vehicle; + public string LicensePlate; public int Path; public int TotalWaypoints; public int CurrentWaypoint; @@ -13,9 +14,10 @@ namespace SceneManager public bool StoppedAtWaypoint; public bool Redirected; - public ControlledVehicle(Vehicle vehicle, int path, int totalWaypoints, int currentWaypoint, bool tasksAssigned, bool dismissNow, bool redirected) + public ControlledVehicle(Vehicle vehicle, string licensePlate, int path, int totalWaypoints, int currentWaypoint, bool tasksAssigned, bool dismissNow, bool redirected) { Vehicle = vehicle; + LicensePlate = licensePlate; Path = path; TotalWaypoints = totalWaypoints; CurrentWaypoint = currentWaypoint; diff --git a/SceneManager/TrafficMenu.cs b/SceneManager/TrafficMenu.cs index 7e11939..69e38b2 100644 --- a/SceneManager/TrafficMenu.cs +++ b/SceneManager/TrafficMenu.cs @@ -173,20 +173,21 @@ namespace SceneManager // Before deleting a path, we need to dismiss any vehicles controlled by that path and remove the vehicles from ControlledVehicles //Game.LogTrivial($"Deleting path {index+1}"); Game.LogTrivial($"Deleting path {path.WaypointData[0].Path}"); - var matchingVehicle = TrafficPathing.ControlledVehicles.Where(cv => cv.Path == path.WaypointData[0].Path).ToList(); + var matchingVehicle = TrafficPathing.ControlledVehicles.Where(cv => cv.Value.Path == path.WaypointData[0].Path).ToList(); Game.LogTrivial($"Running foreach loop"); - foreach (ControlledVehicle cv in matchingVehicle) + foreach (KeyValuePair cv in matchingVehicle) { - if (cv.Vehicle.Exists() && cv.Vehicle.IsValid() && cv.Vehicle.Driver.Exists() && cv.Vehicle.Driver.IsValid()) + if (cv.Value.Vehicle.Exists() && cv.Value.Vehicle.IsValid() && cv.Value.Vehicle.Driver.Exists() && cv.Value.Vehicle.Driver.IsValid()) { - cv.DismissNow = true; - cv.Vehicle.Driver.Tasks.Clear(); - cv.Vehicle.Driver.Dismiss(); + cv.Value.DismissNow = true; + cv.Value.Vehicle.Driver.Tasks.Clear(); + cv.Value.Vehicle.Driver.Dismiss(); + TrafficPathing.ControlledVehicles.Remove(cv.Value.LicensePlate); //Game.LogTrivial($"{cv.vehicle.Model.Name} cleared from path {cv.path}"); } } Game.LogTrivial($"Remove all vehicles in the path"); - TrafficPathing.ControlledVehicles.RemoveAll(cv => cv.Path == path.WaypointData[0].Path); + //TrafficPathing.ControlledVehicles.RemoveAll(cv => cv.Path == path.WaypointData[0].Path); // Remove the speed zone so cars don't continue to be affected after the path is deleted foreach (WaypointData wd in path.WaypointData) @@ -272,39 +273,39 @@ namespace SceneManager if (v.Exists() && v.IsValid() && v.HasDriver && v.Driver.IsAlive) { // Check if there's a matching vehicle in ControlledVehicles. If so, check if it has tasks and proceed, else add it to the collection and assign tasks - var matchingVehicle = TrafficPathing.ControlledVehicles.Where(cv => cv.Vehicle == v).ToList(); - if (matchingVehicle.ElementAtOrDefault(0) != null && matchingVehicle[0].TasksAssigned) + var matchingVehicle = TrafficPathing.ControlledVehicles.Where(cv => cv.Value.Vehicle == v).ToList(); + if (matchingVehicle.ElementAtOrDefault(0).Value != null && matchingVehicle[0].Value.TasksAssigned) { Game.LogTrivial($"[Direct Driver] {v.Model.Name} already in collection with tasks. Clearing tasks."); v.Driver.Tasks.Clear(); - matchingVehicle[0].Path = paths[directDriver.Index].WaypointData[0].Path; - matchingVehicle[0].TotalWaypoints = paths[directDriver.Index].WaypointData.Count; - matchingVehicle[0].CurrentWaypoint = 1; - matchingVehicle[0].DismissNow = true; - matchingVehicle[0].StoppedAtWaypoint = false; - matchingVehicle[0].Redirected = true; - GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(matchingVehicle[0], paths[directDriver.Index].WaypointData)); + matchingVehicle[0].Value.Path = paths[directDriver.Index].WaypointData[0].Path; + matchingVehicle[0].Value.TotalWaypoints = paths[directDriver.Index].WaypointData.Count; + matchingVehicle[0].Value.CurrentWaypoint = 1; + matchingVehicle[0].Value.DismissNow = true; + matchingVehicle[0].Value.StoppedAtWaypoint = false; + matchingVehicle[0].Value.Redirected = true; + GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(matchingVehicle[0].Value, paths[directDriver.Index].WaypointData)); DirectTaskFiber.Start(); } - else if(matchingVehicle.ElementAtOrDefault(0) != null && !matchingVehicle[0].TasksAssigned) + else if(matchingVehicle.ElementAtOrDefault(0).Value != null && !matchingVehicle[0].Value.TasksAssigned) { Game.LogTrivial($"[Direct Driver] {v.Model.Name} already in collection, but with no tasks."); v.Driver.Tasks.Clear(); - matchingVehicle[0].Path = paths[directDriver.Index].WaypointData[0].Path; - matchingVehicle[0].TotalWaypoints = paths[directDriver.Index].WaypointData.Count; - matchingVehicle[0].CurrentWaypoint = 1; - matchingVehicle[0].DismissNow = true; - matchingVehicle[0].StoppedAtWaypoint = false; - matchingVehicle[0].Redirected = true; - GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(matchingVehicle[0], paths[directDriver.Index].WaypointData)); + matchingVehicle[0].Value.Path = paths[directDriver.Index].WaypointData[0].Path; + matchingVehicle[0].Value.TotalWaypoints = paths[directDriver.Index].WaypointData.Count; + matchingVehicle[0].Value.CurrentWaypoint = 1; + matchingVehicle[0].Value.DismissNow = true; + matchingVehicle[0].Value.StoppedAtWaypoint = false; + matchingVehicle[0].Value.Redirected = true; + GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(matchingVehicle[0].Value, paths[directDriver.Index].WaypointData)); DirectTaskFiber.Start(); } else { - TrafficPathing.ControlledVehicles.Add(new ControlledVehicle(v, paths[directDriver.Index].WaypointData[0].Path, paths[directDriver.Index].WaypointData.Count, 1, false, false, true)); + TrafficPathing.ControlledVehicles.Add(v.LicensePlate, new ControlledVehicle(v, v.LicensePlate, paths[directDriver.Index].WaypointData[0].Path, paths[directDriver.Index].WaypointData.Count, 1, false, false, true)); Game.LogTrivial($"[Direct Driver] {v.Model.Name} not in collection, adding to collection for path {paths[directDriver.Index].WaypointData[0].Path} with {paths[directDriver.Index].WaypointData.Count} waypoints"); - GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(TrafficPathing.ControlledVehicles.Last(), paths[directDriver.Index].WaypointData)); + GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(TrafficPathing.ControlledVehicles[v.LicensePlate], paths[directDriver.Index].WaypointData)); DirectTaskFiber.Start(); } Game.LogTrivial($"Directed driver of {v.Model.Name} to path {paths[directDriver.Index].WaypointData[0].Path}."); @@ -329,33 +330,33 @@ namespace SceneManager { if (v.Exists() && v.IsValid() && v.HasDriver && v.Driver.IsAlive) { - var matchingVehicle = TrafficPathing.ControlledVehicles.Where(cv => cv.Vehicle == v).ToList(); - if (matchingVehicle.ElementAtOrDefault(0) != null && matchingVehicle[0].CurrentWaypoint < matchingVehicle[0].TotalWaypoints && !matchingVehicle[0].StoppedAtWaypoint) + var matchingVehicle = TrafficPathing.ControlledVehicles.Where(cv => cv.Value.Vehicle == v).ToList(); + if (matchingVehicle.ElementAtOrDefault(0).Value != null && matchingVehicle[0].Value.CurrentWaypoint < matchingVehicle[0].Value.TotalWaypoints && !matchingVehicle[0].Value.StoppedAtWaypoint) { - matchingVehicle[0].DismissNow = true; + matchingVehicle[0].Value.DismissNow = true; v.Driver.Tasks.Clear(); v.Driver.Dismiss(); Game.LogTrivial($"Dismissed driver of {v.Model.Name} from the path"); } - else if (matchingVehicle.ElementAtOrDefault(0) != null && matchingVehicle[0].CurrentWaypoint < matchingVehicle[0].TotalWaypoints) + else if (matchingVehicle.ElementAtOrDefault(0).Value != null && matchingVehicle[0].Value.CurrentWaypoint < matchingVehicle[0].Value.TotalWaypoints) { - matchingVehicle[0].StoppedAtWaypoint = false; - Game.LogTrivial($"Dismissed driver of {v.Model.Name} from waypoint {matchingVehicle[0].CurrentWaypoint}"); + matchingVehicle[0].Value.StoppedAtWaypoint = false; + Game.LogTrivial($"Dismissed driver of {v.Model.Name} from waypoint {matchingVehicle[0].Value.CurrentWaypoint}"); } - else if (matchingVehicle.ElementAtOrDefault(0) != null && matchingVehicle[0].CurrentWaypoint == matchingVehicle[0].TotalWaypoints) + else if (matchingVehicle.ElementAtOrDefault(0).Value != null && matchingVehicle[0].Value.CurrentWaypoint == matchingVehicle[0].Value.TotalWaypoints) { - matchingVehicle[0].StoppedAtWaypoint = false; - matchingVehicle[0].DismissNow = true; + matchingVehicle[0].Value.StoppedAtWaypoint = false; + matchingVehicle[0].Value.DismissNow = true; v.Driver.Tasks.Clear(); v.Driver.Dismiss(); Game.LogTrivial($"Dismissed driver of {v.Model.Name} from final waypoint and ultimately the path"); } - else if (matchingVehicle.ElementAtOrDefault(0) != null) + else if (matchingVehicle.ElementAtOrDefault(0).Value != null) { - matchingVehicle[0].DismissNow = true; + matchingVehicle[0].Value.DismissNow = true; v.Driver.Tasks.Clear(); v.Driver.Dismiss(); - Game.LogTrivial($"Dismissed driver of {v.Model.Name} from path {matchingVehicle[0].Path}"); + Game.LogTrivial($"Dismissed driver of {v.Model.Name} from path {matchingVehicle[0].Value.Path}"); } else { diff --git a/SceneManager/TrafficPathing.cs b/SceneManager/TrafficPathing.cs index 5751534..9f8782c 100644 --- a/SceneManager/TrafficPathing.cs +++ b/SceneManager/TrafficPathing.cs @@ -7,7 +7,8 @@ namespace SceneManager { public static class TrafficPathing { - public static List ControlledVehicles = new List { }; + public static Dictionary ControlledVehicles = new Dictionary(); + //public static List ControlledVehicles = new List { }; public static void InitialWaypointVehicleCollector(List waypointData) { @@ -34,6 +35,7 @@ namespace SceneManager while (waypointData.ElementAtOrDefault(0) != null) { + Game.DisplaySubtitle($"Vehicles in collection: {ControlledVehicles.Count()}"); // Getting vehicles within 3f of waypoint try { @@ -43,26 +45,26 @@ namespace SceneManager if(VehicleAndDriverValid(v) && v != Game.LocalPlayer.Character.CurrentVehicle && v.HasDriver && v.Driver.IsAlive && (v.IsCar || v.IsBike || v.IsBicycle || v.IsQuadBike)) { // Check if there's an object in the list with a matching vehicle - var matchingVehicle = ControlledVehicles.Where(cv => cv.Vehicle == v).ToList(); + var matchingVehicle = ControlledVehicles.Where(cv => cv.Value.Vehicle == v).ToList(); // If there's a match, then check if the first match has tasksAssigned. If not, AssignTasks - if (matchingVehicle.ElementAtOrDefault(0) != null && !matchingVehicle[0].TasksAssigned && !matchingVehicle[0].DismissNow) + if (matchingVehicle.ElementAtOrDefault(0).Value != null && !matchingVehicle[0].Value.TasksAssigned && !matchingVehicle[0].Value.DismissNow) { Game.LogTrivial($"[InitialWaypointVehicleCollector] {v.Model.Name} already in collection, but with no tasks. Assigning tasks."); - matchingVehicle[0].TasksAssigned = true; - GameFiber AssignTasksFiber = new GameFiber(() => AssignTasks(matchingVehicle[0], waypointData)); + matchingVehicle[0].Value.TasksAssigned = true; + GameFiber AssignTasksFiber = new GameFiber(() => AssignTasks(matchingVehicle[0].Value, waypointData)); AssignTasksFiber.Start(); } // Else if object doesn't exist, add to collection and AssignTasks - else if (matchingVehicle.ElementAtOrDefault(0) != null && matchingVehicle[0].TasksAssigned) + else if (matchingVehicle.ElementAtOrDefault(0).Value != null && matchingVehicle[0].Value.TasksAssigned) { //Game.LogTrivial($"Vehicle already in collection with tasks. Do nothing."); } else { - ControlledVehicles.Add(new ControlledVehicle(v, waypointData[0].Path, waypointData.Count, 1, true, false, false)); + ControlledVehicles.Add(v.LicensePlate, new ControlledVehicle(v, v.LicensePlate, waypointData[0].Path, waypointData.Count, 1, true, false, false)); Game.LogTrivial($"Added {v.Model.Name} to collection from initial waypoint at path {waypointData[0].Path} with {waypointData.Count} waypoints"); - GameFiber AssignTasksFiber = new GameFiber(() => AssignTasks(ControlledVehicles.Last(), waypointData)); + GameFiber AssignTasksFiber = new GameFiber(() => AssignTasks(ControlledVehicles[v.LicensePlate], waypointData)); AssignTasksFiber.Start(); } } @@ -121,6 +123,7 @@ namespace SceneManager { GameFiber.Yield(); } + ControlledVehicles.Remove(cv.LicensePlate); Game.LogTrivial($"AssignTasks exit"); } @@ -199,7 +202,6 @@ namespace SceneManager cv.Vehicle.Driver.Tasks.Clear(); //cv.Vehicle.IsPersistent = false; cv.Vehicle.Driver.BlockPermanentEvents = false; - ControlledVehicles.Remove(cv); } else if(!VehicleAndDriverValid(cv)) { From 071b1885d4fddc647129d61d0cf61009d34cbed3 Mon Sep 17 00:00:00 2001 From: Rich <23438379+Ridunnekulous@users.noreply.github.com> Date: Mon, 8 Jun 2020 15:29:43 -0600 Subject: [PATCH 002/276] Create README.md --- README.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..f68b76b --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ +#Scene Manager + +##INSTALLATION +Drag and drop the included GTA V folder into where your GTA V is installed. + +##HOW-TO USE +###Creating Paths: +1. To create paths, open the Scene Manager menu by pressing Left Shift + T (default) while on foot. Select "Traffic Menu," then "Create New Path." +2. In the Path Creation menu, you can choose different waypoint types and speeds, as well as add and remove waypoints. The settings for each waypoint are how the AI will drive to THAT waypoint from the PREVIOUS waypoint. +3. Adding a waypoint will create a waypoint at your player's position. +4. As you add and remove waypoints, blips will appear and disappear from the game map. Blips are numbered to correspond with their path. Blips are also colored to designate the following: Orange blips are the beginning of a path, red blips are the end of a path, and yellow blips are waypoints between the first and last waypoint. +5. The path will activate once you select "End path creation," and cars will automatically follow the path when they are close to the first waypoint. +6. After creating paths, you can delete them via the Traffic Menu. +7. There is a "Direct nearest driver to path" option in the Traffic Menu which allows you to manually direct the nearest vehicle to a path of your choice. This option can be buggy when you are on-duty, as LSPDFR interferes. Directing a driver works better the closer you are to desired path. +8. The "Dismiss nearest driver" option in the Traffic Menu allows you to dismiss vehicles at "Stop" waypoints. This option can also be used to try and get vehicles unstuck from precarious situations. +9. Paths and cones will remain in the world after you die. Be sure to delete them when you're done! + +###Cones Management: +1. To place cones, open the Scene Manager menu by pressing T (default). +2. In the Cone Menu, you may scroll through different types of road cones, as well as place and remove cones. +3. For easier and more accurate cone placement, use the first persion view. +4. The AI will not drive around cones on their own. Place cones around your custom paths for maximum immersion. + +##PATREON +If you enjoy my plugins and would like to help with the development of new plugins, please consider supporting me on Patreon. Patreon benefits include early access to plugin updates, being able to suggest and vote on new plugin ideas for me to create, early access to new plugins, and access to Patreon-exclusive plugins which will never be released publicly! +https://www.patreon.com/richdevs + + +##CREDITS +Author: Rich +Additional credit: OJdoesIt, Vincentsgm, EchoWolf, Factions, Sereous From 9ad2cb5cf275a4cf372b28e6018e648c6e3f462e Mon Sep 17 00:00:00 2001 From: Rich <23438379+Ridunnekulous@users.noreply.github.com> Date: Mon, 8 Jun 2020 15:30:29 -0600 Subject: [PATCH 003/276] Update README.md --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index f68b76b..da95713 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -#Scene Manager +# Scene Manager -##INSTALLATION +## INSTALLATION Drag and drop the included GTA V folder into where your GTA V is installed. -##HOW-TO USE -###Creating Paths: +## HOW-TO USE +### Creating Paths: 1. To create paths, open the Scene Manager menu by pressing Left Shift + T (default) while on foot. Select "Traffic Menu," then "Create New Path." 2. In the Path Creation menu, you can choose different waypoint types and speeds, as well as add and remove waypoints. The settings for each waypoint are how the AI will drive to THAT waypoint from the PREVIOUS waypoint. 3. Adding a waypoint will create a waypoint at your player's position. @@ -15,17 +15,17 @@ Drag and drop the included GTA V folder into where your GTA V is installed. 8. The "Dismiss nearest driver" option in the Traffic Menu allows you to dismiss vehicles at "Stop" waypoints. This option can also be used to try and get vehicles unstuck from precarious situations. 9. Paths and cones will remain in the world after you die. Be sure to delete them when you're done! -###Cones Management: +### Cones Management: 1. To place cones, open the Scene Manager menu by pressing T (default). 2. In the Cone Menu, you may scroll through different types of road cones, as well as place and remove cones. 3. For easier and more accurate cone placement, use the first persion view. 4. The AI will not drive around cones on their own. Place cones around your custom paths for maximum immersion. -##PATREON +## PATREON If you enjoy my plugins and would like to help with the development of new plugins, please consider supporting me on Patreon. Patreon benefits include early access to plugin updates, being able to suggest and vote on new plugin ideas for me to create, early access to new plugins, and access to Patreon-exclusive plugins which will never be released publicly! https://www.patreon.com/richdevs -##CREDITS +## CREDITS Author: Rich Additional credit: OJdoesIt, Vincentsgm, EchoWolf, Factions, Sereous From 33b9dcb0d37edffefb1bd93025eebd64e7ed2e39 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 15 Jun 2020 17:28:46 -0600 Subject: [PATCH 004/276] Adding waypoint no longer resets the waypoint type, fixed a bug and crash with remove waypoint option. Functional version before major menu updates --- SceneManager/EntryPoint.cs | 2 +- SceneManager/Properties/AssemblyInfo.cs | 4 ++-- SceneManager/TrafficMenu.cs | 6 +++--- SceneManager/TrafficPathing.cs | 4 +++- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/SceneManager/EntryPoint.cs b/SceneManager/EntryPoint.cs index 10eabe5..ec84764 100644 --- a/SceneManager/EntryPoint.cs +++ b/SceneManager/EntryPoint.cs @@ -1,7 +1,7 @@ using System.Windows.Forms; using Rage; -[assembly: Rage.Attributes.Plugin("Scene Manager V1.7", Author = "Rich", Description = "Manage your scenes with custom AI traffic pathing and cone placement.")] +[assembly: Rage.Attributes.Plugin("Scene Manager V2.0", Author = "Rich", Description = "Manage your scenes with custom AI traffic pathing and cone placement.")] namespace SceneManager { diff --git a/SceneManager/Properties/AssemblyInfo.cs b/SceneManager/Properties/AssemblyInfo.cs index 6148bc7..44061cc 100644 --- a/SceneManager/Properties/AssemblyInfo.cs +++ b/SceneManager/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.0.0")] -[assembly: AssemblyFileVersion("1.7.0.0")] +[assembly: AssemblyVersion("2.0.0.0")] +[assembly: AssemblyFileVersion("2.0.0.0")] diff --git a/SceneManager/TrafficMenu.cs b/SceneManager/TrafficMenu.cs index 69e38b2..eb25068 100644 --- a/SceneManager/TrafficMenu.cs +++ b/SceneManager/TrafficMenu.cs @@ -451,7 +451,7 @@ namespace SceneManager deleteAllPaths.Enabled = false; directDriver.Enabled = false; } - _menuPool.RefreshIndex(); + //_menuPool.RefreshIndex(); // Disabling this to stop resetting waypoint menu after waypoint is added } if (selectedItem == trafficRemoveWaypoint) @@ -466,7 +466,7 @@ namespace SceneManager paths[i].WaypointData.RemoveAt(paths[i].WaypointData.IndexOf(paths[i].WaypointData.Last())); // If the path has no waypoints, disable the menu option to remove a waypoint - if (paths[0].WaypointData.Count == 0) + if (paths[i].WaypointData.Count == 0) { trafficRemoveWaypoint.Enabled = false; } @@ -498,7 +498,7 @@ namespace SceneManager else { Game.LogTrivial($"[Path Error] A minimum of 2 waypoints is required."); - Game.DisplayNotification($"~o~Scene Manager\n~r~[Error]~w~ A minimum of 2 waypoints is required."); + Game.DisplayNotification($"~o~Scene Manager\n~r~[Error]~w~ A minimum of 2 waypoints or one stop waypoint is required to create a path."); foreach (WaypointData wd in paths[i].WaypointData) { wd.WaypointBlip.Delete(); diff --git a/SceneManager/TrafficPathing.cs b/SceneManager/TrafficPathing.cs index 9f8782c..a59edab 100644 --- a/SceneManager/TrafficPathing.cs +++ b/SceneManager/TrafficPathing.cs @@ -35,7 +35,7 @@ namespace SceneManager while (waypointData.ElementAtOrDefault(0) != null) { - Game.DisplaySubtitle($"Vehicles in collection: {ControlledVehicles.Count()}"); + //Game.DisplaySubtitle($"Vehicles in collection: {ControlledVehicles.Count()}"); // Getting vehicles within 3f of waypoint try { @@ -240,6 +240,7 @@ namespace SceneManager return (from x in World.GetAllVehicles() where !x.IsTrailer && x.DistanceTo(OriginPosition) < radius select x).ToArray(); } + // Driving styles https://gtaforums.com/topic/822314-guide-driving-styles/ [Flags] public enum EDrivingFlags { @@ -253,6 +254,7 @@ namespace SceneManager IgnoreRoads = 4194304, AvoidHighways = 536870912, Normal = StopForVehicles | StopForPeds | AvoidEmptyVehicles | StopForTrafficLights | UseBlinkers, + //TotalControl = AllowMedianCrossing | AllowWrongWay | DriveAroundObjects | DriveAroundPeds | DriveBySight | FollowTraffic | IgnorePathfinding } public static void SetDriveTaskDrivingFlags(this Ped ped, EDrivingFlags flags) From f4c1c0c6937ef45add5a6943441a30a433b21a0d Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 18 Aug 2020 19:00:29 -0600 Subject: [PATCH 005/276] Mid-refactor --- SceneManager/EntryPoint.cs | 125 ++-- SceneManager/GetUserInput.cs | 75 ++ SceneManager/MenuManager.cs | 67 ++ SceneManager/Menus/BarrierMenu.cs | 223 ++++++ SceneManager/Menus/EditPathMenu.cs | 75 ++ SceneManager/Menus/EditWaypointMenu.cs | 189 +++++ SceneManager/Menus/MainMenu.cs | 37 + SceneManager/Menus/PathCreationMenu.cs | 241 +++++++ SceneManager/Menus/TrafficMenu.cs | 374 ++++++++++ .../{ => Object Classes}/ControlledVehicle.cs | 0 SceneManager/Object Classes/Path.cs | 26 + SceneManager/Object Classes/Waypoint.cs | 52 ++ SceneManager/PathData.cs | 24 - SceneManager/SceneManager.csproj | 16 +- SceneManager/SettingsMenu.cs | 79 +++ SceneManager/TrafficMenu.cs | 646 ------------------ SceneManager/TrafficPathing.cs | 355 +++++----- SceneManager/WaypointData.cs | 33 - 18 files changed, 1721 insertions(+), 916 deletions(-) create mode 100644 SceneManager/GetUserInput.cs create mode 100644 SceneManager/MenuManager.cs create mode 100644 SceneManager/Menus/BarrierMenu.cs create mode 100644 SceneManager/Menus/EditPathMenu.cs create mode 100644 SceneManager/Menus/EditWaypointMenu.cs create mode 100644 SceneManager/Menus/MainMenu.cs create mode 100644 SceneManager/Menus/PathCreationMenu.cs create mode 100644 SceneManager/Menus/TrafficMenu.cs rename SceneManager/{ => Object Classes}/ControlledVehicle.cs (100%) create mode 100644 SceneManager/Object Classes/Path.cs create mode 100644 SceneManager/Object Classes/Waypoint.cs delete mode 100644 SceneManager/PathData.cs create mode 100644 SceneManager/SettingsMenu.cs delete mode 100644 SceneManager/TrafficMenu.cs delete mode 100644 SceneManager/WaypointData.cs diff --git a/SceneManager/EntryPoint.cs b/SceneManager/EntryPoint.cs index ec84764..64354e5 100644 --- a/SceneManager/EntryPoint.cs +++ b/SceneManager/EntryPoint.cs @@ -1,7 +1,10 @@ -using System.Windows.Forms; +using System; +using System.Linq; +using System.Reflection; +using System.Windows.Forms; using Rage; -[assembly: Rage.Attributes.Plugin("Scene Manager V2.0", Author = "Rich", Description = "Manage your scenes with custom AI traffic pathing and cone placement.")] +[assembly: Rage.Attributes.Plugin("Scene Manager [Test Build]", Author = "Rich", Description = "Manage your scenes with custom AI traffic pathing and cone placement.")] namespace SceneManager { @@ -14,15 +17,15 @@ namespace SceneManager internal static ControllerButtons ToggleButton = ControllerButtons.Y; internal static ControllerButtons ModifierButton = ControllerButtons.A; internal static bool EnableHints = true; - internal static string id = Verification.passThrough(Verification.GetID()); - internal static string PatronKey = null; // This cannot reference VerifyUser because the file can just be shared and it will always work. Must be manually set to each user's ID + //internal static string id = Verification.passThrough(Verification.GetID()); + //internal static string PatronKey = null; // This cannot reference VerifyUser because the file can just be shared and it will always work. Must be manually set to each user's ID internal static void LoadSettings() { Game.LogTrivial("Loading SceneManager.ini settings"); InitializationFile ini = new InitializationFile("Plugins/SceneManager.ini"); ini.Create(); - PatronKey = ini.ReadString("Patreon","PatronKey", null); + //PatronKey = ini.ReadString("Patreon","PatronKey", null); ToggleKey = ini.ReadEnum("Keybindings", "ToggleKey", Keys.T); ModifierKey = ini.ReadEnum("Keybindings", "ModifierKey", Keys.LShiftKey); ToggleButton = ini.ReadEnum("Keybindings", "ToggleButton", ControllerButtons.A); @@ -33,54 +36,94 @@ namespace SceneManager public static void Main() { + AppDomain.CurrentDomain.DomainUnload += MyTerminationHandler; Settings.LoadSettings(); - Game.LogTrivial($"Scene Manager is ready."); + GetAssemblyVersion(); + MenuManager.InstantiateMenus(); - // id is hardware ID and needs to match PatronKey, which is also hardware ID - if (Settings.id == Settings.PatronKey) + if (Settings.EnableHints) + DisplayHintsToOpenMenu(); + + GameFiber UserInputFiber = new GameFiber(() => GetUserInput.LoopForUserInput()); + UserInputFiber.Start(); + } + + private static void GetAssemblyVersion() + { + Assembly assembly = Assembly.GetExecutingAssembly(); + System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location); + var version = fvi.FileVersion; + Game.LogTrivial($"Scene Manager V{version} is ready."); + } + + private static void DisplayHintsToOpenMenu() + { + if (Settings.ModifierKey == Keys.None && Settings.ModifierButton == ControllerButtons.None) { - Game.LogTrivial($"Patron status verified."); - Game.DisplayNotification($"~o~Scene Manager\n~g~[Patreon]~w~ Thanks for the support, enjoy your session!"); + Game.DisplayNotification($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press the ~b~{Settings.ToggleKey} key ~w~or ~b~{Settings.ToggleButton} button ~w~while on foot"); + } + else if (Settings.ModifierKey == Keys.None) + { + Game.DisplayNotification($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press the ~b~{Settings.ToggleKey} key ~w~or ~b~{Settings.ModifierButton} ~w~+ ~b~{Settings.ToggleButton} buttons ~w~while on foot"); + } + else if (Settings.ModifierButton == ControllerButtons.None) + { + Game.DisplayNotification($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press ~b~{Settings.ModifierKey} ~w~+ ~b~{Settings.ToggleKey} ~w~or the ~b~{Settings.ToggleButton} button ~w~while on foot"); } else { - Game.LogTrivial($"Patron status not verified."); - Game.DisplayNotification($"~o~Scene Manager\n~y~[Patreon]~w~ Thanks for using my plugin! If you would like to gain access to benefits such as ~g~new features for this plugin~w~, ~g~early access to new plugins~w~, and ~g~custom plugins made just for you~w~, please consider supporting me on ~b~Patreon~w~. ~y~https://www.patreon.com/richdevs"); + Game.DisplayNotification($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press the ~b~{Settings.ModifierKey} ~w~+ ~b~{Settings.ToggleKey} keys ~w~or ~b~{Settings.ModifierButton} ~w~+ ~b~{Settings.ToggleButton} buttons ~w~while on foot"); } + } - if (Settings.EnableHints) + private static void MyTerminationHandler(object sender, EventArgs e) + { + // Clean up paths + for (int i = 0; i < TrafficMenu.paths.Count; i++) { - if (Settings.ModifierKey == Keys.None && Settings.ModifierButton == ControllerButtons.None) - { - Game.DisplayNotification($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press the ~b~{Settings.ToggleKey} key ~w~or ~b~{Settings.ToggleButton} button ~w~while on foot"); - } - else if (Settings.ModifierKey == Keys.None) - { - Game.DisplayNotification($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press the ~b~{Settings.ToggleKey} key ~w~or ~b~{Settings.ModifierButton} ~w~+ ~b~{Settings.ToggleButton} buttons ~w~while on foot"); - } - else if (Settings.ModifierButton == ControllerButtons.None) - { - Game.DisplayNotification($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press ~b~{Settings.ModifierKey} ~w~+ ~b~{Settings.ToggleKey} ~w~or the ~b~{Settings.ToggleButton} button ~w~while on foot"); - } - else - { - Game.DisplayNotification($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press the ~b~{Settings.ModifierKey} ~w~+ ~b~{Settings.ToggleKey} keys ~w~or ~b~{Settings.ModifierButton} ~w~+ ~b~{Settings.ToggleButton} buttons ~w~while on foot"); - } + TrafficMenu.DeletePath(TrafficMenu.paths[i], i, "All"); } - GameFiber TrafficMenuFiber = new GameFiber(() => TrafficMenu.CheckUserInput()); - TrafficMenuFiber.Start(); + // Clean up cones + foreach (Rage.Object cone in BarrierMenu.barriers.Where(c => c)) + { + cone.Delete(); + } + if (BarrierMenu.shadowBarrier) + { + BarrierMenu.shadowBarrier.Delete(); + } + + // Clear everything + BarrierMenu.barriers.Clear(); + TrafficPathing.collectedVehicles.Clear(); + + Game.LogTrivial($"Scene Manager has been terminated."); + Game.DisplayNotification($"~o~Scene Manager\n~r~[Notice]~w~ The plugin has shut down."); } } } -/* - * GameFiber.StartNew(delegate{ - * - * }); - * - * public static Vehicle[] GetNearbyVehicles2(Vector3 OriginPosition, int amount) - * { - * return (Vehicle[])(from x in World.GetAllVehicles() orderby x.DistanceTo(OriginPosition) select x).Take(amount).ToArray(); - * } - */ +//GameFiber.StartNew(delegate{ + +//}); + +//public static Vehicle[] GetNearbyVehicles2(Vector3 OriginPosition, int amount) +//{ +// return (Vehicle[])(from x in World.GetAllVehicles() orderby x.DistanceTo(OriginPosition) select x).Take(amount).ToArray(); +//} + +//Type t = typeof(int); +//Game.LogTrivial($"Scene Manager V{Assembly.GetAssembly(t).GetName().Version} is ready.");*/ + +//// id is hardware ID and needs to match PatronKey, which is also hardware ID +//if (Settings.id == Settings.PatronKey) +//{ +// Game.LogTrivial($"Patron status verified."); +// Game.DisplayNotification($"~o~Scene Manager\n~g~[Patreon]~w~ Thanks for the support, enjoy your session!"); +//} +//else +//{ +// Game.LogTrivial($"Patron status not verified."); +// Game.DisplayNotification($"~o~Scene Manager\n~y~[Patreon]~w~ Thanks for using my plugin! If you would like to gain access to benefits such as ~g~new features for this plugin~w~, ~g~early access to new plugins~w~, and ~g~custom plugins made just for you~w~, please consider supporting me on ~b~Patreon~w~. ~y~https://www.patreon.com/richdevs"); +//} diff --git a/SceneManager/GetUserInput.cs b/SceneManager/GetUserInput.cs new file mode 100644 index 0000000..3531000 --- /dev/null +++ b/SceneManager/GetUserInput.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Rage; + +namespace SceneManager +{ + class GetUserInput + { + public static void LoopForUserInput() + { + while (true) + { + // Keyboard + GetKeyboardInput(); + + // Controller + GetControllerInput(); + + // Display this message for test versions only + if (MenuManager.mainMenu.Visible) + { + Game.DisplaySubtitle($"You are using a test build of Scene Manager. Please report any bugs/crashes in the Discord server."); + } + + MenuManager.menuPool.ProcessMenus(); + GameFiber.Yield(); + } + } + + private static void GetControllerInput() + { + if (EntryPoint.Settings.ModifierButton == ControllerButtons.None) + { + if (Game.IsControllerButtonDown(EntryPoint.Settings.ToggleButton) && AreMenusClosed()) + { + MenuManager.mainMenu.Visible = !MenuManager.mainMenu.Visible; + } + } + else if (Game.IsControllerButtonDownRightNow(EntryPoint.Settings.ModifierButton) && Game.IsControllerButtonDown(EntryPoint.Settings.ToggleButton) && AreMenusClosed()) + { + MenuManager.mainMenu.Visible = !MenuManager.mainMenu.Visible; + } + } + + private static void GetKeyboardInput() + { + if (EntryPoint.Settings.ModifierKey == System.Windows.Forms.Keys.None) + { + if (Game.IsKeyDown(EntryPoint.Settings.ToggleKey) && AreMenusClosed()) + { + MenuManager.mainMenu.Visible = !MenuManager.mainMenu.Visible; + } + } + else if (Game.IsKeyDownRightNow(EntryPoint.Settings.ModifierKey) && Game.IsKeyDown(EntryPoint.Settings.ToggleKey) && AreMenusClosed()) + { + MenuManager.mainMenu.Visible = !MenuManager.mainMenu.Visible; + } + } + + private static bool AreMenusClosed() + { + if(!MenuManager.barrierMenu.Visible && !MenuManager.pathMenu.Visible && !MenuManager.pathCreationMenu.Visible && !MenuManager.editPathMenu.Visible && !MenuManager.editWaypointMenu.Visible && !MenuManager.settingsMenu.Visible) + { + return true; + } + else + { + return false; + } + } + } +} diff --git a/SceneManager/MenuManager.cs b/SceneManager/MenuManager.cs new file mode 100644 index 0000000..4a9a0b8 --- /dev/null +++ b/SceneManager/MenuManager.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Drawing; +using Rage; +using RAGENativeUI; +using RAGENativeUI.Elements; + +namespace SceneManager +{ + public static class MenuManager + { + public static MenuPool menuPool = new MenuPool(); + public static UIMenu mainMenu, pathMenu, barrierMenu, pathCreationMenu, editPathMenu, editWaypointMenu, settingsMenu; + + public static void InstantiateMenus() + { + mainMenu = new UIMenu("Scene Manager", ""); + settingsMenu = new UIMenu("Scene Menu", "~o~Plugin Settings"); + settingsMenu.ParentMenu = mainMenu; + pathMenu = new UIMenu("Scene Manager", "~o~Path Menu"); + pathMenu.ParentMenu = mainMenu; + pathCreationMenu = new UIMenu("Scene Manager", "~o~Path Creation"); + pathCreationMenu.ParentMenu = pathMenu; + barrierMenu = new UIMenu("Scene Manager", "~o~Barrier Management"); + barrierMenu.ParentMenu = mainMenu; + editPathMenu = new UIMenu("Scene Manager", "~o~Edit Path"); + editPathMenu.ParentMenu = pathMenu; + editWaypointMenu = new UIMenu("Scene Manager", "~o~Edit Waypoint"); + editWaypointMenu.ParentMenu = editPathMenu; + + AddMenusToMenuPool(); + BuildMenus(); + DefineMenuMouseSettings(); + } + + private static void DefineMenuMouseSettings() + { + foreach (UIMenu menu in menuPool) + { + menu.MouseControlsEnabled = false; + menu.AllowCameraMovement = true; + } + } + + private static void BuildMenus() + { + MainMenu.BuildMainMenu(); + SettingsMenu.BuildSettingsMenu(); + TrafficMenu.BuildPathMenu(); + PathCreationMenu.BuildPathCreationMenu(); + EditPathMenu.BuildEditPathMenu(); + BarrierMenu.BuildBarrierMenu(); + } + + private static void AddMenusToMenuPool() + { + menuPool.Add(mainMenu); + menuPool.Add(settingsMenu); + menuPool.Add(pathMenu); + menuPool.Add(barrierMenu); + menuPool.Add(pathCreationMenu); + menuPool.Add(editPathMenu); + menuPool.Add(editWaypointMenu); + } + } +} diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs new file mode 100644 index 0000000..24cf2da --- /dev/null +++ b/SceneManager/Menus/BarrierMenu.cs @@ -0,0 +1,223 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Rage; +using RAGENativeUI; +using RAGENativeUI.Elements; + +namespace SceneManager +{ + class BarrierMenu + { + public static List barriers = new List() { }; + + // TODO: Refactor as dictionary + private static UIMenuListScrollerItem barrierList = new UIMenuListScrollerItem("Select Barrier", "", new[] { "Large Striped Cone", "Large Cone", "Medium Striped Cone", "Medium Cone", "Roadpole A", "Roadpole B", "Police Barrier", "Road Barrier", "Flare" }); + private static string[] barrierObjectNames = new string[] { "prop_mp_cone_01", "prop_roadcone01c", "prop_mp_cone_02", "prop_mp_cone_03", "prop_roadpole_01a", "prop_roadpole_01b", "prop_barrier_work05", "prop_barrier_work06a", "prop_flare_01b" }; + private static UIMenuNumericScrollerItem rotateBarrier = new UIMenuNumericScrollerItem("Rotate Barrier", "Rotate the barrier.", 0, 359, 10); + private static UIMenuListScrollerItem removeBarrierOptions = new UIMenuListScrollerItem("Remove Barrier", "", new[] { "Last Barrier", "Nearest Barrier", "All Barriers" }); + public static Rage.Object shadowBarrier; + + public static void BuildBarrierMenu() + { + MenuManager.barrierMenu.AddItem(removeBarrierOptions, 0); + removeBarrierOptions.Enabled = false; + MenuManager.barrierMenu.AddItem(rotateBarrier, 0); + MenuManager.barrierMenu.AddItem(barrierList, 0); + MenuManager.barrierMenu.RefreshIndex(); + + MenuManager.barrierMenu.OnItemSelect += BarrierMenu_OnItemSelected; + MenuManager.barrierMenu.OnScrollerChange += BarrierMenu_OnScrollerChange; + } + + public static void CreateShadowBarrier(UIMenu barrierMenu) + { + if (EntryPoint.Settings.EnableHints) + { + Game.DisplayNotification($"~o~Scene Manager\n~y~[Hint]~y~ ~w~The shadow cone will disappear if you aim too far away."); + } + + //Game.LogTrivial("Creating shadow cone"); + if (shadowBarrier) + shadowBarrier.Delete(); + + shadowBarrier = new Rage.Object(barrierObjectNames[barrierList.Index], TracePlayerView(15, TraceFlags.IntersectEverything).HitPosition, rotateBarrier.Index); + Rage.Native.NativeFunction.Natives.PLACE_OBJECT_ON_GROUND_PROPERLY(shadowBarrier); + shadowBarrier.IsGravityDisabled = true; + shadowBarrier.IsCollisionEnabled = false; + shadowBarrier.Opacity = 0.7f; + + GameFiber ShadowConeLoopFiber = new GameFiber(() => LoopToDisplayShadowBarrier(barrierMenu)); + ShadowConeLoopFiber.Start(); + } + + private static void LoopToDisplayShadowBarrier(UIMenu coneMenu) + { + while (coneMenu.Visible && shadowBarrier) + { + UpdateShadowBarrierPosition(); + GameFiber.Yield(); + } + + if (shadowBarrier) + shadowBarrier.Delete(); + } + + private static void UpdateShadowBarrierPosition() + { + DisableBarrierMenuOptionsIfShadowConeTooFar(); + shadowBarrier.Position = TracePlayerView(15, TraceFlags.IntersectEverything).HitPosition; + Rage.Native.NativeFunction.Natives.PLACE_OBJECT_ON_GROUND_PROPERLY(shadowBarrier); + shadowBarrier.Heading = rotateBarrier.Index; + + void DisableBarrierMenuOptionsIfShadowConeTooFar() + { + if (shadowBarrier.Position.DistanceTo2D(Game.LocalPlayer.Character.Position) > 15f) + { + barrierList.Enabled = false; + rotateBarrier.Enabled = false; + } + else + { + barrierList.Enabled = true; + rotateBarrier.Enabled = true; + } + } + } + + private static void BarrierMenu_OnScrollerChange(UIMenu sender, UIMenuScrollerItem scrollerItem, int oldIndex, int newIndex) + { + if (scrollerItem == barrierList) + { + CreateShadowBarrier(MenuManager.barrierMenu); + + if (barrierObjectNames[barrierList.Index] == "prop_flare_01b") + { + rotateBarrier.Enabled = false; + } + else + { + rotateBarrier.Enabled = true; + } + } + + if (scrollerItem == rotateBarrier) + { + shadowBarrier.Heading = rotateBarrier.Index; + } + } + + private static void BarrierMenu_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) + { + if (selectedItem == barrierList as UIMenuItem) + { + // Attach some invisible object to the cone which the AI try to drive around + // Barrier rotates with cone and becomes invisible similar to ASC when created + + if (shadowBarrier.Model.Name == "prop_flare_01b".ToUpper()) + { + SpawnFlare(); + } + else + { + SpawnBarrier(); + } + + } + + if (selectedItem == removeBarrierOptions as UIMenuItem) + { + RemoveBarrier(); + } + } + + private static void SpawnBarrier() + { + var cone = new Rage.Object(shadowBarrier.Model, shadowBarrier.Position, rotateBarrier.Index); + cone.SetPositionWithSnap(shadowBarrier.Position); + Rage.Native.NativeFunction.Natives.SET_DISABLE_FRAG_DAMAGE(cone, true); + Rage.Native.NativeFunction.Natives.SET_DISABLE_BREAKING(cone, true); + + barriers.Add(cone); + removeBarrierOptions.Enabled = true; + } + + private static void RemoveBarrier() + { + switch (removeBarrierOptions.Index) + { + case 0: + barriers[barriers.Count - 1].Delete(); + barriers.RemoveAt(barriers.Count - 1); + break; + case 1: + barriers = barriers.OrderBy(c => c.DistanceTo(Game.LocalPlayer.Character)).ToList(); + barriers[0].Delete(); + barriers.RemoveAt(0); + break; + case 2: + foreach (Rage.Object c in barriers.Where(c => c)) + { + c.Delete(); + } + if (barriers.Count > 0) + { + barriers.Clear(); + } + break; + } + + removeBarrierOptions.Enabled = barriers.Count == 0 ? false : true; + } + + private static void SpawnFlare() + { + var flare = new Weapon("weapon_flare", shadowBarrier.Position, 1); + flare.SetPositionWithSnap(shadowBarrier.Position); + + // The purpose of this fiber is to allow the flare to spawn and fall to the ground naturally before freezing its position because you can't spawn it on the ground gracefully (it stands upright) + GameFiber.StartNew(delegate + { + GameFiber.Sleep(1000); + flare.IsPositionFrozen = true; + flare.IsCollisionEnabled = false; + }); + + barriers.Add(flare); + removeBarrierOptions.Enabled = true; + } + + //------------ CREDIT PNWPARKS FOR THESE FUNCTIONS ------------\\ + // Implement Parks's 'Get Point Player is Looking At' script for better placement in 3rd person https://bitbucket.org/snippets/gtaparks/MeBKxX + internal static Vector3 GetPlayerLookingDirection(out Vector3 camPosition) + { + if (Camera.RenderingCamera) + { + camPosition = Camera.RenderingCamera.Position; + return Camera.RenderingCamera.Direction; + } + else + { + float pitch = Rage.Native.NativeFunction.Natives.GET_GAMEPLAY_CAM_RELATIVE_PITCH(); + float heading = Rage.Native.NativeFunction.Natives.GET_GAMEPLAY_CAM_RELATIVE_HEADING(); + + camPosition = Rage.Native.NativeFunction.Natives.GET_GAMEPLAY_CAM_COORD(); + return (Game.LocalPlayer.Character.Rotation + new Rotator(pitch, 0, heading)).ToVector().ToNormalized(); + } + } + + internal static Vector3 GetPlayerLookingDirection() => GetPlayerLookingDirection(out Vector3 v1); + + internal static HitResult TracePlayerView(out Vector3 start, out Vector3 end, float maxTraceDistance, TraceFlags flags) + { + Vector3 direction = GetPlayerLookingDirection(out start); + end = start + (maxTraceDistance * direction); + return World.TraceLine(start, end, flags); + } + + internal static HitResult TracePlayerView(float maxTraceDistance = 15f, TraceFlags flags = TraceFlags.IntersectEverything) => TracePlayerView(out Vector3 v1, out Vector3 v2, maxTraceDistance, flags); + //------------ CREDIT PNWPARKS FOR THESE FUNCTIONS ------------\\ + } +} diff --git a/SceneManager/Menus/EditPathMenu.cs b/SceneManager/Menus/EditPathMenu.cs new file mode 100644 index 0000000..0d7eeec --- /dev/null +++ b/SceneManager/Menus/EditPathMenu.cs @@ -0,0 +1,75 @@ +using System.Drawing; +using Rage; +using RAGENativeUI; +using RAGENativeUI.Elements; + +namespace SceneManager +{ + class EditPathMenu + { + private static UIMenuItem editPathWaypoints, deletePath; + public static UIMenuCheckboxItem togglePath, debugGraphics; + + public static void BuildEditPathMenu() + { + MenuManager.editPathMenu.AddItem(togglePath = new UIMenuCheckboxItem("Disable Path", false)); + MenuManager.editPathMenu.AddItem(editPathWaypoints = new UIMenuItem("Edit Waypoints")); + MenuManager.editPathMenu.AddItem(deletePath = new UIMenuItem("Delete Path")); + //MenuManager.editPathMenu.AddItem(debugGraphics = new UIMenuCheckboxItem("Enable Debug Graphics", false)); + + MenuManager.editPathMenu.RefreshIndex(); + MenuManager.editPathMenu.OnItemSelect += EditPath_OnItemSelected; + MenuManager.editPathMenu.OnCheckboxChange += EditPath_OnCheckboxChange; + } + + private static void EditPath_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) + { + var currentPath = TrafficMenu.paths[TrafficMenu.editPath.Index]; + + if (selectedItem == editPathWaypoints) + { + EditWaypointMenu.BuildEditWaypointMenu(); + } + + if (selectedItem == deletePath) + { + TrafficMenu.DeletePath(currentPath, currentPath.PathNum - 1, "Single"); + } + } + + private static void EditPath_OnCheckboxChange(UIMenu sender, UIMenuCheckboxItem checkboxItem, bool @checked) + { + if (checkboxItem == togglePath) + { + if (togglePath.Checked) + { + TrafficMenu.paths[TrafficMenu.editPath.Index].PathDisabled = true; + Game.LogTrivial($"Path {TrafficMenu.paths[TrafficMenu.editPath.Index].PathNum} disabled."); + + foreach (Waypoint wd in TrafficMenu.paths[TrafficMenu.editPath.Index].Waypoint) + { + wd.WaypointBlip.Alpha = 0.5f; + if (wd.CollectorRadiusBlip) + { + wd.CollectorRadiusBlip.Alpha = 0.25f; + } + } + } + else + { + TrafficMenu.paths[TrafficMenu.editPath.Index].PathDisabled = false; + Game.LogTrivial($"Path {TrafficMenu.paths[TrafficMenu.editPath.Index].PathNum} enabled."); + + foreach (Waypoint wd in TrafficMenu.paths[TrafficMenu.editPath.Index].Waypoint) + { + wd.WaypointBlip.Alpha = 1.0f; + if (wd.CollectorRadiusBlip) + { + wd.CollectorRadiusBlip.Alpha = 0.5f; + } + } + } + } + } + } +} diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs new file mode 100644 index 0000000..fa1082f --- /dev/null +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -0,0 +1,189 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Rage; +using RAGENativeUI; +using RAGENativeUI.Elements; + +namespace SceneManager +{ + class EditWaypointMenu + { + #pragma warning disable CS0618 // Type or member is obsolete, clear NUI squiggles + private static UIMenuItem editUpdateWaypoint, editRemoveWaypoint; + private static UIMenuListItem editWaypoint, changeWaypointType, changeWaypointSpeed, changeCollectorRadius; + private static UIMenuCheckboxItem collectorWaypoint, updateWaypointPosition; + + private static List pathWaypoints = new List() { }; + private static List waypointSpeeds = new List() { 5f, 10f, 15f, 20f, 30f, 40f, 50f, 60f, 70f }; + private static List waypointTypes = new List() { "Drive To", "Stop" }; + private static List collectorRadii = new List() { 3f, 5f, 10f, 15f, 20f, 30f, 40f, 50f }; + private static VehicleDrivingFlags[] drivingFlags = new VehicleDrivingFlags[] { VehicleDrivingFlags.Normal, VehicleDrivingFlags.StopAtDestination }; + + public static void BuildEditWaypointMenu() + { + // Need to unsubscribe from these or else there will be duplicate firings if the user left the menu, then re-entered + MenuManager.editWaypointMenu.OnItemSelect -= EditWaypoint_OnItemSelected; + MenuManager.editWaypointMenu.OnListChange -= EditWaypoint_OnListChanged; + + var currentPath = TrafficMenu.paths[TrafficMenu.editPath.Index]; + //var currentWaypoint = currentPath.WaypointData[editWaypoint.Index]; // Can't use this before the menu is created, will this be a problem elsewhere? + + // Populating menu list so user can select which waypoint to edit by index + pathWaypoints.Clear(); + for (int i = 0; i < currentPath.Waypoint.Count; i++) + { + pathWaypoints.Add(i + 1); + } + + MenuManager.editWaypointMenu.Clear(); + MenuManager.editWaypointMenu.AddItem(editWaypoint = new UIMenuListItem("Edit Waypoint", pathWaypoints, 0)); + MenuManager.editWaypointMenu.AddItem(changeWaypointType = new UIMenuListItem("Change Waypoint Type", waypointTypes, Array.IndexOf(drivingFlags, currentPath.Waypoint[editWaypoint.Index].DrivingFlag))); + MenuManager.editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuListItem("Change Waypoint Speed", waypointSpeeds, waypointSpeeds.IndexOf(currentPath.Waypoint[editWaypoint.Index].Speed))); + MenuManager.editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector Waypoint", TrafficMenu.paths[TrafficMenu.editPath.Index].Waypoint[editWaypoint.Index].Collector)); + MenuManager.editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListItem("Change Collection Radius", collectorRadii, collectorRadii.IndexOf(currentPath.Waypoint[editWaypoint.Index].CollectorRadius))); + MenuManager.editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); + MenuManager.editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); + MenuManager.editWaypointMenu.AddItem(editRemoveWaypoint = new UIMenuItem("Remove Waypoint")); + + MenuManager.editPathMenu.Visible = false; + MenuManager.editWaypointMenu.RefreshIndex(); + MenuManager.editWaypointMenu.Visible = true; + + MenuManager.editWaypointMenu.OnItemSelect += EditWaypoint_OnItemSelected; + MenuManager.editWaypointMenu.OnListChange += EditWaypoint_OnListChanged; + } + + private static void EditWaypoint_OnListChanged(UIMenu sender, UIMenuListItem listItem, int index) + { + var currentPath = TrafficMenu.paths[TrafficMenu.editPath.Index]; + var currentWaypoint = currentPath.Waypoint[editWaypoint.Index]; + + if (listItem == editWaypoint) + { + while (MenuManager.editWaypointMenu.MenuItems.Count > 1) + { + MenuManager.editWaypointMenu.RemoveItemAt(1); + GameFiber.Yield(); + } + + MenuManager.editWaypointMenu.AddItem(changeWaypointType = new UIMenuListItem("Change Waypoint Type", waypointTypes, Array.IndexOf(drivingFlags, currentWaypoint.DrivingFlag))); + MenuManager.editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuListItem("Change Waypoint Speed", waypointSpeeds, waypointSpeeds.IndexOf(currentWaypoint.Speed))); + MenuManager.editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Attractor Waypoint", currentWaypoint.Collector)); + MenuManager.editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListItem("Change Collection Radius", collectorRadii, collectorRadii.IndexOf(currentPath.Waypoint[editWaypoint.Index].CollectorRadius))); + MenuManager.editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); + MenuManager.editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); + MenuManager.editWaypointMenu.AddItem(editRemoveWaypoint = new UIMenuItem("Remove Waypoint")); + MenuManager.editWaypointMenu.RefreshIndex(); + } + } + + // Crashed here updating waypoint position for waypoint 2/2 + private static void EditWaypoint_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) + { + var currentPath = TrafficMenu.paths[TrafficMenu.editPath.Index]; + var currentWaypoint = currentPath.Waypoint[editWaypoint.Index]; + + if (selectedItem == editUpdateWaypoint) + { + currentWaypoint.DrivingFlag = drivingFlags[changeWaypointType.Index]; + currentWaypoint.Speed = waypointSpeeds[changeWaypointSpeed.Index]; + if (updateWaypointPosition.Checked) + { + currentWaypoint.WaypointPos = Game.LocalPlayer.Character.Position; + currentWaypoint.WaypointBlip.Position = Game.LocalPlayer.Character.Position; + if (currentWaypoint.CollectorRadiusBlip) + { + currentWaypoint.CollectorRadiusBlip.Position = Game.LocalPlayer.Character.Position; + } + } + + if (collectorWaypoint.Checked) + { + currentWaypoint.Collector = true; + var yieldZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, currentWaypoint.Speed); + currentWaypoint.YieldZone = yieldZone; + if (currentWaypoint.CollectorRadiusBlip) + { + //currentWaypoint.CollectorRadiusBlip.Color = currentWaypoint.WaypointBlip.Color; + currentWaypoint.CollectorRadiusBlip.Alpha = 0.5f; + currentWaypoint.CollectorRadiusBlip.Scale = collectorRadii[changeCollectorRadius.Index]; + } + else + { + currentWaypoint.CollectorRadiusBlip = new Blip(currentWaypoint.WaypointBlip.Position, collectorRadii[changeCollectorRadius.Index]) + { + Color = currentWaypoint.WaypointBlip.Color, + Alpha = 0.5f + }; + } + currentWaypoint.CollectorRadius = collectorRadii[changeCollectorRadius.Index]; + } + else + { + currentWaypoint.Collector = false; + World.RemoveSpeedZone(currentWaypoint.YieldZone); + currentWaypoint.YieldZone = 0; + if (currentWaypoint.CollectorRadiusBlip) + { + //currentWaypoint.CollectorRadiusBlip.Color = currentWaypoint.WaypointBlip.Color; + currentWaypoint.CollectorRadiusBlip.Alpha = 0.25f; + } + } + Game.LogTrivial($"Updated path {currentPath.PathNum} waypoint {currentWaypoint.WaypointNum}: Driving flag is {drivingFlags[changeWaypointType.Index].ToString()}, speed is {waypointSpeeds[changeWaypointSpeed.Index].ToString()}, collector is {currentWaypoint.Collector}"); + + if (currentPath.Waypoint.Count < 2 && currentPath.Waypoint[0].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + Game.LogTrivial($"The remaining waypoint was updated to be a stop waypoint. Enabling/disabling the path is no longer locked."); + EditPathMenu.togglePath.Enabled = true; + } + + Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Waypoint {currentWaypoint.WaypointNum} updated."); + } + + if (selectedItem == editRemoveWaypoint) + { + Game.LogTrivial($"[Path {currentPath.PathNum}] Waypoint {currentWaypoint.WaypointNum} ({currentWaypoint.DrivingFlag}) removed"); + if (currentPath.Waypoint.Count == 1) + { + Game.LogTrivial($"Deleting the last waypoint from the path."); + TrafficMenu.DeletePath(currentPath, currentPath.PathNum - 1, "Single"); + //pathWaypoints.Clear(); + //editPathMenu.Clear(); + MenuManager.editWaypointMenu.Visible = false; + MenuManager.pathMenu.Visible = true; + } + else + { + currentWaypoint.WaypointBlip.Delete(); // Delete the waypoint's blip + if (currentWaypoint.CollectorRadiusBlip) + { + currentWaypoint.CollectorRadiusBlip.Delete(); + } + currentPath.Waypoint.Remove(currentWaypoint); // Delete the waypoint's data object + pathWaypoints.RemoveAt(editWaypoint.Index); // Remove the waypoint from the menu list + + // Will this have adverse affects on vehicles currently following the path? + // Update waypoint number for each waypoint in the path's waypoint data + foreach (Waypoint wp in currentPath.Waypoint) + { + wp.WaypointNum = currentPath.Waypoint.IndexOf(wp) + 1; + Game.LogTrivial($"Waypoint at index {currentPath.Waypoint.IndexOf(wp)} is now waypoint #{wp.WaypointNum}"); + } + + BuildEditWaypointMenu(); + + if (currentPath.Waypoint.Count == 1 && currentPath.Waypoint[0].DrivingFlag != VehicleDrivingFlags.StopAtDestination) + { + Game.LogTrivial($"The path only has 1 waypoint left, and the waypoint is not a stop waypoint. Disabling the path."); + currentPath.PathDisabled = true; + EditPathMenu.togglePath.Checked = true; + EditPathMenu.togglePath.Enabled = false; + } + } + } + } + } +} diff --git a/SceneManager/Menus/MainMenu.cs b/SceneManager/Menus/MainMenu.cs new file mode 100644 index 0000000..d28ac27 --- /dev/null +++ b/SceneManager/Menus/MainMenu.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Rage; +using RAGENativeUI; +using RAGENativeUI.Elements; + +namespace SceneManager +{ + class MainMenu + { + private static UIMenuItem navigateToPathMenu, navigateToBarrierMenu, navigateToSettingsMenu; + + public static void BuildMainMenu() + { + MenuManager.mainMenu.AddItem(navigateToPathMenu = new UIMenuItem("~o~Path Menu")); + MenuManager.mainMenu.BindMenuToItem(MenuManager.pathMenu, navigateToPathMenu); + MenuManager.mainMenu.AddItem(navigateToBarrierMenu = new UIMenuItem("~o~Barrier Menu")); + MenuManager.mainMenu.BindMenuToItem(MenuManager.barrierMenu, navigateToBarrierMenu); + MenuManager.mainMenu.AddItem(navigateToSettingsMenu = new UIMenuItem("~o~Settings")); + MenuManager.mainMenu.BindMenuToItem(MenuManager.settingsMenu, navigateToSettingsMenu); + + MenuManager.mainMenu.RefreshIndex(); + MenuManager.mainMenu.OnItemSelect += MainMenu_OnItemSelected; + } + + private static void MainMenu_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) + { + if (selectedItem == navigateToBarrierMenu) + { + BarrierMenu.CreateShadowBarrier(MenuManager.barrierMenu); + } + } + } +} diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs new file mode 100644 index 0000000..3c141c4 --- /dev/null +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -0,0 +1,241 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Rage; +using RAGENativeUI; +using RAGENativeUI.Elements; + +namespace SceneManager +{ + class PathCreationMenu + { + #pragma warning disable CS0618 // Type or member is obsolete, clear NUI squiggles + public static UIMenuItem trafficAddWaypoint, trafficRemoveWaypoint, trafficEndPath; + public static UIMenuListItem waypointType, waypointSpeed, collectorRadius; + private static UIMenuCheckboxItem collectorWaypoint; + + private static List waypointSpeeds = new List() { 5f, 10f, 15f, 20f, 30f, 40f, 50f, 60f, 70f }; + //private enum waypointTypes {DriveTo, Stop }; + private static List waypointTypes = new List() { "Drive To", "Stop" }; + private static List collectorRadii = new List() { 3f, 5f, 10f, 15f, 20f, 30f, 40f, 50f }; + private static VehicleDrivingFlags[] drivingFlags = new VehicleDrivingFlags[] { VehicleDrivingFlags.Normal, VehicleDrivingFlags.StopAtDestination }; // Implement custom driving flag for normal + + // Called from EditPathMenu + public static void BuildPathCreationMenu() + { + MenuManager.pathCreationMenu.AddItem(waypointType = new UIMenuListItem("Waypoint Type", waypointTypes, 0)); + MenuManager.pathCreationMenu.AddItem(waypointSpeed = new UIMenuListItem($"Waypoint Speed (in {SettingsMenu.speedUnits.SelectedItem})", waypointSpeeds, 0)); + MenuManager.pathCreationMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector", false)); + MenuManager.pathCreationMenu.AddItem(collectorRadius = new UIMenuListItem("Collection Radius", collectorRadii, 0)); + MenuManager.pathCreationMenu.AddItem(trafficAddWaypoint = new UIMenuItem("Add waypoint")); + MenuManager.pathCreationMenu.AddItem(trafficRemoveWaypoint = new UIMenuItem("Remove last waypoint")); + trafficRemoveWaypoint.Enabled = false; + MenuManager.pathCreationMenu.AddItem(trafficEndPath = new UIMenuItem("End path creation")); + + MenuManager.pathCreationMenu.RefreshIndex(); + MenuManager.pathCreationMenu.OnItemSelect += PathCreation_OnItemSelected; + } + + private static void PathCreation_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) + { + // Do I need to implement a distance restriction? Idiots place waypoints unnecessarily close, possibly causing AI to drive in circles + if (selectedItem == trafficAddWaypoint) + { + uint yieldZone = 0; + float speed; + + // Loop through each path and find the first one which isn't finished + var getFirstNonNullPath = TrafficMenu.paths.Where(p => p != null && !p.PathFinished).First(); + var pathIndex = TrafficMenu.paths.IndexOf(getFirstNonNullPath); + + // Create a waypoint blip and set the sprite based on the current path number + var blip = new Blip(Game.LocalPlayer.Character.Position) + { + Scale = 0.5f + }; + switch (pathIndex) + { + case 0: + blip.Sprite = BlipSprite.Numbered1; + break; + case 1: + blip.Sprite = BlipSprite.Numbered2; + break; + case 2: + blip.Sprite = BlipSprite.Numbered3; + break; + case 3: + blip.Sprite = BlipSprite.Numbered4; + break; + case 4: + blip.Sprite = BlipSprite.Numbered5; + break; + case 5: + blip.Sprite = BlipSprite.Numbered6; + break; + case 6: + blip.Sprite = BlipSprite.Numbered7; + break; + case 7: + blip.Sprite = BlipSprite.Numbered8; + break; + } + + // If it's the first waypoint, make the blip orange, else make it yellow + if (TrafficMenu.paths[pathIndex].Waypoint.Count == 0) + { + blip.Color = Color.Orange; + } + else + { + blip.Color = Color.Yellow; + } + + if (collectorWaypoint.Checked) + { + if(SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH) + { + yieldZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index])); + } + else + { + yieldZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index])); + } + } + + if(SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH) + { + Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); + speed = MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index]); + Game.LogTrivial($"Converted speed: {speed}m/s"); + } + else + { + Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); + speed = MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index]); + Game.LogTrivial($"Converted speed: {speed}m/s"); + } + + // Add the waypoint data to the path + TrafficMenu.paths[pathIndex].Waypoint.Add(new Waypoint(pathIndex + 1, TrafficMenu.paths[pathIndex].Waypoint.Count + 1, Game.LocalPlayer.Character.Position, speed, drivingFlags[waypointType.Index], blip, collectorWaypoint.Checked, collectorRadii[collectorRadius.Index], yieldZone)); + Game.LogTrivial($"[Path {pathIndex + 1}] Waypoint {TrafficMenu.paths[pathIndex].Waypoint[TrafficMenu.paths[pathIndex].Waypoint.Count - 1].WaypointNum} ({drivingFlags[waypointType.Index].ToString()}) added"); + + // Refresh the trafficMenu after a waypoint is added in order to show Continue Creating Current Path instead of Create New Path + RefreshTrafficMenu(); + } + + if (selectedItem == trafficRemoveWaypoint) + { + // Loop through each path and find the first one which isn't finished, then delete the path's last waypoint and corresponding blip + for (int i = 0; i < TrafficMenu.paths.Count; i++) + { + if (TrafficMenu.paths.ElementAtOrDefault(i) != null && !TrafficMenu.paths[i].PathFinished) + { + Game.LogTrivial($"[Path {i + 1}] {TrafficMenu.paths[i].Waypoint.Last().DrivingFlag.ToString()} waypoint removed"); + TrafficMenu.paths[i].Waypoint.Last().WaypointBlip.Delete(); + if (TrafficMenu.paths[i].Waypoint.Last().CollectorRadiusBlip) + { + TrafficMenu.paths[i].Waypoint.Last().CollectorRadiusBlip.Delete(); + } + TrafficMenu.paths[i].Waypoint.RemoveAt(TrafficMenu.paths[i].Waypoint.IndexOf(TrafficMenu.paths[i].Waypoint.Last())); + + // If the path has no waypoints, disable the menu option to remove a waypoint + if (TrafficMenu.paths[i].Waypoint.Count == 0) + { + trafficRemoveWaypoint.Enabled = false; + } + } + } + } + + if (selectedItem == trafficEndPath) + { + // Loop through each path and find the first one which isn't finished + for (int i = 0; i < TrafficMenu.paths.Count; i++) + { + if (TrafficMenu.paths.ElementAtOrDefault(i) != null && !TrafficMenu.paths[i].PathFinished) + { + // If the path has one stop waypoint or at least two waypoints, finish the path and start the vehicle collector loop, else show user the error and delete any waypoints they made and clear the invalid path + if (TrafficMenu.paths[i].Waypoint.Count >= 2 || (TrafficMenu.paths[i].Waypoint.Count == 1 && TrafficMenu.paths[i].Waypoint[0].DrivingFlag == VehicleDrivingFlags.StopAtDestination)) + { + Game.LogTrivial($"[Path Creation] Path {i + 1} finished with {TrafficMenu.paths[i].Waypoint.Count} waypoints."); + Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Path {i + 1} complete."); + TrafficMenu.paths[i].Waypoint.Last().WaypointBlip.Color = Color.OrangeRed; + if (TrafficMenu.paths[i].Waypoint.Last().CollectorRadiusBlip) + { + TrafficMenu.paths[i].Waypoint.Last().CollectorRadiusBlip.Color = Color.OrangeRed; + } + TrafficMenu.paths[i].PathFinished = true; + TrafficMenu.paths[i].PathDisabled = false; + TrafficMenu.paths[i].PathNum = i + 1; + TrafficMenu.pathsNum.Insert(i, TrafficMenu.paths[i].PathNum); + + //GameFiber InitialWaypointVehicleCollectorFiber = new GameFiber(() => TrafficPathing.InitialWaypointVehicleCollector(paths[i])); + //InitialWaypointVehicleCollectorFiber.Start(); + + // For each waypoint in the path's WaypointData, start a collector game fiber and loop while the path and waypoint exist, and while the path is enabled + foreach (Waypoint wd in TrafficMenu.paths[i].Waypoint) + { + GameFiber WaypointVehicleCollectorFiber = new GameFiber(() => TrafficPathing.WaypointVehicleCollector(TrafficMenu.paths, TrafficMenu.paths[i], wd)); + WaypointVehicleCollectorFiber.Start(); + + GameFiber AssignStopForVehiclesFlagFiber = new GameFiber(() => TrafficPathing.AssignStopForVehiclesFlag(TrafficMenu.paths, TrafficMenu.paths[i], wd)); + AssignStopForVehiclesFlagFiber.Start(); + } + + MenuManager.menuPool.CloseAllMenus(); + MenuManager.pathMenu.Clear(); + TrafficMenu.BuildPathMenu(); + MenuManager.pathMenu.Visible = true; + break; + } + else + { + Game.LogTrivial($"[Path Error] A minimum of 2 waypoints is required."); + Game.DisplayNotification($"~o~Scene Manager\n~r~[Error]~w~ A minimum of 2 waypoints or one stop waypoint is required to create a path."); + foreach (Waypoint wd in TrafficMenu.paths[i].Waypoint) + { + wd.WaypointBlip.Delete(); + if (wd.CollectorRadiusBlip) + { + wd.CollectorRadiusBlip.Delete(); + } + } + TrafficMenu.paths[i].Waypoint.Clear(); + TrafficMenu.paths.RemoveAt(i); + break; + } + } + } + + // "Refresh" the menu to reflect the new path + //TrafficMenu.RebuildTrafficMenu(); + } + } + + private static void RefreshTrafficMenu() + { + trafficRemoveWaypoint.Enabled = true; + MenuManager.pathMenu.Clear(); + MenuManager.pathMenu.AddItem(TrafficMenu.createNewPath = new UIMenuItem("Continue Creating Current Path")); + MenuManager.pathMenu.AddItem(TrafficMenu.deleteAllPaths = new UIMenuItem("Delete All Paths")); + MenuManager.pathMenu.AddItem(TrafficMenu.directDriver = new UIMenuListItem("Direct nearest driver to path", TrafficMenu.pathsNum, 0)); + MenuManager.pathMenu.AddItem(TrafficMenu.dismissDriver = new UIMenuListItem("Dismiss nearest driver", TrafficMenu.dismissOptions, 0)); + + if (TrafficMenu.paths.Count == 8) + { + TrafficMenu.createNewPath.Enabled = false; + } + if (TrafficMenu.paths.Count == 0) + { + TrafficMenu.editPath.Enabled = false; + TrafficMenu.deleteAllPaths.Enabled = false; + TrafficMenu.disableAllPaths.Enabled = false; + TrafficMenu.directDriver.Enabled = false; + } + } + } +} diff --git a/SceneManager/Menus/TrafficMenu.cs b/SceneManager/Menus/TrafficMenu.cs new file mode 100644 index 0000000..15ca80f --- /dev/null +++ b/SceneManager/Menus/TrafficMenu.cs @@ -0,0 +1,374 @@ +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using Rage; +using RAGENativeUI; +using RAGENativeUI.Elements; + +namespace SceneManager +{ + static class TrafficMenu + { + #pragma warning disable CS0618 // Type or member is obsolete, clear NUI squiggles + public static UIMenuItem createNewPath, deleteAllPaths; + public static UIMenuListItem editPath, directDriver, dismissDriver; + public static UIMenuCheckboxItem disableAllPaths; + + public static List pathsNum = new List() { }; + public static List paths = new List() { }; + public static List dismissOptions = new List() { "From path", "From waypoint", "From position" }; + + public static void BuildPathMenu() + { + // New stuff to mitigate Rebuild method + MenuManager.pathMenu.OnItemSelect -= PathMenu_OnItemSelected; + MenuManager.pathMenu.OnCheckboxChange -= PathMenu_OnCheckboxChange; + MenuManager.menuPool.CloseAllMenus(); + MenuManager.pathMenu.Clear(); + + MenuManager.pathMenu.AddItem(createNewPath = new UIMenuItem("Create New Path")); + MenuManager.pathMenu.AddItem(editPath = new UIMenuListItem("Edit Path", pathsNum, 0)); + MenuManager.pathMenu.AddItem(disableAllPaths = new UIMenuCheckboxItem("Disable All Paths", false)); + MenuManager.pathMenu.AddItem(deleteAllPaths = new UIMenuItem("Delete All Paths")); + MenuManager.pathMenu.AddItem(directDriver = new UIMenuListItem("Direct nearest driver to path", pathsNum, 0)); + MenuManager.pathMenu.AddItem(dismissDriver = new UIMenuListItem("Dismiss nearest driver", dismissOptions, 0)); + + if (paths.Count == 8) + { + createNewPath.Enabled = false; + } + if (paths.Count == 0) + { + editPath.Enabled = false; + deleteAllPaths.Enabled = false; + disableAllPaths.Enabled = false; + directDriver.Enabled = false; + } + + MenuManager.pathMenu.RefreshIndex(); + MenuManager.pathMenu.OnItemSelect += PathMenu_OnItemSelected; + MenuManager.pathMenu.OnCheckboxChange += PathMenu_OnCheckboxChange; + + // New stuff to mitigate Rebuild method + MenuManager.menuPool.RefreshIndex(); + } + + private static bool VehicleAndDriverValid(this Vehicle v) + { + if (v && v.HasDriver && v.Driver && v.Driver.IsAlive) + { + return true; + } + else + { + return false; + } + } + + private static bool IsInCollectedVehicles(this Vehicle v) + { + if (v && TrafficPathing.collectedVehicles.ContainsKey(v.LicensePlate)) + { + Game.LogTrivial($"{v.Model.Name} was found in the collection."); + return true; + } + else + { + Game.LogTrivial($"{v.Model.Name} was not found in the collection."); + return false; + } + } + + // Refactor string param to enum + public static void DeletePath(Path path, int index, string pathsToDelete) + { + // Before deleting a path, we need to dismiss any vehicles controlled by that path and remove the vehicles from ControlledVehicles + //Game.LogTrivial($"Deleting path {index+1}"); + Game.LogTrivial($"Deleting path {path.PathNum}"); + var pathVehicles = TrafficPathing.collectedVehicles.Where(cv => cv.Value.Path == path.PathNum).ToList(); + + Game.LogTrivial($"Removing all vehicles on the path"); + foreach (KeyValuePair cv in pathVehicles.Where(cv => cv.Value.Vehicle && cv.Value.Vehicle.Driver)) + { + cv.Value.DismissNow = true; + cv.Value.Vehicle.Driver.Tasks.Clear(); + cv.Value.Vehicle.Driver.Dismiss(); + cv.Value.Vehicle.Driver.IsPersistent = false; + cv.Value.Vehicle.Dismiss(); + cv.Value.Vehicle.IsPersistent = false; + //TrafficPathing.ControlledVehicles.Remove(cv.Value.LicensePlate); + //Game.LogTrivial($"{cv.vehicle.Model.Name} cleared from path {cv.path}"); + TrafficPathing.collectedVehicles.Remove(cv.Value.LicensePlate); + } + + // Remove the speed zone so cars don't continue to be affected after the path is deleted + Game.LogTrivial($"Removing yield zone and waypoint blips"); + foreach (Waypoint wd in path.Waypoint) + { + if (wd.YieldZone != 0) + { + World.RemoveSpeedZone(wd.YieldZone); + } + if (wd.WaypointBlip) + { + wd.WaypointBlip.Delete(); + } + if (wd.CollectorRadiusBlip) + { + wd.CollectorRadiusBlip.Delete(); + } + } + + Game.LogTrivial($"Clearing path.WaypointData"); + path.Waypoint.Clear(); + // Manipulating the menu to reflect specific paths being deleted + if (pathsToDelete == "Single") + { + paths.RemoveAt(index); + //Game.LogTrivial("pathsNum count: " + pathsNum.Count); + //Game.LogTrivial("index: " + index); + pathsNum.RemoveAt(index); + //RebuildTrafficMenu(); + BuildPathMenu(); + MenuManager.pathMenu.Visible = true; + Game.LogTrivial($"Path {path.PathNum} deleted."); + Game.DisplayNotification($"~o~Scene Manager\n~w~Path {path.PathNum} deleted."); + } + + MenuManager.editPathMenu.Reset(true, true); + EditPathMenu.togglePath.Enabled = true; + } + + private static void PathMenu_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) + { + if (selectedItem == createNewPath) + { + MenuManager.pathMenu.Visible = false; + MenuManager.pathCreationMenu.Visible = true; + + // For each element in paths, determine if the element exists but is not finished yet, or if it doesn't exist, create it. + for (int i = 0; i <= paths.Count; i++) + { + if (paths.ElementAtOrDefault(i) != null && paths[i].PathFinished == false) + { + //Game.LogTrivial($"pathFinished: {paths[i].PathFinished}"); + Game.LogTrivial($"Resuming path {i + 1}"); + Game.DisplayNotification($"~o~Scene Manager\n~y~[Creating]~w~ Resuming path {i + 1}"); + break; + } + else if (paths.ElementAtOrDefault(i) == null) + { + Game.LogTrivial($"Creating path {i + 1}"); + Game.DisplayNotification($"~o~Scene Manager\n~y~[Creating]~w~ Path {i + 1} started."); + paths.Insert(i, new Path(i + 1, false)); + PathCreationMenu.trafficRemoveWaypoint.Enabled = false; + + if (SettingsMenu.debugGraphics.Checked) + { + GameFiber.StartNew(() => + { + while (SettingsMenu.debugGraphics.Checked && paths[i] != null) + { + for (int j = 0; j < paths[i].Waypoint.Count; j++) + { + if (paths[i].Waypoint[j].Collector) + { + Debug.DrawSphere(paths[i].Waypoint[j].WaypointPos, paths[i].Waypoint[j].CollectorRadius, Color.FromArgb(80, Color.Blue)); + } + else if (paths[i].Waypoint[j].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + Debug.DrawSphere(paths[i].Waypoint[j].WaypointPos, 1f, Color.FromArgb(80, Color.Red)); + } + else + { + Debug.DrawSphere(paths[i].Waypoint[j].WaypointPos, 1f, Color.FromArgb(80, Color.Green)); + } + + if (j != paths[i].Waypoint.Count - 1) + { + Debug.DrawLine(paths[i].Waypoint[j].WaypointPos, paths[i].Waypoint[j + 1].WaypointPos, Color.White); + } + } + GameFiber.Yield(); + } + }); + } + break; + } + } + } + + if (selectedItem == editPath) + { + MenuManager.pathMenu.Visible = false; + MenuManager.editPathMenu.Visible = true; + } + + if (selectedItem == deleteAllPaths) + { + // Iterate through each item in paths and delete it + for (int i = 0; i < paths.Count; i++) + { + DeletePath(paths[i], i, "All"); + } + foreach (Path path in paths) + { + path.Waypoint.Clear(); + } + paths.Clear(); + pathsNum.Clear(); + //RebuildTrafficMenu(); + BuildPathMenu(); + MenuManager.pathMenu.Visible = true; + Game.LogTrivial($"All paths deleted"); + Game.DisplayNotification($"~o~Scene Manager\n~w~All paths deleted."); + } + + if (selectedItem == directDriver) + { + var nearbyVehicle = Game.LocalPlayer.Character.GetNearbyVehicles(1).Where(v => v.VehicleAndDriverValid()).SingleOrDefault(); + if (nearbyVehicle) + { + if (nearbyVehicle.IsInCollectedVehicles()) + { + var vehicle = TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate]; + + Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} already in collection. Clearing tasks."); + nearbyVehicle.Driver.Tasks.Clear(); + vehicle.Path = paths[directDriver.Index].Waypoint[0].Path; + vehicle.TotalWaypoints = paths[directDriver.Index].Waypoint.Count; + vehicle.CurrentWaypoint = 1; + vehicle.DismissNow = true; + vehicle.StoppedAtWaypoint = false; + vehicle.Redirected = true; + GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(vehicle, paths[directDriver.Index].Waypoint)); + DirectTaskFiber.Start(); + } + else + { + TrafficPathing.collectedVehicles.Add(nearbyVehicle.LicensePlate, new ControlledVehicle(nearbyVehicle, nearbyVehicle.LicensePlate, paths[directDriver.Index].Waypoint[0].Path, paths[directDriver.Index].Waypoint.Count, 1, false, false, true)); + Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} not in collection, adding to collection for path {paths[directDriver.Index].Waypoint[0].Path} with {paths[directDriver.Index].Waypoint.Count} waypoints"); + + GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate], paths[directDriver.Index].Waypoint)); + DirectTaskFiber.Start(); + } + } + } + + if (selectedItem == dismissDriver) + { + var nearbyVehicle = Game.LocalPlayer.Character.GetNearbyVehicles(1).Where(v => v.VehicleAndDriverValid()).SingleOrDefault(); + if (nearbyVehicle) + { + switch (dismissDriver.Index) + { + case 0: + Game.LogTrivial($"Dismiss from path"); + if (nearbyVehicle.IsInCollectedVehicles()) + { + var controlledVehicle = TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate]; + controlledVehicle.DismissNow = true; + controlledVehicle.Vehicle.Driver.Tasks.Clear(); + controlledVehicle.Vehicle.Driver.Dismiss(); + Game.LogTrivial($"Dismissed driver of {controlledVehicle.Vehicle.Model.Name} from path {controlledVehicle.Path}"); + } + else + { + goto case 2; + } + break; + + case 1: + Game.LogTrivial($"Dismiss from waypoint"); + if (nearbyVehicle.IsInCollectedVehicles()) + { + var controlledVehicle = TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate]; + controlledVehicle.StoppedAtWaypoint = false; + controlledVehicle.Vehicle.Driver.Tasks.Clear(); + controlledVehicle.Vehicle.Driver.Dismiss(); + + if (controlledVehicle.CurrentWaypoint == controlledVehicle.TotalWaypoints && !controlledVehicle.StoppedAtWaypoint) + { + controlledVehicle.DismissNow = true; + Game.LogTrivial($"Dismissed driver of {controlledVehicle.Vehicle.Model.Name} from final waypoint and ultimately the path"); + } + else + { + Game.LogTrivial($"Dismissed driver of {controlledVehicle.Vehicle.Model.Name} from waypoint {controlledVehicle.CurrentWaypoint}"); + } + } + else + { + goto case 2; + } + break; + + case 2: + Game.LogTrivial($"Dismiss from position"); + if (nearbyVehicle.IsInCollectedVehicles()) + { + nearbyVehicle.Driver.Tasks.Clear(); + nearbyVehicle.Driver.Dismiss(); + Game.LogTrivial($"Dismissed driver of {nearbyVehicle.Model.Name} (in collection)"); + } + else + { + nearbyVehicle.Driver.Tasks.Clear(); + nearbyVehicle.Driver.Dismiss(); + Game.LogTrivial($"Dismissed driver of {nearbyVehicle.Model.Name} (was not in collection)"); + } + break; + + default: + Game.LogTrivial($"dismissDriver index was unexpected"); + break; + } + } + else + { + Game.LogTrivial($"There are no vehicles nearby matching the requirements."); + } + } + } + + private static void PathMenu_OnCheckboxChange(UIMenu sender, UIMenuCheckboxItem checkboxItem, bool @checked) + { + if (checkboxItem == disableAllPaths) + { + if (disableAllPaths.Checked) + { + foreach (Path path in paths) + { + path.PathDisabled = true; + foreach (Waypoint waypoint in path.Waypoint) + { + waypoint.WaypointBlip.Alpha = 0.5f; + if (waypoint.CollectorRadiusBlip) + { + waypoint.CollectorRadiusBlip.Alpha = 0.25f; + } + } + } + Game.LogTrivial($"All paths disabled."); + } + else + { + foreach (Path path in paths) + { + path.PathDisabled = false; + foreach (Waypoint waypoint in path.Waypoint) + { + waypoint.WaypointBlip.Alpha = 1f; + if (waypoint.CollectorRadiusBlip) + { + waypoint.CollectorRadiusBlip.Alpha = 0.5f; + } + } + } + Game.LogTrivial($"All paths enabled."); + } + + } + } + } +} diff --git a/SceneManager/ControlledVehicle.cs b/SceneManager/Object Classes/ControlledVehicle.cs similarity index 100% rename from SceneManager/ControlledVehicle.cs rename to SceneManager/Object Classes/ControlledVehicle.cs diff --git a/SceneManager/Object Classes/Path.cs b/SceneManager/Object Classes/Path.cs new file mode 100644 index 0000000..aa8a761 --- /dev/null +++ b/SceneManager/Object Classes/Path.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; + +namespace SceneManager +{ + public class Path + { + public int PathNum; + public bool PathFinished; + public bool PathDisabled; + public List Waypoint = new List() { }; + + public Path(int pathNum, bool pathFinished, bool pathDisabled, List waypointData) + { + PathNum = pathNum; + PathFinished = pathFinished; + PathDisabled = pathDisabled; + Waypoint = waypointData; + } + + public Path(int pathNum, bool pathFinished) + { + PathNum = pathNum; + PathFinished = pathFinished; + } + } +} diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs new file mode 100644 index 0000000..35fe941 --- /dev/null +++ b/SceneManager/Object Classes/Waypoint.cs @@ -0,0 +1,52 @@ +using Rage; + +namespace SceneManager +{ + public class Waypoint + { + public int Path; + public int WaypointNum; + public Vector3 WaypointPos; + public float Speed; + public VehicleDrivingFlags DrivingFlag; + public Blip WaypointBlip; + public uint YieldZone; + public bool Collector; + public float CollectorRadius; + public Blip CollectorRadiusBlip; + + // Can this constructor be deleted? + //public Waypoint(int path, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, uint yieldZone) + //{ + // Path = path; + // WaypointPos = waypointPos; + // Speed = speed; + // DrivingFlag = drivingFlag; + // WaypointBlip = waypointBlip; + // YieldZone = yieldZone; + //} + + public Waypoint(int path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector, float collectorRadius, uint yieldZone) + { + Path = path; + WaypointNum = waypointNum; + WaypointPos = waypointPos; + Speed = speed; + DrivingFlag = drivingFlag; + WaypointBlip = waypointBlip; + Collector = collector; + CollectorRadius = collectorRadius; + if (collector) + { + YieldZone = yieldZone; + CollectorRadiusBlip = new Blip(waypointBlip.Position, collectorRadius) + { + Color = waypointBlip.Color, + Alpha = 0.5f + }; + + + } + } + } +} diff --git a/SceneManager/PathData.cs b/SceneManager/PathData.cs deleted file mode 100644 index fb2fae7..0000000 --- a/SceneManager/PathData.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Collections.Generic; - -namespace SceneManager -{ - public class PathData - { - public int PathNum; - public bool PathFinished; - public List WaypointData = new List() { }; - - public PathData(int pathNum, bool pathFinished, List waypointData) - { - PathNum = pathNum; - PathFinished = pathFinished; - WaypointData = waypointData; - } - - public PathData(int pathNum, bool pathFinished) - { - PathNum = pathNum; - PathFinished = pathFinished; - } - } -} diff --git a/SceneManager/SceneManager.csproj b/SceneManager/SceneManager.csproj index 810e94c..44ae3a3 100644 --- a/SceneManager/SceneManager.csproj +++ b/SceneManager/SceneManager.csproj @@ -51,14 +51,22 @@ - + + + + - + + + + + - + + - + \ No newline at end of file diff --git a/SceneManager/SettingsMenu.cs b/SceneManager/SettingsMenu.cs new file mode 100644 index 0000000..dbc4d91 --- /dev/null +++ b/SceneManager/SettingsMenu.cs @@ -0,0 +1,79 @@ +using Rage; +using RAGENativeUI; +using RAGENativeUI.Elements; +using System.Drawing; +using System.Linq; + +namespace SceneManager +{ + class SettingsMenu + { + public static UIMenuCheckboxItem debugGraphics; + public static UIMenuListScrollerItem speedUnits; + public enum SpeedUnitsOfMeasure + { + MPH, + KPH + } + + public static void BuildSettingsMenu() + { + MenuManager.settingsMenu.AddItem(debugGraphics = new UIMenuCheckboxItem("Enable Debug Graphics", false)); + MenuManager.settingsMenu.AddItem(speedUnits = new UIMenuListScrollerItem("Speed Unit of Measure", "", new[] { SpeedUnitsOfMeasure.MPH, SpeedUnitsOfMeasure.KPH })); + + MenuManager.settingsMenu.OnCheckboxChange += SettingsMenu_OnCheckboxChange; + MenuManager.settingsMenu.OnScrollerChange += SettingsMenu_OnScrollerChange; + } + + private static void SettingsMenu_OnCheckboxChange(UIMenu sender, UIMenuCheckboxItem checkboxItem, bool @checked) + { + if (checkboxItem == debugGraphics) + { + // TODO: Fix graphics don't display when new path is created, have to uncheck and re-check the option + // TODO: Add branch for this during path creation ... create temp Waypoint list during path creation, then assign to path[i] after creation? + if (debugGraphics.Checked) + { + foreach (Path path in TrafficMenu.paths) + { + GameFiber.StartNew(() => + { + while (debugGraphics.Checked && path != null && path.Waypoint.Count > 0) + { + for (int i = 0; i < path.Waypoint.Count; i++) + { + if (path.Waypoint[i].Collector) + { + Debug.DrawSphere(path.Waypoint[i].WaypointPos, path.Waypoint[i].CollectorRadius, Color.FromArgb(80, Color.Blue)); + } + else if (path.Waypoint[i].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + Debug.DrawSphere(path.Waypoint[i].WaypointPos, 1f, Color.FromArgb(80, Color.Red)); + } + else + { + Debug.DrawSphere(path.Waypoint[i].WaypointPos, 1f, Color.FromArgb(80, Color.Green)); + } + + if (i != path.Waypoint.Count - 1) + { + Debug.DrawLine(path.Waypoint[i].WaypointPos, path.Waypoint[i + 1].WaypointPos, Color.White); + } + } + GameFiber.Yield(); + } + }); + } + } + } + } + + private static void SettingsMenu_OnScrollerChange(UIMenu sender, UIMenuScrollerItem scrollerItem, int oldIndex, int newIndex) + { + if (scrollerItem == speedUnits) + { + MenuManager.pathCreationMenu.Clear(); + PathCreationMenu.BuildPathCreationMenu(); + } + } + } +} \ No newline at end of file diff --git a/SceneManager/TrafficMenu.cs b/SceneManager/TrafficMenu.cs deleted file mode 100644 index eb25068..0000000 --- a/SceneManager/TrafficMenu.cs +++ /dev/null @@ -1,646 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Drawing; -using Rage; -using RAGENativeUI; -using RAGENativeUI.Elements; - -namespace SceneManager -{ - public static class TrafficMenu - { - private static MenuPool _menuPool; - private static UIMenu mainMenu, trafficMenu, coneMenu, pathCreationMenu; - private static UIMenuItem navigateToTrafficMenu, navigateToConeMenu, createNewPath, trafficAddWaypoint, trafficRemoveWaypoint, trafficEndPath, deleteAllPaths, addCone, removeLastCone, removeNearestCone, removeAllCones, dismissDriver; - private static UIMenuListItem deleteSinglePath, selectCone, waypointType, waypointSpeed, directDriver; - - private static List pathsNum = new List() { }; - private static List paths = new List() { }; - private static List cones = new List() { }; - - private static List waypointSpeeds = new List() { 5, 10, 15, 20, 30, 40, 50, 60, 70 }; - private static List waypointTypes = new List() { "Drive To", "Stop" }; - private static VehicleDrivingFlags[] drivingFlags = new VehicleDrivingFlags[] { VehicleDrivingFlags.Normal, VehicleDrivingFlags.StopAtDestination }; - private static List coneList = new List() { "Large Striped Cone", "Large Cone", "Medium Striped Cone", "Medium Cone", "Roadpole A", "Roadpole B" }; - private static string[] coneObjectNames = new string[] { "prop_mp_cone_01", "prop_roadcone01c", "prop_mp_cone_02", "prop_mp_cone_03", "prop_roadpole_01a", "prop_roadpole_01b" }; - - private static Rage.Object shadowCone; - - public static void CheckUserInput() - { - #pragma warning disable CS0618 // Type or member is obsolete, clear NUI squiggles in BuildMenu - AppDomain.CurrentDomain.DomainUnload += MyTerminationHandler; - - BuildMenu(); - - while (true) - { - // Keyboard - if (EntryPoint.Settings.ModifierKey == System.Windows.Forms.Keys.None) - { - if (Game.LocalPlayer.Character.IsOnFoot && Game.IsKeyDown(EntryPoint.Settings.ToggleKey) && !trafficMenu.Visible && !pathCreationMenu.Visible) - { - mainMenu.Visible = !mainMenu.Visible; - } - } - else if (Game.LocalPlayer.Character.IsOnFoot && Game.IsKeyDownRightNow(EntryPoint.Settings.ModifierKey) && Game.IsKeyDown(EntryPoint.Settings.ToggleKey) && !trafficMenu.Visible && !pathCreationMenu.Visible) - { - mainMenu.Visible = !mainMenu.Visible; - } - - // Controller - if (EntryPoint.Settings.ModifierButton == ControllerButtons.None) - { - if (Game.LocalPlayer.Character.IsOnFoot && Game.IsControllerButtonDown(EntryPoint.Settings.ToggleButton) && !trafficMenu.Visible && !pathCreationMenu.Visible) - { - mainMenu.Visible = !mainMenu.Visible; - } - } - else if (Game.LocalPlayer.Character.IsOnFoot && Game.IsControllerButtonDownRightNow(EntryPoint.Settings.ModifierButton) && Game.IsControllerButtonDown(EntryPoint.Settings.ToggleButton) && !trafficMenu.Visible && !pathCreationMenu.Visible) - { - mainMenu.Visible = !mainMenu.Visible; - } - - _menuPool.ProcessMenus(); - GameFiber.Yield(); - } - } - - private static void BuildMenu() - { - _menuPool = new MenuPool(); - - // Instantiate menus - mainMenu = new UIMenu("Scene Manager", ""); - trafficMenu = new UIMenu("Scene Manager", "~o~Traffic Menu"); - trafficMenu.ParentMenu = mainMenu; - pathCreationMenu = new UIMenu("Scene Manager", "~o~Path Creation"); - pathCreationMenu.ParentMenu = trafficMenu; - coneMenu = new UIMenu("Scene Manager", "~o~Cone Menu"); - coneMenu.ParentMenu = mainMenu; - - // Add menus to the pool - _menuPool.Add(mainMenu); - _menuPool.Add(trafficMenu); - _menuPool.Add(coneMenu); - _menuPool.Add(pathCreationMenu); - - // Add menu items to main menu and navigate each item to a submenu - mainMenu.AddItem(navigateToTrafficMenu = new UIMenuItem("~o~Traffic Menu")); - mainMenu.BindMenuToItem(trafficMenu, navigateToTrafficMenu); - mainMenu.AddItem(navigateToConeMenu = new UIMenuItem("~o~Cone Menu")); - mainMenu.BindMenuToItem(coneMenu, navigateToConeMenu); - - // Add menu items to trafficMenu - trafficMenu.AddItem(createNewPath = new UIMenuItem("Create New Path")); - trafficMenu.AddItem(deleteSinglePath = new UIMenuListItem("Delete Path", pathsNum, 0)); - deleteSinglePath.Enabled = false; - trafficMenu.AddItem(deleteAllPaths = new UIMenuItem("Delete All Paths")); - deleteAllPaths.Enabled = false; - trafficMenu.AddItem(directDriver = new UIMenuListItem("Direct nearest driver to path", pathsNum, 0)); - directDriver.Enabled = false; - trafficMenu.AddItem(dismissDriver = new UIMenuItem("Dismiss nearest driver")); - - // Add menu items to pathCreationMenu - pathCreationMenu.AddItem(waypointType = new UIMenuListItem("Waypoint Type", waypointTypes, 0)); - pathCreationMenu.AddItem(waypointSpeed = new UIMenuListItem("Waypoint Speed", waypointSpeeds, 0)); - pathCreationMenu.AddItem(trafficAddWaypoint = new UIMenuItem("Add waypoint")); - pathCreationMenu.AddItem(trafficRemoveWaypoint = new UIMenuItem("Remove last waypoint")); - trafficRemoveWaypoint.Enabled = false; - pathCreationMenu.AddItem(trafficEndPath = new UIMenuItem("End path creation")); - - // Add menu items to coneMenu - coneMenu.AddItem(selectCone = new UIMenuListItem("Select Cone", coneList, 0)); - coneMenu.AddItem(addCone = new UIMenuItem("Add Cone")); - coneMenu.AddItem(removeLastCone = new UIMenuItem("Remove Last Cone")); - removeLastCone.Enabled = false; - coneMenu.AddItem(removeNearestCone = new UIMenuItem("Remove Nearest Cone")); - removeNearestCone.Enabled = false; - coneMenu.AddItem(removeAllCones = new UIMenuItem("Remove All Cones")); - removeAllCones.Enabled = false; - - mainMenu.RefreshIndex(); - trafficMenu.RefreshIndex(); - pathCreationMenu.RefreshIndex(); - coneMenu.RefreshIndex(); - - // Event handlers for when a menu item is selected - mainMenu.OnItemSelect += MainMenu_OnItemSelected; - trafficMenu.OnItemSelect += TrafficMenu_OnItemSelected; - pathCreationMenu.OnItemSelect += PathCreation_OnItemSelected; - coneMenu.OnListChange += ConeMenu_OnListChange; - coneMenu.OnItemSelect += ConeMenu_OnItemSelected; - - // Disable mouse control for the menus - mainMenu.MouseControlsEnabled = false; - mainMenu.AllowCameraMovement = true; - trafficMenu.MouseControlsEnabled = false; - trafficMenu.AllowCameraMovement = true; - pathCreationMenu.MouseControlsEnabled = false; - pathCreationMenu.AllowCameraMovement = true; - coneMenu.MouseControlsEnabled = false; - coneMenu.AllowCameraMovement = true; - } - - private static void RebuildTrafficMenu() - { - // The traffic menu has to be "refreshed" in some instances to show changes, so we do that here - _menuPool.CloseAllMenus(); - trafficMenu.Clear(); - trafficMenu.AddItem(createNewPath = new UIMenuItem("Create New Path")); - trafficMenu.AddItem(deleteSinglePath = new UIMenuListItem("Delete Path", pathsNum, 0)); - trafficMenu.AddItem(deleteAllPaths = new UIMenuItem("Delete All Paths")); - trafficMenu.AddItem(directDriver = new UIMenuListItem("Direct nearest driver to path", pathsNum, 0)); - trafficMenu.AddItem(dismissDriver = new UIMenuItem("Dismiss nearest driver")); - - if (paths.Count == 8) - { - createNewPath.Enabled = false; - } - if (paths.Count == 0) - { - deleteSinglePath.Enabled = false; - deleteAllPaths.Enabled = false; - directDriver.Enabled = false; - } - _menuPool.RefreshIndex(); - trafficMenu.Visible = true; - } - - private static void DeletePath(PathData path, int index, UIMenuItem selectedItem) - { - // Before deleting a path, we need to dismiss any vehicles controlled by that path and remove the vehicles from ControlledVehicles - //Game.LogTrivial($"Deleting path {index+1}"); - Game.LogTrivial($"Deleting path {path.WaypointData[0].Path}"); - var matchingVehicle = TrafficPathing.ControlledVehicles.Where(cv => cv.Value.Path == path.WaypointData[0].Path).ToList(); - Game.LogTrivial($"Running foreach loop"); - foreach (KeyValuePair cv in matchingVehicle) - { - if (cv.Value.Vehicle.Exists() && cv.Value.Vehicle.IsValid() && cv.Value.Vehicle.Driver.Exists() && cv.Value.Vehicle.Driver.IsValid()) - { - cv.Value.DismissNow = true; - cv.Value.Vehicle.Driver.Tasks.Clear(); - cv.Value.Vehicle.Driver.Dismiss(); - TrafficPathing.ControlledVehicles.Remove(cv.Value.LicensePlate); - //Game.LogTrivial($"{cv.vehicle.Model.Name} cleared from path {cv.path}"); - } - } - Game.LogTrivial($"Remove all vehicles in the path"); - //TrafficPathing.ControlledVehicles.RemoveAll(cv => cv.Path == path.WaypointData[0].Path); - - // Remove the speed zone so cars don't continue to be affected after the path is deleted - foreach (WaypointData wd in path.WaypointData) - { - if (wd == path.WaypointData[0]) - { - World.RemoveSpeedZone(wd.YieldZone); - } - wd.WaypointBlip.Delete(); - } - path.WaypointData.Clear(); - - // Manipulating the menu to reflect specific paths being deleted - if (selectedItem == deleteSinglePath) - { - Game.LogTrivial($"Path {path.PathNum} deleted."); - Game.DisplayNotification($"~o~Scene Manager\n~w~Path {path.PathNum} deleted."); - paths.RemoveAt(index); - //Game.LogTrivial("pathsNum count: " + pathsNum.Count); - //Game.LogTrivial("index: " + index); - pathsNum.RemoveAt(index); - RebuildTrafficMenu(); - } - } - - private static void TrafficMenu_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) - { - if (selectedItem == createNewPath) - { - trafficMenu.Visible = false; - pathCreationMenu.Visible = true; - - // For each element in paths, determine if the element exists but is not finished yet, or if it doesn't exist, create it. - for(int i = 0; i <= paths.Count; i++) - { - if (paths.ElementAtOrDefault(i) != null && paths[i].PathFinished == false) - { - //Game.LogTrivial($"pathFinished: {paths[i].PathFinished}"); - Game.LogTrivial($"Resuming path {i+1}"); - Game.DisplayNotification($"~o~Scene Manager\n~y~[Creating]~w~ Resuming path {i+1}"); - break; - } - else if (paths.ElementAtOrDefault(i) == null) - { - Game.LogTrivial($"Creating path {i+1}"); - Game.DisplayNotification($"~o~Scene Manager\n~y~[Creating]~w~ Path {i+1} started."); - paths.Insert(i, new PathData(i+1,false));// { pathNum = i+1, pathFinished = false }); - trafficRemoveWaypoint.Enabled = false; - break; - } - } - } - - if (selectedItem == deleteSinglePath) - { - //Game.LogTrivial("pathsNum has " + pathsNum.Count + " items before deleting a path."); - //Game.LogTrivial("deletePath index is " + deletePath.Index); - //Game.LogTrivial("deletePath selectedPath is " + deletePath.IndexToItem(deletePath.Index)); - DeletePath(paths[deleteSinglePath.Index], deleteSinglePath.Index, deleteSinglePath); - } - - if (selectedItem == deleteAllPaths) - { - // Iterate through each item in paths and delete it - for(int i = 0; i < paths.Count; i++) - { - DeletePath(paths[i], i, deleteAllPaths); - } - pathsNum.Clear(); - paths.Clear(); - RebuildTrafficMenu(); - Game.LogTrivial($"All paths deleted"); - Game.DisplayNotification($"~o~Scene Manager\n~w~All paths deleted."); - } - - if (selectedItem == directDriver) - { - // Sometimes GetNearbyVehicles will cause a crash for some reason, so keeping it in a try/catch will prevent that. - try - { - foreach (Vehicle v in Game.LocalPlayer.Character.GetNearbyVehicles(5)) - { - if (v.Exists() && v.IsValid() && v.HasDriver && v.Driver.IsAlive) - { - // Check if there's a matching vehicle in ControlledVehicles. If so, check if it has tasks and proceed, else add it to the collection and assign tasks - var matchingVehicle = TrafficPathing.ControlledVehicles.Where(cv => cv.Value.Vehicle == v).ToList(); - if (matchingVehicle.ElementAtOrDefault(0).Value != null && matchingVehicle[0].Value.TasksAssigned) - { - Game.LogTrivial($"[Direct Driver] {v.Model.Name} already in collection with tasks. Clearing tasks."); - v.Driver.Tasks.Clear(); - matchingVehicle[0].Value.Path = paths[directDriver.Index].WaypointData[0].Path; - matchingVehicle[0].Value.TotalWaypoints = paths[directDriver.Index].WaypointData.Count; - matchingVehicle[0].Value.CurrentWaypoint = 1; - matchingVehicle[0].Value.DismissNow = true; - matchingVehicle[0].Value.StoppedAtWaypoint = false; - matchingVehicle[0].Value.Redirected = true; - GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(matchingVehicle[0].Value, paths[directDriver.Index].WaypointData)); - DirectTaskFiber.Start(); - } - else if(matchingVehicle.ElementAtOrDefault(0).Value != null && !matchingVehicle[0].Value.TasksAssigned) - { - Game.LogTrivial($"[Direct Driver] {v.Model.Name} already in collection, but with no tasks."); - v.Driver.Tasks.Clear(); - matchingVehicle[0].Value.Path = paths[directDriver.Index].WaypointData[0].Path; - matchingVehicle[0].Value.TotalWaypoints = paths[directDriver.Index].WaypointData.Count; - matchingVehicle[0].Value.CurrentWaypoint = 1; - matchingVehicle[0].Value.DismissNow = true; - matchingVehicle[0].Value.StoppedAtWaypoint = false; - matchingVehicle[0].Value.Redirected = true; - GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(matchingVehicle[0].Value, paths[directDriver.Index].WaypointData)); - DirectTaskFiber.Start(); - } - else - { - TrafficPathing.ControlledVehicles.Add(v.LicensePlate, new ControlledVehicle(v, v.LicensePlate, paths[directDriver.Index].WaypointData[0].Path, paths[directDriver.Index].WaypointData.Count, 1, false, false, true)); - Game.LogTrivial($"[Direct Driver] {v.Model.Name} not in collection, adding to collection for path {paths[directDriver.Index].WaypointData[0].Path} with {paths[directDriver.Index].WaypointData.Count} waypoints"); - - GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(TrafficPathing.ControlledVehicles[v.LicensePlate], paths[directDriver.Index].WaypointData)); - DirectTaskFiber.Start(); - } - Game.LogTrivial($"Directed driver of {v.Model.Name} to path {paths[directDriver.Index].WaypointData[0].Path}."); - break; - } - } - } - catch - { - Game.LogTrivial($"No vehicles nearby"); - } - - } - - if (selectedItem == dismissDriver) - { - // Check for nearby vehicles, and if the vehicle is being controlled, release it - GameFiber.StartNew(delegate { - foreach (Vehicle v in Game.LocalPlayer.Character.GetNearbyVehicles(5)) - { - try - { - if (v.Exists() && v.IsValid() && v.HasDriver && v.Driver.IsAlive) - { - var matchingVehicle = TrafficPathing.ControlledVehicles.Where(cv => cv.Value.Vehicle == v).ToList(); - if (matchingVehicle.ElementAtOrDefault(0).Value != null && matchingVehicle[0].Value.CurrentWaypoint < matchingVehicle[0].Value.TotalWaypoints && !matchingVehicle[0].Value.StoppedAtWaypoint) - { - matchingVehicle[0].Value.DismissNow = true; - v.Driver.Tasks.Clear(); - v.Driver.Dismiss(); - Game.LogTrivial($"Dismissed driver of {v.Model.Name} from the path"); - } - else if (matchingVehicle.ElementAtOrDefault(0).Value != null && matchingVehicle[0].Value.CurrentWaypoint < matchingVehicle[0].Value.TotalWaypoints) - { - matchingVehicle[0].Value.StoppedAtWaypoint = false; - Game.LogTrivial($"Dismissed driver of {v.Model.Name} from waypoint {matchingVehicle[0].Value.CurrentWaypoint}"); - } - else if (matchingVehicle.ElementAtOrDefault(0).Value != null && matchingVehicle[0].Value.CurrentWaypoint == matchingVehicle[0].Value.TotalWaypoints) - { - matchingVehicle[0].Value.StoppedAtWaypoint = false; - matchingVehicle[0].Value.DismissNow = true; - v.Driver.Tasks.Clear(); - v.Driver.Dismiss(); - Game.LogTrivial($"Dismissed driver of {v.Model.Name} from final waypoint and ultimately the path"); - } - else if (matchingVehicle.ElementAtOrDefault(0).Value != null) - { - matchingVehicle[0].Value.DismissNow = true; - v.Driver.Tasks.Clear(); - v.Driver.Dismiss(); - Game.LogTrivial($"Dismissed driver of {v.Model.Name} from path {matchingVehicle[0].Value.Path}"); - } - else - { - v.Driver.Tasks.Clear(); - v.Driver.Dismiss(); - Game.LogTrivial($"Dismissed driver of {v.Model.Name} (was not in collection)"); - } - - break; - } - } - catch - { - Game.LogTrivial($"Something went wrong getting nearby vehicles to dismiss"); - } - } - }); - } - } - - private static void PathCreation_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) - { - if (selectedItem == trafficAddWaypoint) - { - // Loop through each path and find the first one which isn't finished - for (int i = 0; i < paths.Count; i++) - { - if (paths.ElementAtOrDefault(i) != null && !paths.ElementAtOrDefault(i).PathFinished) - { - // Create a waypoint blip and set the sprite based on the current path number - Blip blip = new Blip(Game.LocalPlayer.Character.Position); - blip.Scale = 0.5f; - switch (i) - { - case 0: - blip.Sprite = BlipSprite.Numbered1; - break; - case 1: - blip.Sprite = BlipSprite.Numbered2; - break; - case 2: - blip.Sprite = BlipSprite.Numbered3; - break; - case 3: - blip.Sprite = BlipSprite.Numbered4; - break; - case 4: - blip.Sprite = BlipSprite.Numbered5; - break; - case 5: - blip.Sprite = BlipSprite.Numbered6; - break; - case 6: - blip.Sprite = BlipSprite.Numbered7; - break; - case 7: - blip.Sprite = BlipSprite.Numbered8; - break; - } - - // If it's the first waypoint, make the blip orange, else make it yellow - if (paths[i].WaypointData.Count == 0) - { - blip.Color = Color.Orange; - } - else - { - blip.Color = Color.Yellow; - } - - // Add the waypoint data to the path - paths[i].WaypointData.Add(new WaypointData(i+1, Game.LocalPlayer.Character.Position, waypointSpeeds[waypointSpeed.Index], drivingFlags[waypointType.Index], blip)); - Game.LogTrivial($"[Path {i+1}] {drivingFlags[waypointType.Index].ToString()} waypoint added"); - } - } - - // Refresh the trafficMenu after a waypoint is added in order to show Continue Creating Current Path instead of Create New Path - trafficRemoveWaypoint.Enabled = true; - trafficMenu.Clear(); - trafficMenu.AddItem(createNewPath = new UIMenuItem("Continue Creating Current Path")); - trafficMenu.AddItem(deleteSinglePath = new UIMenuListItem("Delete Path", pathsNum, 0)); - trafficMenu.AddItem(deleteAllPaths = new UIMenuItem("Delete All Paths")); - trafficMenu.AddItem(directDriver = new UIMenuListItem("Direct nearest driver to path", pathsNum, 0)); - trafficMenu.AddItem(dismissDriver = new UIMenuItem("Dismiss nearest driver")); - if (pathsNum.Count == 8) - { - createNewPath.Enabled = false; - } - if (pathsNum.Count == 0) - { - deleteSinglePath.Enabled = false; - deleteAllPaths.Enabled = false; - directDriver.Enabled = false; - } - //_menuPool.RefreshIndex(); // Disabling this to stop resetting waypoint menu after waypoint is added - } - - if (selectedItem == trafficRemoveWaypoint) - { - // Loop through each path and find the first one which isn't finished, then delete the path's last waypoint and corresponding blip - for (int i = 0; i < paths.Count; i++) - { - if (paths.ElementAtOrDefault(i) != null && !paths[i].PathFinished) - { - Game.LogTrivial($"[Path {i+1}] {paths[i].WaypointData.Last().DrivingFlag.ToString()} waypoint removed"); - paths[i].WaypointData.Last().WaypointBlip.Delete(); - paths[i].WaypointData.RemoveAt(paths[i].WaypointData.IndexOf(paths[i].WaypointData.Last())); - - // If the path has no waypoints, disable the menu option to remove a waypoint - if (paths[i].WaypointData.Count == 0) - { - trafficRemoveWaypoint.Enabled = false; - } - } - } - } - - if (selectedItem == trafficEndPath) - { - // Loop through each path and find the first one which isn't finished - for (int i = 0; i < paths.Count; i++) - { - if (paths.ElementAtOrDefault(i) != null && !paths[i].PathFinished) - { - // If the path has one stop waypoint or at least two waypoints, finish the path and start the vehicle collector loop, else show user the error and delete any waypoints they made and clear the invalid path - if (paths[i].WaypointData.Count >= 2 || (paths[i].WaypointData.Count == 1 && paths[i].WaypointData[0].DrivingFlag == VehicleDrivingFlags.StopAtDestination)) - { - Game.LogTrivial($"[Path Creation] Path {i+1} finished with {paths[i].WaypointData.Count} waypoints."); - Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Path {i+1} complete."); - paths[i].WaypointData.Last().WaypointBlip.Color = Color.OrangeRed; - paths[i].PathFinished = true; - paths[i].PathNum = i + 1; - pathsNum.Insert(i, paths[i].PathNum); - - GameFiber InitialWaypointVehicleCollectorFiber = new GameFiber(() => TrafficPathing.InitialWaypointVehicleCollector(paths[i].WaypointData)); - InitialWaypointVehicleCollectorFiber.Start(); - break; - } - else - { - Game.LogTrivial($"[Path Error] A minimum of 2 waypoints is required."); - Game.DisplayNotification($"~o~Scene Manager\n~r~[Error]~w~ A minimum of 2 waypoints or one stop waypoint is required to create a path."); - foreach (WaypointData wd in paths[i].WaypointData) - { - wd.WaypointBlip.Delete(); - } - paths[i].WaypointData.Clear(); - paths.RemoveAt(i); - break; - } - } - } - - // "Refresh" the menu to reflect the new path - RebuildTrafficMenu(); - } - } - - private static void ConeMenu_OnListChange(UIMenu sender, UIMenuListItem listItem, int index) - { - if (shadowCone.Exists()) - { - shadowCone.IsVisible = false; - } - - shadowCone = new Rage.Object(coneObjectNames[selectCone.Index], Game.LocalPlayer.Character.GetOffsetPosition(new Vector3(0f, 3f, -1f))); - shadowCone.Opacity = 70f; - shadowCone.IsCollisionEnabled = false; - } - - private static void MainMenu_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) - { - if (selectedItem == navigateToConeMenu) - { - if (EntryPoint.Settings.EnableHints) - { - Game.DisplayNotification($"~o~Scene Manager\n~y~[Hint]~y~ ~w~It's easier to place cones in first-person view."); - } - - shadowCone = new Rage.Object(coneObjectNames[selectCone.Index], Game.LocalPlayer.Character.GetOffsetPosition(new Vector3(0f, 3f, -1f))); - shadowCone.IsCollisionEnabled = false; - shadowCone.Opacity = 70f; - - GameFiber ConeHoverFiber = new GameFiber(() => ConeHover(sender, selectedItem, index)); - ConeHoverFiber.Start(); - } - } - - private static void ConeHover(UIMenu sender, UIMenuItem selectedItem, int index) - { - // Run a loop to show currently selected cone hovering in front of player - //Game.LogTrivial("Creating shadow cone"); - - while (coneMenu.Visible) - { - shadowCone.Position = Game.LocalPlayer.Character.GetOffsetPosition(new Vector3(0f, 3f, -1f)); - GameFiber.Yield(); - } - } - - private static void ConeMenu_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) - { - Rage.Object cone; - if (selectedItem == addCone) - { - // Attach some invisible object to the cone which the AI try to drive around - // Barrier, new rotate option in menu, barrier rotates with cone and becomes invisible similar to ASC when created - cone = new Rage.Object(shadowCone.Model, shadowCone.Position); - cones.Add(cone); - } - - if (selectedItem == removeLastCone) - { - //Game.LogTrivial($"cones count before deletion: {cones.Count}"); - cones[cones.Count - 1].Delete(); - cones.RemoveAt(cones.Count - 1); - //Game.LogTrivial($"cones count after deletion: {cones.Count}"); - } - - if (selectedItem == removeNearestCone) - { - cones = cones.OrderBy(o => o.DistanceTo(Game.LocalPlayer.Character)).ToList(); - cones[0].Delete(); - cones.RemoveAt(0); - //Game.LogTrivial($"cones count: {cones.Count}"); - } - - if (selectedItem == removeAllCones) - { - foreach (Rage.Object c in cones) - { - c.Delete(); - } - if (cones.Count > 0) - { - cones.Clear(); - } - //Game.LogTrivial($"cones count: {cones.Count}"); - } - - coneMenu.RemoveItemAt(2); - coneMenu.RemoveItemAt(2); - coneMenu.RemoveItemAt(2); - coneMenu.AddItem(removeLastCone = new UIMenuItem("Remove Last Cone")); - if (cones.Count == 0) - { - removeLastCone.Enabled = false; - } - coneMenu.AddItem(removeNearestCone = new UIMenuItem("Remove Nearest Cone")); - if (cones.Count == 0) - { - removeNearestCone.Enabled = false; - } - coneMenu.AddItem(removeAllCones = new UIMenuItem("Remove All Cones")); - if (cones.Count == 0) - { - removeAllCones.Enabled = false; - } - } - - private static void MyTerminationHandler(object sender, EventArgs e) - { - // Clean up paths - for (int i = 0; i < paths.Count; i++) - { - DeletePath(paths[i], i, deleteAllPaths); - } - - // Clean up cones - foreach (Rage.Object cone in cones) - { - if (cone.IsValid() && cone.Exists()) - { - cone.Delete(); - } - } - - // Clear everything - cones.Clear(); - TrafficPathing.ControlledVehicles.Clear(); - - Game.LogTrivial($"Scene Manager has been terminated."); - Game.DisplayNotification($"~o~Scene Manager\n~r~[Notice]~w~ The plugin has shut down."); - } - - } -} diff --git a/SceneManager/TrafficPathing.cs b/SceneManager/TrafficPathing.cs index a59edab..d7497a3 100644 --- a/SceneManager/TrafficPathing.cs +++ b/SceneManager/TrafficPathing.cs @@ -1,189 +1,166 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Drawing; using Rage; namespace SceneManager { public static class TrafficPathing { - public static Dictionary ControlledVehicles = new Dictionary(); - //public static List ControlledVehicles = new List { }; + public static Dictionary collectedVehicles = new Dictionary(); - public static void InitialWaypointVehicleCollector(List waypointData) + public static void WaypointVehicleCollector(List paths, Path path, Waypoint waypoint) { - waypointData[0].YieldZone = World.AddSpeedZone(waypointData[0].WaypointPos, 10f, waypointData[0].Speed); + //GameFiber AssignStopForVehiclesFlagFiber = new GameFiber(() => AssignStopForVehiclesFlag(paths, path, waypointData)); + //AssignStopForVehiclesFlagFiber.Start(); - // If there's a path with a single stop waypoint, run a loop to give all nearby AI the StopForVehicle driving flag so they don't just go around - if(waypointData.Count == 1) + while (paths.Contains(path) && path.Waypoint.Contains(waypoint)) { - GameFiber.StartNew(delegate + if (!path.PathDisabled && waypoint.Collector) { - while (waypointData.ElementAtOrDefault(0) != null) + foreach (Vehicle v in GetNearbyVehicles(waypoint.WaypointPos, waypoint.CollectorRadius).Where(v => v.IsValidForCollection())) { - foreach (Vehicle v in GetNearbyVehicles(waypointData[0].WaypointPos, 50f)) - { - if(v.Exists() && v.IsValid() && v.HasDriver && v.Driver.Exists() && v.Driver.IsValid()) - { - SetDriveTaskDrivingFlags(v.Driver, EDrivingFlags.StopForVehicles); - } - } - GameFiber.Yield(); - } - }); - } + v.IsPersistent = true; + v.Driver.IsPersistent = true; + v.Driver.BlockPermanentEvents = true; + v.Driver.Tasks.Clear(); - while (waypointData.ElementAtOrDefault(0) != null) - { - //Game.DisplaySubtitle($"Vehicles in collection: {ControlledVehicles.Count()}"); - // Getting vehicles within 3f of waypoint - try - { - foreach (Vehicle v in GetNearbyVehicles(waypointData[0].WaypointPos, 3f)) - { - // No protection for player if they drive into the waypoints - if(VehicleAndDriverValid(v) && v != Game.LocalPlayer.Character.CurrentVehicle && v.HasDriver && v.Driver.IsAlive && (v.IsCar || v.IsBike || v.IsBicycle || v.IsQuadBike)) + // If the vehicle is not in the collection yet + if (!collectedVehicles.ContainsKey(v.LicensePlate)) { - // Check if there's an object in the list with a matching vehicle - var matchingVehicle = ControlledVehicles.Where(cv => cv.Value.Vehicle == v).ToList(); - // If there's a match, then check if the first match has tasksAssigned. If not, AssignTasks - if (matchingVehicle.ElementAtOrDefault(0).Value != null && !matchingVehicle[0].Value.TasksAssigned && !matchingVehicle[0].Value.DismissNow) - { - Game.LogTrivial($"[InitialWaypointVehicleCollector] {v.Model.Name} already in collection, but with no tasks. Assigning tasks."); - matchingVehicle[0].Value.TasksAssigned = true; - GameFiber AssignTasksFiber = new GameFiber(() => AssignTasks(matchingVehicle[0].Value, waypointData)); - AssignTasksFiber.Start(); - } - // Else if object doesn't exist, add to collection and AssignTasks - else if (matchingVehicle.ElementAtOrDefault(0).Value != null && matchingVehicle[0].Value.TasksAssigned) - { - //Game.LogTrivial($"Vehicle already in collection with tasks. Do nothing."); - } - else - { - ControlledVehicles.Add(v.LicensePlate, new ControlledVehicle(v, v.LicensePlate, waypointData[0].Path, waypointData.Count, 1, true, false, false)); - Game.LogTrivial($"Added {v.Model.Name} to collection from initial waypoint at path {waypointData[0].Path} with {waypointData.Count} waypoints"); + var collectedVehicle = new ControlledVehicle(v, v.LicensePlate, path.PathNum, path.Waypoint.Count, waypoint.WaypointNum, true, false, false); + collectedVehicles.Add(v.LicensePlate, collectedVehicle); + Game.LogTrivial($"[WaypointVehicleCollector] Added {v.Model.Name} to collection from path {path.PathNum}, waypoint {waypoint.WaypointNum}."); - GameFiber AssignTasksFiber = new GameFiber(() => AssignTasks(ControlledVehicles[v.LicensePlate], waypointData)); - AssignTasksFiber.Start(); - } + GameFiber DismissCheckFiber = new GameFiber(() => VehicleDismissed(collectedVehicle, path.Waypoint)); + DismissCheckFiber.Start(); + + AssignTasks(collectedVehicle, path.Waypoint, waypoint); + } + // If the vehicle is in the collection, but has no tasks + else if (collectedVehicles.ContainsKey(v.LicensePlate) && !collectedVehicles[v.LicensePlate].TasksAssigned) + { + Game.LogTrivial($"[WaypointVehicleCollector] {v.Model.Name} already in collection, but with no tasks. Assigning tasks."); + collectedVehicles[v.LicensePlate].TasksAssigned = true; + + AssignTasks(collectedVehicles[v.LicensePlate], path.Waypoint, waypoint); + } + // If the vehicle is in the collection and has tasks + else + { + Game.LogTrivial($"[WaypointVehicleCollector]: {v.Model.Name} was not collected because it's already in the collection and has tasks."); } - GameFiber.Yield(); } } - catch - { - Game.LogTrivial($"There was a problem getting vehicles near the start waypoint"); - } - - GameFiber.Yield(); + GameFiber.Sleep(100); + //GameFiber.Yield(); } } - public static void DirectTask(ControlledVehicle cv, List waypointData) + private static bool IsValidForCollection(this Vehicle v) { - cv.DismissNow = false; - if (VehicleAndDriverValid(cv)) + if (v && v.HasDriver && v.Driver && v.Driver.IsAlive && v != Game.LocalPlayer.Character.CurrentVehicle && (v.IsCar || v.IsBike || v.IsBicycle || v.IsQuadBike || (v.HasSiren && !v.IsSirenOn))) { - cv.Vehicle.IsPersistent = true; - cv.Vehicle.Driver.BlockPermanentEvents = true; - cv.Vehicle.Driver.Tasks.Clear(); + return true; } - - // Give vehicle task to initial waypoint of desired path, then run a loop to keep giving the task until they're close enough in case they try to wander away too early - cv.Vehicle.Driver.Tasks.DriveToPosition(waypointData[0].WaypointPos, waypointData[0].Speed, VehicleDrivingFlags.FollowTraffic, 1f); - while (waypointData.ElementAtOrDefault(0) != null && VehicleAndDriverValid(cv) && cv.Vehicle.DistanceTo(waypointData[0].WaypointPos) > 3f && !cv.DismissNow) + else { - cv.Vehicle.Driver.Tasks.DriveToPosition(waypointData[0].WaypointPos, waypointData[0].Speed, VehicleDrivingFlags.FollowTraffic, 1f); - GameFiber.Sleep(500); + return false; } - cv.Redirected = false; - Game.LogTrivial($"DirectTask loop over"); } - private static void AssignTasks(ControlledVehicle cv, List waypointData) + private static void AssignTasks(ControlledVehicle collectedVehicle, List waypointData, Waypoint waypoint) { - if (VehicleAndDriverValid(cv)) + if (waypointData.Count == 1) { - cv.Vehicle.IsPersistent = true; - cv.Vehicle.Driver.BlockPermanentEvents = true; - cv.Vehicle.Driver.Tasks.Clear(); + GameFiber AssignSingleTaskFiber = new GameFiber(() => AssignSingleWaypointTask(collectedVehicle, waypointData)); + AssignSingleTaskFiber.Start(); } - - if (waypointData.Count == 1 && VehicleAndDriverValid(cv) && !cv.DismissNow) + else if (waypointData.Count > 1) { - AssignSingleWaypointTask(cv, waypointData); - + GameFiber AssignMultiTaskFiber = new GameFiber(() => AssignMultiWaypointTasks(collectedVehicle, waypointData, waypoint)); + AssignMultiTaskFiber.Start(); } - else if(waypointData.Count > 1 && VehicleAndDriverValid(cv)) - { - AssignMultiWaypointTasks(cv, waypointData); - } - while(!cv.DismissNow || cv.StoppedAtWaypoint) - { - GameFiber.Yield(); - } - ControlledVehicles.Remove(cv.LicensePlate); - Game.LogTrivial($"AssignTasks exit"); } - private static void AssignSingleWaypointTask(ControlledVehicle cv, List waypointData) + // TODO: Combine single and multiwaypoint tasks into one method + private static void AssignSingleWaypointTask(ControlledVehicle cv, List waypointData) { // Give driver a task to the single path waypoint. Run a loop with a condition checking for DismissNow for cases where the driver is dismissed or redirected Game.LogTrivial($"Assigning task for single waypoint."); - cv.Vehicle.Driver.Tasks.DriveToPosition(waypointData[0].WaypointPos, waypointData[0].Speed, VehicleDrivingFlags.FollowTraffic, 1f); - while (waypointData.ElementAtOrDefault(0) != null && VehicleAndDriverValid(cv) && cv.Vehicle.DistanceTo(waypointData[0].WaypointPos) > 3f && !cv.DismissNow) + cv.Vehicle.Driver.Tasks.DriveToPosition(waypointData[0].WaypointPos, waypointData[0].Speed, (VehicleDrivingFlags)262539, 1f); + //SetDriveTaskDrivingFlags(cv.Vehicle.Driver, EDrivingFlags.TotalControl); + while (waypointData.ElementAtOrDefault(0) != null && cv.Vehicle && cv.Vehicle.Driver && cv.Vehicle.DistanceTo(waypointData[0].WaypointPos) > 3f && !cv.DismissNow) { GameFiber.Sleep(1000); } - Game.LogTrivial($"{cv.Vehicle.Model.Name} should be stopped at the waypoint."); - cv.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking);//.WaitForCompletion(); - cv.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.Wait); - cv.StoppedAtWaypoint = true; + + if (cv.DismissNow) + { + Game.LogTrivial($"{cv.Vehicle.Model.Name} dismissed while in AssignSingleWaypointTask."); + } + else + { + Game.LogTrivial($"{cv.Vehicle.Model.Name} should be stopped at the waypoint."); + cv.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking);//.WaitForCompletion(); + cv.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.Wait); + cv.StoppedAtWaypoint = true; + } } - private static void AssignMultiWaypointTasks(ControlledVehicle cv, List waypointData) + private static void AssignMultiWaypointTasks(ControlledVehicle cv, List waypointData, Waypoint collectorWaypoint) { // For each waypoint in the path, give driver a task to that waypoint - for (int i = 1; i < waypointData.Count; i++) + // i needs to be the index of the waypoint the vehicle was collected from + for (int i = waypointData.IndexOf(collectorWaypoint); i < waypointData.Count; i++) + //for (int i = 1; i < waypointData.Count; i++) { - if (cv.DismissNow) + if (!cv.DismissNow) { - break; - } - Game.LogTrivial($"Assigning task to {cv.Vehicle.Model.Name} for waypoint {i+1} of {waypointData.Count}"); - cv.CurrentWaypoint++; - //if (VehicleAndDriverValid(cv) && waypointData.ElementAtOrDefault(i) != null && i == waypointData.IndexOf(waypointData.Last()) && waypointData.Last().DrivingFlag == VehicleDrivingFlags.StopAtDestination) - if (VehicleAndDriverValid(cv) && waypointData.ElementAtOrDefault(i) != null && waypointData[i].DrivingFlag == VehicleDrivingFlags.StopAtDestination) // NEW - { - // Give driver a task to the waypoint. Run a loop with a condition checking for DismissNow for cases where the driver is dismissed or redirected - cv.Vehicle.Driver.Tasks.DriveToPosition(waypointData[i].WaypointPos, waypointData[i].Speed, VehicleDrivingFlags.FollowTraffic, 1f); - while (waypointData.ElementAtOrDefault(i) != null && cv.Vehicle.DistanceTo(waypointData[i].WaypointPos) > 3f && !cv.DismissNow) + cv.CurrentWaypoint = waypointData[i].WaypointNum; + var nextWaypoint = i + 1; + Game.LogTrivial($"Assigning task to {cv.Vehicle.Model.Name} from waypoint {nextWaypoint} of {waypointData.Count}"); + + if (cv.Vehicle && cv.Vehicle.Driver && waypointData.ElementAtOrDefault(nextWaypoint) != null && waypointData[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) { - GameFiber.Yield(); - } - if (cv.DismissNow) - { - break; - } - if (waypointData.ElementAtOrDefault(i) != null) - { - Game.LogTrivial($"{cv.Vehicle.Model.Name} stopping at stop waypoint"); - //Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(v, 3f, 1, false); - cv.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); - cv.StoppedAtWaypoint = true; - while(waypointData.ElementAtOrDefault(i) != null && cv.StoppedAtWaypoint && !cv.DismissNow) + // Give driver a task to the waypoint. Run a loop with a condition checking for DismissNow for cases where the driver is dismissed or redirected + SetDriveTaskDrivingFlags(cv.Vehicle.Driver, EDrivingFlags.TotalControl); + if (waypointData[nextWaypoint] != null) { - GameFiber.Yield(); + //Game.LogTrivial($"Driving to stop waypoint"); + cv.Vehicle.Driver.Tasks.DriveToPosition(waypointData[nextWaypoint].WaypointPos, waypointData[nextWaypoint].Speed, (VehicleDrivingFlags)262539, 1f); + } + else + { + Game.LogTrivial($"i is out of bounds for assigning task"); + } + + while (cv.Vehicle && cv.Vehicle.Driver && waypointData.ElementAtOrDefault(nextWaypoint) != null && cv.Vehicle.DistanceTo(waypointData[nextWaypoint].WaypointPos) > 3f && !cv.DismissNow) + { + GameFiber.Sleep(100); + } + + if (waypointData.ElementAtOrDefault(i) != null && !cv.DismissNow) + { + Game.LogTrivial($"{cv.Vehicle.Model.Name} stopping at stop waypoint"); + cv.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); + cv.StoppedAtWaypoint = true; } } + else if (cv.Vehicle && cv.Vehicle.Driver && waypointData.ElementAtOrDefault(nextWaypoint) != null && !cv.DismissNow) + { + cv.Vehicle.Driver.Tasks.DriveToPosition(waypointData[nextWaypoint].WaypointPos, waypointData[nextWaypoint].Speed, (VehicleDrivingFlags)262539, 1f).WaitForCompletion(); + } + Game.LogTrivial($"{cv.Vehicle.Model.Name} waypoint {nextWaypoint} task complete"); } - else if (VehicleAndDriverValid(cv) && waypointData.ElementAtOrDefault(i) != null && !cv.DismissNow) + else { - cv.Vehicle.Driver.Tasks.DriveToPosition(waypointData[i].WaypointPos, waypointData[i].Speed, VehicleDrivingFlags.FollowTraffic, 1f).WaitForCompletion(); + Game.LogTrivial($"{cv.Vehicle.Model.Name} was dismissed while in AssignMultiWaypointTasks"); + break; } - Game.LogTrivial($"{cv.Vehicle.Model.Name} waypoint {i+1} task complete"); } + if (cv.Redirected) { Game.LogTrivial($"{cv.Vehicle.Model.Name} was redirected, all old path tasks have been cleared."); @@ -193,45 +170,102 @@ namespace SceneManager Game.LogTrivial($"{cv.Vehicle.Model.Name} all path {cv.Path} tasks complete."); } - cv.TasksAssigned = false; + DismissDriver(cv); + } + + private static void DismissDriver(ControlledVehicle cv) + { cv.DismissNow = true; cv.StoppedAtWaypoint = false; - if (VehicleAndDriverValid(cv) && !cv.Redirected) + if (cv.Vehicle && cv.Vehicle.Driver && !cv.Redirected) { cv.Vehicle.Driver.Dismiss(); cv.Vehicle.Driver.Tasks.Clear(); - //cv.Vehicle.IsPersistent = false; cv.Vehicle.Driver.BlockPermanentEvents = false; + cv.Vehicle.Driver.IsPersistent = false; + + cv.Vehicle.Dismiss(); + cv.Vehicle.IsPersistent = false; + + Game.LogTrivial($"{cv.Vehicle.Model.Name} dismissed successfully."); } - else if(!VehicleAndDriverValid(cv)) + else if (!cv.Vehicle) { - Game.LogTrivial($"The vehicle is not valid after tasks completed."); + Game.LogTrivial($"{cv.Vehicle.Model.Name} is not valid after tasks completed."); + } + else if (!cv.Vehicle.Driver) + { + Game.LogTrivial($"{cv.Vehicle.Model.Name} driver is not valid after tasks completed."); } } - private static bool VehicleAndDriverValid(Vehicle v) + public static void AssignStopForVehiclesFlag(List paths, Path path, Waypoint waypointData) { - // Ensure everything is valid before we do stuff with them so there isn't a crash - if (v.Exists() && v.IsValid() && v.Driver.Exists() && v.Driver.IsValid()) + while (paths.Contains(path) && path.Waypoint.Contains(waypointData)) { - return true; - } - else - { - return false; + if (!path.PathDisabled) + { + foreach (Vehicle v in GetNearbyVehicles(waypointData.WaypointPos, 50f).Where(v => v && v.HasDriver && v.Driver)) + { + SetDriveTaskDrivingFlags(v.Driver, EDrivingFlags.StopForVehicles); + } + } + GameFiber.Sleep(500); } } - private static bool VehicleAndDriverValid(ControlledVehicle cv) + public static void DirectTask(ControlledVehicle cv, List waypointData) { - // Ensure everything is valid before we do stuff with them so there isn't a crash - if(cv.Vehicle.Exists() && cv.Vehicle.IsValid() && cv.Vehicle.Driver.Exists() && cv.Vehicle.Driver.IsValid()) + cv.DismissNow = false; + if (cv.Vehicle && cv.Vehicle.Driver) { - return true; + cv.Vehicle.IsPersistent = true; + cv.Vehicle.Driver.IsPersistent = true; + cv.Vehicle.Driver.BlockPermanentEvents = true; + cv.Vehicle.Driver.Tasks.Clear(); } - else + + // Give vehicle task to initial waypoint of desired path, then run a loop to keep giving the task until they're close enough in case they try to wander away too early + // Need to figure out how to only get waypoints which are in front of or within 90 degrees of either side of the vehicle + var nearestWaypoint = waypointData.OrderBy(wp => wp.WaypointPos).Take(1) as Waypoint; + + cv.Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint.WaypointPos, nearestWaypoint.Speed, (VehicleDrivingFlags)262539, 1f); // waypointData[0].WaypointPos + while (waypointData.ElementAtOrDefault(0) != null && cv.Vehicle && cv.Vehicle.Driver && cv.Vehicle.DistanceTo(waypointData[0].WaypointPos) > 3f && !cv.DismissNow) { - return false; + cv.Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint.WaypointPos, nearestWaypoint.Speed, (VehicleDrivingFlags)262539, 1f); + GameFiber.Sleep(500); + } + cv.Redirected = false; + Game.LogTrivial($"DirectTask loop over"); + } + + private static void VehicleDismissed(ControlledVehicle cv, List waypointData) + { + while (!cv.DismissNow) + { + GameFiber.Sleep(500); + } + Game.LogTrivial($"{cv.Vehicle.Model.Name} was dismissed (dismissal check loop)."); + + + Game.LogTrivial($"Looping to ensure the vehicle is far enough away from all attractor waypoints so it can be removed from the collection."); + while (true) + { + var collectorWaypoints = waypointData.Where(wp => wp.Collector); + var vehicleFarEnoughAwayFromCollectors = collectorWaypoints.All(wp => cv.Vehicle.DistanceTo(wp.WaypointPos) > wp.CollectorRadius); + + if (collectedVehicles.ContainsKey(cv.LicensePlate) && vehicleFarEnoughAwayFromCollectors) + { + Game.LogTrivial($"{cv.Vehicle.Model.Name} is far enough away from all attractor waypoints and has been removed from the collection."); + cv.TasksAssigned = false; + cv.Vehicle.Driver.BlockPermanentEvents = false; + cv.Vehicle.Driver.IsPersistent = false; + cv.Vehicle.IsPersistent = false; + collectedVehicles.Remove(cv.LicensePlate); + + break; + } + GameFiber.Sleep(1000); } } @@ -241,6 +275,7 @@ namespace SceneManager } // Driving styles https://gtaforums.com/topic/822314-guide-driving-styles/ + // also https://vespura.com/fivem/drivingstyle/ [Flags] public enum EDrivingFlags { @@ -248,13 +283,17 @@ namespace SceneManager StopForVehicles = 1, StopForPeds = 2, AvoidEmptyVehicles = 8, + AvoidPeds = 16, + AvoidObjects = 32, StopForTrafficLights = 128, UseBlinkers = 256, + AllowWrongWay = 512, TakeShortestPath = 262144, IgnoreRoads = 4194304, + IgnorePathfinding = 16777216, AvoidHighways = 536870912, Normal = StopForVehicles | StopForPeds | AvoidEmptyVehicles | StopForTrafficLights | UseBlinkers, - //TotalControl = AllowMedianCrossing | AllowWrongWay | DriveAroundObjects | DriveAroundPeds | DriveBySight | FollowTraffic | IgnorePathfinding + TotalControl = AllowWrongWay | AvoidObjects | AvoidPeds | TakeShortestPath | StopForTrafficLights | IgnorePathfinding | StopForVehicles } public static void SetDriveTaskDrivingFlags(this Ped ped, EDrivingFlags flags) @@ -264,23 +303,3 @@ namespace SceneManager } } } - -/* - //while (waypointData.ElementAtOrDefault(0) != null && v.Exists() && v.IsValid() && v.Driver.Exists() && v.Driver.IsValid() && !cv.DismissNow) - //{ - //if (waypointData.ElementAtOrDefault(0) == null || cv.DismissNow) - //{ - //driver.Tasks.Clear(); - //Game.LogTrivial($"{v.Model.Name} released from wait loop"); - //break; - //} - //else if (waypointData.ElementAtOrDefault(0) != null && !cv.DismissNow && v.Driver.IsInVehicle(v, false)) - //{ - v.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); - //v.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.Wait); - //} - //GameFiber.Yield(); - //} - //v.Driver.Tasks.Clear(); - //Game.LogTrivial($"{v.Model.Name} is dismissed or the driver is not in the vehicle."); -*/ diff --git a/SceneManager/WaypointData.cs b/SceneManager/WaypointData.cs deleted file mode 100644 index 4244352..0000000 --- a/SceneManager/WaypointData.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Rage; - -namespace SceneManager -{ - public class WaypointData - { - public int Path; - public Vector3 WaypointPos; - public float Speed; - public VehicleDrivingFlags DrivingFlag; - public Blip WaypointBlip; - public uint YieldZone; - - public WaypointData(int path, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, uint yieldZone) - { - Path = path; - WaypointPos = waypointPos; - Speed = speed; - DrivingFlag = drivingFlag; - WaypointBlip = waypointBlip; - YieldZone = yieldZone; - } - - public WaypointData(int path, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip) - { - Path = path; - WaypointPos = waypointPos; - Speed = speed; - DrivingFlag = drivingFlag; - WaypointBlip = waypointBlip; - } - } -} From 2d85e65b320b946995262c68d9571614c5566835 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 18 Aug 2020 19:02:15 -0600 Subject: [PATCH 006/276] Moved SettingsMenu and MenuManager to Menus folder --- SceneManager/{ => Menus}/MenuManager.cs | 0 SceneManager/{ => Menus}/SettingsMenu.cs | 0 SceneManager/SceneManager.csproj | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) rename SceneManager/{ => Menus}/MenuManager.cs (100%) rename SceneManager/{ => Menus}/SettingsMenu.cs (100%) diff --git a/SceneManager/MenuManager.cs b/SceneManager/Menus/MenuManager.cs similarity index 100% rename from SceneManager/MenuManager.cs rename to SceneManager/Menus/MenuManager.cs diff --git a/SceneManager/SettingsMenu.cs b/SceneManager/Menus/SettingsMenu.cs similarity index 100% rename from SceneManager/SettingsMenu.cs rename to SceneManager/Menus/SettingsMenu.cs diff --git a/SceneManager/SceneManager.csproj b/SceneManager/SceneManager.csproj index 44ae3a3..420631b 100644 --- a/SceneManager/SceneManager.csproj +++ b/SceneManager/SceneManager.csproj @@ -58,12 +58,12 @@ - + - + From c48d1ea8ed16c7e7a96df8815c1d605b0f6d1a5a Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 08:47:28 -0600 Subject: [PATCH 007/276] Renamed ControlledVehicle object and class to CollectedVehicle --- SceneManager/Menus/TrafficMenu.cs | 4 ++-- ...{ControlledVehicle.cs => CollectedVehicle.cs} | 4 ++-- SceneManager/SceneManager.csproj | 2 +- SceneManager/TrafficPathing.cs | 16 ++++++++-------- 4 files changed, 13 insertions(+), 13 deletions(-) rename SceneManager/Object Classes/{ControlledVehicle.cs => CollectedVehicle.cs} (76%) diff --git a/SceneManager/Menus/TrafficMenu.cs b/SceneManager/Menus/TrafficMenu.cs index 15ca80f..395afaa 100644 --- a/SceneManager/Menus/TrafficMenu.cs +++ b/SceneManager/Menus/TrafficMenu.cs @@ -88,7 +88,7 @@ namespace SceneManager var pathVehicles = TrafficPathing.collectedVehicles.Where(cv => cv.Value.Path == path.PathNum).ToList(); Game.LogTrivial($"Removing all vehicles on the path"); - foreach (KeyValuePair cv in pathVehicles.Where(cv => cv.Value.Vehicle && cv.Value.Vehicle.Driver)) + foreach (KeyValuePair cv in pathVehicles.Where(cv => cv.Value.Vehicle && cv.Value.Vehicle.Driver)) { cv.Value.DismissNow = true; cv.Value.Vehicle.Driver.Tasks.Clear(); @@ -246,7 +246,7 @@ namespace SceneManager } else { - TrafficPathing.collectedVehicles.Add(nearbyVehicle.LicensePlate, new ControlledVehicle(nearbyVehicle, nearbyVehicle.LicensePlate, paths[directDriver.Index].Waypoint[0].Path, paths[directDriver.Index].Waypoint.Count, 1, false, false, true)); + TrafficPathing.collectedVehicles.Add(nearbyVehicle.LicensePlate, new CollectedVehicle(nearbyVehicle, nearbyVehicle.LicensePlate, paths[directDriver.Index].Waypoint[0].Path, paths[directDriver.Index].Waypoint.Count, 1, false, false, true)); Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} not in collection, adding to collection for path {paths[directDriver.Index].Waypoint[0].Path} with {paths[directDriver.Index].Waypoint.Count} waypoints"); GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate], paths[directDriver.Index].Waypoint)); diff --git a/SceneManager/Object Classes/ControlledVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs similarity index 76% rename from SceneManager/Object Classes/ControlledVehicle.cs rename to SceneManager/Object Classes/CollectedVehicle.cs index b7a9492..a1c0970 100644 --- a/SceneManager/Object Classes/ControlledVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -2,7 +2,7 @@ namespace SceneManager { - public class ControlledVehicle + public class CollectedVehicle { public Vehicle Vehicle; public string LicensePlate; @@ -14,7 +14,7 @@ namespace SceneManager public bool StoppedAtWaypoint; public bool Redirected; - public ControlledVehicle(Vehicle vehicle, string licensePlate, int path, int totalWaypoints, int currentWaypoint, bool tasksAssigned, bool dismissNow, bool redirected) + public CollectedVehicle(Vehicle vehicle, string licensePlate, int path, int totalWaypoints, int currentWaypoint, bool tasksAssigned, bool dismissNow, bool redirected) { Vehicle = vehicle; LicensePlate = licensePlate; diff --git a/SceneManager/SceneManager.csproj b/SceneManager/SceneManager.csproj index 420631b..b137cc0 100644 --- a/SceneManager/SceneManager.csproj +++ b/SceneManager/SceneManager.csproj @@ -52,7 +52,7 @@ - + diff --git a/SceneManager/TrafficPathing.cs b/SceneManager/TrafficPathing.cs index d7497a3..558bc45 100644 --- a/SceneManager/TrafficPathing.cs +++ b/SceneManager/TrafficPathing.cs @@ -8,7 +8,7 @@ namespace SceneManager { public static class TrafficPathing { - public static Dictionary collectedVehicles = new Dictionary(); + public static Dictionary collectedVehicles = new Dictionary(); public static void WaypointVehicleCollector(List paths, Path path, Waypoint waypoint) { @@ -29,7 +29,7 @@ namespace SceneManager // If the vehicle is not in the collection yet if (!collectedVehicles.ContainsKey(v.LicensePlate)) { - var collectedVehicle = new ControlledVehicle(v, v.LicensePlate, path.PathNum, path.Waypoint.Count, waypoint.WaypointNum, true, false, false); + var collectedVehicle = new CollectedVehicle(v, v.LicensePlate, path.PathNum, path.Waypoint.Count, waypoint.WaypointNum, true, false, false); collectedVehicles.Add(v.LicensePlate, collectedVehicle); Game.LogTrivial($"[WaypointVehicleCollector] Added {v.Model.Name} to collection from path {path.PathNum}, waypoint {waypoint.WaypointNum}."); @@ -70,7 +70,7 @@ namespace SceneManager } } - private static void AssignTasks(ControlledVehicle collectedVehicle, List waypointData, Waypoint waypoint) + private static void AssignTasks(CollectedVehicle collectedVehicle, List waypointData, Waypoint waypoint) { if (waypointData.Count == 1) { @@ -85,7 +85,7 @@ namespace SceneManager } // TODO: Combine single and multiwaypoint tasks into one method - private static void AssignSingleWaypointTask(ControlledVehicle cv, List waypointData) + private static void AssignSingleWaypointTask(CollectedVehicle cv, List waypointData) { // Give driver a task to the single path waypoint. Run a loop with a condition checking for DismissNow for cases where the driver is dismissed or redirected Game.LogTrivial($"Assigning task for single waypoint."); @@ -109,7 +109,7 @@ namespace SceneManager } } - private static void AssignMultiWaypointTasks(ControlledVehicle cv, List waypointData, Waypoint collectorWaypoint) + private static void AssignMultiWaypointTasks(CollectedVehicle cv, List waypointData, Waypoint collectorWaypoint) { // For each waypoint in the path, give driver a task to that waypoint // i needs to be the index of the waypoint the vehicle was collected from @@ -173,7 +173,7 @@ namespace SceneManager DismissDriver(cv); } - private static void DismissDriver(ControlledVehicle cv) + private static void DismissDriver(CollectedVehicle cv) { cv.DismissNow = true; cv.StoppedAtWaypoint = false; @@ -214,7 +214,7 @@ namespace SceneManager } } - public static void DirectTask(ControlledVehicle cv, List waypointData) + public static void DirectTask(CollectedVehicle cv, List waypointData) { cv.DismissNow = false; if (cv.Vehicle && cv.Vehicle.Driver) @@ -239,7 +239,7 @@ namespace SceneManager Game.LogTrivial($"DirectTask loop over"); } - private static void VehicleDismissed(ControlledVehicle cv, List waypointData) + private static void VehicleDismissed(CollectedVehicle cv, List waypointData) { while (!cv.DismissNow) { From d8bf8992f0d3e64c5c732140eb836c1cbd3c9b59 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 12:17:06 -0600 Subject: [PATCH 008/276] Changed sphere and line colors for debug graphics based on waypoint types --- SceneManager/Menus/SettingsMenu.cs | 43 +++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/SceneManager/Menus/SettingsMenu.cs b/SceneManager/Menus/SettingsMenu.cs index dbc4d91..9b3d438 100644 --- a/SceneManager/Menus/SettingsMenu.cs +++ b/SceneManager/Menus/SettingsMenu.cs @@ -41,22 +41,11 @@ namespace SceneManager { for (int i = 0; i < path.Waypoint.Count; i++) { - if (path.Waypoint[i].Collector) - { - Debug.DrawSphere(path.Waypoint[i].WaypointPos, path.Waypoint[i].CollectorRadius, Color.FromArgb(80, Color.Blue)); - } - else if (path.Waypoint[i].DrivingFlag == VehicleDrivingFlags.StopAtDestination) - { - Debug.DrawSphere(path.Waypoint[i].WaypointPos, 1f, Color.FromArgb(80, Color.Red)); - } - else - { - Debug.DrawSphere(path.Waypoint[i].WaypointPos, 1f, Color.FromArgb(80, Color.Green)); - } + DrawSpheresAtWaypoints(path, i); if (i != path.Waypoint.Count - 1) { - Debug.DrawLine(path.Waypoint[i].WaypointPos, path.Waypoint[i + 1].WaypointPos, Color.White); + DrawLinesBetweenWaypoints(path, i); } } GameFiber.Yield(); @@ -67,6 +56,34 @@ namespace SceneManager } } + private static void DrawLinesBetweenWaypoints(Path path, int i) + { + if (path.Waypoint[i+1].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + Debug.DrawLine(path.Waypoint[i].WaypointPos, path.Waypoint[i + 1].WaypointPos, Color.Orange); + } + else + { + Debug.DrawLine(path.Waypoint[i].WaypointPos, path.Waypoint[i + 1].WaypointPos, Color.Green); + } + } + + private static void DrawSpheresAtWaypoints(Path path, int i) + { + if (path.Waypoint[i].Collector) + { + Debug.DrawSphere(path.Waypoint[i].WaypointPos, path.Waypoint[i].CollectorRadius, Color.FromArgb(80, Color.Blue)); + } + else if (path.Waypoint[i].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + Debug.DrawSphere(path.Waypoint[i].WaypointPos, 1f, Color.FromArgb(80, Color.Red)); + } + else + { + Debug.DrawSphere(path.Waypoint[i].WaypointPos, 1f, Color.FromArgb(80, Color.Green)); + } + } + private static void SettingsMenu_OnScrollerChange(UIMenu sender, UIMenuScrollerItem scrollerItem, int oldIndex, int newIndex) { if (scrollerItem == speedUnits) From 7c6a3fdfcfa1ee36b9c3602630cd6aca734c02c8 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 15:29:49 -0600 Subject: [PATCH 009/276] Extracted debug graphics code to separate class --- SceneManager/DebugGraphics.cs | 54 +++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 SceneManager/DebugGraphics.cs diff --git a/SceneManager/DebugGraphics.cs b/SceneManager/DebugGraphics.cs new file mode 100644 index 0000000..ee97d0c --- /dev/null +++ b/SceneManager/DebugGraphics.cs @@ -0,0 +1,54 @@ +using Rage; +using RAGENativeUI.Elements; +using System.Drawing; + +namespace SceneManager +{ + class DebugGraphics + { + public static void LoopToDrawDebugGraphics(UIMenuCheckboxItem debugGraphics, Path path) + { + while (debugGraphics.Checked && path != null) + { + for (int i = 0; i < path.Waypoint.Count; i++) + { + DrawSpheresAtWaypoints(path, i); + + if (i != path.Waypoint.Count - 1) + { + DrawLinesBetweenWaypoints(path, i); + } + } + GameFiber.Yield(); + } + } + + public static void DrawLinesBetweenWaypoints(Path path, int i) + { + if (path.Waypoint[i + 1].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + Debug.DrawLine(path.Waypoint[i].Position, path.Waypoint[i + 1].Position, Color.Orange); + } + else + { + Debug.DrawLine(path.Waypoint[i].Position, path.Waypoint[i + 1].Position, Color.Green); + } + } + + public static void DrawSpheresAtWaypoints(Path path, int i) + { + if (path.Waypoint[i].Collector) + { + Debug.DrawSphere(path.Waypoint[i].Position, path.Waypoint[i].CollectorRadius, Color.FromArgb(80, Color.Blue)); + } + else if (path.Waypoint[i].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + Debug.DrawSphere(path.Waypoint[i].Position, 1f, Color.FromArgb(80, Color.Red)); + } + else + { + Debug.DrawSphere(path.Waypoint[i].Position, 1f, Color.FromArgb(80, Color.Green)); + } + } + } +} From 0dc3b19bc21ba5a2ddfe74b1836337e91fa2e7ab Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 15:31:10 -0600 Subject: [PATCH 010/276] Refactored with more encapsulation, better protection for class fields --- SceneManager/Object Classes/Waypoint.cs | 132 ++++++++++++++++++------ 1 file changed, 101 insertions(+), 31 deletions(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 35fe941..bc0d4f1 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -1,52 +1,122 @@ using Rage; +using System.Runtime.InteropServices; namespace SceneManager { public class Waypoint { - public int Path; - public int WaypointNum; - public Vector3 WaypointPos; - public float Speed; - public VehicleDrivingFlags DrivingFlag; - public Blip WaypointBlip; - public uint YieldZone; - public bool Collector; - public float CollectorRadius; - public Blip CollectorRadiusBlip; + public int Path { get; private set; } + public int Number { get; private set; } + public Vector3 Position { get; private set; } + public float Speed { get; private set; } + public VehicleDrivingFlags DrivingFlag { get; private set; } + public Blip Blip { get; private set; } + public uint YieldZone { get; private set; } + public bool Collector { get; private set; } + public float CollectorRadius { get; private set; } + public Blip CollectorRadiusBlip { get; private set; } - // Can this constructor be deleted? - //public Waypoint(int path, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, uint yieldZone) - //{ - // Path = path; - // WaypointPos = waypointPos; - // Speed = speed; - // DrivingFlag = drivingFlag; - // WaypointBlip = waypointBlip; - // YieldZone = yieldZone; - //} + public Waypoint(int path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip) + { + Path = path; + Number = waypointNum; + Position = waypointPos; + Speed = speed; + DrivingFlag = drivingFlag; + Blip = waypointBlip; + + } public Waypoint(int path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector, float collectorRadius, uint yieldZone) { Path = path; - WaypointNum = waypointNum; - WaypointPos = waypointPos; + Number = waypointNum; + Position = waypointPos; Speed = speed; DrivingFlag = drivingFlag; - WaypointBlip = waypointBlip; + Blip = waypointBlip; Collector = collector; CollectorRadius = collectorRadius; - if (collector) + YieldZone = yieldZone; + CollectorRadiusBlip = new Blip(waypointBlip.Position, collectorRadius) { - YieldZone = yieldZone; - CollectorRadiusBlip = new Blip(waypointBlip.Position, collectorRadius) - { - Color = waypointBlip.Color, - Alpha = 0.5f - }; - + Color = waypointBlip.Color, + Alpha = 0.5f + }; + } + public void UpdateWaypoint(Waypoint currentWaypoint, VehicleDrivingFlags drivingFlag, float drivingSpeed, bool collectorWaypointChecked, float collectorRadius, bool updateWaypointPositionChecked) + { + UpdateDrivingFlag(drivingFlag); + UpdateWaypointSpeed(drivingSpeed); + UpdateCollectorOptions(currentWaypoint, drivingSpeed, collectorWaypointChecked, collectorRadius); + if (updateWaypointPositionChecked) + { + UpdateWaypointPosition(Game.LocalPlayer.Character.Position); } } + + private void UpdateCollectorOptions(Waypoint currentWaypoint, float drivingSpeed, bool collectorWaypointChecked, float collectorRadius) + { + if (collectorWaypointChecked) + { + Collector = true; + YieldZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, drivingSpeed); + if (CollectorRadiusBlip) + { + currentWaypoint.CollectorRadiusBlip.Alpha = 0.5f; + currentWaypoint.CollectorRadiusBlip.Scale = collectorRadius; + } + else + { + CollectorRadiusBlip = new Blip(Blip.Position, collectorRadius) + { + Color = Blip.Color, + Alpha = 0.5f + }; + } + CollectorRadius = collectorRadius; + } + else + { + Collector = false; + World.RemoveSpeedZone(YieldZone); + if (CollectorRadiusBlip) + { + CollectorRadiusBlip.Delete(); + } + } + } + + private void UpdateWaypointPosition(Vector3 newWaypointPosition) + { + Position = newWaypointPosition; + UpdateWaypointBlipPosition(); + } + + private void UpdateWaypointSpeed(float newWaypointSpeed) + { + Speed = newWaypointSpeed; + } + + private void UpdateDrivingFlag(VehicleDrivingFlags newDrivingFlag) + { + DrivingFlag = newDrivingFlag; + } + + private void UpdateWaypointBlipPosition() + { + Blip.Position = Game.LocalPlayer.Character.Position; + } + + public void UpdatePathNumber(int newPathNumber) + { + Path = newPathNumber; + } + + public void UpdateWaypointNumber(int newWaypointNumber) + { + Number = newWaypointNumber; + } } } From eeb0d9de13580564b21f0f6703e80575adcb58d6 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 15:32:02 -0600 Subject: [PATCH 011/276] Extracted debug graphics code to it's own class --- SceneManager/Menus/SettingsMenu.cs | 43 +----------------------------- 1 file changed, 1 insertion(+), 42 deletions(-) diff --git a/SceneManager/Menus/SettingsMenu.cs b/SceneManager/Menus/SettingsMenu.cs index 9b3d438..ef0048c 100644 --- a/SceneManager/Menus/SettingsMenu.cs +++ b/SceneManager/Menus/SettingsMenu.cs @@ -2,7 +2,6 @@ using RAGENativeUI; using RAGENativeUI.Elements; using System.Drawing; -using System.Linq; namespace SceneManager { @@ -37,53 +36,13 @@ namespace SceneManager { GameFiber.StartNew(() => { - while (debugGraphics.Checked && path != null && path.Waypoint.Count > 0) - { - for (int i = 0; i < path.Waypoint.Count; i++) - { - DrawSpheresAtWaypoints(path, i); - - if (i != path.Waypoint.Count - 1) - { - DrawLinesBetweenWaypoints(path, i); - } - } - GameFiber.Yield(); - } + DebugGraphics.LoopToDrawDebugGraphics(debugGraphics, path); }); } } } } - private static void DrawLinesBetweenWaypoints(Path path, int i) - { - if (path.Waypoint[i+1].DrivingFlag == VehicleDrivingFlags.StopAtDestination) - { - Debug.DrawLine(path.Waypoint[i].WaypointPos, path.Waypoint[i + 1].WaypointPos, Color.Orange); - } - else - { - Debug.DrawLine(path.Waypoint[i].WaypointPos, path.Waypoint[i + 1].WaypointPos, Color.Green); - } - } - - private static void DrawSpheresAtWaypoints(Path path, int i) - { - if (path.Waypoint[i].Collector) - { - Debug.DrawSphere(path.Waypoint[i].WaypointPos, path.Waypoint[i].CollectorRadius, Color.FromArgb(80, Color.Blue)); - } - else if (path.Waypoint[i].DrivingFlag == VehicleDrivingFlags.StopAtDestination) - { - Debug.DrawSphere(path.Waypoint[i].WaypointPos, 1f, Color.FromArgb(80, Color.Red)); - } - else - { - Debug.DrawSphere(path.Waypoint[i].WaypointPos, 1f, Color.FromArgb(80, Color.Green)); - } - } - private static void SettingsMenu_OnScrollerChange(UIMenu sender, UIMenuScrollerItem scrollerItem, int oldIndex, int newIndex) { if (scrollerItem == speedUnits) From 1dc85d32375d9090e47e6398c0b2132a4482959b Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 15:33:58 -0600 Subject: [PATCH 012/276] Updated property names resulting from Waypoint class refactor --- SceneManager/TrafficPathing.cs | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/SceneManager/TrafficPathing.cs b/SceneManager/TrafficPathing.cs index 558bc45..fd9a5df 100644 --- a/SceneManager/TrafficPathing.cs +++ b/SceneManager/TrafficPathing.cs @@ -19,7 +19,7 @@ namespace SceneManager { if (!path.PathDisabled && waypoint.Collector) { - foreach (Vehicle v in GetNearbyVehicles(waypoint.WaypointPos, waypoint.CollectorRadius).Where(v => v.IsValidForCollection())) + foreach (Vehicle v in GetNearbyVehicles(waypoint.Position, waypoint.CollectorRadius).Where(v => v.IsValidForCollection())) { v.IsPersistent = true; v.Driver.IsPersistent = true; @@ -29,9 +29,9 @@ namespace SceneManager // If the vehicle is not in the collection yet if (!collectedVehicles.ContainsKey(v.LicensePlate)) { - var collectedVehicle = new CollectedVehicle(v, v.LicensePlate, path.PathNum, path.Waypoint.Count, waypoint.WaypointNum, true, false, false); + var collectedVehicle = new CollectedVehicle(v, v.LicensePlate, path.PathNum, path.Waypoint.Count, waypoint.Number, true, false, false); collectedVehicles.Add(v.LicensePlate, collectedVehicle); - Game.LogTrivial($"[WaypointVehicleCollector] Added {v.Model.Name} to collection from path {path.PathNum}, waypoint {waypoint.WaypointNum}."); + Game.LogTrivial($"[WaypointVehicleCollector] Added {v.Model.Name} to collection from path {path.PathNum}, waypoint {waypoint.Number}."); GameFiber DismissCheckFiber = new GameFiber(() => VehicleDismissed(collectedVehicle, path.Waypoint)); DismissCheckFiber.Start(); @@ -89,9 +89,9 @@ namespace SceneManager { // Give driver a task to the single path waypoint. Run a loop with a condition checking for DismissNow for cases where the driver is dismissed or redirected Game.LogTrivial($"Assigning task for single waypoint."); - cv.Vehicle.Driver.Tasks.DriveToPosition(waypointData[0].WaypointPos, waypointData[0].Speed, (VehicleDrivingFlags)262539, 1f); + cv.Vehicle.Driver.Tasks.DriveToPosition(waypointData[0].Position, waypointData[0].Speed, (VehicleDrivingFlags)262539, 1f); //SetDriveTaskDrivingFlags(cv.Vehicle.Driver, EDrivingFlags.TotalControl); - while (waypointData.ElementAtOrDefault(0) != null && cv.Vehicle && cv.Vehicle.Driver && cv.Vehicle.DistanceTo(waypointData[0].WaypointPos) > 3f && !cv.DismissNow) + while (waypointData.ElementAtOrDefault(0) != null && cv.Vehicle && cv.Vehicle.Driver && cv.Vehicle.DistanceTo(waypointData[0].Position) > 3f && !cv.DismissNow) { GameFiber.Sleep(1000); } @@ -118,7 +118,7 @@ namespace SceneManager { if (!cv.DismissNow) { - cv.CurrentWaypoint = waypointData[i].WaypointNum; + cv.CurrentWaypoint = waypointData[i].Number; var nextWaypoint = i + 1; Game.LogTrivial($"Assigning task to {cv.Vehicle.Model.Name} from waypoint {nextWaypoint} of {waypointData.Count}"); @@ -129,14 +129,14 @@ namespace SceneManager if (waypointData[nextWaypoint] != null) { //Game.LogTrivial($"Driving to stop waypoint"); - cv.Vehicle.Driver.Tasks.DriveToPosition(waypointData[nextWaypoint].WaypointPos, waypointData[nextWaypoint].Speed, (VehicleDrivingFlags)262539, 1f); + cv.Vehicle.Driver.Tasks.DriveToPosition(waypointData[nextWaypoint].Position, waypointData[nextWaypoint].Speed, (VehicleDrivingFlags)262539, 1f); } else { Game.LogTrivial($"i is out of bounds for assigning task"); } - while (cv.Vehicle && cv.Vehicle.Driver && waypointData.ElementAtOrDefault(nextWaypoint) != null && cv.Vehicle.DistanceTo(waypointData[nextWaypoint].WaypointPos) > 3f && !cv.DismissNow) + while (cv.Vehicle && cv.Vehicle.Driver && waypointData.ElementAtOrDefault(nextWaypoint) != null && cv.Vehicle.DistanceTo(waypointData[nextWaypoint].Position) > 3f && !cv.DismissNow) { GameFiber.Sleep(100); } @@ -150,7 +150,7 @@ namespace SceneManager } else if (cv.Vehicle && cv.Vehicle.Driver && waypointData.ElementAtOrDefault(nextWaypoint) != null && !cv.DismissNow) { - cv.Vehicle.Driver.Tasks.DriveToPosition(waypointData[nextWaypoint].WaypointPos, waypointData[nextWaypoint].Speed, (VehicleDrivingFlags)262539, 1f).WaitForCompletion(); + cv.Vehicle.Driver.Tasks.DriveToPosition(waypointData[nextWaypoint].Position, waypointData[nextWaypoint].Speed, (VehicleDrivingFlags)262539, 1f).WaitForCompletion(); } Game.LogTrivial($"{cv.Vehicle.Model.Name} waypoint {nextWaypoint} task complete"); } @@ -205,7 +205,7 @@ namespace SceneManager { if (!path.PathDisabled) { - foreach (Vehicle v in GetNearbyVehicles(waypointData.WaypointPos, 50f).Where(v => v && v.HasDriver && v.Driver)) + foreach (Vehicle v in GetNearbyVehicles(waypointData.Position, 50f).Where(v => v && v.HasDriver && v.Driver)) { SetDriveTaskDrivingFlags(v.Driver, EDrivingFlags.StopForVehicles); } @@ -227,12 +227,12 @@ namespace SceneManager // Give vehicle task to initial waypoint of desired path, then run a loop to keep giving the task until they're close enough in case they try to wander away too early // Need to figure out how to only get waypoints which are in front of or within 90 degrees of either side of the vehicle - var nearestWaypoint = waypointData.OrderBy(wp => wp.WaypointPos).Take(1) as Waypoint; + var nearestWaypoint = waypointData.OrderBy(wp => wp.Position).Take(1) as Waypoint; - cv.Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint.WaypointPos, nearestWaypoint.Speed, (VehicleDrivingFlags)262539, 1f); // waypointData[0].WaypointPos - while (waypointData.ElementAtOrDefault(0) != null && cv.Vehicle && cv.Vehicle.Driver && cv.Vehicle.DistanceTo(waypointData[0].WaypointPos) > 3f && !cv.DismissNow) + cv.Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint.Position, nearestWaypoint.Speed, (VehicleDrivingFlags)262539, 1f); // waypointData[0].WaypointPos + while (waypointData.ElementAtOrDefault(0) != null && cv.Vehicle && cv.Vehicle.Driver && cv.Vehicle.DistanceTo(waypointData[0].Position) > 3f && !cv.DismissNow) { - cv.Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint.WaypointPos, nearestWaypoint.Speed, (VehicleDrivingFlags)262539, 1f); + cv.Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint.Position, nearestWaypoint.Speed, (VehicleDrivingFlags)262539, 1f); GameFiber.Sleep(500); } cv.Redirected = false; @@ -252,7 +252,7 @@ namespace SceneManager while (true) { var collectorWaypoints = waypointData.Where(wp => wp.Collector); - var vehicleFarEnoughAwayFromCollectors = collectorWaypoints.All(wp => cv.Vehicle.DistanceTo(wp.WaypointPos) > wp.CollectorRadius); + var vehicleFarEnoughAwayFromCollectors = collectorWaypoints.All(wp => cv.Vehicle.DistanceTo(wp.Position) > wp.CollectorRadius); if (collectedVehicles.ContainsKey(cv.LicensePlate) && vehicleFarEnoughAwayFromCollectors) { From 3165c675b060eaa4748d214d557ff960a98fe087 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 15:34:39 -0600 Subject: [PATCH 013/276] Referenced LoopToDrawDebugGraphics in it's new class instead of SettingsMenu class --- SceneManager/Menus/TrafficMenu.cs | 44 ++++++++----------------------- 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/SceneManager/Menus/TrafficMenu.cs b/SceneManager/Menus/TrafficMenu.cs index 395afaa..d2bb38c 100644 --- a/SceneManager/Menus/TrafficMenu.cs +++ b/SceneManager/Menus/TrafficMenu.cs @@ -103,19 +103,19 @@ namespace SceneManager // Remove the speed zone so cars don't continue to be affected after the path is deleted Game.LogTrivial($"Removing yield zone and waypoint blips"); - foreach (Waypoint wd in path.Waypoint) + foreach (Waypoint wp in path.Waypoint) { - if (wd.YieldZone != 0) + if (wp.YieldZone != 0) { - World.RemoveSpeedZone(wd.YieldZone); + World.RemoveSpeedZone(wp.YieldZone); } - if (wd.WaypointBlip) + if (wp.Blip) { - wd.WaypointBlip.Delete(); + wp.Blip.Delete(); } - if (wd.CollectorRadiusBlip) + if (wp.CollectorRadiusBlip) { - wd.CollectorRadiusBlip.Delete(); + wp.CollectorRadiusBlip.Delete(); } } @@ -167,30 +167,8 @@ namespace SceneManager { GameFiber.StartNew(() => { - while (SettingsMenu.debugGraphics.Checked && paths[i] != null) - { - for (int j = 0; j < paths[i].Waypoint.Count; j++) - { - if (paths[i].Waypoint[j].Collector) - { - Debug.DrawSphere(paths[i].Waypoint[j].WaypointPos, paths[i].Waypoint[j].CollectorRadius, Color.FromArgb(80, Color.Blue)); - } - else if (paths[i].Waypoint[j].DrivingFlag == VehicleDrivingFlags.StopAtDestination) - { - Debug.DrawSphere(paths[i].Waypoint[j].WaypointPos, 1f, Color.FromArgb(80, Color.Red)); - } - else - { - Debug.DrawSphere(paths[i].Waypoint[j].WaypointPos, 1f, Color.FromArgb(80, Color.Green)); - } - - if (j != paths[i].Waypoint.Count - 1) - { - Debug.DrawLine(paths[i].Waypoint[j].WaypointPos, paths[i].Waypoint[j + 1].WaypointPos, Color.White); - } - } - GameFiber.Yield(); - } + DebugGraphics.LoopToDrawDebugGraphics(SettingsMenu.debugGraphics, paths[i]); + //SettingsMenu.LoopToDrawDebugGraphics(paths[i]); }); } break; @@ -342,7 +320,7 @@ namespace SceneManager path.PathDisabled = true; foreach (Waypoint waypoint in path.Waypoint) { - waypoint.WaypointBlip.Alpha = 0.5f; + waypoint.Blip.Alpha = 0.5f; if (waypoint.CollectorRadiusBlip) { waypoint.CollectorRadiusBlip.Alpha = 0.25f; @@ -358,7 +336,7 @@ namespace SceneManager path.PathDisabled = false; foreach (Waypoint waypoint in path.Waypoint) { - waypoint.WaypointBlip.Alpha = 1f; + waypoint.Blip.Alpha = 1f; if (waypoint.CollectorRadiusBlip) { waypoint.CollectorRadiusBlip.Alpha = 0.5f; From c3ea4c307cd90398c4dddfa8485a8bf1837adb99 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 15:37:30 -0600 Subject: [PATCH 014/276] Refactored trafficAddWaypoint in PathCreation_OnItemSelected event handler --- SceneManager/Menus/PathCreationMenu.cs | 140 +++++++++++-------------- 1 file changed, 61 insertions(+), 79 deletions(-) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 3c141c4..0a86f93 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -28,7 +28,7 @@ namespace SceneManager { MenuManager.pathCreationMenu.AddItem(waypointType = new UIMenuListItem("Waypoint Type", waypointTypes, 0)); MenuManager.pathCreationMenu.AddItem(waypointSpeed = new UIMenuListItem($"Waypoint Speed (in {SettingsMenu.speedUnits.SelectedItem})", waypointSpeeds, 0)); - MenuManager.pathCreationMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector", false)); + MenuManager.pathCreationMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector", true)); // true if path's first waypoint MenuManager.pathCreationMenu.AddItem(collectorRadius = new UIMenuListItem("Collection Radius", collectorRadii, 0)); MenuManager.pathCreationMenu.AddItem(trafficAddWaypoint = new UIMenuItem("Add waypoint")); MenuManager.pathCreationMenu.AddItem(trafficRemoveWaypoint = new UIMenuItem("Remove last waypoint")); @@ -44,84 +44,26 @@ namespace SceneManager // Do I need to implement a distance restriction? Idiots place waypoints unnecessarily close, possibly causing AI to drive in circles if (selectedItem == trafficAddWaypoint) { - uint yieldZone = 0; - float speed; + var firstNonNullPath = TrafficMenu.paths.Where(p => p != null && !p.PathFinished).First(); + var pathIndex = TrafficMenu.paths.IndexOf(firstNonNullPath); + var currentPath = pathIndex + 1; + var currentWaypoint = TrafficMenu.paths[pathIndex].Waypoint.Count + 1; + var drivingFlag = drivingFlags[waypointType.Index]; + var blip = CreateWaypointBlip(pathIndex); - // Loop through each path and find the first one which isn't finished - var getFirstNonNullPath = TrafficMenu.paths.Where(p => p != null && !p.PathFinished).First(); - var pathIndex = TrafficMenu.paths.IndexOf(getFirstNonNullPath); + if (collectorWaypoint.Checked) // && is path's first waypoint + { + var yieldZone = SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH + ? (uint)World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index])) + : (uint)World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index])); - // Create a waypoint blip and set the sprite based on the current path number - var blip = new Blip(Game.LocalPlayer.Character.Position) - { - Scale = 0.5f - }; - switch (pathIndex) - { - case 0: - blip.Sprite = BlipSprite.Numbered1; - break; - case 1: - blip.Sprite = BlipSprite.Numbered2; - break; - case 2: - blip.Sprite = BlipSprite.Numbered3; - break; - case 3: - blip.Sprite = BlipSprite.Numbered4; - break; - case 4: - blip.Sprite = BlipSprite.Numbered5; - break; - case 5: - blip.Sprite = BlipSprite.Numbered6; - break; - case 6: - blip.Sprite = BlipSprite.Numbered7; - break; - case 7: - blip.Sprite = BlipSprite.Numbered8; - break; - } - - // If it's the first waypoint, make the blip orange, else make it yellow - if (TrafficMenu.paths[pathIndex].Waypoint.Count == 0) - { - blip.Color = Color.Orange; + TrafficMenu.paths[pathIndex].Waypoint.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, collectorRadii[collectorRadius.Index], yieldZone)); } else { - blip.Color = Color.Yellow; + TrafficMenu.paths[pathIndex].Waypoint.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip)); } - - if (collectorWaypoint.Checked) - { - if(SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH) - { - yieldZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index])); - } - else - { - yieldZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index])); - } - } - - if(SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH) - { - Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); - speed = MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index]); - Game.LogTrivial($"Converted speed: {speed}m/s"); - } - else - { - Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); - speed = MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index]); - Game.LogTrivial($"Converted speed: {speed}m/s"); - } - - // Add the waypoint data to the path - TrafficMenu.paths[pathIndex].Waypoint.Add(new Waypoint(pathIndex + 1, TrafficMenu.paths[pathIndex].Waypoint.Count + 1, Game.LocalPlayer.Character.Position, speed, drivingFlags[waypointType.Index], blip, collectorWaypoint.Checked, collectorRadii[collectorRadius.Index], yieldZone)); - Game.LogTrivial($"[Path {pathIndex + 1}] Waypoint {TrafficMenu.paths[pathIndex].Waypoint[TrafficMenu.paths[pathIndex].Waypoint.Count - 1].WaypointNum} ({drivingFlags[waypointType.Index].ToString()}) added"); + Game.LogTrivial($"[Path {currentPath}] Waypoint {currentWaypoint} ({drivingFlag.ToString()}) added"); // Refresh the trafficMenu after a waypoint is added in order to show Continue Creating Current Path instead of Create New Path RefreshTrafficMenu(); @@ -135,7 +77,7 @@ namespace SceneManager if (TrafficMenu.paths.ElementAtOrDefault(i) != null && !TrafficMenu.paths[i].PathFinished) { Game.LogTrivial($"[Path {i + 1}] {TrafficMenu.paths[i].Waypoint.Last().DrivingFlag.ToString()} waypoint removed"); - TrafficMenu.paths[i].Waypoint.Last().WaypointBlip.Delete(); + TrafficMenu.paths[i].Waypoint.Last().Blip.Delete(); if (TrafficMenu.paths[i].Waypoint.Last().CollectorRadiusBlip) { TrafficMenu.paths[i].Waypoint.Last().CollectorRadiusBlip.Delete(); @@ -163,7 +105,7 @@ namespace SceneManager { Game.LogTrivial($"[Path Creation] Path {i + 1} finished with {TrafficMenu.paths[i].Waypoint.Count} waypoints."); Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Path {i + 1} complete."); - TrafficMenu.paths[i].Waypoint.Last().WaypointBlip.Color = Color.OrangeRed; + TrafficMenu.paths[i].Waypoint.Last().Blip.Color = Color.OrangeRed; if (TrafficMenu.paths[i].Waypoint.Last().CollectorRadiusBlip) { TrafficMenu.paths[i].Waypoint.Last().CollectorRadiusBlip.Color = Color.OrangeRed; @@ -196,12 +138,12 @@ namespace SceneManager { Game.LogTrivial($"[Path Error] A minimum of 2 waypoints is required."); Game.DisplayNotification($"~o~Scene Manager\n~r~[Error]~w~ A minimum of 2 waypoints or one stop waypoint is required to create a path."); - foreach (Waypoint wd in TrafficMenu.paths[i].Waypoint) + foreach (Waypoint wp in TrafficMenu.paths[i].Waypoint) { - wd.WaypointBlip.Delete(); - if (wd.CollectorRadiusBlip) + wp.Blip.Delete(); + if (wp.CollectorRadiusBlip) { - wd.CollectorRadiusBlip.Delete(); + wp.CollectorRadiusBlip.Delete(); } } TrafficMenu.paths[i].Waypoint.Clear(); @@ -216,6 +158,46 @@ namespace SceneManager } } + private static float SetDriveSpeedForWaypoint() + { + float speed; + if (SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH) + { + //Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); + speed = MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index]); + //Game.LogTrivial($"Converted speed: {speed}m/s"); + } + else + { + //Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); + speed = MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index]); + //Game.LogTrivial($"Converted speed: {speed}m/s"); + } + + return speed; + } + + private static Blip CreateWaypointBlip(int pathIndex) + { + var spriteNumericalEnum = pathIndex + 17; // 17 because the numerical value of these sprites are always 17 more than the path index + var blip = new Blip(Game.LocalPlayer.Character.Position) + { + Scale = 0.5f, + Sprite = (BlipSprite)spriteNumericalEnum + }; + + if (TrafficMenu.paths[pathIndex].Waypoint.Count == 0) + { + blip.Color = Color.Orange; + } + else + { + blip.Color = Color.Yellow; + } + + return blip; + } + private static void RefreshTrafficMenu() { trafficRemoveWaypoint.Enabled = true; From c4eb57bd69e99434b1cc11e70fc614a8ae16f3f3 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 15:39:31 -0600 Subject: [PATCH 015/276] Refactored editUpdateWaypoint in EditWaypoint_OnItemSelected resulting from Waypoint refactor --- SceneManager/Menus/TrafficMenu.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/SceneManager/Menus/TrafficMenu.cs b/SceneManager/Menus/TrafficMenu.cs index d2bb38c..e0eb6e0 100644 --- a/SceneManager/Menus/TrafficMenu.cs +++ b/SceneManager/Menus/TrafficMenu.cs @@ -168,7 +168,6 @@ namespace SceneManager GameFiber.StartNew(() => { DebugGraphics.LoopToDrawDebugGraphics(SettingsMenu.debugGraphics, paths[i]); - //SettingsMenu.LoopToDrawDebugGraphics(paths[i]); }); } break; From 95aef6c5a7925db8d7521fbb8f886bf89367aa3e Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 15:40:32 -0600 Subject: [PATCH 016/276] Updated Waypoint property names resulting from Waypoint refactor --- SceneManager/Menus/EditPathMenu.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/SceneManager/Menus/EditPathMenu.cs b/SceneManager/Menus/EditPathMenu.cs index 0d7eeec..1335bde 100644 --- a/SceneManager/Menus/EditPathMenu.cs +++ b/SceneManager/Menus/EditPathMenu.cs @@ -8,14 +8,13 @@ namespace SceneManager class EditPathMenu { private static UIMenuItem editPathWaypoints, deletePath; - public static UIMenuCheckboxItem togglePath, debugGraphics; + public static UIMenuCheckboxItem togglePath; public static void BuildEditPathMenu() { MenuManager.editPathMenu.AddItem(togglePath = new UIMenuCheckboxItem("Disable Path", false)); MenuManager.editPathMenu.AddItem(editPathWaypoints = new UIMenuItem("Edit Waypoints")); MenuManager.editPathMenu.AddItem(deletePath = new UIMenuItem("Delete Path")); - //MenuManager.editPathMenu.AddItem(debugGraphics = new UIMenuCheckboxItem("Enable Debug Graphics", false)); MenuManager.editPathMenu.RefreshIndex(); MenuManager.editPathMenu.OnItemSelect += EditPath_OnItemSelected; @@ -48,7 +47,7 @@ namespace SceneManager foreach (Waypoint wd in TrafficMenu.paths[TrafficMenu.editPath.Index].Waypoint) { - wd.WaypointBlip.Alpha = 0.5f; + wd.Blip.Alpha = 0.5f; if (wd.CollectorRadiusBlip) { wd.CollectorRadiusBlip.Alpha = 0.25f; @@ -62,7 +61,7 @@ namespace SceneManager foreach (Waypoint wd in TrafficMenu.paths[TrafficMenu.editPath.Index].Waypoint) { - wd.WaypointBlip.Alpha = 1.0f; + wd.Blip.Alpha = 1.0f; if (wd.CollectorRadiusBlip) { wd.CollectorRadiusBlip.Alpha = 0.5f; From 893f1eba0e95d71cc4bbe65a8c6f2d99730b1867 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 15:41:08 -0600 Subject: [PATCH 017/276] Updated project file after today's refactoring --- SceneManager/SceneManager.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/SceneManager/SceneManager.csproj b/SceneManager/SceneManager.csproj index b137cc0..574a416 100644 --- a/SceneManager/SceneManager.csproj +++ b/SceneManager/SceneManager.csproj @@ -51,6 +51,7 @@ + From 42acd1c56acd3957763b44c9fc1ffcc6ed1fc23f Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 16:27:50 -0600 Subject: [PATCH 018/276] Refactored fields and properties, extracted relevant functions from other classes and consolidated them here --- SceneManager/Object Classes/Path.cs | 57 ++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/SceneManager/Object Classes/Path.cs b/SceneManager/Object Classes/Path.cs index aa8a761..feb035a 100644 --- a/SceneManager/Object Classes/Path.cs +++ b/SceneManager/Object Classes/Path.cs @@ -4,17 +4,17 @@ namespace SceneManager { public class Path { - public int PathNum; - public bool PathFinished; - public bool PathDisabled; - public List Waypoint = new List() { }; + public int PathNum { get; private set; } + public bool PathFinished { get; private set; } + public bool PathDisabled { get; private set; } + public List Waypoints = new List(); - public Path(int pathNum, bool pathFinished, bool pathDisabled, List waypointData) + public Path(int pathNum, bool pathFinished, bool pathDisabled, List waypoints) { PathNum = pathNum; PathFinished = pathFinished; PathDisabled = pathDisabled; - Waypoint = waypointData; + Waypoints = waypoints; } public Path(int pathNum, bool pathFinished) @@ -22,5 +22,50 @@ namespace SceneManager PathNum = pathNum; PathFinished = pathFinished; } + + public void SetPathNumber(int pathNum) + { + PathNum = pathNum; + } + + public void FinishPath() + { + PathFinished = true; + } + + public void DisablePath() + { + PathDisabled = true; + LowerWaypointBlipsOpacity(); + } + + private void LowerWaypointBlipsOpacity() + { + foreach (Waypoint wp in Waypoints) + { + wp.Blip.Alpha = 0.5f; + if (wp.CollectorRadiusBlip) + { + wp.CollectorRadiusBlip.Alpha = 0.25f; + } + } + } + + public void EnablePath() + { + PathDisabled = false; + } + + private void RestoreWaypointBlipsOpacity() + { + foreach (Waypoint wp in Waypoints) + { + wp.Blip.Alpha = 1.0f; + if (wp.CollectorRadiusBlip) + { + wp.CollectorRadiusBlip.Alpha = 0.5f; + } + } + } } } From 24f3c70474b31b8f2fb6c6f98b6b6af1fd0f4ae6 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 16:30:17 -0600 Subject: [PATCH 019/276] Extracted blip opacity code to new method within Path class as part of Path class refactor --- SceneManager/Menus/EditPathMenu.cs | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/SceneManager/Menus/EditPathMenu.cs b/SceneManager/Menus/EditPathMenu.cs index 1335bde..18462bb 100644 --- a/SceneManager/Menus/EditPathMenu.cs +++ b/SceneManager/Menus/EditPathMenu.cs @@ -40,33 +40,16 @@ namespace SceneManager { if (checkboxItem == togglePath) { + var currentPath = TrafficMenu.paths[TrafficMenu.editPath.Index]; if (togglePath.Checked) { - TrafficMenu.paths[TrafficMenu.editPath.Index].PathDisabled = true; - Game.LogTrivial($"Path {TrafficMenu.paths[TrafficMenu.editPath.Index].PathNum} disabled."); - - foreach (Waypoint wd in TrafficMenu.paths[TrafficMenu.editPath.Index].Waypoint) - { - wd.Blip.Alpha = 0.5f; - if (wd.CollectorRadiusBlip) - { - wd.CollectorRadiusBlip.Alpha = 0.25f; - } - } + currentPath.DisablePath(); + Game.LogTrivial($"Path {currentPath.PathNum} disabled."); } else { - TrafficMenu.paths[TrafficMenu.editPath.Index].PathDisabled = false; - Game.LogTrivial($"Path {TrafficMenu.paths[TrafficMenu.editPath.Index].PathNum} enabled."); - - foreach (Waypoint wd in TrafficMenu.paths[TrafficMenu.editPath.Index].Waypoint) - { - wd.Blip.Alpha = 1.0f; - if (wd.CollectorRadiusBlip) - { - wd.CollectorRadiusBlip.Alpha = 0.5f; - } - } + currentPath.EnablePath(); + Game.LogTrivial($"Path {currentPath.PathNum} enabled."); } } } From 99710e7e4c94374485627473c3d865531986e0f2 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 16:34:28 -0600 Subject: [PATCH 020/276] Consolidated code based on Waypoint class refactor --- SceneManager/Menus/EditWaypointMenu.cs | 94 +++++++------------------- 1 file changed, 23 insertions(+), 71 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index fa1082f..4b8481e 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -29,21 +29,20 @@ namespace SceneManager MenuManager.editWaypointMenu.OnListChange -= EditWaypoint_OnListChanged; var currentPath = TrafficMenu.paths[TrafficMenu.editPath.Index]; - //var currentWaypoint = currentPath.WaypointData[editWaypoint.Index]; // Can't use this before the menu is created, will this be a problem elsewhere? // Populating menu list so user can select which waypoint to edit by index pathWaypoints.Clear(); - for (int i = 0; i < currentPath.Waypoint.Count; i++) + for (int i = 0; i < currentPath.Waypoints.Count; i++) { pathWaypoints.Add(i + 1); } MenuManager.editWaypointMenu.Clear(); MenuManager.editWaypointMenu.AddItem(editWaypoint = new UIMenuListItem("Edit Waypoint", pathWaypoints, 0)); - MenuManager.editWaypointMenu.AddItem(changeWaypointType = new UIMenuListItem("Change Waypoint Type", waypointTypes, Array.IndexOf(drivingFlags, currentPath.Waypoint[editWaypoint.Index].DrivingFlag))); - MenuManager.editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuListItem("Change Waypoint Speed", waypointSpeeds, waypointSpeeds.IndexOf(currentPath.Waypoint[editWaypoint.Index].Speed))); - MenuManager.editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector Waypoint", TrafficMenu.paths[TrafficMenu.editPath.Index].Waypoint[editWaypoint.Index].Collector)); - MenuManager.editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListItem("Change Collection Radius", collectorRadii, collectorRadii.IndexOf(currentPath.Waypoint[editWaypoint.Index].CollectorRadius))); + MenuManager.editWaypointMenu.AddItem(changeWaypointType = new UIMenuListItem("Change Waypoint Type", waypointTypes, Array.IndexOf(drivingFlags, currentPath.Waypoints[editWaypoint.Index].DrivingFlag))); + MenuManager.editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuListItem("Change Waypoint Speed", waypointSpeeds, waypointSpeeds.IndexOf(currentPath.Waypoints[editWaypoint.Index].Speed))); + MenuManager.editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector Waypoint", TrafficMenu.paths[TrafficMenu.editPath.Index].Waypoints[editWaypoint.Index].Collector)); + MenuManager.editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListItem("Change Collection Radius", collectorRadii, collectorRadii.IndexOf(currentPath.Waypoints[editWaypoint.Index].CollectorRadius))); MenuManager.editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); MenuManager.editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); MenuManager.editWaypointMenu.AddItem(editRemoveWaypoint = new UIMenuItem("Remove Waypoint")); @@ -59,7 +58,7 @@ namespace SceneManager private static void EditWaypoint_OnListChanged(UIMenu sender, UIMenuListItem listItem, int index) { var currentPath = TrafficMenu.paths[TrafficMenu.editPath.Index]; - var currentWaypoint = currentPath.Waypoint[editWaypoint.Index]; + var currentWaypoint = currentPath.Waypoints[editWaypoint.Index]; if (listItem == editWaypoint) { @@ -72,7 +71,7 @@ namespace SceneManager MenuManager.editWaypointMenu.AddItem(changeWaypointType = new UIMenuListItem("Change Waypoint Type", waypointTypes, Array.IndexOf(drivingFlags, currentWaypoint.DrivingFlag))); MenuManager.editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuListItem("Change Waypoint Speed", waypointSpeeds, waypointSpeeds.IndexOf(currentWaypoint.Speed))); MenuManager.editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Attractor Waypoint", currentWaypoint.Collector)); - MenuManager.editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListItem("Change Collection Radius", collectorRadii, collectorRadii.IndexOf(currentPath.Waypoint[editWaypoint.Index].CollectorRadius))); + MenuManager.editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListItem("Change Collection Radius", collectorRadii, collectorRadii.IndexOf(currentPath.Waypoints[editWaypoint.Index].CollectorRadius))); MenuManager.editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); MenuManager.editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); MenuManager.editWaypointMenu.AddItem(editRemoveWaypoint = new UIMenuItem("Remove Waypoint")); @@ -80,105 +79,58 @@ namespace SceneManager } } - // Crashed here updating waypoint position for waypoint 2/2 private static void EditWaypoint_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) { var currentPath = TrafficMenu.paths[TrafficMenu.editPath.Index]; - var currentWaypoint = currentPath.Waypoint[editWaypoint.Index]; + var currentWaypoint = currentPath.Waypoints[editWaypoint.Index]; if (selectedItem == editUpdateWaypoint) { - currentWaypoint.DrivingFlag = drivingFlags[changeWaypointType.Index]; - currentWaypoint.Speed = waypointSpeeds[changeWaypointSpeed.Index]; - if (updateWaypointPosition.Checked) - { - currentWaypoint.WaypointPos = Game.LocalPlayer.Character.Position; - currentWaypoint.WaypointBlip.Position = Game.LocalPlayer.Character.Position; - if (currentWaypoint.CollectorRadiusBlip) - { - currentWaypoint.CollectorRadiusBlip.Position = Game.LocalPlayer.Character.Position; - } - } + currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], waypointSpeeds[changeWaypointSpeed.Index], collectorWaypoint.Checked, collectorRadii[changeCollectorRadius.Index], updateWaypointPosition.Checked); + Game.LogTrivial($"Updated path {currentPath.PathNum} waypoint {currentWaypoint.Number}: Driving flag is {drivingFlags[changeWaypointType.Index].ToString()}, speed is {waypointSpeeds[changeWaypointSpeed.Index].ToString()}, collector is {currentWaypoint.Collector}"); - if (collectorWaypoint.Checked) - { - currentWaypoint.Collector = true; - var yieldZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, currentWaypoint.Speed); - currentWaypoint.YieldZone = yieldZone; - if (currentWaypoint.CollectorRadiusBlip) - { - //currentWaypoint.CollectorRadiusBlip.Color = currentWaypoint.WaypointBlip.Color; - currentWaypoint.CollectorRadiusBlip.Alpha = 0.5f; - currentWaypoint.CollectorRadiusBlip.Scale = collectorRadii[changeCollectorRadius.Index]; - } - else - { - currentWaypoint.CollectorRadiusBlip = new Blip(currentWaypoint.WaypointBlip.Position, collectorRadii[changeCollectorRadius.Index]) - { - Color = currentWaypoint.WaypointBlip.Color, - Alpha = 0.5f - }; - } - currentWaypoint.CollectorRadius = collectorRadii[changeCollectorRadius.Index]; - } - else - { - currentWaypoint.Collector = false; - World.RemoveSpeedZone(currentWaypoint.YieldZone); - currentWaypoint.YieldZone = 0; - if (currentWaypoint.CollectorRadiusBlip) - { - //currentWaypoint.CollectorRadiusBlip.Color = currentWaypoint.WaypointBlip.Color; - currentWaypoint.CollectorRadiusBlip.Alpha = 0.25f; - } - } - Game.LogTrivial($"Updated path {currentPath.PathNum} waypoint {currentWaypoint.WaypointNum}: Driving flag is {drivingFlags[changeWaypointType.Index].ToString()}, speed is {waypointSpeeds[changeWaypointSpeed.Index].ToString()}, collector is {currentWaypoint.Collector}"); - - if (currentPath.Waypoint.Count < 2 && currentPath.Waypoint[0].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + if (currentPath.Waypoints.Count < 2 && currentPath.Waypoints[0].DrivingFlag == VehicleDrivingFlags.StopAtDestination) { Game.LogTrivial($"The remaining waypoint was updated to be a stop waypoint. Enabling/disabling the path is no longer locked."); EditPathMenu.togglePath.Enabled = true; } - Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Waypoint {currentWaypoint.WaypointNum} updated."); + Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Waypoint {currentWaypoint.Number} updated."); } if (selectedItem == editRemoveWaypoint) { - Game.LogTrivial($"[Path {currentPath.PathNum}] Waypoint {currentWaypoint.WaypointNum} ({currentWaypoint.DrivingFlag}) removed"); - if (currentPath.Waypoint.Count == 1) + Game.LogTrivial($"[Path {currentPath.PathNum}] Waypoint {currentWaypoint.Number} ({currentWaypoint.DrivingFlag}) removed"); + if (currentPath.Waypoints.Count == 1) { Game.LogTrivial($"Deleting the last waypoint from the path."); TrafficMenu.DeletePath(currentPath, currentPath.PathNum - 1, "Single"); - //pathWaypoints.Clear(); - //editPathMenu.Clear(); + MenuManager.editWaypointMenu.Visible = false; MenuManager.pathMenu.Visible = true; } else { - currentWaypoint.WaypointBlip.Delete(); // Delete the waypoint's blip + currentWaypoint.Blip.Delete(); if (currentWaypoint.CollectorRadiusBlip) { currentWaypoint.CollectorRadiusBlip.Delete(); } - currentPath.Waypoint.Remove(currentWaypoint); // Delete the waypoint's data object - pathWaypoints.RemoveAt(editWaypoint.Index); // Remove the waypoint from the menu list + currentPath.Waypoints.Remove(currentWaypoint); + pathWaypoints.RemoveAt(editWaypoint.Index); - // Will this have adverse affects on vehicles currently following the path? - // Update waypoint number for each waypoint in the path's waypoint data - foreach (Waypoint wp in currentPath.Waypoint) + foreach (Waypoint wp in currentPath.Waypoints) { - wp.WaypointNum = currentPath.Waypoint.IndexOf(wp) + 1; - Game.LogTrivial($"Waypoint at index {currentPath.Waypoint.IndexOf(wp)} is now waypoint #{wp.WaypointNum}"); + wp.UpdateWaypointNumber(currentPath.Waypoints.IndexOf(wp) + 1); + Game.LogTrivial($"Waypoint at index {currentPath.Waypoints.IndexOf(wp)} is now waypoint #{wp.Number}"); } BuildEditWaypointMenu(); - if (currentPath.Waypoint.Count == 1 && currentPath.Waypoint[0].DrivingFlag != VehicleDrivingFlags.StopAtDestination) + if (currentPath.Waypoints.Count == 1 && currentPath.Waypoints[0].DrivingFlag != VehicleDrivingFlags.StopAtDestination) { Game.LogTrivial($"The path only has 1 waypoint left, and the waypoint is not a stop waypoint. Disabling the path."); - currentPath.PathDisabled = true; + currentPath.DisablePath(); EditPathMenu.togglePath.Checked = true; EditPathMenu.togglePath.Enabled = false; } From a1b1f68dfa9ccfc8919892d4ec532bef9ba410c5 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 16:35:13 -0600 Subject: [PATCH 021/276] Renamed path 'Waypoint' list to 'Waypoints' --- SceneManager/DebugGraphics.cs | 20 +++++------ SceneManager/Menus/PathCreationMenu.cs | 47 +++++++++++++------------- SceneManager/Menus/TrafficMenu.cs | 27 ++++++++------- SceneManager/TrafficPathing.cs | 18 +++++----- 4 files changed, 57 insertions(+), 55 deletions(-) diff --git a/SceneManager/DebugGraphics.cs b/SceneManager/DebugGraphics.cs index ee97d0c..dbd1d4d 100644 --- a/SceneManager/DebugGraphics.cs +++ b/SceneManager/DebugGraphics.cs @@ -10,11 +10,11 @@ namespace SceneManager { while (debugGraphics.Checked && path != null) { - for (int i = 0; i < path.Waypoint.Count; i++) + for (int i = 0; i < path.Waypoints.Count; i++) { DrawSpheresAtWaypoints(path, i); - if (i != path.Waypoint.Count - 1) + if (i != path.Waypoints.Count - 1) { DrawLinesBetweenWaypoints(path, i); } @@ -25,29 +25,29 @@ namespace SceneManager public static void DrawLinesBetweenWaypoints(Path path, int i) { - if (path.Waypoint[i + 1].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + if (path.Waypoints[i + 1].DrivingFlag == VehicleDrivingFlags.StopAtDestination) { - Debug.DrawLine(path.Waypoint[i].Position, path.Waypoint[i + 1].Position, Color.Orange); + Debug.DrawLine(path.Waypoints[i].Position, path.Waypoints[i + 1].Position, Color.Orange); } else { - Debug.DrawLine(path.Waypoint[i].Position, path.Waypoint[i + 1].Position, Color.Green); + Debug.DrawLine(path.Waypoints[i].Position, path.Waypoints[i + 1].Position, Color.Green); } } public static void DrawSpheresAtWaypoints(Path path, int i) { - if (path.Waypoint[i].Collector) + if (path.Waypoints[i].Collector) { - Debug.DrawSphere(path.Waypoint[i].Position, path.Waypoint[i].CollectorRadius, Color.FromArgb(80, Color.Blue)); + Debug.DrawSphere(path.Waypoints[i].Position, path.Waypoints[i].CollectorRadius, Color.FromArgb(80, Color.Blue)); } - else if (path.Waypoint[i].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + else if (path.Waypoints[i].DrivingFlag == VehicleDrivingFlags.StopAtDestination) { - Debug.DrawSphere(path.Waypoint[i].Position, 1f, Color.FromArgb(80, Color.Red)); + Debug.DrawSphere(path.Waypoints[i].Position, 1f, Color.FromArgb(80, Color.Red)); } else { - Debug.DrawSphere(path.Waypoint[i].Position, 1f, Color.FromArgb(80, Color.Green)); + Debug.DrawSphere(path.Waypoints[i].Position, 1f, Color.FromArgb(80, Color.Green)); } } } diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 0a86f93..7a74059 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -47,7 +47,7 @@ namespace SceneManager var firstNonNullPath = TrafficMenu.paths.Where(p => p != null && !p.PathFinished).First(); var pathIndex = TrafficMenu.paths.IndexOf(firstNonNullPath); var currentPath = pathIndex + 1; - var currentWaypoint = TrafficMenu.paths[pathIndex].Waypoint.Count + 1; + var currentWaypoint = TrafficMenu.paths[pathIndex].Waypoints.Count + 1; var drivingFlag = drivingFlags[waypointType.Index]; var blip = CreateWaypointBlip(pathIndex); @@ -57,11 +57,11 @@ namespace SceneManager ? (uint)World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index])) : (uint)World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index])); - TrafficMenu.paths[pathIndex].Waypoint.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, collectorRadii[collectorRadius.Index], yieldZone)); + TrafficMenu.paths[pathIndex].Waypoints.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, collectorRadii[collectorRadius.Index], yieldZone)); } else { - TrafficMenu.paths[pathIndex].Waypoint.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip)); + TrafficMenu.paths[pathIndex].Waypoints.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip)); } Game.LogTrivial($"[Path {currentPath}] Waypoint {currentWaypoint} ({drivingFlag.ToString()}) added"); @@ -76,16 +76,16 @@ namespace SceneManager { if (TrafficMenu.paths.ElementAtOrDefault(i) != null && !TrafficMenu.paths[i].PathFinished) { - Game.LogTrivial($"[Path {i + 1}] {TrafficMenu.paths[i].Waypoint.Last().DrivingFlag.ToString()} waypoint removed"); - TrafficMenu.paths[i].Waypoint.Last().Blip.Delete(); - if (TrafficMenu.paths[i].Waypoint.Last().CollectorRadiusBlip) + Game.LogTrivial($"[Path {i + 1}] {TrafficMenu.paths[i].Waypoints.Last().DrivingFlag.ToString()} waypoint removed"); + TrafficMenu.paths[i].Waypoints.Last().Blip.Delete(); + if (TrafficMenu.paths[i].Waypoints.Last().CollectorRadiusBlip) { - TrafficMenu.paths[i].Waypoint.Last().CollectorRadiusBlip.Delete(); + TrafficMenu.paths[i].Waypoints.Last().CollectorRadiusBlip.Delete(); } - TrafficMenu.paths[i].Waypoint.RemoveAt(TrafficMenu.paths[i].Waypoint.IndexOf(TrafficMenu.paths[i].Waypoint.Last())); + TrafficMenu.paths[i].Waypoints.RemoveAt(TrafficMenu.paths[i].Waypoints.IndexOf(TrafficMenu.paths[i].Waypoints.Last())); // If the path has no waypoints, disable the menu option to remove a waypoint - if (TrafficMenu.paths[i].Waypoint.Count == 0) + if (TrafficMenu.paths[i].Waypoints.Count == 0) { trafficRemoveWaypoint.Enabled = false; } @@ -98,28 +98,29 @@ namespace SceneManager // Loop through each path and find the first one which isn't finished for (int i = 0; i < TrafficMenu.paths.Count; i++) { - if (TrafficMenu.paths.ElementAtOrDefault(i) != null && !TrafficMenu.paths[i].PathFinished) + var currentPath = TrafficMenu.paths[i]; + if (TrafficMenu.paths.ElementAtOrDefault(i) != null && !currentPath.PathFinished) { // If the path has one stop waypoint or at least two waypoints, finish the path and start the vehicle collector loop, else show user the error and delete any waypoints they made and clear the invalid path - if (TrafficMenu.paths[i].Waypoint.Count >= 2 || (TrafficMenu.paths[i].Waypoint.Count == 1 && TrafficMenu.paths[i].Waypoint[0].DrivingFlag == VehicleDrivingFlags.StopAtDestination)) + if (currentPath.Waypoints.Count >= 2 || (currentPath.Waypoints.Count == 1 && currentPath.Waypoints[0].DrivingFlag == VehicleDrivingFlags.StopAtDestination)) { - Game.LogTrivial($"[Path Creation] Path {i + 1} finished with {TrafficMenu.paths[i].Waypoint.Count} waypoints."); + Game.LogTrivial($"[Path Creation] Path {i + 1} finished with {currentPath.Waypoints.Count} waypoints."); Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Path {i + 1} complete."); - TrafficMenu.paths[i].Waypoint.Last().Blip.Color = Color.OrangeRed; - if (TrafficMenu.paths[i].Waypoint.Last().CollectorRadiusBlip) + currentPath.Waypoints.Last().Blip.Color = Color.OrangeRed; + if (currentPath.Waypoints.Last().CollectorRadiusBlip) { - TrafficMenu.paths[i].Waypoint.Last().CollectorRadiusBlip.Color = Color.OrangeRed; + currentPath.Waypoints.Last().CollectorRadiusBlip.Color = Color.OrangeRed; } - TrafficMenu.paths[i].PathFinished = true; - TrafficMenu.paths[i].PathDisabled = false; - TrafficMenu.paths[i].PathNum = i + 1; - TrafficMenu.pathsNum.Insert(i, TrafficMenu.paths[i].PathNum); + currentPath.FinishPath(); + currentPath.EnablePath(); + currentPath.SetPathNumber(i + 1); + TrafficMenu.pathsNum.Insert(i, currentPath.PathNum); //GameFiber InitialWaypointVehicleCollectorFiber = new GameFiber(() => TrafficPathing.InitialWaypointVehicleCollector(paths[i])); //InitialWaypointVehicleCollectorFiber.Start(); // For each waypoint in the path's WaypointData, start a collector game fiber and loop while the path and waypoint exist, and while the path is enabled - foreach (Waypoint wd in TrafficMenu.paths[i].Waypoint) + foreach (Waypoint wd in TrafficMenu.paths[i].Waypoints) { GameFiber WaypointVehicleCollectorFiber = new GameFiber(() => TrafficPathing.WaypointVehicleCollector(TrafficMenu.paths, TrafficMenu.paths[i], wd)); WaypointVehicleCollectorFiber.Start(); @@ -138,7 +139,7 @@ namespace SceneManager { Game.LogTrivial($"[Path Error] A minimum of 2 waypoints is required."); Game.DisplayNotification($"~o~Scene Manager\n~r~[Error]~w~ A minimum of 2 waypoints or one stop waypoint is required to create a path."); - foreach (Waypoint wp in TrafficMenu.paths[i].Waypoint) + foreach (Waypoint wp in TrafficMenu.paths[i].Waypoints) { wp.Blip.Delete(); if (wp.CollectorRadiusBlip) @@ -146,7 +147,7 @@ namespace SceneManager wp.CollectorRadiusBlip.Delete(); } } - TrafficMenu.paths[i].Waypoint.Clear(); + TrafficMenu.paths[i].Waypoints.Clear(); TrafficMenu.paths.RemoveAt(i); break; } @@ -186,7 +187,7 @@ namespace SceneManager Sprite = (BlipSprite)spriteNumericalEnum }; - if (TrafficMenu.paths[pathIndex].Waypoint.Count == 0) + if (TrafficMenu.paths[pathIndex].Waypoints.Count == 0) { blip.Color = Color.Orange; } diff --git a/SceneManager/Menus/TrafficMenu.cs b/SceneManager/Menus/TrafficMenu.cs index e0eb6e0..5315522 100644 --- a/SceneManager/Menus/TrafficMenu.cs +++ b/SceneManager/Menus/TrafficMenu.cs @@ -103,7 +103,7 @@ namespace SceneManager // Remove the speed zone so cars don't continue to be affected after the path is deleted Game.LogTrivial($"Removing yield zone and waypoint blips"); - foreach (Waypoint wp in path.Waypoint) + foreach (Waypoint wp in path.Waypoints) { if (wp.YieldZone != 0) { @@ -120,7 +120,7 @@ namespace SceneManager } Game.LogTrivial($"Clearing path.WaypointData"); - path.Waypoint.Clear(); + path.Waypoints.Clear(); // Manipulating the menu to reflect specific paths being deleted if (pathsToDelete == "Single") { @@ -190,7 +190,7 @@ namespace SceneManager } foreach (Path path in paths) { - path.Waypoint.Clear(); + path.Waypoints.Clear(); } paths.Clear(); pathsNum.Clear(); @@ -209,24 +209,25 @@ namespace SceneManager if (nearbyVehicle.IsInCollectedVehicles()) { var vehicle = TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate]; + var nearestWaypoint = paths[directDriver.Index].Waypoints.OrderBy(wp => wp.Position).Take(1) as Waypoint; Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} already in collection. Clearing tasks."); nearbyVehicle.Driver.Tasks.Clear(); - vehicle.Path = paths[directDriver.Index].Waypoint[0].Path; - vehicle.TotalWaypoints = paths[directDriver.Index].Waypoint.Count; + vehicle.Path = paths[directDriver.Index].Waypoints[0].Path; + vehicle.TotalWaypoints = paths[directDriver.Index].Waypoints.Count; vehicle.CurrentWaypoint = 1; vehicle.DismissNow = true; vehicle.StoppedAtWaypoint = false; vehicle.Redirected = true; - GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(vehicle, paths[directDriver.Index].Waypoint)); + GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(vehicle, paths[directDriver.Index].Waypoints)); DirectTaskFiber.Start(); } else { - TrafficPathing.collectedVehicles.Add(nearbyVehicle.LicensePlate, new CollectedVehicle(nearbyVehicle, nearbyVehicle.LicensePlate, paths[directDriver.Index].Waypoint[0].Path, paths[directDriver.Index].Waypoint.Count, 1, false, false, true)); - Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} not in collection, adding to collection for path {paths[directDriver.Index].Waypoint[0].Path} with {paths[directDriver.Index].Waypoint.Count} waypoints"); + TrafficPathing.collectedVehicles.Add(nearbyVehicle.LicensePlate, new CollectedVehicle(nearbyVehicle, nearbyVehicle.LicensePlate, paths[directDriver.Index].Waypoints[0].Path, paths[directDriver.Index].Waypoints.Count, 1, false, false, true)); + Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} not in collection, adding to collection for path {paths[directDriver.Index].Waypoints[0].Path} with {paths[directDriver.Index].Waypoints.Count} waypoints"); - GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate], paths[directDriver.Index].Waypoint)); + GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate], paths[directDriver.Index].Waypoints)); DirectTaskFiber.Start(); } } @@ -316,8 +317,8 @@ namespace SceneManager { foreach (Path path in paths) { - path.PathDisabled = true; - foreach (Waypoint waypoint in path.Waypoint) + path.DisablePath(); + foreach (Waypoint waypoint in path.Waypoints) { waypoint.Blip.Alpha = 0.5f; if (waypoint.CollectorRadiusBlip) @@ -332,8 +333,8 @@ namespace SceneManager { foreach (Path path in paths) { - path.PathDisabled = false; - foreach (Waypoint waypoint in path.Waypoint) + path.EnablePath(); + foreach (Waypoint waypoint in path.Waypoints) { waypoint.Blip.Alpha = 1f; if (waypoint.CollectorRadiusBlip) diff --git a/SceneManager/TrafficPathing.cs b/SceneManager/TrafficPathing.cs index fd9a5df..011a7c7 100644 --- a/SceneManager/TrafficPathing.cs +++ b/SceneManager/TrafficPathing.cs @@ -15,7 +15,7 @@ namespace SceneManager //GameFiber AssignStopForVehiclesFlagFiber = new GameFiber(() => AssignStopForVehiclesFlag(paths, path, waypointData)); //AssignStopForVehiclesFlagFiber.Start(); - while (paths.Contains(path) && path.Waypoint.Contains(waypoint)) + while (paths.Contains(path) && path.Waypoints.Contains(waypoint)) { if (!path.PathDisabled && waypoint.Collector) { @@ -29,14 +29,14 @@ namespace SceneManager // If the vehicle is not in the collection yet if (!collectedVehicles.ContainsKey(v.LicensePlate)) { - var collectedVehicle = new CollectedVehicle(v, v.LicensePlate, path.PathNum, path.Waypoint.Count, waypoint.Number, true, false, false); + var collectedVehicle = new CollectedVehicle(v, v.LicensePlate, path.PathNum, path.Waypoints.Count, waypoint.Number, true, false, false); collectedVehicles.Add(v.LicensePlate, collectedVehicle); Game.LogTrivial($"[WaypointVehicleCollector] Added {v.Model.Name} to collection from path {path.PathNum}, waypoint {waypoint.Number}."); - GameFiber DismissCheckFiber = new GameFiber(() => VehicleDismissed(collectedVehicle, path.Waypoint)); + GameFiber DismissCheckFiber = new GameFiber(() => VehicleDismissed(collectedVehicle, path.Waypoints)); DismissCheckFiber.Start(); - AssignTasks(collectedVehicle, path.Waypoint, waypoint); + AssignTasks(collectedVehicle, path.Waypoints, waypoint); } // If the vehicle is in the collection, but has no tasks else if (collectedVehicles.ContainsKey(v.LicensePlate) && !collectedVehicles[v.LicensePlate].TasksAssigned) @@ -44,7 +44,7 @@ namespace SceneManager Game.LogTrivial($"[WaypointVehicleCollector] {v.Model.Name} already in collection, but with no tasks. Assigning tasks."); collectedVehicles[v.LicensePlate].TasksAssigned = true; - AssignTasks(collectedVehicles[v.LicensePlate], path.Waypoint, waypoint); + AssignTasks(collectedVehicles[v.LicensePlate], path.Waypoints, waypoint); } // If the vehicle is in the collection and has tasks else @@ -201,7 +201,7 @@ namespace SceneManager public static void AssignStopForVehiclesFlag(List paths, Path path, Waypoint waypointData) { - while (paths.Contains(path) && path.Waypoint.Contains(waypointData)) + while (paths.Contains(path) && path.Waypoints.Contains(waypointData)) { if (!path.PathDisabled) { @@ -214,7 +214,7 @@ namespace SceneManager } } - public static void DirectTask(CollectedVehicle cv, List waypointData) + public static void DirectTask(CollectedVehicle cv, List waypoints) { cv.DismissNow = false; if (cv.Vehicle && cv.Vehicle.Driver) @@ -227,10 +227,10 @@ namespace SceneManager // Give vehicle task to initial waypoint of desired path, then run a loop to keep giving the task until they're close enough in case they try to wander away too early // Need to figure out how to only get waypoints which are in front of or within 90 degrees of either side of the vehicle - var nearestWaypoint = waypointData.OrderBy(wp => wp.Position).Take(1) as Waypoint; + var nearestWaypoint = waypoints.OrderBy(wp => wp.Position).Take(1) as Waypoint; cv.Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint.Position, nearestWaypoint.Speed, (VehicleDrivingFlags)262539, 1f); // waypointData[0].WaypointPos - while (waypointData.ElementAtOrDefault(0) != null && cv.Vehicle && cv.Vehicle.Driver && cv.Vehicle.DistanceTo(waypointData[0].Position) > 3f && !cv.DismissNow) + while (nearestWaypoint != null && cv.Vehicle && cv.Vehicle.Driver && cv.Vehicle.DistanceTo(waypoints[0].Position) > 3f && !cv.DismissNow) { cv.Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint.Position, nearestWaypoint.Speed, (VehicleDrivingFlags)262539, 1f); GameFiber.Sleep(500); From 2e65da4746ce31ac49a5961fddffae2efab787eb Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 18:55:26 -0600 Subject: [PATCH 022/276] Refactor menu instantiation to happen in the respective menu's class --- SceneManager/Menus/MenuManager.cs | 43 +++++++++++-------------------- 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/SceneManager/Menus/MenuManager.cs b/SceneManager/Menus/MenuManager.cs index 4a9a0b8..1974834 100644 --- a/SceneManager/Menus/MenuManager.cs +++ b/SceneManager/Menus/MenuManager.cs @@ -1,35 +1,22 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Drawing; -using Rage; using RAGENativeUI; -using RAGENativeUI.Elements; namespace SceneManager { public static class MenuManager { public static MenuPool menuPool = new MenuPool(); - public static UIMenu mainMenu, pathMenu, barrierMenu, pathCreationMenu, editPathMenu, editWaypointMenu, settingsMenu; public static void InstantiateMenus() { - mainMenu = new UIMenu("Scene Manager", ""); - settingsMenu = new UIMenu("Scene Menu", "~o~Plugin Settings"); - settingsMenu.ParentMenu = mainMenu; - pathMenu = new UIMenu("Scene Manager", "~o~Path Menu"); - pathMenu.ParentMenu = mainMenu; - pathCreationMenu = new UIMenu("Scene Manager", "~o~Path Creation"); - pathCreationMenu.ParentMenu = pathMenu; - barrierMenu = new UIMenu("Scene Manager", "~o~Barrier Management"); - barrierMenu.ParentMenu = mainMenu; - editPathMenu = new UIMenu("Scene Manager", "~o~Edit Path"); - editPathMenu.ParentMenu = pathMenu; - editWaypointMenu = new UIMenu("Scene Manager", "~o~Edit Waypoint"); - editWaypointMenu.ParentMenu = editPathMenu; + MainMenu.InstantiateMenu(); + SettingsMenu.InstantiateMenu(); + PathMainMenu.InstantiateMenu(); + PathCreationMenu.InstantiateMenu(); + BarrierMenu.InstantiateMenu(); + EditPathMenu.InstantiateMenu(); + EditWaypointMenu.InstantiateMenu(); - AddMenusToMenuPool(); BuildMenus(); DefineMenuMouseSettings(); } @@ -47,7 +34,7 @@ namespace SceneManager { MainMenu.BuildMainMenu(); SettingsMenu.BuildSettingsMenu(); - TrafficMenu.BuildPathMenu(); + PathMainMenu.BuildPathMenu(); PathCreationMenu.BuildPathCreationMenu(); EditPathMenu.BuildEditPathMenu(); BarrierMenu.BuildBarrierMenu(); @@ -55,13 +42,13 @@ namespace SceneManager private static void AddMenusToMenuPool() { - menuPool.Add(mainMenu); - menuPool.Add(settingsMenu); - menuPool.Add(pathMenu); - menuPool.Add(barrierMenu); - menuPool.Add(pathCreationMenu); - menuPool.Add(editPathMenu); - menuPool.Add(editWaypointMenu); + menuPool.Add(MainMenu.mainMenu); + menuPool.Add(SettingsMenu.settingsMenu); + menuPool.Add(PathMainMenu.pathMainMenu); + menuPool.Add(BarrierMenu.barrierMenu); + menuPool.Add(PathCreationMenu.pathCreationMenu); + menuPool.Add(EditPathMenu.editPathMenu); + menuPool.Add(EditWaypointMenu.editWaypointMenu); } } } From fe72d5daf83f281cf7e2df9cfdfc17044c3d3e48 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 18:57:20 -0600 Subject: [PATCH 023/276] Updated menu references based on MenuManager refactor --- SceneManager/EntryPoint.cs | 4 +- SceneManager/GetUserInput.cs | 12 +- SceneManager/Menus/BarrierMenu.cs | 22 ++- SceneManager/Menus/EditPathMenu.cs | 26 ++-- SceneManager/Menus/EditWaypointMenu.cs | 73 +++++---- SceneManager/Menus/MainMenu.cs | 25 +-- SceneManager/Menus/PathCreationMenu.cs | 145 ++++++++++-------- .../Menus/{TrafficMenu.cs => PathMainMenu.cs} | 126 ++++++++++----- SceneManager/Menus/SettingsMenu.cs | 21 ++- SceneManager/SceneManager.csproj | 2 +- 10 files changed, 281 insertions(+), 175 deletions(-) rename SceneManager/Menus/{TrafficMenu.cs => PathMainMenu.cs} (75%) diff --git a/SceneManager/EntryPoint.cs b/SceneManager/EntryPoint.cs index 64354e5..08e5fb8 100644 --- a/SceneManager/EntryPoint.cs +++ b/SceneManager/EntryPoint.cs @@ -79,9 +79,9 @@ namespace SceneManager private static void MyTerminationHandler(object sender, EventArgs e) { // Clean up paths - for (int i = 0; i < TrafficMenu.paths.Count; i++) + for (int i = 0; i < PathMainMenu.GetPaths().Count; i++) { - TrafficMenu.DeletePath(TrafficMenu.paths[i], i, "All"); + PathMainMenu.DeletePath(PathMainMenu.GetPaths()[i], i, PathMainMenu.Delete.All); } // Clean up cones diff --git a/SceneManager/GetUserInput.cs b/SceneManager/GetUserInput.cs index 3531000..8a092d8 100644 --- a/SceneManager/GetUserInput.cs +++ b/SceneManager/GetUserInput.cs @@ -20,7 +20,7 @@ namespace SceneManager GetControllerInput(); // Display this message for test versions only - if (MenuManager.mainMenu.Visible) + if (MainMenu.mainMenu.Visible) { Game.DisplaySubtitle($"You are using a test build of Scene Manager. Please report any bugs/crashes in the Discord server."); } @@ -36,12 +36,12 @@ namespace SceneManager { if (Game.IsControllerButtonDown(EntryPoint.Settings.ToggleButton) && AreMenusClosed()) { - MenuManager.mainMenu.Visible = !MenuManager.mainMenu.Visible; + MainMenu.mainMenu.Visible = !MainMenu.mainMenu.Visible; } } else if (Game.IsControllerButtonDownRightNow(EntryPoint.Settings.ModifierButton) && Game.IsControllerButtonDown(EntryPoint.Settings.ToggleButton) && AreMenusClosed()) { - MenuManager.mainMenu.Visible = !MenuManager.mainMenu.Visible; + MainMenu.mainMenu.Visible = !MainMenu.mainMenu.Visible; } } @@ -51,18 +51,18 @@ namespace SceneManager { if (Game.IsKeyDown(EntryPoint.Settings.ToggleKey) && AreMenusClosed()) { - MenuManager.mainMenu.Visible = !MenuManager.mainMenu.Visible; + MainMenu.mainMenu.Visible = !MainMenu.mainMenu.Visible; } } else if (Game.IsKeyDownRightNow(EntryPoint.Settings.ModifierKey) && Game.IsKeyDown(EntryPoint.Settings.ToggleKey) && AreMenusClosed()) { - MenuManager.mainMenu.Visible = !MenuManager.mainMenu.Visible; + MainMenu.mainMenu.Visible = !MainMenu.mainMenu.Visible; } } private static bool AreMenusClosed() { - if(!MenuManager.barrierMenu.Visible && !MenuManager.pathMenu.Visible && !MenuManager.pathCreationMenu.Visible && !MenuManager.editPathMenu.Visible && !MenuManager.editWaypointMenu.Visible && !MenuManager.settingsMenu.Visible) + if(!BarrierMenu.barrierMenu.Visible && !PathMainMenu.pathMainMenu.Visible && !PathCreationMenu.pathCreationMenu.Visible && !EditPathMenu.editPathMenu.Visible && !EditWaypointMenu.editWaypointMenu.Visible && !SettingsMenu.settingsMenu.Visible) { return true; } diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index 24cf2da..896d6d1 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -11,6 +11,7 @@ namespace SceneManager { class BarrierMenu { + public static UIMenu barrierMenu { get; private set; } public static List barriers = new List() { }; // TODO: Refactor as dictionary @@ -20,16 +21,23 @@ namespace SceneManager private static UIMenuListScrollerItem removeBarrierOptions = new UIMenuListScrollerItem("Remove Barrier", "", new[] { "Last Barrier", "Nearest Barrier", "All Barriers" }); public static Rage.Object shadowBarrier; + internal static void InstantiateMenu() + { + barrierMenu = new UIMenu("Scene Manager", "~o~Barrier Management"); + barrierMenu.ParentMenu = MainMenu.mainMenu; + MenuManager.menuPool.Add(barrierMenu); + } + public static void BuildBarrierMenu() { - MenuManager.barrierMenu.AddItem(removeBarrierOptions, 0); + barrierMenu.AddItem(removeBarrierOptions, 0); removeBarrierOptions.Enabled = false; - MenuManager.barrierMenu.AddItem(rotateBarrier, 0); - MenuManager.barrierMenu.AddItem(barrierList, 0); - MenuManager.barrierMenu.RefreshIndex(); + barrierMenu.AddItem(rotateBarrier, 0); + barrierMenu.AddItem(barrierList, 0); + barrierMenu.RefreshIndex(); - MenuManager.barrierMenu.OnItemSelect += BarrierMenu_OnItemSelected; - MenuManager.barrierMenu.OnScrollerChange += BarrierMenu_OnScrollerChange; + barrierMenu.OnItemSelect += BarrierMenu_OnItemSelected; + barrierMenu.OnScrollerChange += BarrierMenu_OnScrollerChange; } public static void CreateShadowBarrier(UIMenu barrierMenu) @@ -91,7 +99,7 @@ namespace SceneManager { if (scrollerItem == barrierList) { - CreateShadowBarrier(MenuManager.barrierMenu); + CreateShadowBarrier(barrierMenu); if (barrierObjectNames[barrierList.Index] == "prop_flare_01b") { diff --git a/SceneManager/Menus/EditPathMenu.cs b/SceneManager/Menus/EditPathMenu.cs index 18462bb..1dcbd2f 100644 --- a/SceneManager/Menus/EditPathMenu.cs +++ b/SceneManager/Menus/EditPathMenu.cs @@ -7,23 +7,31 @@ namespace SceneManager { class EditPathMenu { + public static UIMenu editPathMenu { get; private set; } private static UIMenuItem editPathWaypoints, deletePath; public static UIMenuCheckboxItem togglePath; + internal static void InstantiateMenu() + { + editPathMenu = new UIMenu("Scene Manager", "~o~Edit Path"); + editPathMenu.ParentMenu = PathMainMenu.pathMainMenu; + MenuManager.menuPool.Add(editPathMenu); + } + public static void BuildEditPathMenu() { - MenuManager.editPathMenu.AddItem(togglePath = new UIMenuCheckboxItem("Disable Path", false)); - MenuManager.editPathMenu.AddItem(editPathWaypoints = new UIMenuItem("Edit Waypoints")); - MenuManager.editPathMenu.AddItem(deletePath = new UIMenuItem("Delete Path")); + editPathMenu.AddItem(togglePath = new UIMenuCheckboxItem("Disable Path", false)); + editPathMenu.AddItem(editPathWaypoints = new UIMenuItem("Edit Waypoints")); + editPathMenu.AddItem(deletePath = new UIMenuItem("Delete Path")); - MenuManager.editPathMenu.RefreshIndex(); - MenuManager.editPathMenu.OnItemSelect += EditPath_OnItemSelected; - MenuManager.editPathMenu.OnCheckboxChange += EditPath_OnCheckboxChange; + editPathMenu.RefreshIndex(); + editPathMenu.OnItemSelect += EditPath_OnItemSelected; + editPathMenu.OnCheckboxChange += EditPath_OnCheckboxChange; } private static void EditPath_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) { - var currentPath = TrafficMenu.paths[TrafficMenu.editPath.Index]; + var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index]; if (selectedItem == editPathWaypoints) { @@ -32,7 +40,7 @@ namespace SceneManager if (selectedItem == deletePath) { - TrafficMenu.DeletePath(currentPath, currentPath.PathNum - 1, "Single"); + PathMainMenu.DeletePath(currentPath, currentPath.PathNum - 1, PathMainMenu.Delete.Single); } } @@ -40,7 +48,7 @@ namespace SceneManager { if (checkboxItem == togglePath) { - var currentPath = TrafficMenu.paths[TrafficMenu.editPath.Index]; + var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index]; if (togglePath.Checked) { currentPath.DisablePath(); diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 4b8481e..4408643 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -12,6 +12,7 @@ namespace SceneManager class EditWaypointMenu { #pragma warning disable CS0618 // Type or member is obsolete, clear NUI squiggles + public static UIMenu editWaypointMenu { get; private set; } private static UIMenuItem editUpdateWaypoint, editRemoveWaypoint; private static UIMenuListItem editWaypoint, changeWaypointType, changeWaypointSpeed, changeCollectorRadius; private static UIMenuCheckboxItem collectorWaypoint, updateWaypointPosition; @@ -22,13 +23,21 @@ namespace SceneManager private static List collectorRadii = new List() { 3f, 5f, 10f, 15f, 20f, 30f, 40f, 50f }; private static VehicleDrivingFlags[] drivingFlags = new VehicleDrivingFlags[] { VehicleDrivingFlags.Normal, VehicleDrivingFlags.StopAtDestination }; + internal static void InstantiateMenu() + { + editWaypointMenu = new UIMenu("Scene Manager", "~o~Edit Waypoint"); + editWaypointMenu.ParentMenu = EditPathMenu.editPathMenu; + MenuManager.menuPool.Add(editWaypointMenu); + } + public static void BuildEditWaypointMenu() { // Need to unsubscribe from these or else there will be duplicate firings if the user left the menu, then re-entered - MenuManager.editWaypointMenu.OnItemSelect -= EditWaypoint_OnItemSelected; - MenuManager.editWaypointMenu.OnListChange -= EditWaypoint_OnListChanged; + editWaypointMenu.OnItemSelect -= EditWaypoint_OnItemSelected; + editWaypointMenu.OnListChange -= EditWaypoint_OnListChanged; - var currentPath = TrafficMenu.paths[TrafficMenu.editPath.Index]; + //var currentPath = PathMainMenu.paths[PathMainMenu.editPath.Index]; + var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index]; // Populating menu list so user can select which waypoint to edit by index pathWaypoints.Clear(); @@ -37,51 +46,51 @@ namespace SceneManager pathWaypoints.Add(i + 1); } - MenuManager.editWaypointMenu.Clear(); - MenuManager.editWaypointMenu.AddItem(editWaypoint = new UIMenuListItem("Edit Waypoint", pathWaypoints, 0)); - MenuManager.editWaypointMenu.AddItem(changeWaypointType = new UIMenuListItem("Change Waypoint Type", waypointTypes, Array.IndexOf(drivingFlags, currentPath.Waypoints[editWaypoint.Index].DrivingFlag))); - MenuManager.editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuListItem("Change Waypoint Speed", waypointSpeeds, waypointSpeeds.IndexOf(currentPath.Waypoints[editWaypoint.Index].Speed))); - MenuManager.editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector Waypoint", TrafficMenu.paths[TrafficMenu.editPath.Index].Waypoints[editWaypoint.Index].Collector)); - MenuManager.editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListItem("Change Collection Radius", collectorRadii, collectorRadii.IndexOf(currentPath.Waypoints[editWaypoint.Index].CollectorRadius))); - MenuManager.editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); - MenuManager.editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); - MenuManager.editWaypointMenu.AddItem(editRemoveWaypoint = new UIMenuItem("Remove Waypoint")); + editWaypointMenu.Clear(); + editWaypointMenu.AddItem(editWaypoint = new UIMenuListItem("Edit Waypoint", pathWaypoints, 0)); + editWaypointMenu.AddItem(changeWaypointType = new UIMenuListItem("Change Waypoint Type", waypointTypes, Array.IndexOf(drivingFlags, currentPath.Waypoints[editWaypoint.Index].DrivingFlag))); + editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuListItem("Change Waypoint Speed", waypointSpeeds, waypointSpeeds.IndexOf(currentPath.Waypoints[editWaypoint.Index].Speed))); + editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector Waypoint", PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Collector)); + editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListItem("Change Collection Radius", collectorRadii, collectorRadii.IndexOf(currentPath.Waypoints[editWaypoint.Index].CollectorRadius))); + editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); + editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); + editWaypointMenu.AddItem(editRemoveWaypoint = new UIMenuItem("Remove Waypoint")); - MenuManager.editPathMenu.Visible = false; - MenuManager.editWaypointMenu.RefreshIndex(); - MenuManager.editWaypointMenu.Visible = true; + EditPathMenu.editPathMenu.Visible = false; + editWaypointMenu.RefreshIndex(); + editWaypointMenu.Visible = true; - MenuManager.editWaypointMenu.OnItemSelect += EditWaypoint_OnItemSelected; - MenuManager.editWaypointMenu.OnListChange += EditWaypoint_OnListChanged; + editWaypointMenu.OnItemSelect += EditWaypoint_OnItemSelected; + editWaypointMenu.OnListChange += EditWaypoint_OnListChanged; } private static void EditWaypoint_OnListChanged(UIMenu sender, UIMenuListItem listItem, int index) { - var currentPath = TrafficMenu.paths[TrafficMenu.editPath.Index]; + var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index]; var currentWaypoint = currentPath.Waypoints[editWaypoint.Index]; if (listItem == editWaypoint) { - while (MenuManager.editWaypointMenu.MenuItems.Count > 1) + while (editWaypointMenu.MenuItems.Count > 1) { - MenuManager.editWaypointMenu.RemoveItemAt(1); + editWaypointMenu.RemoveItemAt(1); GameFiber.Yield(); } - MenuManager.editWaypointMenu.AddItem(changeWaypointType = new UIMenuListItem("Change Waypoint Type", waypointTypes, Array.IndexOf(drivingFlags, currentWaypoint.DrivingFlag))); - MenuManager.editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuListItem("Change Waypoint Speed", waypointSpeeds, waypointSpeeds.IndexOf(currentWaypoint.Speed))); - MenuManager.editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Attractor Waypoint", currentWaypoint.Collector)); - MenuManager.editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListItem("Change Collection Radius", collectorRadii, collectorRadii.IndexOf(currentPath.Waypoints[editWaypoint.Index].CollectorRadius))); - MenuManager.editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); - MenuManager.editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); - MenuManager.editWaypointMenu.AddItem(editRemoveWaypoint = new UIMenuItem("Remove Waypoint")); - MenuManager.editWaypointMenu.RefreshIndex(); + editWaypointMenu.AddItem(changeWaypointType = new UIMenuListItem("Change Waypoint Type", waypointTypes, Array.IndexOf(drivingFlags, currentWaypoint.DrivingFlag))); + editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuListItem("Change Waypoint Speed", waypointSpeeds, waypointSpeeds.IndexOf(currentWaypoint.Speed))); + editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Attractor Waypoint", currentWaypoint.Collector)); + editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListItem("Change Collection Radius", collectorRadii, collectorRadii.IndexOf(currentPath.Waypoints[editWaypoint.Index].CollectorRadius))); + editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); + editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); + editWaypointMenu.AddItem(editRemoveWaypoint = new UIMenuItem("Remove Waypoint")); + editWaypointMenu.RefreshIndex(); } } private static void EditWaypoint_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) { - var currentPath = TrafficMenu.paths[TrafficMenu.editPath.Index]; + var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index]; var currentWaypoint = currentPath.Waypoints[editWaypoint.Index]; if (selectedItem == editUpdateWaypoint) @@ -104,10 +113,10 @@ namespace SceneManager if (currentPath.Waypoints.Count == 1) { Game.LogTrivial($"Deleting the last waypoint from the path."); - TrafficMenu.DeletePath(currentPath, currentPath.PathNum - 1, "Single"); + PathMainMenu.DeletePath(currentPath, currentPath.PathNum - 1, PathMainMenu.Delete.Single); - MenuManager.editWaypointMenu.Visible = false; - MenuManager.pathMenu.Visible = true; + editWaypointMenu.Visible = false; + PathMainMenu.pathMainMenu.Visible = true; } else { diff --git a/SceneManager/Menus/MainMenu.cs b/SceneManager/Menus/MainMenu.cs index d28ac27..d1dcfbc 100644 --- a/SceneManager/Menus/MainMenu.cs +++ b/SceneManager/Menus/MainMenu.cs @@ -11,26 +11,33 @@ namespace SceneManager { class MainMenu { + public static UIMenu mainMenu { get; private set; } private static UIMenuItem navigateToPathMenu, navigateToBarrierMenu, navigateToSettingsMenu; + internal static void InstantiateMenu() + { + mainMenu = new UIMenu("Scene Manager", ""); + MenuManager.menuPool.Add(mainMenu); + } + public static void BuildMainMenu() { - MenuManager.mainMenu.AddItem(navigateToPathMenu = new UIMenuItem("~o~Path Menu")); - MenuManager.mainMenu.BindMenuToItem(MenuManager.pathMenu, navigateToPathMenu); - MenuManager.mainMenu.AddItem(navigateToBarrierMenu = new UIMenuItem("~o~Barrier Menu")); - MenuManager.mainMenu.BindMenuToItem(MenuManager.barrierMenu, navigateToBarrierMenu); - MenuManager.mainMenu.AddItem(navigateToSettingsMenu = new UIMenuItem("~o~Settings")); - MenuManager.mainMenu.BindMenuToItem(MenuManager.settingsMenu, navigateToSettingsMenu); + mainMenu.AddItem(navigateToPathMenu = new UIMenuItem("~o~Path Menu")); + mainMenu.BindMenuToItem(PathMainMenu.pathMainMenu, navigateToPathMenu); + mainMenu.AddItem(navigateToBarrierMenu = new UIMenuItem("~o~Barrier Menu")); + mainMenu.BindMenuToItem(BarrierMenu.barrierMenu, navigateToBarrierMenu); + mainMenu.AddItem(navigateToSettingsMenu = new UIMenuItem("~o~Settings")); + mainMenu.BindMenuToItem(SettingsMenu.settingsMenu, navigateToSettingsMenu); - MenuManager.mainMenu.RefreshIndex(); - MenuManager.mainMenu.OnItemSelect += MainMenu_OnItemSelected; + mainMenu.RefreshIndex(); + mainMenu.OnItemSelect += MainMenu_OnItemSelected; } private static void MainMenu_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) { if (selectedItem == navigateToBarrierMenu) { - BarrierMenu.CreateShadowBarrier(MenuManager.barrierMenu); + BarrierMenu.CreateShadowBarrier(BarrierMenu.barrierMenu); } } } diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 7a74059..95f879c 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -12,31 +12,38 @@ namespace SceneManager { class PathCreationMenu { - #pragma warning disable CS0618 // Type or member is obsolete, clear NUI squiggles - public static UIMenuItem trafficAddWaypoint, trafficRemoveWaypoint, trafficEndPath; - public static UIMenuListItem waypointType, waypointSpeed, collectorRadius; + public static UIMenu pathCreationMenu { get; private set; } + private static UIMenuItem trafficAddWaypoint, trafficRemoveWaypoint, trafficEndPath; + private static UIMenuListScrollerItem waypointType; + private static UIMenuListScrollerItem waypointSpeed; + private static UIMenuListScrollerItem collectorRadius; private static UIMenuCheckboxItem collectorWaypoint; - private static List waypointSpeeds = new List() { 5f, 10f, 15f, 20f, 30f, 40f, 50f, 60f, 70f }; - //private enum waypointTypes {DriveTo, Stop }; - private static List waypointTypes = new List() { "Drive To", "Stop" }; - private static List collectorRadii = new List() { 3f, 5f, 10f, 15f, 20f, 30f, 40f, 50f }; + private static List waypointTypes = new List() { "Drive To", "Stop" }; + private static List waypointSpeeds = new List() { 5f, 10f, 15f, 20f, 30f, 40f, 50f, 60f, 70f }; + private static List collectorRadii = new List() { 3f, 5f, 10f, 15f, 20f, 30f, 40f, 50f }; private static VehicleDrivingFlags[] drivingFlags = new VehicleDrivingFlags[] { VehicleDrivingFlags.Normal, VehicleDrivingFlags.StopAtDestination }; // Implement custom driving flag for normal - // Called from EditPathMenu + internal static void InstantiateMenu() + { + pathCreationMenu = new UIMenu("Scene Menu", "~o~Path Creation"); + pathCreationMenu.ParentMenu = PathMainMenu.pathMainMenu; + MenuManager.menuPool.Add(pathCreationMenu); + } + public static void BuildPathCreationMenu() { - MenuManager.pathCreationMenu.AddItem(waypointType = new UIMenuListItem("Waypoint Type", waypointTypes, 0)); - MenuManager.pathCreationMenu.AddItem(waypointSpeed = new UIMenuListItem($"Waypoint Speed (in {SettingsMenu.speedUnits.SelectedItem})", waypointSpeeds, 0)); - MenuManager.pathCreationMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector", true)); // true if path's first waypoint - MenuManager.pathCreationMenu.AddItem(collectorRadius = new UIMenuListItem("Collection Radius", collectorRadii, 0)); - MenuManager.pathCreationMenu.AddItem(trafficAddWaypoint = new UIMenuItem("Add waypoint")); - MenuManager.pathCreationMenu.AddItem(trafficRemoveWaypoint = new UIMenuItem("Remove last waypoint")); + pathCreationMenu.AddItem(waypointType = new UIMenuListScrollerItem("Waypoint Type", "", waypointTypes)); + pathCreationMenu.AddItem(waypointSpeed = new UIMenuListScrollerItem($"Waypoint Speed (in {SettingsMenu.speedUnits.SelectedItem}", "", waypointSpeeds)); + pathCreationMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector", true)); // true if path's first waypoint + pathCreationMenu.AddItem(collectorRadius = new UIMenuListScrollerItem("Collection Radius", "", collectorRadii)); + pathCreationMenu.AddItem(trafficAddWaypoint = new UIMenuItem("Add waypoint")); + pathCreationMenu.AddItem(trafficRemoveWaypoint = new UIMenuItem("Remove last waypoint")); trafficRemoveWaypoint.Enabled = false; - MenuManager.pathCreationMenu.AddItem(trafficEndPath = new UIMenuItem("End path creation")); + pathCreationMenu.AddItem(trafficEndPath = new UIMenuItem("End path creation")); - MenuManager.pathCreationMenu.RefreshIndex(); - MenuManager.pathCreationMenu.OnItemSelect += PathCreation_OnItemSelected; + pathCreationMenu.RefreshIndex(); + pathCreationMenu.OnItemSelect += PathCreation_OnItemSelected; } private static void PathCreation_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) @@ -44,10 +51,10 @@ namespace SceneManager // Do I need to implement a distance restriction? Idiots place waypoints unnecessarily close, possibly causing AI to drive in circles if (selectedItem == trafficAddWaypoint) { - var firstNonNullPath = TrafficMenu.paths.Where(p => p != null && !p.PathFinished).First(); - var pathIndex = TrafficMenu.paths.IndexOf(firstNonNullPath); + var firstNonNullPath = PathMainMenu.GetPaths().Where(p => p != null && !p.PathFinished).First(); + var pathIndex = PathMainMenu.GetPaths().IndexOf(firstNonNullPath); var currentPath = pathIndex + 1; - var currentWaypoint = TrafficMenu.paths[pathIndex].Waypoints.Count + 1; + var currentWaypoint = PathMainMenu.GetPaths()[pathIndex].Waypoints.Count + 1; var drivingFlag = drivingFlags[waypointType.Index]; var blip = CreateWaypointBlip(pathIndex); @@ -57,35 +64,35 @@ namespace SceneManager ? (uint)World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index])) : (uint)World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index])); - TrafficMenu.paths[pathIndex].Waypoints.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, collectorRadii[collectorRadius.Index], yieldZone)); + PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, collectorRadii[collectorRadius.Index], yieldZone)); } else { - TrafficMenu.paths[pathIndex].Waypoints.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip)); + PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip)); } Game.LogTrivial($"[Path {currentPath}] Waypoint {currentWaypoint} ({drivingFlag.ToString()}) added"); // Refresh the trafficMenu after a waypoint is added in order to show Continue Creating Current Path instead of Create New Path - RefreshTrafficMenu(); + PathMainMenu.RefreshMenu(trafficRemoveWaypoint); } if (selectedItem == trafficRemoveWaypoint) { // Loop through each path and find the first one which isn't finished, then delete the path's last waypoint and corresponding blip - for (int i = 0; i < TrafficMenu.paths.Count; i++) + for (int i = 0; i < PathMainMenu.GetPaths().Count; i++) { - if (TrafficMenu.paths.ElementAtOrDefault(i) != null && !TrafficMenu.paths[i].PathFinished) + if (PathMainMenu.GetPaths().ElementAtOrDefault(i) != null && !PathMainMenu.GetPaths()[i].PathFinished) { - Game.LogTrivial($"[Path {i + 1}] {TrafficMenu.paths[i].Waypoints.Last().DrivingFlag.ToString()} waypoint removed"); - TrafficMenu.paths[i].Waypoints.Last().Blip.Delete(); - if (TrafficMenu.paths[i].Waypoints.Last().CollectorRadiusBlip) + Game.LogTrivial($"[Path {i + 1}] {PathMainMenu.GetPaths()[i].Waypoints.Last().DrivingFlag.ToString()} waypoint removed"); + PathMainMenu.GetPaths()[i].Waypoints.Last().Blip.Delete(); + if (PathMainMenu.GetPaths()[i].Waypoints.Last().CollectorRadiusBlip) { - TrafficMenu.paths[i].Waypoints.Last().CollectorRadiusBlip.Delete(); + PathMainMenu.GetPaths()[i].Waypoints.Last().CollectorRadiusBlip.Delete(); } - TrafficMenu.paths[i].Waypoints.RemoveAt(TrafficMenu.paths[i].Waypoints.IndexOf(TrafficMenu.paths[i].Waypoints.Last())); + PathMainMenu.GetPaths()[i].Waypoints.RemoveAt(PathMainMenu.GetPaths()[i].Waypoints.IndexOf(PathMainMenu.GetPaths()[i].Waypoints.Last())); // If the path has no waypoints, disable the menu option to remove a waypoint - if (TrafficMenu.paths[i].Waypoints.Count == 0) + if (PathMainMenu.GetPaths()[i].Waypoints.Count == 0) { trafficRemoveWaypoint.Enabled = false; } @@ -96,10 +103,10 @@ namespace SceneManager if (selectedItem == trafficEndPath) { // Loop through each path and find the first one which isn't finished - for (int i = 0; i < TrafficMenu.paths.Count; i++) + for (int i = 0; i < PathMainMenu.GetPaths().Count; i++) { - var currentPath = TrafficMenu.paths[i]; - if (TrafficMenu.paths.ElementAtOrDefault(i) != null && !currentPath.PathFinished) + var currentPath = PathMainMenu.GetPaths()[i]; + if (PathMainMenu.GetPaths().ElementAtOrDefault(i) != null && !currentPath.PathFinished) { // If the path has one stop waypoint or at least two waypoints, finish the path and start the vehicle collector loop, else show user the error and delete any waypoints they made and clear the invalid path if (currentPath.Waypoints.Count >= 2 || (currentPath.Waypoints.Count == 1 && currentPath.Waypoints[0].DrivingFlag == VehicleDrivingFlags.StopAtDestination)) @@ -114,32 +121,32 @@ namespace SceneManager currentPath.FinishPath(); currentPath.EnablePath(); currentPath.SetPathNumber(i + 1); - TrafficMenu.pathsNum.Insert(i, currentPath.PathNum); + PathMainMenu.AddPathToPathCountList(i, currentPath.PathNum); //GameFiber InitialWaypointVehicleCollectorFiber = new GameFiber(() => TrafficPathing.InitialWaypointVehicleCollector(paths[i])); //InitialWaypointVehicleCollectorFiber.Start(); // For each waypoint in the path's WaypointData, start a collector game fiber and loop while the path and waypoint exist, and while the path is enabled - foreach (Waypoint wd in TrafficMenu.paths[i].Waypoints) + foreach (Waypoint wd in PathMainMenu.GetPaths()[i].Waypoints) { - GameFiber WaypointVehicleCollectorFiber = new GameFiber(() => TrafficPathing.WaypointVehicleCollector(TrafficMenu.paths, TrafficMenu.paths[i], wd)); + GameFiber WaypointVehicleCollectorFiber = new GameFiber(() => TrafficPathing.WaypointVehicleCollector(PathMainMenu.GetPaths(), PathMainMenu.GetPaths()[i], wd)); WaypointVehicleCollectorFiber.Start(); - GameFiber AssignStopForVehiclesFlagFiber = new GameFiber(() => TrafficPathing.AssignStopForVehiclesFlag(TrafficMenu.paths, TrafficMenu.paths[i], wd)); + GameFiber AssignStopForVehiclesFlagFiber = new GameFiber(() => TrafficPathing.AssignStopForVehiclesFlag(PathMainMenu.GetPaths(), PathMainMenu.GetPaths()[i], wd)); AssignStopForVehiclesFlagFiber.Start(); } MenuManager.menuPool.CloseAllMenus(); - MenuManager.pathMenu.Clear(); - TrafficMenu.BuildPathMenu(); - MenuManager.pathMenu.Visible = true; + PathMainMenu.pathMainMenu.Clear(); + PathMainMenu.BuildPathMenu(); + PathMainMenu.pathMainMenu.Visible = true; break; } else { Game.LogTrivial($"[Path Error] A minimum of 2 waypoints is required."); Game.DisplayNotification($"~o~Scene Manager\n~r~[Error]~w~ A minimum of 2 waypoints or one stop waypoint is required to create a path."); - foreach (Waypoint wp in TrafficMenu.paths[i].Waypoints) + foreach (Waypoint wp in PathMainMenu.GetPaths()[i].Waypoints) { wp.Blip.Delete(); if (wp.CollectorRadiusBlip) @@ -147,8 +154,8 @@ namespace SceneManager wp.CollectorRadiusBlip.Delete(); } } - TrafficMenu.paths[i].Waypoints.Clear(); - TrafficMenu.paths.RemoveAt(i); + PathMainMenu.GetPaths()[i].Waypoints.Clear(); + PathMainMenu.GetPaths().RemoveAt(i); break; } } @@ -187,7 +194,7 @@ namespace SceneManager Sprite = (BlipSprite)spriteNumericalEnum }; - if (TrafficMenu.paths[pathIndex].Waypoints.Count == 0) + if (PathMainMenu.GetPaths()[pathIndex].Waypoints.Count == 0) { blip.Color = Color.Orange; } @@ -199,26 +206,36 @@ namespace SceneManager return blip; } - private static void RefreshTrafficMenu() + public static void AddNewPathToPathsCollection(List paths, int pathIndex) { - trafficRemoveWaypoint.Enabled = true; - MenuManager.pathMenu.Clear(); - MenuManager.pathMenu.AddItem(TrafficMenu.createNewPath = new UIMenuItem("Continue Creating Current Path")); - MenuManager.pathMenu.AddItem(TrafficMenu.deleteAllPaths = new UIMenuItem("Delete All Paths")); - MenuManager.pathMenu.AddItem(TrafficMenu.directDriver = new UIMenuListItem("Direct nearest driver to path", TrafficMenu.pathsNum, 0)); - MenuManager.pathMenu.AddItem(TrafficMenu.dismissDriver = new UIMenuListItem("Dismiss nearest driver", TrafficMenu.dismissOptions, 0)); - - if (TrafficMenu.paths.Count == 8) - { - TrafficMenu.createNewPath.Enabled = false; - } - if (TrafficMenu.paths.Count == 0) - { - TrafficMenu.editPath.Enabled = false; - TrafficMenu.deleteAllPaths.Enabled = false; - TrafficMenu.disableAllPaths.Enabled = false; - TrafficMenu.directDriver.Enabled = false; - } + var pathNum = pathIndex + 1; + Game.LogTrivial($"Creating path {pathNum}"); + Game.DisplayNotification($"~o~Scene Manager\n~y~[Creating]~w~ Path {pathNum} started."); + paths.Insert(pathIndex, new Path(pathNum, false)); + trafficRemoveWaypoint.Enabled = false; } + + //private static void RefreshPathMainMenu() + //{ + // trafficRemoveWaypoint.Enabled = true; + // MenuManager.pathMenu.Clear(); + // //MenuManager.pathMenu.AddItem(PathMainMenu.AddNewMenuItem()) + // MenuManager.pathMenu.AddItem(PathMainMenu.createNewPath = new UIMenuItem("Continue Creating Current Path")); + // MenuManager.pathMenu.AddItem(PathMainMenu.deleteAllPaths = new UIMenuItem("Delete All Paths")); + // MenuManager.pathMenu.AddItem(PathMainMenu.directDriver = new UIMenuListScrollerItem("Direct nearest driver to path", "")); + // MenuManager.pathMenu.AddItem(PathMainMenu.dismissDriver = new UIMenuListScrollerItem("Dismiss nearest driver", "")); + + // if (PathMainMenu.GetPaths().Count == 8) + // { + // PathMainMenu.createNewPath.Enabled = false; + // } + // if (PathMainMenu.GetPaths().Count == 0) + // { + // PathMainMenu.editPath.Enabled = false; + // PathMainMenu.deleteAllPaths.Enabled = false; + // PathMainMenu.disableAllPaths.Enabled = false; + // PathMainMenu.directDriver.Enabled = false; + // } + //} } } diff --git a/SceneManager/Menus/TrafficMenu.cs b/SceneManager/Menus/PathMainMenu.cs similarity index 75% rename from SceneManager/Menus/TrafficMenu.cs rename to SceneManager/Menus/PathMainMenu.cs index 5315522..1cd2d39 100644 --- a/SceneManager/Menus/TrafficMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -7,31 +7,45 @@ using RAGENativeUI.Elements; namespace SceneManager { - static class TrafficMenu + static class PathMainMenu { - #pragma warning disable CS0618 // Type or member is obsolete, clear NUI squiggles - public static UIMenuItem createNewPath, deleteAllPaths; - public static UIMenuListItem editPath, directDriver, dismissDriver; - public static UIMenuCheckboxItem disableAllPaths; - - public static List pathsNum = new List() { }; - public static List paths = new List() { }; - public static List dismissOptions = new List() { "From path", "From waypoint", "From position" }; + public static UIMenu pathMainMenu { get; private set; } + private static UIMenuItem createNewPath, deleteAllPaths; + public static UIMenuListScrollerItem editPath { get; private set; } + public static UIMenuListScrollerItem directDriver { get; private set; } + public static UIMenuListScrollerItem dismissDriver { get; private set; } + public static UIMenuCheckboxItem disableAllPaths { get; private set; } + + private static List pathsNum = new List(); + private static List paths = new List() { }; + private static List dismissOptions = new List() { "From path", "From waypoint", "From position" }; + public enum Delete + { + Single, + All + } + + internal static void InstantiateMenu() + { + pathMainMenu = new UIMenu("Scene Menu", "~o~Path Manager Main Menu"); + pathMainMenu.ParentMenu = MainMenu.mainMenu; + MenuManager.menuPool.Add(pathMainMenu); + } public static void BuildPathMenu() { // New stuff to mitigate Rebuild method - MenuManager.pathMenu.OnItemSelect -= PathMenu_OnItemSelected; - MenuManager.pathMenu.OnCheckboxChange -= PathMenu_OnCheckboxChange; + pathMainMenu.OnItemSelect -= PathMenu_OnItemSelected; + pathMainMenu.OnCheckboxChange -= PathMenu_OnCheckboxChange; MenuManager.menuPool.CloseAllMenus(); - MenuManager.pathMenu.Clear(); + pathMainMenu.Clear(); - MenuManager.pathMenu.AddItem(createNewPath = new UIMenuItem("Create New Path")); - MenuManager.pathMenu.AddItem(editPath = new UIMenuListItem("Edit Path", pathsNum, 0)); - MenuManager.pathMenu.AddItem(disableAllPaths = new UIMenuCheckboxItem("Disable All Paths", false)); - MenuManager.pathMenu.AddItem(deleteAllPaths = new UIMenuItem("Delete All Paths")); - MenuManager.pathMenu.AddItem(directDriver = new UIMenuListItem("Direct nearest driver to path", pathsNum, 0)); - MenuManager.pathMenu.AddItem(dismissDriver = new UIMenuListItem("Dismiss nearest driver", dismissOptions, 0)); + pathMainMenu.AddItem(createNewPath = new UIMenuItem("Create New Path")); + pathMainMenu.AddItem(editPath = new UIMenuListScrollerItem("Edit Path", "", pathsNum)); + pathMainMenu.AddItem(disableAllPaths = new UIMenuCheckboxItem("Disable All Paths", false)); + pathMainMenu.AddItem(deleteAllPaths = new UIMenuItem("Delete All Paths")); + pathMainMenu.AddItem(directDriver = new UIMenuListScrollerItem("Direct nearest driver to path", "", pathsNum)); + pathMainMenu.AddItem(dismissDriver = new UIMenuListScrollerItem("Dismiss nearest driver", "", dismissOptions)); if (paths.Count == 8) { @@ -45,14 +59,46 @@ namespace SceneManager directDriver.Enabled = false; } - MenuManager.pathMenu.RefreshIndex(); - MenuManager.pathMenu.OnItemSelect += PathMenu_OnItemSelected; - MenuManager.pathMenu.OnCheckboxChange += PathMenu_OnCheckboxChange; + pathMainMenu.RefreshIndex(); + pathMainMenu.OnItemSelect += PathMenu_OnItemSelected; + pathMainMenu.OnCheckboxChange += PathMenu_OnCheckboxChange; // New stuff to mitigate Rebuild method MenuManager.menuPool.RefreshIndex(); } + public static ref List GetPaths() + { + return ref paths; + } + + public static void AddPathToPathCountList(int indexToInsertAt, int pathNum) + { + pathsNum.Insert(indexToInsertAt, pathNum); + } + + public static void RefreshMenu(UIMenuItem trafficRemoveWaypoint) + { + trafficRemoveWaypoint.Enabled = true; + pathMainMenu.Clear(); + pathMainMenu.AddItem(createNewPath = new UIMenuItem("Continue Creating Current Path")); + pathMainMenu.AddItem(deleteAllPaths = new UIMenuItem("Delete All Paths")); + pathMainMenu.AddItem(directDriver = new UIMenuListScrollerItem("Direct nearest driver to path", "")); + pathMainMenu.AddItem(dismissDriver = new UIMenuListScrollerItem("Dismiss nearest driver", "")); + + if (GetPaths().Count == 8) + { + createNewPath.Enabled = false; + } + if (GetPaths().Count == 0) + { + editPath.Enabled = false; + deleteAllPaths.Enabled = false; + disableAllPaths.Enabled = false; + directDriver.Enabled = false; + } + } + private static bool VehicleAndDriverValid(this Vehicle v) { if (v && v.HasDriver && v.Driver && v.Driver.IsAlive) @@ -79,8 +125,7 @@ namespace SceneManager } } - // Refactor string param to enum - public static void DeletePath(Path path, int index, string pathsToDelete) + public static void DeletePath(Path path, int index, Delete pathsToDelete) { // Before deleting a path, we need to dismiss any vehicles controlled by that path and remove the vehicles from ControlledVehicles //Game.LogTrivial($"Deleting path {index+1}"); @@ -96,7 +141,7 @@ namespace SceneManager cv.Value.Vehicle.Driver.IsPersistent = false; cv.Value.Vehicle.Dismiss(); cv.Value.Vehicle.IsPersistent = false; - //TrafficPathing.ControlledVehicles.Remove(cv.Value.LicensePlate); + //Game.LogTrivial($"{cv.vehicle.Model.Name} cleared from path {cv.path}"); TrafficPathing.collectedVehicles.Remove(cv.Value.LicensePlate); } @@ -122,20 +167,19 @@ namespace SceneManager Game.LogTrivial($"Clearing path.WaypointData"); path.Waypoints.Clear(); // Manipulating the menu to reflect specific paths being deleted - if (pathsToDelete == "Single") + if (pathsToDelete == Delete.Single) { paths.RemoveAt(index); //Game.LogTrivial("pathsNum count: " + pathsNum.Count); //Game.LogTrivial("index: " + index); pathsNum.RemoveAt(index); - //RebuildTrafficMenu(); BuildPathMenu(); - MenuManager.pathMenu.Visible = true; + pathMainMenu.Visible = true; Game.LogTrivial($"Path {path.PathNum} deleted."); Game.DisplayNotification($"~o~Scene Manager\n~w~Path {path.PathNum} deleted."); } - MenuManager.editPathMenu.Reset(true, true); + EditPathMenu.editPathMenu.Reset(true, true); EditPathMenu.togglePath.Enabled = true; } @@ -143,8 +187,8 @@ namespace SceneManager { if (selectedItem == createNewPath) { - MenuManager.pathMenu.Visible = false; - MenuManager.pathCreationMenu.Visible = true; + pathMainMenu.Visible = false; + PathCreationMenu.pathCreationMenu.Visible = true; // For each element in paths, determine if the element exists but is not finished yet, or if it doesn't exist, create it. for (int i = 0; i <= paths.Count; i++) @@ -158,10 +202,11 @@ namespace SceneManager } else if (paths.ElementAtOrDefault(i) == null) { - Game.LogTrivial($"Creating path {i + 1}"); - Game.DisplayNotification($"~o~Scene Manager\n~y~[Creating]~w~ Path {i + 1} started."); - paths.Insert(i, new Path(i + 1, false)); - PathCreationMenu.trafficRemoveWaypoint.Enabled = false; + PathCreationMenu.AddNewPathToPathsCollection(paths, i); + //Game.LogTrivial($"Creating path {i + 1}"); + //Game.DisplayNotification($"~o~Scene Manager\n~y~[Creating]~w~ Path {i + 1} started."); + //paths.Insert(i, new Path(i + 1, false)); + //PathCreationMenu.trafficRemoveWaypoint.Enabled = false; if (SettingsMenu.debugGraphics.Checked) { @@ -177,8 +222,8 @@ namespace SceneManager if (selectedItem == editPath) { - MenuManager.pathMenu.Visible = false; - MenuManager.editPathMenu.Visible = true; + pathMainMenu.Visible = false; + EditPathMenu.editPathMenu.Visible = true; } if (selectedItem == deleteAllPaths) @@ -186,17 +231,20 @@ namespace SceneManager // Iterate through each item in paths and delete it for (int i = 0; i < paths.Count; i++) { - DeletePath(paths[i], i, "All"); + DeletePath(paths[i], i, Delete.All); } foreach (Path path in paths) { + foreach(Waypoint wp in path.Waypoints.Where(wp => wp.YieldZone != 0)) + { + World.RemoveSpeedZone(wp.YieldZone); + } path.Waypoints.Clear(); } paths.Clear(); pathsNum.Clear(); - //RebuildTrafficMenu(); BuildPathMenu(); - MenuManager.pathMenu.Visible = true; + pathMainMenu.Visible = true; Game.LogTrivial($"All paths deleted"); Game.DisplayNotification($"~o~Scene Manager\n~w~All paths deleted."); } diff --git a/SceneManager/Menus/SettingsMenu.cs b/SceneManager/Menus/SettingsMenu.cs index ef0048c..e89606a 100644 --- a/SceneManager/Menus/SettingsMenu.cs +++ b/SceneManager/Menus/SettingsMenu.cs @@ -7,6 +7,7 @@ namespace SceneManager { class SettingsMenu { + public static UIMenu settingsMenu { get; private set; } public static UIMenuCheckboxItem debugGraphics; public static UIMenuListScrollerItem speedUnits; public enum SpeedUnitsOfMeasure @@ -15,13 +16,20 @@ namespace SceneManager KPH } + internal static void InstantiateMenu() + { + settingsMenu = new UIMenu("Scene Menu", "~o~Plugin Settings"); + settingsMenu.ParentMenu = MainMenu.mainMenu; + MenuManager.menuPool.Add(settingsMenu); + } + public static void BuildSettingsMenu() { - MenuManager.settingsMenu.AddItem(debugGraphics = new UIMenuCheckboxItem("Enable Debug Graphics", false)); - MenuManager.settingsMenu.AddItem(speedUnits = new UIMenuListScrollerItem("Speed Unit of Measure", "", new[] { SpeedUnitsOfMeasure.MPH, SpeedUnitsOfMeasure.KPH })); + settingsMenu.AddItem(debugGraphics = new UIMenuCheckboxItem("Enable Debug Graphics", false)); + settingsMenu.AddItem(speedUnits = new UIMenuListScrollerItem("Speed Unit of Measure", "", new[] { SpeedUnitsOfMeasure.MPH, SpeedUnitsOfMeasure.KPH })); - MenuManager.settingsMenu.OnCheckboxChange += SettingsMenu_OnCheckboxChange; - MenuManager.settingsMenu.OnScrollerChange += SettingsMenu_OnScrollerChange; + settingsMenu.OnCheckboxChange += SettingsMenu_OnCheckboxChange; + settingsMenu.OnScrollerChange += SettingsMenu_OnScrollerChange; } private static void SettingsMenu_OnCheckboxChange(UIMenu sender, UIMenuCheckboxItem checkboxItem, bool @checked) @@ -32,7 +40,7 @@ namespace SceneManager // TODO: Add branch for this during path creation ... create temp Waypoint list during path creation, then assign to path[i] after creation? if (debugGraphics.Checked) { - foreach (Path path in TrafficMenu.paths) + foreach (Path path in PathMainMenu.GetPaths()) { GameFiber.StartNew(() => { @@ -47,7 +55,8 @@ namespace SceneManager { if (scrollerItem == speedUnits) { - MenuManager.pathCreationMenu.Clear(); + // Clear the menu and rebuild it to reflect the menu item text change + PathCreationMenu.pathCreationMenu.Clear(); PathCreationMenu.BuildPathCreationMenu(); } } diff --git a/SceneManager/SceneManager.csproj b/SceneManager/SceneManager.csproj index 574a416..4a0382b 100644 --- a/SceneManager/SceneManager.csproj +++ b/SceneManager/SceneManager.csproj @@ -63,7 +63,7 @@ - + From 6a6b8b5492fd275bbff3dc9546c342098d6b825f Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 19:29:56 -0600 Subject: [PATCH 024/276] Refactored fields and properties --- .../Object Classes/CollectedVehicle.cs | 54 +++++++++++++++---- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index a1c0970..0dd39a8 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -4,15 +4,15 @@ namespace SceneManager { public class CollectedVehicle { - public Vehicle Vehicle; - public string LicensePlate; - public int Path; - public int TotalWaypoints; - public int CurrentWaypoint; - public bool TasksAssigned; - public bool DismissNow; - public bool StoppedAtWaypoint; - public bool Redirected; + public Vehicle Vehicle { get; private set; } + public string LicensePlate { get; private set; } + public int Path { get; private set; } + public int TotalWaypoints { get; private set; } + public int CurrentWaypoint { get; private set; } + public bool TasksAssigned { get; private set; } + public bool DismissNow { get; private set; } + public bool StoppedAtWaypoint { get; private set; } + public bool Redirected { get; private set; } public CollectedVehicle(Vehicle vehicle, string licensePlate, int path, int totalWaypoints, int currentWaypoint, bool tasksAssigned, bool dismissNow, bool redirected) { @@ -25,5 +25,41 @@ namespace SceneManager DismissNow = dismissNow; Redirected = redirected; } + + public void AssignPropertiesFromDirectedTask(int pathNum, int totalPathWaypoints, int currentWaypoint, bool tasksAssigned, bool dismiss, bool stoppedAtWaypoint, bool redirected) + { + Path = pathNum; + TotalWaypoints = totalPathWaypoints; + CurrentWaypoint = currentWaypoint; + TasksAssigned = tasksAssigned; + DismissNow = dismiss; + StoppedAtWaypoint = stoppedAtWaypoint; + Redirected = redirected; + } + + public void SetCurrentWaypoint(int currentWaypoint) + { + CurrentWaypoint = currentWaypoint; + } + + public void SetTasksAssigned(bool tasksAssigned) + { + TasksAssigned = tasksAssigned; + } + + public void SetDismissNow(bool dismissNow) + { + DismissNow = dismissNow; + } + + public void SetStoppedAtWaypoint(bool stoppedAtWaypoint) + { + StoppedAtWaypoint = stoppedAtWaypoint; + } + + public void SetRedirected(bool redirected) + { + Redirected = redirected; + } } } From 5e26f15e753f6a7e223521b775e851f5ef37f63e Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 20 Aug 2020 19:30:34 -0600 Subject: [PATCH 025/276] Updated references and method calls on CollectedVehicle objects as a result of CollectedVehicle refactor --- SceneManager/Menus/PathMainMenu.cs | 18 ++++++-------- SceneManager/TrafficPathing.cs | 40 ++++++++++++++---------------- 2 files changed, 27 insertions(+), 31 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index 1cd2d39..3a15957 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -135,7 +135,7 @@ namespace SceneManager Game.LogTrivial($"Removing all vehicles on the path"); foreach (KeyValuePair cv in pathVehicles.Where(cv => cv.Value.Vehicle && cv.Value.Vehicle.Driver)) { - cv.Value.DismissNow = true; + cv.Value.SetDismissNow(true); cv.Value.Vehicle.Driver.Tasks.Clear(); cv.Value.Vehicle.Driver.Dismiss(); cv.Value.Vehicle.Driver.IsPersistent = false; @@ -258,15 +258,13 @@ namespace SceneManager { var vehicle = TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate]; var nearestWaypoint = paths[directDriver.Index].Waypoints.OrderBy(wp => wp.Position).Take(1) as Waypoint; + var pathNum = paths[directDriver.Index].Waypoints[0].Path; + var totalPathWaypoints = paths[directDriver.Index].Waypoints.Count; Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} already in collection. Clearing tasks."); nearbyVehicle.Driver.Tasks.Clear(); - vehicle.Path = paths[directDriver.Index].Waypoints[0].Path; - vehicle.TotalWaypoints = paths[directDriver.Index].Waypoints.Count; - vehicle.CurrentWaypoint = 1; - vehicle.DismissNow = true; - vehicle.StoppedAtWaypoint = false; - vehicle.Redirected = true; + vehicle.AssignPropertiesFromDirectedTask(pathNum, totalPathWaypoints, 1, tasksAssigned: false, dismiss: true, stoppedAtWaypoint: false, redirected: true); + GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(vehicle, paths[directDriver.Index].Waypoints)); DirectTaskFiber.Start(); } @@ -293,7 +291,7 @@ namespace SceneManager if (nearbyVehicle.IsInCollectedVehicles()) { var controlledVehicle = TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate]; - controlledVehicle.DismissNow = true; + controlledVehicle.SetDismissNow(true); controlledVehicle.Vehicle.Driver.Tasks.Clear(); controlledVehicle.Vehicle.Driver.Dismiss(); Game.LogTrivial($"Dismissed driver of {controlledVehicle.Vehicle.Model.Name} from path {controlledVehicle.Path}"); @@ -309,13 +307,13 @@ namespace SceneManager if (nearbyVehicle.IsInCollectedVehicles()) { var controlledVehicle = TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate]; - controlledVehicle.StoppedAtWaypoint = false; + controlledVehicle.SetStoppedAtWaypoint(false); controlledVehicle.Vehicle.Driver.Tasks.Clear(); controlledVehicle.Vehicle.Driver.Dismiss(); if (controlledVehicle.CurrentWaypoint == controlledVehicle.TotalWaypoints && !controlledVehicle.StoppedAtWaypoint) { - controlledVehicle.DismissNow = true; + controlledVehicle.SetDismissNow(true); Game.LogTrivial($"Dismissed driver of {controlledVehicle.Vehicle.Model.Name} from final waypoint and ultimately the path"); } else diff --git a/SceneManager/TrafficPathing.cs b/SceneManager/TrafficPathing.cs index 011a7c7..119576c 100644 --- a/SceneManager/TrafficPathing.cs +++ b/SceneManager/TrafficPathing.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Drawing; using Rage; namespace SceneManager @@ -42,7 +41,7 @@ namespace SceneManager else if (collectedVehicles.ContainsKey(v.LicensePlate) && !collectedVehicles[v.LicensePlate].TasksAssigned) { Game.LogTrivial($"[WaypointVehicleCollector] {v.Model.Name} already in collection, but with no tasks. Assigning tasks."); - collectedVehicles[v.LicensePlate].TasksAssigned = true; + collectedVehicles[v.LicensePlate].SetTasksAssigned(true); AssignTasks(collectedVehicles[v.LicensePlate], path.Waypoints, waypoint); } @@ -54,7 +53,6 @@ namespace SceneManager } } GameFiber.Sleep(100); - //GameFiber.Yield(); } } @@ -105,52 +103,52 @@ namespace SceneManager Game.LogTrivial($"{cv.Vehicle.Model.Name} should be stopped at the waypoint."); cv.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking);//.WaitForCompletion(); cv.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.Wait); - cv.StoppedAtWaypoint = true; + cv.SetStoppedAtWaypoint(true); } } - private static void AssignMultiWaypointTasks(CollectedVehicle cv, List waypointData, Waypoint collectorWaypoint) + private static void AssignMultiWaypointTasks(CollectedVehicle cv, List waypoints, Waypoint collectorWaypoint) { // For each waypoint in the path, give driver a task to that waypoint // i needs to be the index of the waypoint the vehicle was collected from - for (int i = waypointData.IndexOf(collectorWaypoint); i < waypointData.Count; i++) + for (int i = waypoints.IndexOf(collectorWaypoint); i < waypoints.Count; i++) //for (int i = 1; i < waypointData.Count; i++) { if (!cv.DismissNow) { - cv.CurrentWaypoint = waypointData[i].Number; + cv.SetCurrentWaypoint(waypoints[i].Number); var nextWaypoint = i + 1; - Game.LogTrivial($"Assigning task to {cv.Vehicle.Model.Name} from waypoint {nextWaypoint} of {waypointData.Count}"); + Game.LogTrivial($"Assigning task to {cv.Vehicle.Model.Name} from waypoint {collectorWaypoint.Number} of {waypoints.Count}"); - if (cv.Vehicle && cv.Vehicle.Driver && waypointData.ElementAtOrDefault(nextWaypoint) != null && waypointData[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + if (cv.Vehicle && cv.Vehicle.Driver && waypoints.ElementAtOrDefault(nextWaypoint) != null && waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) { // Give driver a task to the waypoint. Run a loop with a condition checking for DismissNow for cases where the driver is dismissed or redirected SetDriveTaskDrivingFlags(cv.Vehicle.Driver, EDrivingFlags.TotalControl); - if (waypointData[nextWaypoint] != null) + if (waypoints[nextWaypoint] != null) { //Game.LogTrivial($"Driving to stop waypoint"); - cv.Vehicle.Driver.Tasks.DriveToPosition(waypointData[nextWaypoint].Position, waypointData[nextWaypoint].Speed, (VehicleDrivingFlags)262539, 1f); + cv.Vehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)262539, 1f); } else { Game.LogTrivial($"i is out of bounds for assigning task"); } - while (cv.Vehicle && cv.Vehicle.Driver && waypointData.ElementAtOrDefault(nextWaypoint) != null && cv.Vehicle.DistanceTo(waypointData[nextWaypoint].Position) > 3f && !cv.DismissNow) + while (cv.Vehicle && cv.Vehicle.Driver && waypoints.ElementAtOrDefault(nextWaypoint) != null && cv.Vehicle.DistanceTo(waypoints[nextWaypoint].Position) > 3f && !cv.DismissNow) { GameFiber.Sleep(100); } - if (waypointData.ElementAtOrDefault(i) != null && !cv.DismissNow) + if (waypoints.ElementAtOrDefault(i) != null && !cv.DismissNow) { Game.LogTrivial($"{cv.Vehicle.Model.Name} stopping at stop waypoint"); cv.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); - cv.StoppedAtWaypoint = true; + cv.SetStoppedAtWaypoint(true); } } - else if (cv.Vehicle && cv.Vehicle.Driver && waypointData.ElementAtOrDefault(nextWaypoint) != null && !cv.DismissNow) + else if (cv.Vehicle && cv.Vehicle.Driver && waypoints.ElementAtOrDefault(nextWaypoint) != null && !cv.DismissNow) { - cv.Vehicle.Driver.Tasks.DriveToPosition(waypointData[nextWaypoint].Position, waypointData[nextWaypoint].Speed, (VehicleDrivingFlags)262539, 1f).WaitForCompletion(); + cv.Vehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)262539, 1f).WaitForCompletion(); } Game.LogTrivial($"{cv.Vehicle.Model.Name} waypoint {nextWaypoint} task complete"); } @@ -175,8 +173,8 @@ namespace SceneManager private static void DismissDriver(CollectedVehicle cv) { - cv.DismissNow = true; - cv.StoppedAtWaypoint = false; + cv.SetDismissNow(true); + cv.SetStoppedAtWaypoint(false); if (cv.Vehicle && cv.Vehicle.Driver && !cv.Redirected) { cv.Vehicle.Driver.Dismiss(); @@ -216,7 +214,7 @@ namespace SceneManager public static void DirectTask(CollectedVehicle cv, List waypoints) { - cv.DismissNow = false; + cv.SetDismissNow(false); if (cv.Vehicle && cv.Vehicle.Driver) { cv.Vehicle.IsPersistent = true; @@ -235,7 +233,7 @@ namespace SceneManager cv.Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint.Position, nearestWaypoint.Speed, (VehicleDrivingFlags)262539, 1f); GameFiber.Sleep(500); } - cv.Redirected = false; + cv.SetRedirected(false); Game.LogTrivial($"DirectTask loop over"); } @@ -257,7 +255,7 @@ namespace SceneManager if (collectedVehicles.ContainsKey(cv.LicensePlate) && vehicleFarEnoughAwayFromCollectors) { Game.LogTrivial($"{cv.Vehicle.Model.Name} is far enough away from all attractor waypoints and has been removed from the collection."); - cv.TasksAssigned = false; + cv.SetTasksAssigned(false); cv.Vehicle.Driver.BlockPermanentEvents = false; cv.Vehicle.Driver.IsPersistent = false; cv.Vehicle.IsPersistent = false; From 56a801df92381da0b671cabc2152252c4b5e525d Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 23 Aug 2020 15:41:09 -0600 Subject: [PATCH 026/276] Updated methods related to path status --- SceneManager/Object Classes/Path.cs | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/SceneManager/Object Classes/Path.cs b/SceneManager/Object Classes/Path.cs index feb035a..3a4921f 100644 --- a/SceneManager/Object Classes/Path.cs +++ b/SceneManager/Object Classes/Path.cs @@ -2,18 +2,26 @@ namespace SceneManager { + public enum Status + { + IsEnabled, + IsDisabled + } + public class Path { public int PathNum { get; private set; } public bool PathFinished { get; private set; } - public bool PathDisabled { get; private set; } + public bool IsEnabled { get; private set; } + public Status Status { get; private set; } + public List Waypoints = new List(); public Path(int pathNum, bool pathFinished, bool pathDisabled, List waypoints) { PathNum = pathNum; PathFinished = pathFinished; - PathDisabled = pathDisabled; + IsEnabled = pathDisabled; Waypoints = waypoints; } @@ -23,6 +31,11 @@ namespace SceneManager PathFinished = pathFinished; } + public void SetPathStatus(bool status) + { + IsEnabled = status; + } + public void SetPathNumber(int pathNum) { PathNum = pathNum; @@ -35,7 +48,7 @@ namespace SceneManager public void DisablePath() { - PathDisabled = true; + IsEnabled = false; LowerWaypointBlipsOpacity(); } @@ -53,7 +66,7 @@ namespace SceneManager public void EnablePath() { - PathDisabled = false; + IsEnabled = true; } private void RestoreWaypointBlipsOpacity() From c319d1910d9a58564519f8889f724155e4878c8f Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 23 Aug 2020 15:42:14 -0600 Subject: [PATCH 027/276] Updated waypoint Collector field name to IsCollector --- SceneManager/Menus/EditWaypointMenu.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 4408643..8f0350f 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -50,7 +50,7 @@ namespace SceneManager editWaypointMenu.AddItem(editWaypoint = new UIMenuListItem("Edit Waypoint", pathWaypoints, 0)); editWaypointMenu.AddItem(changeWaypointType = new UIMenuListItem("Change Waypoint Type", waypointTypes, Array.IndexOf(drivingFlags, currentPath.Waypoints[editWaypoint.Index].DrivingFlag))); editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuListItem("Change Waypoint Speed", waypointSpeeds, waypointSpeeds.IndexOf(currentPath.Waypoints[editWaypoint.Index].Speed))); - editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector Waypoint", PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Collector)); + editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector Waypoint", PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].IsCollector)); editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListItem("Change Collection Radius", collectorRadii, collectorRadii.IndexOf(currentPath.Waypoints[editWaypoint.Index].CollectorRadius))); editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); @@ -79,7 +79,7 @@ namespace SceneManager editWaypointMenu.AddItem(changeWaypointType = new UIMenuListItem("Change Waypoint Type", waypointTypes, Array.IndexOf(drivingFlags, currentWaypoint.DrivingFlag))); editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuListItem("Change Waypoint Speed", waypointSpeeds, waypointSpeeds.IndexOf(currentWaypoint.Speed))); - editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Attractor Waypoint", currentWaypoint.Collector)); + editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Attractor Waypoint", currentWaypoint.IsCollector)); editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListItem("Change Collection Radius", collectorRadii, collectorRadii.IndexOf(currentPath.Waypoints[editWaypoint.Index].CollectorRadius))); editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); @@ -96,7 +96,7 @@ namespace SceneManager if (selectedItem == editUpdateWaypoint) { currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], waypointSpeeds[changeWaypointSpeed.Index], collectorWaypoint.Checked, collectorRadii[changeCollectorRadius.Index], updateWaypointPosition.Checked); - Game.LogTrivial($"Updated path {currentPath.PathNum} waypoint {currentWaypoint.Number}: Driving flag is {drivingFlags[changeWaypointType.Index].ToString()}, speed is {waypointSpeeds[changeWaypointSpeed.Index].ToString()}, collector is {currentWaypoint.Collector}"); + Game.LogTrivial($"Updated path {currentPath.PathNum} waypoint {currentWaypoint.Number}: Driving flag is {drivingFlags[changeWaypointType.Index].ToString()}, speed is {waypointSpeeds[changeWaypointSpeed.Index].ToString()}, collector is {currentWaypoint.IsCollector}"); if (currentPath.Waypoints.Count < 2 && currentPath.Waypoints[0].DrivingFlag == VehicleDrivingFlags.StopAtDestination) { From d71d7ba275a7616c917e8751653082646f06a70b Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 23 Aug 2020 15:42:35 -0600 Subject: [PATCH 028/276] Updated waypoint Collector field name to IsCollector --- SceneManager/Object Classes/Waypoint.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index bc0d4f1..b543063 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -12,7 +12,7 @@ namespace SceneManager public VehicleDrivingFlags DrivingFlag { get; private set; } public Blip Blip { get; private set; } public uint YieldZone { get; private set; } - public bool Collector { get; private set; } + public bool IsCollector { get; private set; } public float CollectorRadius { get; private set; } public Blip CollectorRadiusBlip { get; private set; } @@ -35,7 +35,7 @@ namespace SceneManager Speed = speed; DrivingFlag = drivingFlag; Blip = waypointBlip; - Collector = collector; + IsCollector = collector; CollectorRadius = collectorRadius; YieldZone = yieldZone; CollectorRadiusBlip = new Blip(waypointBlip.Position, collectorRadius) @@ -60,7 +60,7 @@ namespace SceneManager { if (collectorWaypointChecked) { - Collector = true; + IsCollector = true; YieldZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, drivingSpeed); if (CollectorRadiusBlip) { @@ -79,7 +79,7 @@ namespace SceneManager } else { - Collector = false; + IsCollector = false; World.RemoveSpeedZone(YieldZone); if (CollectorRadiusBlip) { From db0cc52873d1d7575324e40309e54846e6247d41 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 23 Aug 2020 15:43:44 -0600 Subject: [PATCH 029/276] Added toggling of trafficEndPath menu item based on path waypoints. Began implementing colored text for selectable menu items --- SceneManager/Menus/PathCreationMenu.cs | 46 ++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 95f879c..182bfd6 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -34,16 +34,29 @@ namespace SceneManager public static void BuildPathCreationMenu() { pathCreationMenu.AddItem(waypointType = new UIMenuListScrollerItem("Waypoint Type", "", waypointTypes)); - pathCreationMenu.AddItem(waypointSpeed = new UIMenuListScrollerItem($"Waypoint Speed (in {SettingsMenu.speedUnits.SelectedItem}", "", waypointSpeeds)); + pathCreationMenu.AddItem(waypointSpeed = new UIMenuListScrollerItem($"Waypoint Speed (in {SettingsMenu.speedUnits.SelectedItem})", "", waypointSpeeds)); pathCreationMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector", true)); // true if path's first waypoint pathCreationMenu.AddItem(collectorRadius = new UIMenuListScrollerItem("Collection Radius", "", collectorRadii)); pathCreationMenu.AddItem(trafficAddWaypoint = new UIMenuItem("Add waypoint")); + trafficAddWaypoint.ForeColor = Color.Gold; pathCreationMenu.AddItem(trafficRemoveWaypoint = new UIMenuItem("Remove last waypoint")); + trafficRemoveWaypoint.ForeColor = Color.Gold; trafficRemoveWaypoint.Enabled = false; pathCreationMenu.AddItem(trafficEndPath = new UIMenuItem("End path creation")); + trafficEndPath.ForeColor = Color.Gold; + trafficEndPath.Enabled = false; pathCreationMenu.RefreshIndex(); pathCreationMenu.OnItemSelect += PathCreation_OnItemSelected; + pathCreationMenu.OnCheckboxChange += PathCreation_OnCheckboxChange; + } + + private static void PathCreation_OnCheckboxChange(UIMenu sender, UIMenuCheckboxItem checkboxItem, bool @checked) + { + if(checkboxItem == collectorWaypoint) + { + collectorRadius.Enabled = collectorWaypoint.Checked ? true : false; + } } private static void PathCreation_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) @@ -58,11 +71,11 @@ namespace SceneManager var drivingFlag = drivingFlags[waypointType.Index]; var blip = CreateWaypointBlip(pathIndex); - if (collectorWaypoint.Checked) // && is path's first waypoint + if (collectorWaypoint.Checked) { var yieldZone = SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH - ? (uint)World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index])) - : (uint)World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index])); + ? World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index])) + : World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index])); PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, collectorRadii[collectorRadius.Index], yieldZone)); } @@ -72,6 +85,8 @@ namespace SceneManager } Game.LogTrivial($"[Path {currentPath}] Waypoint {currentWaypoint} ({drivingFlag.ToString()}) added"); + ToggleTrafficEndPathMenuItem(pathIndex); + // Refresh the trafficMenu after a waypoint is added in order to show Continue Creating Current Path instead of Create New Path PathMainMenu.RefreshMenu(trafficRemoveWaypoint); } @@ -85,16 +100,21 @@ namespace SceneManager { Game.LogTrivial($"[Path {i + 1}] {PathMainMenu.GetPaths()[i].Waypoints.Last().DrivingFlag.ToString()} waypoint removed"); PathMainMenu.GetPaths()[i].Waypoints.Last().Blip.Delete(); + World.RemoveSpeedZone(PathMainMenu.GetPaths()[i].Waypoints.Last().YieldZone); + if (PathMainMenu.GetPaths()[i].Waypoints.Last().CollectorRadiusBlip) { PathMainMenu.GetPaths()[i].Waypoints.Last().CollectorRadiusBlip.Delete(); } PathMainMenu.GetPaths()[i].Waypoints.RemoveAt(PathMainMenu.GetPaths()[i].Waypoints.IndexOf(PathMainMenu.GetPaths()[i].Waypoints.Last())); + ToggleTrafficEndPathMenuItem(i); + // If the path has no waypoints, disable the menu option to remove a waypoint if (PathMainMenu.GetPaths()[i].Waypoints.Count == 0) { trafficRemoveWaypoint.Enabled = false; + trafficEndPath.Enabled = false; } } } @@ -129,11 +149,11 @@ namespace SceneManager // For each waypoint in the path's WaypointData, start a collector game fiber and loop while the path and waypoint exist, and while the path is enabled foreach (Waypoint wd in PathMainMenu.GetPaths()[i].Waypoints) { - GameFiber WaypointVehicleCollectorFiber = new GameFiber(() => TrafficPathing.WaypointVehicleCollector(PathMainMenu.GetPaths(), PathMainMenu.GetPaths()[i], wd)); + GameFiber WaypointVehicleCollectorFiber = new GameFiber(() => TrafficPathing.StartCollectingAtWaypoint(PathMainMenu.GetPaths(), PathMainMenu.GetPaths()[i], wd)); WaypointVehicleCollectorFiber.Start(); - GameFiber AssignStopForVehiclesFlagFiber = new GameFiber(() => TrafficPathing.AssignStopForVehiclesFlag(PathMainMenu.GetPaths(), PathMainMenu.GetPaths()[i], wd)); - AssignStopForVehiclesFlagFiber.Start(); + //GameFiber AssignStopForVehiclesFlagFiber = new GameFiber(() => TrafficPathing.AssignStopForVehiclesFlag(PathMainMenu.GetPaths(), PathMainMenu.GetPaths()[i], wd)); + //AssignStopForVehiclesFlagFiber.Start(); } MenuManager.menuPool.CloseAllMenus(); @@ -166,6 +186,18 @@ namespace SceneManager } } + private static void ToggleTrafficEndPathMenuItem(int pathIndex) + { + if ((PathMainMenu.GetPaths()[pathIndex].Waypoints.Count == 1 && PathMainMenu.GetPaths()[pathIndex].Waypoints.First().DrivingFlag == VehicleDrivingFlags.StopAtDestination) || (PathMainMenu.GetPaths()[pathIndex].Waypoints.Count > 1 && PathMainMenu.GetPaths()[pathIndex].Waypoints.Any(p => p.DrivingFlag != VehicleDrivingFlags.StopAtDestination))) + { + trafficEndPath.Enabled = true; + } + else + { + trafficEndPath.Enabled = false; + } + } + private static float SetDriveSpeedForWaypoint() { float speed; From 3d62a54d36438eceb826720cda204052b803302c Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 23 Aug 2020 15:44:04 -0600 Subject: [PATCH 030/276] Updated waypoint Collector field name to IsCollector --- SceneManager/DebugGraphics.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/DebugGraphics.cs b/SceneManager/DebugGraphics.cs index dbd1d4d..3eacd3b 100644 --- a/SceneManager/DebugGraphics.cs +++ b/SceneManager/DebugGraphics.cs @@ -37,7 +37,7 @@ namespace SceneManager public static void DrawSpheresAtWaypoints(Path path, int i) { - if (path.Waypoints[i].Collector) + if (path.Waypoints[i].IsCollector) { Debug.DrawSphere(path.Waypoints[i].Position, path.Waypoints[i].CollectorRadius, Color.FromArgb(80, Color.Blue)); } From 5e73f8979235bfe8b7c8af276b7182739260a026 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 23 Aug 2020 15:44:30 -0600 Subject: [PATCH 031/276] Refactored waypoint task assignment code --- SceneManager/TrafficPathing.cs | 206 ++++++++++++--------------------- 1 file changed, 76 insertions(+), 130 deletions(-) diff --git a/SceneManager/TrafficPathing.cs b/SceneManager/TrafficPathing.cs index 119576c..e5abe8e 100644 --- a/SceneManager/TrafficPathing.cs +++ b/SceneManager/TrafficPathing.cs @@ -9,53 +9,65 @@ namespace SceneManager { public static Dictionary collectedVehicles = new Dictionary(); - public static void WaypointVehicleCollector(List paths, Path path, Waypoint waypoint) + public static void StartCollectingAtWaypoint(List paths, Path path, Waypoint waypoint) { - //GameFiber AssignStopForVehiclesFlagFiber = new GameFiber(() => AssignStopForVehiclesFlag(paths, path, waypointData)); - //AssignStopForVehiclesFlagFiber.Start(); + GameFiber AssignStopFlagForVehiclesFiber = new GameFiber(() => AssignStopForVehiclesFlag(paths, path, waypoint)); + AssignStopFlagForVehiclesFiber.Start(); while (paths.Contains(path) && path.Waypoints.Contains(waypoint)) { - if (!path.PathDisabled && waypoint.Collector) + if (path.IsEnabled && waypoint.IsCollector) { - foreach (Vehicle v in GetNearbyVehicles(waypoint.Position, waypoint.CollectorRadius).Where(v => v.IsValidForCollection())) - { - v.IsPersistent = true; - v.Driver.IsPersistent = true; - v.Driver.BlockPermanentEvents = true; - v.Driver.Tasks.Clear(); - - // If the vehicle is not in the collection yet - if (!collectedVehicles.ContainsKey(v.LicensePlate)) - { - var collectedVehicle = new CollectedVehicle(v, v.LicensePlate, path.PathNum, path.Waypoints.Count, waypoint.Number, true, false, false); - collectedVehicles.Add(v.LicensePlate, collectedVehicle); - Game.LogTrivial($"[WaypointVehicleCollector] Added {v.Model.Name} to collection from path {path.PathNum}, waypoint {waypoint.Number}."); - - GameFiber DismissCheckFiber = new GameFiber(() => VehicleDismissed(collectedVehicle, path.Waypoints)); - DismissCheckFiber.Start(); - - AssignTasks(collectedVehicle, path.Waypoints, waypoint); - } - // If the vehicle is in the collection, but has no tasks - else if (collectedVehicles.ContainsKey(v.LicensePlate) && !collectedVehicles[v.LicensePlate].TasksAssigned) - { - Game.LogTrivial($"[WaypointVehicleCollector] {v.Model.Name} already in collection, but with no tasks. Assigning tasks."); - collectedVehicles[v.LicensePlate].SetTasksAssigned(true); - - AssignTasks(collectedVehicles[v.LicensePlate], path.Waypoints, waypoint); - } - // If the vehicle is in the collection and has tasks - else - { - Game.LogTrivial($"[WaypointVehicleCollector]: {v.Model.Name} was not collected because it's already in the collection and has tasks."); - } - } + LoopForNearbyValidVehicles(path, waypoint); } GameFiber.Sleep(100); } } + private static void LoopForNearbyValidVehicles(Path path, Waypoint waypoint) + { + foreach (Vehicle vehicle in GetNearbyVehicles(waypoint.Position, waypoint.CollectorRadius).Where(v => v.IsValidForCollection())) + { + // If the vehicle is not in the collection yet + if (!collectedVehicles.ContainsKey(vehicle.LicensePlate)) + { + SetVehicleAndDriverPersistence(vehicle); + CollectedVehicle newCollectedVehicle = AddVehicleToCollection(path, waypoint, vehicle); + Game.LogTrivial($"[WaypointVehicleCollector] Added {vehicle.Model.Name} to collection."); + //GameFiber DismissCheckFiber = new GameFiber(() => VehicleDismissed(collectedVehicle, path.Waypoints)); + //DismissCheckFiber.Start(); + + GameFiber AssignTasksFiber = new GameFiber(() => AssignWaypointTasks(newCollectedVehicle, path.Waypoints, waypoint)); + AssignTasksFiber.Start(); + } + // If the vehicle is in the collection, but has no tasks + else if (collectedVehicles.ContainsKey(vehicle.LicensePlate) && !collectedVehicles[vehicle.LicensePlate].TasksAssigned) + { + Game.LogTrivial($"[WaypointVehicleCollector] {vehicle.Model.Name} already in collection, but with no tasks. Assigning tasks."); + collectedVehicles[vehicle.LicensePlate].SetTasksAssigned(true); + + GameFiber AssignTasksFiber = new GameFiber(() => AssignWaypointTasks(collectedVehicles[vehicle.LicensePlate], path.Waypoints, waypoint)); + AssignTasksFiber.Start(); + } + } + } + + private static CollectedVehicle AddVehicleToCollection(Path path, Waypoint waypoint, Vehicle v) + { + var collectedVehicle = new CollectedVehicle(v, v.LicensePlate, path.PathNum, path.Waypoints.Count, waypoint.Number, true, false, false); + collectedVehicles.Add(v.LicensePlate, collectedVehicle); + Game.LogTrivial($"[WaypointVehicleCollector] Added {v.Model.Name} to collection from path {path.PathNum}, waypoint {waypoint.Number}."); + return collectedVehicle; + } + + private static void SetVehicleAndDriverPersistence(Vehicle v) + { + v.IsPersistent = true; + v.Driver.IsPersistent = true; + v.Driver.BlockPermanentEvents = true; + v.Driver.Tasks.Clear(); + } + private static bool IsValidForCollection(this Vehicle v) { if (v && v.HasDriver && v.Driver && v.Driver.IsAlive && v != Game.LocalPlayer.Character.CurrentVehicle && (v.IsCar || v.IsBike || v.IsBicycle || v.IsQuadBike || (v.HasSiren && !v.IsSirenOn))) @@ -68,107 +80,41 @@ namespace SceneManager } } - private static void AssignTasks(CollectedVehicle collectedVehicle, List waypointData, Waypoint waypoint) + private static void AssignWaypointTasks(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) { - if (waypointData.Count == 1) - { - GameFiber AssignSingleTaskFiber = new GameFiber(() => AssignSingleWaypointTask(collectedVehicle, waypointData)); - AssignSingleTaskFiber.Start(); - } - else if (waypointData.Count > 1) - { - GameFiber AssignMultiTaskFiber = new GameFiber(() => AssignMultiWaypointTasks(collectedVehicle, waypointData, waypoint)); - AssignMultiTaskFiber.Start(); - } - } + var vehicle = collectedVehicle.Vehicle; + var driver = vehicle.Driver; - // TODO: Combine single and multiwaypoint tasks into one method - private static void AssignSingleWaypointTask(CollectedVehicle cv, List waypointData) - { - // Give driver a task to the single path waypoint. Run a loop with a condition checking for DismissNow for cases where the driver is dismissed or redirected - Game.LogTrivial($"Assigning task for single waypoint."); - cv.Vehicle.Driver.Tasks.DriveToPosition(waypointData[0].Position, waypointData[0].Speed, (VehicleDrivingFlags)262539, 1f); - //SetDriveTaskDrivingFlags(cv.Vehicle.Driver, EDrivingFlags.TotalControl); - while (waypointData.ElementAtOrDefault(0) != null && cv.Vehicle && cv.Vehicle.Driver && cv.Vehicle.DistanceTo(waypointData[0].Position) > 3f && !cv.DismissNow) + if (currentWaypoint != null && currentWaypoint.DrivingFlag == VehicleDrivingFlags.StopAtDestination) { - GameFiber.Sleep(1000); + Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} stopping at waypoint."); + collectedVehicle.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); + collectedVehicle.SetStoppedAtWaypoint(true); } - if (cv.DismissNow) + for (int i = currentWaypoint.Number; i < waypoints.Count; i++) { - Game.LogTrivial($"{cv.Vehicle.Model.Name} dismissed while in AssignSingleWaypointTask."); - } - else - { - Game.LogTrivial($"{cv.Vehicle.Model.Name} should be stopped at the waypoint."); - cv.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking);//.WaitForCompletion(); - cv.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.Wait); - cv.SetStoppedAtWaypoint(true); - } - } - - private static void AssignMultiWaypointTasks(CollectedVehicle cv, List waypoints, Waypoint collectorWaypoint) - { - // For each waypoint in the path, give driver a task to that waypoint - // i needs to be the index of the waypoint the vehicle was collected from - for (int i = waypoints.IndexOf(collectorWaypoint); i < waypoints.Count; i++) - //for (int i = 1; i < waypointData.Count; i++) - { - if (!cv.DismissNow) + if (waypoints.ElementAtOrDefault(i) == null) { - cv.SetCurrentWaypoint(waypoints[i].Number); - var nextWaypoint = i + 1; - Game.LogTrivial($"Assigning task to {cv.Vehicle.Model.Name} from waypoint {collectorWaypoint.Number} of {waypoints.Count}"); - - if (cv.Vehicle && cv.Vehicle.Driver && waypoints.ElementAtOrDefault(nextWaypoint) != null && waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) - { - // Give driver a task to the waypoint. Run a loop with a condition checking for DismissNow for cases where the driver is dismissed or redirected - SetDriveTaskDrivingFlags(cv.Vehicle.Driver, EDrivingFlags.TotalControl); - if (waypoints[nextWaypoint] != null) - { - //Game.LogTrivial($"Driving to stop waypoint"); - cv.Vehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)262539, 1f); - } - else - { - Game.LogTrivial($"i is out of bounds for assigning task"); - } - - while (cv.Vehicle && cv.Vehicle.Driver && waypoints.ElementAtOrDefault(nextWaypoint) != null && cv.Vehicle.DistanceTo(waypoints[nextWaypoint].Position) > 3f && !cv.DismissNow) - { - GameFiber.Sleep(100); - } - - if (waypoints.ElementAtOrDefault(i) != null && !cv.DismissNow) - { - Game.LogTrivial($"{cv.Vehicle.Model.Name} stopping at stop waypoint"); - cv.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); - cv.SetStoppedAtWaypoint(true); - } - } - else if (cv.Vehicle && cv.Vehicle.Driver && waypoints.ElementAtOrDefault(nextWaypoint) != null && !cv.DismissNow) - { - cv.Vehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)262539, 1f).WaitForCompletion(); - } - Game.LogTrivial($"{cv.Vehicle.Model.Name} waypoint {nextWaypoint} task complete"); - } - else - { - Game.LogTrivial($"{cv.Vehicle.Model.Name} was dismissed while in AssignMultiWaypointTasks"); + Game.LogTrivial($"Waypoint is null"); break; } - } - if (cv.Redirected) - { - Game.LogTrivial($"{cv.Vehicle.Model.Name} was redirected, all old path tasks have been cleared."); - } - else - { - Game.LogTrivial($"{cv.Vehicle.Model.Name} all path {cv.Path} tasks complete."); - } + Game.LogTrivial($"{vehicle.Model.Name} is driving to waypoint {waypoints[i].Number}"); + if (waypoints.ElementAtOrDefault(i) != null && !collectedVehicle.StoppedAtWaypoint) + { + collectedVehicle.Vehicle.Driver.Tasks.DriveToPosition(waypoints[i].Position, waypoints[i].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + } - DismissDriver(cv); + if (waypoints.ElementAtOrDefault(i) != null && waypoints[i].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} stopping at waypoint."); + collectedVehicle.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); + collectedVehicle.SetStoppedAtWaypoint(true); + } + } + Game.LogTrivial($"{vehicle.Model.Name} all tasks complete."); + DismissDriver(collectedVehicle); } private static void DismissDriver(CollectedVehicle cv) @@ -201,7 +147,7 @@ namespace SceneManager { while (paths.Contains(path) && path.Waypoints.Contains(waypointData)) { - if (!path.PathDisabled) + if (path.IsEnabled) { foreach (Vehicle v in GetNearbyVehicles(waypointData.Position, 50f).Where(v => v && v.HasDriver && v.Driver)) { @@ -249,7 +195,7 @@ namespace SceneManager Game.LogTrivial($"Looping to ensure the vehicle is far enough away from all attractor waypoints so it can be removed from the collection."); while (true) { - var collectorWaypoints = waypointData.Where(wp => wp.Collector); + var collectorWaypoints = waypointData.Where(wp => wp.IsCollector); var vehicleFarEnoughAwayFromCollectors = collectorWaypoints.All(wp => cv.Vehicle.DistanceTo(wp.Position) > wp.CollectorRadius); if (collectedVehicles.ContainsKey(cv.LicensePlate) && vehicleFarEnoughAwayFromCollectors) @@ -290,7 +236,7 @@ namespace SceneManager IgnoreRoads = 4194304, IgnorePathfinding = 16777216, AvoidHighways = 536870912, - Normal = StopForVehicles | StopForPeds | AvoidEmptyVehicles | StopForTrafficLights | UseBlinkers, + Normal = StopForVehicles | StopForPeds | AvoidEmptyVehicles | StopForTrafficLights | UseBlinkers | AllowWrongWay | IgnoreRoads, TotalControl = AllowWrongWay | AvoidObjects | AvoidPeds | TakeShortestPath | StopForTrafficLights | IgnorePathfinding | StopForVehicles } From c60fc5c032fa0e79523980f551d810d8d60bab76 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 24 Aug 2020 07:07:32 -0600 Subject: [PATCH 032/276] Changed foreground color of menu options user can select --- SceneManager/Menus/EditPathMenu.cs | 2 ++ SceneManager/Menus/EditWaypointMenu.cs | 5 +++++ SceneManager/Menus/PathMainMenu.cs | 9 +++++++++ 3 files changed, 16 insertions(+) diff --git a/SceneManager/Menus/EditPathMenu.cs b/SceneManager/Menus/EditPathMenu.cs index 1dcbd2f..c77d245 100644 --- a/SceneManager/Menus/EditPathMenu.cs +++ b/SceneManager/Menus/EditPathMenu.cs @@ -22,7 +22,9 @@ namespace SceneManager { editPathMenu.AddItem(togglePath = new UIMenuCheckboxItem("Disable Path", false)); editPathMenu.AddItem(editPathWaypoints = new UIMenuItem("Edit Waypoints")); + editPathWaypoints.ForeColor = Color.Gold; editPathMenu.AddItem(deletePath = new UIMenuItem("Delete Path")); + deletePath.ForeColor = Color.Gold; editPathMenu.RefreshIndex(); editPathMenu.OnItemSelect += EditPath_OnItemSelected; diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 8f0350f..02f06b9 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -54,7 +55,9 @@ namespace SceneManager editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListItem("Change Collection Radius", collectorRadii, collectorRadii.IndexOf(currentPath.Waypoints[editWaypoint.Index].CollectorRadius))); editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); + editUpdateWaypoint.ForeColor = Color.Gold; editWaypointMenu.AddItem(editRemoveWaypoint = new UIMenuItem("Remove Waypoint")); + editRemoveWaypoint.ForeColor = Color.Gold; EditPathMenu.editPathMenu.Visible = false; editWaypointMenu.RefreshIndex(); @@ -83,7 +86,9 @@ namespace SceneManager editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListItem("Change Collection Radius", collectorRadii, collectorRadii.IndexOf(currentPath.Waypoints[editWaypoint.Index].CollectorRadius))); editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); + editUpdateWaypoint.ForeColor = Color.Gold; editWaypointMenu.AddItem(editRemoveWaypoint = new UIMenuItem("Remove Waypoint")); + editRemoveWaypoint.ForeColor = Color.Gold; editWaypointMenu.RefreshIndex(); } } diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index 3a15957..772cbc6 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -41,11 +41,16 @@ namespace SceneManager pathMainMenu.Clear(); pathMainMenu.AddItem(createNewPath = new UIMenuItem("Create New Path")); + createNewPath.ForeColor = Color.Gold; pathMainMenu.AddItem(editPath = new UIMenuListScrollerItem("Edit Path", "", pathsNum)); + editPath.ForeColor = Color.Gold; pathMainMenu.AddItem(disableAllPaths = new UIMenuCheckboxItem("Disable All Paths", false)); pathMainMenu.AddItem(deleteAllPaths = new UIMenuItem("Delete All Paths")); + deleteAllPaths.ForeColor = Color.Gold; pathMainMenu.AddItem(directDriver = new UIMenuListScrollerItem("Direct nearest driver to path", "", pathsNum)); + directDriver.ForeColor = Color.Gold; pathMainMenu.AddItem(dismissDriver = new UIMenuListScrollerItem("Dismiss nearest driver", "", dismissOptions)); + dismissDriver.ForeColor = Color.Gold; if (paths.Count == 8) { @@ -82,9 +87,13 @@ namespace SceneManager trafficRemoveWaypoint.Enabled = true; pathMainMenu.Clear(); pathMainMenu.AddItem(createNewPath = new UIMenuItem("Continue Creating Current Path")); + createNewPath.ForeColor = Color.Gold; pathMainMenu.AddItem(deleteAllPaths = new UIMenuItem("Delete All Paths")); + deleteAllPaths.ForeColor = Color.Gold; pathMainMenu.AddItem(directDriver = new UIMenuListScrollerItem("Direct nearest driver to path", "")); + directDriver.ForeColor = Color.Gold; pathMainMenu.AddItem(dismissDriver = new UIMenuListScrollerItem("Dismiss nearest driver", "")); + dismissDriver.ForeColor = Color.Gold; if (GetPaths().Count == 8) { From 0c2f9134da77844251beef9670db5080bc83b83a Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 24 Aug 2020 09:12:28 -0600 Subject: [PATCH 033/276] Fixed world speedzone not updating correctly when waypoint is updated --- SceneManager/Object Classes/Waypoint.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index b543063..bea5daa 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -61,6 +61,7 @@ namespace SceneManager if (collectorWaypointChecked) { IsCollector = true; + World.RemoveSpeedZone(YieldZone); YieldZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, drivingSpeed); if (CollectorRadiusBlip) { From 4857ce20958312efb390625f1d81381e972b1341 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 24 Aug 2020 09:13:34 -0600 Subject: [PATCH 034/276] Renamed local variables --- SceneManager/Menus/PathMainMenu.cs | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index 772cbc6..f60b559 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -82,9 +82,9 @@ namespace SceneManager pathsNum.Insert(indexToInsertAt, pathNum); } - public static void RefreshMenu(UIMenuItem trafficRemoveWaypoint) + public static void RefreshMenu() { - trafficRemoveWaypoint.Enabled = true; + //trafficRemoveWaypoint.Enabled = true; pathMainMenu.Clear(); pathMainMenu.AddItem(createNewPath = new UIMenuItem("Continue Creating Current Path")); createNewPath.ForeColor = Color.Gold; @@ -157,19 +157,19 @@ namespace SceneManager // Remove the speed zone so cars don't continue to be affected after the path is deleted Game.LogTrivial($"Removing yield zone and waypoint blips"); - foreach (Waypoint wp in path.Waypoints) + foreach (Waypoint waypoint in path.Waypoints) { - if (wp.YieldZone != 0) + if (waypoint.YieldZone != 0) { - World.RemoveSpeedZone(wp.YieldZone); + World.RemoveSpeedZone(waypoint.YieldZone); } - if (wp.Blip) + if (waypoint.Blip) { - wp.Blip.Delete(); + waypoint.Blip.Delete(); } - if (wp.CollectorRadiusBlip) + if (waypoint.CollectorRadiusBlip) { - wp.CollectorRadiusBlip.Delete(); + waypoint.CollectorRadiusBlip.Delete(); } } @@ -196,6 +196,7 @@ namespace SceneManager { if (selectedItem == createNewPath) { + RefreshMenu(); pathMainMenu.Visible = false; PathCreationMenu.pathCreationMenu.Visible = true; @@ -244,9 +245,9 @@ namespace SceneManager } foreach (Path path in paths) { - foreach(Waypoint wp in path.Waypoints.Where(wp => wp.YieldZone != 0)) + foreach(Waypoint waypoint in path.Waypoints.Where(wp => wp.YieldZone != 0)) { - World.RemoveSpeedZone(wp.YieldZone); + World.RemoveSpeedZone(waypoint.YieldZone); } path.Waypoints.Clear(); } From f75e4f299e695a365241499441bcaeb75f800c67 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 24 Aug 2020 09:14:40 -0600 Subject: [PATCH 035/276] Removed unused using statement --- SceneManager/Object Classes/Waypoint.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index bea5daa..793a830 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -1,5 +1,4 @@ using Rage; -using System.Runtime.InteropServices; namespace SceneManager { From 71f598f0da67d9037848362c62b1cb642840e555 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 24 Aug 2020 09:16:30 -0600 Subject: [PATCH 036/276] Removed unused using statements, renamed local variables, fixed some menu options being enabled when they shouldn't be --- SceneManager/Menus/PathCreationMenu.cs | 30 ++++++++++++-------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 182bfd6..462b9f0 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -1,9 +1,6 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Drawing; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Rage; using RAGENativeUI; using RAGENativeUI.Elements; @@ -35,7 +32,7 @@ namespace SceneManager { pathCreationMenu.AddItem(waypointType = new UIMenuListScrollerItem("Waypoint Type", "", waypointTypes)); pathCreationMenu.AddItem(waypointSpeed = new UIMenuListScrollerItem($"Waypoint Speed (in {SettingsMenu.speedUnits.SelectedItem})", "", waypointSpeeds)); - pathCreationMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector", true)); // true if path's first waypoint + pathCreationMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector", true)); pathCreationMenu.AddItem(collectorRadius = new UIMenuListScrollerItem("Collection Radius", "", collectorRadii)); pathCreationMenu.AddItem(trafficAddWaypoint = new UIMenuItem("Add waypoint")); trafficAddWaypoint.ForeColor = Color.Gold; @@ -48,10 +45,10 @@ namespace SceneManager pathCreationMenu.RefreshIndex(); pathCreationMenu.OnItemSelect += PathCreation_OnItemSelected; - pathCreationMenu.OnCheckboxChange += PathCreation_OnCheckboxChange; + pathCreationMenu.OnCheckboxChange += PathCreation_OnCheckboxChanged; } - private static void PathCreation_OnCheckboxChange(UIMenu sender, UIMenuCheckboxItem checkboxItem, bool @checked) + private static void PathCreation_OnCheckboxChanged(UIMenu sender, UIMenuCheckboxItem checkboxItem, bool @checked) { if(checkboxItem == collectorWaypoint) { @@ -83,12 +80,13 @@ namespace SceneManager { PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip)); } + Game.LogTrivial($"[Path {currentPath}] Waypoint {currentWaypoint} ({drivingFlag.ToString()}) added"); ToggleTrafficEndPathMenuItem(pathIndex); - + trafficRemoveWaypoint.Enabled = true; // Refresh the trafficMenu after a waypoint is added in order to show Continue Creating Current Path instead of Create New Path - PathMainMenu.RefreshMenu(trafficRemoveWaypoint); + PathMainMenu.RefreshMenu(); } if (selectedItem == trafficRemoveWaypoint) @@ -180,7 +178,6 @@ namespace SceneManager } } } - // "Refresh" the menu to reflect the new path //TrafficMenu.RebuildTrafficMenu(); } @@ -200,21 +197,21 @@ namespace SceneManager private static float SetDriveSpeedForWaypoint() { - float speed; + float convertedSpeed; if (SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH) { //Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); - speed = MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index]); - //Game.LogTrivial($"Converted speed: {speed}m/s"); + convertedSpeed = MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index]); + //Game.LogTrivial($"Converted speed: {convertedSpeed}m/s"); } else { //Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); - speed = MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index]); - //Game.LogTrivial($"Converted speed: {speed}m/s"); + convertedSpeed = MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index]); + //Game.LogTrivial($"Converted speed: {convertedSpeed}m/s"); } - return speed; + return convertedSpeed; } private static Blip CreateWaypointBlip(int pathIndex) @@ -245,6 +242,7 @@ namespace SceneManager Game.DisplayNotification($"~o~Scene Manager\n~y~[Creating]~w~ Path {pathNum} started."); paths.Insert(pathIndex, new Path(pathNum, false)); trafficRemoveWaypoint.Enabled = false; + trafficEndPath.Enabled = false; } //private static void RefreshPathMainMenu() From c961bdc6fcc16e7df899e6ee81df49e63376c6eb Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 24 Aug 2020 09:17:13 -0600 Subject: [PATCH 037/276] Refactored RNUI elements --- SceneManager/Menus/EditWaypointMenu.cs | 83 ++++++++++++++++---------- 1 file changed, 50 insertions(+), 33 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 02f06b9..46be7dc 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -2,8 +2,6 @@ using System.Collections.Generic; using System.Drawing; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Rage; using RAGENativeUI; using RAGENativeUI.Elements; @@ -12,16 +10,18 @@ namespace SceneManager { class EditWaypointMenu { - #pragma warning disable CS0618 // Type or member is obsolete, clear NUI squiggles public static UIMenu editWaypointMenu { get; private set; } - private static UIMenuItem editUpdateWaypoint, editRemoveWaypoint; - private static UIMenuListItem editWaypoint, changeWaypointType, changeWaypointSpeed, changeCollectorRadius; + public static UIMenuItem editUpdateWaypoint { get; private set; } + public static UIMenuItem editRemoveWaypoint { get; private set; } + public static UIMenuNumericScrollerItem editWaypoint; + public static UIMenuListScrollerItem changeWaypointType; + public static UIMenuListScrollerItem changeWaypointSpeed; + public static UIMenuListScrollerItem changeCollectorRadius; private static UIMenuCheckboxItem collectorWaypoint, updateWaypointPosition; - private static List pathWaypoints = new List() { }; - private static List waypointSpeeds = new List() { 5f, 10f, 15f, 20f, 30f, 40f, 50f, 60f, 70f }; - private static List waypointTypes = new List() { "Drive To", "Stop" }; - private static List collectorRadii = new List() { 3f, 5f, 10f, 15f, 20f, 30f, 40f, 50f }; + private static List pathWaypoints = new List() { }; + private static float[] waypointSpeeds = new float[] { 5f, 10f, 15f, 20f, 30f, 40f, 50f, 60f, 70f }; + private static float[] collectorRadii = new float[] { 3f, 5f, 10f, 15f, 20f, 30f, 40f, 50f }; private static VehicleDrivingFlags[] drivingFlags = new VehicleDrivingFlags[] { VehicleDrivingFlags.Normal, VehicleDrivingFlags.StopAtDestination }; internal static void InstantiateMenu() @@ -35,24 +35,31 @@ namespace SceneManager { // Need to unsubscribe from these or else there will be duplicate firings if the user left the menu, then re-entered editWaypointMenu.OnItemSelect -= EditWaypoint_OnItemSelected; - editWaypointMenu.OnListChange -= EditWaypoint_OnListChanged; + editWaypointMenu.OnCheckboxChange -= EditWaypoint_OnCheckboxChanged; + editWaypointMenu.OnScrollerChange -= EditWaypoint_OnScrollerChanged; - //var currentPath = PathMainMenu.paths[PathMainMenu.editPath.Index]; var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index]; // Populating menu list so user can select which waypoint to edit by index - pathWaypoints.Clear(); - for (int i = 0; i < currentPath.Waypoints.Count; i++) - { - pathWaypoints.Add(i + 1); - } - + //pathWaypoints.Clear(); + //for (int i = 0; i < currentPath.Waypoints.Count; i++) + //{ + // pathWaypoints.Add(i+1); + //} + editWaypoint = new UIMenuNumericScrollerItem("Edit Waypoint", "", PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints.First().Number, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints.Last().Number, 1); + Game.LogTrivial($"First waypoint number: {PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints.First().Number}"); + Game.LogTrivial($"Last waypoint number: {PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints.Last().Number}"); editWaypointMenu.Clear(); - editWaypointMenu.AddItem(editWaypoint = new UIMenuListItem("Edit Waypoint", pathWaypoints, 0)); - editWaypointMenu.AddItem(changeWaypointType = new UIMenuListItem("Change Waypoint Type", waypointTypes, Array.IndexOf(drivingFlags, currentPath.Waypoints[editWaypoint.Index].DrivingFlag))); - editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuListItem("Change Waypoint Speed", waypointSpeeds, waypointSpeeds.IndexOf(currentPath.Waypoints[editWaypoint.Index].Speed))); + editWaypointMenu.AddItem(editWaypoint); + editWaypoint.Index = 0; + + editWaypointMenu.AddItem(changeWaypointType = new UIMenuListScrollerItem("Change Waypoint Type", "", new [] { "Drive To", "Stop" })); + changeWaypointType.Index = Array.IndexOf(drivingFlags, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].DrivingFlag); + editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuListScrollerItem("Change Waypoint Speed", "", waypointSpeeds)); + changeWaypointSpeed.Index = Array.IndexOf(waypointSpeeds, MathHelper.ConvertMetersPerSecondToMilesPerHour(PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed)); editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector Waypoint", PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].IsCollector)); - editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListItem("Change Collection Radius", collectorRadii, collectorRadii.IndexOf(currentPath.Waypoints[editWaypoint.Index].CollectorRadius))); + editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListScrollerItem("Change Collection Radius", "", collectorRadii)); + changeCollectorRadius.Index = Array.IndexOf(collectorRadii, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].CollectorRadius); editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); editUpdateWaypoint.ForeColor = Color.Gold; @@ -63,16 +70,14 @@ namespace SceneManager editWaypointMenu.RefreshIndex(); editWaypointMenu.Visible = true; + editWaypointMenu.OnScrollerChange += EditWaypoint_OnScrollerChanged; + editWaypointMenu.OnCheckboxChange += EditWaypoint_OnCheckboxChanged; editWaypointMenu.OnItemSelect += EditWaypoint_OnItemSelected; - editWaypointMenu.OnListChange += EditWaypoint_OnListChanged; } - private static void EditWaypoint_OnListChanged(UIMenu sender, UIMenuListItem listItem, int index) + private static void EditWaypoint_OnScrollerChanged(UIMenu sender, UIMenuScrollerItem scrollerItem, int first, int last) { - var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index]; - var currentWaypoint = currentPath.Waypoints[editWaypoint.Index]; - - if (listItem == editWaypoint) + if(scrollerItem == editWaypoint) { while (editWaypointMenu.MenuItems.Count > 1) { @@ -80,16 +85,27 @@ namespace SceneManager GameFiber.Yield(); } - editWaypointMenu.AddItem(changeWaypointType = new UIMenuListItem("Change Waypoint Type", waypointTypes, Array.IndexOf(drivingFlags, currentWaypoint.DrivingFlag))); - editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuListItem("Change Waypoint Speed", waypointSpeeds, waypointSpeeds.IndexOf(currentWaypoint.Speed))); - editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Attractor Waypoint", currentWaypoint.IsCollector)); - editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListItem("Change Collection Radius", collectorRadii, collectorRadii.IndexOf(currentPath.Waypoints[editWaypoint.Index].CollectorRadius))); + editWaypointMenu.AddItem(changeWaypointType = new UIMenuListScrollerItem("Change Waypoint Type", "", new[] { "Drive To", "Stop" })); + changeWaypointType.Index = Array.IndexOf(drivingFlags, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].DrivingFlag); + editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuListScrollerItem("Change Waypoint Speed", "", waypointSpeeds)); + changeWaypointSpeed.Index = Array.IndexOf(waypointSpeeds, MathHelper.ConvertMetersPerSecondToMilesPerHour(PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed)); + editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector Waypoint", PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].IsCollector)); + editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListScrollerItem("Change Collection Radius", "", collectorRadii)); + changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); editUpdateWaypoint.ForeColor = Color.Gold; editWaypointMenu.AddItem(editRemoveWaypoint = new UIMenuItem("Remove Waypoint")); editRemoveWaypoint.ForeColor = Color.Gold; - editWaypointMenu.RefreshIndex(); + //editWaypointMenu.RefreshIndex(); + } + } + + private static void EditWaypoint_OnCheckboxChanged(UIMenu sender, UIMenuCheckboxItem checkboxItem, bool @checked) + { + if (checkboxItem == collectorWaypoint) + { + changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; } } @@ -100,7 +116,8 @@ namespace SceneManager if (selectedItem == editUpdateWaypoint) { - currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], waypointSpeeds[changeWaypointSpeed.Index], collectorWaypoint.Checked, collectorRadii[changeCollectorRadius.Index], updateWaypointPosition.Checked); + currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], changeWaypointSpeed.SelectedItem, collectorWaypoint.Checked, changeCollectorRadius.SelectedItem, updateWaypointPosition.Checked); + //currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], waypointSpeeds[changeWaypointSpeed.Index], collectorWaypoint.Checked, collectorRadii[changeCollectorRadius.Index], updateWaypointPosition.Checked); Game.LogTrivial($"Updated path {currentPath.PathNum} waypoint {currentWaypoint.Number}: Driving flag is {drivingFlags[changeWaypointType.Index].ToString()}, speed is {waypointSpeeds[changeWaypointSpeed.Index].ToString()}, collector is {currentWaypoint.IsCollector}"); if (currentPath.Waypoints.Count < 2 && currentPath.Waypoints[0].DrivingFlag == VehicleDrivingFlags.StopAtDestination) From bee2d44c4aeec7a82faf41004f94b0c5fe2981f2 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 24 Aug 2020 10:11:35 -0600 Subject: [PATCH 038/276] Removed RefreshMenu method, replaced with changing createNewPath.Text value --- SceneManager/Menus/PathMainMenu.cs | 36 ++++-------------------------- 1 file changed, 4 insertions(+), 32 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index f60b559..bd9a0b8 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -10,7 +10,8 @@ namespace SceneManager static class PathMainMenu { public static UIMenu pathMainMenu { get; private set; } - private static UIMenuItem createNewPath, deleteAllPaths; + public static UIMenuItem createNewPath { get; private set; } + private static UIMenuItem deleteAllPaths; public static UIMenuListScrollerItem editPath { get; private set; } public static UIMenuListScrollerItem directDriver { get; private set; } public static UIMenuListScrollerItem dismissDriver { get; private set; } @@ -82,32 +83,6 @@ namespace SceneManager pathsNum.Insert(indexToInsertAt, pathNum); } - public static void RefreshMenu() - { - //trafficRemoveWaypoint.Enabled = true; - pathMainMenu.Clear(); - pathMainMenu.AddItem(createNewPath = new UIMenuItem("Continue Creating Current Path")); - createNewPath.ForeColor = Color.Gold; - pathMainMenu.AddItem(deleteAllPaths = new UIMenuItem("Delete All Paths")); - deleteAllPaths.ForeColor = Color.Gold; - pathMainMenu.AddItem(directDriver = new UIMenuListScrollerItem("Direct nearest driver to path", "")); - directDriver.ForeColor = Color.Gold; - pathMainMenu.AddItem(dismissDriver = new UIMenuListScrollerItem("Dismiss nearest driver", "")); - dismissDriver.ForeColor = Color.Gold; - - if (GetPaths().Count == 8) - { - createNewPath.Enabled = false; - } - if (GetPaths().Count == 0) - { - editPath.Enabled = false; - deleteAllPaths.Enabled = false; - disableAllPaths.Enabled = false; - directDriver.Enabled = false; - } - } - private static bool VehicleAndDriverValid(this Vehicle v) { if (v && v.HasDriver && v.Driver && v.Driver.IsAlive) @@ -196,7 +171,7 @@ namespace SceneManager { if (selectedItem == createNewPath) { - RefreshMenu(); + createNewPath.Text = "Continue Creating Current Path"; pathMainMenu.Visible = false; PathCreationMenu.pathCreationMenu.Visible = true; @@ -212,11 +187,8 @@ namespace SceneManager } else if (paths.ElementAtOrDefault(i) == null) { + // Do we only want to do this once the first waypoint is added? PathCreationMenu.AddNewPathToPathsCollection(paths, i); - //Game.LogTrivial($"Creating path {i + 1}"); - //Game.DisplayNotification($"~o~Scene Manager\n~y~[Creating]~w~ Path {i + 1} started."); - //paths.Insert(i, new Path(i + 1, false)); - //PathCreationMenu.trafficRemoveWaypoint.Enabled = false; if (SettingsMenu.debugGraphics.Checked) { From 2d08f9e2b558af702ae7901f154bdab67b85a039 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 24 Aug 2020 10:12:24 -0600 Subject: [PATCH 039/276] Changed selectable menu item text color to Gold. Updated rotation step to 10 --- SceneManager/Menus/BarrierMenu.cs | 36 ++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index 896d6d1..e528091 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -17,7 +18,7 @@ namespace SceneManager // TODO: Refactor as dictionary private static UIMenuListScrollerItem barrierList = new UIMenuListScrollerItem("Select Barrier", "", new[] { "Large Striped Cone", "Large Cone", "Medium Striped Cone", "Medium Cone", "Roadpole A", "Roadpole B", "Police Barrier", "Road Barrier", "Flare" }); private static string[] barrierObjectNames = new string[] { "prop_mp_cone_01", "prop_roadcone01c", "prop_mp_cone_02", "prop_mp_cone_03", "prop_roadpole_01a", "prop_roadpole_01b", "prop_barrier_work05", "prop_barrier_work06a", "prop_flare_01b" }; - private static UIMenuNumericScrollerItem rotateBarrier = new UIMenuNumericScrollerItem("Rotate Barrier", "Rotate the barrier.", 0, 359, 10); + private static UIMenuNumericScrollerItem rotateBarrier = new UIMenuNumericScrollerItem("Rotate Barrier", "Rotate the barrier.", 0, 350, 10); private static UIMenuListScrollerItem removeBarrierOptions = new UIMenuListScrollerItem("Remove Barrier", "", new[] { "Last Barrier", "Nearest Barrier", "All Barriers" }); public static Rage.Object shadowBarrier; @@ -31,9 +32,14 @@ namespace SceneManager public static void BuildBarrierMenu() { barrierMenu.AddItem(removeBarrierOptions, 0); + removeBarrierOptions.ForeColor = Color.Gold; removeBarrierOptions.Enabled = false; + barrierMenu.AddItem(rotateBarrier, 0); + barrierMenu.AddItem(barrierList, 0); + barrierList.ForeColor = Color.Gold; + barrierMenu.RefreshIndex(); barrierMenu.OnItemSelect += BarrierMenu_OnItemSelected; @@ -78,7 +84,7 @@ namespace SceneManager DisableBarrierMenuOptionsIfShadowConeTooFar(); shadowBarrier.Position = TracePlayerView(15, TraceFlags.IntersectEverything).HitPosition; Rage.Native.NativeFunction.Natives.PLACE_OBJECT_ON_GROUND_PROPERLY(shadowBarrier); - shadowBarrier.Heading = rotateBarrier.Index; + shadowBarrier.Heading = rotateBarrier.Value; void DisableBarrierMenuOptionsIfShadowConeTooFar() { @@ -87,6 +93,11 @@ namespace SceneManager barrierList.Enabled = false; rotateBarrier.Enabled = false; } + else if(shadowBarrier.Position.DistanceTo2D(Game.LocalPlayer.Character.Position) <= 15f && barrierList.SelectedItem == "Flare") + { + barrierList.Enabled = true; + rotateBarrier.Enabled = false; + } else { barrierList.Enabled = true; @@ -101,7 +112,7 @@ namespace SceneManager { CreateShadowBarrier(barrierMenu); - if (barrierObjectNames[barrierList.Index] == "prop_flare_01b") + if(barrierList.SelectedItem == "Flare") { rotateBarrier.Enabled = false; } @@ -123,8 +134,7 @@ namespace SceneManager { // Attach some invisible object to the cone which the AI try to drive around // Barrier rotates with cone and becomes invisible similar to ASC when created - - if (shadowBarrier.Model.Name == "prop_flare_01b".ToUpper()) + if(barrierList.SelectedItem == "Flare") { SpawnFlare(); } @@ -143,7 +153,7 @@ namespace SceneManager private static void SpawnBarrier() { - var cone = new Rage.Object(shadowBarrier.Model, shadowBarrier.Position, rotateBarrier.Index); + var cone = new Rage.Object(shadowBarrier.Model, shadowBarrier.Position, rotateBarrier.Value); cone.SetPositionWithSnap(shadowBarrier.Position); Rage.Native.NativeFunction.Natives.SET_DISABLE_FRAG_DAMAGE(cone, true); Rage.Native.NativeFunction.Natives.SET_DISABLE_BREAKING(cone, true); @@ -183,15 +193,15 @@ namespace SceneManager private static void SpawnFlare() { var flare = new Weapon("weapon_flare", shadowBarrier.Position, 1); - flare.SetPositionWithSnap(shadowBarrier.Position); + //flare.SetPositionWithSnap(shadowBarrier.Position); // The purpose of this fiber is to allow the flare to spawn and fall to the ground naturally before freezing its position because you can't spawn it on the ground gracefully (it stands upright) - GameFiber.StartNew(delegate - { - GameFiber.Sleep(1000); - flare.IsPositionFrozen = true; - flare.IsCollisionEnabled = false; - }); + //GameFiber.StartNew(delegate + //{ + // GameFiber.Sleep(1000); + // flare.IsPositionFrozen = true; + // flare.IsCollisionEnabled = false; + //}); barriers.Add(flare); removeBarrierOptions.Enabled = true; From 73865880ff2c1021500648da46c4375a645c80a4 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 24 Aug 2020 10:13:16 -0600 Subject: [PATCH 040/276] Refactored menu so items are updated instead of deleted/re-added when the waypoint is changed --- SceneManager/Menus/EditWaypointMenu.cs | 52 +++++++++++++------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 46be7dc..303806e 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -40,26 +40,24 @@ namespace SceneManager var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index]; - // Populating menu list so user can select which waypoint to edit by index - //pathWaypoints.Clear(); - //for (int i = 0; i < currentPath.Waypoints.Count; i++) - //{ - // pathWaypoints.Add(i+1); - //} editWaypoint = new UIMenuNumericScrollerItem("Edit Waypoint", "", PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints.First().Number, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints.Last().Number, 1); - Game.LogTrivial($"First waypoint number: {PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints.First().Number}"); - Game.LogTrivial($"Last waypoint number: {PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints.Last().Number}"); + editWaypointMenu.Clear(); editWaypointMenu.AddItem(editWaypoint); editWaypoint.Index = 0; editWaypointMenu.AddItem(changeWaypointType = new UIMenuListScrollerItem("Change Waypoint Type", "", new [] { "Drive To", "Stop" })); changeWaypointType.Index = Array.IndexOf(drivingFlags, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].DrivingFlag); + + Game.LogTrivial($"Waypoint speed: {PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed}"); editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuListScrollerItem("Change Waypoint Speed", "", waypointSpeeds)); changeWaypointSpeed.Index = Array.IndexOf(waypointSpeeds, MathHelper.ConvertMetersPerSecondToMilesPerHour(PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed)); + editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector Waypoint", PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].IsCollector)); + editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListScrollerItem("Change Collection Radius", "", collectorRadii)); changeCollectorRadius.Index = Array.IndexOf(collectorRadii, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].CollectorRadius); + editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); editUpdateWaypoint.ForeColor = Color.Gold; @@ -79,25 +77,10 @@ namespace SceneManager { if(scrollerItem == editWaypoint) { - while (editWaypointMenu.MenuItems.Count > 1) - { - editWaypointMenu.RemoveItemAt(1); - GameFiber.Yield(); - } - - editWaypointMenu.AddItem(changeWaypointType = new UIMenuListScrollerItem("Change Waypoint Type", "", new[] { "Drive To", "Stop" })); changeWaypointType.Index = Array.IndexOf(drivingFlags, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].DrivingFlag); - editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuListScrollerItem("Change Waypoint Speed", "", waypointSpeeds)); changeWaypointSpeed.Index = Array.IndexOf(waypointSpeeds, MathHelper.ConvertMetersPerSecondToMilesPerHour(PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed)); - editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector Waypoint", PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].IsCollector)); - editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListScrollerItem("Change Collection Radius", "", collectorRadii)); + collectorWaypoint.Checked = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].IsCollector; changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; - editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); - editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); - editUpdateWaypoint.ForeColor = Color.Gold; - editWaypointMenu.AddItem(editRemoveWaypoint = new UIMenuItem("Remove Waypoint")); - editRemoveWaypoint.ForeColor = Color.Gold; - //editWaypointMenu.RefreshIndex(); } } @@ -116,7 +99,7 @@ namespace SceneManager if (selectedItem == editUpdateWaypoint) { - currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], changeWaypointSpeed.SelectedItem, collectorWaypoint.Checked, changeCollectorRadius.SelectedItem, updateWaypointPosition.Checked); + currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], SetDriveSpeedForWaypoint(), collectorWaypoint.Checked, changeCollectorRadius.SelectedItem, updateWaypointPosition.Checked); //currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], waypointSpeeds[changeWaypointSpeed.Index], collectorWaypoint.Checked, collectorRadii[changeCollectorRadius.Index], updateWaypointPosition.Checked); Game.LogTrivial($"Updated path {currentPath.PathNum} waypoint {currentWaypoint.Number}: Driving flag is {drivingFlags[changeWaypointType.Index].ToString()}, speed is {waypointSpeeds[changeWaypointSpeed.Index].ToString()}, collector is {currentWaypoint.IsCollector}"); @@ -168,5 +151,24 @@ namespace SceneManager } } } + + private static float SetDriveSpeedForWaypoint() + { + float convertedSpeed; + if (SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH) + { + //Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); + convertedSpeed = MathHelper.ConvertMilesPerHourToMetersPerSecond(changeWaypointSpeed.SelectedItem); + //Game.LogTrivial($"Converted speed: {convertedSpeed}m/s"); + } + else + { + //Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); + convertedSpeed = MathHelper.ConvertKilometersPerHourToMetersPerSecond(changeWaypointSpeed.SelectedItem); + //Game.LogTrivial($"Converted speed: {convertedSpeed}m/s"); + } + + return convertedSpeed; + } } } From 1c2b776ea663dfb048e37025bb85ebf369552c8e Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 24 Aug 2020 10:13:50 -0600 Subject: [PATCH 041/276] Removed RefreshMenu() method call --- SceneManager/Menus/PathCreationMenu.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 462b9f0..b240128 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -80,13 +80,12 @@ namespace SceneManager { PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip)); } - + Game.LogTrivial($"Waypoint speed: {PathMainMenu.GetPaths()[pathIndex].Waypoints.Last().Speed}"); Game.LogTrivial($"[Path {currentPath}] Waypoint {currentWaypoint} ({drivingFlag.ToString()}) added"); ToggleTrafficEndPathMenuItem(pathIndex); trafficRemoveWaypoint.Enabled = true; - // Refresh the trafficMenu after a waypoint is added in order to show Continue Creating Current Path instead of Create New Path - PathMainMenu.RefreshMenu(); + PathMainMenu.createNewPath.Text = "Continue Creating Current Path"; } if (selectedItem == trafficRemoveWaypoint) From 09156078167b643074f76b038682f13fc5016645 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 24 Aug 2020 20:12:20 -0600 Subject: [PATCH 042/276] Removed code pertaining to Direct Driver tasking. Made DismissDriver, AssignWaypointTasks, and SetVehicleAndDriverPersistence methods public --- SceneManager/TrafficPathing.cs | 62 ++++++++++++++++------------------ 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/SceneManager/TrafficPathing.cs b/SceneManager/TrafficPathing.cs index e5abe8e..f641970 100644 --- a/SceneManager/TrafficPathing.cs +++ b/SceneManager/TrafficPathing.cs @@ -60,7 +60,7 @@ namespace SceneManager return collectedVehicle; } - private static void SetVehicleAndDriverPersistence(Vehicle v) + public static void SetVehicleAndDriverPersistence(Vehicle v) { v.IsPersistent = true; v.Driver.IsPersistent = true; @@ -80,7 +80,8 @@ namespace SceneManager } } - private static void AssignWaypointTasks(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) + // TODO: Refactor, extract methods + public static void AssignWaypointTasks(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) { var vehicle = collectedVehicle.Vehicle; var driver = vehicle.Driver; @@ -92,21 +93,21 @@ namespace SceneManager collectedVehicle.SetStoppedAtWaypoint(true); } - for (int i = currentWaypoint.Number; i < waypoints.Count; i++) + for (int nextWaypoint = currentWaypoint.Number; nextWaypoint < waypoints.Count; nextWaypoint++) { - if (waypoints.ElementAtOrDefault(i) == null) + if (waypoints.ElementAtOrDefault(nextWaypoint) == null) { Game.LogTrivial($"Waypoint is null"); break; } - Game.LogTrivial($"{vehicle.Model.Name} is driving to waypoint {waypoints[i].Number}"); - if (waypoints.ElementAtOrDefault(i) != null && !collectedVehicle.StoppedAtWaypoint) + Game.LogTrivial($"{vehicle.Model.Name} is driving to waypoint {waypoints[nextWaypoint].Number}"); + if (waypoints.ElementAtOrDefault(nextWaypoint) != null && !collectedVehicle.StoppedAtWaypoint) { - collectedVehicle.Vehicle.Driver.Tasks.DriveToPosition(waypoints[i].Position, waypoints[i].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + collectedVehicle.Vehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); } - if (waypoints.ElementAtOrDefault(i) != null && waypoints[i].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + if (waypoints.ElementAtOrDefault(nextWaypoint) != null && waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) { Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} stopping at waypoint."); collectedVehicle.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); @@ -117,11 +118,11 @@ namespace SceneManager DismissDriver(collectedVehicle); } - private static void DismissDriver(CollectedVehicle cv) + public static void DismissDriver(CollectedVehicle cv) { cv.SetDismissNow(true); cv.SetStoppedAtWaypoint(false); - if (cv.Vehicle && cv.Vehicle.Driver && !cv.Redirected) + if (cv.Vehicle && cv.Vehicle.Driver)// && !cv.Redirected) { cv.Vehicle.Driver.Dismiss(); cv.Vehicle.Driver.Tasks.Clear(); @@ -158,30 +159,27 @@ namespace SceneManager } } - public static void DirectTask(CollectedVehicle cv, List waypoints) - { - cv.SetDismissNow(false); - if (cv.Vehicle && cv.Vehicle.Driver) - { - cv.Vehicle.IsPersistent = true; - cv.Vehicle.Driver.IsPersistent = true; - cv.Vehicle.Driver.BlockPermanentEvents = true; - cv.Vehicle.Driver.Tasks.Clear(); - } + //public static void DirectTask(CollectedVehicle collectedVehicle, List waypoints) + //{ + // // Set persistence - // Give vehicle task to initial waypoint of desired path, then run a loop to keep giving the task until they're close enough in case they try to wander away too early - // Need to figure out how to only get waypoints which are in front of or within 90 degrees of either side of the vehicle - var nearestWaypoint = waypoints.OrderBy(wp => wp.Position).Take(1) as Waypoint; + // // Assign tasks similar to joining from collection waypoint + // //GameFiber AssignTasksFiber = new GameFiber(() => AssignWaypointTasks(collectedVehicle, waypoints, waypoint)); + // //AssignTasksFiber.Start(); - cv.Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint.Position, nearestWaypoint.Speed, (VehicleDrivingFlags)262539, 1f); // waypointData[0].WaypointPos - while (nearestWaypoint != null && cv.Vehicle && cv.Vehicle.Driver && cv.Vehicle.DistanceTo(waypoints[0].Position) > 3f && !cv.DismissNow) - { - cv.Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint.Position, nearestWaypoint.Speed, (VehicleDrivingFlags)262539, 1f); - GameFiber.Sleep(500); - } - cv.SetRedirected(false); - Game.LogTrivial($"DirectTask loop over"); - } + // // Give vehicle task to initial waypoint of desired path, then run a loop to keep giving the task until they're close enough in case they try to wander away too early + // // Need to figure out how to only get waypoints which are in front of or within 90 degrees of either side of the vehicle + // var nearestWaypoint = waypoints.OrderBy(wp => wp.Position).Take(1) as Waypoint; + + // collectedVehicle.Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint.Position, nearestWaypoint.Speed, (VehicleDrivingFlags)262539, 1f); // waypointData[0].WaypointPos + // while (nearestWaypoint != null && collectedVehicle.Vehicle && collectedVehicle.Vehicle.Driver && collectedVehicle.Vehicle.DistanceTo(waypoints[0].Position) > 3f && !collectedVehicle.DismissNow) + // { + // collectedVehicle.Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint.Position, nearestWaypoint.Speed, (VehicleDrivingFlags)262539, 1f); + // GameFiber.Sleep(500); + // } + // collectedVehicle.SetRedirected(false); + // Game.LogTrivial($"DirectTask loop over"); + //} private static void VehicleDismissed(CollectedVehicle cv, List waypointData) { From 96b535675cb85f56feadae478a8c18acb01cc14d Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 24 Aug 2020 20:13:01 -0600 Subject: [PATCH 043/276] Preparing to remove Redirected property as part of Direct Driver refactor --- SceneManager/Object Classes/CollectedVehicle.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index 0dd39a8..c9892a8 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -26,7 +26,7 @@ namespace SceneManager Redirected = redirected; } - public void AssignPropertiesFromDirectedTask(int pathNum, int totalPathWaypoints, int currentWaypoint, bool tasksAssigned, bool dismiss, bool stoppedAtWaypoint, bool redirected) + public void AssignPropertiesFromDirectedTask(int pathNum, int totalPathWaypoints, int currentWaypoint, bool tasksAssigned, bool dismiss, bool stoppedAtWaypoint)//, bool redirected) { Path = pathNum; TotalWaypoints = totalPathWaypoints; @@ -34,7 +34,7 @@ namespace SceneManager TasksAssigned = tasksAssigned; DismissNow = dismiss; StoppedAtWaypoint = stoppedAtWaypoint; - Redirected = redirected; + //Redirected = redirected; } public void SetCurrentWaypoint(int currentWaypoint) From 25fbd0a8ecf5b5db95f889cc9ae9295e02c3e614 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 24 Aug 2020 20:14:17 -0600 Subject: [PATCH 044/276] Added check if the waypoint's collector radius is set before trying to update it --- SceneManager/Menus/EditWaypointMenu.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 303806e..dc96648 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -56,7 +56,10 @@ namespace SceneManager editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector Waypoint", PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].IsCollector)); editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListScrollerItem("Change Collection Radius", "", collectorRadii)); - changeCollectorRadius.Index = Array.IndexOf(collectorRadii, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].CollectorRadius); + if (PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].CollectorRadius != 0) + { + changeCollectorRadius.Index = Array.IndexOf(collectorRadii, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].CollectorRadius); + } editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); From fd4a46587da15717ea39c55670b3cbe3bd824206 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 24 Aug 2020 20:14:51 -0600 Subject: [PATCH 045/276] Fixed condition for toggling End Path menu item --- SceneManager/Menus/PathCreationMenu.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index b240128..8512efb 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -184,7 +184,7 @@ namespace SceneManager private static void ToggleTrafficEndPathMenuItem(int pathIndex) { - if ((PathMainMenu.GetPaths()[pathIndex].Waypoints.Count == 1 && PathMainMenu.GetPaths()[pathIndex].Waypoints.First().DrivingFlag == VehicleDrivingFlags.StopAtDestination) || (PathMainMenu.GetPaths()[pathIndex].Waypoints.Count > 1 && PathMainMenu.GetPaths()[pathIndex].Waypoints.Any(p => p.DrivingFlag != VehicleDrivingFlags.StopAtDestination))) + if ((PathMainMenu.GetPaths()[pathIndex].Waypoints.Count == 1 && PathMainMenu.GetPaths()[pathIndex].Waypoints.First().DrivingFlag == VehicleDrivingFlags.StopAtDestination) || (PathMainMenu.GetPaths()[pathIndex].Waypoints.Count > 1)) { trafficEndPath.Enabled = true; } From a0bf7ef512866516b76a0d1b6c0ccff07d932686 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 24 Aug 2020 20:15:22 -0600 Subject: [PATCH 046/276] Beginning to implement option to direct driver to nearest waypoint or path's first waypoint --- SceneManager/Menus/PathMainMenu.cs | 97 +++++++++++++++++++++++++++--- 1 file changed, 88 insertions(+), 9 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index bd9a0b8..abb98c6 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -13,6 +13,7 @@ namespace SceneManager public static UIMenuItem createNewPath { get; private set; } private static UIMenuItem deleteAllPaths; public static UIMenuListScrollerItem editPath { get; private set; } + public static UIMenuListScrollerItem directOptions { get; private set; } public static UIMenuListScrollerItem directDriver { get; private set; } public static UIMenuListScrollerItem dismissDriver { get; private set; } public static UIMenuCheckboxItem disableAllPaths { get; private set; } @@ -48,6 +49,7 @@ namespace SceneManager pathMainMenu.AddItem(disableAllPaths = new UIMenuCheckboxItem("Disable All Paths", false)); pathMainMenu.AddItem(deleteAllPaths = new UIMenuItem("Delete All Paths")); deleteAllPaths.ForeColor = Color.Gold; + pathMainMenu.AddItem(directOptions = new UIMenuListScrollerItem("Direct driver to path's", "", new[] { "First waypoint", "Nearest waypoint" })); pathMainMenu.AddItem(directDriver = new UIMenuListScrollerItem("Direct nearest driver to path", "", pathsNum)); directDriver.ForeColor = Color.Gold; pathMainMenu.AddItem(dismissDriver = new UIMenuListScrollerItem("Dismiss nearest driver", "", dismissOptions)); @@ -231,32 +233,109 @@ namespace SceneManager Game.DisplayNotification($"~o~Scene Manager\n~w~All paths deleted."); } + // This needs big refactor if (selectedItem == directDriver) { var nearbyVehicle = Game.LocalPlayer.Character.GetNearbyVehicles(1).Where(v => v.VehicleAndDriverValid()).SingleOrDefault(); + var firstWaypoint = paths[directDriver.Index].Waypoints.First(); + var pathNum = paths[directDriver.Index].Waypoints[0].Path; + var totalPathWaypoints = paths[directDriver.Index].Waypoints.Count; + if (nearbyVehicle) { + var nearestWaypoint = paths[directDriver.Index].Waypoints.Where(wp => wp.Position.DistanceTo2D(nearbyVehicle.FrontPosition) < wp.Position.DistanceTo2D(nearbyVehicle.RearPosition)).OrderBy(wp => wp.Position.DistanceTo2D(nearbyVehicle)).ToArray(); + + TrafficPathing.SetVehicleAndDriverPersistence(nearbyVehicle); if (nearbyVehicle.IsInCollectedVehicles()) { var vehicle = TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate]; - var nearestWaypoint = paths[directDriver.Index].Waypoints.OrderBy(wp => wp.Position).Take(1) as Waypoint; - var pathNum = paths[directDriver.Index].Waypoints[0].Path; - var totalPathWaypoints = paths[directDriver.Index].Waypoints.Count; Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} already in collection. Clearing tasks."); nearbyVehicle.Driver.Tasks.Clear(); - vehicle.AssignPropertiesFromDirectedTask(pathNum, totalPathWaypoints, 1, tasksAssigned: false, dismiss: true, stoppedAtWaypoint: false, redirected: true); + vehicle.AssignPropertiesFromDirectedTask(pathNum, totalPathWaypoints, 1, tasksAssigned: false, dismiss: true, stoppedAtWaypoint: false);//, redirected: true); - GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(vehicle, paths[directDriver.Index].Waypoints)); - DirectTaskFiber.Start(); + if (directOptions.SelectedItem == "First waypoint") + { + GameFiber.StartNew(() => + { + nearbyVehicle.Driver.Tasks.DriveToPosition(firstWaypoint.Position, firstWaypoint.Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + }); + } + else + { + GameFiber.StartNew(() => + { + nearbyVehicle.Driver.Tasks.DriveToPosition(nearestWaypoint[0].Position, nearestWaypoint[0].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + }); + } } else { TrafficPathing.collectedVehicles.Add(nearbyVehicle.LicensePlate, new CollectedVehicle(nearbyVehicle, nearbyVehicle.LicensePlate, paths[directDriver.Index].Waypoints[0].Path, paths[directDriver.Index].Waypoints.Count, 1, false, false, true)); - Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} not in collection, adding to collection for path {paths[directDriver.Index].Waypoints[0].Path} with {paths[directDriver.Index].Waypoints.Count} waypoints"); + Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} not in collection, adding to collection for path {paths[directDriver.Index].PathNum} with {paths[directDriver.Index].Waypoints.Count} waypoints"); - GameFiber DirectTaskFiber = new GameFiber(() => TrafficPathing.DirectTask(TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate], paths[directDriver.Index].Waypoints)); - DirectTaskFiber.Start(); + if (directOptions.SelectedItem == "First waypoint") + { + GameFiber.StartNew(() => + { + TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.DriveToPosition(firstWaypoint.Position, firstWaypoint.Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + + for (int nextWaypoint = firstWaypoint.Number; nextWaypoint < paths[directDriver.Index].Waypoints.Count; nextWaypoint++) + { + if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) == null) + { + Game.LogTrivial($"Waypoint is null"); + break; + } + + Game.LogTrivial($"{TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} is driving to waypoint {paths[directDriver.Index].Waypoints[nextWaypoint].Number}"); + if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && !TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].StoppedAtWaypoint) + { + TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.DriveToPosition(paths[directDriver.Index].Waypoints[nextWaypoint].Position, paths[directDriver.Index].Waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + } + + if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && paths[directDriver.Index].Waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + Game.LogTrivial($"{TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} stopping at waypoint."); + TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); + TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].SetStoppedAtWaypoint(true); + } + } + Game.LogTrivial($"{TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} all tasks complete."); + TrafficPathing.DismissDriver(TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate]); + }); + } + else + { + GameFiber.StartNew(() => + { + TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint[0].Position, nearestWaypoint[0].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + + for (int nextWaypoint = nearestWaypoint[0].Number; nextWaypoint < paths[directDriver.Index].Waypoints.Count; nextWaypoint++) + { + if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) == null) + { + Game.LogTrivial($"Waypoint is null"); + break; + } + + Game.LogTrivial($"{TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} is driving to waypoint {paths[directDriver.Index].Waypoints[nextWaypoint].Number}"); + if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && !TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].StoppedAtWaypoint) + { + TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.DriveToPosition(paths[directDriver.Index].Waypoints[nextWaypoint].Position, paths[directDriver.Index].Waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + } + + if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && paths[directDriver.Index].Waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + Game.LogTrivial($"{TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} stopping at waypoint."); + TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); + TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].SetStoppedAtWaypoint(true); + } + } + Game.LogTrivial($"{TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} all tasks complete."); + TrafficPathing.DismissDriver(TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate]); + }); + } } } } From 689c5da8ece8fa808376c87e291ba293eded12fc Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 25 Aug 2020 17:10:33 -0600 Subject: [PATCH 047/276] Refactored TrafficPathing class into VehicleCollector and AITasking classes --- SceneManager/AITasking.cs | 96 +++++++++ ...{TrafficPathing.cs => VehicleCollector.cs} | 190 +++++------------- 2 files changed, 147 insertions(+), 139 deletions(-) create mode 100644 SceneManager/AITasking.cs rename SceneManager/{TrafficPathing.cs => VehicleCollector.cs} (56%) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs new file mode 100644 index 0000000..63f6b6e --- /dev/null +++ b/SceneManager/AITasking.cs @@ -0,0 +1,96 @@ +using Rage; +using System.Collections.Generic; +using System.Linq; + +namespace SceneManager +{ + class AITasking + { + public static void AssignWaypointTasks(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) + { + if (currentWaypoint != null && currentWaypoint.DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + StopVehicleAtWaypoint(collectedVehicle); + } + + DriveVehicleToNextWaypoint(collectedVehicle, waypoints, currentWaypoint); + + Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} all tasks complete."); + DismissDriver(collectedVehicle); + } + + private static void DriveVehicleToNextWaypoint(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) + { + var vehicle = collectedVehicle.Vehicle; + var driver = vehicle.Driver; + + for (int nextWaypoint = currentWaypoint.Number; nextWaypoint < waypoints.Count; nextWaypoint++) + { + if (waypoints.ElementAtOrDefault(nextWaypoint) == null) + { + Game.LogTrivial($"Waypoint is null"); + return; + } + if (!vehicle) + { + Game.LogTrivial($"Vehicle is null"); + return; + } + if (!driver) + { + Game.LogTrivial($"Driver is null"); + return; + } + + Game.LogTrivial($"{vehicle.Model.Name} is driving to waypoint {waypoints[nextWaypoint].Number}"); + if (waypoints.ElementAtOrDefault(nextWaypoint) != null && !collectedVehicle.StoppedAtWaypoint) + { + collectedVehicle.Vehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + } + + if (waypoints.ElementAtOrDefault(nextWaypoint) != null && waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} stopping at waypoint."); + collectedVehicle.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); + collectedVehicle.SetStoppedAtWaypoint(true); + } + } + } + + private static void StopVehicleAtWaypoint(CollectedVehicle collectedVehicle) + { + Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} stopping at waypoint."); + collectedVehicle.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); + collectedVehicle.SetStoppedAtWaypoint(true); + } + + public static void DismissDriver(CollectedVehicle cv) + { + if (!cv.Vehicle) + { + Game.LogTrivial($"Vehicle is not valid after tasks completed."); + return; + } + if (!cv.Vehicle.Driver) + { + Game.LogTrivial($"Driver is not valid after tasks completed."); + return; + } + + cv.SetDismissNow(true); + cv.SetStoppedAtWaypoint(false); + if (cv.Vehicle && cv.Vehicle.Driver) + { + cv.Vehicle.Driver.Dismiss(); + cv.Vehicle.Driver.Tasks.Clear(); + cv.Vehicle.Driver.BlockPermanentEvents = false; + cv.Vehicle.Driver.IsPersistent = false; + + cv.Vehicle.Dismiss(); + cv.Vehicle.IsPersistent = false; + + Game.LogTrivial($"{cv.Vehicle.Model.Name} dismissed successfully."); + } + } + } +} diff --git a/SceneManager/TrafficPathing.cs b/SceneManager/VehicleCollector.cs similarity index 56% rename from SceneManager/TrafficPathing.cs rename to SceneManager/VehicleCollector.cs index f641970..e12ac83 100644 --- a/SceneManager/TrafficPathing.cs +++ b/SceneManager/VehicleCollector.cs @@ -5,8 +5,30 @@ using Rage; namespace SceneManager { - public static class TrafficPathing + public static class VehicleCollector { + // Driving styles https://gtaforums.com/topic/822314-guide-driving-styles/ + // also https://vespura.com/fivem/drivingstyle/ + [Flags] + private enum EDrivingFlags + { + None = 0, + StopForVehicles = 1, + StopForPeds = 2, + AvoidEmptyVehicles = 8, + AvoidPeds = 16, + AvoidObjects = 32, + StopForTrafficLights = 128, + UseBlinkers = 256, + AllowWrongWay = 512, + TakeShortestPath = 262144, + IgnoreRoads = 4194304, + IgnorePathfinding = 16777216, + AvoidHighways = 536870912, + Normal = StopForVehicles | StopForPeds | AvoidEmptyVehicles | StopForTrafficLights | UseBlinkers | AllowWrongWay | IgnoreRoads, + TotalControl = AllowWrongWay | AvoidObjects | AvoidPeds | TakeShortestPath | StopForTrafficLights | IgnorePathfinding | StopForVehicles + } + public static Dictionary collectedVehicles = new Dictionary(); public static void StartCollectingAtWaypoint(List paths, Path path, Waypoint waypoint) @@ -34,10 +56,8 @@ namespace SceneManager SetVehicleAndDriverPersistence(vehicle); CollectedVehicle newCollectedVehicle = AddVehicleToCollection(path, waypoint, vehicle); Game.LogTrivial($"[WaypointVehicleCollector] Added {vehicle.Model.Name} to collection."); - //GameFiber DismissCheckFiber = new GameFiber(() => VehicleDismissed(collectedVehicle, path.Waypoints)); - //DismissCheckFiber.Start(); - GameFiber AssignTasksFiber = new GameFiber(() => AssignWaypointTasks(newCollectedVehicle, path.Waypoints, waypoint)); + GameFiber AssignTasksFiber = new GameFiber(() => AITasking.AssignWaypointTasks(newCollectedVehicle, path.Waypoints, waypoint)); AssignTasksFiber.Start(); } // If the vehicle is in the collection, but has no tasks @@ -46,12 +66,38 @@ namespace SceneManager Game.LogTrivial($"[WaypointVehicleCollector] {vehicle.Model.Name} already in collection, but with no tasks. Assigning tasks."); collectedVehicles[vehicle.LicensePlate].SetTasksAssigned(true); - GameFiber AssignTasksFiber = new GameFiber(() => AssignWaypointTasks(collectedVehicles[vehicle.LicensePlate], path.Waypoints, waypoint)); + GameFiber AssignTasksFiber = new GameFiber(() => AITasking.AssignWaypointTasks(collectedVehicles[vehicle.LicensePlate], path.Waypoints, waypoint)); AssignTasksFiber.Start(); } } } + private static Vehicle[] GetNearbyVehicles(Vector3 OriginPosition, float radius) + { + return (from x in World.GetAllVehicles() where !x.IsTrailer && x.DistanceTo(OriginPosition) < radius select x).ToArray(); + } + + private static void AssignStopForVehiclesFlag(List paths, Path path, Waypoint waypointData) + { + while (paths.Contains(path) && path.Waypoints.Contains(waypointData)) + { + if (path.IsEnabled) + { + foreach (Vehicle v in GetNearbyVehicles(waypointData.Position, 50f).Where(v => v && v.HasDriver && v.Driver)) + { + SetDriveTaskDrivingFlags(v.Driver, EDrivingFlags.StopForVehicles); + } + } + GameFiber.Sleep(500); + } + } + + private static void SetDriveTaskDrivingFlags(this Ped ped, EDrivingFlags flags) + { + ulong SetDriveTaskDrivingFlagsHash = 0xDACE1BE37D88AF67; + Rage.Native.NativeFunction.CallByHash(SetDriveTaskDrivingFlagsHash, ped, (int)flags); + } + private static CollectedVehicle AddVehicleToCollection(Path path, Waypoint waypoint, Vehicle v) { var collectedVehicle = new CollectedVehicle(v, v.LicensePlate, path.PathNum, path.Waypoints.Count, waypoint.Number, true, false, false); @@ -80,107 +126,6 @@ namespace SceneManager } } - // TODO: Refactor, extract methods - public static void AssignWaypointTasks(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) - { - var vehicle = collectedVehicle.Vehicle; - var driver = vehicle.Driver; - - if (currentWaypoint != null && currentWaypoint.DrivingFlag == VehicleDrivingFlags.StopAtDestination) - { - Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} stopping at waypoint."); - collectedVehicle.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); - collectedVehicle.SetStoppedAtWaypoint(true); - } - - for (int nextWaypoint = currentWaypoint.Number; nextWaypoint < waypoints.Count; nextWaypoint++) - { - if (waypoints.ElementAtOrDefault(nextWaypoint) == null) - { - Game.LogTrivial($"Waypoint is null"); - break; - } - - Game.LogTrivial($"{vehicle.Model.Name} is driving to waypoint {waypoints[nextWaypoint].Number}"); - if (waypoints.ElementAtOrDefault(nextWaypoint) != null && !collectedVehicle.StoppedAtWaypoint) - { - collectedVehicle.Vehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); - } - - if (waypoints.ElementAtOrDefault(nextWaypoint) != null && waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) - { - Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} stopping at waypoint."); - collectedVehicle.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); - collectedVehicle.SetStoppedAtWaypoint(true); - } - } - Game.LogTrivial($"{vehicle.Model.Name} all tasks complete."); - DismissDriver(collectedVehicle); - } - - public static void DismissDriver(CollectedVehicle cv) - { - cv.SetDismissNow(true); - cv.SetStoppedAtWaypoint(false); - if (cv.Vehicle && cv.Vehicle.Driver)// && !cv.Redirected) - { - cv.Vehicle.Driver.Dismiss(); - cv.Vehicle.Driver.Tasks.Clear(); - cv.Vehicle.Driver.BlockPermanentEvents = false; - cv.Vehicle.Driver.IsPersistent = false; - - cv.Vehicle.Dismiss(); - cv.Vehicle.IsPersistent = false; - - Game.LogTrivial($"{cv.Vehicle.Model.Name} dismissed successfully."); - } - else if (!cv.Vehicle) - { - Game.LogTrivial($"{cv.Vehicle.Model.Name} is not valid after tasks completed."); - } - else if (!cv.Vehicle.Driver) - { - Game.LogTrivial($"{cv.Vehicle.Model.Name} driver is not valid after tasks completed."); - } - } - - public static void AssignStopForVehiclesFlag(List paths, Path path, Waypoint waypointData) - { - while (paths.Contains(path) && path.Waypoints.Contains(waypointData)) - { - if (path.IsEnabled) - { - foreach (Vehicle v in GetNearbyVehicles(waypointData.Position, 50f).Where(v => v && v.HasDriver && v.Driver)) - { - SetDriveTaskDrivingFlags(v.Driver, EDrivingFlags.StopForVehicles); - } - } - GameFiber.Sleep(500); - } - } - - //public static void DirectTask(CollectedVehicle collectedVehicle, List waypoints) - //{ - // // Set persistence - - // // Assign tasks similar to joining from collection waypoint - // //GameFiber AssignTasksFiber = new GameFiber(() => AssignWaypointTasks(collectedVehicle, waypoints, waypoint)); - // //AssignTasksFiber.Start(); - - // // Give vehicle task to initial waypoint of desired path, then run a loop to keep giving the task until they're close enough in case they try to wander away too early - // // Need to figure out how to only get waypoints which are in front of or within 90 degrees of either side of the vehicle - // var nearestWaypoint = waypoints.OrderBy(wp => wp.Position).Take(1) as Waypoint; - - // collectedVehicle.Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint.Position, nearestWaypoint.Speed, (VehicleDrivingFlags)262539, 1f); // waypointData[0].WaypointPos - // while (nearestWaypoint != null && collectedVehicle.Vehicle && collectedVehicle.Vehicle.Driver && collectedVehicle.Vehicle.DistanceTo(waypoints[0].Position) > 3f && !collectedVehicle.DismissNow) - // { - // collectedVehicle.Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint.Position, nearestWaypoint.Speed, (VehicleDrivingFlags)262539, 1f); - // GameFiber.Sleep(500); - // } - // collectedVehicle.SetRedirected(false); - // Game.LogTrivial($"DirectTask loop over"); - //} - private static void VehicleDismissed(CollectedVehicle cv, List waypointData) { while (!cv.DismissNow) @@ -210,38 +155,5 @@ namespace SceneManager GameFiber.Sleep(1000); } } - - private static Vehicle[] GetNearbyVehicles(Vector3 OriginPosition, float radius) - { - return (from x in World.GetAllVehicles() where !x.IsTrailer && x.DistanceTo(OriginPosition) < radius select x).ToArray(); - } - - // Driving styles https://gtaforums.com/topic/822314-guide-driving-styles/ - // also https://vespura.com/fivem/drivingstyle/ - [Flags] - public enum EDrivingFlags - { - None = 0, - StopForVehicles = 1, - StopForPeds = 2, - AvoidEmptyVehicles = 8, - AvoidPeds = 16, - AvoidObjects = 32, - StopForTrafficLights = 128, - UseBlinkers = 256, - AllowWrongWay = 512, - TakeShortestPath = 262144, - IgnoreRoads = 4194304, - IgnorePathfinding = 16777216, - AvoidHighways = 536870912, - Normal = StopForVehicles | StopForPeds | AvoidEmptyVehicles | StopForTrafficLights | UseBlinkers | AllowWrongWay | IgnoreRoads, - TotalControl = AllowWrongWay | AvoidObjects | AvoidPeds | TakeShortestPath | StopForTrafficLights | IgnorePathfinding | StopForVehicles - } - - public static void SetDriveTaskDrivingFlags(this Ped ped, EDrivingFlags flags) - { - ulong SetDriveTaskDrivingFlagsHash = 0xDACE1BE37D88AF67; - Rage.Native.NativeFunction.CallByHash(SetDriveTaskDrivingFlagsHash, ped, (int)flags); - } } } From 3e5d8e054d3d0a2e502cc515ae15ce62f6fb7b62 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 25 Aug 2020 17:10:56 -0600 Subject: [PATCH 048/276] Removed unnecessary using statements --- SceneManager/GetUserInput.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/SceneManager/GetUserInput.cs b/SceneManager/GetUserInput.cs index 8a092d8..af0fd37 100644 --- a/SceneManager/GetUserInput.cs +++ b/SceneManager/GetUserInput.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Rage; +using Rage; namespace SceneManager { From 5381d0c18900e10bf747318e35a5d34ef5080d19 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 25 Aug 2020 17:11:14 -0600 Subject: [PATCH 049/276] Removed unnecessary using statement --- SceneManager/Menus/SettingsMenu.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/SceneManager/Menus/SettingsMenu.cs b/SceneManager/Menus/SettingsMenu.cs index e89606a..2d19bce 100644 --- a/SceneManager/Menus/SettingsMenu.cs +++ b/SceneManager/Menus/SettingsMenu.cs @@ -1,7 +1,6 @@ using Rage; using RAGENativeUI; using RAGENativeUI.Elements; -using System.Drawing; namespace SceneManager { From 5f3f22d2c41d226a84b3fe1d76606076d49fc5be Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 25 Aug 2020 17:12:05 -0600 Subject: [PATCH 050/276] Updated references based on TrafficPathing refactor --- SceneManager/EntryPoint.cs | 2 +- SceneManager/Menus/PathCreationMenu.cs | 2 +- SceneManager/Menus/PathMainMenu.cs | 52 +++++++++++++------------- SceneManager/SceneManager.csproj | 3 +- 4 files changed, 30 insertions(+), 29 deletions(-) diff --git a/SceneManager/EntryPoint.cs b/SceneManager/EntryPoint.cs index 08e5fb8..630a9d0 100644 --- a/SceneManager/EntryPoint.cs +++ b/SceneManager/EntryPoint.cs @@ -96,7 +96,7 @@ namespace SceneManager // Clear everything BarrierMenu.barriers.Clear(); - TrafficPathing.collectedVehicles.Clear(); + VehicleCollector.collectedVehicles.Clear(); Game.LogTrivial($"Scene Manager has been terminated."); Game.DisplayNotification($"~o~Scene Manager\n~r~[Notice]~w~ The plugin has shut down."); diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 8512efb..d969275 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -146,7 +146,7 @@ namespace SceneManager // For each waypoint in the path's WaypointData, start a collector game fiber and loop while the path and waypoint exist, and while the path is enabled foreach (Waypoint wd in PathMainMenu.GetPaths()[i].Waypoints) { - GameFiber WaypointVehicleCollectorFiber = new GameFiber(() => TrafficPathing.StartCollectingAtWaypoint(PathMainMenu.GetPaths(), PathMainMenu.GetPaths()[i], wd)); + GameFiber WaypointVehicleCollectorFiber = new GameFiber(() => VehicleCollector.StartCollectingAtWaypoint(PathMainMenu.GetPaths(), PathMainMenu.GetPaths()[i], wd)); WaypointVehicleCollectorFiber.Start(); //GameFiber AssignStopForVehiclesFlagFiber = new GameFiber(() => TrafficPathing.AssignStopForVehiclesFlag(PathMainMenu.GetPaths(), PathMainMenu.GetPaths()[i], wd)); diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index abb98c6..b1174d2 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -99,7 +99,7 @@ namespace SceneManager private static bool IsInCollectedVehicles(this Vehicle v) { - if (v && TrafficPathing.collectedVehicles.ContainsKey(v.LicensePlate)) + if (v && VehicleCollector.collectedVehicles.ContainsKey(v.LicensePlate)) { Game.LogTrivial($"{v.Model.Name} was found in the collection."); return true; @@ -116,7 +116,7 @@ namespace SceneManager // Before deleting a path, we need to dismiss any vehicles controlled by that path and remove the vehicles from ControlledVehicles //Game.LogTrivial($"Deleting path {index+1}"); Game.LogTrivial($"Deleting path {path.PathNum}"); - var pathVehicles = TrafficPathing.collectedVehicles.Where(cv => cv.Value.Path == path.PathNum).ToList(); + var pathVehicles = VehicleCollector.collectedVehicles.Where(cv => cv.Value.Path == path.PathNum).ToList(); Game.LogTrivial($"Removing all vehicles on the path"); foreach (KeyValuePair cv in pathVehicles.Where(cv => cv.Value.Vehicle && cv.Value.Vehicle.Driver)) @@ -129,7 +129,7 @@ namespace SceneManager cv.Value.Vehicle.IsPersistent = false; //Game.LogTrivial($"{cv.vehicle.Model.Name} cleared from path {cv.path}"); - TrafficPathing.collectedVehicles.Remove(cv.Value.LicensePlate); + VehicleCollector.collectedVehicles.Remove(cv.Value.LicensePlate); } // Remove the speed zone so cars don't continue to be affected after the path is deleted @@ -245,10 +245,10 @@ namespace SceneManager { var nearestWaypoint = paths[directDriver.Index].Waypoints.Where(wp => wp.Position.DistanceTo2D(nearbyVehicle.FrontPosition) < wp.Position.DistanceTo2D(nearbyVehicle.RearPosition)).OrderBy(wp => wp.Position.DistanceTo2D(nearbyVehicle)).ToArray(); - TrafficPathing.SetVehicleAndDriverPersistence(nearbyVehicle); + VehicleCollector.SetVehicleAndDriverPersistence(nearbyVehicle); if (nearbyVehicle.IsInCollectedVehicles()) { - var vehicle = TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate]; + var vehicle = VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate]; Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} already in collection. Clearing tasks."); nearbyVehicle.Driver.Tasks.Clear(); @@ -271,14 +271,14 @@ namespace SceneManager } else { - TrafficPathing.collectedVehicles.Add(nearbyVehicle.LicensePlate, new CollectedVehicle(nearbyVehicle, nearbyVehicle.LicensePlate, paths[directDriver.Index].Waypoints[0].Path, paths[directDriver.Index].Waypoints.Count, 1, false, false, true)); + VehicleCollector.collectedVehicles.Add(nearbyVehicle.LicensePlate, new CollectedVehicle(nearbyVehicle, nearbyVehicle.LicensePlate, paths[directDriver.Index].Waypoints[0].Path, paths[directDriver.Index].Waypoints.Count, 1, false, false, true)); Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} not in collection, adding to collection for path {paths[directDriver.Index].PathNum} with {paths[directDriver.Index].Waypoints.Count} waypoints"); if (directOptions.SelectedItem == "First waypoint") { GameFiber.StartNew(() => { - TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.DriveToPosition(firstWaypoint.Position, firstWaypoint.Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.DriveToPosition(firstWaypoint.Position, firstWaypoint.Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); for (int nextWaypoint = firstWaypoint.Number; nextWaypoint < paths[directDriver.Index].Waypoints.Count; nextWaypoint++) { @@ -288,28 +288,28 @@ namespace SceneManager break; } - Game.LogTrivial($"{TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} is driving to waypoint {paths[directDriver.Index].Waypoints[nextWaypoint].Number}"); - if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && !TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].StoppedAtWaypoint) + Game.LogTrivial($"{VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} is driving to waypoint {paths[directDriver.Index].Waypoints[nextWaypoint].Number}"); + if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && !VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].StoppedAtWaypoint) { - TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.DriveToPosition(paths[directDriver.Index].Waypoints[nextWaypoint].Position, paths[directDriver.Index].Waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.DriveToPosition(paths[directDriver.Index].Waypoints[nextWaypoint].Position, paths[directDriver.Index].Waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); } if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && paths[directDriver.Index].Waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) { - Game.LogTrivial($"{TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} stopping at waypoint."); - TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); - TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].SetStoppedAtWaypoint(true); + Game.LogTrivial($"{VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} stopping at waypoint."); + VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); + VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].SetStoppedAtWaypoint(true); } } - Game.LogTrivial($"{TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} all tasks complete."); - TrafficPathing.DismissDriver(TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate]); + Game.LogTrivial($"{VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} all tasks complete."); + AITasking.DismissDriver(VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate]); }); } else { GameFiber.StartNew(() => { - TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint[0].Position, nearestWaypoint[0].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint[0].Position, nearestWaypoint[0].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); for (int nextWaypoint = nearestWaypoint[0].Number; nextWaypoint < paths[directDriver.Index].Waypoints.Count; nextWaypoint++) { @@ -319,21 +319,21 @@ namespace SceneManager break; } - Game.LogTrivial($"{TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} is driving to waypoint {paths[directDriver.Index].Waypoints[nextWaypoint].Number}"); - if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && !TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].StoppedAtWaypoint) + Game.LogTrivial($"{VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} is driving to waypoint {paths[directDriver.Index].Waypoints[nextWaypoint].Number}"); + if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && !VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].StoppedAtWaypoint) { - TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.DriveToPosition(paths[directDriver.Index].Waypoints[nextWaypoint].Position, paths[directDriver.Index].Waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.DriveToPosition(paths[directDriver.Index].Waypoints[nextWaypoint].Position, paths[directDriver.Index].Waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); } if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && paths[directDriver.Index].Waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) { - Game.LogTrivial($"{TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} stopping at waypoint."); - TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); - TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].SetStoppedAtWaypoint(true); + Game.LogTrivial($"{VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} stopping at waypoint."); + VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); + VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].SetStoppedAtWaypoint(true); } } - Game.LogTrivial($"{TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} all tasks complete."); - TrafficPathing.DismissDriver(TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate]); + Game.LogTrivial($"{VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} all tasks complete."); + AITasking.DismissDriver(VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate]); }); } } @@ -351,7 +351,7 @@ namespace SceneManager Game.LogTrivial($"Dismiss from path"); if (nearbyVehicle.IsInCollectedVehicles()) { - var controlledVehicle = TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate]; + var controlledVehicle = VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate]; controlledVehicle.SetDismissNow(true); controlledVehicle.Vehicle.Driver.Tasks.Clear(); controlledVehicle.Vehicle.Driver.Dismiss(); @@ -367,7 +367,7 @@ namespace SceneManager Game.LogTrivial($"Dismiss from waypoint"); if (nearbyVehicle.IsInCollectedVehicles()) { - var controlledVehicle = TrafficPathing.collectedVehicles[nearbyVehicle.LicensePlate]; + var controlledVehicle = VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate]; controlledVehicle.SetStoppedAtWaypoint(false); controlledVehicle.Vehicle.Driver.Tasks.Clear(); controlledVehicle.Vehicle.Driver.Dismiss(); diff --git a/SceneManager/SceneManager.csproj b/SceneManager/SceneManager.csproj index 4a0382b..4b5f3dc 100644 --- a/SceneManager/SceneManager.csproj +++ b/SceneManager/SceneManager.csproj @@ -51,6 +51,7 @@ + @@ -65,7 +66,7 @@ - + From be99986d7d425cb88b96ac5b49128638e3c6b365 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 25 Aug 2020 20:52:43 -0600 Subject: [PATCH 051/276] Replaced float scroller items with numerical scrollers --- SceneManager/Menus/EditWaypointMenu.cs | 46 ++++++++++++-------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index dc96648..7dc3d72 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -10,19 +10,17 @@ namespace SceneManager { class EditWaypointMenu { + private static VehicleDrivingFlags[] drivingFlags = new VehicleDrivingFlags[] { VehicleDrivingFlags.Normal, VehicleDrivingFlags.StopAtDestination }; + private static string[] waypointTypes = new string[] { "Drive To", "Stop" }; public static UIMenu editWaypointMenu { get; private set; } public static UIMenuItem editUpdateWaypoint { get; private set; } public static UIMenuItem editRemoveWaypoint { get; private set; } public static UIMenuNumericScrollerItem editWaypoint; - public static UIMenuListScrollerItem changeWaypointType; - public static UIMenuListScrollerItem changeWaypointSpeed; - public static UIMenuListScrollerItem changeCollectorRadius; - private static UIMenuCheckboxItem collectorWaypoint, updateWaypointPosition; - - private static List pathWaypoints = new List() { }; - private static float[] waypointSpeeds = new float[] { 5f, 10f, 15f, 20f, 30f, 40f, 50f, 60f, 70f }; - private static float[] collectorRadii = new float[] { 3f, 5f, 10f, 15f, 20f, 30f, 40f, 50f }; - private static VehicleDrivingFlags[] drivingFlags = new VehicleDrivingFlags[] { VehicleDrivingFlags.Normal, VehicleDrivingFlags.StopAtDestination }; + private static UIMenuListScrollerItem changeWaypointType = new UIMenuListScrollerItem("New Waypoint Type", "", waypointTypes); + private static UIMenuNumericScrollerItem changeWaypointSpeed; + private static UIMenuNumericScrollerItem changeCollectorRadius = new UIMenuNumericScrollerItem("New Collection Radius", "The distance from this waypoint in meters vehicles will be collected", 1, 50, 1); + private static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path"); + private static UIMenuCheckboxItem updateWaypointPosition; internal static void InstantiateMenu() { @@ -46,20 +44,19 @@ namespace SceneManager editWaypointMenu.AddItem(editWaypoint); editWaypoint.Index = 0; - editWaypointMenu.AddItem(changeWaypointType = new UIMenuListScrollerItem("Change Waypoint Type", "", new [] { "Drive To", "Stop" })); + editWaypointMenu.AddItem(changeWaypointType); changeWaypointType.Index = Array.IndexOf(drivingFlags, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].DrivingFlag); - Game.LogTrivial($"Waypoint speed: {PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed}"); - editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuListScrollerItem("Change Waypoint Speed", "", waypointSpeeds)); - changeWaypointSpeed.Index = Array.IndexOf(waypointSpeeds, MathHelper.ConvertMetersPerSecondToMilesPerHour(PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed)); + //Game.LogTrivial($"Waypoint speed: {PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed}"); + editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuNumericScrollerItem("New Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 80, 5)); + changeWaypointSpeed.Value = (int)MathHelper.ConvertMetersPerSecondToMilesPerHour(PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed); editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector Waypoint", PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].IsCollector)); - editWaypointMenu.AddItem(changeCollectorRadius = new UIMenuListScrollerItem("Change Collection Radius", "", collectorRadii)); - if (PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].CollectorRadius != 0) - { - changeCollectorRadius.Index = Array.IndexOf(collectorRadii, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].CollectorRadius); - } + editWaypointMenu.AddItem(changeCollectorRadius); + changeCollectorRadius.Value = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].CollectorRadius != 0 + ? (int)PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].CollectorRadius + : changeCollectorRadius.Minimum; editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); @@ -81,7 +78,8 @@ namespace SceneManager if(scrollerItem == editWaypoint) { changeWaypointType.Index = Array.IndexOf(drivingFlags, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].DrivingFlag); - changeWaypointSpeed.Index = Array.IndexOf(waypointSpeeds, MathHelper.ConvertMetersPerSecondToMilesPerHour(PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed)); + //changeWaypointSpeed.Index = Array.IndexOf(waypointSpeeds, MathHelper.ConvertMetersPerSecondToMilesPerHour(PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed)); + changeWaypointSpeed.Value = (int)MathHelper.ConvertMetersPerSecondToMilesPerHour(PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed); collectorWaypoint.Checked = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].IsCollector; changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; } @@ -102,9 +100,8 @@ namespace SceneManager if (selectedItem == editUpdateWaypoint) { - currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], SetDriveSpeedForWaypoint(), collectorWaypoint.Checked, changeCollectorRadius.SelectedItem, updateWaypointPosition.Checked); - //currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], waypointSpeeds[changeWaypointSpeed.Index], collectorWaypoint.Checked, collectorRadii[changeCollectorRadius.Index], updateWaypointPosition.Checked); - Game.LogTrivial($"Updated path {currentPath.PathNum} waypoint {currentWaypoint.Number}: Driving flag is {drivingFlags[changeWaypointType.Index].ToString()}, speed is {waypointSpeeds[changeWaypointSpeed.Index].ToString()}, collector is {currentWaypoint.IsCollector}"); + currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], SetDriveSpeedForWaypoint(), collectorWaypoint.Checked, changeCollectorRadius.Value, updateWaypointPosition.Checked); + Game.LogTrivial($"Updated path {currentPath.PathNum} waypoint {currentWaypoint.Number}: Driving flag is {drivingFlags[changeWaypointType.Index].ToString()}, speed is {changeWaypointSpeed.Value}, collector is {currentWaypoint.IsCollector}"); if (currentPath.Waypoints.Count < 2 && currentPath.Waypoints[0].DrivingFlag == VehicleDrivingFlags.StopAtDestination) { @@ -134,7 +131,6 @@ namespace SceneManager currentWaypoint.CollectorRadiusBlip.Delete(); } currentPath.Waypoints.Remove(currentWaypoint); - pathWaypoints.RemoveAt(editWaypoint.Index); foreach (Waypoint wp in currentPath.Waypoints) { @@ -161,13 +157,13 @@ namespace SceneManager if (SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH) { //Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); - convertedSpeed = MathHelper.ConvertMilesPerHourToMetersPerSecond(changeWaypointSpeed.SelectedItem); + convertedSpeed = MathHelper.ConvertMilesPerHourToMetersPerSecond(changeWaypointSpeed.Value); //Game.LogTrivial($"Converted speed: {convertedSpeed}m/s"); } else { //Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); - convertedSpeed = MathHelper.ConvertKilometersPerHourToMetersPerSecond(changeWaypointSpeed.SelectedItem); + convertedSpeed = MathHelper.ConvertKilometersPerHourToMetersPerSecond(changeWaypointSpeed.Value); //Game.LogTrivial($"Converted speed: {convertedSpeed}m/s"); } From cfd99f7f9a0b12fe1961dab30dae90186d5d9f70 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 25 Aug 2020 20:53:41 -0600 Subject: [PATCH 052/276] Replaced float menu scroller items with numerical scrollers. Reconfigured when a path is considered "being created" --- SceneManager/Menus/PathCreationMenu.cs | 163 +++++++++++-------------- 1 file changed, 70 insertions(+), 93 deletions(-) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index d969275..d248301 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -9,17 +9,15 @@ namespace SceneManager { class PathCreationMenu { + + private static VehicleDrivingFlags[] drivingFlags = new VehicleDrivingFlags[] { VehicleDrivingFlags.Normal, VehicleDrivingFlags.StopAtDestination }; // Implement custom driving flag for normal + private static string[] waypointTypes = new string[] { "Drive To", "Stop" }; public static UIMenu pathCreationMenu { get; private set; } private static UIMenuItem trafficAddWaypoint, trafficRemoveWaypoint, trafficEndPath; - private static UIMenuListScrollerItem waypointType; - private static UIMenuListScrollerItem waypointSpeed; - private static UIMenuListScrollerItem collectorRadius; - private static UIMenuCheckboxItem collectorWaypoint; - - private static List waypointTypes = new List() { "Drive To", "Stop" }; - private static List waypointSpeeds = new List() { 5f, 10f, 15f, 20f, 30f, 40f, 50f, 60f, 70f }; - private static List collectorRadii = new List() { 3f, 5f, 10f, 15f, 20f, 30f, 40f, 50f }; - private static VehicleDrivingFlags[] drivingFlags = new VehicleDrivingFlags[] { VehicleDrivingFlags.Normal, VehicleDrivingFlags.StopAtDestination }; // Implement custom driving flag for normal + private static UIMenuListScrollerItem waypointType = new UIMenuListScrollerItem("Waypoint Type", "", waypointTypes); + private static UIMenuNumericScrollerItem waypointSpeed; + private static UIMenuNumericScrollerItem collectorRadius = new UIMenuNumericScrollerItem("Collection Radius", "The distance from this waypoint in meters vehicles will be collected", 1, 50, 1); + private static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path"); internal static void InstantiateMenu() { @@ -30,10 +28,12 @@ namespace SceneManager public static void BuildPathCreationMenu() { - pathCreationMenu.AddItem(waypointType = new UIMenuListScrollerItem("Waypoint Type", "", waypointTypes)); - pathCreationMenu.AddItem(waypointSpeed = new UIMenuListScrollerItem($"Waypoint Speed (in {SettingsMenu.speedUnits.SelectedItem})", "", waypointSpeeds)); - pathCreationMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector", true)); - pathCreationMenu.AddItem(collectorRadius = new UIMenuListScrollerItem("Collection Radius", "", collectorRadii)); + pathCreationMenu.AddItem(waypointType); + pathCreationMenu.AddItem(waypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 80, 5)); + waypointSpeed.Index = 0; + pathCreationMenu.AddItem(collectorWaypoint); + pathCreationMenu.AddItem(collectorRadius); + collectorRadius.Index = 0; pathCreationMenu.AddItem(trafficAddWaypoint = new UIMenuItem("Add waypoint")); trafficAddWaypoint.ForeColor = Color.Gold; pathCreationMenu.AddItem(trafficRemoveWaypoint = new UIMenuItem("Remove last waypoint")); @@ -61,9 +61,37 @@ namespace SceneManager // Do I need to implement a distance restriction? Idiots place waypoints unnecessarily close, possibly causing AI to drive in circles if (selectedItem == trafficAddWaypoint) { + var anyPathsExist = PathMainMenu.GetPaths().Count > 0; + + // If no paths exist, then add a new path to the collection at index 0. If paths do exist, then we want to add a new path at the first null index if there are no non-null paths where pathFinished = false + if (!anyPathsExist) + { + AddNewPathToPathsCollection(PathMainMenu.GetPaths(), 0); + + if (SettingsMenu.debugGraphics.Checked) + { + GameFiber.StartNew(() => + { + DebugGraphics.LoopToDrawDebugGraphics(SettingsMenu.debugGraphics, PathMainMenu.GetPaths()[0]); + }); + } + } + else if(anyPathsExist && !PathMainMenu.GetPaths().Any(p => p != null && !p.PathFinished)) + { + AddNewPathToPathsCollection(PathMainMenu.GetPaths(), PathMainMenu.GetPaths().IndexOf(PathMainMenu.GetPaths().Where(p => p.PathFinished).First()) + 1); + + if (SettingsMenu.debugGraphics.Checked) + { + GameFiber.StartNew(() => + { + DebugGraphics.LoopToDrawDebugGraphics(SettingsMenu.debugGraphics, PathMainMenu.GetPaths().Where(p => p != null && !p.PathFinished).First()); + }); + } + } + var firstNonNullPath = PathMainMenu.GetPaths().Where(p => p != null && !p.PathFinished).First(); var pathIndex = PathMainMenu.GetPaths().IndexOf(firstNonNullPath); - var currentPath = pathIndex + 1; + var currentPath = firstNonNullPath.PathNum; var currentWaypoint = PathMainMenu.GetPaths()[pathIndex].Waypoints.Count + 1; var drivingFlag = drivingFlags[waypointType.Index]; var blip = CreateWaypointBlip(pathIndex); @@ -71,21 +99,20 @@ namespace SceneManager if (collectorWaypoint.Checked) { var yieldZone = SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH - ? World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index])) - : World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index])); + ? World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeed.Value)) + : World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeed.Value)); - PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, collectorRadii[collectorRadius.Index], yieldZone)); + PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, collectorRadius.Value, yieldZone)); } else { PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip)); } - Game.LogTrivial($"Waypoint speed: {PathMainMenu.GetPaths()[pathIndex].Waypoints.Last().Speed}"); Game.LogTrivial($"[Path {currentPath}] Waypoint {currentWaypoint} ({drivingFlag.ToString()}) added"); ToggleTrafficEndPathMenuItem(pathIndex); trafficRemoveWaypoint.Enabled = true; - PathMainMenu.createNewPath.Text = "Continue Creating Current Path"; + PathMainMenu.createNewPath.Text = $"Continue Creating Path {currentPath}"; } if (selectedItem == trafficRemoveWaypoint) @@ -125,66 +152,39 @@ namespace SceneManager var currentPath = PathMainMenu.GetPaths()[i]; if (PathMainMenu.GetPaths().ElementAtOrDefault(i) != null && !currentPath.PathFinished) { - // If the path has one stop waypoint or at least two waypoints, finish the path and start the vehicle collector loop, else show user the error and delete any waypoints they made and clear the invalid path - if (currentPath.Waypoints.Count >= 2 || (currentPath.Waypoints.Count == 1 && currentPath.Waypoints[0].DrivingFlag == VehicleDrivingFlags.StopAtDestination)) + Game.LogTrivial($"[Path Creation] Path {currentPath.PathNum} finished with {currentPath.Waypoints.Count} waypoints."); + Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Path {i + 1} complete."); + currentPath.Waypoints.Last().Blip.Color = Color.OrangeRed; + if (currentPath.Waypoints.Last().CollectorRadiusBlip) { - Game.LogTrivial($"[Path Creation] Path {i + 1} finished with {currentPath.Waypoints.Count} waypoints."); - Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Path {i + 1} complete."); - currentPath.Waypoints.Last().Blip.Color = Color.OrangeRed; - if (currentPath.Waypoints.Last().CollectorRadiusBlip) - { - currentPath.Waypoints.Last().CollectorRadiusBlip.Color = Color.OrangeRed; - } - currentPath.FinishPath(); - currentPath.EnablePath(); - currentPath.SetPathNumber(i + 1); - PathMainMenu.AddPathToPathCountList(i, currentPath.PathNum); - - //GameFiber InitialWaypointVehicleCollectorFiber = new GameFiber(() => TrafficPathing.InitialWaypointVehicleCollector(paths[i])); - //InitialWaypointVehicleCollectorFiber.Start(); - - // For each waypoint in the path's WaypointData, start a collector game fiber and loop while the path and waypoint exist, and while the path is enabled - foreach (Waypoint wd in PathMainMenu.GetPaths()[i].Waypoints) - { - GameFiber WaypointVehicleCollectorFiber = new GameFiber(() => VehicleCollector.StartCollectingAtWaypoint(PathMainMenu.GetPaths(), PathMainMenu.GetPaths()[i], wd)); - WaypointVehicleCollectorFiber.Start(); - - //GameFiber AssignStopForVehiclesFlagFiber = new GameFiber(() => TrafficPathing.AssignStopForVehiclesFlag(PathMainMenu.GetPaths(), PathMainMenu.GetPaths()[i], wd)); - //AssignStopForVehiclesFlagFiber.Start(); - } - - MenuManager.menuPool.CloseAllMenus(); - PathMainMenu.pathMainMenu.Clear(); - PathMainMenu.BuildPathMenu(); - PathMainMenu.pathMainMenu.Visible = true; - break; + currentPath.Waypoints.Last().CollectorRadiusBlip.Color = Color.OrangeRed; } - else + currentPath.FinishPath(); + currentPath.EnablePath(); + currentPath.SetPathNumber(i + 1); + PathMainMenu.AddPathToPathCountList(i, currentPath.PathNum); + + // For each waypoint in the path's WaypointData, start a collector game fiber and loop while the path and waypoint exist, and while the path is enabled + foreach (Waypoint wd in PathMainMenu.GetPaths()[i].Waypoints) { - Game.LogTrivial($"[Path Error] A minimum of 2 waypoints is required."); - Game.DisplayNotification($"~o~Scene Manager\n~r~[Error]~w~ A minimum of 2 waypoints or one stop waypoint is required to create a path."); - foreach (Waypoint wp in PathMainMenu.GetPaths()[i].Waypoints) - { - wp.Blip.Delete(); - if (wp.CollectorRadiusBlip) - { - wp.CollectorRadiusBlip.Delete(); - } - } - PathMainMenu.GetPaths()[i].Waypoints.Clear(); - PathMainMenu.GetPaths().RemoveAt(i); - break; + GameFiber WaypointVehicleCollectorFiber = new GameFiber(() => VehicleCollector.StartCollectingAtWaypoint(PathMainMenu.GetPaths(), PathMainMenu.GetPaths()[i], wd)); + WaypointVehicleCollectorFiber.Start(); } + + MenuManager.menuPool.CloseAllMenus(); + PathMainMenu.pathMainMenu.Clear(); + PathMainMenu.BuildPathMenu(); + trafficEndPath.Enabled = false; + PathMainMenu.pathMainMenu.Visible = true; + break; } } - // "Refresh" the menu to reflect the new path - //TrafficMenu.RebuildTrafficMenu(); } } private static void ToggleTrafficEndPathMenuItem(int pathIndex) { - if ((PathMainMenu.GetPaths()[pathIndex].Waypoints.Count == 1 && PathMainMenu.GetPaths()[pathIndex].Waypoints.First().DrivingFlag == VehicleDrivingFlags.StopAtDestination) || (PathMainMenu.GetPaths()[pathIndex].Waypoints.Count > 1)) + if (PathMainMenu.GetPaths()[pathIndex].Waypoints.Count > 0) { trafficEndPath.Enabled = true; } @@ -200,13 +200,13 @@ namespace SceneManager if (SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH) { //Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); - convertedSpeed = MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index]); + convertedSpeed = MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeed.Value); //Game.LogTrivial($"Converted speed: {convertedSpeed}m/s"); } else { //Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); - convertedSpeed = MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeeds[waypointSpeed.Index]); + convertedSpeed = MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeed.Value); //Game.LogTrivial($"Converted speed: {convertedSpeed}m/s"); } @@ -243,28 +243,5 @@ namespace SceneManager trafficRemoveWaypoint.Enabled = false; trafficEndPath.Enabled = false; } - - //private static void RefreshPathMainMenu() - //{ - // trafficRemoveWaypoint.Enabled = true; - // MenuManager.pathMenu.Clear(); - // //MenuManager.pathMenu.AddItem(PathMainMenu.AddNewMenuItem()) - // MenuManager.pathMenu.AddItem(PathMainMenu.createNewPath = new UIMenuItem("Continue Creating Current Path")); - // MenuManager.pathMenu.AddItem(PathMainMenu.deleteAllPaths = new UIMenuItem("Delete All Paths")); - // MenuManager.pathMenu.AddItem(PathMainMenu.directDriver = new UIMenuListScrollerItem("Direct nearest driver to path", "")); - // MenuManager.pathMenu.AddItem(PathMainMenu.dismissDriver = new UIMenuListScrollerItem("Dismiss nearest driver", "")); - - // if (PathMainMenu.GetPaths().Count == 8) - // { - // PathMainMenu.createNewPath.Enabled = false; - // } - // if (PathMainMenu.GetPaths().Count == 0) - // { - // PathMainMenu.editPath.Enabled = false; - // PathMainMenu.deleteAllPaths.Enabled = false; - // PathMainMenu.disableAllPaths.Enabled = false; - // PathMainMenu.directDriver.Enabled = false; - // } - //} } } From 82d1e5293cd2e25e14a3a5b1f311c58dcc307500 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 25 Aug 2020 20:54:09 -0600 Subject: [PATCH 053/276] Refactored due to changing when a path is considered "being created" --- SceneManager/Menus/PathMainMenu.cs | 31 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index b1174d2..9acd8e7 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -173,7 +173,6 @@ namespace SceneManager { if (selectedItem == createNewPath) { - createNewPath.Text = "Continue Creating Current Path"; pathMainMenu.Visible = false; PathCreationMenu.pathCreationMenu.Visible = true; @@ -183,24 +182,24 @@ namespace SceneManager if (paths.ElementAtOrDefault(i) != null && paths[i].PathFinished == false) { //Game.LogTrivial($"pathFinished: {paths[i].PathFinished}"); - Game.LogTrivial($"Resuming path {i + 1}"); - Game.DisplayNotification($"~o~Scene Manager\n~y~[Creating]~w~ Resuming path {i + 1}"); + Game.LogTrivial($"Resuming path {paths[i].PathNum}"); + Game.DisplayNotification($"~o~Scene Manager\n~y~[Creating]~w~ Resuming path {paths[i].PathNum}"); break; } - else if (paths.ElementAtOrDefault(i) == null) - { - // Do we only want to do this once the first waypoint is added? - PathCreationMenu.AddNewPathToPathsCollection(paths, i); + //else if (paths.ElementAtOrDefault(i) == null) + //{ + // Do we only want to do this once the first waypoint is added ? + // PathCreationMenu.AddNewPathToPathsCollection(paths, i); - if (SettingsMenu.debugGraphics.Checked) - { - GameFiber.StartNew(() => - { - DebugGraphics.LoopToDrawDebugGraphics(SettingsMenu.debugGraphics, paths[i]); - }); - } - break; - } + // if (SettingsMenu.debugGraphics.Checked) + // { + // GameFiber.StartNew(() => + // { + // DebugGraphics.LoopToDrawDebugGraphics(SettingsMenu.debugGraphics, paths[i]); + // }); + // } + // break; + //} } } From a052aefc8a9eb2ed54d3dc359a4752e93206b0f6 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 25 Aug 2020 20:56:15 -0600 Subject: [PATCH 054/276] Removed unused Redirected property --- SceneManager/Menus/PathMainMenu.cs | 2 +- SceneManager/Object Classes/CollectedVehicle.cs | 12 ++---------- SceneManager/VehicleCollector.cs | 2 +- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index 9acd8e7..3ff1fd4 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -270,7 +270,7 @@ namespace SceneManager } else { - VehicleCollector.collectedVehicles.Add(nearbyVehicle.LicensePlate, new CollectedVehicle(nearbyVehicle, nearbyVehicle.LicensePlate, paths[directDriver.Index].Waypoints[0].Path, paths[directDriver.Index].Waypoints.Count, 1, false, false, true)); + VehicleCollector.collectedVehicles.Add(nearbyVehicle.LicensePlate, new CollectedVehicle(nearbyVehicle, nearbyVehicle.LicensePlate, paths[directDriver.Index].Waypoints[0].Path, paths[directDriver.Index].Waypoints.Count, 1, false, false)); Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} not in collection, adding to collection for path {paths[directDriver.Index].PathNum} with {paths[directDriver.Index].Waypoints.Count} waypoints"); if (directOptions.SelectedItem == "First waypoint") diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index c9892a8..acda8ec 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -12,9 +12,8 @@ namespace SceneManager public bool TasksAssigned { get; private set; } public bool DismissNow { get; private set; } public bool StoppedAtWaypoint { get; private set; } - public bool Redirected { get; private set; } - public CollectedVehicle(Vehicle vehicle, string licensePlate, int path, int totalWaypoints, int currentWaypoint, bool tasksAssigned, bool dismissNow, bool redirected) + public CollectedVehicle(Vehicle vehicle, string licensePlate, int path, int totalWaypoints, int currentWaypoint, bool tasksAssigned, bool dismissNow) { Vehicle = vehicle; LicensePlate = licensePlate; @@ -23,10 +22,9 @@ namespace SceneManager CurrentWaypoint = currentWaypoint; TasksAssigned = tasksAssigned; DismissNow = dismissNow; - Redirected = redirected; } - public void AssignPropertiesFromDirectedTask(int pathNum, int totalPathWaypoints, int currentWaypoint, bool tasksAssigned, bool dismiss, bool stoppedAtWaypoint)//, bool redirected) + public void AssignPropertiesFromDirectedTask(int pathNum, int totalPathWaypoints, int currentWaypoint, bool tasksAssigned, bool dismiss, bool stoppedAtWaypoint) { Path = pathNum; TotalWaypoints = totalPathWaypoints; @@ -34,7 +32,6 @@ namespace SceneManager TasksAssigned = tasksAssigned; DismissNow = dismiss; StoppedAtWaypoint = stoppedAtWaypoint; - //Redirected = redirected; } public void SetCurrentWaypoint(int currentWaypoint) @@ -56,10 +53,5 @@ namespace SceneManager { StoppedAtWaypoint = stoppedAtWaypoint; } - - public void SetRedirected(bool redirected) - { - Redirected = redirected; - } } } diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index e12ac83..abe077c 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -100,7 +100,7 @@ namespace SceneManager private static CollectedVehicle AddVehicleToCollection(Path path, Waypoint waypoint, Vehicle v) { - var collectedVehicle = new CollectedVehicle(v, v.LicensePlate, path.PathNum, path.Waypoints.Count, waypoint.Number, true, false, false); + var collectedVehicle = new CollectedVehicle(v, v.LicensePlate, path.PathNum, path.Waypoints.Count, waypoint.Number, true, false); collectedVehicles.Add(v.LicensePlate, collectedVehicle); Game.LogTrivial($"[WaypointVehicleCollector] Added {v.Model.Name} to collection from path {path.PathNum}, waypoint {waypoint.Number}."); return collectedVehicle; From 1918d5c644b7c0055a7367006e9207812c4a5f7f Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 25 Aug 2020 20:56:29 -0600 Subject: [PATCH 055/276] Removed unused reference to System.Collections.Immutable --- SceneManager/SceneManager.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/SceneManager/SceneManager.csproj b/SceneManager/SceneManager.csproj index 4b5f3dc..f8cde45 100644 --- a/SceneManager/SceneManager.csproj +++ b/SceneManager/SceneManager.csproj @@ -38,7 +38,6 @@ D:\Program Files\Rockstar Games\Grand Theft Auto V\plugins\LSPDFR\RagePluginHookSDK.dll - From fc76ea1f80a9cb1c054c94d11f4c333c5e2d5922 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Wed, 26 Aug 2020 04:38:47 -0600 Subject: [PATCH 056/276] Replaced Path's IsFinished bool with State enum --- SceneManager/Menus/PathMainMenu.cs | 16 +--------- SceneManager/Object Classes/Path.cs | 45 ++++++++++++++++------------- 2 files changed, 26 insertions(+), 35 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index 3ff1fd4..ad5223b 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -179,27 +179,13 @@ namespace SceneManager // For each element in paths, determine if the element exists but is not finished yet, or if it doesn't exist, create it. for (int i = 0; i <= paths.Count; i++) { - if (paths.ElementAtOrDefault(i) != null && paths[i].PathFinished == false) + if (paths.ElementAtOrDefault(i) != null && paths[i].State == State.Creating) { //Game.LogTrivial($"pathFinished: {paths[i].PathFinished}"); Game.LogTrivial($"Resuming path {paths[i].PathNum}"); Game.DisplayNotification($"~o~Scene Manager\n~y~[Creating]~w~ Resuming path {paths[i].PathNum}"); break; } - //else if (paths.ElementAtOrDefault(i) == null) - //{ - // Do we only want to do this once the first waypoint is added ? - // PathCreationMenu.AddNewPathToPathsCollection(paths, i); - - // if (SettingsMenu.debugGraphics.Checked) - // { - // GameFiber.StartNew(() => - // { - // DebugGraphics.LoopToDrawDebugGraphics(SettingsMenu.debugGraphics, paths[i]); - // }); - // } - // break; - //} } } diff --git a/SceneManager/Object Classes/Path.cs b/SceneManager/Object Classes/Path.cs index 3a4921f..22991cc 100644 --- a/SceneManager/Object Classes/Path.cs +++ b/SceneManager/Object Classes/Path.cs @@ -2,18 +2,19 @@ namespace SceneManager { - public enum Status + public enum State { - IsEnabled, - IsDisabled + Uninitialized, + Creating, + Finished } public class Path { public int PathNum { get; private set; } - public bool PathFinished { get; private set; } + //public bool PathFinished { get; private set; } public bool IsEnabled { get; private set; } - public Status Status { get; private set; } + public State State { get; set; } public List Waypoints = new List(); @@ -41,16 +42,10 @@ namespace SceneManager PathNum = pathNum; } - public void FinishPath() - { - PathFinished = true; - } - - public void DisablePath() - { - IsEnabled = false; - LowerWaypointBlipsOpacity(); - } + //public void FinishPath() + //{ + // PathFinished = true; + //} private void LowerWaypointBlipsOpacity() { @@ -64,11 +59,6 @@ namespace SceneManager } } - public void EnablePath() - { - IsEnabled = true; - } - private void RestoreWaypointBlipsOpacity() { foreach (Waypoint wp in Waypoints) @@ -80,5 +70,20 @@ namespace SceneManager } } } + + public void DisablePath() + { + IsEnabled = false; + LowerWaypointBlipsOpacity(); + } + + public void EnablePath() + { + IsEnabled = true; + } + + + + } } From 338fa61c94243f879ae8f00cd482cdb257feef64 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Wed, 26 Aug 2020 16:15:49 -0600 Subject: [PATCH 057/276] Added condition to give drivers to empty vehicles resulting from GTA V memory management --- SceneManager/VehicleCollector.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index abe077c..344badc 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -74,7 +74,7 @@ namespace SceneManager private static Vehicle[] GetNearbyVehicles(Vector3 OriginPosition, float radius) { - return (from x in World.GetAllVehicles() where !x.IsTrailer && x.DistanceTo(OriginPosition) < radius select x).ToArray(); + return (from x in World.GetAllVehicles() where !x.IsTrailer && x.DistanceTo(OriginPosition) <= radius select x).ToArray(); } private static void AssignStopForVehiclesFlag(List paths, Path path, Waypoint waypointData) @@ -116,10 +116,20 @@ namespace SceneManager private static bool IsValidForCollection(this Vehicle v) { - if (v && v.HasDriver && v.Driver && v.Driver.IsAlive && v != Game.LocalPlayer.Character.CurrentVehicle && (v.IsCar || v.IsBike || v.IsBicycle || v.IsQuadBike || (v.HasSiren && !v.IsSirenOn))) + if(v && v.Speed > 0 && v.IsOnAllWheels && !v != Game.LocalPlayer.Character.CurrentVehicle && (v.IsCar || v.IsBike || v.IsBicycle || v.IsQuadBike || (v.HasSiren && !v.IsSirenOn))) { + if (!v.HasDriver) + { + v.CreateRandomDriver(); + v.Driver.IsPersistent = true; + v.Driver.BlockPermanentEvents = true; + } return true; } + //if (v && v.HasDriver && v.Driver && v.Driver.IsAlive && v != Game.LocalPlayer.Character.CurrentVehicle && (v.IsCar || v.IsBike || v.IsBicycle || v.IsQuadBike || (v.HasSiren && !v.IsSirenOn))) + //{ + // return true; + //} else { return false; From 773f76a7de7ab44ce305dd1b030a97a31975fd71 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Wed, 26 Aug 2020 16:16:31 -0600 Subject: [PATCH 058/276] Updated code to reference Path State enum based on recent refactor --- SceneManager/Menus/PathCreationMenu.cs | 24 +++++++++++++----------- SceneManager/Object Classes/Path.cs | 7 ++++--- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index d248301..6bf27a0 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -76,20 +76,20 @@ namespace SceneManager }); } } - else if(anyPathsExist && !PathMainMenu.GetPaths().Any(p => p != null && !p.PathFinished)) + else if(anyPathsExist && !PathMainMenu.GetPaths().Any(p => p != null && p.State == State.Creating)) { - AddNewPathToPathsCollection(PathMainMenu.GetPaths(), PathMainMenu.GetPaths().IndexOf(PathMainMenu.GetPaths().Where(p => p.PathFinished).First()) + 1); + AddNewPathToPathsCollection(PathMainMenu.GetPaths(), PathMainMenu.GetPaths().IndexOf(PathMainMenu.GetPaths().Where(p => p.State == State.Finished).First()) + 1); if (SettingsMenu.debugGraphics.Checked) { GameFiber.StartNew(() => { - DebugGraphics.LoopToDrawDebugGraphics(SettingsMenu.debugGraphics, PathMainMenu.GetPaths().Where(p => p != null && !p.PathFinished).First()); + DebugGraphics.LoopToDrawDebugGraphics(SettingsMenu.debugGraphics, PathMainMenu.GetPaths().Where(p => p != null && p.State == State.Creating).First()); }); } } - var firstNonNullPath = PathMainMenu.GetPaths().Where(p => p != null && !p.PathFinished).First(); + var firstNonNullPath = PathMainMenu.GetPaths().Where(p => p != null && p.State == State.Creating).First(); var pathIndex = PathMainMenu.GetPaths().IndexOf(firstNonNullPath); var currentPath = firstNonNullPath.PathNum; var currentWaypoint = PathMainMenu.GetPaths()[pathIndex].Waypoints.Count + 1; @@ -120,7 +120,7 @@ namespace SceneManager // Loop through each path and find the first one which isn't finished, then delete the path's last waypoint and corresponding blip for (int i = 0; i < PathMainMenu.GetPaths().Count; i++) { - if (PathMainMenu.GetPaths().ElementAtOrDefault(i) != null && !PathMainMenu.GetPaths()[i].PathFinished) + if (PathMainMenu.GetPaths().ElementAtOrDefault(i) != null && PathMainMenu.GetPaths()[i].State == State.Creating) { Game.LogTrivial($"[Path {i + 1}] {PathMainMenu.GetPaths()[i].Waypoints.Last().DrivingFlag.ToString()} waypoint removed"); PathMainMenu.GetPaths()[i].Waypoints.Last().Blip.Delete(); @@ -150,7 +150,7 @@ namespace SceneManager for (int i = 0; i < PathMainMenu.GetPaths().Count; i++) { var currentPath = PathMainMenu.GetPaths()[i]; - if (PathMainMenu.GetPaths().ElementAtOrDefault(i) != null && !currentPath.PathFinished) + if (PathMainMenu.GetPaths().ElementAtOrDefault(i) != null && currentPath.State == State.Creating) { Game.LogTrivial($"[Path Creation] Path {currentPath.PathNum} finished with {currentPath.Waypoints.Count} waypoints."); Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Path {i + 1} complete."); @@ -159,7 +159,8 @@ namespace SceneManager { currentPath.Waypoints.Last().CollectorRadiusBlip.Color = Color.OrangeRed; } - currentPath.FinishPath(); + currentPath.State = State.Finished; + //currentPath.FinishPath(); currentPath.EnablePath(); currentPath.SetPathNumber(i + 1); PathMainMenu.AddPathToPathCountList(i, currentPath.PathNum); @@ -172,9 +173,10 @@ namespace SceneManager } MenuManager.menuPool.CloseAllMenus(); - PathMainMenu.pathMainMenu.Clear(); - PathMainMenu.BuildPathMenu(); - trafficEndPath.Enabled = false; + pathCreationMenu.Reset(true, true); // Trying to see if we can get away with resetting the menu instead of rebuilding it + //PathMainMenu.pathMainMenu.Clear(); + //PathMainMenu.BuildPathMenu(); + //trafficEndPath.Enabled = false; PathMainMenu.pathMainMenu.Visible = true; break; } @@ -239,7 +241,7 @@ namespace SceneManager var pathNum = pathIndex + 1; Game.LogTrivial($"Creating path {pathNum}"); Game.DisplayNotification($"~o~Scene Manager\n~y~[Creating]~w~ Path {pathNum} started."); - paths.Insert(pathIndex, new Path(pathNum, false)); + paths.Insert(pathIndex, new Path(pathNum, State.Creating)); trafficRemoveWaypoint.Enabled = false; trafficEndPath.Enabled = false; } diff --git a/SceneManager/Object Classes/Path.cs b/SceneManager/Object Classes/Path.cs index 22991cc..76f2813 100644 --- a/SceneManager/Object Classes/Path.cs +++ b/SceneManager/Object Classes/Path.cs @@ -21,15 +21,16 @@ namespace SceneManager public Path(int pathNum, bool pathFinished, bool pathDisabled, List waypoints) { PathNum = pathNum; - PathFinished = pathFinished; + //PathFinished = pathFinished; IsEnabled = pathDisabled; Waypoints = waypoints; } - public Path(int pathNum, bool pathFinished) + public Path(int pathNum, State pathState) { PathNum = pathNum; - PathFinished = pathFinished; + State = pathState; + //PathFinished = pathFinished; } public void SetPathStatus(bool status) From 99cb0397977a0830e702746ffa0a3b887f8cdf9e Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Wed, 26 Aug 2020 18:35:45 -0600 Subject: [PATCH 059/276] Fixed flares spawning upright --- SceneManager/Menus/BarrierMenu.cs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index e528091..7e65fa5 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -193,15 +193,20 @@ namespace SceneManager private static void SpawnFlare() { var flare = new Weapon("weapon_flare", shadowBarrier.Position, 1); - //flare.SetPositionWithSnap(shadowBarrier.Position); - // The purpose of this fiber is to allow the flare to spawn and fall to the ground naturally before freezing its position because you can't spawn it on the ground gracefully (it stands upright) - //GameFiber.StartNew(delegate - //{ - // GameFiber.Sleep(1000); - // flare.IsPositionFrozen = true; - // flare.IsCollisionEnabled = false; - //}); + Rage.Native.NativeFunction.Natives.SET_ENTITY_DYNAMIC(flare, true); + GameFiber.StartNew(() => + { + while (flare && flare.HeightAboveGround > 0.05f) + { + GameFiber.Yield(); + } + GameFiber.Sleep(1000); + if (flare) + { + flare.IsPositionFrozen = true; + } + }); barriers.Add(flare); removeBarrierOptions.Enabled = true; From 028c80035a05ec692e7e0f42f567fe300ba9d03d Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Wed, 26 Aug 2020 18:36:16 -0600 Subject: [PATCH 060/276] Removed SetPathStatus --- SceneManager/Object Classes/Path.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/SceneManager/Object Classes/Path.cs b/SceneManager/Object Classes/Path.cs index 76f2813..3fb5dc5 100644 --- a/SceneManager/Object Classes/Path.cs +++ b/SceneManager/Object Classes/Path.cs @@ -33,11 +33,6 @@ namespace SceneManager //PathFinished = pathFinished; } - public void SetPathStatus(bool status) - { - IsEnabled = status; - } - public void SetPathNumber(int pathNum) { PathNum = pathNum; From 1cd719b0765ce666df01cc90250d88b20d274613 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Wed, 26 Aug 2020 18:36:30 -0600 Subject: [PATCH 061/276] Extracted Settings class to separate file --- SceneManager/EntryPoint.cs | 24 ------------------------ SceneManager/SceneManager.csproj | 1 + SceneManager/Settings.cs | 28 ++++++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 24 deletions(-) create mode 100644 SceneManager/Settings.cs diff --git a/SceneManager/EntryPoint.cs b/SceneManager/EntryPoint.cs index 630a9d0..71e2595 100644 --- a/SceneManager/EntryPoint.cs +++ b/SceneManager/EntryPoint.cs @@ -10,30 +10,6 @@ namespace SceneManager { public class EntryPoint { - internal static class Settings - { - internal static Keys ToggleKey = Keys.T; - internal static Keys ModifierKey = Keys.LShiftKey; - internal static ControllerButtons ToggleButton = ControllerButtons.Y; - internal static ControllerButtons ModifierButton = ControllerButtons.A; - internal static bool EnableHints = true; - //internal static string id = Verification.passThrough(Verification.GetID()); - //internal static string PatronKey = null; // This cannot reference VerifyUser because the file can just be shared and it will always work. Must be manually set to each user's ID - - internal static void LoadSettings() - { - Game.LogTrivial("Loading SceneManager.ini settings"); - InitializationFile ini = new InitializationFile("Plugins/SceneManager.ini"); - ini.Create(); - //PatronKey = ini.ReadString("Patreon","PatronKey", null); - ToggleKey = ini.ReadEnum("Keybindings", "ToggleKey", Keys.T); - ModifierKey = ini.ReadEnum("Keybindings", "ModifierKey", Keys.LShiftKey); - ToggleButton = ini.ReadEnum("Keybindings", "ToggleButton", ControllerButtons.A); - ModifierButton = ini.ReadEnum("Keybindings", "ModifierButton", ControllerButtons.DPadDown); - EnableHints = ini.ReadBoolean("Other Settings", "EnableHints", true); - } - } - public static void Main() { AppDomain.CurrentDomain.DomainUnload += MyTerminationHandler; diff --git a/SceneManager/SceneManager.csproj b/SceneManager/SceneManager.csproj index f8cde45..445b816 100644 --- a/SceneManager/SceneManager.csproj +++ b/SceneManager/SceneManager.csproj @@ -65,6 +65,7 @@ + diff --git a/SceneManager/Settings.cs b/SceneManager/Settings.cs new file mode 100644 index 0000000..9c511ea --- /dev/null +++ b/SceneManager/Settings.cs @@ -0,0 +1,28 @@ +using Rage; +using System.Windows.Forms; + +namespace SceneManager +{ + internal static class Settings + { + internal static Keys ToggleKey = Keys.T; + internal static Keys ModifierKey = Keys.LShiftKey; + internal static ControllerButtons ToggleButton = ControllerButtons.Y; + internal static ControllerButtons ModifierButton = ControllerButtons.A; + internal static bool EnableHints = true; + internal static Object[] barriers; + + internal static void LoadSettings() + { + Game.LogTrivial("Loading SceneManager.ini settings"); + InitializationFile ini = new InitializationFile("Plugins/SceneManager.ini"); + ini.Create(); + + ToggleKey = ini.ReadEnum("Keybindings", "ToggleKey", Keys.T); + ModifierKey = ini.ReadEnum("Keybindings", "ModifierKey", Keys.LShiftKey); + ToggleButton = ini.ReadEnum("Keybindings", "ToggleButton", ControllerButtons.A); + ModifierButton = ini.ReadEnum("Keybindings", "ModifierButton", ControllerButtons.DPadDown); + EnableHints = ini.ReadBoolean("Other Settings", "EnableHints", true); + } + } +} From e7f40c962453910b09ca6d4e076a664dab047fea Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Wed, 26 Aug 2020 19:15:35 -0600 Subject: [PATCH 062/276] Refactored references to new Settings class --- SceneManager/GetUserInput.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/SceneManager/GetUserInput.cs b/SceneManager/GetUserInput.cs index af0fd37..a8a7d20 100644 --- a/SceneManager/GetUserInput.cs +++ b/SceneManager/GetUserInput.cs @@ -27,14 +27,14 @@ namespace SceneManager private static void GetControllerInput() { - if (EntryPoint.Settings.ModifierButton == ControllerButtons.None) + if (Settings.ModifierButton == ControllerButtons.None) { - if (Game.IsControllerButtonDown(EntryPoint.Settings.ToggleButton) && AreMenusClosed()) + if (Game.IsControllerButtonDown(Settings.ToggleButton) && AreMenusClosed()) { MainMenu.mainMenu.Visible = !MainMenu.mainMenu.Visible; } } - else if (Game.IsControllerButtonDownRightNow(EntryPoint.Settings.ModifierButton) && Game.IsControllerButtonDown(EntryPoint.Settings.ToggleButton) && AreMenusClosed()) + else if (Game.IsControllerButtonDownRightNow(Settings.ModifierButton) && Game.IsControllerButtonDown(Settings.ToggleButton) && AreMenusClosed()) { MainMenu.mainMenu.Visible = !MainMenu.mainMenu.Visible; } @@ -42,14 +42,14 @@ namespace SceneManager private static void GetKeyboardInput() { - if (EntryPoint.Settings.ModifierKey == System.Windows.Forms.Keys.None) + if (Settings.ModifierKey == System.Windows.Forms.Keys.None) { - if (Game.IsKeyDown(EntryPoint.Settings.ToggleKey) && AreMenusClosed()) + if (Game.IsKeyDown(Settings.ToggleKey) && AreMenusClosed()) { MainMenu.mainMenu.Visible = !MainMenu.mainMenu.Visible; } } - else if (Game.IsKeyDownRightNow(EntryPoint.Settings.ModifierKey) && Game.IsKeyDown(EntryPoint.Settings.ToggleKey) && AreMenusClosed()) + else if (Game.IsKeyDownRightNow(Settings.ModifierKey) && Game.IsKeyDown(Settings.ToggleKey) && AreMenusClosed()) { MainMenu.mainMenu.Visible = !MainMenu.mainMenu.Visible; } From a7fd140e1f1355768875aab4828255245cc36f65 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Wed, 26 Aug 2020 19:16:28 -0600 Subject: [PATCH 063/276] Created new Hints class. Implemented Hints.Display method. Added option to SettingsMenu to enable/disable hints in-game. --- SceneManager/EntryPoint.cs | 11 +++++------ SceneManager/Hints.cs | 17 +++++++++++++++++ SceneManager/Menus/BarrierMenu.cs | 7 +++---- SceneManager/Menus/SettingsMenu.cs | 17 +++++++++++------ SceneManager/SceneManager.csproj | 1 + 5 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 SceneManager/Hints.cs diff --git a/SceneManager/EntryPoint.cs b/SceneManager/EntryPoint.cs index 71e2595..1fcc7a3 100644 --- a/SceneManager/EntryPoint.cs +++ b/SceneManager/EntryPoint.cs @@ -17,8 +17,7 @@ namespace SceneManager GetAssemblyVersion(); MenuManager.InstantiateMenus(); - if (Settings.EnableHints) - DisplayHintsToOpenMenu(); + DisplayHintsToOpenMenu(); GameFiber UserInputFiber = new GameFiber(() => GetUserInput.LoopForUserInput()); UserInputFiber.Start(); @@ -36,19 +35,19 @@ namespace SceneManager { if (Settings.ModifierKey == Keys.None && Settings.ModifierButton == ControllerButtons.None) { - Game.DisplayNotification($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press the ~b~{Settings.ToggleKey} key ~w~or ~b~{Settings.ToggleButton} button ~w~while on foot"); + Hints.Display($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press the ~b~{Settings.ToggleKey} key ~w~or ~b~{Settings.ToggleButton} button ~w~while on foot"); } else if (Settings.ModifierKey == Keys.None) { - Game.DisplayNotification($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press the ~b~{Settings.ToggleKey} key ~w~or ~b~{Settings.ModifierButton} ~w~+ ~b~{Settings.ToggleButton} buttons ~w~while on foot"); + Hints.Display($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press the ~b~{Settings.ToggleKey} key ~w~or ~b~{Settings.ModifierButton} ~w~+ ~b~{Settings.ToggleButton} buttons ~w~while on foot"); } else if (Settings.ModifierButton == ControllerButtons.None) { - Game.DisplayNotification($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press ~b~{Settings.ModifierKey} ~w~+ ~b~{Settings.ToggleKey} ~w~or the ~b~{Settings.ToggleButton} button ~w~while on foot"); + Hints.Display($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press ~b~{Settings.ModifierKey} ~w~+ ~b~{Settings.ToggleKey} ~w~or the ~b~{Settings.ToggleButton} button ~w~while on foot"); } else { - Game.DisplayNotification($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press the ~b~{Settings.ModifierKey} ~w~+ ~b~{Settings.ToggleKey} keys ~w~or ~b~{Settings.ModifierButton} ~w~+ ~b~{Settings.ToggleButton} buttons ~w~while on foot"); + Hints.Display($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press the ~b~{Settings.ModifierKey} ~w~+ ~b~{Settings.ToggleKey} keys ~w~or ~b~{Settings.ModifierButton} ~w~+ ~b~{Settings.ToggleButton} buttons ~w~while on foot"); } } diff --git a/SceneManager/Hints.cs b/SceneManager/Hints.cs new file mode 100644 index 0000000..b1410be --- /dev/null +++ b/SceneManager/Hints.cs @@ -0,0 +1,17 @@ +using Rage; + +namespace SceneManager +{ + class Hints + { + public static bool Enabled { get; set; } = SettingsMenu.hints.Checked; + + public static void Display(string message) + { + if (Enabled) + { + Game.DisplayNotification($"{message}"); + } + } + } +} diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index 7e65fa5..fc4768e 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -15,7 +15,6 @@ namespace SceneManager public static UIMenu barrierMenu { get; private set; } public static List barriers = new List() { }; - // TODO: Refactor as dictionary private static UIMenuListScrollerItem barrierList = new UIMenuListScrollerItem("Select Barrier", "", new[] { "Large Striped Cone", "Large Cone", "Medium Striped Cone", "Medium Cone", "Roadpole A", "Roadpole B", "Police Barrier", "Road Barrier", "Flare" }); private static string[] barrierObjectNames = new string[] { "prop_mp_cone_01", "prop_roadcone01c", "prop_mp_cone_02", "prop_mp_cone_03", "prop_roadpole_01a", "prop_roadpole_01b", "prop_barrier_work05", "prop_barrier_work06a", "prop_flare_01b" }; private static UIMenuNumericScrollerItem rotateBarrier = new UIMenuNumericScrollerItem("Rotate Barrier", "Rotate the barrier.", 0, 350, 10); @@ -48,12 +47,12 @@ namespace SceneManager public static void CreateShadowBarrier(UIMenu barrierMenu) { - if (EntryPoint.Settings.EnableHints) + if (Settings.EnableHints) { - Game.DisplayNotification($"~o~Scene Manager\n~y~[Hint]~y~ ~w~The shadow cone will disappear if you aim too far away."); + Hints.Display($"~o~Scene Manager\n~y~[Hint]~y~ ~w~The shadow cone will disappear if you aim too far away."); } - //Game.LogTrivial("Creating shadow cone"); + //Game.LogTrivial("Creating shadow barrier"); if (shadowBarrier) shadowBarrier.Delete(); diff --git a/SceneManager/Menus/SettingsMenu.cs b/SceneManager/Menus/SettingsMenu.cs index 2d19bce..e9fdc03 100644 --- a/SceneManager/Menus/SettingsMenu.cs +++ b/SceneManager/Menus/SettingsMenu.cs @@ -7,8 +7,9 @@ namespace SceneManager class SettingsMenu { public static UIMenu settingsMenu { get; private set; } - public static UIMenuCheckboxItem debugGraphics; - public static UIMenuListScrollerItem speedUnits; + public static UIMenuCheckboxItem debugGraphics = new UIMenuCheckboxItem("Enable 3D Waypoints", false), + hints = new UIMenuCheckboxItem("Enable Hints", true); + public static UIMenuListScrollerItem speedUnits = new UIMenuListScrollerItem("Speed Unit of Measure", "", new[] { SpeedUnitsOfMeasure.MPH, SpeedUnitsOfMeasure.KPH }); public enum SpeedUnitsOfMeasure { MPH, @@ -24,8 +25,9 @@ namespace SceneManager public static void BuildSettingsMenu() { - settingsMenu.AddItem(debugGraphics = new UIMenuCheckboxItem("Enable Debug Graphics", false)); - settingsMenu.AddItem(speedUnits = new UIMenuListScrollerItem("Speed Unit of Measure", "", new[] { SpeedUnitsOfMeasure.MPH, SpeedUnitsOfMeasure.KPH })); + settingsMenu.AddItem(debugGraphics); + settingsMenu.AddItem(hints); + settingsMenu.AddItem(speedUnits); settingsMenu.OnCheckboxChange += SettingsMenu_OnCheckboxChange; settingsMenu.OnScrollerChange += SettingsMenu_OnScrollerChange; @@ -35,8 +37,6 @@ namespace SceneManager { if (checkboxItem == debugGraphics) { - // TODO: Fix graphics don't display when new path is created, have to uncheck and re-check the option - // TODO: Add branch for this during path creation ... create temp Waypoint list during path creation, then assign to path[i] after creation? if (debugGraphics.Checked) { foreach (Path path in PathMainMenu.GetPaths()) @@ -48,6 +48,11 @@ namespace SceneManager } } } + + if(checkboxItem == hints) + { + Hints.Enabled = hints.Checked ? true : false; + } } private static void SettingsMenu_OnScrollerChange(UIMenu sender, UIMenuScrollerItem scrollerItem, int oldIndex, int newIndex) diff --git a/SceneManager/SceneManager.csproj b/SceneManager/SceneManager.csproj index 445b816..0c98606 100644 --- a/SceneManager/SceneManager.csproj +++ b/SceneManager/SceneManager.csproj @@ -52,6 +52,7 @@ + From c8874a5186411753fc4b5085060977112132f335 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Wed, 26 Aug 2020 19:30:53 -0600 Subject: [PATCH 064/276] Added null checks for vehicles and drivers. Included valid vehicle check into GetNearbyVehicles method --- SceneManager/AITasking.cs | 11 +++++++++++ SceneManager/VehicleCollector.cs | 19 ++++++++++++------- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 63f6b6e..b80c47a 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -8,6 +8,12 @@ namespace SceneManager { public static void AssignWaypointTasks(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) { + if(!collectedVehicle.Vehicle || !collectedVehicle.Vehicle.Driver) + { + Game.LogTrivial($"Collected vehicle or driver is null"); + return; + } + if (currentWaypoint != null && currentWaypoint.DrivingFlag == VehicleDrivingFlags.StopAtDestination) { StopVehicleAtWaypoint(collectedVehicle); @@ -15,6 +21,11 @@ namespace SceneManager DriveVehicleToNextWaypoint(collectedVehicle, waypoints, currentWaypoint); + if (!collectedVehicle.Vehicle || !collectedVehicle.Vehicle.Driver) + { + Game.LogTrivial($"Collected vehicle or driver is null"); + return; + } Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} all tasks complete."); DismissDriver(collectedVehicle); } diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index 344badc..4999dba 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -48,8 +48,13 @@ namespace SceneManager private static void LoopForNearbyValidVehicles(Path path, Waypoint waypoint) { - foreach (Vehicle vehicle in GetNearbyVehicles(waypoint.Position, waypoint.CollectorRadius).Where(v => v.IsValidForCollection())) + foreach (Vehicle vehicle in GetNearbyVehicles(waypoint.Position, waypoint.CollectorRadius)) { + if (!vehicle) + { + break; + } + // If the vehicle is not in the collection yet if (!collectedVehicles.ContainsKey(vehicle.LicensePlate)) { @@ -72,9 +77,9 @@ namespace SceneManager } } - private static Vehicle[] GetNearbyVehicles(Vector3 OriginPosition, float radius) + private static Vehicle[] GetNearbyVehicles(Vector3 collectorPosition, float radius) { - return (from x in World.GetAllVehicles() where !x.IsTrailer && x.DistanceTo(OriginPosition) <= radius select x).ToArray(); + return (from v in World.GetAllVehicles() where v.IsValidForCollection() && v.DistanceTo(collectorPosition) <= radius select v).ToArray(); } private static void AssignStopForVehiclesFlag(List paths, Path path, Waypoint waypointData) @@ -118,6 +123,10 @@ namespace SceneManager { if(v && v.Speed > 0 && v.IsOnAllWheels && !v != Game.LocalPlayer.Character.CurrentVehicle && (v.IsCar || v.IsBike || v.IsBicycle || v.IsQuadBike || (v.HasSiren && !v.IsSirenOn))) { + if(v.HasDriver && !v.Driver.IsAlive) + { + return false; + } if (!v.HasDriver) { v.CreateRandomDriver(); @@ -126,10 +135,6 @@ namespace SceneManager } return true; } - //if (v && v.HasDriver && v.Driver && v.Driver.IsAlive && v != Game.LocalPlayer.Character.CurrentVehicle && (v.IsCar || v.IsBike || v.IsBicycle || v.IsQuadBike || (v.HasSiren && !v.IsSirenOn))) - //{ - // return true; - //} else { return false; From 0be10cb0ef8f8522dd76e458e06332882620bfc3 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Wed, 26 Aug 2020 19:50:37 -0600 Subject: [PATCH 065/276] Fixed typo in valid vehicle check --- SceneManager/VehicleCollector.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index 4999dba..b4e2e20 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -79,7 +79,7 @@ namespace SceneManager private static Vehicle[] GetNearbyVehicles(Vector3 collectorPosition, float radius) { - return (from v in World.GetAllVehicles() where v.IsValidForCollection() && v.DistanceTo(collectorPosition) <= radius select v).ToArray(); + return (from v in World.GetAllVehicles() where v.IsValidForCollection() && v.DistanceTo(collectorPosition) <= radius select v).ToArray(); //v.IsValidForCollection() } private static void AssignStopForVehiclesFlag(List paths, Path path, Waypoint waypointData) @@ -121,7 +121,7 @@ namespace SceneManager private static bool IsValidForCollection(this Vehicle v) { - if(v && v.Speed > 0 && v.IsOnAllWheels && !v != Game.LocalPlayer.Character.CurrentVehicle && (v.IsCar || v.IsBike || v.IsBicycle || v.IsQuadBike || (v.HasSiren && !v.IsSirenOn))) + if(v && v.Speed > 0 && v.IsOnAllWheels && v != Game.LocalPlayer.Character.CurrentVehicle && (v.IsCar || v.IsBike || v.IsBicycle || v.IsQuadBike || (v.HasSiren && !v.IsSirenOn)) && !collectedVehicles.ContainsKey(v.LicensePlate)) { if(v.HasDriver && !v.Driver.IsAlive) { @@ -132,6 +132,7 @@ namespace SceneManager v.CreateRandomDriver(); v.Driver.IsPersistent = true; v.Driver.BlockPermanentEvents = true; + Game.LogTrivial($"A missing driver was created for {v.Model.Name}"); } return true; } From e8c5e2ca698ff8179c0b85588f9a433a6b4a4000 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Wed, 26 Aug 2020 19:51:13 -0600 Subject: [PATCH 066/276] Fixed PathMainMenu not functioning correctly after finishing a path --- SceneManager/Menus/PathCreationMenu.cs | 9 +++++---- SceneManager/Menus/PathMainMenu.cs | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 6bf27a0..245a6f7 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -173,10 +173,11 @@ namespace SceneManager } MenuManager.menuPool.CloseAllMenus(); - pathCreationMenu.Reset(true, true); // Trying to see if we can get away with resetting the menu instead of rebuilding it - //PathMainMenu.pathMainMenu.Clear(); - //PathMainMenu.BuildPathMenu(); - //trafficEndPath.Enabled = false; + //pathCreationMenu.Reset(true, true); // Trying to see if we can get away with resetting the menu instead of rebuilding it + PathMainMenu.createNewPath.Text = "Create New Path"; + PathMainMenu.pathMainMenu.Clear(); + PathMainMenu.BuildPathMenu(); + trafficEndPath.Enabled = false; PathMainMenu.pathMainMenu.Visible = true; break; } diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index ad5223b..2adf15e 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -11,7 +11,7 @@ namespace SceneManager { public static UIMenu pathMainMenu { get; private set; } public static UIMenuItem createNewPath { get; private set; } - private static UIMenuItem deleteAllPaths; + public static UIMenuItem deleteAllPaths; public static UIMenuListScrollerItem editPath { get; private set; } public static UIMenuListScrollerItem directOptions { get; private set; } public static UIMenuListScrollerItem directDriver { get; private set; } From 95f65c792cda14624619b11df08081258c66f1ed Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 27 Aug 2020 15:01:57 -0600 Subject: [PATCH 067/276] Refactored collectedVehicles from Dictionary to List --- SceneManager/Menus/PathMainMenu.cs | 95 +++++++++++++++--------------- SceneManager/Menus/SettingsMenu.cs | 3 +- SceneManager/VehicleCollector.cs | 24 ++++---- 3 files changed, 62 insertions(+), 60 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index 2adf15e..ccc6701 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -97,16 +97,16 @@ namespace SceneManager } } - private static bool IsInCollectedVehicles(this Vehicle v) + private static bool IsInCollectedVehicles(this Vehicle vehicle) { - if (v && VehicleCollector.collectedVehicles.ContainsKey(v.LicensePlate)) + if (vehicle && VehicleCollector.collectedVehicles.Any(cv => cv.Vehicle == vehicle)) { - Game.LogTrivial($"{v.Model.Name} was found in the collection."); + Game.LogTrivial($"{vehicle.Model.Name} was found in the collection."); return true; } else { - Game.LogTrivial($"{v.Model.Name} was not found in the collection."); + Game.LogTrivial($"{vehicle.Model.Name} was not found in the collection."); return false; } } @@ -116,20 +116,20 @@ namespace SceneManager // Before deleting a path, we need to dismiss any vehicles controlled by that path and remove the vehicles from ControlledVehicles //Game.LogTrivial($"Deleting path {index+1}"); Game.LogTrivial($"Deleting path {path.PathNum}"); - var pathVehicles = VehicleCollector.collectedVehicles.Where(cv => cv.Value.Path == path.PathNum).ToList(); + var pathVehicles = VehicleCollector.collectedVehicles.Where(cv => cv.Path == path.PathNum).ToList(); Game.LogTrivial($"Removing all vehicles on the path"); - foreach (KeyValuePair cv in pathVehicles.Where(cv => cv.Value.Vehicle && cv.Value.Vehicle.Driver)) + foreach (CollectedVehicle cv in pathVehicles.Where(cv => cv.Vehicle && cv.Vehicle.Driver)) { - cv.Value.SetDismissNow(true); - cv.Value.Vehicle.Driver.Tasks.Clear(); - cv.Value.Vehicle.Driver.Dismiss(); - cv.Value.Vehicle.Driver.IsPersistent = false; - cv.Value.Vehicle.Dismiss(); - cv.Value.Vehicle.IsPersistent = false; + cv.SetDismissNow(true); + cv.Vehicle.Driver.Tasks.Clear(); + cv.Vehicle.Driver.Dismiss(); + cv.Vehicle.Driver.IsPersistent = false; + cv.Vehicle.Dismiss(); + cv.Vehicle.IsPersistent = false; //Game.LogTrivial($"{cv.vehicle.Model.Name} cleared from path {cv.path}"); - VehicleCollector.collectedVehicles.Remove(cv.Value.LicensePlate); + VehicleCollector.collectedVehicles.Remove(cv); } // Remove the speed zone so cars don't continue to be affected after the path is deleted @@ -233,11 +233,9 @@ namespace SceneManager VehicleCollector.SetVehicleAndDriverPersistence(nearbyVehicle); if (nearbyVehicle.IsInCollectedVehicles()) { - var vehicle = VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate]; - Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} already in collection. Clearing tasks."); nearbyVehicle.Driver.Tasks.Clear(); - vehicle.AssignPropertiesFromDirectedTask(pathNum, totalPathWaypoints, 1, tasksAssigned: false, dismiss: true, stoppedAtWaypoint: false);//, redirected: true); + //VehicleCollector.collectedVehicles[nearbyVehicle].AssignPropertiesFromDirectedTask(pathNum, totalPathWaypoints, 1, tasksAssigned: false, dismiss: true, stoppedAtWaypoint: false); if (directOptions.SelectedItem == "First waypoint") { @@ -256,14 +254,15 @@ namespace SceneManager } else { - VehicleCollector.collectedVehicles.Add(nearbyVehicle.LicensePlate, new CollectedVehicle(nearbyVehicle, nearbyVehicle.LicensePlate, paths[directDriver.Index].Waypoints[0].Path, paths[directDriver.Index].Waypoints.Count, 1, false, false)); + VehicleCollector.collectedVehicles.Add(new CollectedVehicle(nearbyVehicle, nearbyVehicle.LicensePlate, paths[directDriver.Index].Waypoints[0].Path, paths[directDriver.Index].Waypoints.Count, 1, false, false)); + var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle) as CollectedVehicle; Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} not in collection, adding to collection for path {paths[directDriver.Index].PathNum} with {paths[directDriver.Index].Waypoints.Count} waypoints"); if (directOptions.SelectedItem == "First waypoint") { GameFiber.StartNew(() => { - VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.DriveToPosition(firstWaypoint.Position, firstWaypoint.Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + nearbyVehicle.Driver.Tasks.DriveToPosition(firstWaypoint.Position, firstWaypoint.Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); for (int nextWaypoint = firstWaypoint.Number; nextWaypoint < paths[directDriver.Index].Waypoints.Count; nextWaypoint++) { @@ -273,28 +272,28 @@ namespace SceneManager break; } - Game.LogTrivial($"{VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} is driving to waypoint {paths[directDriver.Index].Waypoints[nextWaypoint].Number}"); - if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && !VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].StoppedAtWaypoint) + Game.LogTrivial($"{nearbyVehicle.Model.Name} is driving to waypoint {paths[directDriver.Index].Waypoints[nextWaypoint].Number}"); + if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && !collectedVehicle.StoppedAtWaypoint) { - VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.DriveToPosition(paths[directDriver.Index].Waypoints[nextWaypoint].Position, paths[directDriver.Index].Waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + nearbyVehicle.Driver.Tasks.DriveToPosition(paths[directDriver.Index].Waypoints[nextWaypoint].Position, paths[directDriver.Index].Waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); } if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && paths[directDriver.Index].Waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) { - Game.LogTrivial($"{VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} stopping at waypoint."); - VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); - VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].SetStoppedAtWaypoint(true); + Game.LogTrivial($"{nearbyVehicle.Model.Name} stopping at waypoint."); + nearbyVehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); + collectedVehicle.SetStoppedAtWaypoint(true); } } - Game.LogTrivial($"{VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} all tasks complete."); - AITasking.DismissDriver(VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate]); + Game.LogTrivial($"{nearbyVehicle.Model.Name} all tasks complete."); + AITasking.DismissDriver(collectedVehicle); }); } else { GameFiber.StartNew(() => { - VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.DriveToPosition(nearestWaypoint[0].Position, nearestWaypoint[0].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + nearbyVehicle.Driver.Tasks.DriveToPosition(nearestWaypoint[0].Position, nearestWaypoint[0].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); for (int nextWaypoint = nearestWaypoint[0].Number; nextWaypoint < paths[directDriver.Index].Waypoints.Count; nextWaypoint++) { @@ -304,21 +303,21 @@ namespace SceneManager break; } - Game.LogTrivial($"{VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} is driving to waypoint {paths[directDriver.Index].Waypoints[nextWaypoint].Number}"); - if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && !VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].StoppedAtWaypoint) + Game.LogTrivial($"{nearbyVehicle.Model.Name} is driving to waypoint {paths[directDriver.Index].Waypoints[nextWaypoint].Number}"); + if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && !collectedVehicle.StoppedAtWaypoint) { - VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.DriveToPosition(paths[directDriver.Index].Waypoints[nextWaypoint].Position, paths[directDriver.Index].Waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + nearbyVehicle.Driver.Tasks.DriveToPosition(paths[directDriver.Index].Waypoints[nextWaypoint].Position, paths[directDriver.Index].Waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); } if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && paths[directDriver.Index].Waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) { - Game.LogTrivial($"{VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} stopping at waypoint."); - VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); - VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].SetStoppedAtWaypoint(true); + Game.LogTrivial($"{nearbyVehicle.Model.Name} stopping at waypoint."); + nearbyVehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); + collectedVehicle.SetStoppedAtWaypoint(true); } } - Game.LogTrivial($"{VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate].Vehicle.Model.Name} all tasks complete."); - AITasking.DismissDriver(VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate]); + Game.LogTrivial($"{nearbyVehicle.Model.Name} all tasks complete."); + AITasking.DismissDriver(collectedVehicle); }); } } @@ -336,11 +335,11 @@ namespace SceneManager Game.LogTrivial($"Dismiss from path"); if (nearbyVehicle.IsInCollectedVehicles()) { - var controlledVehicle = VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate]; - controlledVehicle.SetDismissNow(true); - controlledVehicle.Vehicle.Driver.Tasks.Clear(); - controlledVehicle.Vehicle.Driver.Dismiss(); - Game.LogTrivial($"Dismissed driver of {controlledVehicle.Vehicle.Model.Name} from path {controlledVehicle.Path}"); + var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle) as CollectedVehicle; + collectedVehicle.SetDismissNow(true); + collectedVehicle.Vehicle.Driver.Tasks.Clear(); + collectedVehicle.Vehicle.Driver.Dismiss(); + Game.LogTrivial($"Dismissed driver of {collectedVehicle.Vehicle.Model.Name} from path {collectedVehicle.Path}"); } else { @@ -352,19 +351,19 @@ namespace SceneManager Game.LogTrivial($"Dismiss from waypoint"); if (nearbyVehicle.IsInCollectedVehicles()) { - var controlledVehicle = VehicleCollector.collectedVehicles[nearbyVehicle.LicensePlate]; - controlledVehicle.SetStoppedAtWaypoint(false); - controlledVehicle.Vehicle.Driver.Tasks.Clear(); - controlledVehicle.Vehicle.Driver.Dismiss(); + var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle) as CollectedVehicle; + collectedVehicle.SetStoppedAtWaypoint(false); + collectedVehicle.Vehicle.Driver.Tasks.Clear(); + collectedVehicle.Vehicle.Driver.Dismiss(); - if (controlledVehicle.CurrentWaypoint == controlledVehicle.TotalWaypoints && !controlledVehicle.StoppedAtWaypoint) + if (collectedVehicle.CurrentWaypoint == collectedVehicle.TotalWaypoints && !collectedVehicle.StoppedAtWaypoint) { - controlledVehicle.SetDismissNow(true); - Game.LogTrivial($"Dismissed driver of {controlledVehicle.Vehicle.Model.Name} from final waypoint and ultimately the path"); + collectedVehicle.SetDismissNow(true); + Game.LogTrivial($"Dismissed driver of {collectedVehicle.Vehicle.Model.Name} from final waypoint and ultimately the path"); } else { - Game.LogTrivial($"Dismissed driver of {controlledVehicle.Vehicle.Model.Name} from waypoint {controlledVehicle.CurrentWaypoint}"); + Game.LogTrivial($"Dismissed driver of {collectedVehicle.Vehicle.Model.Name} from waypoint {collectedVehicle.CurrentWaypoint}"); } } else diff --git a/SceneManager/Menus/SettingsMenu.cs b/SceneManager/Menus/SettingsMenu.cs index e9fdc03..79fa423 100644 --- a/SceneManager/Menus/SettingsMenu.cs +++ b/SceneManager/Menus/SettingsMenu.cs @@ -8,7 +8,7 @@ namespace SceneManager { public static UIMenu settingsMenu { get; private set; } public static UIMenuCheckboxItem debugGraphics = new UIMenuCheckboxItem("Enable 3D Waypoints", false), - hints = new UIMenuCheckboxItem("Enable Hints", true); + hints = new UIMenuCheckboxItem("Enable Hints", true); // Refactor this to be true/false based off the ini public static UIMenuListScrollerItem speedUnits = new UIMenuListScrollerItem("Speed Unit of Measure", "", new[] { SpeedUnitsOfMeasure.MPH, SpeedUnitsOfMeasure.KPH }); public enum SpeedUnitsOfMeasure { @@ -52,6 +52,7 @@ namespace SceneManager if(checkboxItem == hints) { Hints.Enabled = hints.Checked ? true : false; + // Update the setting in the .ini when check state is changed } } diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index b4e2e20..2416f81 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -29,7 +29,8 @@ namespace SceneManager TotalControl = AllowWrongWay | AvoidObjects | AvoidPeds | TakeShortestPath | StopForTrafficLights | IgnorePathfinding | StopForVehicles } - public static Dictionary collectedVehicles = new Dictionary(); + //public static Dictionary collectedVehicles = new Dictionary(); + public static List collectedVehicles = new List(); public static void StartCollectingAtWaypoint(List paths, Path path, Waypoint waypoint) { @@ -55,8 +56,9 @@ namespace SceneManager break; } + var collectedVehicle = collectedVehicles.Where(cv => cv.Vehicle == vehicle) as CollectedVehicle; // If the vehicle is not in the collection yet - if (!collectedVehicles.ContainsKey(vehicle.LicensePlate)) + if(collectedVehicle == null) { SetVehicleAndDriverPersistence(vehicle); CollectedVehicle newCollectedVehicle = AddVehicleToCollection(path, waypoint, vehicle); @@ -66,20 +68,20 @@ namespace SceneManager AssignTasksFiber.Start(); } // If the vehicle is in the collection, but has no tasks - else if (collectedVehicles.ContainsKey(vehicle.LicensePlate) && !collectedVehicles[vehicle.LicensePlate].TasksAssigned) + else if (!collectedVehicle.TasksAssigned) { Game.LogTrivial($"[WaypointVehicleCollector] {vehicle.Model.Name} already in collection, but with no tasks. Assigning tasks."); - collectedVehicles[vehicle.LicensePlate].SetTasksAssigned(true); + collectedVehicle.SetTasksAssigned(true); - GameFiber AssignTasksFiber = new GameFiber(() => AITasking.AssignWaypointTasks(collectedVehicles[vehicle.LicensePlate], path.Waypoints, waypoint)); + GameFiber AssignTasksFiber = new GameFiber(() => AITasking.AssignWaypointTasks(collectedVehicle, path.Waypoints, waypoint)); AssignTasksFiber.Start(); } } } - private static Vehicle[] GetNearbyVehicles(Vector3 collectorPosition, float radius) + private static Vehicle[] GetNearbyVehicles(Vector3 collectorPosition, float collectorRadius) { - return (from v in World.GetAllVehicles() where v.IsValidForCollection() && v.DistanceTo(collectorPosition) <= radius select v).ToArray(); //v.IsValidForCollection() + return (from v in World.GetAllVehicles() where v.DistanceTo(collectorPosition) <= collectorRadius && v.IsValidForCollection() select v).ToArray(); } private static void AssignStopForVehiclesFlag(List paths, Path path, Waypoint waypointData) @@ -106,7 +108,7 @@ namespace SceneManager private static CollectedVehicle AddVehicleToCollection(Path path, Waypoint waypoint, Vehicle v) { var collectedVehicle = new CollectedVehicle(v, v.LicensePlate, path.PathNum, path.Waypoints.Count, waypoint.Number, true, false); - collectedVehicles.Add(v.LicensePlate, collectedVehicle); + collectedVehicles.Add(collectedVehicle); Game.LogTrivial($"[WaypointVehicleCollector] Added {v.Model.Name} to collection from path {path.PathNum}, waypoint {waypoint.Number}."); return collectedVehicle; } @@ -121,7 +123,7 @@ namespace SceneManager private static bool IsValidForCollection(this Vehicle v) { - if(v && v.Speed > 0 && v.IsOnAllWheels && v != Game.LocalPlayer.Character.CurrentVehicle && (v.IsCar || v.IsBike || v.IsBicycle || v.IsQuadBike || (v.HasSiren && !v.IsSirenOn)) && !collectedVehicles.ContainsKey(v.LicensePlate)) + if(v && v.Speed > 1 && v.IsOnAllWheels && v != Game.LocalPlayer.Character.CurrentVehicle && v != Game.LocalPlayer.Character.LastVehicle && (v.IsCar || v.IsBike || v.IsBicycle || v.IsQuadBike || (v.HasSiren && !v.IsSirenOn)) && !collectedVehicles.Any(cv => cv.Vehicle == v)) { if(v.HasDriver && !v.Driver.IsAlive) { @@ -157,14 +159,14 @@ namespace SceneManager var collectorWaypoints = waypointData.Where(wp => wp.IsCollector); var vehicleFarEnoughAwayFromCollectors = collectorWaypoints.All(wp => cv.Vehicle.DistanceTo(wp.Position) > wp.CollectorRadius); - if (collectedVehicles.ContainsKey(cv.LicensePlate) && vehicleFarEnoughAwayFromCollectors) + if (collectedVehicles.Contains(cv) && vehicleFarEnoughAwayFromCollectors) { Game.LogTrivial($"{cv.Vehicle.Model.Name} is far enough away from all attractor waypoints and has been removed from the collection."); cv.SetTasksAssigned(false); cv.Vehicle.Driver.BlockPermanentEvents = false; cv.Vehicle.Driver.IsPersistent = false; cv.Vehicle.IsPersistent = false; - collectedVehicles.Remove(cv.LicensePlate); + collectedVehicles.Remove(cv); break; } From a103d9be6795597b20aa1af77dd48a3cdba4dd80 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 27 Aug 2020 15:56:29 -0600 Subject: [PATCH 068/276] Changed DistanceTo method to DistanceTo2D in GetNearbyVehicles --- SceneManager/VehicleCollector.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index 2416f81..9e7f5ba 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -81,7 +81,7 @@ namespace SceneManager private static Vehicle[] GetNearbyVehicles(Vector3 collectorPosition, float collectorRadius) { - return (from v in World.GetAllVehicles() where v.DistanceTo(collectorPosition) <= collectorRadius && v.IsValidForCollection() select v).ToArray(); + return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorPosition) <= collectorRadius && v.IsValidForCollection() select v).ToArray(); } private static void AssignStopForVehiclesFlag(List paths, Path path, Waypoint waypointData) From 934e73d5c1451a044dee2f92a269eb60bf7a2114 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 27 Aug 2020 15:57:59 -0600 Subject: [PATCH 069/276] Added waypoint sphere on player while path creation menu is open if 3D waypoints are enabled. --- SceneManager/DebugGraphics.cs | 30 ++++++++++++++++++++++++-- SceneManager/Menus/PathCreationMenu.cs | 6 +++--- SceneManager/Menus/SettingsMenu.cs | 2 ++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/SceneManager/DebugGraphics.cs b/SceneManager/DebugGraphics.cs index 3eacd3b..88a910f 100644 --- a/SceneManager/DebugGraphics.cs +++ b/SceneManager/DebugGraphics.cs @@ -23,7 +23,7 @@ namespace SceneManager } } - public static void DrawLinesBetweenWaypoints(Path path, int i) + private static void DrawLinesBetweenWaypoints(Path path, int i) { if (path.Waypoints[i + 1].DrivingFlag == VehicleDrivingFlags.StopAtDestination) { @@ -35,7 +35,7 @@ namespace SceneManager } } - public static void DrawSpheresAtWaypoints(Path path, int i) + private static void DrawSpheresAtWaypoints(Path path, int i) { if (path.Waypoints[i].IsCollector) { @@ -50,5 +50,31 @@ namespace SceneManager Debug.DrawSphere(path.Waypoints[i].Position, 1f, Color.FromArgb(80, Color.Green)); } } + + public static void DrawSphereOnPlayer(UIMenuCheckboxItem debugGraphics) + { + GameFiber.StartNew(() => + { + while (debugGraphics.Checked) + { + if (PathCreationMenu.pathCreationMenu.Visible) + { + if (PathCreationMenu.collectorWaypoint.Checked) + { + Debug.DrawSphere(Game.LocalPlayer.Character.Position, PathCreationMenu.collectorRadius.Value, Color.FromArgb(80, Color.Blue)); + } + else if (PathCreationMenu.waypointType.SelectedItem == "Drive To") + { + Debug.DrawSphere(Game.LocalPlayer.Character.Position, PathCreationMenu.collectorRadius.Value, Color.FromArgb(80, Color.Green)); + } + else + { + Debug.DrawSphere(Game.LocalPlayer.Character.Position, PathCreationMenu.collectorRadius.Value, Color.FromArgb(80, Color.Red)); + } + } + GameFiber.Yield(); + } + }); + } } } diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 245a6f7..244d889 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -14,10 +14,10 @@ namespace SceneManager private static string[] waypointTypes = new string[] { "Drive To", "Stop" }; public static UIMenu pathCreationMenu { get; private set; } private static UIMenuItem trafficAddWaypoint, trafficRemoveWaypoint, trafficEndPath; - private static UIMenuListScrollerItem waypointType = new UIMenuListScrollerItem("Waypoint Type", "", waypointTypes); + public static UIMenuListScrollerItem waypointType = new UIMenuListScrollerItem("Waypoint Type", "", waypointTypes); private static UIMenuNumericScrollerItem waypointSpeed; - private static UIMenuNumericScrollerItem collectorRadius = new UIMenuNumericScrollerItem("Collection Radius", "The distance from this waypoint in meters vehicles will be collected", 1, 50, 1); - private static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path"); + public static UIMenuNumericScrollerItem collectorRadius = new UIMenuNumericScrollerItem("Collection Radius", "The distance from this waypoint in meters vehicles will be collected", 1, 50, 1); + public static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path"); internal static void InstantiateMenu() { diff --git a/SceneManager/Menus/SettingsMenu.cs b/SceneManager/Menus/SettingsMenu.cs index 79fa423..7853cd4 100644 --- a/SceneManager/Menus/SettingsMenu.cs +++ b/SceneManager/Menus/SettingsMenu.cs @@ -46,6 +46,8 @@ namespace SceneManager DebugGraphics.LoopToDrawDebugGraphics(debugGraphics, path); }); } + + DebugGraphics.DrawSphereOnPlayer(debugGraphics); } } From 646498bbc52f6a77d5433dcec9bb4345368e8b2a Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 30 Aug 2020 09:55:38 -0600 Subject: [PATCH 070/276] Added settings option for configurable barrier placement distance --- SceneManager/Menus/BarrierMenu.cs | 4 ++-- SceneManager/Menus/SettingsMenu.cs | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index fc4768e..436bc5c 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -81,7 +81,7 @@ namespace SceneManager private static void UpdateShadowBarrierPosition() { DisableBarrierMenuOptionsIfShadowConeTooFar(); - shadowBarrier.Position = TracePlayerView(15, TraceFlags.IntersectEverything).HitPosition; + shadowBarrier.Position = TracePlayerView(SettingsMenu.barrierPlacementDistance.Value, TraceFlags.IntersectEverything).HitPosition; Rage.Native.NativeFunction.Natives.PLACE_OBJECT_ON_GROUND_PROPERLY(shadowBarrier); shadowBarrier.Heading = rotateBarrier.Value; @@ -239,7 +239,7 @@ namespace SceneManager return World.TraceLine(start, end, flags); } - internal static HitResult TracePlayerView(float maxTraceDistance = 15f, TraceFlags flags = TraceFlags.IntersectEverything) => TracePlayerView(out Vector3 v1, out Vector3 v2, maxTraceDistance, flags); + internal static HitResult TracePlayerView(float maxTraceDistance = 30f, TraceFlags flags = TraceFlags.IntersectEverything) => TracePlayerView(out Vector3 v1, out Vector3 v2, maxTraceDistance, flags); //------------ CREDIT PNWPARKS FOR THESE FUNCTIONS ------------\\ } } diff --git a/SceneManager/Menus/SettingsMenu.cs b/SceneManager/Menus/SettingsMenu.cs index 7853cd4..d46d8fc 100644 --- a/SceneManager/Menus/SettingsMenu.cs +++ b/SceneManager/Menus/SettingsMenu.cs @@ -10,6 +10,8 @@ namespace SceneManager public static UIMenuCheckboxItem debugGraphics = new UIMenuCheckboxItem("Enable 3D Waypoints", false), hints = new UIMenuCheckboxItem("Enable Hints", true); // Refactor this to be true/false based off the ini public static UIMenuListScrollerItem speedUnits = new UIMenuListScrollerItem("Speed Unit of Measure", "", new[] { SpeedUnitsOfMeasure.MPH, SpeedUnitsOfMeasure.KPH }); + public static UIMenuNumericScrollerItem barrierPlacementDistance = new UIMenuNumericScrollerItem("Barrier Placement Distance", "How far away you can place a barrier (in meters)", 1, 30, 1); + public enum SpeedUnitsOfMeasure { MPH, @@ -28,6 +30,8 @@ namespace SceneManager settingsMenu.AddItem(debugGraphics); settingsMenu.AddItem(hints); settingsMenu.AddItem(speedUnits); + settingsMenu.AddItem(barrierPlacementDistance); + barrierPlacementDistance.Index = 14; settingsMenu.OnCheckboxChange += SettingsMenu_OnCheckboxChange; settingsMenu.OnScrollerChange += SettingsMenu_OnScrollerChange; @@ -47,7 +51,7 @@ namespace SceneManager }); } - DebugGraphics.DrawSphereOnPlayer(debugGraphics); + DebugGraphics.Draw3DWaypointOnPlayer(); } } From 54c2bd8c1247da285f42889efe33a95f437aa3c3 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 30 Aug 2020 10:05:58 -0600 Subject: [PATCH 071/276] Added separate menu option for collector waypoint speed zone. --- SceneManager/Menus/EditWaypointMenu.cs | 17 ++++++++++--- SceneManager/Menus/PathCreationMenu.cs | 27 +++++++++----------- SceneManager/Object Classes/Waypoint.cs | 33 +++++++++++++++++++++---- 3 files changed, 53 insertions(+), 24 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 7dc3d72..780e8b7 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -18,8 +18,9 @@ namespace SceneManager public static UIMenuNumericScrollerItem editWaypoint; private static UIMenuListScrollerItem changeWaypointType = new UIMenuListScrollerItem("New Waypoint Type", "", waypointTypes); private static UIMenuNumericScrollerItem changeWaypointSpeed; - private static UIMenuNumericScrollerItem changeCollectorRadius = new UIMenuNumericScrollerItem("New Collection Radius", "The distance from this waypoint in meters vehicles will be collected", 1, 50, 1); private static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path"); + private static UIMenuNumericScrollerItem changeCollectorRadius = new UIMenuNumericScrollerItem("New Collection Radius", "The distance from this waypoint (in meters) vehicles will be collected", 1, 50, 1); + private static UIMenuNumericScrollerItem changeSpeedZoneRadius = new UIMenuNumericScrollerItem("New Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 1, 50, 1); private static UIMenuCheckboxItem updateWaypointPosition; internal static void InstantiateMenu() @@ -47,7 +48,6 @@ namespace SceneManager editWaypointMenu.AddItem(changeWaypointType); changeWaypointType.Index = Array.IndexOf(drivingFlags, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].DrivingFlag); - //Game.LogTrivial($"Waypoint speed: {PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed}"); editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuNumericScrollerItem("New Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 80, 5)); changeWaypointSpeed.Value = (int)MathHelper.ConvertMetersPerSecondToMilesPerHour(PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed); @@ -58,6 +58,14 @@ namespace SceneManager ? (int)PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].CollectorRadius : changeCollectorRadius.Minimum; + editWaypointMenu.AddItem(changeSpeedZoneRadius); + changeSpeedZoneRadius.Value = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].CollectorRadius != 0 + ? (int)PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].SpeedZoneRadius + : changeSpeedZoneRadius.Minimum; + + changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; + changeSpeedZoneRadius.Enabled = collectorWaypoint.Checked ? true : false; + editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); editUpdateWaypoint.ForeColor = Color.Gold; @@ -78,10 +86,10 @@ namespace SceneManager if(scrollerItem == editWaypoint) { changeWaypointType.Index = Array.IndexOf(drivingFlags, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].DrivingFlag); - //changeWaypointSpeed.Index = Array.IndexOf(waypointSpeeds, MathHelper.ConvertMetersPerSecondToMilesPerHour(PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed)); changeWaypointSpeed.Value = (int)MathHelper.ConvertMetersPerSecondToMilesPerHour(PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed); collectorWaypoint.Checked = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].IsCollector; changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; + changeSpeedZoneRadius.Enabled = collectorWaypoint.Checked ? true : false; } } @@ -90,6 +98,7 @@ namespace SceneManager if (checkboxItem == collectorWaypoint) { changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; + changeSpeedZoneRadius.Enabled = collectorWaypoint.Checked ? true : false; } } @@ -100,7 +109,7 @@ namespace SceneManager if (selectedItem == editUpdateWaypoint) { - currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], SetDriveSpeedForWaypoint(), collectorWaypoint.Checked, changeCollectorRadius.Value, updateWaypointPosition.Checked); + currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], SetDriveSpeedForWaypoint(), collectorWaypoint.Checked, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, updateWaypointPosition.Checked); Game.LogTrivial($"Updated path {currentPath.PathNum} waypoint {currentWaypoint.Number}: Driving flag is {drivingFlags[changeWaypointType.Index].ToString()}, speed is {changeWaypointSpeed.Value}, collector is {currentWaypoint.IsCollector}"); if (currentPath.Waypoints.Count < 2 && currentPath.Waypoints[0].DrivingFlag == VehicleDrivingFlags.StopAtDestination) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 244d889..8471681 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -16,8 +16,9 @@ namespace SceneManager private static UIMenuItem trafficAddWaypoint, trafficRemoveWaypoint, trafficEndPath; public static UIMenuListScrollerItem waypointType = new UIMenuListScrollerItem("Waypoint Type", "", waypointTypes); private static UIMenuNumericScrollerItem waypointSpeed; - public static UIMenuNumericScrollerItem collectorRadius = new UIMenuNumericScrollerItem("Collection Radius", "The distance from this waypoint in meters vehicles will be collected", 1, 50, 1); public static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path"); + public static UIMenuNumericScrollerItem collectorRadius = new UIMenuNumericScrollerItem("Collection Radius", "The distance from this waypoint (in meters) vehicles will be collected", 1, 50, 1); + public static UIMenuNumericScrollerItem speedZoneRadius = new UIMenuNumericScrollerItem("Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 1, 50, 1); internal static void InstantiateMenu() { @@ -34,6 +35,8 @@ namespace SceneManager pathCreationMenu.AddItem(collectorWaypoint); pathCreationMenu.AddItem(collectorRadius); collectorRadius.Index = 0; + pathCreationMenu.AddItem(speedZoneRadius); + speedZoneRadius.Index = 0; pathCreationMenu.AddItem(trafficAddWaypoint = new UIMenuItem("Add waypoint")); trafficAddWaypoint.ForeColor = Color.Gold; pathCreationMenu.AddItem(trafficRemoveWaypoint = new UIMenuItem("Remove last waypoint")); @@ -53,6 +56,7 @@ namespace SceneManager if(checkboxItem == collectorWaypoint) { collectorRadius.Enabled = collectorWaypoint.Checked ? true : false; + speedZoneRadius.Enabled = collectorWaypoint.Checked ? true : false; } } @@ -70,10 +74,7 @@ namespace SceneManager if (SettingsMenu.debugGraphics.Checked) { - GameFiber.StartNew(() => - { - DebugGraphics.LoopToDrawDebugGraphics(SettingsMenu.debugGraphics, PathMainMenu.GetPaths()[0]); - }); + DebugGraphics.LoopToDrawDebugGraphics(SettingsMenu.debugGraphics, PathMainMenu.GetPaths()[0]); } } else if(anyPathsExist && !PathMainMenu.GetPaths().Any(p => p != null && p.State == State.Creating)) @@ -82,10 +83,7 @@ namespace SceneManager if (SettingsMenu.debugGraphics.Checked) { - GameFiber.StartNew(() => - { - DebugGraphics.LoopToDrawDebugGraphics(SettingsMenu.debugGraphics, PathMainMenu.GetPaths().Where(p => p != null && p.State == State.Creating).First()); - }); + DebugGraphics.LoopToDrawDebugGraphics(SettingsMenu.debugGraphics, PathMainMenu.GetPaths().Where(p => p != null && p.State == State.Creating).First()); } } @@ -99,10 +97,9 @@ namespace SceneManager if (collectorWaypoint.Checked) { var yieldZone = SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH - ? World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeed.Value)) - : World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeed.Value)); - - PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, collectorRadius.Value, yieldZone)); + ? World.AddSpeedZone(Game.LocalPlayer.Character.Position, speedZoneRadius.Value, MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeed.Value)) + : World.AddSpeedZone(Game.LocalPlayer.Character.Position, speedZoneRadius.Value, MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeed.Value)); + PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, collectorRadius.Value, speedZoneRadius.Value, yieldZone)); } else { @@ -166,9 +163,9 @@ namespace SceneManager PathMainMenu.AddPathToPathCountList(i, currentPath.PathNum); // For each waypoint in the path's WaypointData, start a collector game fiber and loop while the path and waypoint exist, and while the path is enabled - foreach (Waypoint wd in PathMainMenu.GetPaths()[i].Waypoints) + foreach (Waypoint waypoint in PathMainMenu.GetPaths()[i].Waypoints) { - GameFiber WaypointVehicleCollectorFiber = new GameFiber(() => VehicleCollector.StartCollectingAtWaypoint(PathMainMenu.GetPaths(), PathMainMenu.GetPaths()[i], wd)); + GameFiber WaypointVehicleCollectorFiber = new GameFiber(() => VehicleCollector.StartCollectingAtWaypoint(PathMainMenu.GetPaths(), PathMainMenu.GetPaths()[i], waypoint)); WaypointVehicleCollectorFiber.Start(); } diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 793a830..eac2f10 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -13,6 +13,7 @@ namespace SceneManager public uint YieldZone { get; private set; } public bool IsCollector { get; private set; } public float CollectorRadius { get; private set; } + public float SpeedZoneRadius { get; private set; } public Blip CollectorRadiusBlip { get; private set; } public Waypoint(int path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip) @@ -26,7 +27,7 @@ namespace SceneManager } - public Waypoint(int path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector, float collectorRadius, uint yieldZone) + public Waypoint(int path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector, float collectorRadius, float speedZoneRadius, uint yieldZone) { Path = path; Number = waypointNum; @@ -36,6 +37,7 @@ namespace SceneManager Blip = waypointBlip; IsCollector = collector; CollectorRadius = collectorRadius; + SpeedZoneRadius = speedZoneRadius; YieldZone = yieldZone; CollectorRadiusBlip = new Blip(waypointBlip.Position, collectorRadius) { @@ -44,24 +46,24 @@ namespace SceneManager }; } - public void UpdateWaypoint(Waypoint currentWaypoint, VehicleDrivingFlags drivingFlag, float drivingSpeed, bool collectorWaypointChecked, float collectorRadius, bool updateWaypointPositionChecked) + public void UpdateWaypoint(Waypoint currentWaypoint, VehicleDrivingFlags drivingFlag, float drivingSpeed, bool collectorWaypointChecked, float collectorRadius, float speedZoneRadius, bool updateWaypointPositionChecked) { UpdateDrivingFlag(drivingFlag); UpdateWaypointSpeed(drivingSpeed); - UpdateCollectorOptions(currentWaypoint, drivingSpeed, collectorWaypointChecked, collectorRadius); + UpdateCollectorOptions(currentWaypoint, drivingSpeed, collectorWaypointChecked, collectorRadius, speedZoneRadius); if (updateWaypointPositionChecked) { UpdateWaypointPosition(Game.LocalPlayer.Character.Position); } } - private void UpdateCollectorOptions(Waypoint currentWaypoint, float drivingSpeed, bool collectorWaypointChecked, float collectorRadius) + private void UpdateCollectorOptions(Waypoint currentWaypoint, float drivingSpeed, bool collectorWaypointChecked, float collectorRadius, float speedZoneRadius) { if (collectorWaypointChecked) { IsCollector = true; World.RemoveSpeedZone(YieldZone); - YieldZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, 50f, drivingSpeed); + YieldZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, SpeedZoneRadius, drivingSpeed); if (CollectorRadiusBlip) { currentWaypoint.CollectorRadiusBlip.Alpha = 0.5f; @@ -76,6 +78,7 @@ namespace SceneManager }; } CollectorRadius = collectorRadius; + SpeedZoneRadius = speedZoneRadius; } else { @@ -118,5 +121,25 @@ namespace SceneManager { Number = newWaypointNumber; } + + public void DrawWaypointMarker() + { + if(IsCollector && CollectorRadius > 0) + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, CollectorRadius, CollectorRadius, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); + if(SpeedZoneRadius > 0) + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, SpeedZoneRadius, SpeedZoneRadius, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); + } + } + else if(DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 80, false, false, 2, false, 0, 0, false); + } + else + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 80, false, false, 2, false, 0, 0, false); + } + } } } From 98f7efe6479994b9651ec30f8746f3e882f99025 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 30 Aug 2020 10:06:46 -0600 Subject: [PATCH 072/276] Added VehicleManeuver.GoForwardWithCustomSteeringAngle after each driving task to stop AI from braking at each waypoint. --- SceneManager/AITasking.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index b80c47a..6e8c1a9 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -57,6 +57,7 @@ namespace SceneManager if (waypoints.ElementAtOrDefault(nextWaypoint) != null && !collectedVehicle.StoppedAtWaypoint) { collectedVehicle.Vehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + collectedVehicle.Vehicle.Driver.Tasks.PerformDrivingManeuver(collectedVehicle.Vehicle, VehicleManeuver.GoForwardWithCustomSteeringAngle, 3); } if (waypoints.ElementAtOrDefault(nextWaypoint) != null && waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) @@ -95,6 +96,10 @@ namespace SceneManager cv.Vehicle.Driver.Dismiss(); cv.Vehicle.Driver.Tasks.Clear(); cv.Vehicle.Driver.BlockPermanentEvents = false; + if (cv.Vehicle.Driver.GetAttachedBlip()) + { + cv.Vehicle.Driver.GetAttachedBlip().Delete(); + } cv.Vehicle.Driver.IsPersistent = false; cv.Vehicle.Dismiss(); From 525b158c9cca9383c4eff48ca1e4c51380a0d777 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 30 Aug 2020 10:07:31 -0600 Subject: [PATCH 073/276] Replaced sphere markers with vertical cylinder markers. Moved waypoint drawing natives to a method in the Waypoint class. --- SceneManager/DebugGraphics.cs | 50 +++++++++++++++-------------------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/SceneManager/DebugGraphics.cs b/SceneManager/DebugGraphics.cs index 88a910f..ae5ea5b 100644 --- a/SceneManager/DebugGraphics.cs +++ b/SceneManager/DebugGraphics.cs @@ -8,19 +8,26 @@ namespace SceneManager { public static void LoopToDrawDebugGraphics(UIMenuCheckboxItem debugGraphics, Path path) { - while (debugGraphics.Checked && path != null) + GameFiber.StartNew(() => { - for (int i = 0; i < path.Waypoints.Count; i++) + while (debugGraphics.Checked) { - DrawSpheresAtWaypoints(path, i); - - if (i != path.Waypoints.Count - 1) + if (MenuManager.menuPool.IsAnyMenuOpen() && path != null) { - DrawLinesBetweenWaypoints(path, i); + for (int i = 0; i < path.Waypoints.Count; i++) + { + //Draw3DMarkersAtWaypoints(path, i); + path.Waypoints[i].DrawWaypointMarker(); + + if (i != path.Waypoints.Count - 1) + { + DrawLinesBetweenWaypoints(path, i); + } + } } + GameFiber.Yield(); } - GameFiber.Yield(); - } + }); } private static void DrawLinesBetweenWaypoints(Path path, int i) @@ -35,41 +42,26 @@ namespace SceneManager } } - private static void DrawSpheresAtWaypoints(Path path, int i) - { - if (path.Waypoints[i].IsCollector) - { - Debug.DrawSphere(path.Waypoints[i].Position, path.Waypoints[i].CollectorRadius, Color.FromArgb(80, Color.Blue)); - } - else if (path.Waypoints[i].DrivingFlag == VehicleDrivingFlags.StopAtDestination) - { - Debug.DrawSphere(path.Waypoints[i].Position, 1f, Color.FromArgb(80, Color.Red)); - } - else - { - Debug.DrawSphere(path.Waypoints[i].Position, 1f, Color.FromArgb(80, Color.Green)); - } - } - - public static void DrawSphereOnPlayer(UIMenuCheckboxItem debugGraphics) + public static void Draw3DWaypointOnPlayer() { GameFiber.StartNew(() => { - while (debugGraphics.Checked) + while (SettingsMenu.debugGraphics.Checked) { if (PathCreationMenu.pathCreationMenu.Visible) { if (PathCreationMenu.collectorWaypoint.Checked) { - Debug.DrawSphere(Game.LocalPlayer.Character.Position, PathCreationMenu.collectorRadius.Value, Color.FromArgb(80, Color.Blue)); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)PathCreationMenu.collectorRadius.Value, (float)PathCreationMenu.collectorRadius.Value, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)PathCreationMenu.speedZoneRadius.Value, (float)PathCreationMenu.speedZoneRadius.Value, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); } else if (PathCreationMenu.waypointType.SelectedItem == "Drive To") { - Debug.DrawSphere(Game.LocalPlayer.Character.Position, PathCreationMenu.collectorRadius.Value, Color.FromArgb(80, Color.Green)); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z-1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 80, false, false, 2, false, 0, 0, false); } else { - Debug.DrawSphere(Game.LocalPlayer.Character.Position, PathCreationMenu.collectorRadius.Value, Color.FromArgb(80, Color.Red)); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z-1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 80, false, false, 2, false, 0, 0, false); } } GameFiber.Yield(); From 5da0176f10ff411cbbc0a1c5bce5c2abe6f26eea Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 30 Aug 2020 10:08:39 -0600 Subject: [PATCH 074/276] Fixed vehicles being collected while they are too far from a collector waypoint (cause was the same function being called for two different purposes). Added temporary debug blips for missing drivers. --- SceneManager/VehicleCollector.cs | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index 9e7f5ba..c93d584 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Drawing; using System.Linq; using Rage; @@ -49,13 +50,15 @@ namespace SceneManager private static void LoopForNearbyValidVehicles(Path path, Waypoint waypoint) { - foreach (Vehicle vehicle in GetNearbyVehicles(waypoint.Position, waypoint.CollectorRadius)) + foreach (Vehicle vehicle in GetNearbyVehiclesForCollection(waypoint.Position, waypoint.CollectorRadius)) { if (!vehicle) - { + { break; } + Game.LogTrivial($"Vehicle: {vehicle.Model.Name}, Distance to waypoint: {vehicle.DistanceTo2D(waypoint.Position)}"); + var collectedVehicle = collectedVehicles.Where(cv => cv.Vehicle == vehicle) as CollectedVehicle; // If the vehicle is not in the collection yet if(collectedVehicle == null) @@ -79,18 +82,23 @@ namespace SceneManager } } - private static Vehicle[] GetNearbyVehicles(Vector3 collectorPosition, float collectorRadius) + private static Vehicle[] GetNearbyVehiclesForCollection(Vector3 collectorPosition, float collectorRadius) { return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorPosition) <= collectorRadius && v.IsValidForCollection() select v).ToArray(); } - private static void AssignStopForVehiclesFlag(List paths, Path path, Waypoint waypointData) + private static Vehicle[] GetNearbyVehiclesForStopFlag(Vector3 collectorPosition) { - while (paths.Contains(path) && path.Waypoints.Contains(waypointData)) + return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorPosition) <= 50f select v).ToArray(); + } + + private static void AssignStopForVehiclesFlag(List paths, Path path, Waypoint waypoint) + { + while (paths.Contains(path) && path.Waypoints.Contains(waypoint)) { if (path.IsEnabled) { - foreach (Vehicle v in GetNearbyVehicles(waypointData.Position, 50f).Where(v => v && v.HasDriver && v.Driver)) + foreach (Vehicle v in GetNearbyVehiclesForStopFlag(waypoint.Position).Where(v => v && v.HasDriver && v.Driver)) { SetDriveTaskDrivingFlags(v.Driver, EDrivingFlags.StopForVehicles); } @@ -132,6 +140,9 @@ namespace SceneManager if (!v.HasDriver) { v.CreateRandomDriver(); + var driverBlip = v.Driver.AttachBlip(); + driverBlip.Color = Color.Green; + driverBlip.Scale = 0.25f; v.Driver.IsPersistent = true; v.Driver.BlockPermanentEvents = true; Game.LogTrivial($"A missing driver was created for {v.Model.Name}"); From 3f5ce3aaceafaa6f100d6198cff877c1629b4495 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 30 Aug 2020 15:33:28 -0600 Subject: [PATCH 075/276] Added "Reset Barriers" option to menu --- SceneManager/Menus/BarrierMenu.cs | 41 ++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index 436bc5c..1a85641 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -13,12 +13,14 @@ namespace SceneManager class BarrierMenu { public static UIMenu barrierMenu { get; private set; } - public static List barriers = new List() { }; + public static List barriers = new List(); + //public static List barriers = new List() { }; private static UIMenuListScrollerItem barrierList = new UIMenuListScrollerItem("Select Barrier", "", new[] { "Large Striped Cone", "Large Cone", "Medium Striped Cone", "Medium Cone", "Roadpole A", "Roadpole B", "Police Barrier", "Road Barrier", "Flare" }); private static string[] barrierObjectNames = new string[] { "prop_mp_cone_01", "prop_roadcone01c", "prop_mp_cone_02", "prop_mp_cone_03", "prop_roadpole_01a", "prop_roadpole_01b", "prop_barrier_work05", "prop_barrier_work06a", "prop_flare_01b" }; - private static UIMenuNumericScrollerItem rotateBarrier = new UIMenuNumericScrollerItem("Rotate Barrier", "Rotate the barrier.", 0, 350, 10); + private static UIMenuNumericScrollerItem rotateBarrier = new UIMenuNumericScrollerItem("Rotate Barrier", "", 0, 350, 10); private static UIMenuListScrollerItem removeBarrierOptions = new UIMenuListScrollerItem("Remove Barrier", "", new[] { "Last Barrier", "Nearest Barrier", "All Barriers" }); + private static UIMenuItem resetBarriers = new UIMenuItem("Reset Barriers", "Reset all spawned barriers to their original position and rotation"); public static Rage.Object shadowBarrier; internal static void InstantiateMenu() @@ -30,6 +32,10 @@ namespace SceneManager public static void BuildBarrierMenu() { + barrierMenu.AddItem(resetBarriers); + resetBarriers.ForeColor = Color.Gold; + resetBarriers.Enabled = false; + barrierMenu.AddItem(removeBarrierOptions, 0); removeBarrierOptions.ForeColor = Color.Gold; removeBarrierOptions.Enabled = false; @@ -148,17 +154,27 @@ namespace SceneManager { RemoveBarrier(); } + + if(selectedItem == resetBarriers) + { + foreach(Barrier barrier in barriers.Where(b => b.GetBarrier())) + { + barrier.GetBarrier().Position = barrier.GetPosition(); + barrier.GetBarrier().Heading = barrier.GetRotation(); + } + } } private static void SpawnBarrier() { - var cone = new Rage.Object(shadowBarrier.Model, shadowBarrier.Position, rotateBarrier.Value); - cone.SetPositionWithSnap(shadowBarrier.Position); - Rage.Native.NativeFunction.Natives.SET_DISABLE_FRAG_DAMAGE(cone, true); - Rage.Native.NativeFunction.Natives.SET_DISABLE_BREAKING(cone, true); + var barrier = new Rage.Object(shadowBarrier.Model, shadowBarrier.Position, rotateBarrier.Value); + barrier.SetPositionWithSnap(shadowBarrier.Position); + Rage.Native.NativeFunction.Natives.SET_DISABLE_FRAG_DAMAGE(barrier, true); + Rage.Native.NativeFunction.Natives.SET_DISABLE_BREAKING(barrier, true); - barriers.Add(cone); + barriers.Add(new Barrier(barrier, barrier.Position, barrier.Heading)); removeBarrierOptions.Enabled = true; + resetBarriers.Enabled = true; } private static void RemoveBarrier() @@ -166,18 +182,18 @@ namespace SceneManager switch (removeBarrierOptions.Index) { case 0: - barriers[barriers.Count - 1].Delete(); + barriers[barriers.Count - 1].GetBarrier().Delete(); barriers.RemoveAt(barriers.Count - 1); break; case 1: barriers = barriers.OrderBy(c => c.DistanceTo(Game.LocalPlayer.Character)).ToList(); - barriers[0].Delete(); + barriers[0].GetBarrier().Delete(); barriers.RemoveAt(0); break; case 2: - foreach (Rage.Object c in barriers.Where(c => c)) + foreach (Barrier b in barriers.Where(b => b.GetBarrier())) { - c.Delete(); + b.GetBarrier().Delete(); } if (barriers.Count > 0) { @@ -187,6 +203,7 @@ namespace SceneManager } removeBarrierOptions.Enabled = barriers.Count == 0 ? false : true; + resetBarriers.Enabled = barriers.Count == 0 ? false : true; } private static void SpawnFlare() @@ -207,7 +224,7 @@ namespace SceneManager } }); - barriers.Add(flare); + barriers.Add(new Barrier(flare, flare.Position, flare.Heading)); removeBarrierOptions.Enabled = true; } From d75229c83ede6fd03e14e7efe732e4f19914335f Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 30 Aug 2020 15:34:11 -0600 Subject: [PATCH 076/276] Added new "Add As New Waypoint" menu option to edit waypoint menu --- SceneManager/Menus/EditWaypointMenu.cs | 34 +++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 780e8b7..ef707c1 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -15,13 +15,14 @@ namespace SceneManager public static UIMenu editWaypointMenu { get; private set; } public static UIMenuItem editUpdateWaypoint { get; private set; } public static UIMenuItem editRemoveWaypoint { get; private set; } + public static UIMenuItem addAsNewWaypoint { get; private set; } public static UIMenuNumericScrollerItem editWaypoint; private static UIMenuListScrollerItem changeWaypointType = new UIMenuListScrollerItem("New Waypoint Type", "", waypointTypes); private static UIMenuNumericScrollerItem changeWaypointSpeed; private static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path"); private static UIMenuNumericScrollerItem changeCollectorRadius = new UIMenuNumericScrollerItem("New Collection Radius", "The distance from this waypoint (in meters) vehicles will be collected", 1, 50, 1); private static UIMenuNumericScrollerItem changeSpeedZoneRadius = new UIMenuNumericScrollerItem("New Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 1, 50, 1); - private static UIMenuCheckboxItem updateWaypointPosition; + private static UIMenuCheckboxItem updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false, "Updates the waypoint's position to the player's current position"); internal static void InstantiateMenu() { @@ -51,7 +52,7 @@ namespace SceneManager editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuNumericScrollerItem("New Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 80, 5)); changeWaypointSpeed.Value = (int)MathHelper.ConvertMetersPerSecondToMilesPerHour(PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed); - editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector Waypoint", PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].IsCollector)); + editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector Waypoint", PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].IsCollector, "If this waypoint will collect vehicles to follow the path")); editWaypointMenu.AddItem(changeCollectorRadius); changeCollectorRadius.Value = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].CollectorRadius != 0 @@ -66,11 +67,13 @@ namespace SceneManager changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; changeSpeedZoneRadius.Enabled = collectorWaypoint.Checked ? true : false; - editWaypointMenu.AddItem(updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false)); + editWaypointMenu.AddItem(updateWaypointPosition); editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); editUpdateWaypoint.ForeColor = Color.Gold; editWaypointMenu.AddItem(editRemoveWaypoint = new UIMenuItem("Remove Waypoint")); editRemoveWaypoint.ForeColor = Color.Gold; + editWaypointMenu.AddItem(addAsNewWaypoint = new UIMenuItem("Add as New Waypoint", "Adds a new waypoint to the end of the path with these settings")); + addAsNewWaypoint.ForeColor = Color.Gold; EditPathMenu.editPathMenu.Visible = false; editWaypointMenu.RefreshIndex(); @@ -121,6 +124,31 @@ namespace SceneManager Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Waypoint {currentWaypoint.Number} updated."); } + if (selectedItem == addAsNewWaypoint) + { + var pathIndex = PathMainMenu.GetPaths().IndexOf(currentPath); + var drivingFlag = drivingFlags[changeWaypointType.Index]; + var blip = PathCreationMenu.CreateWaypointBlip(pathIndex); + + if (collectorWaypoint.Checked) + { + var yieldZone = SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH + ? World.AddSpeedZone(Game.LocalPlayer.Character.Position, changeSpeedZoneRadius.Value, SetDriveSpeedForWaypoint()) + : World.AddSpeedZone(Game.LocalPlayer.Character.Position, changeSpeedZoneRadius.Value, SetDriveSpeedForWaypoint()); + PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(currentPath.PathNum, currentWaypoint.Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, yieldZone)); + } + else + { + PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(currentPath.PathNum, currentPath.Waypoints.Last().Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip)); + } + + editWaypointMenu.RemoveItemAt(0); + editWaypoint = new UIMenuNumericScrollerItem("Edit Waypoint", "", PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints.First().Number, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints.Last().Number, 1); + editWaypointMenu.AddItem(editWaypoint, 0); + editWaypoint.Index = editWaypoint.OptionCount - 1; + editWaypointMenu.RefreshIndex(); + } + if (selectedItem == editRemoveWaypoint) { Game.LogTrivial($"[Path {currentPath.PathNum}] Waypoint {currentWaypoint.Number} ({currentWaypoint.DrivingFlag}) removed"); From 774a2801fc5a9989d39e34ba4d6396494c3f805b Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 30 Aug 2020 15:34:39 -0600 Subject: [PATCH 077/276] Created new Barrier class to store barrier information for the new Reset Barriers menu option. --- SceneManager/Barrier.cs | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 SceneManager/Barrier.cs diff --git a/SceneManager/Barrier.cs b/SceneManager/Barrier.cs new file mode 100644 index 0000000..a567c16 --- /dev/null +++ b/SceneManager/Barrier.cs @@ -0,0 +1,39 @@ +using System; +using Rage; + +namespace SceneManager +{ + class Barrier + { + private Rage.Object _barrier { get; set; } + private Vector3 _barrierPosition { get; set; } + private float _barrierRotation { get; set; } + + public Barrier(Rage.Object barrier, Vector3 barrierPosition, float barrierRotation) + { + _barrier = barrier; + _barrierPosition = barrierPosition; + _barrierRotation = barrierRotation; + } + + public Rage.Object GetBarrier() + { + return _barrier; + } + + public Vector3 GetPosition() + { + return _barrierPosition; + } + + public float GetRotation() + { + return _barrierRotation; + } + + internal object DistanceTo(Ped character) + { + throw new NotImplementedException(); + } + } +} From 92c444e9eae03d328cb41a6cb194b66ae4eef165 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 30 Aug 2020 15:34:56 -0600 Subject: [PATCH 078/276] Changed CreateWaypointBlip method from public to private --- SceneManager/Menus/PathCreationMenu.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 8471681..242b603 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -213,7 +213,7 @@ namespace SceneManager return convertedSpeed; } - private static Blip CreateWaypointBlip(int pathIndex) + public static Blip CreateWaypointBlip(int pathIndex) { var spriteNumericalEnum = pathIndex + 17; // 17 because the numerical value of these sprites are always 17 more than the path index var blip = new Blip(Game.LocalPlayer.Character.Position) From 75e1fbcc820c41c9de35a6d50e6d78cd198d456c Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 30 Aug 2020 15:35:26 -0600 Subject: [PATCH 079/276] Updated barrier references as a result of new Barrier class --- SceneManager/EntryPoint.cs | 4 ++-- SceneManager/SceneManager.csproj | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/SceneManager/EntryPoint.cs b/SceneManager/EntryPoint.cs index 1fcc7a3..80dddfe 100644 --- a/SceneManager/EntryPoint.cs +++ b/SceneManager/EntryPoint.cs @@ -60,9 +60,9 @@ namespace SceneManager } // Clean up cones - foreach (Rage.Object cone in BarrierMenu.barriers.Where(c => c)) + foreach (Barrier barrier in BarrierMenu.barriers.Where(b => b.GetBarrier())) { - cone.Delete(); + barrier.GetBarrier().Delete(); } if (BarrierMenu.shadowBarrier) { diff --git a/SceneManager/SceneManager.csproj b/SceneManager/SceneManager.csproj index 0c98606..7af20fd 100644 --- a/SceneManager/SceneManager.csproj +++ b/SceneManager/SceneManager.csproj @@ -51,6 +51,7 @@ + From 24b3eae6a7383e0608ca2ccedd845ad39dc88f7e Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 31 Aug 2020 06:31:45 -0600 Subject: [PATCH 080/276] Fixed value reference for when Barrier menu options are enabled/disabled based on shadow cone distance to player --- SceneManager/Menus/BarrierMenu.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index 1a85641..1baee97 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -93,12 +93,12 @@ namespace SceneManager void DisableBarrierMenuOptionsIfShadowConeTooFar() { - if (shadowBarrier.Position.DistanceTo2D(Game.LocalPlayer.Character.Position) > 15f) + if (shadowBarrier.Position.DistanceTo2D(Game.LocalPlayer.Character.Position) > SettingsMenu.barrierPlacementDistance.Value) { barrierList.Enabled = false; rotateBarrier.Enabled = false; } - else if(shadowBarrier.Position.DistanceTo2D(Game.LocalPlayer.Character.Position) <= 15f && barrierList.SelectedItem == "Flare") + else if(shadowBarrier.Position.DistanceTo2D(Game.LocalPlayer.Character.Position) <= SettingsMenu.barrierPlacementDistance.Value && barrierList.SelectedItem == "Flare") { barrierList.Enabled = true; rotateBarrier.Enabled = false; From a09bd08e7a9f1c6875a731a0779d7cf259be1fd8 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 31 Aug 2020 06:36:21 -0600 Subject: [PATCH 081/276] Moved Barrier.cs into Object folder --- SceneManager/Object Classes/Barrier.cs | 39 ++++++++++++++++++++++++++ SceneManager/SceneManager.csproj | 2 +- 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 SceneManager/Object Classes/Barrier.cs diff --git a/SceneManager/Object Classes/Barrier.cs b/SceneManager/Object Classes/Barrier.cs new file mode 100644 index 0000000..a567c16 --- /dev/null +++ b/SceneManager/Object Classes/Barrier.cs @@ -0,0 +1,39 @@ +using System; +using Rage; + +namespace SceneManager +{ + class Barrier + { + private Rage.Object _barrier { get; set; } + private Vector3 _barrierPosition { get; set; } + private float _barrierRotation { get; set; } + + public Barrier(Rage.Object barrier, Vector3 barrierPosition, float barrierRotation) + { + _barrier = barrier; + _barrierPosition = barrierPosition; + _barrierRotation = barrierRotation; + } + + public Rage.Object GetBarrier() + { + return _barrier; + } + + public Vector3 GetPosition() + { + return _barrierPosition; + } + + public float GetRotation() + { + return _barrierRotation; + } + + internal object DistanceTo(Ped character) + { + throw new NotImplementedException(); + } + } +} diff --git a/SceneManager/SceneManager.csproj b/SceneManager/SceneManager.csproj index 7af20fd..15cb3bf 100644 --- a/SceneManager/SceneManager.csproj +++ b/SceneManager/SceneManager.csproj @@ -51,7 +51,7 @@ - + From c185bed99f737e9a2045b860158b3f8bef39667c Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 31 Aug 2020 06:36:54 -0600 Subject: [PATCH 082/276] Moved Barrier.cs into Objects folder --- SceneManager/Barrier.cs | 39 --------------------------------------- 1 file changed, 39 deletions(-) delete mode 100644 SceneManager/Barrier.cs diff --git a/SceneManager/Barrier.cs b/SceneManager/Barrier.cs deleted file mode 100644 index a567c16..0000000 --- a/SceneManager/Barrier.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using Rage; - -namespace SceneManager -{ - class Barrier - { - private Rage.Object _barrier { get; set; } - private Vector3 _barrierPosition { get; set; } - private float _barrierRotation { get; set; } - - public Barrier(Rage.Object barrier, Vector3 barrierPosition, float barrierRotation) - { - _barrier = barrier; - _barrierPosition = barrierPosition; - _barrierRotation = barrierRotation; - } - - public Rage.Object GetBarrier() - { - return _barrier; - } - - public Vector3 GetPosition() - { - return _barrierPosition; - } - - public float GetRotation() - { - return _barrierRotation; - } - - internal object DistanceTo(Ped character) - { - throw new NotImplementedException(); - } - } -} From 0f70f4d001276d20b03c3e9c0270b7c345cefb2e Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 31 Aug 2020 06:37:07 -0600 Subject: [PATCH 083/276] Increased marker alpha from 80 to 100 --- SceneManager/Object Classes/Waypoint.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index eac2f10..23396b4 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -126,19 +126,19 @@ namespace SceneManager { if(IsCollector && CollectorRadius > 0) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, CollectorRadius, CollectorRadius, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, CollectorRadius, CollectorRadius, 1f, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); if(SpeedZoneRadius > 0) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, SpeedZoneRadius, SpeedZoneRadius, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, SpeedZoneRadius, SpeedZoneRadius, 1f, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); } } else if(DrivingFlag == VehicleDrivingFlags.StopAtDestination) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); } else { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); } } } From 18a49ed14340b57274c094364d7de790c1172129 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 31 Aug 2020 06:42:34 -0600 Subject: [PATCH 084/276] Tweaked AI driving flag values --- SceneManager/AITasking.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 6e8c1a9..e69c6ff 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -56,7 +56,7 @@ namespace SceneManager Game.LogTrivial($"{vehicle.Model.Name} is driving to waypoint {waypoints[nextWaypoint].Number}"); if (waypoints.ElementAtOrDefault(nextWaypoint) != null && !collectedVehicle.StoppedAtWaypoint) { - collectedVehicle.Vehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); + collectedVehicle.Vehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263083, 2f).WaitForCompletion(); collectedVehicle.Vehicle.Driver.Tasks.PerformDrivingManeuver(collectedVehicle.Vehicle, VehicleManeuver.GoForwardWithCustomSteeringAngle, 3); } From fa38dc28e526c99835e580f782742e1652fd88d5 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 31 Aug 2020 06:43:15 -0600 Subject: [PATCH 085/276] Changed speed zone radius options from 50m max with 1m increments to 200m max with 5m increments. --- SceneManager/Menus/EditWaypointMenu.cs | 2 +- SceneManager/Menus/PathCreationMenu.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index ef707c1..7442613 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -21,7 +21,7 @@ namespace SceneManager private static UIMenuNumericScrollerItem changeWaypointSpeed; private static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path"); private static UIMenuNumericScrollerItem changeCollectorRadius = new UIMenuNumericScrollerItem("New Collection Radius", "The distance from this waypoint (in meters) vehicles will be collected", 1, 50, 1); - private static UIMenuNumericScrollerItem changeSpeedZoneRadius = new UIMenuNumericScrollerItem("New Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 1, 50, 1); + private static UIMenuNumericScrollerItem changeSpeedZoneRadius = new UIMenuNumericScrollerItem("New Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 5, 200, 5); private static UIMenuCheckboxItem updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false, "Updates the waypoint's position to the player's current position"); internal static void InstantiateMenu() diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 242b603..2180715 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -18,7 +18,7 @@ namespace SceneManager private static UIMenuNumericScrollerItem waypointSpeed; public static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path"); public static UIMenuNumericScrollerItem collectorRadius = new UIMenuNumericScrollerItem("Collection Radius", "The distance from this waypoint (in meters) vehicles will be collected", 1, 50, 1); - public static UIMenuNumericScrollerItem speedZoneRadius = new UIMenuNumericScrollerItem("Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 1, 50, 1); + public static UIMenuNumericScrollerItem speedZoneRadius = new UIMenuNumericScrollerItem("Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 5, 200, 5); internal static void InstantiateMenu() { From 72f5a4820106ea64c6c1291972445c23c8c08bf3 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 3 Sep 2020 17:48:12 -0600 Subject: [PATCH 086/276] Blips for new waypoints added to disabled paths via the edit waypoint menu will now have correctly transparent blips --- SceneManager/Menus/EditWaypointMenu.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 7442613..018440c 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -128,7 +128,11 @@ namespace SceneManager { var pathIndex = PathMainMenu.GetPaths().IndexOf(currentPath); var drivingFlag = drivingFlags[changeWaypointType.Index]; - var blip = PathCreationMenu.CreateWaypointBlip(pathIndex); + var blip = PathCreationMenu.CreateWaypointBlip(pathIndex, drivingFlag); + if (!currentPath.IsEnabled) + { + blip.Alpha = 0.5f; + } if (collectorWaypoint.Checked) { From 02c545e6a218b5aa77bfd7239d6d6cca3cc71ab1 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 3 Sep 2020 17:49:38 -0600 Subject: [PATCH 087/276] Changed blip colors to match waypoint marker colors --- SceneManager/Menus/PathCreationMenu.cs | 38 ++++++++++++++++++-------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 2180715..ae178e8 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -92,13 +92,13 @@ namespace SceneManager var currentPath = firstNonNullPath.PathNum; var currentWaypoint = PathMainMenu.GetPaths()[pathIndex].Waypoints.Count + 1; var drivingFlag = drivingFlags[waypointType.Index]; - var blip = CreateWaypointBlip(pathIndex); + var blip = CreateWaypointBlip(pathIndex, drivingFlag); if (collectorWaypoint.Checked) { var yieldZone = SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH - ? World.AddSpeedZone(Game.LocalPlayer.Character.Position, speedZoneRadius.Value, MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeed.Value)) - : World.AddSpeedZone(Game.LocalPlayer.Character.Position, speedZoneRadius.Value, MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeed.Value)); + ? World.AddSpeedZone(Game.LocalPlayer.Character.Position, speedZoneRadius.Value * 0.5f, MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeed.Value)) + : World.AddSpeedZone(Game.LocalPlayer.Character.Position, speedZoneRadius.Value * 0.5f, MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeed.Value)); PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, collectorRadius.Value, speedZoneRadius.Value, yieldZone)); } else @@ -151,11 +151,11 @@ namespace SceneManager { Game.LogTrivial($"[Path Creation] Path {currentPath.PathNum} finished with {currentPath.Waypoints.Count} waypoints."); Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Path {i + 1} complete."); - currentPath.Waypoints.Last().Blip.Color = Color.OrangeRed; - if (currentPath.Waypoints.Last().CollectorRadiusBlip) - { - currentPath.Waypoints.Last().CollectorRadiusBlip.Color = Color.OrangeRed; - } + //currentPath.Waypoints.Last().Blip.Color = Color.OrangeRed; + //if (currentPath.Waypoints.Last().CollectorRadiusBlip) + //{ + // currentPath.Waypoints.Last().CollectorRadiusBlip.Color = Color.OrangeRed; + //} currentPath.State = State.Finished; //currentPath.FinishPath(); currentPath.EnablePath(); @@ -176,6 +176,7 @@ namespace SceneManager PathMainMenu.BuildPathMenu(); trafficEndPath.Enabled = false; PathMainMenu.pathMainMenu.Visible = true; + break; } } @@ -213,7 +214,7 @@ namespace SceneManager return convertedSpeed; } - public static Blip CreateWaypointBlip(int pathIndex) + public static Blip CreateWaypointBlip(int pathIndex, VehicleDrivingFlags drivingFlag) { var spriteNumericalEnum = pathIndex + 17; // 17 because the numerical value of these sprites are always 17 more than the path index var blip = new Blip(Game.LocalPlayer.Character.Position) @@ -222,15 +223,28 @@ namespace SceneManager Sprite = (BlipSprite)spriteNumericalEnum }; - if (PathMainMenu.GetPaths()[pathIndex].Waypoints.Count == 0) + if (collectorWaypoint.Checked) { - blip.Color = Color.Orange; + blip.Color = Color.Blue; + } + else if (drivingFlag == VehicleDrivingFlags.StopAtDestination) + { + blip.Color = Color.Red; } else { - blip.Color = Color.Yellow; + blip.Color = Color.Green; } + //if (PathMainMenu.GetPaths()[pathIndex].Waypoints.Count == 0) + //{ + // blip.Color = Color.Orange; + //} + //else + //{ + // blip.Color = Color.Yellow; + //} + return blip; } From 305aa22af2a40683e6bd8dff3ab5d5006506ee57 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 3 Sep 2020 17:49:54 -0600 Subject: [PATCH 088/276] Added more null checks --- SceneManager/Menus/PathMainMenu.cs | 38 +++++++++++++++++------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index ccc6701..6673d30 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -326,7 +326,7 @@ namespace SceneManager if (selectedItem == dismissDriver) { - var nearbyVehicle = Game.LocalPlayer.Character.GetNearbyVehicles(1).Where(v => v.VehicleAndDriverValid()).SingleOrDefault(); + var nearbyVehicle = Game.LocalPlayer.Character.GetNearbyVehicles(1).Where(v => v != Game.LocalPlayer.Character.CurrentVehicle && v.VehicleAndDriverValid()).SingleOrDefault(); if (nearbyVehicle) { switch (dismissDriver.Index) @@ -336,10 +336,13 @@ namespace SceneManager if (nearbyVehicle.IsInCollectedVehicles()) { var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle) as CollectedVehicle; - collectedVehicle.SetDismissNow(true); - collectedVehicle.Vehicle.Driver.Tasks.Clear(); - collectedVehicle.Vehicle.Driver.Dismiss(); - Game.LogTrivial($"Dismissed driver of {collectedVehicle.Vehicle.Model.Name} from path {collectedVehicle.Path}"); + if (collectedVehicle != null) + { + collectedVehicle.SetDismissNow(true); + collectedVehicle.Vehicle.Driver.Tasks.Clear(); + collectedVehicle.Vehicle.Driver.Dismiss(); + Game.LogTrivial($"Dismissed driver of {collectedVehicle.Vehicle.Model.Name} from path {collectedVehicle.Path}"); + } } else { @@ -352,18 +355,21 @@ namespace SceneManager if (nearbyVehicle.IsInCollectedVehicles()) { var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle) as CollectedVehicle; - collectedVehicle.SetStoppedAtWaypoint(false); - collectedVehicle.Vehicle.Driver.Tasks.Clear(); - collectedVehicle.Vehicle.Driver.Dismiss(); + if(collectedVehicle != null) + { + collectedVehicle.SetStoppedAtWaypoint(false); + collectedVehicle.Vehicle.Driver.Tasks.Clear(); + collectedVehicle.Vehicle.Driver.Dismiss(); - if (collectedVehicle.CurrentWaypoint == collectedVehicle.TotalWaypoints && !collectedVehicle.StoppedAtWaypoint) - { - collectedVehicle.SetDismissNow(true); - Game.LogTrivial($"Dismissed driver of {collectedVehicle.Vehicle.Model.Name} from final waypoint and ultimately the path"); - } - else - { - Game.LogTrivial($"Dismissed driver of {collectedVehicle.Vehicle.Model.Name} from waypoint {collectedVehicle.CurrentWaypoint}"); + if (collectedVehicle.CurrentWaypoint == collectedVehicle.TotalWaypoints && !collectedVehicle.StoppedAtWaypoint) + { + collectedVehicle.SetDismissNow(true); + Game.LogTrivial($"Dismissed driver of {collectedVehicle.Vehicle.Model.Name} from final waypoint and ultimately the path"); + } + else + { + Game.LogTrivial($"Dismissed driver of {collectedVehicle.Vehicle.Model.Name} from waypoint {collectedVehicle.CurrentWaypoint}"); + } } } else From b619e486506b18a522969fadb42bc56ef5f1fa08 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 3 Sep 2020 17:50:10 -0600 Subject: [PATCH 089/276] Added Driver property --- SceneManager/Object Classes/CollectedVehicle.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index acda8ec..883491c 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -4,6 +4,7 @@ namespace SceneManager { public class CollectedVehicle { + public Ped Driver { get; private set; } public Vehicle Vehicle { get; private set; } public string LicensePlate { get; private set; } public int Path { get; private set; } @@ -16,6 +17,7 @@ namespace SceneManager public CollectedVehicle(Vehicle vehicle, string licensePlate, int path, int totalWaypoints, int currentWaypoint, bool tasksAssigned, bool dismissNow) { Vehicle = vehicle; + Driver = vehicle.Driver; LicensePlate = licensePlate; Path = path; TotalWaypoints = totalWaypoints; From 97314a2cdeb252ab13440fd13aed6b750c88cc98 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 3 Sep 2020 17:50:57 -0600 Subject: [PATCH 090/276] Removed unused code. Fixed blip opacity not being restored to normal when the path is re-enabled --- SceneManager/Object Classes/Path.cs | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/SceneManager/Object Classes/Path.cs b/SceneManager/Object Classes/Path.cs index 3fb5dc5..023e420 100644 --- a/SceneManager/Object Classes/Path.cs +++ b/SceneManager/Object Classes/Path.cs @@ -12,7 +12,6 @@ namespace SceneManager public class Path { public int PathNum { get; private set; } - //public bool PathFinished { get; private set; } public bool IsEnabled { get; private set; } public State State { get; set; } @@ -21,7 +20,6 @@ namespace SceneManager public Path(int pathNum, bool pathFinished, bool pathDisabled, List waypoints) { PathNum = pathNum; - //PathFinished = pathFinished; IsEnabled = pathDisabled; Waypoints = waypoints; } @@ -30,7 +28,6 @@ namespace SceneManager { PathNum = pathNum; State = pathState; - //PathFinished = pathFinished; } public void SetPathNumber(int pathNum) @@ -38,11 +35,6 @@ namespace SceneManager PathNum = pathNum; } - //public void FinishPath() - //{ - // PathFinished = true; - //} - private void LowerWaypointBlipsOpacity() { foreach (Waypoint wp in Waypoints) @@ -59,10 +51,13 @@ namespace SceneManager { foreach (Waypoint wp in Waypoints) { - wp.Blip.Alpha = 1.0f; - if (wp.CollectorRadiusBlip) + if (wp.Blip) { - wp.CollectorRadiusBlip.Alpha = 0.5f; + wp.Blip.Alpha = 1.0f; + if (wp.CollectorRadiusBlip) + { + wp.CollectorRadiusBlip.Alpha = 0.5f; + } } } } @@ -76,6 +71,7 @@ namespace SceneManager public void EnablePath() { IsEnabled = true; + RestoreWaypointBlipsOpacity(); } From 046bfbd5996a3d158146722eb8b9b239d69658ae Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 3 Sep 2020 17:51:36 -0600 Subject: [PATCH 091/276] Fixed collector radius not matching marker radius --- SceneManager/Object Classes/Waypoint.cs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 23396b4..9742b1d 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -1,4 +1,5 @@ using Rage; +using System.Drawing; namespace SceneManager { @@ -39,7 +40,7 @@ namespace SceneManager CollectorRadius = collectorRadius; SpeedZoneRadius = speedZoneRadius; YieldZone = yieldZone; - CollectorRadiusBlip = new Blip(waypointBlip.Position, collectorRadius) + CollectorRadiusBlip = new Blip(waypointBlip.Position, collectorRadius * 0.5f) { Color = waypointBlip.Color, Alpha = 0.5f @@ -63,15 +64,17 @@ namespace SceneManager { IsCollector = true; World.RemoveSpeedZone(YieldZone); - YieldZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, SpeedZoneRadius, drivingSpeed); + YieldZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, SpeedZoneRadius * 0.5f, drivingSpeed); + Blip.Color = Color.Blue; if (CollectorRadiusBlip) { + currentWaypoint.CollectorRadiusBlip.Position = Game.LocalPlayer.Character.Position; currentWaypoint.CollectorRadiusBlip.Alpha = 0.5f; - currentWaypoint.CollectorRadiusBlip.Scale = collectorRadius; + currentWaypoint.CollectorRadiusBlip.Scale = collectorRadius * 0.5f; } else { - CollectorRadiusBlip = new Blip(Blip.Position, collectorRadius) + CollectorRadiusBlip = new Blip(Blip.Position, collectorRadius * 0.5f) { Color = Blip.Color, Alpha = 0.5f @@ -105,6 +108,14 @@ namespace SceneManager private void UpdateDrivingFlag(VehicleDrivingFlags newDrivingFlag) { DrivingFlag = newDrivingFlag; + if (newDrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + Blip.Color = Color.Red; + } + else + { + Blip.Color = Color.Green; + } } private void UpdateWaypointBlipPosition() From 268bcc4ca6fb135b6dc1070e2e21ff8c8dcf77b8 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 3 Sep 2020 17:52:28 -0600 Subject: [PATCH 092/276] Fixed AI driving around vehicles stopped at Stop waypoints. --- SceneManager/AITasking.cs | 18 ++++++++++- SceneManager/VehicleCollector.cs | 55 ++------------------------------ 2 files changed, 20 insertions(+), 53 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index e69c6ff..a06db1c 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -1,4 +1,5 @@ using Rage; +using System; using System.Collections.Generic; using System.Linq; @@ -32,6 +33,15 @@ namespace SceneManager private static void DriveVehicleToNextWaypoint(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) { + if (!collectedVehicle.Vehicle) + { + return; + } + if (!collectedVehicle.Driver) + { + return; + } + var vehicle = collectedVehicle.Vehicle; var driver = vehicle.Driver; @@ -72,8 +82,13 @@ namespace SceneManager private static void StopVehicleAtWaypoint(CollectedVehicle collectedVehicle) { Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} stopping at waypoint."); - collectedVehicle.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); + collectedVehicle.Driver.Tasks.DriveToPosition(collectedVehicle.Vehicle.FrontPosition, 10f, VehicleDrivingFlags.StopAtDestination); collectedVehicle.SetStoppedAtWaypoint(true); + + while (collectedVehicle.Vehicle && collectedVehicle.StoppedAtWaypoint) + { + GameFiber.Yield(); + } } public static void DismissDriver(CollectedVehicle cv) @@ -103,6 +118,7 @@ namespace SceneManager cv.Vehicle.Driver.IsPersistent = false; cv.Vehicle.Dismiss(); + cv.Vehicle.IsSirenOn = false; cv.Vehicle.IsPersistent = false; Game.LogTrivial($"{cv.Vehicle.Model.Name} dismissed successfully."); diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index c93d584..aaa239c 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -10,34 +10,11 @@ namespace SceneManager { // Driving styles https://gtaforums.com/topic/822314-guide-driving-styles/ // also https://vespura.com/fivem/drivingstyle/ - [Flags] - private enum EDrivingFlags - { - None = 0, - StopForVehicles = 1, - StopForPeds = 2, - AvoidEmptyVehicles = 8, - AvoidPeds = 16, - AvoidObjects = 32, - StopForTrafficLights = 128, - UseBlinkers = 256, - AllowWrongWay = 512, - TakeShortestPath = 262144, - IgnoreRoads = 4194304, - IgnorePathfinding = 16777216, - AvoidHighways = 536870912, - Normal = StopForVehicles | StopForPeds | AvoidEmptyVehicles | StopForTrafficLights | UseBlinkers | AllowWrongWay | IgnoreRoads, - TotalControl = AllowWrongWay | AvoidObjects | AvoidPeds | TakeShortestPath | StopForTrafficLights | IgnorePathfinding | StopForVehicles - } - //public static Dictionary collectedVehicles = new Dictionary(); public static List collectedVehicles = new List(); public static void StartCollectingAtWaypoint(List paths, Path path, Waypoint waypoint) { - GameFiber AssignStopFlagForVehiclesFiber = new GameFiber(() => AssignStopForVehiclesFlag(paths, path, waypoint)); - AssignStopFlagForVehiclesFiber.Start(); - while (paths.Contains(path) && path.Waypoints.Contains(waypoint)) { if (path.IsEnabled && waypoint.IsCollector) @@ -57,7 +34,7 @@ namespace SceneManager break; } - Game.LogTrivial($"Vehicle: {vehicle.Model.Name}, Distance to waypoint: {vehicle.DistanceTo2D(waypoint.Position)}"); + Game.LogTrivial($"Vehicle: {vehicle.Model.Name}, Waypoint collector radius: {waypoint.CollectorRadius}, Distance to waypoint: {vehicle.DistanceTo2D(waypoint.Position)}"); var collectedVehicle = collectedVehicles.Where(cv => cv.Vehicle == vehicle) as CollectedVehicle; // If the vehicle is not in the collection yet @@ -82,35 +59,9 @@ namespace SceneManager } } - private static Vehicle[] GetNearbyVehiclesForCollection(Vector3 collectorPosition, float collectorRadius) + private static Vehicle[] GetNearbyVehiclesForCollection(Vector3 collectorWaypointPosition, float collectorRadius) { - return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorPosition) <= collectorRadius && v.IsValidForCollection() select v).ToArray(); - } - - private static Vehicle[] GetNearbyVehiclesForStopFlag(Vector3 collectorPosition) - { - return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorPosition) <= 50f select v).ToArray(); - } - - private static void AssignStopForVehiclesFlag(List paths, Path path, Waypoint waypoint) - { - while (paths.Contains(path) && path.Waypoints.Contains(waypoint)) - { - if (path.IsEnabled) - { - foreach (Vehicle v in GetNearbyVehiclesForStopFlag(waypoint.Position).Where(v => v && v.HasDriver && v.Driver)) - { - SetDriveTaskDrivingFlags(v.Driver, EDrivingFlags.StopForVehicles); - } - } - GameFiber.Sleep(500); - } - } - - private static void SetDriveTaskDrivingFlags(this Ped ped, EDrivingFlags flags) - { - ulong SetDriveTaskDrivingFlagsHash = 0xDACE1BE37D88AF67; - Rage.Native.NativeFunction.CallByHash(SetDriveTaskDrivingFlagsHash, ped, (int)flags); + return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorWaypointPosition) <= collectorRadius - 0.5f && v.IsValidForCollection() select v).ToArray(); } private static CollectedVehicle AddVehicleToCollection(Path path, Waypoint waypoint, Vehicle v) From 7c28d2ddddb7a466f173d362c6f9365418bd169c Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Fri, 4 Sep 2020 04:34:40 -0600 Subject: [PATCH 093/276] Excluded flares from being reset --- SceneManager/Menus/BarrierMenu.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index 1baee97..7e0ff9c 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -157,7 +157,7 @@ namespace SceneManager if(selectedItem == resetBarriers) { - foreach(Barrier barrier in barriers.Where(b => b.GetBarrier())) + foreach(Barrier barrier in barriers.Where(b => b.GetBarrier() && !b.GetBarrier().Model.Name.Contains("flare"))) { barrier.GetBarrier().Position = barrier.GetPosition(); barrier.GetBarrier().Heading = barrier.GetRotation(); From 1738708e3233b76854c55094a3991cdb3d55e45d Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Fri, 4 Sep 2020 04:35:22 -0600 Subject: [PATCH 094/276] Removed 0.5 multiplier from radiuses --- SceneManager/Object Classes/Waypoint.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 9742b1d..54c25f6 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -40,7 +40,7 @@ namespace SceneManager CollectorRadius = collectorRadius; SpeedZoneRadius = speedZoneRadius; YieldZone = yieldZone; - CollectorRadiusBlip = new Blip(waypointBlip.Position, collectorRadius * 0.5f) + CollectorRadiusBlip = new Blip(waypointBlip.Position, collectorRadius) { Color = waypointBlip.Color, Alpha = 0.5f @@ -64,7 +64,7 @@ namespace SceneManager { IsCollector = true; World.RemoveSpeedZone(YieldZone); - YieldZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, SpeedZoneRadius * 0.5f, drivingSpeed); + YieldZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, SpeedZoneRadius, drivingSpeed); Blip.Color = Color.Blue; if (CollectorRadiusBlip) { @@ -74,7 +74,7 @@ namespace SceneManager } else { - CollectorRadiusBlip = new Blip(Blip.Position, collectorRadius * 0.5f) + CollectorRadiusBlip = new Blip(Blip.Position) { Color = Blip.Color, Alpha = 0.5f From c40f2e13a57e026ea24c35573bdf488c04fc4965 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Fri, 4 Sep 2020 04:35:49 -0600 Subject: [PATCH 095/276] Removed unused using statements --- SceneManager/AITasking.cs | 1 - SceneManager/VehicleCollector.cs | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index a06db1c..cf524d3 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -1,5 +1,4 @@ using Rage; -using System; using System.Collections.Generic; using System.Linq; diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index aaa239c..b1c12b9 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Drawing; using System.Linq; using Rage; From beeafcb6a04cbe0f07c185b9f02372f572cfd2f5 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Fri, 4 Sep 2020 19:55:55 -0600 Subject: [PATCH 096/276] Speed radius can now no longer be less than collection radius. --- SceneManager/Menus/EditWaypointMenu.cs | 17 ++++++++++++++++- SceneManager/Menus/PathCreationMenu.cs | 20 ++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 018440c..899caae 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Drawing; using System.Linq; using Rage; @@ -94,6 +93,22 @@ namespace SceneManager changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; changeSpeedZoneRadius.Enabled = collectorWaypoint.Checked ? true : false; } + + if (scrollerItem == changeCollectorRadius) + { + if (changeCollectorRadius.Value > changeSpeedZoneRadius.Value) + { + changeSpeedZoneRadius.ScrollToNextOption(); + } + } + + if (scrollerItem == changeSpeedZoneRadius) + { + if (changeSpeedZoneRadius.Value < changeCollectorRadius.Value) + { + changeCollectorRadius.Value = changeSpeedZoneRadius.Value; + } + } } private static void EditWaypoint_OnCheckboxChanged(UIMenu sender, UIMenuCheckboxItem checkboxItem, bool @checked) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index ae178e8..082238c 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -49,6 +49,7 @@ namespace SceneManager pathCreationMenu.RefreshIndex(); pathCreationMenu.OnItemSelect += PathCreation_OnItemSelected; pathCreationMenu.OnCheckboxChange += PathCreation_OnCheckboxChanged; + pathCreationMenu.OnScrollerChange += PathCreation_OnScrollerChanged; } private static void PathCreation_OnCheckboxChanged(UIMenu sender, UIMenuCheckboxItem checkboxItem, bool @checked) @@ -183,6 +184,25 @@ namespace SceneManager } } + private static void PathCreation_OnScrollerChanged(UIMenu sender, UIMenuScrollerItem scrollerItem, int first, int last) + { + if (scrollerItem == collectorRadius) + { + if (collectorRadius.Value > speedZoneRadius.Value) + { + speedZoneRadius.ScrollToNextOption(); + } + } + + if(scrollerItem == speedZoneRadius) + { + if(speedZoneRadius.Value < collectorRadius.Value) + { + collectorRadius.Value = speedZoneRadius.Value; + } + } + } + private static void ToggleTrafficEndPathMenuItem(int pathIndex) { if (PathMainMenu.GetPaths()[pathIndex].Waypoints.Count > 0) From 6b2cb588cb6ac14f3dba0d1746bcfef44cbba51e Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 5 Sep 2020 14:04:01 -0600 Subject: [PATCH 097/276] Refactored reference names for easier readability. Added event handler for OnIndexChanged on editWaypoint scroller item as a part of drawing the marker for the waypoint currently being edited. --- SceneManager/Menus/EditWaypointMenu.cs | 98 +++++++++++++++++--------- 1 file changed, 64 insertions(+), 34 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 899caae..9e25e3d 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -12,16 +12,16 @@ namespace SceneManager private static VehicleDrivingFlags[] drivingFlags = new VehicleDrivingFlags[] { VehicleDrivingFlags.Normal, VehicleDrivingFlags.StopAtDestination }; private static string[] waypointTypes = new string[] { "Drive To", "Stop" }; public static UIMenu editWaypointMenu { get; private set; } - public static UIMenuItem editUpdateWaypoint { get; private set; } - public static UIMenuItem editRemoveWaypoint { get; private set; } + public static UIMenuItem updateWaypoint { get; private set; } + public static UIMenuItem removeWaypoint { get; private set; } public static UIMenuItem addAsNewWaypoint { get; private set; } public static UIMenuNumericScrollerItem editWaypoint; - private static UIMenuListScrollerItem changeWaypointType = new UIMenuListScrollerItem("New Waypoint Type", "", waypointTypes); + public static UIMenuListScrollerItem changeWaypointType = new UIMenuListScrollerItem("Waypoint Type", "", waypointTypes); private static UIMenuNumericScrollerItem changeWaypointSpeed; - private static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path"); - private static UIMenuNumericScrollerItem changeCollectorRadius = new UIMenuNumericScrollerItem("New Collection Radius", "The distance from this waypoint (in meters) vehicles will be collected", 1, 50, 1); - private static UIMenuNumericScrollerItem changeSpeedZoneRadius = new UIMenuNumericScrollerItem("New Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 5, 200, 5); - private static UIMenuCheckboxItem updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false, "Updates the waypoint's position to the player's current position"); + public static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path"); + public static UIMenuNumericScrollerItem changeCollectorRadius = new UIMenuNumericScrollerItem("Collection Radius", "The distance from this waypoint (in meters) vehicles will be collected", 1, 50, 1); + public static UIMenuNumericScrollerItem changeSpeedZoneRadius = new UIMenuNumericScrollerItem("Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 5, 200, 5); + public static UIMenuCheckboxItem updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false, "Updates the waypoint's position to the player's current position"); internal static void InstantiateMenu() { @@ -32,45 +32,51 @@ namespace SceneManager public static void BuildEditWaypointMenu() { + var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Value - 1]; + Game.LogTrivial($"Current path: {currentPath.Number}"); + // Need to unsubscribe from these or else there will be duplicate firings if the user left the menu, then re-entered editWaypointMenu.OnItemSelect -= EditWaypoint_OnItemSelected; editWaypointMenu.OnCheckboxChange -= EditWaypoint_OnCheckboxChanged; editWaypointMenu.OnScrollerChange -= EditWaypoint_OnScrollerChanged; - var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index]; - editWaypoint = new UIMenuNumericScrollerItem("Edit Waypoint", "", PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints.First().Number, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints.Last().Number, 1); + editWaypoint = new UIMenuNumericScrollerItem("Edit Waypoint", "", currentPath.Waypoints.First().Number, currentPath.Waypoints.Last().Number, 1); + editWaypoint.IndexChanged -= EditWaypoint_OnIndexChanged; editWaypointMenu.Clear(); editWaypointMenu.AddItem(editWaypoint); editWaypoint.Index = 0; + var currentWaypoint = currentPath.Waypoints[editWaypoint.Value - 1]; + Game.LogTrivial($"Current waypoint: {currentWaypoint.Number}, Driving flag: {currentWaypoint.DrivingFlag.ToString()}"); + editWaypointMenu.AddItem(changeWaypointType); - changeWaypointType.Index = Array.IndexOf(drivingFlags, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].DrivingFlag); + changeWaypointType.Index = Array.IndexOf(drivingFlags, currentWaypoint.DrivingFlag); - editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuNumericScrollerItem("New Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 80, 5)); - changeWaypointSpeed.Value = (int)MathHelper.ConvertMetersPerSecondToMilesPerHour(PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed); + editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 80, 5)); + changeWaypointSpeed.Value = (int)MathHelper.ConvertMetersPerSecondToMilesPerHour(currentWaypoint.Speed); - editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector Waypoint", PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].IsCollector, "If this waypoint will collect vehicles to follow the path")); + editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector Waypoint", currentWaypoint.IsCollector, "If this waypoint will collect vehicles to follow the path")); editWaypointMenu.AddItem(changeCollectorRadius); - changeCollectorRadius.Value = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].CollectorRadius != 0 - ? (int)PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].CollectorRadius + changeCollectorRadius.Value = currentWaypoint.CollectorRadius != 0 + ? (int)currentWaypoint.CollectorRadius : changeCollectorRadius.Minimum; editWaypointMenu.AddItem(changeSpeedZoneRadius); - changeSpeedZoneRadius.Value = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].CollectorRadius != 0 - ? (int)PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].SpeedZoneRadius + changeSpeedZoneRadius.Value = currentWaypoint.CollectorRadius != 0 + ? (int)currentWaypoint.SpeedZoneRadius : changeSpeedZoneRadius.Minimum; changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; changeSpeedZoneRadius.Enabled = collectorWaypoint.Checked ? true : false; editWaypointMenu.AddItem(updateWaypointPosition); - editWaypointMenu.AddItem(editUpdateWaypoint = new UIMenuItem("Update Waypoint")); - editUpdateWaypoint.ForeColor = Color.Gold; - editWaypointMenu.AddItem(editRemoveWaypoint = new UIMenuItem("Remove Waypoint")); - editRemoveWaypoint.ForeColor = Color.Gold; + editWaypointMenu.AddItem(updateWaypoint = new UIMenuItem("Update Waypoint")); + updateWaypoint.ForeColor = Color.Gold; + editWaypointMenu.AddItem(removeWaypoint = new UIMenuItem("Remove Waypoint")); + removeWaypoint.ForeColor = Color.Gold; editWaypointMenu.AddItem(addAsNewWaypoint = new UIMenuItem("Add as New Waypoint", "Adds a new waypoint to the end of the path with these settings")); addAsNewWaypoint.ForeColor = Color.Gold; @@ -81,17 +87,36 @@ namespace SceneManager editWaypointMenu.OnScrollerChange += EditWaypoint_OnScrollerChanged; editWaypointMenu.OnCheckboxChange += EditWaypoint_OnCheckboxChanged; editWaypointMenu.OnItemSelect += EditWaypoint_OnItemSelected; + editWaypoint.IndexChanged += EditWaypoint_OnIndexChanged; + + currentWaypoint.DrawMarkerForEditWaypoint(); + } + + private static void EditWaypoint_OnIndexChanged(UIMenuScrollerItem scrollerItem, int oldIndex, int newIndex) + { + var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Value - 1]; + var currentWaypoint = currentPath.Waypoints[editWaypoint.Value - 1]; + + if (scrollerItem == editWaypoint) + { + currentPath.Waypoints[oldIndex].EnableWaypointMarker(true); + } } private static void EditWaypoint_OnScrollerChanged(UIMenu sender, UIMenuScrollerItem scrollerItem, int first, int last) { - if(scrollerItem == editWaypoint) + var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Value - 1]; + var currentWaypoint = currentPath.Waypoints[editWaypoint.Value - 1]; + + if (scrollerItem == editWaypoint) { - changeWaypointType.Index = Array.IndexOf(drivingFlags, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].DrivingFlag); - changeWaypointSpeed.Value = (int)MathHelper.ConvertMetersPerSecondToMilesPerHour(PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].Speed); - collectorWaypoint.Checked = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints[editWaypoint.Index].IsCollector; + changeWaypointType.Index = Array.IndexOf(drivingFlags, currentWaypoint.DrivingFlag); + changeWaypointSpeed.Value = (int)MathHelper.ConvertMetersPerSecondToMilesPerHour(currentWaypoint.Speed); + collectorWaypoint.Checked = currentWaypoint.IsCollector; changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; changeSpeedZoneRadius.Enabled = collectorWaypoint.Checked ? true : false; + updateWaypointPosition.Checked = false; + currentWaypoint.DrawMarkerForEditWaypoint(); } if (scrollerItem == changeCollectorRadius) @@ -113,6 +138,9 @@ namespace SceneManager private static void EditWaypoint_OnCheckboxChanged(UIMenu sender, UIMenuCheckboxItem checkboxItem, bool @checked) { + var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Value - 1]; + var currentWaypoint = currentPath.Waypoints[editWaypoint.Value - 1]; + if (checkboxItem == collectorWaypoint) { changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; @@ -125,22 +153,23 @@ namespace SceneManager var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index]; var currentWaypoint = currentPath.Waypoints[editWaypoint.Index]; - if (selectedItem == editUpdateWaypoint) + if (selectedItem == updateWaypoint) { currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], SetDriveSpeedForWaypoint(), collectorWaypoint.Checked, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, updateWaypointPosition.Checked); - Game.LogTrivial($"Updated path {currentPath.PathNum} waypoint {currentWaypoint.Number}: Driving flag is {drivingFlags[changeWaypointType.Index].ToString()}, speed is {changeWaypointSpeed.Value}, collector is {currentWaypoint.IsCollector}"); + Game.LogTrivial($"Updated path {currentPath.Number} waypoint {currentWaypoint.Number}: Driving flag is {drivingFlags[changeWaypointType.Index].ToString()}, speed is {changeWaypointSpeed.Value}, collector is {currentWaypoint.IsCollector}"); if (currentPath.Waypoints.Count < 2 && currentPath.Waypoints[0].DrivingFlag == VehicleDrivingFlags.StopAtDestination) { Game.LogTrivial($"The remaining waypoint was updated to be a stop waypoint. Enabling/disabling the path is no longer locked."); EditPathMenu.togglePath.Enabled = true; } - + updateWaypointPosition.Checked = false; Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Waypoint {currentWaypoint.Number} updated."); } if (selectedItem == addAsNewWaypoint) { + currentWaypoint.EnableWaypointMarker(true); var pathIndex = PathMainMenu.GetPaths().IndexOf(currentPath); var drivingFlag = drivingFlags[changeWaypointType.Index]; var blip = PathCreationMenu.CreateWaypointBlip(pathIndex, drivingFlag); @@ -154,27 +183,28 @@ namespace SceneManager var yieldZone = SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH ? World.AddSpeedZone(Game.LocalPlayer.Character.Position, changeSpeedZoneRadius.Value, SetDriveSpeedForWaypoint()) : World.AddSpeedZone(Game.LocalPlayer.Character.Position, changeSpeedZoneRadius.Value, SetDriveSpeedForWaypoint()); - PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(currentPath.PathNum, currentWaypoint.Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, yieldZone)); + currentPath.Waypoints.Add(new Waypoint(currentPath.Number, currentWaypoint.Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, yieldZone)); } else { - PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(currentPath.PathNum, currentPath.Waypoints.Last().Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip)); + currentPath.Waypoints.Add(new Waypoint(currentPath.Number, currentPath.Waypoints.Last().Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip)); } editWaypointMenu.RemoveItemAt(0); - editWaypoint = new UIMenuNumericScrollerItem("Edit Waypoint", "", PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints.First().Number, PathMainMenu.GetPaths()[PathMainMenu.editPath.Index].Waypoints.Last().Number, 1); + editWaypoint = new UIMenuNumericScrollerItem("Edit Waypoint", "", currentPath.Waypoints.First().Number, currentPath.Waypoints.Last().Number, 1); editWaypointMenu.AddItem(editWaypoint, 0); editWaypoint.Index = editWaypoint.OptionCount - 1; editWaypointMenu.RefreshIndex(); + updateWaypointPosition.Checked = false; } - if (selectedItem == editRemoveWaypoint) + if (selectedItem == removeWaypoint) { - Game.LogTrivial($"[Path {currentPath.PathNum}] Waypoint {currentWaypoint.Number} ({currentWaypoint.DrivingFlag}) removed"); + Game.LogTrivial($"[Path {currentPath.Number}] Waypoint {currentWaypoint.Number} ({currentWaypoint.DrivingFlag}) removed"); if (currentPath.Waypoints.Count == 1) { Game.LogTrivial($"Deleting the last waypoint from the path."); - PathMainMenu.DeletePath(currentPath, currentPath.PathNum - 1, PathMainMenu.Delete.Single); + PathMainMenu.DeletePath(currentPath, currentPath.Number - 1, PathMainMenu.Delete.Single); editWaypointMenu.Visible = false; PathMainMenu.pathMainMenu.Visible = true; From 801eca2cb22a34a9c4be32960a4e4b1ec8a8629a Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 5 Sep 2020 14:05:30 -0600 Subject: [PATCH 098/276] Refactored reference names, removed unused code. --- SceneManager/Menus/PathCreationMenu.cs | 16 +++------- SceneManager/Menus/PathMainMenu.cs | 43 ++++++++++++++------------ 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 082238c..acedbb2 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -75,7 +75,7 @@ namespace SceneManager if (SettingsMenu.debugGraphics.Checked) { - DebugGraphics.LoopToDrawDebugGraphics(SettingsMenu.debugGraphics, PathMainMenu.GetPaths()[0]); + DebugGraphics.LoopToDrawDebugGraphics(PathMainMenu.GetPaths()[0]); } } else if(anyPathsExist && !PathMainMenu.GetPaths().Any(p => p != null && p.State == State.Creating)) @@ -84,13 +84,13 @@ namespace SceneManager if (SettingsMenu.debugGraphics.Checked) { - DebugGraphics.LoopToDrawDebugGraphics(SettingsMenu.debugGraphics, PathMainMenu.GetPaths().Where(p => p != null && p.State == State.Creating).First()); + DebugGraphics.LoopToDrawDebugGraphics(PathMainMenu.GetPaths().Where(p => p != null && p.State == State.Creating).First()); } } var firstNonNullPath = PathMainMenu.GetPaths().Where(p => p != null && p.State == State.Creating).First(); var pathIndex = PathMainMenu.GetPaths().IndexOf(firstNonNullPath); - var currentPath = firstNonNullPath.PathNum; + var currentPath = firstNonNullPath.Number; var currentWaypoint = PathMainMenu.GetPaths()[pathIndex].Waypoints.Count + 1; var drivingFlag = drivingFlags[waypointType.Index]; var blip = CreateWaypointBlip(pathIndex, drivingFlag); @@ -150,18 +150,12 @@ namespace SceneManager var currentPath = PathMainMenu.GetPaths()[i]; if (PathMainMenu.GetPaths().ElementAtOrDefault(i) != null && currentPath.State == State.Creating) { - Game.LogTrivial($"[Path Creation] Path {currentPath.PathNum} finished with {currentPath.Waypoints.Count} waypoints."); + Game.LogTrivial($"[Path Creation] Path {currentPath.Number} finished with {currentPath.Waypoints.Count} waypoints."); Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Path {i + 1} complete."); - //currentPath.Waypoints.Last().Blip.Color = Color.OrangeRed; - //if (currentPath.Waypoints.Last().CollectorRadiusBlip) - //{ - // currentPath.Waypoints.Last().CollectorRadiusBlip.Color = Color.OrangeRed; - //} currentPath.State = State.Finished; - //currentPath.FinishPath(); currentPath.EnablePath(); currentPath.SetPathNumber(i + 1); - PathMainMenu.AddPathToPathCountList(i, currentPath.PathNum); + //PathMainMenu.AddPathToPathCountList(i, currentPath.PathNum); // For each waypoint in the path's WaypointData, start a collector game fiber and loop while the path and waypoint exist, and while the path is enabled foreach (Waypoint waypoint in PathMainMenu.GetPaths()[i].Waypoints) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index 6673d30..b038d95 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -9,17 +9,20 @@ namespace SceneManager { static class PathMainMenu { + private static List paths = new List() { }; + public static UIMenu pathMainMenu { get; private set; } public static UIMenuItem createNewPath { get; private set; } public static UIMenuItem deleteAllPaths; - public static UIMenuListScrollerItem editPath { get; private set; } + public static UIMenuNumericScrollerItem editPath = new UIMenuNumericScrollerItem("Edit Path", "", 1, paths.Count, 1); + //public static UIMenuListScrollerItem editPath { get; private set; } public static UIMenuListScrollerItem directOptions { get; private set; } - public static UIMenuListScrollerItem directDriver { get; private set; } + public static UIMenuNumericScrollerItem directDriver = new UIMenuNumericScrollerItem("Direct nearest driver to path", "", 1, paths.Count, 1); + //public static UIMenuListScrollerItem directDriver { get; private set; } public static UIMenuListScrollerItem dismissDriver { get; private set; } public static UIMenuCheckboxItem disableAllPaths { get; private set; } - private static List pathsNum = new List(); - private static List paths = new List() { }; + //private static List pathsNum = new List(); private static List dismissOptions = new List() { "From path", "From waypoint", "From position" }; public enum Delete { @@ -44,13 +47,15 @@ namespace SceneManager pathMainMenu.AddItem(createNewPath = new UIMenuItem("Create New Path")); createNewPath.ForeColor = Color.Gold; - pathMainMenu.AddItem(editPath = new UIMenuListScrollerItem("Edit Path", "", pathsNum)); + pathMainMenu.AddItem(editPath = new UIMenuNumericScrollerItem("Edit Path", "", 1, paths.Count, 1)); + //pathMainMenu.AddItem(editPath = new UIMenuListScrollerItem("Edit Path", "", pathsNum)); editPath.ForeColor = Color.Gold; pathMainMenu.AddItem(disableAllPaths = new UIMenuCheckboxItem("Disable All Paths", false)); pathMainMenu.AddItem(deleteAllPaths = new UIMenuItem("Delete All Paths")); deleteAllPaths.ForeColor = Color.Gold; pathMainMenu.AddItem(directOptions = new UIMenuListScrollerItem("Direct driver to path's", "", new[] { "First waypoint", "Nearest waypoint" })); - pathMainMenu.AddItem(directDriver = new UIMenuListScrollerItem("Direct nearest driver to path", "", pathsNum)); + pathMainMenu.AddItem(directDriver = new UIMenuNumericScrollerItem("Direct nearest driver to path", "", 1, paths.Count, 1)); + //pathMainMenu.AddItem(directDriver = new UIMenuListScrollerItem("Direct nearest driver to path", "", pathsNum)); directDriver.ForeColor = Color.Gold; pathMainMenu.AddItem(dismissDriver = new UIMenuListScrollerItem("Dismiss nearest driver", "", dismissOptions)); dismissDriver.ForeColor = Color.Gold; @@ -80,10 +85,10 @@ namespace SceneManager return ref paths; } - public static void AddPathToPathCountList(int indexToInsertAt, int pathNum) - { - pathsNum.Insert(indexToInsertAt, pathNum); - } + //public static void AddPathToPathCountList(int indexToInsertAt, int pathNum) + //{ + // pathsNum.Insert(indexToInsertAt, pathNum); + //} private static bool VehicleAndDriverValid(this Vehicle v) { @@ -115,8 +120,8 @@ namespace SceneManager { // Before deleting a path, we need to dismiss any vehicles controlled by that path and remove the vehicles from ControlledVehicles //Game.LogTrivial($"Deleting path {index+1}"); - Game.LogTrivial($"Deleting path {path.PathNum}"); - var pathVehicles = VehicleCollector.collectedVehicles.Where(cv => cv.Path == path.PathNum).ToList(); + Game.LogTrivial($"Deleting path {path.Number}"); + var pathVehicles = VehicleCollector.collectedVehicles.Where(cv => cv.Path == path.Number).ToList(); Game.LogTrivial($"Removing all vehicles on the path"); foreach (CollectedVehicle cv in pathVehicles.Where(cv => cv.Vehicle && cv.Vehicle.Driver)) @@ -158,11 +163,11 @@ namespace SceneManager paths.RemoveAt(index); //Game.LogTrivial("pathsNum count: " + pathsNum.Count); //Game.LogTrivial("index: " + index); - pathsNum.RemoveAt(index); + //pathsNum.RemoveAt(index); BuildPathMenu(); pathMainMenu.Visible = true; - Game.LogTrivial($"Path {path.PathNum} deleted."); - Game.DisplayNotification($"~o~Scene Manager\n~w~Path {path.PathNum} deleted."); + Game.LogTrivial($"Path {path.Number} deleted."); + Game.DisplayNotification($"~o~Scene Manager\n~w~Path {path.Number} deleted."); } EditPathMenu.editPathMenu.Reset(true, true); @@ -182,8 +187,8 @@ namespace SceneManager if (paths.ElementAtOrDefault(i) != null && paths[i].State == State.Creating) { //Game.LogTrivial($"pathFinished: {paths[i].PathFinished}"); - Game.LogTrivial($"Resuming path {paths[i].PathNum}"); - Game.DisplayNotification($"~o~Scene Manager\n~y~[Creating]~w~ Resuming path {paths[i].PathNum}"); + Game.LogTrivial($"Resuming path {paths[i].Number}"); + Game.DisplayNotification($"~o~Scene Manager\n~y~[Creating]~w~ Resuming path {paths[i].Number}"); break; } } @@ -211,7 +216,7 @@ namespace SceneManager path.Waypoints.Clear(); } paths.Clear(); - pathsNum.Clear(); + //pathsNum.Clear(); BuildPathMenu(); pathMainMenu.Visible = true; Game.LogTrivial($"All paths deleted"); @@ -256,7 +261,7 @@ namespace SceneManager { VehicleCollector.collectedVehicles.Add(new CollectedVehicle(nearbyVehicle, nearbyVehicle.LicensePlate, paths[directDriver.Index].Waypoints[0].Path, paths[directDriver.Index].Waypoints.Count, 1, false, false)); var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle) as CollectedVehicle; - Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} not in collection, adding to collection for path {paths[directDriver.Index].PathNum} with {paths[directDriver.Index].Waypoints.Count} waypoints"); + Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} not in collection, adding to collection for path {paths[directDriver.Index].Number} with {paths[directDriver.Index].Waypoints.Count} waypoints"); if (directOptions.SelectedItem == "First waypoint") { From 2581ce666d8650707a2b0e9c8fdf79744a5fa240 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 5 Sep 2020 14:06:01 -0600 Subject: [PATCH 099/276] Removed parameter from DebugGraphics.LoopToDrawDebugGraphics method. --- SceneManager/Menus/SettingsMenu.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/Menus/SettingsMenu.cs b/SceneManager/Menus/SettingsMenu.cs index d46d8fc..f14b552 100644 --- a/SceneManager/Menus/SettingsMenu.cs +++ b/SceneManager/Menus/SettingsMenu.cs @@ -47,7 +47,7 @@ namespace SceneManager { GameFiber.StartNew(() => { - DebugGraphics.LoopToDrawDebugGraphics(debugGraphics, path); + DebugGraphics.LoopToDrawDebugGraphics(path); }); } From 30ff396e0df8182be2871fdeac22df769c282a4f Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 5 Sep 2020 14:06:17 -0600 Subject: [PATCH 100/276] Refactored reference names --- SceneManager/Menus/EditPathMenu.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SceneManager/Menus/EditPathMenu.cs b/SceneManager/Menus/EditPathMenu.cs index c77d245..2217f95 100644 --- a/SceneManager/Menus/EditPathMenu.cs +++ b/SceneManager/Menus/EditPathMenu.cs @@ -42,7 +42,7 @@ namespace SceneManager if (selectedItem == deletePath) { - PathMainMenu.DeletePath(currentPath, currentPath.PathNum - 1, PathMainMenu.Delete.Single); + PathMainMenu.DeletePath(currentPath, currentPath.Number - 1, PathMainMenu.Delete.Single); } } @@ -54,12 +54,12 @@ namespace SceneManager if (togglePath.Checked) { currentPath.DisablePath(); - Game.LogTrivial($"Path {currentPath.PathNum} disabled."); + Game.LogTrivial($"Path {currentPath.Number} disabled."); } else { currentPath.EnablePath(); - Game.LogTrivial($"Path {currentPath.PathNum} enabled."); + Game.LogTrivial($"Path {currentPath.Number} enabled."); } } } From 9a18c529ccf60a84efe5efee007aaa8dab609c34 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 5 Sep 2020 14:06:38 -0600 Subject: [PATCH 101/276] Changed PathNum to Number --- SceneManager/Object Classes/Path.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SceneManager/Object Classes/Path.cs b/SceneManager/Object Classes/Path.cs index 023e420..4751be3 100644 --- a/SceneManager/Object Classes/Path.cs +++ b/SceneManager/Object Classes/Path.cs @@ -11,7 +11,7 @@ namespace SceneManager public class Path { - public int PathNum { get; private set; } + public int Number { get; private set; } public bool IsEnabled { get; private set; } public State State { get; set; } @@ -19,20 +19,20 @@ namespace SceneManager public Path(int pathNum, bool pathFinished, bool pathDisabled, List waypoints) { - PathNum = pathNum; + Number = pathNum; IsEnabled = pathDisabled; Waypoints = waypoints; } public Path(int pathNum, State pathState) { - PathNum = pathNum; + Number = pathNum; State = pathState; } public void SetPathNumber(int pathNum) { - PathNum = pathNum; + Number = pathNum; } private void LowerWaypointBlipsOpacity() From 022097211cce4b2dd207d358244fa7f991f68ba5 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 5 Sep 2020 14:07:26 -0600 Subject: [PATCH 102/276] Added DrawMarkerForEditWaypoint method and _enableWaypointMarker bool. --- SceneManager/Object Classes/Waypoint.cs | 97 ++++++++++++++++++++++--- 1 file changed, 85 insertions(+), 12 deletions(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 54c25f6..4772cec 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -16,6 +16,7 @@ namespace SceneManager public float CollectorRadius { get; private set; } public float SpeedZoneRadius { get; private set; } public Blip CollectorRadiusBlip { get; private set; } + private bool _enableWaypointMarker { get; set; } public Waypoint(int path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip) { @@ -25,7 +26,7 @@ namespace SceneManager Speed = speed; DrivingFlag = drivingFlag; Blip = waypointBlip; - + _enableWaypointMarker = true; } public Waypoint(int path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector, float collectorRadius, float speedZoneRadius, uint yieldZone) @@ -45,6 +46,7 @@ namespace SceneManager Color = waypointBlip.Color, Alpha = 0.5f }; + _enableWaypointMarker = true; } public void UpdateWaypoint(Waypoint currentWaypoint, VehicleDrivingFlags drivingFlag, float drivingSpeed, bool collectorWaypointChecked, float collectorRadius, float speedZoneRadius, bool updateWaypointPositionChecked) @@ -133,24 +135,95 @@ namespace SceneManager Number = newWaypointNumber; } + public void EnableWaypointMarker(bool enableMarker) + { + // I think this is how we allow re-drawing the markers during waypoint edit + // Disable the individual waypoint's marker while the editWaypoint menu is open + // Redraw the marker with a separate function using the editWaypoint menu's options + _enableWaypointMarker = enableMarker; + } + public void DrawWaypointMarker() { - if(IsCollector && CollectorRadius > 0) + if (_enableWaypointMarker) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, CollectorRadius, CollectorRadius, 1f, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); - if(SpeedZoneRadius > 0) + if (IsCollector && CollectorRadius > 0) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, SpeedZoneRadius, SpeedZoneRadius, 1f, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, CollectorRadius, CollectorRadius, 1f, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); + if (SpeedZoneRadius > 0) + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, SpeedZoneRadius, SpeedZoneRadius, 1f, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); + } + } + else if (DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); + } + else + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); } } - else if(DrivingFlag == VehicleDrivingFlags.StopAtDestination) + } + + public void DrawMarkerForEditWaypoint() + { + _enableWaypointMarker = false; + GameFiber.StartNew(() => { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); - } - else - { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); - } + while (SettingsMenu.debugGraphics.Checked && !_enableWaypointMarker) + { + if (EditWaypointMenu.editWaypointMenu.Visible) + { + if (EditWaypointMenu.collectorWaypoint.Checked) + { + if (EditWaypointMenu.updateWaypointPosition.Checked) + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value, (float)EditWaypointMenu.changeCollectorRadius.Value, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value, (float)EditWaypointMenu.changeSpeedZoneRadius.Value, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); + + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value, (float)EditWaypointMenu.changeCollectorRadius.Value, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value, (float)EditWaypointMenu.changeSpeedZoneRadius.Value, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); + } + else + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value, (float)EditWaypointMenu.changeCollectorRadius.Value, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value, (float)EditWaypointMenu.changeSpeedZoneRadius.Value, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); + } + } + else if (EditWaypointMenu.changeWaypointType.SelectedItem == "Drive To") + { + if (EditWaypointMenu.updateWaypointPosition.Checked) + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 80, false, false, 2, false, 0, 0, false); + } + else + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 80, false, false, 2, false, 0, 0, false); + } + + } + else + { + if (EditWaypointMenu.updateWaypointPosition.Checked) + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 80, false, false, 2, false, 0, 0, false); + } + else + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 80, false, false, 2, false, 0, 0, false); + } + } + } + else + { + _enableWaypointMarker = true; + } + GameFiber.Yield(); + } + }); } } } From d177b624cdbbba601ec945086bc4551d7f370646 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 5 Sep 2020 14:07:54 -0600 Subject: [PATCH 103/276] Removed debugGraphics parameter from LoopToDrawDebugGraphics method. --- SceneManager/DebugGraphics.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/SceneManager/DebugGraphics.cs b/SceneManager/DebugGraphics.cs index ae5ea5b..6ef4da6 100644 --- a/SceneManager/DebugGraphics.cs +++ b/SceneManager/DebugGraphics.cs @@ -1,22 +1,20 @@ using Rage; -using RAGENativeUI.Elements; using System.Drawing; namespace SceneManager { class DebugGraphics { - public static void LoopToDrawDebugGraphics(UIMenuCheckboxItem debugGraphics, Path path) + public static void LoopToDrawDebugGraphics(Path path) { GameFiber.StartNew(() => { - while (debugGraphics.Checked) + while (SettingsMenu.debugGraphics.Checked) { if (MenuManager.menuPool.IsAnyMenuOpen() && path != null) { for (int i = 0; i < path.Waypoints.Count; i++) { - //Draw3DMarkersAtWaypoints(path, i); path.Waypoints[i].DrawWaypointMarker(); if (i != path.Waypoints.Count - 1) From af57fd791e2e8cc6d22813bdc6956e4f31693a91 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 5 Sep 2020 14:08:07 -0600 Subject: [PATCH 104/276] Refactored reference names --- SceneManager/VehicleCollector.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index b1c12b9..4652ff1 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -65,9 +65,9 @@ namespace SceneManager private static CollectedVehicle AddVehicleToCollection(Path path, Waypoint waypoint, Vehicle v) { - var collectedVehicle = new CollectedVehicle(v, v.LicensePlate, path.PathNum, path.Waypoints.Count, waypoint.Number, true, false); + var collectedVehicle = new CollectedVehicle(v, v.LicensePlate, path.Number, path.Waypoints.Count, waypoint.Number, true, false); collectedVehicles.Add(collectedVehicle); - Game.LogTrivial($"[WaypointVehicleCollector] Added {v.Model.Name} to collection from path {path.PathNum}, waypoint {waypoint.Number}."); + Game.LogTrivial($"[WaypointVehicleCollector] Added {v.Model.Name} to collection from path {path.Number}, waypoint {waypoint.Number}."); return collectedVehicle; } From 7513326e467f7c7fc4a7d375e7d9e6c0ebb7c4fd Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 6 Sep 2020 09:19:10 -0600 Subject: [PATCH 105/276] Moved World.SpeedZone code to Waypoint class --- SceneManager/Menus/EditWaypointMenu.cs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 9e25e3d..5c18641 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -89,7 +89,7 @@ namespace SceneManager editWaypointMenu.OnItemSelect += EditWaypoint_OnItemSelected; editWaypoint.IndexChanged += EditWaypoint_OnIndexChanged; - currentWaypoint.DrawMarkerForEditWaypoint(); + currentWaypoint.DrawMarkerForWaypointBeingEdited(); } private static void EditWaypoint_OnIndexChanged(UIMenuScrollerItem scrollerItem, int oldIndex, int newIndex) @@ -99,7 +99,7 @@ namespace SceneManager if (scrollerItem == editWaypoint) { - currentPath.Waypoints[oldIndex].EnableWaypointMarker(true); + currentPath.Waypoints[oldIndex].EnableWaypointMarker = true; } } @@ -116,7 +116,7 @@ namespace SceneManager changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; changeSpeedZoneRadius.Enabled = collectorWaypoint.Checked ? true : false; updateWaypointPosition.Checked = false; - currentWaypoint.DrawMarkerForEditWaypoint(); + currentWaypoint.DrawMarkerForWaypointBeingEdited(); } if (scrollerItem == changeCollectorRadius) @@ -169,7 +169,7 @@ namespace SceneManager if (selectedItem == addAsNewWaypoint) { - currentWaypoint.EnableWaypointMarker(true); + currentWaypoint.EnableWaypointMarker = true; var pathIndex = PathMainMenu.GetPaths().IndexOf(currentPath); var drivingFlag = drivingFlags[changeWaypointType.Index]; var blip = PathCreationMenu.CreateWaypointBlip(pathIndex, drivingFlag); @@ -180,10 +180,7 @@ namespace SceneManager if (collectorWaypoint.Checked) { - var yieldZone = SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH - ? World.AddSpeedZone(Game.LocalPlayer.Character.Position, changeSpeedZoneRadius.Value, SetDriveSpeedForWaypoint()) - : World.AddSpeedZone(Game.LocalPlayer.Character.Position, changeSpeedZoneRadius.Value, SetDriveSpeedForWaypoint()); - currentPath.Waypoints.Add(new Waypoint(currentPath.Number, currentWaypoint.Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, yieldZone)); + currentPath.Waypoints.Add(new Waypoint(currentPath.Number, currentWaypoint.Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value)); } else { @@ -220,7 +217,7 @@ namespace SceneManager foreach (Waypoint wp in currentPath.Waypoints) { - wp.UpdateWaypointNumber(currentPath.Waypoints.IndexOf(wp) + 1); + wp.Number = currentPath.Waypoints.IndexOf(wp) + 1; Game.LogTrivial($"Waypoint at index {currentPath.Waypoints.IndexOf(wp)} is now waypoint #{wp.Number}"); } From 1d2e64ff8830f730d48a3c90b5bedff459da7a2a Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 6 Sep 2020 09:19:54 -0600 Subject: [PATCH 106/276] Moved World.SpeedZone code to Waypoint class, updated references from refactoring --- SceneManager/Menus/PathCreationMenu.cs | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index acedbb2..27020fe 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -90,27 +90,22 @@ namespace SceneManager var firstNonNullPath = PathMainMenu.GetPaths().Where(p => p != null && p.State == State.Creating).First(); var pathIndex = PathMainMenu.GetPaths().IndexOf(firstNonNullPath); - var currentPath = firstNonNullPath.Number; - var currentWaypoint = PathMainMenu.GetPaths()[pathIndex].Waypoints.Count + 1; - var drivingFlag = drivingFlags[waypointType.Index]; - var blip = CreateWaypointBlip(pathIndex, drivingFlag); + var pathNumber = firstNonNullPath.Number; + var waypointNumber = PathMainMenu.GetPaths()[pathIndex].Waypoints.Count + 1; if (collectorWaypoint.Checked) { - var yieldZone = SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH - ? World.AddSpeedZone(Game.LocalPlayer.Character.Position, speedZoneRadius.Value * 0.5f, MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeed.Value)) - : World.AddSpeedZone(Game.LocalPlayer.Character.Position, speedZoneRadius.Value * 0.5f, MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeed.Value)); - PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, collectorRadius.Value, speedZoneRadius.Value, yieldZone)); + PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(pathNumber, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlags[waypointType.Index], CreateWaypointBlip(pathIndex, drivingFlags[waypointType.Index]), true, collectorRadius.Value, speedZoneRadius.Value)); } else { - PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(currentPath, currentWaypoint, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip)); + PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(pathNumber, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlags[waypointType.Index], CreateWaypointBlip(pathIndex, drivingFlags[waypointType.Index]))); } - Game.LogTrivial($"[Path {currentPath}] Waypoint {currentWaypoint} ({drivingFlag.ToString()}) added"); + Game.LogTrivial($"[Path {pathNumber}] Waypoint {waypointNumber} ({drivingFlags[waypointType.Index].ToString()}) added"); ToggleTrafficEndPathMenuItem(pathIndex); trafficRemoveWaypoint.Enabled = true; - PathMainMenu.createNewPath.Text = $"Continue Creating Path {currentPath}"; + PathMainMenu.createNewPath.Text = $"Continue Creating Path {pathNumber}"; } if (selectedItem == trafficRemoveWaypoint) @@ -122,7 +117,7 @@ namespace SceneManager { Game.LogTrivial($"[Path {i + 1}] {PathMainMenu.GetPaths()[i].Waypoints.Last().DrivingFlag.ToString()} waypoint removed"); PathMainMenu.GetPaths()[i].Waypoints.Last().Blip.Delete(); - World.RemoveSpeedZone(PathMainMenu.GetPaths()[i].Waypoints.Last().YieldZone); + PathMainMenu.GetPaths()[i].Waypoints.Last().RemoveSpeedZone(); if (PathMainMenu.GetPaths()[i].Waypoints.Last().CollectorRadiusBlip) { @@ -153,9 +148,8 @@ namespace SceneManager Game.LogTrivial($"[Path Creation] Path {currentPath.Number} finished with {currentPath.Waypoints.Count} waypoints."); Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Path {i + 1} complete."); currentPath.State = State.Finished; - currentPath.EnablePath(); + currentPath.IsEnabled = true; currentPath.SetPathNumber(i + 1); - //PathMainMenu.AddPathToPathCountList(i, currentPath.PathNum); // For each waypoint in the path's WaypointData, start a collector game fiber and loop while the path and waypoint exist, and while the path is enabled foreach (Waypoint waypoint in PathMainMenu.GetPaths()[i].Waypoints) From f770a6298fa14d66f689549575bed43a4e2bdaef Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 6 Sep 2020 09:20:34 -0600 Subject: [PATCH 107/276] Fixed DismissDriver, attempted to fix emergency vehicle sirens turning on when dismissed --- SceneManager/Menus/PathMainMenu.cs | 46 ++++++++---------------------- 1 file changed, 12 insertions(+), 34 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index b038d95..fc5ed7c 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -15,10 +15,8 @@ namespace SceneManager public static UIMenuItem createNewPath { get; private set; } public static UIMenuItem deleteAllPaths; public static UIMenuNumericScrollerItem editPath = new UIMenuNumericScrollerItem("Edit Path", "", 1, paths.Count, 1); - //public static UIMenuListScrollerItem editPath { get; private set; } public static UIMenuListScrollerItem directOptions { get; private set; } public static UIMenuNumericScrollerItem directDriver = new UIMenuNumericScrollerItem("Direct nearest driver to path", "", 1, paths.Count, 1); - //public static UIMenuListScrollerItem directDriver { get; private set; } public static UIMenuListScrollerItem dismissDriver { get; private set; } public static UIMenuCheckboxItem disableAllPaths { get; private set; } @@ -85,11 +83,6 @@ namespace SceneManager return ref paths; } - //public static void AddPathToPathCountList(int indexToInsertAt, int pathNum) - //{ - // pathsNum.Insert(indexToInsertAt, pathNum); - //} - private static bool VehicleAndDriverValid(this Vehicle v) { if (v && v.HasDriver && v.Driver && v.Driver.IsAlive) @@ -141,9 +134,9 @@ namespace SceneManager Game.LogTrivial($"Removing yield zone and waypoint blips"); foreach (Waypoint waypoint in path.Waypoints) { - if (waypoint.YieldZone != 0) + if (waypoint.SpeedZone != 0) { - World.RemoveSpeedZone(waypoint.YieldZone); + waypoint.RemoveSpeedZone(); } if (waypoint.Blip) { @@ -161,9 +154,6 @@ namespace SceneManager if (pathsToDelete == Delete.Single) { paths.RemoveAt(index); - //Game.LogTrivial("pathsNum count: " + pathsNum.Count); - //Game.LogTrivial("index: " + index); - //pathsNum.RemoveAt(index); BuildPathMenu(); pathMainMenu.Visible = true; Game.LogTrivial($"Path {path.Number} deleted."); @@ -209,14 +199,13 @@ namespace SceneManager } foreach (Path path in paths) { - foreach(Waypoint waypoint in path.Waypoints.Where(wp => wp.YieldZone != 0)) + foreach(Waypoint waypoint in path.Waypoints.Where(wp => wp.SpeedZone != 0)) { - World.RemoveSpeedZone(waypoint.YieldZone); + waypoint.RemoveSpeedZone(); } path.Waypoints.Clear(); } paths.Clear(); - //pathsNum.Clear(); BuildPathMenu(); pathMainMenu.Visible = true; Game.LogTrivial($"All paths deleted"); @@ -340,12 +329,14 @@ namespace SceneManager Game.LogTrivial($"Dismiss from path"); if (nearbyVehicle.IsInCollectedVehicles()) { - var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle) as CollectedVehicle; + var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle).First(); if (collectedVehicle != null) { collectedVehicle.SetDismissNow(true); + collectedVehicle.SetStoppedAtWaypoint(false); collectedVehicle.Vehicle.Driver.Tasks.Clear(); collectedVehicle.Vehicle.Driver.Dismiss(); + collectedVehicle.Vehicle.IsSirenOn = false; Game.LogTrivial($"Dismissed driver of {collectedVehicle.Vehicle.Model.Name} from path {collectedVehicle.Path}"); } } @@ -359,12 +350,13 @@ namespace SceneManager Game.LogTrivial($"Dismiss from waypoint"); if (nearbyVehicle.IsInCollectedVehicles()) { - var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle) as CollectedVehicle; - if(collectedVehicle != null) + var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle).First(); + if (collectedVehicle != null) { collectedVehicle.SetStoppedAtWaypoint(false); collectedVehicle.Vehicle.Driver.Tasks.Clear(); collectedVehicle.Vehicle.Driver.Dismiss(); + collectedVehicle.Vehicle.IsSirenOn = false; if (collectedVehicle.CurrentWaypoint == collectedVehicle.TotalWaypoints && !collectedVehicle.StoppedAtWaypoint) { @@ -389,12 +381,14 @@ namespace SceneManager { nearbyVehicle.Driver.Tasks.Clear(); nearbyVehicle.Driver.Dismiss(); + nearbyVehicle.IsSirenOn = false; Game.LogTrivial($"Dismissed driver of {nearbyVehicle.Model.Name} (in collection)"); } else { nearbyVehicle.Driver.Tasks.Clear(); nearbyVehicle.Driver.Dismiss(); + nearbyVehicle.IsSirenOn = false; Game.LogTrivial($"Dismissed driver of {nearbyVehicle.Model.Name} (was not in collection)"); } break; @@ -420,14 +414,6 @@ namespace SceneManager foreach (Path path in paths) { path.DisablePath(); - foreach (Waypoint waypoint in path.Waypoints) - { - waypoint.Blip.Alpha = 0.5f; - if (waypoint.CollectorRadiusBlip) - { - waypoint.CollectorRadiusBlip.Alpha = 0.25f; - } - } } Game.LogTrivial($"All paths disabled."); } @@ -436,14 +422,6 @@ namespace SceneManager foreach (Path path in paths) { path.EnablePath(); - foreach (Waypoint waypoint in path.Waypoints) - { - waypoint.Blip.Alpha = 1f; - if (waypoint.CollectorRadiusBlip) - { - waypoint.CollectorRadiusBlip.Alpha = 0.5f; - } - } } Game.LogTrivial($"All paths enabled."); } From 57d998b606a1ea0b8cd45289e04e362b8c7f86c5 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 6 Sep 2020 09:21:45 -0600 Subject: [PATCH 108/276] Refactored for better encapsulation --- SceneManager/Object Classes/Path.cs | 40 +++-- SceneManager/Object Classes/Waypoint.cs | 206 +++++++++++++----------- 2 files changed, 133 insertions(+), 113 deletions(-) diff --git a/SceneManager/Object Classes/Path.cs b/SceneManager/Object Classes/Path.cs index 4751be3..819b7ac 100644 --- a/SceneManager/Object Classes/Path.cs +++ b/SceneManager/Object Classes/Path.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Rage; +using System.Collections.Generic; namespace SceneManager { @@ -11,28 +12,24 @@ namespace SceneManager public class Path { - public int Number { get; private set; } - public bool IsEnabled { get; private set; } - public State State { get; set; } + private int _number { get; set; } + private bool _isEnabled { get; set; } + private State _state { get; set; } + public int Number { get { return _number; } set { _number = value; } } + public bool IsEnabled { get { return _isEnabled; } set { _isEnabled = value; } } + public State State { get { return _state; } set { _state = value; } } public List Waypoints = new List(); - public Path(int pathNum, bool pathFinished, bool pathDisabled, List waypoints) - { - Number = pathNum; - IsEnabled = pathDisabled; - Waypoints = waypoints; - } - public Path(int pathNum, State pathState) { - Number = pathNum; - State = pathState; + _number = pathNum; + _state = pathState; } public void SetPathNumber(int pathNum) { - Number = pathNum; + _number = pathNum; } private void LowerWaypointBlipsOpacity() @@ -64,13 +61,24 @@ namespace SceneManager public void DisablePath() { - IsEnabled = false; + _isEnabled = false; + foreach(Waypoint wp in Waypoints) + { + wp.RemoveSpeedZone(); + } LowerWaypointBlipsOpacity(); } public void EnablePath() { - IsEnabled = true; + _isEnabled = true; + foreach (Waypoint wp in Waypoints) + { + if (wp.IsCollector) + { + wp.AddSpeedZone(); + } + } RestoreWaypointBlipsOpacity(); } diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 4772cec..1ead479 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -5,43 +5,45 @@ namespace SceneManager { public class Waypoint { - public int Path { get; private set; } - public int Number { get; private set; } - public Vector3 Position { get; private set; } - public float Speed { get; private set; } - public VehicleDrivingFlags DrivingFlag { get; private set; } - public Blip Blip { get; private set; } - public uint YieldZone { get; private set; } - public bool IsCollector { get; private set; } - public float CollectorRadius { get; private set; } - public float SpeedZoneRadius { get; private set; } - public Blip CollectorRadiusBlip { get; private set; } + private int _path { get; set; } + private int _number { get; set; } + private Vector3 _position { get; set; } + private float _speed { get; set; } + private VehicleDrivingFlags _drivingFlag { get; set; } + private Blip _blip { get; set; } + private bool _isCollector { get; set; } + private float _collectorRadius { get; set; } + private Blip _collectorRadiusBlip { get; set; } + private float _speedZoneRadius { get; set; } + private uint _speedZone { get; set; } private bool _enableWaypointMarker { get; set; } - public Waypoint(int path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip) - { - Path = path; - Number = waypointNum; - Position = waypointPos; - Speed = speed; - DrivingFlag = drivingFlag; - Blip = waypointBlip; - _enableWaypointMarker = true; - } + public int Path { get {return _path; } } + public int Number { get { return _number; } set { _number = value; } } + public Vector3 Position { get { return _position; } } + public float Speed { get { return _speed; } } + public VehicleDrivingFlags DrivingFlag { get { return _drivingFlag; } } + public Blip Blip { get { return _blip; } } + public bool IsCollector { get { return _isCollector; } } + public float CollectorRadius { get { return _collectorRadius; } } + public Blip CollectorRadiusBlip { get { return _collectorRadiusBlip; } } + public float SpeedZoneRadius { get { return _speedZoneRadius; } } + public uint SpeedZone { get { return _speedZone; } set { _speedZone = value; } } + public bool EnableWaypointMarker { get { return _enableWaypointMarker; } set { _enableWaypointMarker = value; } } - public Waypoint(int path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector, float collectorRadius, float speedZoneRadius, uint yieldZone) + public Waypoint(int path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector = false, float collectorRadius = 0, float speedZoneRadius = 0) { - Path = path; - Number = waypointNum; - Position = waypointPos; - Speed = speed; - DrivingFlag = drivingFlag; - Blip = waypointBlip; - IsCollector = collector; - CollectorRadius = collectorRadius; - SpeedZoneRadius = speedZoneRadius; - YieldZone = yieldZone; - CollectorRadiusBlip = new Blip(waypointBlip.Position, collectorRadius) + _path = path; + _number = waypointNum; + _position = waypointPos; + _speed = speed; + _drivingFlag = drivingFlag; + _blip = waypointBlip; + _isCollector = collector; + _collectorRadius = collectorRadius; + _speedZoneRadius = speedZoneRadius; + AddSpeedZone(); + _collectorRadiusBlip = new Blip(waypointBlip.Position, collectorRadius) { Color = waypointBlip.Color, Alpha = 0.5f @@ -49,98 +51,92 @@ namespace SceneManager _enableWaypointMarker = true; } - public void UpdateWaypoint(Waypoint currentWaypoint, VehicleDrivingFlags drivingFlag, float drivingSpeed, bool collectorWaypointChecked, float collectorRadius, float speedZoneRadius, bool updateWaypointPositionChecked) + public void UpdateWaypoint(Waypoint currentWaypoint, VehicleDrivingFlags drivingFlag, float speed, bool collectorWaypointChecked, float collectorRadius, float speedZoneRadius, bool updateWaypointPositionChecked) { UpdateDrivingFlag(drivingFlag); - UpdateWaypointSpeed(drivingSpeed); - UpdateCollectorOptions(currentWaypoint, drivingSpeed, collectorWaypointChecked, collectorRadius, speedZoneRadius); + UpdateWaypointSpeed(speed); + UpdateCollectorOptions(); if (updateWaypointPositionChecked) { UpdateWaypointPosition(Game.LocalPlayer.Character.Position); } - } - private void UpdateCollectorOptions(Waypoint currentWaypoint, float drivingSpeed, bool collectorWaypointChecked, float collectorRadius, float speedZoneRadius) - { - if (collectorWaypointChecked) + void UpdateDrivingFlag(VehicleDrivingFlags newDrivingFlag) { - IsCollector = true; - World.RemoveSpeedZone(YieldZone); - YieldZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, SpeedZoneRadius, drivingSpeed); - Blip.Color = Color.Blue; - if (CollectorRadiusBlip) + _drivingFlag = newDrivingFlag; + if (newDrivingFlag == VehicleDrivingFlags.StopAtDestination) { - currentWaypoint.CollectorRadiusBlip.Position = Game.LocalPlayer.Character.Position; - currentWaypoint.CollectorRadiusBlip.Alpha = 0.5f; - currentWaypoint.CollectorRadiusBlip.Scale = collectorRadius * 0.5f; + _blip.Color = Color.Red; } else { - CollectorRadiusBlip = new Blip(Blip.Position) - { - Color = Blip.Color, - Alpha = 0.5f - }; + _blip.Color = Color.Green; } - CollectorRadius = collectorRadius; - SpeedZoneRadius = speedZoneRadius; } - else + + void UpdateWaypointSpeed(float newWaypointSpeed) { - IsCollector = false; - World.RemoveSpeedZone(YieldZone); - if (CollectorRadiusBlip) + _speed = newWaypointSpeed; + } + + void UpdateCollectorOptions() + { + if (collectorWaypointChecked) { - CollectorRadiusBlip.Delete(); + _isCollector = true; + RemoveSpeedZone(); + _speedZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, SpeedZoneRadius, speed); + _blip.Color = Color.Blue; + if (_collectorRadiusBlip) + { + _collectorRadiusBlip.Position = Game.LocalPlayer.Character.Position; + _collectorRadiusBlip.Alpha = 0.5f; + _collectorRadiusBlip.Scale = collectorRadius * 0.5f; + } + else + { + _collectorRadiusBlip = new Blip(Blip.Position) + { + Color = Blip.Color, + Alpha = 0.5f + }; + } + _collectorRadius = collectorRadius; + _speedZoneRadius = speedZoneRadius; + } + else + { + _isCollector = false; + RemoveSpeedZone(); + if (_collectorRadiusBlip) + { + _collectorRadiusBlip.Delete(); + } } } - } - private void UpdateWaypointPosition(Vector3 newWaypointPosition) - { - Position = newWaypointPosition; - UpdateWaypointBlipPosition(); - } - - private void UpdateWaypointSpeed(float newWaypointSpeed) - { - Speed = newWaypointSpeed; - } - - private void UpdateDrivingFlag(VehicleDrivingFlags newDrivingFlag) - { - DrivingFlag = newDrivingFlag; - if (newDrivingFlag == VehicleDrivingFlags.StopAtDestination) + void UpdateWaypointPosition(Vector3 newWaypointPosition) { - Blip.Color = Color.Red; + _position = newWaypointPosition; + RemoveSpeedZone(); + AddSpeedZone(); + UpdateWaypointBlipPosition(); } - else + + void UpdateWaypointBlipPosition() { - Blip.Color = Color.Green; + _blip.Position = Game.LocalPlayer.Character.Position; } } - private void UpdateWaypointBlipPosition() + public void AddSpeedZone() { - Blip.Position = Game.LocalPlayer.Character.Position; + _speedZone = World.AddSpeedZone(_position, _speedZoneRadius, _speed); } - public void UpdatePathNumber(int newPathNumber) + public void RemoveSpeedZone() { - Path = newPathNumber; - } - - public void UpdateWaypointNumber(int newWaypointNumber) - { - Number = newWaypointNumber; - } - - public void EnableWaypointMarker(bool enableMarker) - { - // I think this is how we allow re-drawing the markers during waypoint edit - // Disable the individual waypoint's marker while the editWaypoint menu is open - // Redraw the marker with a separate function using the editWaypoint menu's options - _enableWaypointMarker = enableMarker; + World.RemoveSpeedZone(_speedZone); } public void DrawWaypointMarker() @@ -166,7 +162,7 @@ namespace SceneManager } } - public void DrawMarkerForEditWaypoint() + public void DrawMarkerForWaypointBeingEdited() { _enableWaypointMarker = false; GameFiber.StartNew(() => @@ -225,5 +221,21 @@ namespace SceneManager } }); } + + public void RemoveWaypoint() + { + _path = 0; + _number = 0; + _position = new Vector3(0,0,0); + _speed = 0; + _drivingFlag = 0; + _blip.Delete(); + _isCollector = false; + _collectorRadius = 0; + _speedZoneRadius = 0; + RemoveSpeedZone(); + _collectorRadiusBlip.Delete(); + _enableWaypointMarker = false; + } } } From 82590778d3462ee3d6a869f38ea9c41886e993b8 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 6 Sep 2020 09:22:19 -0600 Subject: [PATCH 109/276] Added IsSirenSilent to try and fix emergency vehicles turning on their sirens upon dismissal --- SceneManager/AITasking.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index cf524d3..571f23e 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -118,6 +118,7 @@ namespace SceneManager cv.Vehicle.Dismiss(); cv.Vehicle.IsSirenOn = false; + cv.Vehicle.IsSirenSilent = true; cv.Vehicle.IsPersistent = false; Game.LogTrivial($"{cv.Vehicle.Model.Name} dismissed successfully."); From 0320497fdea0357e2222bd11f7a127bb10c96a83 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 6 Sep 2020 09:22:41 -0600 Subject: [PATCH 110/276] Preparing to remove VehicleDismissed function --- SceneManager/VehicleCollector.cs | 50 ++++++++++++++++---------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index 4652ff1..c8ff227 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -105,34 +105,34 @@ namespace SceneManager } } - private static void VehicleDismissed(CollectedVehicle cv, List waypointData) - { - while (!cv.DismissNow) - { - GameFiber.Sleep(500); - } - Game.LogTrivial($"{cv.Vehicle.Model.Name} was dismissed (dismissal check loop)."); + //private static void VehicleDismissed(CollectedVehicle cv, List waypointData) + //{ + // while (!cv.DismissNow) + // { + // GameFiber.Sleep(500); + // } + // Game.LogTrivial($"{cv.Vehicle.Model.Name} was dismissed (dismissal check loop)."); - Game.LogTrivial($"Looping to ensure the vehicle is far enough away from all attractor waypoints so it can be removed from the collection."); - while (true) - { - var collectorWaypoints = waypointData.Where(wp => wp.IsCollector); - var vehicleFarEnoughAwayFromCollectors = collectorWaypoints.All(wp => cv.Vehicle.DistanceTo(wp.Position) > wp.CollectorRadius); + // Game.LogTrivial($"Looping to ensure the vehicle is far enough away from all attractor waypoints so it can be removed from the collection."); + // while (true) + // { + // var collectorWaypoints = waypointData.Where(wp => wp.IsCollector); + // var vehicleFarEnoughAwayFromCollectors = collectorWaypoints.All(wp => cv.Vehicle.DistanceTo(wp.Position) > wp.CollectorRadius); - if (collectedVehicles.Contains(cv) && vehicleFarEnoughAwayFromCollectors) - { - Game.LogTrivial($"{cv.Vehicle.Model.Name} is far enough away from all attractor waypoints and has been removed from the collection."); - cv.SetTasksAssigned(false); - cv.Vehicle.Driver.BlockPermanentEvents = false; - cv.Vehicle.Driver.IsPersistent = false; - cv.Vehicle.IsPersistent = false; - collectedVehicles.Remove(cv); + // if (collectedVehicles.Contains(cv) && vehicleFarEnoughAwayFromCollectors) + // { + // Game.LogTrivial($"{cv.Vehicle.Model.Name} is far enough away from all attractor waypoints and has been removed from the collection."); + // cv.SetTasksAssigned(false); + // cv.Vehicle.Driver.BlockPermanentEvents = false; + // cv.Vehicle.Driver.IsPersistent = false; + // cv.Vehicle.IsPersistent = false; + // collectedVehicles.Remove(cv); - break; - } - GameFiber.Sleep(1000); - } - } + // break; + // } + // GameFiber.Sleep(1000); + // } + //} } } From e756ecb60f4443189b206a79bf8b7aa84daf69fb Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 6 Sep 2020 14:22:06 -0600 Subject: [PATCH 111/276] Renamed togglePath checkbox item to disablePath --- SceneManager/Menus/EditPathMenu.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SceneManager/Menus/EditPathMenu.cs b/SceneManager/Menus/EditPathMenu.cs index 2217f95..6bd9e11 100644 --- a/SceneManager/Menus/EditPathMenu.cs +++ b/SceneManager/Menus/EditPathMenu.cs @@ -9,7 +9,7 @@ namespace SceneManager { public static UIMenu editPathMenu { get; private set; } private static UIMenuItem editPathWaypoints, deletePath; - public static UIMenuCheckboxItem togglePath; + public static UIMenuCheckboxItem disablePath; internal static void InstantiateMenu() { @@ -20,7 +20,7 @@ namespace SceneManager public static void BuildEditPathMenu() { - editPathMenu.AddItem(togglePath = new UIMenuCheckboxItem("Disable Path", false)); + editPathMenu.AddItem(disablePath = new UIMenuCheckboxItem("Disable Path", false)); editPathMenu.AddItem(editPathWaypoints = new UIMenuItem("Edit Waypoints")); editPathWaypoints.ForeColor = Color.Gold; editPathMenu.AddItem(deletePath = new UIMenuItem("Delete Path")); @@ -48,10 +48,10 @@ namespace SceneManager private static void EditPath_OnCheckboxChange(UIMenu sender, UIMenuCheckboxItem checkboxItem, bool @checked) { - if (checkboxItem == togglePath) + if (checkboxItem == disablePath) { var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index]; - if (togglePath.Checked) + if (disablePath.Checked) { currentPath.DisablePath(); Game.LogTrivial($"Path {currentPath.Number} disabled."); From 6321fce31302ba0a0e6a3168bf33e74c9186bd02 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 6 Sep 2020 14:23:18 -0600 Subject: [PATCH 112/276] Renamed togglePath checkbox item to disablePath --- SceneManager/Menus/EditWaypointMenu.cs | 8 ++++---- SceneManager/Menus/PathMainMenu.cs | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 5c18641..e39baaf 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -161,7 +161,7 @@ namespace SceneManager if (currentPath.Waypoints.Count < 2 && currentPath.Waypoints[0].DrivingFlag == VehicleDrivingFlags.StopAtDestination) { Game.LogTrivial($"The remaining waypoint was updated to be a stop waypoint. Enabling/disabling the path is no longer locked."); - EditPathMenu.togglePath.Enabled = true; + EditPathMenu.disablePath.Enabled = true; } updateWaypointPosition.Checked = false; Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Waypoint {currentWaypoint.Number} updated."); @@ -227,8 +227,8 @@ namespace SceneManager { Game.LogTrivial($"The path only has 1 waypoint left, and the waypoint is not a stop waypoint. Disabling the path."); currentPath.DisablePath(); - EditPathMenu.togglePath.Checked = true; - EditPathMenu.togglePath.Enabled = false; + EditPathMenu.disablePath.Checked = true; + EditPathMenu.disablePath.Enabled = false; } } } @@ -237,7 +237,7 @@ namespace SceneManager private static float SetDriveSpeedForWaypoint() { float convertedSpeed; - if (SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH) + if (SettingsMenu.speedUnits.SelectedItem == SpeedUnits.MPH) { //Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); convertedSpeed = MathHelper.ConvertMilesPerHourToMetersPerSecond(changeWaypointSpeed.Value); diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index fc5ed7c..b25b068 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -161,7 +161,7 @@ namespace SceneManager } EditPathMenu.editPathMenu.Reset(true, true); - EditPathMenu.togglePath.Enabled = true; + EditPathMenu.disablePath.Enabled = true; } private static void PathMenu_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) @@ -170,6 +170,7 @@ namespace SceneManager { pathMainMenu.Visible = false; PathCreationMenu.pathCreationMenu.Visible = true; + DebugGraphics.Draw3DWaypointOnPlayer(); // For each element in paths, determine if the element exists but is not finished yet, or if it doesn't exist, create it. for (int i = 0; i <= paths.Count; i++) From 6941f261415e352bb09e3a6d17f636a4f53ae08b Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 6 Sep 2020 14:23:30 -0600 Subject: [PATCH 113/276] Removed unused using statements --- SceneManager/Menus/MainMenu.cs | 8 +------- SceneManager/Menus/MenuManager.cs | 3 +-- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/SceneManager/Menus/MainMenu.cs b/SceneManager/Menus/MainMenu.cs index d1dcfbc..adf52da 100644 --- a/SceneManager/Menus/MainMenu.cs +++ b/SceneManager/Menus/MainMenu.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Rage; -using RAGENativeUI; +using RAGENativeUI; using RAGENativeUI.Elements; namespace SceneManager diff --git a/SceneManager/Menus/MenuManager.cs b/SceneManager/Menus/MenuManager.cs index 1974834..cb0e63e 100644 --- a/SceneManager/Menus/MenuManager.cs +++ b/SceneManager/Menus/MenuManager.cs @@ -1,5 +1,4 @@ -using System; -using RAGENativeUI; +using RAGENativeUI; namespace SceneManager { From a4e85eab5100c62de6b73a93ab0e2f29eeb32840 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 6 Sep 2020 14:25:21 -0600 Subject: [PATCH 114/276] Updated reference names based on refactorings. Added check during waypoint blip creation whether blips are enabled in order to set the correct blip.Alpha --- SceneManager/Menus/PathCreationMenu.cs | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 27020fe..96910ca 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -73,7 +73,7 @@ namespace SceneManager { AddNewPathToPathsCollection(PathMainMenu.GetPaths(), 0); - if (SettingsMenu.debugGraphics.Checked) + if (SettingsMenu.threeDWaypoints.Checked) { DebugGraphics.LoopToDrawDebugGraphics(PathMainMenu.GetPaths()[0]); } @@ -82,7 +82,7 @@ namespace SceneManager { AddNewPathToPathsCollection(PathMainMenu.GetPaths(), PathMainMenu.GetPaths().IndexOf(PathMainMenu.GetPaths().Where(p => p.State == State.Finished).First()) + 1); - if (SettingsMenu.debugGraphics.Checked) + if (SettingsMenu.threeDWaypoints.Checked) { DebugGraphics.LoopToDrawDebugGraphics(PathMainMenu.GetPaths().Where(p => p != null && p.State == State.Creating).First()); } @@ -206,7 +206,7 @@ namespace SceneManager private static float SetDriveSpeedForWaypoint() { float convertedSpeed; - if (SettingsMenu.speedUnits.SelectedItem == SettingsMenu.SpeedUnitsOfMeasure.MPH) + if (SettingsMenu.speedUnits.SelectedItem == SpeedUnits.MPH) { //Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); convertedSpeed = MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeed.Value); @@ -244,14 +244,10 @@ namespace SceneManager blip.Color = Color.Green; } - //if (PathMainMenu.GetPaths()[pathIndex].Waypoints.Count == 0) - //{ - // blip.Color = Color.Orange; - //} - //else - //{ - // blip.Color = Color.Yellow; - //} + if (!SettingsMenu.mapBlips.Checked) + { + blip.Alpha = 0f; + } return blip; } From 1bb4f2d7506a4102ea888910f6abcfa91c665126 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 6 Sep 2020 14:26:09 -0600 Subject: [PATCH 115/276] Added menu options to enable/disable map blips, as well as save settings to the plugin's .ini file --- SceneManager/Menus/SettingsMenu.cs | 77 ++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 20 deletions(-) diff --git a/SceneManager/Menus/SettingsMenu.cs b/SceneManager/Menus/SettingsMenu.cs index f14b552..46bbe6e 100644 --- a/SceneManager/Menus/SettingsMenu.cs +++ b/SceneManager/Menus/SettingsMenu.cs @@ -1,22 +1,20 @@ using Rage; using RAGENativeUI; using RAGENativeUI.Elements; +using System; namespace SceneManager { class SettingsMenu { - public static UIMenu settingsMenu { get; private set; } - public static UIMenuCheckboxItem debugGraphics = new UIMenuCheckboxItem("Enable 3D Waypoints", false), - hints = new UIMenuCheckboxItem("Enable Hints", true); // Refactor this to be true/false based off the ini - public static UIMenuListScrollerItem speedUnits = new UIMenuListScrollerItem("Speed Unit of Measure", "", new[] { SpeedUnitsOfMeasure.MPH, SpeedUnitsOfMeasure.KPH }); - public static UIMenuNumericScrollerItem barrierPlacementDistance = new UIMenuNumericScrollerItem("Barrier Placement Distance", "How far away you can place a barrier (in meters)", 1, 30, 1); - - public enum SpeedUnitsOfMeasure - { - MPH, - KPH - } + public static UIMenu settingsMenu { get; set; } + public static UIMenuCheckboxItem threeDWaypoints = new UIMenuCheckboxItem("Enable 3D Waypoints", Settings.Enable3DWaypoints), + mapBlips = new UIMenuCheckboxItem("Enable Map Blips", Settings.EnableMapBlips), + hints = new UIMenuCheckboxItem("Enable Hints", Settings.EnableHints); + private static SpeedUnits[] speedArray = {SpeedUnits.MPH, SpeedUnits.KPH }; + public static UIMenuListScrollerItem speedUnits = new UIMenuListScrollerItem("Speed Unit of Measure", "", new[] { SpeedUnits.MPH, SpeedUnits.KPH }); + public static UIMenuNumericScrollerItem barrierPlacementDistance = new UIMenuNumericScrollerItem("Barrier Placement Distance", "How far away you can place a barrier (in meters)", 1, (int)Settings.BarrierPlacementDistance, 1); + public static UIMenuItem saveSettings = new UIMenuItem("Save settings to .ini", "Updates the plugin's .ini file with the current settings so the next time the plugin is loaded, it will use these settings."); internal static void InstantiateMenu() { @@ -27,38 +25,77 @@ namespace SceneManager public static void BuildSettingsMenu() { - settingsMenu.AddItem(debugGraphics); + settingsMenu.AddItem(threeDWaypoints); + settingsMenu.AddItem(mapBlips); settingsMenu.AddItem(hints); settingsMenu.AddItem(speedUnits); + speedUnits.Index = Array.IndexOf(speedArray, Settings.SpeedUnit); settingsMenu.AddItem(barrierPlacementDistance); - barrierPlacementDistance.Index = 14; + barrierPlacementDistance.Index = barrierPlacementDistance.OptionCount - 1; + settingsMenu.AddItem(saveSettings); + saveSettings.ForeColor = System.Drawing.Color.Gold; settingsMenu.OnCheckboxChange += SettingsMenu_OnCheckboxChange; settingsMenu.OnScrollerChange += SettingsMenu_OnScrollerChange; + settingsMenu.OnItemSelect += SettingsMenu_OnItemSelected; + } + + private static void SettingsMenu_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) + { + if(selectedItem == saveSettings) + { + // Write to .ini + Settings.UpdateSettings(threeDWaypoints.Checked, mapBlips.Checked, hints.Checked, speedUnits.SelectedItem, barrierPlacementDistance.Value); + Game.DisplayHelp($"Settings saved"); + } } private static void SettingsMenu_OnCheckboxChange(UIMenu sender, UIMenuCheckboxItem checkboxItem, bool @checked) { - if (checkboxItem == debugGraphics) + if (checkboxItem == threeDWaypoints) { - if (debugGraphics.Checked) + if (threeDWaypoints.Checked) { foreach (Path path in PathMainMenu.GetPaths()) { - GameFiber.StartNew(() => - { + //GameFiber.StartNew(() => + //{ DebugGraphics.LoopToDrawDebugGraphics(path); - }); + //}); } DebugGraphics.Draw3DWaypointOnPlayer(); } } - if(checkboxItem == hints) + + if (checkboxItem == mapBlips) + { + if (mapBlips.Checked) + { + foreach(Path path in PathMainMenu.GetPaths()) + { + foreach(Waypoint wp in path.Waypoints) + { + wp.EnableBlip(); + } + } + } + else + { + foreach (Path path in PathMainMenu.GetPaths()) + { + foreach (Waypoint wp in path.Waypoints) + { + wp.DisableBlip(); + } + } + } + } + + if (checkboxItem == hints) { Hints.Enabled = hints.Checked ? true : false; - // Update the setting in the .ini when check state is changed } } From beddfe4223b4083f03288064d438848ab59b7011 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 6 Sep 2020 14:26:42 -0600 Subject: [PATCH 116/276] Moved State enum to Settings class. Added checks for blip opacity based on whether map blips are enabled in settings --- SceneManager/Object Classes/Path.cs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/SceneManager/Object Classes/Path.cs b/SceneManager/Object Classes/Path.cs index 819b7ac..139bbf8 100644 --- a/SceneManager/Object Classes/Path.cs +++ b/SceneManager/Object Classes/Path.cs @@ -3,12 +3,7 @@ using System.Collections.Generic; namespace SceneManager { - public enum State - { - Uninitialized, - Creating, - Finished - } + public class Path { @@ -66,7 +61,10 @@ namespace SceneManager { wp.RemoveSpeedZone(); } - LowerWaypointBlipsOpacity(); + if (SettingsMenu.mapBlips.Checked) + { + LowerWaypointBlipsOpacity(); + } } public void EnablePath() @@ -79,7 +77,10 @@ namespace SceneManager wp.AddSpeedZone(); } } - RestoreWaypointBlipsOpacity(); + if (SettingsMenu.mapBlips.Checked) + { + RestoreWaypointBlipsOpacity(); + } } From 0d6f5ae51a1881d56f3ca6a8a9eb567a4fdb8437 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 6 Sep 2020 14:27:22 -0600 Subject: [PATCH 117/276] Updated reference names based on refactorings. Added conditions for blip opacity based on whether map blips are enabled in settings. --- SceneManager/Object Classes/Waypoint.cs | 33 +++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 1ead479..7f6623a 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -1,5 +1,6 @@ using Rage; using System.Drawing; +using System.Linq; namespace SceneManager { @@ -46,8 +47,15 @@ namespace SceneManager _collectorRadiusBlip = new Blip(waypointBlip.Position, collectorRadius) { Color = waypointBlip.Color, - Alpha = 0.5f }; + if (SettingsMenu.mapBlips.Checked) + { + _collectorRadiusBlip.Alpha = 0.5f; + } + else + { + _collectorRadiusBlip.Alpha = 0f; + } _enableWaypointMarker = true; } @@ -167,7 +175,7 @@ namespace SceneManager _enableWaypointMarker = false; GameFiber.StartNew(() => { - while (SettingsMenu.debugGraphics.Checked && !_enableWaypointMarker) + while (SettingsMenu.threeDWaypoints.Checked && !_enableWaypointMarker) { if (EditWaypointMenu.editWaypointMenu.Visible) { @@ -222,6 +230,27 @@ namespace SceneManager }); } + public void EnableBlip() + { + if(!PathMainMenu.GetPaths().Where(p => p.Number == _path).First().IsEnabled) + { + _blip.Alpha = 0.5f; + _collectorRadiusBlip.Alpha = 0.25f; + } + else + { + _blip.Alpha = 1.0f; + _collectorRadiusBlip.Alpha = 0.5f; + } + + } + + public void DisableBlip() + { + _blip.Alpha = 0; + _collectorRadiusBlip.Alpha = 0; + } + public void RemoveWaypoint() { _path = 0; From 2f6956be200a7b108f4d34389e3bcca0cce5e621 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 6 Sep 2020 14:28:06 -0600 Subject: [PATCH 118/276] Updated reference names based on refactorings. Added break condition for Draw3DWaypointOnPlayer if player leaves the pathCreationMenu. --- SceneManager/DebugGraphics.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/SceneManager/DebugGraphics.cs b/SceneManager/DebugGraphics.cs index 6ef4da6..3c94296 100644 --- a/SceneManager/DebugGraphics.cs +++ b/SceneManager/DebugGraphics.cs @@ -9,7 +9,7 @@ namespace SceneManager { GameFiber.StartNew(() => { - while (SettingsMenu.debugGraphics.Checked) + while (SettingsMenu.threeDWaypoints.Checked) { if (MenuManager.menuPool.IsAnyMenuOpen() && path != null) { @@ -44,7 +44,7 @@ namespace SceneManager { GameFiber.StartNew(() => { - while (SettingsMenu.debugGraphics.Checked) + while (SettingsMenu.threeDWaypoints.Checked) { if (PathCreationMenu.pathCreationMenu.Visible) { @@ -55,13 +55,17 @@ namespace SceneManager } else if (PathCreationMenu.waypointType.SelectedItem == "Drive To") { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z-1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 80, false, false, 2, false, 0, 0, false); } else { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z-1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 80, false, false, 2, false, 0, 0, false); } } + else + { + break; + } GameFiber.Yield(); } }); From ac10c987ac0ecc994dac1f9e23f5661ba596aadf Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 6 Sep 2020 14:28:45 -0600 Subject: [PATCH 119/276] Added State and SpeedUnits enums to the class. Added code to save settings from the settings menu to plugin's .ini file --- SceneManager/Settings.cs | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/SceneManager/Settings.cs b/SceneManager/Settings.cs index 9c511ea..4c6a9c4 100644 --- a/SceneManager/Settings.cs +++ b/SceneManager/Settings.cs @@ -3,26 +3,57 @@ using System.Windows.Forms; namespace SceneManager { + public enum State + { + Uninitialized, + Creating, + Finished + } + + public enum SpeedUnits + { + MPH, + KPH + } + internal static class Settings { + internal static readonly InitializationFile ini = new InitializationFile("Plugins/SceneManager.ini"); + internal static Keys ToggleKey = Keys.T; internal static Keys ModifierKey = Keys.LShiftKey; internal static ControllerButtons ToggleButton = ControllerButtons.Y; internal static ControllerButtons ModifierButton = ControllerButtons.A; + internal static bool Enable3DWaypoints = true; + internal static bool EnableMapBlips = true; internal static bool EnableHints = true; + internal static SpeedUnits SpeedUnit = SpeedUnits.MPH; + internal static float BarrierPlacementDistance = 30f; internal static Object[] barriers; internal static void LoadSettings() { Game.LogTrivial("Loading SceneManager.ini settings"); - InitializationFile ini = new InitializationFile("Plugins/SceneManager.ini"); + //InitializationFile ini = new InitializationFile("Plugins/SceneManager.ini"); ini.Create(); ToggleKey = ini.ReadEnum("Keybindings", "ToggleKey", Keys.T); ModifierKey = ini.ReadEnum("Keybindings", "ModifierKey", Keys.LShiftKey); ToggleButton = ini.ReadEnum("Keybindings", "ToggleButton", ControllerButtons.A); ModifierButton = ini.ReadEnum("Keybindings", "ModifierButton", ControllerButtons.DPadDown); + Enable3DWaypoints = ini.ReadBoolean("Other Settings", "Enable3DWaypoints", true); + EnableMapBlips = ini.ReadBoolean("Other Settings", "EnableMapBlips", true); EnableHints = ini.ReadBoolean("Other Settings", "EnableHints", true); + SpeedUnit = ini.ReadEnum("Other Settings", "SpeedUnits", SpeedUnits.MPH); + BarrierPlacementDistance = ini.ReadInt32("Other Settings", "BarrierPlacementDistance", 30); + } + + internal static void UpdateSettings(bool threeDWaypointsEnabled, bool mapBlipsEnabled, bool hintsEnabled, SpeedUnits unit, float distance) + { + ini.Write("Other Settings", "Enable3DWaypoints", threeDWaypointsEnabled); + ini.Write("Other Settings", "EnableMapBlips", mapBlipsEnabled); + ini.Write("Other Settings", "EnableHints", hintsEnabled); + ini.Write("Other Settings", "SpeedUnits", unit); } } } From 36a04f94c733d9237607c67d965c7de3fee1ab4e Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 6 Sep 2020 22:08:20 -0600 Subject: [PATCH 120/276] Fixed flares resetting when they weren't supposed to by referencing the correct model name. --- SceneManager/Menus/BarrierMenu.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index 7e0ff9c..827e9e6 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -155,9 +155,9 @@ namespace SceneManager RemoveBarrier(); } - if(selectedItem == resetBarriers) + if (selectedItem == resetBarriers) { - foreach(Barrier barrier in barriers.Where(b => b.GetBarrier() && !b.GetBarrier().Model.Name.Contains("flare"))) + foreach(Barrier barrier in barriers.Where(b => b.GetBarrier()?.Model.Name != "0xa2c44e80")) // 0xa2c44e80 is the model name of the spawned flare { barrier.GetBarrier().Position = barrier.GetPosition(); barrier.GetBarrier().Heading = barrier.GetRotation(); From a816967255bb60dffd7dab75516aa1d4ab0b3a31 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 6 Sep 2020 22:09:02 -0600 Subject: [PATCH 121/276] Added new Drive-To mode (Direct) which allows the AI to drive on the wrong side of the road to the next waypoint. --- SceneManager/AITasking.cs | 10 +++++++++- SceneManager/DebugGraphics.cs | 2 +- SceneManager/Menus/EditWaypointMenu.cs | 4 ++-- SceneManager/Menus/PathCreationMenu.cs | 4 ++-- SceneManager/Object Classes/Waypoint.cs | 8 ++++++++ 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 571f23e..a35830c 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -65,7 +65,15 @@ namespace SceneManager Game.LogTrivial($"{vehicle.Model.Name} is driving to waypoint {waypoints[nextWaypoint].Number}"); if (waypoints.ElementAtOrDefault(nextWaypoint) != null && !collectedVehicle.StoppedAtWaypoint) { - collectedVehicle.Vehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263083, 2f).WaitForCompletion(); + if(waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.Normal) + { + collectedVehicle.Vehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263083, 2f).WaitForCompletion(); + } + else if (waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) + { + collectedVehicle.Vehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)17040299, 2f).WaitForCompletion(); + } + collectedVehicle.Vehicle.Driver.Tasks.PerformDrivingManeuver(collectedVehicle.Vehicle, VehicleManeuver.GoForwardWithCustomSteeringAngle, 3); } diff --git a/SceneManager/DebugGraphics.cs b/SceneManager/DebugGraphics.cs index 3c94296..ac47926 100644 --- a/SceneManager/DebugGraphics.cs +++ b/SceneManager/DebugGraphics.cs @@ -53,7 +53,7 @@ namespace SceneManager Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)PathCreationMenu.collectorRadius.Value, (float)PathCreationMenu.collectorRadius.Value, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)PathCreationMenu.speedZoneRadius.Value, (float)PathCreationMenu.speedZoneRadius.Value, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); } - else if (PathCreationMenu.waypointType.SelectedItem == "Drive To") + else if (PathCreationMenu.waypointType.SelectedItem.Contains("Drive To")) { Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 80, false, false, 2, false, 0, 0, false); } diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index e39baaf..a3b9956 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -9,8 +9,8 @@ namespace SceneManager { class EditWaypointMenu { - private static VehicleDrivingFlags[] drivingFlags = new VehicleDrivingFlags[] { VehicleDrivingFlags.Normal, VehicleDrivingFlags.StopAtDestination }; - private static string[] waypointTypes = new string[] { "Drive To", "Stop" }; + private static VehicleDrivingFlags[] drivingFlags = new VehicleDrivingFlags[] { VehicleDrivingFlags.Normal, VehicleDrivingFlags.IgnorePathFinding, VehicleDrivingFlags.StopAtDestination }; + private static string[] waypointTypes = new string[] { "Drive To (Normal)", "Drive To (Direct)", "Stop" }; public static UIMenu editWaypointMenu { get; private set; } public static UIMenuItem updateWaypoint { get; private set; } public static UIMenuItem removeWaypoint { get; private set; } diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 96910ca..d1d24a5 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -10,8 +10,8 @@ namespace SceneManager class PathCreationMenu { - private static VehicleDrivingFlags[] drivingFlags = new VehicleDrivingFlags[] { VehicleDrivingFlags.Normal, VehicleDrivingFlags.StopAtDestination }; // Implement custom driving flag for normal - private static string[] waypointTypes = new string[] { "Drive To", "Stop" }; + private static VehicleDrivingFlags[] drivingFlags = new VehicleDrivingFlags[] { VehicleDrivingFlags.Normal, VehicleDrivingFlags.IgnorePathFinding, VehicleDrivingFlags.StopAtDestination }; // Implement custom driving flag for normal + private static string[] waypointTypes = new string[] { "Drive To (Normal)", "Drive To (Direct)", "Stop" }; public static UIMenu pathCreationMenu { get; private set; } private static UIMenuItem trafficAddWaypoint, trafficRemoveWaypoint, trafficEndPath; public static UIMenuListScrollerItem waypointType = new UIMenuListScrollerItem("Waypoint Type", "", waypointTypes); diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 7f6623a..ebe43c0 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -71,6 +71,14 @@ namespace SceneManager void UpdateDrivingFlag(VehicleDrivingFlags newDrivingFlag) { + if(_drivingFlag == VehicleDrivingFlags.StopAtDestination && newDrivingFlag != VehicleDrivingFlags.StopAtDestination) + { + foreach(CollectedVehicle cv in VehicleCollector.collectedVehicles.Where(cv => cv.Path == _path && cv.CurrentWaypoint == _number && cv.StoppedAtWaypoint)) + { + Game.LogTrivial($"Setting StoppedAtWaypoint to false for {cv.Vehicle.Model.Name}"); + cv.SetStoppedAtWaypoint(false); + } + } _drivingFlag = newDrivingFlag; if (newDrivingFlag == VehicleDrivingFlags.StopAtDestination) { From 55056cc1f3f7bb3c6c3b5e359e3dc9fcbd866aad Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 7 Sep 2020 00:04:20 -0600 Subject: [PATCH 122/276] Added ability for users to provide their own barriers in the .ini --- SceneManager/Menus/BarrierMenu.cs | 12 +++++------- SceneManager/Settings.cs | 16 ++++++++++++++-- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index 827e9e6..f10b2ed 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -2,8 +2,6 @@ using System.Collections.Generic; using System.Drawing; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Rage; using RAGENativeUI; using RAGENativeUI.Elements; @@ -14,10 +12,9 @@ namespace SceneManager { public static UIMenu barrierMenu { get; private set; } public static List barriers = new List(); - //public static List barriers = new List() { }; - - private static UIMenuListScrollerItem barrierList = new UIMenuListScrollerItem("Select Barrier", "", new[] { "Large Striped Cone", "Large Cone", "Medium Striped Cone", "Medium Cone", "Roadpole A", "Roadpole B", "Police Barrier", "Road Barrier", "Flare" }); - private static string[] barrierObjectNames = new string[] { "prop_mp_cone_01", "prop_roadcone01c", "prop_mp_cone_02", "prop_mp_cone_03", "prop_roadpole_01a", "prop_roadpole_01b", "prop_barrier_work05", "prop_barrier_work06a", "prop_flare_01b" }; + private static UIMenuListScrollerItem barrierList = new UIMenuListScrollerItem("Select Barrier", "", Settings.barrierKeys); + //private static UIMenuListScrollerItem barrierList = new UIMenuListScrollerItem("Select Barrier", "", new[] { "Large Striped Cone", "Large Cone", "Medium Striped Cone", "Medium Cone", "Roadpole A", "Roadpole B", "Police Barrier", "Road Barrier", "Flare" }); + //private static string[] barrierObjectNames = new string[] { "prop_mp_cone_01", "prop_roadcone01c", "prop_mp_cone_02", "prop_mp_cone_03", "prop_roadpole_01a", "prop_roadpole_01b", "prop_barrier_work05", "prop_barrier_work06a", "prop_flare_01b" }; private static UIMenuNumericScrollerItem rotateBarrier = new UIMenuNumericScrollerItem("Rotate Barrier", "", 0, 350, 10); private static UIMenuListScrollerItem removeBarrierOptions = new UIMenuListScrollerItem("Remove Barrier", "", new[] { "Last Barrier", "Nearest Barrier", "All Barriers" }); private static UIMenuItem resetBarriers = new UIMenuItem("Reset Barriers", "Reset all spawned barriers to their original position and rotation"); @@ -62,7 +59,8 @@ namespace SceneManager if (shadowBarrier) shadowBarrier.Delete(); - shadowBarrier = new Rage.Object(barrierObjectNames[barrierList.Index], TracePlayerView(15, TraceFlags.IntersectEverything).HitPosition, rotateBarrier.Index); + shadowBarrier = new Rage.Object(Settings.barrierValues[barrierList.Index], TracePlayerView(15, TraceFlags.IntersectEverything).HitPosition, rotateBarrier.Index); + //shadowBarrier = new Rage.Object(barrierObjectNames[barrierList.Index], TracePlayerView(15, TraceFlags.IntersectEverything).HitPosition, rotateBarrier.Index); Rage.Native.NativeFunction.Natives.PLACE_OBJECT_ON_GROUND_PROPERLY(shadowBarrier); shadowBarrier.IsGravityDisabled = true; shadowBarrier.IsCollisionEnabled = false; diff --git a/SceneManager/Settings.cs b/SceneManager/Settings.cs index 4c6a9c4..71d3349 100644 --- a/SceneManager/Settings.cs +++ b/SceneManager/Settings.cs @@ -1,4 +1,5 @@ using Rage; +using System.Collections.Generic; using System.Windows.Forms; namespace SceneManager @@ -29,12 +30,12 @@ namespace SceneManager internal static bool EnableHints = true; internal static SpeedUnits SpeedUnit = SpeedUnits.MPH; internal static float BarrierPlacementDistance = 30f; - internal static Object[] barriers; + internal static List barrierKeys = new List(); + internal static List barrierValues = new List(); internal static void LoadSettings() { Game.LogTrivial("Loading SceneManager.ini settings"); - //InitializationFile ini = new InitializationFile("Plugins/SceneManager.ini"); ini.Create(); ToggleKey = ini.ReadEnum("Keybindings", "ToggleKey", Keys.T); @@ -46,6 +47,17 @@ namespace SceneManager EnableHints = ini.ReadBoolean("Other Settings", "EnableHints", true); SpeedUnit = ini.ReadEnum("Other Settings", "SpeedUnits", SpeedUnits.MPH); BarrierPlacementDistance = ini.ReadInt32("Other Settings", "BarrierPlacementDistance", 30); + + foreach(string key in ini.GetKeyNames("Barriers")) + { + //Game.LogTrivial($"Key: {key.Trim()}"); + //Game.LogTrivial($"Value: {ini.ReadString("Barriers",key)}"); + barrierKeys.Add(key.Trim()); + var m = new Model(ini.ReadString("Barriers", key)); + if (m.IsValid) + barrierValues.Add(m.Name); + //barrierValues.Add(ini.ReadString("Barriers", key)); + } } internal static void UpdateSettings(bool threeDWaypointsEnabled, bool mapBlipsEnabled, bool hintsEnabled, SpeedUnits unit, float distance) From dfbf027b0fc58c23f1588685534a8f4be312388d Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 7 Sep 2020 00:04:41 -0600 Subject: [PATCH 123/276] Added null check for collectedVehicle in DriveVehicleToNextWaypoint --- SceneManager/AITasking.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index a35830c..161376a 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -32,6 +32,10 @@ namespace SceneManager private static void DriveVehicleToNextWaypoint(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) { + if (collectedVehicle == null) + { + return; + } if (!collectedVehicle.Vehicle) { return; From 1225cb5514a0566e22ec6bb6159d9a97013dac42 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 7 Sep 2020 00:05:01 -0600 Subject: [PATCH 124/276] Changed plugin attribute from Test Build to Release Candidate --- SceneManager/EntryPoint.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/EntryPoint.cs b/SceneManager/EntryPoint.cs index 80dddfe..dec9823 100644 --- a/SceneManager/EntryPoint.cs +++ b/SceneManager/EntryPoint.cs @@ -4,7 +4,7 @@ using System.Reflection; using System.Windows.Forms; using Rage; -[assembly: Rage.Attributes.Plugin("Scene Manager [Test Build]", Author = "Rich", Description = "Manage your scenes with custom AI traffic pathing and cone placement.")] +[assembly: Rage.Attributes.Plugin("Scene Manager [Release Candidate]", Author = "Rich", Description = "Manage your scenes with custom AI traffic pathing and cone placement.")] namespace SceneManager { From b79aacac98d06bffda5b7e555c3cf6e67c4c32ca Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 7 Sep 2020 08:50:39 -0600 Subject: [PATCH 125/276] Fixed marker marker radius not matching blip scale --- SceneManager/Object Classes/Waypoint.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index ebe43c0..6af4985 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -161,10 +161,10 @@ namespace SceneManager { if (IsCollector && CollectorRadius > 0) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, CollectorRadius, CollectorRadius, 1f, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, CollectorRadius*2, CollectorRadius * 2, 1f, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); if (SpeedZoneRadius > 0) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, SpeedZoneRadius, SpeedZoneRadius, 1f, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, SpeedZoneRadius * 2, SpeedZoneRadius * 2, 1f, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); } } else if (DrivingFlag == VehicleDrivingFlags.StopAtDestination) @@ -191,16 +191,16 @@ namespace SceneManager { if (EditWaypointMenu.updateWaypointPosition.Checked) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value, (float)EditWaypointMenu.changeCollectorRadius.Value, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value, (float)EditWaypointMenu.changeSpeedZoneRadius.Value, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value, (float)EditWaypointMenu.changeCollectorRadius.Value, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value, (float)EditWaypointMenu.changeSpeedZoneRadius.Value, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); } else { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value, (float)EditWaypointMenu.changeCollectorRadius.Value, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value, (float)EditWaypointMenu.changeSpeedZoneRadius.Value, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); } } else if (EditWaypointMenu.changeWaypointType.SelectedItem == "Drive To") From a87ac5ffdc8e0a46a6a09c9cf056b99fee919861 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 7 Sep 2020 08:50:53 -0600 Subject: [PATCH 126/276] Fixed marker radius not matching blip scale --- SceneManager/DebugGraphics.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SceneManager/DebugGraphics.cs b/SceneManager/DebugGraphics.cs index ac47926..b2c6086 100644 --- a/SceneManager/DebugGraphics.cs +++ b/SceneManager/DebugGraphics.cs @@ -50,8 +50,8 @@ namespace SceneManager { if (PathCreationMenu.collectorWaypoint.Checked) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)PathCreationMenu.collectorRadius.Value, (float)PathCreationMenu.collectorRadius.Value, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)PathCreationMenu.speedZoneRadius.Value, (float)PathCreationMenu.speedZoneRadius.Value, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)PathCreationMenu.collectorRadius.Value * 2, (float)PathCreationMenu.collectorRadius.Value * 2, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)PathCreationMenu.speedZoneRadius.Value * 2, (float)PathCreationMenu.speedZoneRadius.Value * 2, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); } else if (PathCreationMenu.waypointType.SelectedItem.Contains("Drive To")) { From b7b9cf3f8ff1ccefac68b0f6964292b824917785 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 7 Sep 2020 08:51:19 -0600 Subject: [PATCH 127/276] Added guard clause function for null checks --- SceneManager/AITasking.cs | 64 +++++++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 16 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 161376a..5e21eb7 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -50,21 +50,7 @@ namespace SceneManager for (int nextWaypoint = currentWaypoint.Number; nextWaypoint < waypoints.Count; nextWaypoint++) { - if (waypoints.ElementAtOrDefault(nextWaypoint) == null) - { - Game.LogTrivial($"Waypoint is null"); - return; - } - if (!vehicle) - { - Game.LogTrivial($"Vehicle is null"); - return; - } - if (!driver) - { - Game.LogTrivial($"Driver is null"); - return; - } + VehicleAndDriverNullChecks(waypoints, nextWaypoint, collectedVehicle); Game.LogTrivial($"{vehicle.Model.Name} is driving to waypoint {waypoints[nextWaypoint].Number}"); if (waypoints.ElementAtOrDefault(nextWaypoint) != null && !collectedVehicle.StoppedAtWaypoint) @@ -90,10 +76,56 @@ namespace SceneManager } } + private static void VehicleAndDriverNullChecks(CollectedVehicle collectedVehicle) + { + if (collectedVehicle == null) + { + Game.LogTrivial($"CollectedVehicle is null"); + return; + } + if (!collectedVehicle.Vehicle) + { + Game.LogTrivial($"Vehicle is null"); + return; + } + if (!collectedVehicle.Driver) + { + Game.LogTrivial($"Driver is null"); + return; + } + } + + private static void VehicleAndDriverNullChecks(List waypoints, int nextWaypoint, CollectedVehicle collectedVehicle) + { + if (waypoints.ElementAtOrDefault(nextWaypoint) == null) + { + Game.LogTrivial($"Waypoint is null"); + return; + } + if(collectedVehicle == null) + { + Game.LogTrivial($"CollectedVehicle is null"); + return; + } + if (!collectedVehicle.Vehicle) + { + Game.LogTrivial($"Vehicle is null"); + return; + } + if (!collectedVehicle.Driver) + { + Game.LogTrivial($"Driver is null"); + return; + } + } + private static void StopVehicleAtWaypoint(CollectedVehicle collectedVehicle) { + VehicleAndDriverNullChecks(collectedVehicle); + Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} stopping at waypoint."); - collectedVehicle.Driver.Tasks.DriveToPosition(collectedVehicle.Vehicle.FrontPosition, 10f, VehicleDrivingFlags.StopAtDestination); + //collectedVehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); + collectedVehicle.Driver.Tasks.DriveToPosition(collectedVehicle.Vehicle.FrontPosition, 10f, (VehicleDrivingFlags)2147483648); // This causes FPS loss collectedVehicle.SetStoppedAtWaypoint(true); while (collectedVehicle.Vehicle && collectedVehicle.StoppedAtWaypoint) From ad2ef2c4a810728e778be6d3830b0f4fafec1580 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 7 Sep 2020 08:52:20 -0600 Subject: [PATCH 128/276] Changed vehicle collectinon distance to be less than collector radius. Removed unused code. --- SceneManager/VehicleCollector.cs | 32 +------------------------------- 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index c8ff227..5a5b363 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -60,7 +60,7 @@ namespace SceneManager private static Vehicle[] GetNearbyVehiclesForCollection(Vector3 collectorWaypointPosition, float collectorRadius) { - return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorWaypointPosition) <= collectorRadius - 0.5f && v.IsValidForCollection() select v).ToArray(); + return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorWaypointPosition) < collectorRadius && v.IsValidForCollection() select v).ToArray(); } private static CollectedVehicle AddVehicleToCollection(Path path, Waypoint waypoint, Vehicle v) @@ -104,35 +104,5 @@ namespace SceneManager return false; } } - - //private static void VehicleDismissed(CollectedVehicle cv, List waypointData) - //{ - // while (!cv.DismissNow) - // { - // GameFiber.Sleep(500); - // } - // Game.LogTrivial($"{cv.Vehicle.Model.Name} was dismissed (dismissal check loop)."); - - - // Game.LogTrivial($"Looping to ensure the vehicle is far enough away from all attractor waypoints so it can be removed from the collection."); - // while (true) - // { - // var collectorWaypoints = waypointData.Where(wp => wp.IsCollector); - // var vehicleFarEnoughAwayFromCollectors = collectorWaypoints.All(wp => cv.Vehicle.DistanceTo(wp.Position) > wp.CollectorRadius); - - // if (collectedVehicles.Contains(cv) && vehicleFarEnoughAwayFromCollectors) - // { - // Game.LogTrivial($"{cv.Vehicle.Model.Name} is far enough away from all attractor waypoints and has been removed from the collection."); - // cv.SetTasksAssigned(false); - // cv.Vehicle.Driver.BlockPermanentEvents = false; - // cv.Vehicle.Driver.IsPersistent = false; - // cv.Vehicle.IsPersistent = false; - // collectedVehicles.Remove(cv); - - // break; - // } - // GameFiber.Sleep(1000); - // } - //} } } From 1aa94a0d509a9dc877960bbab3b78bfdae6ef514 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 7 Sep 2020 20:23:27 -0600 Subject: [PATCH 129/276] Resetting barriers now removes the old barrier and spawns a new one at the original position/heading. Made it so you can no longer spawn barriers on top of other barriers --- SceneManager/Menus/BarrierMenu.cs | 35 ++++++++++++++++++------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index f10b2ed..5e98f39 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -59,8 +59,8 @@ namespace SceneManager if (shadowBarrier) shadowBarrier.Delete(); - shadowBarrier = new Rage.Object(Settings.barrierValues[barrierList.Index], TracePlayerView(15, TraceFlags.IntersectEverything).HitPosition, rotateBarrier.Index); - //shadowBarrier = new Rage.Object(barrierObjectNames[barrierList.Index], TracePlayerView(15, TraceFlags.IntersectEverything).HitPosition, rotateBarrier.Index); + //shadowBarrier = new Rage.Object(Settings.barrierValues[barrierList.Index], TracePlayerView(15, TraceFlags.IntersectEverything).HitPosition, Game.LocalPlayer.Character.Heading); + shadowBarrier = new Rage.Object(Settings.barrierValues[barrierList.Index], TracePlayerView(15, TraceFlags.IntersectEverything).HitPosition, rotateBarrier.Value); Rage.Native.NativeFunction.Natives.PLACE_OBJECT_ON_GROUND_PROPERLY(shadowBarrier); shadowBarrier.IsGravityDisabled = true; shadowBarrier.IsCollisionEnabled = false; @@ -85,9 +85,9 @@ namespace SceneManager private static void UpdateShadowBarrierPosition() { DisableBarrierMenuOptionsIfShadowConeTooFar(); - shadowBarrier.Position = TracePlayerView(SettingsMenu.barrierPlacementDistance.Value, TraceFlags.IntersectEverything).HitPosition; - Rage.Native.NativeFunction.Natives.PLACE_OBJECT_ON_GROUND_PROPERLY(shadowBarrier); - shadowBarrier.Heading = rotateBarrier.Value; + //shadowBarrier.Position = TracePlayerView(SettingsMenu.barrierPlacementDistance.Value, TraceFlags.IntersectWorld).HitPosition; + //Rage.Native.NativeFunction.Natives.PLACE_OBJECT_ON_GROUND_PROPERLY(shadowBarrier); + shadowBarrier.SetPositionWithSnap(TracePlayerView(SettingsMenu.barrierPlacementDistance.Value, TraceFlags.IntersectEverything).HitPosition); void DisableBarrierMenuOptionsIfShadowConeTooFar() { @@ -127,7 +127,7 @@ namespace SceneManager if (scrollerItem == rotateBarrier) { - shadowBarrier.Heading = rotateBarrier.Index; + shadowBarrier.Heading = rotateBarrier.Value; } } @@ -155,11 +155,15 @@ namespace SceneManager if (selectedItem == resetBarriers) { - foreach(Barrier barrier in barriers.Where(b => b.GetBarrier()?.Model.Name != "0xa2c44e80")) // 0xa2c44e80 is the model name of the spawned flare + var currentBarriers = barriers.Where(b => b.Object?.Model.Name != "0xa2c44e80").ToList(); + foreach(Barrier barrier in currentBarriers) { - barrier.GetBarrier().Position = barrier.GetPosition(); - barrier.GetBarrier().Heading = barrier.GetRotation(); + var newBarrier = new Rage.Object(barrier.Object.Model, barrier.Position, barrier.Rotation); + barriers.Add(new Barrier(newBarrier, newBarrier.Position, newBarrier.Heading)); + barrier.Object.Delete(); + barriers.Remove(barrier); } + currentBarriers.Clear(); } } @@ -180,18 +184,18 @@ namespace SceneManager switch (removeBarrierOptions.Index) { case 0: - barriers[barriers.Count - 1].GetBarrier().Delete(); + barriers[barriers.Count - 1].Object.Delete(); barriers.RemoveAt(barriers.Count - 1); break; case 1: - barriers = barriers.OrderBy(c => c.DistanceTo(Game.LocalPlayer.Character)).ToList(); - barriers[0].GetBarrier().Delete(); + barriers = barriers.OrderBy(b => b.Object.DistanceTo2D(Game.LocalPlayer.Character)).ToList(); + barriers[0].Object.Delete(); barriers.RemoveAt(0); break; case 2: - foreach (Barrier b in barriers.Where(b => b.GetBarrier())) + foreach (Barrier b in barriers.Where(b => b.Object)) { - b.GetBarrier().Delete(); + b.Object.Delete(); } if (barriers.Count > 0) { @@ -251,7 +255,8 @@ namespace SceneManager { Vector3 direction = GetPlayerLookingDirection(out start); end = start + (maxTraceDistance * direction); - return World.TraceLine(start, end, flags); + var barrierObjects = barriers.Where(b => b.Object).Select(b => b.Object).ToArray(); + return World.TraceLine(start, end, flags, barrierObjects); } internal static HitResult TracePlayerView(float maxTraceDistance = 30f, TraceFlags flags = TraceFlags.IntersectEverything) => TracePlayerView(out Vector3 v1, out Vector3 v2, maxTraceDistance, flags); From 754bac2949b959655dcfa5824611328834710a31 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 7 Sep 2020 20:23:53 -0600 Subject: [PATCH 130/276] Refactored fields/properties for better encapsulation. --- SceneManager/Object Classes/Barrier.cs | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/SceneManager/Object Classes/Barrier.cs b/SceneManager/Object Classes/Barrier.cs index a567c16..ce935d5 100644 --- a/SceneManager/Object Classes/Barrier.cs +++ b/SceneManager/Object Classes/Barrier.cs @@ -9,31 +9,15 @@ namespace SceneManager private Vector3 _barrierPosition { get; set; } private float _barrierRotation { get; set; } + public Rage.Object Object { get { return _barrier; } set { _barrier = value; } } + public Vector3 Position { get { return _barrierPosition; } set { _barrierPosition = value; } } + public float Rotation { get { return _barrierRotation; } set { _barrierRotation = value; } } + public Barrier(Rage.Object barrier, Vector3 barrierPosition, float barrierRotation) { _barrier = barrier; _barrierPosition = barrierPosition; _barrierRotation = barrierRotation; } - - public Rage.Object GetBarrier() - { - return _barrier; - } - - public Vector3 GetPosition() - { - return _barrierPosition; - } - - public float GetRotation() - { - return _barrierRotation; - } - - internal object DistanceTo(Ped character) - { - throw new NotImplementedException(); - } } } From 394538eb26e7262b3c7b95f15fd2a0473b83ef2d Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 7 Sep 2020 20:24:26 -0600 Subject: [PATCH 131/276] Refactored fields/properties for better encapsulation. Replaced int path with Path object. --- .../Object Classes/CollectedVehicle.cs | 54 ++++++------------- 1 file changed, 17 insertions(+), 37 deletions(-) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index 883491c..f43a22b 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -4,55 +4,35 @@ namespace SceneManager { public class CollectedVehicle { - public Ped Driver { get; private set; } - public Vehicle Vehicle { get; private set; } - public string LicensePlate { get; private set; } - public int Path { get; private set; } - public int TotalWaypoints { get; private set; } - public int CurrentWaypoint { get; private set; } - public bool TasksAssigned { get; private set; } - public bool DismissNow { get; private set; } - public bool StoppedAtWaypoint { get; private set; } + private Ped _driver { get; set; } + private Vehicle _vehicle { get; set; } + private Path _path { get; set; } + //private int _path { get; set; } // Should change this to a Path object + private int _currentWaypoint { get; set; } + private bool _tasksAssigned { get; set; } + private bool _stoppedAtWaypoint { get; set; } - public CollectedVehicle(Vehicle vehicle, string licensePlate, int path, int totalWaypoints, int currentWaypoint, bool tasksAssigned, bool dismissNow) + public Ped Driver { get { return _driver; } set { _driver = value; } } + public Vehicle Vehicle { get { return _vehicle; } set { _vehicle = value; } } + public Path Path { get { return _path; } set { _path = value; } } + public int CurrentWaypoint { get { return _currentWaypoint; } set { _currentWaypoint = value; } } + public bool TasksAssigned { get { return _tasksAssigned; } set { _tasksAssigned = value; } } + public bool StoppedAtWaypoint { get { return _stoppedAtWaypoint; } set { _stoppedAtWaypoint = value; } } + + public CollectedVehicle(Vehicle vehicle, Path path, int totalWaypoints, int currentWaypoint, bool tasksAssigned) { Vehicle = vehicle; Driver = vehicle.Driver; - LicensePlate = licensePlate; Path = path; - TotalWaypoints = totalWaypoints; CurrentWaypoint = currentWaypoint; TasksAssigned = tasksAssigned; - DismissNow = dismissNow; } - public void AssignPropertiesFromDirectedTask(int pathNum, int totalPathWaypoints, int currentWaypoint, bool tasksAssigned, bool dismiss, bool stoppedAtWaypoint) + public void AssignPropertiesFromDirectedTask(Path path, int totalPathWaypoints, int currentWaypoint, bool tasksAssigned, bool stoppedAtWaypoint) { - Path = pathNum; - TotalWaypoints = totalPathWaypoints; + Path = path; CurrentWaypoint = currentWaypoint; TasksAssigned = tasksAssigned; - DismissNow = dismiss; - StoppedAtWaypoint = stoppedAtWaypoint; - } - - public void SetCurrentWaypoint(int currentWaypoint) - { - CurrentWaypoint = currentWaypoint; - } - - public void SetTasksAssigned(bool tasksAssigned) - { - TasksAssigned = tasksAssigned; - } - - public void SetDismissNow(bool dismissNow) - { - DismissNow = dismissNow; - } - - public void SetStoppedAtWaypoint(bool stoppedAtWaypoint) - { StoppedAtWaypoint = stoppedAtWaypoint; } } From 27d4b5c39a9b176eba68b7799a93d404a71c8c09 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 7 Sep 2020 20:26:35 -0600 Subject: [PATCH 132/276] Updated path reference based on CollectedVehicle refactoring. --- SceneManager/Menus/EditWaypointMenu.cs | 4 ++-- SceneManager/Menus/PathCreationMenu.cs | 4 ++-- SceneManager/Object Classes/Waypoint.cs | 14 ++++++++------ SceneManager/VehicleCollector.cs | 22 +++++++++++----------- 4 files changed, 23 insertions(+), 21 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index a3b9956..ad1d68c 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -180,11 +180,11 @@ namespace SceneManager if (collectorWaypoint.Checked) { - currentPath.Waypoints.Add(new Waypoint(currentPath.Number, currentWaypoint.Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value)); + currentPath.Waypoints.Add(new Waypoint(currentPath, currentWaypoint.Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value)); } else { - currentPath.Waypoints.Add(new Waypoint(currentPath.Number, currentPath.Waypoints.Last().Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip)); + currentPath.Waypoints.Add(new Waypoint(currentPath, currentPath.Waypoints.Last().Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip)); } editWaypointMenu.RemoveItemAt(0); diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index d1d24a5..f3db183 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -95,11 +95,11 @@ namespace SceneManager if (collectorWaypoint.Checked) { - PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(pathNumber, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlags[waypointType.Index], CreateWaypointBlip(pathIndex, drivingFlags[waypointType.Index]), true, collectorRadius.Value, speedZoneRadius.Value)); + PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(firstNonNullPath, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlags[waypointType.Index], CreateWaypointBlip(pathIndex, drivingFlags[waypointType.Index]), true, collectorRadius.Value, speedZoneRadius.Value)); } else { - PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(pathNumber, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlags[waypointType.Index], CreateWaypointBlip(pathIndex, drivingFlags[waypointType.Index]))); + PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(firstNonNullPath, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlags[waypointType.Index], CreateWaypointBlip(pathIndex, drivingFlags[waypointType.Index]))); } Game.LogTrivial($"[Path {pathNumber}] Waypoint {waypointNumber} ({drivingFlags[waypointType.Index].ToString()}) added"); diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 6af4985..733bbac 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -6,7 +6,8 @@ namespace SceneManager { public class Waypoint { - private int _path { get; set; } + private Path _path { get; set; } + //private int _path { get; set; } private int _number { get; set; } private Vector3 _position { get; set; } private float _speed { get; set; } @@ -19,7 +20,8 @@ namespace SceneManager private uint _speedZone { get; set; } private bool _enableWaypointMarker { get; set; } - public int Path { get {return _path; } } + public Path Path { get { return _path; } set { _path = value; } } + //public int Path { get {return _path; } } public int Number { get { return _number; } set { _number = value; } } public Vector3 Position { get { return _position; } } public float Speed { get { return _speed; } } @@ -32,7 +34,7 @@ namespace SceneManager public uint SpeedZone { get { return _speedZone; } set { _speedZone = value; } } public bool EnableWaypointMarker { get { return _enableWaypointMarker; } set { _enableWaypointMarker = value; } } - public Waypoint(int path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector = false, float collectorRadius = 0, float speedZoneRadius = 0) + public Waypoint(Path path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector = false, float collectorRadius = 0, float speedZoneRadius = 0) { _path = path; _number = waypointNum; @@ -76,7 +78,7 @@ namespace SceneManager foreach(CollectedVehicle cv in VehicleCollector.collectedVehicles.Where(cv => cv.Path == _path && cv.CurrentWaypoint == _number && cv.StoppedAtWaypoint)) { Game.LogTrivial($"Setting StoppedAtWaypoint to false for {cv.Vehicle.Model.Name}"); - cv.SetStoppedAtWaypoint(false); + cv.StoppedAtWaypoint = false; } } _drivingFlag = newDrivingFlag; @@ -240,7 +242,7 @@ namespace SceneManager public void EnableBlip() { - if(!PathMainMenu.GetPaths().Where(p => p.Number == _path).First().IsEnabled) + if(!PathMainMenu.GetPaths().Where(p => p == _path).First().IsEnabled) { _blip.Alpha = 0.5f; _collectorRadiusBlip.Alpha = 0.25f; @@ -261,7 +263,7 @@ namespace SceneManager public void RemoveWaypoint() { - _path = 0; + _path = null; _number = 0; _position = new Vector3(0,0,0); _speed = 0; diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index 5a5b363..54e6869 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -41,7 +41,7 @@ namespace SceneManager { SetVehicleAndDriverPersistence(vehicle); CollectedVehicle newCollectedVehicle = AddVehicleToCollection(path, waypoint, vehicle); - Game.LogTrivial($"[WaypointVehicleCollector] Added {vehicle.Model.Name} to collection."); + newCollectedVehicle.TasksAssigned = true; GameFiber AssignTasksFiber = new GameFiber(() => AITasking.AssignWaypointTasks(newCollectedVehicle, path.Waypoints, waypoint)); AssignTasksFiber.Start(); @@ -50,7 +50,7 @@ namespace SceneManager else if (!collectedVehicle.TasksAssigned) { Game.LogTrivial($"[WaypointVehicleCollector] {vehicle.Model.Name} already in collection, but with no tasks. Assigning tasks."); - collectedVehicle.SetTasksAssigned(true); + collectedVehicle.TasksAssigned = true; GameFiber AssignTasksFiber = new GameFiber(() => AITasking.AssignWaypointTasks(collectedVehicle, path.Waypoints, waypoint)); AssignTasksFiber.Start(); @@ -65,20 +65,12 @@ namespace SceneManager private static CollectedVehicle AddVehicleToCollection(Path path, Waypoint waypoint, Vehicle v) { - var collectedVehicle = new CollectedVehicle(v, v.LicensePlate, path.Number, path.Waypoints.Count, waypoint.Number, true, false); + var collectedVehicle = new CollectedVehicle(v, path, path.Waypoints.Count, waypoint.Number, false); collectedVehicles.Add(collectedVehicle); Game.LogTrivial($"[WaypointVehicleCollector] Added {v.Model.Name} to collection from path {path.Number}, waypoint {waypoint.Number}."); return collectedVehicle; } - public static void SetVehicleAndDriverPersistence(Vehicle v) - { - v.IsPersistent = true; - v.Driver.IsPersistent = true; - v.Driver.BlockPermanentEvents = true; - v.Driver.Tasks.Clear(); - } - private static bool IsValidForCollection(this Vehicle v) { if(v && v.Speed > 1 && v.IsOnAllWheels && v != Game.LocalPlayer.Character.CurrentVehicle && v != Game.LocalPlayer.Character.LastVehicle && (v.IsCar || v.IsBike || v.IsBicycle || v.IsQuadBike || (v.HasSiren && !v.IsSirenOn)) && !collectedVehicles.Any(cv => cv.Vehicle == v)) @@ -104,5 +96,13 @@ namespace SceneManager return false; } } + + public static void SetVehicleAndDriverPersistence(Vehicle v) + { + v.IsPersistent = true; + v.Driver.IsPersistent = true; + v.Driver.BlockPermanentEvents = true; + v.Driver.Tasks.Clear(); + } } } From 8fb6f33ffbe7596d5dd7177219425e4f6291085e Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 7 Sep 2020 20:27:22 -0600 Subject: [PATCH 133/276] Updated references based on CollectedVehicle refactor. --- SceneManager/Menus/PathMainMenu.cs | 48 ++++++++++++++---------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index b25b068..d9303e4 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -20,7 +20,6 @@ namespace SceneManager public static UIMenuListScrollerItem dismissDriver { get; private set; } public static UIMenuCheckboxItem disableAllPaths { get; private set; } - //private static List pathsNum = new List(); private static List dismissOptions = new List() { "From path", "From waypoint", "From position" }; public enum Delete { @@ -114,15 +113,15 @@ namespace SceneManager // Before deleting a path, we need to dismiss any vehicles controlled by that path and remove the vehicles from ControlledVehicles //Game.LogTrivial($"Deleting path {index+1}"); Game.LogTrivial($"Deleting path {path.Number}"); - var pathVehicles = VehicleCollector.collectedVehicles.Where(cv => cv.Path == path.Number).ToList(); + var pathVehicles = VehicleCollector.collectedVehicles.Where(cv => cv.Path.Number == path.Number).ToList(); Game.LogTrivial($"Removing all vehicles on the path"); foreach (CollectedVehicle cv in pathVehicles.Where(cv => cv.Vehicle && cv.Vehicle.Driver)) { - cv.SetDismissNow(true); - cv.Vehicle.Driver.Tasks.Clear(); - cv.Vehicle.Driver.Dismiss(); - cv.Vehicle.Driver.IsPersistent = false; + cv.StoppedAtWaypoint = false; + cv.Driver.Tasks.Clear(); + cv.Driver.Dismiss(); + cv.Driver.IsPersistent = false; cv.Vehicle.Dismiss(); cv.Vehicle.IsPersistent = false; @@ -230,7 +229,6 @@ namespace SceneManager { Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} already in collection. Clearing tasks."); nearbyVehicle.Driver.Tasks.Clear(); - //VehicleCollector.collectedVehicles[nearbyVehicle].AssignPropertiesFromDirectedTask(pathNum, totalPathWaypoints, 1, tasksAssigned: false, dismiss: true, stoppedAtWaypoint: false); if (directOptions.SelectedItem == "First waypoint") { @@ -249,7 +247,7 @@ namespace SceneManager } else { - VehicleCollector.collectedVehicles.Add(new CollectedVehicle(nearbyVehicle, nearbyVehicle.LicensePlate, paths[directDriver.Index].Waypoints[0].Path, paths[directDriver.Index].Waypoints.Count, 1, false, false)); + VehicleCollector.collectedVehicles.Add(new CollectedVehicle(nearbyVehicle, paths[directDriver.Index], paths[directDriver.Index].Waypoints.Count, 1, false)); var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle) as CollectedVehicle; Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} not in collection, adding to collection for path {paths[directDriver.Index].Number} with {paths[directDriver.Index].Waypoints.Count} waypoints"); @@ -277,7 +275,7 @@ namespace SceneManager { Game.LogTrivial($"{nearbyVehicle.Model.Name} stopping at waypoint."); nearbyVehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); - collectedVehicle.SetStoppedAtWaypoint(true); + collectedVehicle.StoppedAtWaypoint = true; } } Game.LogTrivial($"{nearbyVehicle.Model.Name} all tasks complete."); @@ -308,7 +306,7 @@ namespace SceneManager { Game.LogTrivial($"{nearbyVehicle.Model.Name} stopping at waypoint."); nearbyVehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); - collectedVehicle.SetStoppedAtWaypoint(true); + collectedVehicle.StoppedAtWaypoint = true; } } Game.LogTrivial($"{nearbyVehicle.Model.Name} all tasks complete."); @@ -319,22 +317,22 @@ namespace SceneManager } } + // Needs refactor if (selectedItem == dismissDriver) { var nearbyVehicle = Game.LocalPlayer.Character.GetNearbyVehicles(1).Where(v => v != Game.LocalPlayer.Character.CurrentVehicle && v.VehicleAndDriverValid()).SingleOrDefault(); if (nearbyVehicle) { + var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle).First(); switch (dismissDriver.Index) { case 0: Game.LogTrivial($"Dismiss from path"); if (nearbyVehicle.IsInCollectedVehicles()) { - var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle).First(); if (collectedVehicle != null) { - collectedVehicle.SetDismissNow(true); - collectedVehicle.SetStoppedAtWaypoint(false); + collectedVehicle.StoppedAtWaypoint = false; collectedVehicle.Vehicle.Driver.Tasks.Clear(); collectedVehicle.Vehicle.Driver.Dismiss(); collectedVehicle.Vehicle.IsSirenOn = false; @@ -351,17 +349,15 @@ namespace SceneManager Game.LogTrivial($"Dismiss from waypoint"); if (nearbyVehicle.IsInCollectedVehicles()) { - var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle).First(); if (collectedVehicle != null) { - collectedVehicle.SetStoppedAtWaypoint(false); + collectedVehicle.StoppedAtWaypoint = false; collectedVehicle.Vehicle.Driver.Tasks.Clear(); collectedVehicle.Vehicle.Driver.Dismiss(); collectedVehicle.Vehicle.IsSirenOn = false; - if (collectedVehicle.CurrentWaypoint == collectedVehicle.TotalWaypoints && !collectedVehicle.StoppedAtWaypoint) + if (collectedVehicle.CurrentWaypoint == collectedVehicle.Path.Waypoints.Count && !collectedVehicle.StoppedAtWaypoint) { - collectedVehicle.SetDismissNow(true); Game.LogTrivial($"Dismissed driver of {collectedVehicle.Vehicle.Model.Name} from final waypoint and ultimately the path"); } else @@ -380,23 +376,23 @@ namespace SceneManager Game.LogTrivial($"Dismiss from position"); if (nearbyVehicle.IsInCollectedVehicles()) { - nearbyVehicle.Driver.Tasks.Clear(); - nearbyVehicle.Driver.Dismiss(); - nearbyVehicle.IsSirenOn = false; - Game.LogTrivial($"Dismissed driver of {nearbyVehicle.Model.Name} (in collection)"); + if(collectedVehicle != null) + { + collectedVehicle.StoppedAtWaypoint = false; + collectedVehicle.Driver.Tasks.Clear(); + collectedVehicle.Driver.Dismiss(); + collectedVehicle.Vehicle.IsSirenOn = false; + Game.LogTrivial($"Dismissed driver of {nearbyVehicle.Model.Name} from position (in collection)"); + } } else { nearbyVehicle.Driver.Tasks.Clear(); nearbyVehicle.Driver.Dismiss(); nearbyVehicle.IsSirenOn = false; - Game.LogTrivial($"Dismissed driver of {nearbyVehicle.Model.Name} (was not in collection)"); + Game.LogTrivial($"Dismissed driver of {nearbyVehicle.Model.Name} from position (was not in collection)"); } break; - - default: - Game.LogTrivial($"dismissDriver index was unexpected"); - break; } } else From 4b68e12606526138acf96f8eacb69648e21dad5d Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 7 Sep 2020 20:28:24 -0600 Subject: [PATCH 134/276] Added null checking method. Updated references based on CollectedVehicle refactoring. Fixed performance issue with vehicle's at stop waypoint. --- SceneManager/AITasking.cs | 64 +++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 5e21eb7..41ce4eb 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -8,22 +8,20 @@ namespace SceneManager { public static void AssignWaypointTasks(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) { - if(!collectedVehicle.Vehicle || !collectedVehicle.Vehicle.Driver) + if (!VehicleAndDriverNullChecks(collectedVehicle)) { - Game.LogTrivial($"Collected vehicle or driver is null"); return; } if (currentWaypoint != null && currentWaypoint.DrivingFlag == VehicleDrivingFlags.StopAtDestination) { - StopVehicleAtWaypoint(collectedVehicle); + StopVehicleAtWaypoint(currentWaypoint, collectedVehicle); } DriveVehicleToNextWaypoint(collectedVehicle, waypoints, currentWaypoint); - if (!collectedVehicle.Vehicle || !collectedVehicle.Vehicle.Driver) + if (!VehicleAndDriverNullChecks(collectedVehicle)) { - Game.LogTrivial($"Collected vehicle or driver is null"); return; } Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} all tasks complete."); @@ -32,15 +30,7 @@ namespace SceneManager private static void DriveVehicleToNextWaypoint(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) { - if (collectedVehicle == null) - { - return; - } - if (!collectedVehicle.Vehicle) - { - return; - } - if (!collectedVehicle.Driver) + if (!VehicleAndDriverNullChecks(collectedVehicle)) { return; } @@ -50,7 +40,10 @@ namespace SceneManager for (int nextWaypoint = currentWaypoint.Number; nextWaypoint < waypoints.Count; nextWaypoint++) { - VehicleAndDriverNullChecks(waypoints, nextWaypoint, collectedVehicle); + if (!VehicleAndDriverNullChecks(waypoints, nextWaypoint, collectedVehicle)) + { + return; + } Game.LogTrivial($"{vehicle.Model.Name} is driving to waypoint {waypoints[nextWaypoint].Number}"); if (waypoints.ElementAtOrDefault(nextWaypoint) != null && !collectedVehicle.StoppedAtWaypoint) @@ -71,67 +64,73 @@ namespace SceneManager { Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} stopping at waypoint."); collectedVehicle.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); - collectedVehicle.SetStoppedAtWaypoint(true); + collectedVehicle.StoppedAtWaypoint = true; } } } - private static void VehicleAndDriverNullChecks(CollectedVehicle collectedVehicle) + private static bool VehicleAndDriverNullChecks(CollectedVehicle collectedVehicle) { if (collectedVehicle == null) { Game.LogTrivial($"CollectedVehicle is null"); - return; + return false; } if (!collectedVehicle.Vehicle) { Game.LogTrivial($"Vehicle is null"); - return; + return false; } if (!collectedVehicle.Driver) { Game.LogTrivial($"Driver is null"); - return; + return false; } + return true; } - private static void VehicleAndDriverNullChecks(List waypoints, int nextWaypoint, CollectedVehicle collectedVehicle) + private static bool VehicleAndDriverNullChecks(List waypoints, int nextWaypoint, CollectedVehicle collectedVehicle) { if (waypoints.ElementAtOrDefault(nextWaypoint) == null) { Game.LogTrivial($"Waypoint is null"); - return; + return false; } if(collectedVehicle == null) { Game.LogTrivial($"CollectedVehicle is null"); - return; + return false; } if (!collectedVehicle.Vehicle) { Game.LogTrivial($"Vehicle is null"); - return; + return false; } if (!collectedVehicle.Driver) { Game.LogTrivial($"Driver is null"); - return; + return false; } + return true; } - private static void StopVehicleAtWaypoint(CollectedVehicle collectedVehicle) + private static void StopVehicleAtWaypoint(Waypoint currentWaypoint, CollectedVehicle collectedVehicle) { - VehicleAndDriverNullChecks(collectedVehicle); + if (!VehicleAndDriverNullChecks(collectedVehicle)) + { + return; + } Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} stopping at waypoint."); - //collectedVehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); - collectedVehicle.Driver.Tasks.DriveToPosition(collectedVehicle.Vehicle.FrontPosition, 10f, (VehicleDrivingFlags)2147483648); // This causes FPS loss - collectedVehicle.SetStoppedAtWaypoint(true); + //collectedVehicle.Driver.Tasks.DriveToPosition(collectedVehicle.Vehicle.FrontPosition, 10f, (VehicleDrivingFlags)2147483648); // This causes FPS loss + Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, 3f, -1, true); + collectedVehicle.StoppedAtWaypoint = true; - while (collectedVehicle.Vehicle && collectedVehicle.StoppedAtWaypoint) + while (currentWaypoint != null && collectedVehicle.Vehicle && collectedVehicle.StoppedAtWaypoint) { GameFiber.Yield(); } + Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, 3f, 1, true); } public static void DismissDriver(CollectedVehicle cv) @@ -147,8 +146,7 @@ namespace SceneManager return; } - cv.SetDismissNow(true); - cv.SetStoppedAtWaypoint(false); + cv.StoppedAtWaypoint = false; if (cv.Vehicle && cv.Vehicle.Driver) { cv.Vehicle.Driver.Dismiss(); From 935bd1eb37f1d53d453749c0203a2665b25f6801 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 7 Sep 2020 20:28:55 -0600 Subject: [PATCH 135/276] Updated references based on Barrier class refactoring. --- SceneManager/EntryPoint.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SceneManager/EntryPoint.cs b/SceneManager/EntryPoint.cs index dec9823..82d0bce 100644 --- a/SceneManager/EntryPoint.cs +++ b/SceneManager/EntryPoint.cs @@ -60,9 +60,9 @@ namespace SceneManager } // Clean up cones - foreach (Barrier barrier in BarrierMenu.barriers.Where(b => b.GetBarrier())) + foreach (Barrier barrier in BarrierMenu.barriers.Where(b => b.Object)) { - barrier.GetBarrier().Delete(); + barrier.Object.Delete(); } if (BarrierMenu.shadowBarrier) { From de6169101f2bd48da07eb36f73433aec8b26b2a0 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 13 Sep 2020 02:51:46 -0600 Subject: [PATCH 136/276] Shadow barrier will now only appear while the barrierList or rotateBarrier menu items are selected. Reset Barriers code fixed for road barrel w/ base object. --- SceneManager/Menus/BarrierMenu.cs | 51 +++++++++++++++++++------------ 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index 5e98f39..1d2d565 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -13,8 +13,6 @@ namespace SceneManager public static UIMenu barrierMenu { get; private set; } public static List barriers = new List(); private static UIMenuListScrollerItem barrierList = new UIMenuListScrollerItem("Select Barrier", "", Settings.barrierKeys); - //private static UIMenuListScrollerItem barrierList = new UIMenuListScrollerItem("Select Barrier", "", new[] { "Large Striped Cone", "Large Cone", "Medium Striped Cone", "Medium Cone", "Roadpole A", "Roadpole B", "Police Barrier", "Road Barrier", "Flare" }); - //private static string[] barrierObjectNames = new string[] { "prop_mp_cone_01", "prop_roadcone01c", "prop_mp_cone_02", "prop_mp_cone_03", "prop_roadpole_01a", "prop_roadpole_01b", "prop_barrier_work05", "prop_barrier_work06a", "prop_flare_01b" }; private static UIMenuNumericScrollerItem rotateBarrier = new UIMenuNumericScrollerItem("Rotate Barrier", "", 0, 350, 10); private static UIMenuListScrollerItem removeBarrierOptions = new UIMenuListScrollerItem("Remove Barrier", "", new[] { "Last Barrier", "Nearest Barrier", "All Barriers" }); private static UIMenuItem resetBarriers = new UIMenuItem("Reset Barriers", "Reset all spawned barriers to their original position and rotation"); @@ -59,8 +57,7 @@ namespace SceneManager if (shadowBarrier) shadowBarrier.Delete(); - //shadowBarrier = new Rage.Object(Settings.barrierValues[barrierList.Index], TracePlayerView(15, TraceFlags.IntersectEverything).HitPosition, Game.LocalPlayer.Character.Heading); - shadowBarrier = new Rage.Object(Settings.barrierValues[barrierList.Index], TracePlayerView(15, TraceFlags.IntersectEverything).HitPosition, rotateBarrier.Value); + shadowBarrier = new Rage.Object(Settings.barrierValues[barrierList.Index], TracePlayerView(15, TraceFlags.IntersectWorld).HitPosition, rotateBarrier.Value); Rage.Native.NativeFunction.Natives.PLACE_OBJECT_ON_GROUND_PROPERLY(shadowBarrier); shadowBarrier.IsGravityDisabled = true; shadowBarrier.IsCollisionEnabled = false; @@ -70,11 +67,19 @@ namespace SceneManager ShadowConeLoopFiber.Start(); } - private static void LoopToDisplayShadowBarrier(UIMenu coneMenu) + private static void LoopToDisplayShadowBarrier(UIMenu barrierMenu) { - while (coneMenu.Visible && shadowBarrier) + while (barrierMenu.Visible && shadowBarrier) { - UpdateShadowBarrierPosition(); + if (barrierList.Selected || rotateBarrier.Selected) + { + shadowBarrier.IsVisible = true; + UpdateShadowBarrierPosition(); + } + else + { + shadowBarrier.IsVisible = false; + } GameFiber.Yield(); } @@ -85,9 +90,7 @@ namespace SceneManager private static void UpdateShadowBarrierPosition() { DisableBarrierMenuOptionsIfShadowConeTooFar(); - //shadowBarrier.Position = TracePlayerView(SettingsMenu.barrierPlacementDistance.Value, TraceFlags.IntersectWorld).HitPosition; - //Rage.Native.NativeFunction.Natives.PLACE_OBJECT_ON_GROUND_PROPERLY(shadowBarrier); - shadowBarrier.SetPositionWithSnap(TracePlayerView(SettingsMenu.barrierPlacementDistance.Value, TraceFlags.IntersectEverything).HitPosition); + shadowBarrier.SetPositionWithSnap(TracePlayerView(SettingsMenu.barrierPlacementDistance.Value, TraceFlags.IntersectWorld).HitPosition); void DisableBarrierMenuOptionsIfShadowConeTooFar() { @@ -96,7 +99,7 @@ namespace SceneManager barrierList.Enabled = false; rotateBarrier.Enabled = false; } - else if(shadowBarrier.Position.DistanceTo2D(Game.LocalPlayer.Character.Position) <= SettingsMenu.barrierPlacementDistance.Value && barrierList.SelectedItem == "Flare") + else if (shadowBarrier.Position.DistanceTo2D(Game.LocalPlayer.Character.Position) <= SettingsMenu.barrierPlacementDistance.Value && barrierList.SelectedItem == "Flare") { barrierList.Enabled = true; rotateBarrier.Enabled = false; @@ -155,13 +158,21 @@ namespace SceneManager if (selectedItem == resetBarriers) { - var currentBarriers = barriers.Where(b => b.Object?.Model.Name != "0xa2c44e80").ToList(); - foreach(Barrier barrier in currentBarriers) + var currentBarriers = barriers.Where(b => b.Object && b.Object.Model.Name != "0xa2c44e80").ToList(); + foreach (Barrier oldBarrier in currentBarriers) { - var newBarrier = new Rage.Object(barrier.Object.Model, barrier.Position, barrier.Rotation); - barriers.Add(new Barrier(newBarrier, newBarrier.Position, newBarrier.Heading)); - barrier.Object.Delete(); - barriers.Remove(barrier); + if (oldBarrier.Object) + { + var newBarrier = new Rage.Object(oldBarrier.Object.Model, oldBarrier.Position, oldBarrier.Rotation); + newBarrier.SetPositionWithSnap(oldBarrier.Position); + Rage.Native.NativeFunction.Natives.SET_ENTITY_DYNAMIC(newBarrier, true); + newBarrier.IsPositionFrozen = false; + Rage.Native.NativeFunction.Natives.SET_DISABLE_FRAG_DAMAGE(newBarrier, true); + barriers.Add(new Barrier(newBarrier, newBarrier.Position, newBarrier.Heading)); + + oldBarrier.Object.Delete(); + barriers.Remove(oldBarrier); + } } currentBarriers.Clear(); } @@ -171,8 +182,10 @@ namespace SceneManager { var barrier = new Rage.Object(shadowBarrier.Model, shadowBarrier.Position, rotateBarrier.Value); barrier.SetPositionWithSnap(shadowBarrier.Position); + Rage.Native.NativeFunction.Natives.SET_ENTITY_DYNAMIC(barrier, true); + barrier.IsPositionFrozen = false; Rage.Native.NativeFunction.Natives.SET_DISABLE_FRAG_DAMAGE(barrier, true); - Rage.Native.NativeFunction.Natives.SET_DISABLE_BREAKING(barrier, true); + //Rage.Native.NativeFunction.Natives.SET_DISABLE_BREAKING(barrier, true); barriers.Add(new Barrier(barrier, barrier.Position, barrier.Heading)); removeBarrierOptions.Enabled = true; @@ -259,7 +272,7 @@ namespace SceneManager return World.TraceLine(start, end, flags, barrierObjects); } - internal static HitResult TracePlayerView(float maxTraceDistance = 30f, TraceFlags flags = TraceFlags.IntersectEverything) => TracePlayerView(out Vector3 v1, out Vector3 v2, maxTraceDistance, flags); + internal static HitResult TracePlayerView(float maxTraceDistance = 30f, TraceFlags flags = TraceFlags.IntersectWorld) => TracePlayerView(out Vector3 v1, out Vector3 v2, maxTraceDistance, flags); //------------ CREDIT PNWPARKS FOR THESE FUNCTIONS ------------\\ } } From 1b9a3b4cebd8779fa53cc9ed0039e802254df183 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 13 Sep 2020 02:52:16 -0600 Subject: [PATCH 137/276] Updated reference to PathMainMenu.DeletePath method --- SceneManager/Menus/EditPathMenu.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/Menus/EditPathMenu.cs b/SceneManager/Menus/EditPathMenu.cs index 6bd9e11..f0100b1 100644 --- a/SceneManager/Menus/EditPathMenu.cs +++ b/SceneManager/Menus/EditPathMenu.cs @@ -42,7 +42,7 @@ namespace SceneManager if (selectedItem == deletePath) { - PathMainMenu.DeletePath(currentPath, currentPath.Number - 1, PathMainMenu.Delete.Single); + PathMainMenu.DeletePath(currentPath, PathMainMenu.Delete.Single); } } From 6456f43b99006e575057cc4bd5d71e81b1aa87e4 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 13 Sep 2020 02:54:03 -0600 Subject: [PATCH 138/276] Updating the only waypoint in a path must now be a collector waypoint. --- SceneManager/Menus/EditWaypointMenu.cs | 48 ++++++++++++-------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index ad1d68c..99e6392 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -21,7 +21,7 @@ namespace SceneManager public static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path"); public static UIMenuNumericScrollerItem changeCollectorRadius = new UIMenuNumericScrollerItem("Collection Radius", "The distance from this waypoint (in meters) vehicles will be collected", 1, 50, 1); public static UIMenuNumericScrollerItem changeSpeedZoneRadius = new UIMenuNumericScrollerItem("Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 5, 200, 5); - public static UIMenuCheckboxItem updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false, "Updates the waypoint's position to the player's current position"); + public static UIMenuCheckboxItem updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false, "Updates the waypoint's position to the player's current position. You should turn this on if you're planning on adding this waypoint as a new waypoint."); internal static void InstantiateMenu() { @@ -88,19 +88,12 @@ namespace SceneManager editWaypointMenu.OnCheckboxChange += EditWaypoint_OnCheckboxChanged; editWaypointMenu.OnItemSelect += EditWaypoint_OnItemSelected; editWaypoint.IndexChanged += EditWaypoint_OnIndexChanged; - - currentWaypoint.DrawMarkerForWaypointBeingEdited(); } private static void EditWaypoint_OnIndexChanged(UIMenuScrollerItem scrollerItem, int oldIndex, int newIndex) { var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Value - 1]; var currentWaypoint = currentPath.Waypoints[editWaypoint.Value - 1]; - - if (scrollerItem == editWaypoint) - { - currentPath.Waypoints[oldIndex].EnableWaypointMarker = true; - } } private static void EditWaypoint_OnScrollerChanged(UIMenu sender, UIMenuScrollerItem scrollerItem, int first, int last) @@ -116,7 +109,6 @@ namespace SceneManager changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; changeSpeedZoneRadius.Enabled = collectorWaypoint.Checked ? true : false; updateWaypointPosition.Checked = false; - currentWaypoint.DrawMarkerForWaypointBeingEdited(); } if (scrollerItem == changeCollectorRadius) @@ -138,9 +130,6 @@ namespace SceneManager private static void EditWaypoint_OnCheckboxChanged(UIMenu sender, UIMenuCheckboxItem checkboxItem, bool @checked) { - var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Value - 1]; - var currentWaypoint = currentPath.Waypoints[editWaypoint.Value - 1]; - if (checkboxItem == collectorWaypoint) { changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; @@ -155,21 +144,25 @@ namespace SceneManager if (selectedItem == updateWaypoint) { - currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], SetDriveSpeedForWaypoint(), collectorWaypoint.Checked, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, updateWaypointPosition.Checked); + if(currentPath.Waypoints.Count == 1) + { + currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], SetDriveSpeedForWaypoint(), true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, updateWaypointPosition.Checked); + } + else + { + currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], SetDriveSpeedForWaypoint(), collectorWaypoint.Checked, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, updateWaypointPosition.Checked); + } + Game.LogTrivial($"Updated path {currentPath.Number} waypoint {currentWaypoint.Number}: Driving flag is {drivingFlags[changeWaypointType.Index].ToString()}, speed is {changeWaypointSpeed.Value}, collector is {currentWaypoint.IsCollector}"); - if (currentPath.Waypoints.Count < 2 && currentPath.Waypoints[0].DrivingFlag == VehicleDrivingFlags.StopAtDestination) - { - Game.LogTrivial($"The remaining waypoint was updated to be a stop waypoint. Enabling/disabling the path is no longer locked."); - EditPathMenu.disablePath.Enabled = true; - } updateWaypointPosition.Checked = false; Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Waypoint {currentWaypoint.Number} updated."); + + BuildEditWaypointMenu(); } if (selectedItem == addAsNewWaypoint) { - currentWaypoint.EnableWaypointMarker = true; var pathIndex = PathMainMenu.GetPaths().IndexOf(currentPath); var drivingFlag = drivingFlags[changeWaypointType.Index]; var blip = PathCreationMenu.CreateWaypointBlip(pathIndex, drivingFlag); @@ -197,11 +190,10 @@ namespace SceneManager if (selectedItem == removeWaypoint) { - Game.LogTrivial($"[Path {currentPath.Number}] Waypoint {currentWaypoint.Number} ({currentWaypoint.DrivingFlag}) removed"); if (currentPath.Waypoints.Count == 1) { Game.LogTrivial($"Deleting the last waypoint from the path."); - PathMainMenu.DeletePath(currentPath, currentPath.Number - 1, PathMainMenu.Delete.Single); + PathMainMenu.DeletePath(currentPath, PathMainMenu.Delete.Single); editWaypointMenu.Visible = false; PathMainMenu.pathMainMenu.Visible = true; @@ -214,6 +206,7 @@ namespace SceneManager currentWaypoint.CollectorRadiusBlip.Delete(); } currentPath.Waypoints.Remove(currentWaypoint); + Game.LogTrivial($"[Path {currentPath.Number}] Waypoint {currentWaypoint.Number} ({currentWaypoint.DrivingFlag}) removed"); foreach (Waypoint wp in currentPath.Waypoints) { @@ -221,14 +214,17 @@ namespace SceneManager Game.LogTrivial($"Waypoint at index {currentPath.Waypoints.IndexOf(wp)} is now waypoint #{wp.Number}"); } + editWaypointMenu.Clear(); BuildEditWaypointMenu(); - if (currentPath.Waypoints.Count == 1 && currentPath.Waypoints[0].DrivingFlag != VehicleDrivingFlags.StopAtDestination) + if (currentPath.Waypoints.Count == 1) { - Game.LogTrivial($"The path only has 1 waypoint left, and the waypoint is not a stop waypoint. Disabling the path."); - currentPath.DisablePath(); - EditPathMenu.disablePath.Checked = true; - EditPathMenu.disablePath.Enabled = false; + Hints.Display($"~o~Scene Manager\n~y~[Hint]~w~ Your path's first waypoint ~b~must~w~ be a collector. If it's not, it will automatically be made into one."); + Game.LogTrivial($"The path only has 1 waypoint left, this waypoint must be a collector."); + currentPath.Waypoints[0].UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], SetDriveSpeedForWaypoint(), true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, updateWaypointPosition.Checked); + collectorWaypoint.Checked = true; + changeCollectorRadius.Enabled = true; + changeSpeedZoneRadius.Enabled = true; } } } From 5d3d90bfe7b792cc4d8006fb4d80f0b895cec963 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 13 Sep 2020 02:55:09 -0600 Subject: [PATCH 139/276] Removed DebugGraphics.LoopToDrawDebugGraphics method from trafficAddWaypoint --- SceneManager/Menus/PathCreationMenu.cs | 28 ++++++++++++++------------ 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index f3db183..a3a0676 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Drawing; using System.Linq; using Rage; @@ -14,9 +15,9 @@ namespace SceneManager private static string[] waypointTypes = new string[] { "Drive To (Normal)", "Drive To (Direct)", "Stop" }; public static UIMenu pathCreationMenu { get; private set; } private static UIMenuItem trafficAddWaypoint, trafficRemoveWaypoint, trafficEndPath; - public static UIMenuListScrollerItem waypointType = new UIMenuListScrollerItem("Waypoint Type", "", waypointTypes); + public static UIMenuListScrollerItem waypointType = new UIMenuListScrollerItem("Waypoint Type", $"~b~Drive To (Normal): ~w~AI obeys traffic as much as possible{Environment.NewLine}~b~Drive To (Direct): ~w~AI ignores pathfinding rules{Environment.NewLine}~b~Stop: ~w~AI stops at the waypoint until dismissed", waypointTypes); private static UIMenuNumericScrollerItem waypointSpeed; - public static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path"); + public static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path. Your path's first waypoint ~b~must~w~ be a collector."); public static UIMenuNumericScrollerItem collectorRadius = new UIMenuNumericScrollerItem("Collection Radius", "The distance from this waypoint (in meters) vehicles will be collected", 1, 50, 1); public static UIMenuNumericScrollerItem speedZoneRadius = new UIMenuNumericScrollerItem("Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 5, 200, 5); @@ -33,10 +34,14 @@ namespace SceneManager pathCreationMenu.AddItem(waypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 80, 5)); waypointSpeed.Index = 0; pathCreationMenu.AddItem(collectorWaypoint); + collectorWaypoint.Enabled = false; + collectorWaypoint.Checked = true; pathCreationMenu.AddItem(collectorRadius); collectorRadius.Index = 0; + collectorRadius.Enabled = true; pathCreationMenu.AddItem(speedZoneRadius); speedZoneRadius.Index = 0; + speedZoneRadius.Enabled = true; pathCreationMenu.AddItem(trafficAddWaypoint = new UIMenuItem("Add waypoint")); trafficAddWaypoint.ForeColor = Color.Gold; pathCreationMenu.AddItem(trafficRemoveWaypoint = new UIMenuItem("Remove last waypoint")); @@ -72,20 +77,10 @@ namespace SceneManager if (!anyPathsExist) { AddNewPathToPathsCollection(PathMainMenu.GetPaths(), 0); - - if (SettingsMenu.threeDWaypoints.Checked) - { - DebugGraphics.LoopToDrawDebugGraphics(PathMainMenu.GetPaths()[0]); - } } else if(anyPathsExist && !PathMainMenu.GetPaths().Any(p => p != null && p.State == State.Creating)) { AddNewPathToPathsCollection(PathMainMenu.GetPaths(), PathMainMenu.GetPaths().IndexOf(PathMainMenu.GetPaths().Where(p => p.State == State.Finished).First()) + 1); - - if (SettingsMenu.threeDWaypoints.Checked) - { - DebugGraphics.LoopToDrawDebugGraphics(PathMainMenu.GetPaths().Where(p => p != null && p.State == State.Creating).First()); - } } var firstNonNullPath = PathMainMenu.GetPaths().Where(p => p != null && p.State == State.Creating).First(); @@ -104,6 +99,7 @@ namespace SceneManager Game.LogTrivial($"[Path {pathNumber}] Waypoint {waypointNumber} ({drivingFlags[waypointType.Index].ToString()}) added"); ToggleTrafficEndPathMenuItem(pathIndex); + collectorWaypoint.Enabled = true; trafficRemoveWaypoint.Enabled = true; PathMainMenu.createNewPath.Text = $"Continue Creating Path {pathNumber}"; } @@ -130,6 +126,8 @@ namespace SceneManager // If the path has no waypoints, disable the menu option to remove a waypoint if (PathMainMenu.GetPaths()[i].Waypoints.Count == 0) { + collectorWaypoint.Checked = true; + collectorWaypoint.Enabled = false; trafficRemoveWaypoint.Enabled = false; trafficEndPath.Enabled = false; } @@ -163,6 +161,10 @@ namespace SceneManager PathMainMenu.createNewPath.Text = "Create New Path"; PathMainMenu.pathMainMenu.Clear(); PathMainMenu.BuildPathMenu(); + collectorWaypoint.Enabled = false; + collectorWaypoint.Checked = true; + speedZoneRadius.Enabled = true; + collectorRadius.Enabled = true; trafficEndPath.Enabled = false; PathMainMenu.pathMainMenu.Visible = true; From 628120f5f2faffafba1939e7cb8abf0445b7aa89 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 13 Sep 2020 02:57:26 -0600 Subject: [PATCH 140/276] Removed IsInCollectedVehicles method. Added code to DeletePath method for vehicles stopped at a waypoint. Refactored directDriver and dismissDriver options. --- SceneManager/Menus/PathMainMenu.cs | 216 +++++++++-------------------- 1 file changed, 69 insertions(+), 147 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index d9303e4..0567fb2 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Drawing; using System.Linq; using Rage; @@ -45,16 +46,14 @@ namespace SceneManager pathMainMenu.AddItem(createNewPath = new UIMenuItem("Create New Path")); createNewPath.ForeColor = Color.Gold; pathMainMenu.AddItem(editPath = new UIMenuNumericScrollerItem("Edit Path", "", 1, paths.Count, 1)); - //pathMainMenu.AddItem(editPath = new UIMenuListScrollerItem("Edit Path", "", pathsNum)); editPath.ForeColor = Color.Gold; pathMainMenu.AddItem(disableAllPaths = new UIMenuCheckboxItem("Disable All Paths", false)); pathMainMenu.AddItem(deleteAllPaths = new UIMenuItem("Delete All Paths")); deleteAllPaths.ForeColor = Color.Gold; pathMainMenu.AddItem(directOptions = new UIMenuListScrollerItem("Direct driver to path's", "", new[] { "First waypoint", "Nearest waypoint" })); pathMainMenu.AddItem(directDriver = new UIMenuNumericScrollerItem("Direct nearest driver to path", "", 1, paths.Count, 1)); - //pathMainMenu.AddItem(directDriver = new UIMenuListScrollerItem("Direct nearest driver to path", "", pathsNum)); directDriver.ForeColor = Color.Gold; - pathMainMenu.AddItem(dismissDriver = new UIMenuListScrollerItem("Dismiss nearest driver", "", dismissOptions)); + pathMainMenu.AddItem(dismissDriver = new UIMenuListScrollerItem("Dismiss nearest driver", $"~b~From path: ~w~AI will be released from the path{Environment.NewLine}~b~From waypoint: ~w~AI will skip their current waypoint task{Environment.NewLine}~b~From position: ~w~AI will be released from current position. This can be used for stuck vehicles, and is the default behavior for vehicles not collected by a path.", dismissOptions)); dismissDriver.ForeColor = Color.Gold; if (paths.Count == 8) @@ -94,36 +93,25 @@ namespace SceneManager } } - private static bool IsInCollectedVehicles(this Vehicle vehicle) - { - if (vehicle && VehicleCollector.collectedVehicles.Any(cv => cv.Vehicle == vehicle)) - { - Game.LogTrivial($"{vehicle.Model.Name} was found in the collection."); - return true; - } - else - { - Game.LogTrivial($"{vehicle.Model.Name} was not found in the collection."); - return false; - } - } - - public static void DeletePath(Path path, int index, Delete pathsToDelete) + public static void DeletePath(Path path, Delete pathsToDelete) { // Before deleting a path, we need to dismiss any vehicles controlled by that path and remove the vehicles from ControlledVehicles - //Game.LogTrivial($"Deleting path {index+1}"); Game.LogTrivial($"Deleting path {path.Number}"); var pathVehicles = VehicleCollector.collectedVehicles.Where(cv => cv.Path.Number == path.Number).ToList(); Game.LogTrivial($"Removing all vehicles on the path"); - foreach (CollectedVehicle cv in pathVehicles.Where(cv => cv.Vehicle && cv.Vehicle.Driver)) + foreach (CollectedVehicle cv in pathVehicles.Where(cv => cv != null && cv.Vehicle && cv.Driver)) { + if (cv.StoppedAtWaypoint) + { + Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(cv.Vehicle, 1f, 1, true); + } cv.StoppedAtWaypoint = false; cv.Driver.Tasks.Clear(); cv.Driver.Dismiss(); - cv.Driver.IsPersistent = false; + cv.Vehicle.IsSirenOn = false; + cv.Vehicle.IsSirenSilent = true; cv.Vehicle.Dismiss(); - cv.Vehicle.IsPersistent = false; //Game.LogTrivial($"{cv.vehicle.Model.Name} cleared from path {cv.path}"); VehicleCollector.collectedVehicles.Remove(cv); @@ -149,10 +137,11 @@ namespace SceneManager Game.LogTrivial($"Clearing path.WaypointData"); path.Waypoints.Clear(); + // Manipulating the menu to reflect specific paths being deleted if (pathsToDelete == Delete.Single) { - paths.RemoveAt(index); + paths.Remove(path); BuildPathMenu(); pathMainMenu.Visible = true; Game.LogTrivial($"Path {path.Number} deleted."); @@ -176,7 +165,6 @@ namespace SceneManager { if (paths.ElementAtOrDefault(i) != null && paths[i].State == State.Creating) { - //Game.LogTrivial($"pathFinished: {paths[i].PathFinished}"); Game.LogTrivial($"Resuming path {paths[i].Number}"); Game.DisplayNotification($"~o~Scene Manager\n~y~[Creating]~w~ Resuming path {paths[i].Number}"); break; @@ -195,7 +183,7 @@ namespace SceneManager // Iterate through each item in paths and delete it for (int i = 0; i < paths.Count; i++) { - DeletePath(paths[i], i, Delete.All); + DeletePath(paths[i], Delete.All); } foreach (Path path in paths) { @@ -212,132 +200,69 @@ namespace SceneManager Game.DisplayNotification($"~o~Scene Manager\n~w~All paths deleted."); } - // This needs big refactor if (selectedItem == directDriver) { var nearbyVehicle = Game.LocalPlayer.Character.GetNearbyVehicles(1).Where(v => v.VehicleAndDriverValid()).SingleOrDefault(); - var firstWaypoint = paths[directDriver.Index].Waypoints.First(); - var pathNum = paths[directDriver.Index].Waypoints[0].Path; - var totalPathWaypoints = paths[directDriver.Index].Waypoints.Count; + CollectedVehicle collectedVehicle; if (nearbyVehicle) { - var nearestWaypoint = paths[directDriver.Index].Waypoints.Where(wp => wp.Position.DistanceTo2D(nearbyVehicle.FrontPosition) < wp.Position.DistanceTo2D(nearbyVehicle.RearPosition)).OrderBy(wp => wp.Position.DistanceTo2D(nearbyVehicle)).ToArray(); + collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle).FirstOrDefault(); + var path = paths[directDriver.Index]; + var waypoints = path.Waypoints; + var firstWaypoint = waypoints.First(); + var nearestWaypoint = waypoints.Where(wp => wp.Position.DistanceTo2D(nearbyVehicle.FrontPosition) < wp.Position.DistanceTo2D(nearbyVehicle.RearPosition)).OrderBy(wp => wp.Position.DistanceTo2D(nearbyVehicle)).FirstOrDefault(); VehicleCollector.SetVehicleAndDriverPersistence(nearbyVehicle); - if (nearbyVehicle.IsInCollectedVehicles()) - { - Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} already in collection. Clearing tasks."); - nearbyVehicle.Driver.Tasks.Clear(); - if (directOptions.SelectedItem == "First waypoint") + // The vehicle should only be added to the collection when it's not null AND if the selected item is First Waypoint OR if the selected item is nearestWaypoint AND nearestWaypoint is not null + if (collectedVehicle == null && (directOptions.SelectedItem == "First waypoint" || directOptions.SelectedItem == "Nearest waypoint" && nearestWaypoint != null)) + { + Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} not found in collection, adding now."); + VehicleCollector.collectedVehicles.Add(new CollectedVehicle(nearbyVehicle, path, false)); + collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle).FirstOrDefault(); + } + + if (collectedVehicle == null) + { + return; + } + + collectedVehicle.Driver.Tasks.Clear(); + + if (directOptions.SelectedItem == "First waypoint") + { + GameFiber.StartNew(() => { - GameFiber.StartNew(() => - { - nearbyVehicle.Driver.Tasks.DriveToPosition(firstWaypoint.Position, firstWaypoint.Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); - }); - } - else - { - GameFiber.StartNew(() => - { - nearbyVehicle.Driver.Tasks.DriveToPosition(nearestWaypoint[0].Position, nearestWaypoint[0].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); - }); - } + AITasking.AssignWaypointTasks(collectedVehicle, waypoints, firstWaypoint); + }); } else { - VehicleCollector.collectedVehicles.Add(new CollectedVehicle(nearbyVehicle, paths[directDriver.Index], paths[directDriver.Index].Waypoints.Count, 1, false)); - var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle) as CollectedVehicle; - Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} not in collection, adding to collection for path {paths[directDriver.Index].Number} with {paths[directDriver.Index].Waypoints.Count} waypoints"); - - if (directOptions.SelectedItem == "First waypoint") + if (nearestWaypoint != null) { GameFiber.StartNew(() => { - nearbyVehicle.Driver.Tasks.DriveToPosition(firstWaypoint.Position, firstWaypoint.Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); - - for (int nextWaypoint = firstWaypoint.Number; nextWaypoint < paths[directDriver.Index].Waypoints.Count; nextWaypoint++) - { - if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) == null) - { - Game.LogTrivial($"Waypoint is null"); - break; - } - - Game.LogTrivial($"{nearbyVehicle.Model.Name} is driving to waypoint {paths[directDriver.Index].Waypoints[nextWaypoint].Number}"); - if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && !collectedVehicle.StoppedAtWaypoint) - { - nearbyVehicle.Driver.Tasks.DriveToPosition(paths[directDriver.Index].Waypoints[nextWaypoint].Position, paths[directDriver.Index].Waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); - } - - if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && paths[directDriver.Index].Waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) - { - Game.LogTrivial($"{nearbyVehicle.Model.Name} stopping at waypoint."); - nearbyVehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); - collectedVehicle.StoppedAtWaypoint = true; - } - } - Game.LogTrivial($"{nearbyVehicle.Model.Name} all tasks complete."); - AITasking.DismissDriver(collectedVehicle); - }); - } - else - { - GameFiber.StartNew(() => - { - nearbyVehicle.Driver.Tasks.DriveToPosition(nearestWaypoint[0].Position, nearestWaypoint[0].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); - - for (int nextWaypoint = nearestWaypoint[0].Number; nextWaypoint < paths[directDriver.Index].Waypoints.Count; nextWaypoint++) - { - if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) == null) - { - Game.LogTrivial($"Waypoint is null"); - break; - } - - Game.LogTrivial($"{nearbyVehicle.Model.Name} is driving to waypoint {paths[directDriver.Index].Waypoints[nextWaypoint].Number}"); - if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && !collectedVehicle.StoppedAtWaypoint) - { - nearbyVehicle.Driver.Tasks.DriveToPosition(paths[directDriver.Index].Waypoints[nextWaypoint].Position, paths[directDriver.Index].Waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263043, 2f).WaitForCompletion(); - } - - if (paths[directDriver.Index].Waypoints.ElementAtOrDefault(nextWaypoint) != null && paths[directDriver.Index].Waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) - { - Game.LogTrivial($"{nearbyVehicle.Model.Name} stopping at waypoint."); - nearbyVehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); - collectedVehicle.StoppedAtWaypoint = true; - } - } - Game.LogTrivial($"{nearbyVehicle.Model.Name} all tasks complete."); - AITasking.DismissDriver(collectedVehicle); + AITasking.AssignWaypointTasks(collectedVehicle, waypoints, nearestWaypoint); }); } } } } - // Needs refactor if (selectedItem == dismissDriver) { var nearbyVehicle = Game.LocalPlayer.Character.GetNearbyVehicles(1).Where(v => v != Game.LocalPlayer.Character.CurrentVehicle && v.VehicleAndDriverValid()).SingleOrDefault(); if (nearbyVehicle) { - var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle).First(); + var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle).FirstOrDefault(); switch (dismissDriver.Index) { case 0: Game.LogTrivial($"Dismiss from path"); - if (nearbyVehicle.IsInCollectedVehicles()) + if (collectedVehicle != null) { - if (collectedVehicle != null) - { - collectedVehicle.StoppedAtWaypoint = false; - collectedVehicle.Vehicle.Driver.Tasks.Clear(); - collectedVehicle.Vehicle.Driver.Dismiss(); - collectedVehicle.Vehicle.IsSirenOn = false; - Game.LogTrivial($"Dismissed driver of {collectedVehicle.Vehicle.Model.Name} from path {collectedVehicle.Path}"); - } + collectedVehicle.Dismiss(); } else { @@ -347,23 +272,25 @@ namespace SceneManager case 1: Game.LogTrivial($"Dismiss from waypoint"); - if (nearbyVehicle.IsInCollectedVehicles()) + if (collectedVehicle != null) { - if (collectedVehicle != null) + if (collectedVehicle.StoppedAtWaypoint) { collectedVehicle.StoppedAtWaypoint = false; - collectedVehicle.Vehicle.Driver.Tasks.Clear(); - collectedVehicle.Vehicle.Driver.Dismiss(); - collectedVehicle.Vehicle.IsSirenOn = false; + } + else + { + collectedVehicle.SkipWaypoint = true; + collectedVehicle.Driver.Tasks.Clear(); + } - if (collectedVehicle.CurrentWaypoint == collectedVehicle.Path.Waypoints.Count && !collectedVehicle.StoppedAtWaypoint) - { - Game.LogTrivial($"Dismissed driver of {collectedVehicle.Vehicle.Model.Name} from final waypoint and ultimately the path"); - } - else - { - Game.LogTrivial($"Dismissed driver of {collectedVehicle.Vehicle.Model.Name} from waypoint {collectedVehicle.CurrentWaypoint}"); - } + if (collectedVehicle.CurrentWaypoint.Number == collectedVehicle.Path.Waypoints.Count && !collectedVehicle.StoppedAtWaypoint) + { + Game.LogTrivial($"Dismissed driver of {collectedVehicle.Vehicle.Model.Name} from final waypoint and ultimately the path"); + } + else + { + Game.LogTrivial($"Dismissed driver of {collectedVehicle.Vehicle.Model.Name} from current waypoint task"); } } else @@ -374,31 +301,26 @@ namespace SceneManager case 2: Game.LogTrivial($"Dismiss from position"); - if (nearbyVehicle.IsInCollectedVehicles()) + if(collectedVehicle != null) { - if(collectedVehicle != null) - { - collectedVehicle.StoppedAtWaypoint = false; - collectedVehicle.Driver.Tasks.Clear(); - collectedVehicle.Driver.Dismiss(); - collectedVehicle.Vehicle.IsSirenOn = false; - Game.LogTrivial($"Dismissed driver of {nearbyVehicle.Model.Name} from position (in collection)"); - } + collectedVehicle.StoppedAtWaypoint = false; + Game.LogTrivial($"Dismissed driver of {nearbyVehicle.Model.Name} from position (in collection)"); } else { + if(nearbyVehicle.Speed < 1f) + { + Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(nearbyVehicle, 3f, 1, true); + } nearbyVehicle.Driver.Tasks.Clear(); - nearbyVehicle.Driver.Dismiss(); nearbyVehicle.IsSirenOn = false; + nearbyVehicle.IsSirenSilent = true; + nearbyVehicle.Driver.Dismiss(); Game.LogTrivial($"Dismissed driver of {nearbyVehicle.Model.Name} from position (was not in collection)"); } break; } } - else - { - Game.LogTrivial($"There are no vehicles nearby matching the requirements."); - } } } From 08115a871bfa256c30c4233b2bf59c6b7b4a8357 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 13 Sep 2020 02:58:19 -0600 Subject: [PATCH 141/276] Removed DebugGraphics.LoopToDrawDebugGraphics reference. --- SceneManager/Menus/SettingsMenu.cs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/SceneManager/Menus/SettingsMenu.cs b/SceneManager/Menus/SettingsMenu.cs index 46bbe6e..0e0ba34 100644 --- a/SceneManager/Menus/SettingsMenu.cs +++ b/SceneManager/Menus/SettingsMenu.cs @@ -56,19 +56,10 @@ namespace SceneManager { if (threeDWaypoints.Checked) { - foreach (Path path in PathMainMenu.GetPaths()) - { - //GameFiber.StartNew(() => - //{ - DebugGraphics.LoopToDrawDebugGraphics(path); - //}); - } - DebugGraphics.Draw3DWaypointOnPlayer(); } } - if (checkboxItem == mapBlips) { if (mapBlips.Checked) From 07dcc46abb850c9d084801170639a7b8620990ea Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 13 Sep 2020 02:59:47 -0600 Subject: [PATCH 142/276] Refactored AssignPropertiesFromDirectedTask method, added Dismiss method. Added a second constructor --- .../Object Classes/CollectedVehicle.cs | 84 +++++++++++++++---- 1 file changed, 70 insertions(+), 14 deletions(-) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index f43a22b..ebcab5b 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -1,4 +1,5 @@ using Rage; +using System.Linq; namespace SceneManager { @@ -7,33 +8,88 @@ namespace SceneManager private Ped _driver { get; set; } private Vehicle _vehicle { get; set; } private Path _path { get; set; } - //private int _path { get; set; } // Should change this to a Path object - private int _currentWaypoint { get; set; } + private Waypoint _currentWaypoint {get; set;} private bool _tasksAssigned { get; set; } private bool _stoppedAtWaypoint { get; set; } + private bool _dismissed { get; set; } = false; + private bool _skipWaypoint { get; set; } = false; public Ped Driver { get { return _driver; } set { _driver = value; } } public Vehicle Vehicle { get { return _vehicle; } set { _vehicle = value; } } public Path Path { get { return _path; } set { _path = value; } } - public int CurrentWaypoint { get { return _currentWaypoint; } set { _currentWaypoint = value; } } + public Waypoint CurrentWaypoint { get { return _currentWaypoint; } set { _currentWaypoint = value; } } public bool TasksAssigned { get { return _tasksAssigned; } set { _tasksAssigned = value; } } public bool StoppedAtWaypoint { get { return _stoppedAtWaypoint; } set { _stoppedAtWaypoint = value; } } + public bool Dismissed { get { return _dismissed; } set { _dismissed = value; } } + public bool SkipWaypoint { get { return _skipWaypoint; } set { _skipWaypoint = value; } } - public CollectedVehicle(Vehicle vehicle, Path path, int totalWaypoints, int currentWaypoint, bool tasksAssigned) + public CollectedVehicle(Vehicle vehicle, Path path, Waypoint currentWaypoint, bool tasksAssigned) { - Vehicle = vehicle; - Driver = vehicle.Driver; - Path = path; - CurrentWaypoint = currentWaypoint; - TasksAssigned = tasksAssigned; + _vehicle = vehicle; + _driver = vehicle.Driver; + _path = path; + _currentWaypoint = currentWaypoint; + _tasksAssigned = tasksAssigned; } - public void AssignPropertiesFromDirectedTask(Path path, int totalPathWaypoints, int currentWaypoint, bool tasksAssigned, bool stoppedAtWaypoint) + public CollectedVehicle(Vehicle vehicle, Path path, bool tasksAssigned) { - Path = path; - CurrentWaypoint = currentWaypoint; - TasksAssigned = tasksAssigned; - StoppedAtWaypoint = stoppedAtWaypoint; + _vehicle = vehicle; + _driver = vehicle.Driver; + _path = path; + _tasksAssigned = tasksAssigned; + } + + public void AssignPropertiesFromDirectedTask(Path path, Waypoint currentWaypoint, bool tasksAssigned, bool stoppedAtWaypoint) + { + _path = path; + _currentWaypoint = currentWaypoint; + _tasksAssigned = tasksAssigned; + _stoppedAtWaypoint = stoppedAtWaypoint; + } + + public void Dismiss() + { + GameFiber.StartNew(() => + { + if (!_vehicle || !_driver) + { + return; + } + _dismissed = true; + _stoppedAtWaypoint = false; + + _driver.Tasks.Clear(); + + if (_driver.GetAttachedBlip()) + { + _driver.GetAttachedBlip().Delete(); + } + + // check if the vehicle is near any of the path's collector waypoints + var nearestCollectorWaypoint = _path.Waypoints.Where(wp => wp.IsCollector && _vehicle.DistanceTo2D(wp.Position) <= wp.CollectorRadius * 2).FirstOrDefault(); + if (nearestCollectorWaypoint != null) + { + while (nearestCollectorWaypoint != null && _vehicle && _driver && _vehicle.DistanceTo2D(nearestCollectorWaypoint.Position) <= nearestCollectorWaypoint.CollectorRadius * 2.5) + { + //Game.LogTrivial($"{_vehicle.Model.Name} is too close to the collector to be fully dismissed."); + GameFiber.Yield(); + } + } + + if (!_vehicle || !_driver) + { + return; + } + + VehicleCollector.collectedVehicles.Remove(this); + Game.LogTrivial($"{_vehicle.Model.Name} dismissed successfully."); + _driver.BlockPermanentEvents = false; + _driver.Dismiss(); + _vehicle.IsSirenOn = false; + _vehicle.IsSirenSilent = true; + _vehicle.Dismiss(); + }); } } } From 435fce3c15ccd72032d1d4f92357c89afaa1c921 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 13 Sep 2020 03:00:07 -0600 Subject: [PATCH 143/276] Added DrawLinesBetweenWaypoints method. --- SceneManager/Object Classes/Path.cs | 32 ++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/SceneManager/Object Classes/Path.cs b/SceneManager/Object Classes/Path.cs index 139bbf8..6275acb 100644 --- a/SceneManager/Object Classes/Path.cs +++ b/SceneManager/Object Classes/Path.cs @@ -1,10 +1,9 @@ using Rage; using System.Collections.Generic; +using System.Drawing; namespace SceneManager { - - public class Path { private int _number { get; set; } @@ -20,6 +19,7 @@ namespace SceneManager { _number = pathNum; _state = pathState; + DrawLinesBetweenWaypoints(); } public void SetPathNumber(int pathNum) @@ -83,7 +83,33 @@ namespace SceneManager } } - + public void DrawLinesBetweenWaypoints() + { + GameFiber.StartNew(() => + { + while (SettingsMenu.threeDWaypoints.Checked) + { + if (MenuManager.menuPool.IsAnyMenuOpen()) + { + for (int i = 0; i < Waypoints.Count; i++) + { + if (i != Waypoints.Count - 1) + { + if (Waypoints[i + 1].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + Debug.DrawLine(Waypoints[i].Position, Waypoints[i + 1].Position, Color.Orange); + } + else + { + Debug.DrawLine(Waypoints[i].Position, Waypoints[i + 1].Position, Color.Green); + } + } + } + } + GameFiber.Yield(); + } + }); + } } From d7fd0c5ee40cb2f0eb2dec3f2ea22e56594d7484 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 13 Sep 2020 03:00:52 -0600 Subject: [PATCH 144/276] Refactored how waypoint marker is drawn. --- SceneManager/Object Classes/Waypoint.cs | 84 +++++++++++-------------- 1 file changed, 37 insertions(+), 47 deletions(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 733bbac..3f01705 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -7,7 +7,6 @@ namespace SceneManager public class Waypoint { private Path _path { get; set; } - //private int _path { get; set; } private int _number { get; set; } private Vector3 _position { get; set; } private float _speed { get; set; } @@ -18,10 +17,10 @@ namespace SceneManager private Blip _collectorRadiusBlip { get; set; } private float _speedZoneRadius { get; set; } private uint _speedZone { get; set; } - private bool _enableWaypointMarker { get; set; } + private bool _enableWaypointMarker { get; set; } = true; + private bool _enableEditMarker { get; set; } = false; public Path Path { get { return _path; } set { _path = value; } } - //public int Path { get {return _path; } } public int Number { get { return _number; } set { _number = value; } } public Vector3 Position { get { return _position; } } public float Speed { get { return _speed; } } @@ -33,8 +32,9 @@ namespace SceneManager public float SpeedZoneRadius { get { return _speedZoneRadius; } } public uint SpeedZone { get { return _speedZone; } set { _speedZone = value; } } public bool EnableWaypointMarker { get { return _enableWaypointMarker; } set { _enableWaypointMarker = value; } } + public bool EnableEditMarker { get { return _enableEditMarker; } set { _enableEditMarker = value; } } - public Waypoint(Path path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector = false, float collectorRadius = 0, float speedZoneRadius = 0) + public Waypoint(Path path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector = false, float collectorRadius = 1, float speedZoneRadius = 0) { _path = path; _number = waypointNum; @@ -58,7 +58,7 @@ namespace SceneManager { _collectorRadiusBlip.Alpha = 0f; } - _enableWaypointMarker = true; + DrawWaypointMarker(); } public void UpdateWaypoint(Waypoint currentWaypoint, VehicleDrivingFlags drivingFlag, float speed, bool collectorWaypointChecked, float collectorRadius, float speedZoneRadius, bool updateWaypointPositionChecked) @@ -75,7 +75,7 @@ namespace SceneManager { if(_drivingFlag == VehicleDrivingFlags.StopAtDestination && newDrivingFlag != VehicleDrivingFlags.StopAtDestination) { - foreach(CollectedVehicle cv in VehicleCollector.collectedVehicles.Where(cv => cv.Path == _path && cv.CurrentWaypoint == _number && cv.StoppedAtWaypoint)) + foreach(CollectedVehicle cv in VehicleCollector.collectedVehicles.Where(cv => cv.Path == _path && cv.CurrentWaypoint == this && cv.StoppedAtWaypoint)) { Game.LogTrivial($"Setting StoppedAtWaypoint to false for {cv.Vehicle.Model.Name}"); cv.StoppedAtWaypoint = false; @@ -159,82 +159,72 @@ namespace SceneManager public void DrawWaypointMarker() { - if (_enableWaypointMarker) - { - if (IsCollector && CollectorRadius > 0) - { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, CollectorRadius*2, CollectorRadius * 2, 1f, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); - if (SpeedZoneRadius > 0) - { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, SpeedZoneRadius * 2, SpeedZoneRadius * 2, 1f, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); - } - } - else if (DrivingFlag == VehicleDrivingFlags.StopAtDestination) - { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); - } - else - { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); - } - } - } - - public void DrawMarkerForWaypointBeingEdited() - { - _enableWaypointMarker = false; + // This is called once when the waypoint is created GameFiber.StartNew(() => { - while (SettingsMenu.threeDWaypoints.Checked && !_enableWaypointMarker) + while (SettingsMenu.threeDWaypoints.Checked && _enableWaypointMarker && _path.Waypoints.Contains(this)) { - if (EditWaypointMenu.editWaypointMenu.Visible) + if (EditWaypointMenu.editWaypointMenu.Visible && EditWaypointMenu.editWaypoint.Value == Number) { if (EditWaypointMenu.collectorWaypoint.Checked) { if (EditWaypointMenu.updateWaypointPosition.Checked) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); } else { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, 1f, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, 1f, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); } } - else if (EditWaypointMenu.changeWaypointType.SelectedItem == "Drive To") + else if (EditWaypointMenu.changeWaypointType.SelectedItem == "Stop") { if (EditWaypointMenu.updateWaypointPosition.Checked) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 80, false, false, 2, false, 0, 0, false); - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); } else { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); } - + } else { if (EditWaypointMenu.updateWaypointPosition.Checked) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 80, false, false, 2, false, 0, 0, false); - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); } else { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); } } } - else + else if ((_path.State == State.Finished && MenuManager.menuPool.IsAnyMenuOpen()) || (_path.State == State.Creating && PathCreationMenu.pathCreationMenu.Visible)) { - _enableWaypointMarker = true; + if (IsCollector && CollectorRadius > 0) + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, CollectorRadius * 2, CollectorRadius * 2, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); + if (SpeedZoneRadius > 0) + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, SpeedZoneRadius * 2, SpeedZoneRadius * 2, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); + } + } + else if (DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 80, false, false, 2, false, 0, 0, false); + } + else + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 80, false, false, 2, false, 0, 0, false); + } } + GameFiber.Yield(); } }); From a24350a4356f745018ef1e68d4e78051bc081484 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 13 Sep 2020 03:01:45 -0600 Subject: [PATCH 145/276] Removed DismissDriver method. Refactored waypoint tasking. Experimenting with new braking distance formula. --- SceneManager/AITasking.cs | 140 +++++++++++++++++++++++--------------- 1 file changed, 85 insertions(+), 55 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 41ce4eb..40dd4e2 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -13,9 +13,21 @@ namespace SceneManager return; } - if (currentWaypoint != null && currentWaypoint.DrivingFlag == VehicleDrivingFlags.StopAtDestination) + if (currentWaypoint != null) { - StopVehicleAtWaypoint(currentWaypoint, collectedVehicle); + float acceptedDistance = GetAcceptedStoppingDistance(waypoints, waypoints.IndexOf(currentWaypoint)); + Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} distance to collection waypoint: {collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position)}"); + if(collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position) > (currentWaypoint.CollectorRadius)) + { + Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} is driving to waypoint {currentWaypoint.Number}"); + collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)263075, acceptedDistance); + LoopWhileDrivingToWaypoint(collectedVehicle, waypoints, currentWaypoint, acceptedDistance); + } + if(currentWaypoint.DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + StopVehicleAtWaypoint(currentWaypoint, collectedVehicle); + } + } DriveVehicleToNextWaypoint(collectedVehicle, waypoints, currentWaypoint); @@ -25,7 +37,11 @@ namespace SceneManager return; } Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} all tasks complete."); - DismissDriver(collectedVehicle); + if (!collectedVehicle.Dismissed) + { + collectedVehicle.Dismiss(); + } + } private static void DriveVehicleToNextWaypoint(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) @@ -38,37 +54,84 @@ namespace SceneManager var vehicle = collectedVehicle.Vehicle; var driver = vehicle.Driver; - for (int nextWaypoint = currentWaypoint.Number; nextWaypoint < waypoints.Count; nextWaypoint++) + for (int nextWaypoint = currentWaypoint.Number; nextWaypoint < waypoints.Count; nextWaypoint++) // Do we need to make this <= count? Or nextWaypoint = currentWaypoint.Number - 1? Is this dependent on direct vs. normal collection? { if (!VehicleAndDriverNullChecks(waypoints, nextWaypoint, collectedVehicle)) { return; } - Game.LogTrivial($"{vehicle.Model.Name} is driving to waypoint {waypoints[nextWaypoint].Number}"); if (waypoints.ElementAtOrDefault(nextWaypoint) != null && !collectedVehicle.StoppedAtWaypoint) { - if(waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.Normal) + collectedVehicle.CurrentWaypoint = waypoints[nextWaypoint]; + float acceptedDistance = GetAcceptedStoppingDistance(waypoints, nextWaypoint); + + Game.LogTrivial($"{vehicle.Model.Name} is driving to waypoint {waypoints[nextWaypoint].Number}"); + if (waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) { - collectedVehicle.Vehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263083, 2f).WaitForCompletion(); + collectedVehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)17040299, acceptedDistance); } - else if (waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) + else { - collectedVehicle.Vehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)17040299, 2f).WaitForCompletion(); + collectedVehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263075, acceptedDistance); + } + LoopWhileDrivingToWaypoint(collectedVehicle, waypoints, nextWaypoint, acceptedDistance); + + if (collectedVehicle.SkipWaypoint) + { + collectedVehicle.SkipWaypoint = false; + continue; } - collectedVehicle.Vehicle.Driver.Tasks.PerformDrivingManeuver(collectedVehicle.Vehicle, VehicleManeuver.GoForwardWithCustomSteeringAngle, 3); - } + if (!collectedVehicle.Dismissed && waypoints.ElementAtOrDefault(nextWaypoint) != null && waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + StopVehicleAtWaypoint(waypoints[nextWaypoint], collectedVehicle); + } - if (waypoints.ElementAtOrDefault(nextWaypoint) != null && waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) - { - Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} stopping at waypoint."); - collectedVehicle.Vehicle.Driver.Tasks.PerformDrivingManeuver(VehicleManeuver.GoForwardStraightBraking); - collectedVehicle.StoppedAtWaypoint = true; + if (!VehicleAndDriverNullChecks(collectedVehicle) || collectedVehicle.Dismissed) + { + return; + } + collectedVehicle.Driver.Tasks.PerformDrivingManeuver(collectedVehicle.Vehicle, VehicleManeuver.GoForwardWithCustomSteeringAngle, 3); } } } + public static void LoopWhileDrivingToWaypoint(CollectedVehicle collectedVehicle, List waypoints, int nextWaypoint, float acceptedDistance) + { + while (VehicleAndDriverNullChecks(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && waypoints.ElementAtOrDefault(nextWaypoint) != null && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position) > acceptedDistance) + { + //Game.LogTrivial($"Looping while {collectedVehicle.Vehicle.Model.Name} drives to waypoint {waypoints[nextWaypoint].Number} ({collectedVehicle.Vehicle.DistanceTo2D(waypoints[nextWaypoint].Position)}m away from collector radius {waypoints[nextWaypoint].CollectorRadius})"); + //Game.LogTrivial($"Distance of front of vehicle to waypoint: {collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position)}"); + GameFiber.Yield(); + } + } + + public static void LoopWhileDrivingToWaypoint(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint, float acceptedDistance) + { + while (VehicleAndDriverNullChecks(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(currentWaypoint.Position) > acceptedDistance) + { + //Game.LogTrivial($"Looping while {collectedVehicle.Vehicle.Model.Name} drives to waypoint {currentWaypoint.Number} ({collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position)}m away)"); + GameFiber.Yield(); + } + } + + private static float GetAcceptedStoppingDistance(List waypoints, int nextWaypoint) + { + float dist; + if(Settings.SpeedUnit == SpeedUnits.MPH) + { + dist = (MathHelper.ConvertMilesPerHourToKilometersPerHour(waypoints[nextWaypoint].Speed) * MathHelper.ConvertMilesPerHourToKilometersPerHour(waypoints[nextWaypoint].Speed)) / (250 * 0.8f); + } + else + { + dist = (waypoints[nextWaypoint].Speed * waypoints[nextWaypoint].Speed) / (250 * 0.8f); + } + var acceptedDistance = MathHelper.Clamp(dist, 2, 10); + Game.LogTrivial($"Accepted distance: {acceptedDistance}"); + return acceptedDistance; + } + private static bool VehicleAndDriverNullChecks(CollectedVehicle collectedVehicle) { if (collectedVehicle == null) @@ -120,51 +183,18 @@ namespace SceneManager { return; } - + var stoppingDistance = GetAcceptedStoppingDistance(currentWaypoint.Path.Waypoints, currentWaypoint.Path.Waypoints.IndexOf(currentWaypoint)); Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} stopping at waypoint."); - //collectedVehicle.Driver.Tasks.DriveToPosition(collectedVehicle.Vehicle.FrontPosition, 10f, (VehicleDrivingFlags)2147483648); // This causes FPS loss - Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, 3f, -1, true); + Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, stoppingDistance, -1, true); collectedVehicle.StoppedAtWaypoint = true; + collectedVehicle.Driver.Tasks.Clear(); - while (currentWaypoint != null && collectedVehicle.Vehicle && collectedVehicle.StoppedAtWaypoint) + + while (currentWaypoint != null && VehicleAndDriverNullChecks(collectedVehicle) && collectedVehicle.StoppedAtWaypoint) { GameFiber.Yield(); } - Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, 3f, 1, true); - } - - public static void DismissDriver(CollectedVehicle cv) - { - if (!cv.Vehicle) - { - Game.LogTrivial($"Vehicle is not valid after tasks completed."); - return; - } - if (!cv.Vehicle.Driver) - { - Game.LogTrivial($"Driver is not valid after tasks completed."); - return; - } - - cv.StoppedAtWaypoint = false; - if (cv.Vehicle && cv.Vehicle.Driver) - { - cv.Vehicle.Driver.Dismiss(); - cv.Vehicle.Driver.Tasks.Clear(); - cv.Vehicle.Driver.BlockPermanentEvents = false; - if (cv.Vehicle.Driver.GetAttachedBlip()) - { - cv.Vehicle.Driver.GetAttachedBlip().Delete(); - } - cv.Vehicle.Driver.IsPersistent = false; - - cv.Vehicle.Dismiss(); - cv.Vehicle.IsSirenOn = false; - cv.Vehicle.IsSirenSilent = true; - cv.Vehicle.IsPersistent = false; - - Game.LogTrivial($"{cv.Vehicle.Model.Name} dismissed successfully."); - } + Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, 1f, 1, true); } } } From acadfed51ef2be72073a091b304e322300487c00 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 13 Sep 2020 03:02:34 -0600 Subject: [PATCH 146/276] Removed reference to waypoint's DrawWaypointMarker method. --- SceneManager/DebugGraphics.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/SceneManager/DebugGraphics.cs b/SceneManager/DebugGraphics.cs index b2c6086..606f921 100644 --- a/SceneManager/DebugGraphics.cs +++ b/SceneManager/DebugGraphics.cs @@ -15,8 +15,6 @@ namespace SceneManager { for (int i = 0; i < path.Waypoints.Count; i++) { - path.Waypoints[i].DrawWaypointMarker(); - if (i != path.Waypoints.Count - 1) { DrawLinesBetweenWaypoints(path, i); @@ -28,6 +26,7 @@ namespace SceneManager }); } + // Can this be extracted to the Waypoint or Path object private static void DrawLinesBetweenWaypoints(Path path, int i) { if (path.Waypoints[i + 1].DrivingFlag == VehicleDrivingFlags.StopAtDestination) From 1a52badd04333ff62d90034fdbe149b02904e282 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 13 Sep 2020 03:03:02 -0600 Subject: [PATCH 147/276] Updated control hints to no longer specify "while on foot" --- SceneManager/EntryPoint.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/SceneManager/EntryPoint.cs b/SceneManager/EntryPoint.cs index 82d0bce..a75af57 100644 --- a/SceneManager/EntryPoint.cs +++ b/SceneManager/EntryPoint.cs @@ -35,19 +35,19 @@ namespace SceneManager { if (Settings.ModifierKey == Keys.None && Settings.ModifierButton == ControllerButtons.None) { - Hints.Display($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press the ~b~{Settings.ToggleKey} key ~w~or ~b~{Settings.ToggleButton} button ~w~while on foot"); + Hints.Display($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press the ~b~{Settings.ToggleKey} key ~w~or ~b~{Settings.ToggleButton} button"); } else if (Settings.ModifierKey == Keys.None) { - Hints.Display($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press the ~b~{Settings.ToggleKey} key ~w~or ~b~{Settings.ModifierButton} ~w~+ ~b~{Settings.ToggleButton} buttons ~w~while on foot"); + Hints.Display($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press the ~b~{Settings.ToggleKey} key ~w~or ~b~{Settings.ModifierButton} ~w~+ ~b~{Settings.ToggleButton} buttons"); } else if (Settings.ModifierButton == ControllerButtons.None) { - Hints.Display($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press ~b~{Settings.ModifierKey} ~w~+ ~b~{Settings.ToggleKey} ~w~or the ~b~{Settings.ToggleButton} button ~w~while on foot"); + Hints.Display($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press ~b~{Settings.ModifierKey} ~w~+ ~b~{Settings.ToggleKey} ~w~or the ~b~{Settings.ToggleButton} button"); } else { - Hints.Display($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press the ~b~{Settings.ModifierKey} ~w~+ ~b~{Settings.ToggleKey} keys ~w~or ~b~{Settings.ModifierButton} ~w~+ ~b~{Settings.ToggleButton} buttons ~w~while on foot"); + Hints.Display($"~o~Scene Manager\n~y~[Hint]~w~ To open the menu, press the ~b~{Settings.ModifierKey} ~w~+ ~b~{Settings.ToggleKey} keys ~w~or ~b~{Settings.ModifierButton} ~w~+ ~b~{Settings.ToggleButton} buttons"); } } @@ -56,7 +56,7 @@ namespace SceneManager // Clean up paths for (int i = 0; i < PathMainMenu.GetPaths().Count; i++) { - PathMainMenu.DeletePath(PathMainMenu.GetPaths()[i], i, PathMainMenu.Delete.All); + PathMainMenu.DeletePath(PathMainMenu.GetPaths()[i], PathMainMenu.Delete.All); } // Clean up cones From 354fb88b5218d92cd006d23b2dde1725b0f626d3 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 13 Sep 2020 03:04:14 -0600 Subject: [PATCH 148/276] Refactored GetNearbyVehiclesForCollection LINQ conditions --- SceneManager/VehicleCollector.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index 54e6869..051ef3c 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Drawing; using System.Linq; using Rage; @@ -29,7 +30,7 @@ namespace SceneManager foreach (Vehicle vehicle in GetNearbyVehiclesForCollection(waypoint.Position, waypoint.CollectorRadius)) { if (!vehicle) - { + { break; } @@ -60,12 +61,12 @@ namespace SceneManager private static Vehicle[] GetNearbyVehiclesForCollection(Vector3 collectorWaypointPosition, float collectorRadius) { - return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorWaypointPosition) < collectorRadius && v.IsValidForCollection() select v).ToArray(); + return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorWaypointPosition) < collectorRadius && Math.Abs(collectorWaypointPosition.Z - v.Position.Z) < 3 && v.IsValidForCollection() select v).ToArray(); } private static CollectedVehicle AddVehicleToCollection(Path path, Waypoint waypoint, Vehicle v) { - var collectedVehicle = new CollectedVehicle(v, path, path.Waypoints.Count, waypoint.Number, false); + var collectedVehicle = new CollectedVehicle(v, path, waypoint, false); collectedVehicles.Add(collectedVehicle); Game.LogTrivial($"[WaypointVehicleCollector] Added {v.Model.Name} to collection from path {path.Number}, waypoint {waypoint.Number}."); return collectedVehicle; From 3a84b8778f48e635b3900347f7aeb52b4062aeca Mon Sep 17 00:00:00 2001 From: Rich <23438379+Rich-Dunne@users.noreply.github.com> Date: Sun, 13 Sep 2020 03:13:57 -0600 Subject: [PATCH 149/276] Update README.md --- README.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index da95713..b73c262 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## INSTALLATION Drag and drop the included GTA V folder into where your GTA V is installed. - +![] ## HOW-TO USE ### Creating Paths: 1. To create paths, open the Scene Manager menu by pressing Left Shift + T (default) while on foot. Select "Traffic Menu," then "Create New Path." @@ -21,11 +21,7 @@ Drag and drop the included GTA V folder into where your GTA V is installed. 3. For easier and more accurate cone placement, use the first persion view. 4. The AI will not drive around cones on their own. Place cones around your custom paths for maximum immersion. -## PATREON -If you enjoy my plugins and would like to help with the development of new plugins, please consider supporting me on Patreon. Patreon benefits include early access to plugin updates, being able to suggest and vote on new plugin ideas for me to create, early access to new plugins, and access to Patreon-exclusive plugins which will never be released publicly! -https://www.patreon.com/richdevs - ## CREDITS Author: Rich -Additional credit: OJdoesIt, Vincentsgm, EchoWolf, Factions, Sereous +Additional credit: PNWParks fan for code assistance and extensive testing, Sereous, OJdoesIt, Vincentsgm, EchoWolf, FactionsBrutus From 44d7c9efb4ffcd2f6314068f37d5f74677f5cbc8 Mon Sep 17 00:00:00 2001 From: Rich <23438379+Rich-Dunne@users.noreply.github.com> Date: Sun, 13 Sep 2020 03:14:48 -0600 Subject: [PATCH 150/276] Add files via upload --- install.mp4 | Bin 0 -> 730379 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 install.mp4 diff --git a/install.mp4 b/install.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..20ad114dcce5a33dd0674920c69482247e57bf54 GIT binary patch literal 730379 zcmZQzU{FXasVvAW&d+6FU}6B#nZ@}=iDk)#xdkSM3=G_wx%v5J3=9l8xn&tC3@Cv4 z1p|Zhe+EVd5JJc>BA8$n8s7mdh?8JqVBiWaDN4*{U|@(T$p+iWjHDWBn)H7pF$fbX z1K}{BIf{V+WH0kI1_q`JU==E1z%Z@2q!<<yBLhpuIhzIs1_p`Z5^%7B%mvx8o`C_Rj=`X~q!<+3AaM?; z3ndvC7z`O07(5vm7(l^X$-uxck%56>B?AL%Kr+Id6%h4ca~K&I*g+8pG8<&pVCOSI z{Xf{Qk2P+U@61(gF)>lqm0 zk{K8n&oVGDfXe8-3=9lP3=E7W3=9lQ7#J8fGcYhrXJBAB#K6F?n1O-e00RTVR0al? z1q=)f>lqlto-;5oyklUHn9IPx7{I`wD8azM*vP=3rNY3#xR-%}sfvMNWjq4|%W4J& z#t;SuCS?W&Mi&MKCT<1>MsWrP#tRG#j4TWcj7uT)mAME51A{vQ1JgqW28KKa28JCB z3=E*=0S=m3gn?m;90LPu1_J}*e+CAo`wR?>cNiF$jx#VY9%o=++Rebgc%OlRshfd; zF^PeJX%_ClbJ@m~l#S=av#U;u4po9!b-`tT53=B!7DJ7sbMpSMpmt;gQhN>$|@<9g5rX+$jgBu?{iDhY~7J5bodWHrD3=9k$X+^224BV2ta#IpP z4N4|X0R{#JV>VWOrXPs`e+nFnwi|hTUanaZ$3Bu|kHGxsicFxs|1bkwRKQ zv6YdDo{6D_LP469xw%44S&o&ZLXwrCLQ-LYm9av4eu0&di9%*d5r`_zNwzXnNX{*= zGEgW2F$)Wyi{!u2Wq8GJS39yvxcDs-E`vmOit7efW7%v+DiT^M3#G@H7+YX*pz{sl0LL!{FcB zJtxO_C?&6qwo_gZc02md|Gyhd3JQdo!yLtzG_$EETzJ;3@-IPRcmGX}*7s-a%3m-p zo>X*{Ltpp{;|{IkuO#-n_A)$8aWnZ_`(7uh=zQL;-uO3WcS~1`cnaFo-1=8`xKVXW zdO`Q^gI?Qa_Qs@t+xux^Pkd~cLxDhw2p7YT$u~YMl|MW|_TjUe3oZz}J{98_|J~%S z{`3D2js}QGwx;}&(`XEEUj6MNCiJ6G0+`}QKHUGk;h%o~=j-X2<1b?(fXAA+ZzJy9=Xz0O^< zw?1Ce(lFEZnAFuxMKbmIzq%xJA4VjZ&CGk{y{kzP3u3_@)|8E4hXmjx=U9$c1A1=GyFat=|6A-2LDGaVJi8+Ua+0J%ifi#X5Jla2@wq>y|(BpFpkA{eYR1 zYkC+b{FThTBPV3`?C$?hGliu-|1V$*6lqP2`q%p2!S$D#weoxQ{?h*6pR?LG1|5C! zO~N;A#=qP}zY3RI319i7^Y71Fr%She|97!egc;UdmbrE?-$JC-H#gzko|z|S{r~wP znN4u(t=pfQxV`hf-{C9Sa>ev}REn>$+-9-t|0W4x6=4F6sgkBMf3RGCdhwj|85OZ( zvBm$t`+3-=C>R|T$(e9|vV78_FH;5TCtrVYfgv?+VLSf;#%Xafu5sxn|1s~Mu_`M4 zbVfsI!R75d9PA=HpEN#rtZgZJqhR`vk~`;_wr%|{9~pF<>*0TsFFdzr-G7z1s$qSA zS@n+Jj91(D9q8V-^Z(w)jc1=ul>b}ewI${JIy*IchjZtDIe&2c`_)*z_WOOTsQ&+t zJ=zZ})MYo_Tk`+E0*~h7eGEnyiY|&l$w_R&S&r~bUJ{x1}B=~Me5bq)RWPVW!( z7wjLNVA|mPR>Y@@QF_YP<17w2?ul|XOn<*l{eLg{+#QR%tfxBfe=uBqe|}U0gTsvL zkB=lY8Q!06>G)@weHjB214Dq_zvLEM_L9>ldNwzob7@nXaBJ2d?aSr0@sC?o{tLnXTvI_;0OJR#fD&tH1kJr$N!^ zM(LGV(|#~;FfmIB+n?(cJ}SKW>MtiPrN!~QF)b=BQ7`!}zh>M2E_(g7!Yd3+j5Zm} zZ4Vd<5>pO5p0z}6QPQGs=C572<2~H=<_a<}GpP4oW1KqW51$^RcWq0{93R(LPwiG} zYP8r-dtLW|XOcsuQo^!>2FF%-`ByqGDQc5qb(4}myka_E+uM=@4r*~a(FL|ldBqct zo_+rL^8rSkhfSM9jS43|ENWirP${%(zfp==uOGL5eMI4AKFcJ#oonwm{{LV6p@3y2 z>yf`}g5Sz%h~)qLd)x4T+o}VMtP@w(@iVgW)*8Pze{<%1+UrM^n?HYGO4jG(v#~f- z%6CA?SbB-h)AWpQbJyPg|6;E7d7keJW#!{kBUba4vz6C9{?8kAfc1reOf+i)qk;~b zh~>0v;){JZN4=lXv%!Cg$?K&I3<(NMO$8emY$SUv&M9nqFzxK$&l){$2dY(^6l|Ge zG8{i#jJtBa|IiPH---YJEY*y8YGJ|9FsXGO+igA8lQI#u|NmboR=a)Wl9kCG=70Mc zRs_%ZXQqGQt(Ggdi@UrZ7suWI2iX6391omwM$(ae?~$poe^}n-w8~#{tYB$ik|=#3 z{Yb%2WkLP}sT|gr%Wv-={-@S?vD*H&j>)5B`7D8gzfb?RU2|1Yy^ zNnOIid%ab8Dy8Iv?LFwriWwHuk@t>m{;3e>M4C7`*@b{{!;6 z$M;_^@Y`LJk~sDMxA)6GR$o>7b^ZO^C-w&nvr;cHI2*_Ln%!f3nS8~_X0`vn|K^t` z9ga!7xGAUpH9br%%fBBvwnUs!~U=NGkc?V_R$aj|25x! z`RuRWx^?&evg~SM1#O*V=D{(sjCvmJ%{p}k@&{(rcVyhPq(-=mnuoWy>P1G4W_H`Xzzi=ChI z>Y^e04dGI^mujK)>wjBi{>-rY|8I(}+3ouOc{|)sTZHO=Y;9*aV3EZ#>3kKZcDv{P z`%DWSy~tYhnE$$83eSW$xxST_i<-msG5UL7jOFFsQ2W5G_0*S@QrkZ+;E#A&y0taM zJIwB|&ielr6I5)hUru=`@!9(O--g?a`neNotygJjSm@YV?_GMtNsw1G_CV_lwWW!x zj!bQ2JCge9?S$g{DF+Ov$r+R`la770Z~FiBFaH?)n)v@=!GDGmQa1%Q#oyXB=Yy0b zlS@o_(Ag)Rtx*D||Nohvh>TWrxBvU^^^B7}Z$3D<1=jyqJ;PFE4qM=q=Nq^+j3-{{ zaZ0gYz|1WvvBAFbyGNH1uab+){#PEFqGEn;f39G#5_-cLop@Nmi-oUCJHKxCmdF=5)$ehb?z`7_X9nFolV!)K`1j77>k~327duF-T6`$b|NrNYo8|KpS@+ldT-~;>`0cFv zJ^LrP9m}j>w%XDDP3Xa@1y@&}{QZ|X#$&Fo*iZk5?h~Vnzw*g=?y{`?{a}GiqtPS5 zCG+zblh3xP+|!Kj{QtK4Joi_@vj0EZ4{u8QyMBx9GRF3{r4tSm|Kh0APVl~R@cDx1 zLx9Qs_+y4Yg@ydMUQYo6?S(-2G|5t(GHkaphNfpKKaE+l z&lev3aAjq*LbRTns=L#j>wlxUs#5CT+b}I!uC}bW?f#}$ygw48MsA##yqzn)`lMPIh*7w%FFoKfdbK|96&KcK#1z&#%kIf7gP+nyBlEwQHiT zZ;$$#O*ST(2)We*nE$4bzWZ!?k=V{F* zR&DHf_5X_l&ei1x6QuLkuC#BDe`6=Z-1h1Ni>BnF!iNWIJo10;mPosx6L`L9cdqq} z9GiyL)lW8E&|D(Lzj@;PN=wNZMGUFm-tPZzIq{BD(E2|!-O@Zu+rGv8ZrXRT`0Gh4 zH-GkNe`F5Gh%qy)o+R=?wW?3S>HmMj^AnkaPd8rZwP5(FuKggTwfNodFUpG?J{Vru z%V7U{K?tV`8)L=UDN-|juwR=m+2n5XhH;zXn)~ig7McEga6#TscW)!B)r@uj%g-L0 zZ?vI(QrTD5{0Qy5YcKCsb4Wdt+oA1pvp3VKcBFAZ+&->61=RP0Y zyw>5x#)EmE{fxzOf3wc}yW;=+|y1QtC z)6J{S-98RCE$dn&j8#rJWqCeSo2l4u$`f|aTz1O4XFXE8COB+r<4R#{N=lQnVN+~h ze&O=rGhWL$BH8<11(kG*28aHC<)72k^X8DqMc=PQNr0Zhw9M=>-qJ z>K;WSh0PzDclhu5bJHU9f7*vPmJ9+nwX1x?8Fogqr!ud)5zn|TW!fbMUPran(@vjY z-n+zfM*oEAObx=pi_#d5tEA=CdI(fKXZUJRs_5EanfoNwtnT%Gf9{qy%LT&)CF>bx z|KX6oY4GWcYyJPfPJe#Qa273nd(26?ex2?$=wN;4OhO|@P2x&R_7o4!-Z3) z`L5m9-G0dB^v}x2-oG?dTQ({EJT35XR%Oe}n>?cDPybP@VNC2QnDTRiZb^o&%!8o$ zCqIX-nfYf^olkywx|f;p;t9`lMI_ibV%z-qJT62RbFTg%({)-q-2Pd?SJqDT$)D_a z3MZSGKZshS*zeEGJN-dl;3bX+?GZBreD~kY;cIyCykfDz#+!_ON3ImCk;po;swmaj zUcj|I-z}*Z;oH1o=pOaIw63V&xV zon|yKu|t1_lb(n8!{}rdr>xF|PX>Xt8~!@}yOF?SzU4rKWrd-h_S>r8n>{9#KQ;gI zu~bs__5VBDZadZ3MzbtCtH8FCb>&@2&ks&!#|5X{KRQ)w5_9qYmuyzs{x4YV{_@5y zp^24SOe8pt=DyqeEmn#{mCM1CB|@bCll3vbS-r`n!3#pKJ=m~BcA7BP8lHx(rRC|@ zIXa4h@@^|=KHG1>yL-d)iypcRM{GyO#lCD!XY_^vY(lKWdf{X6WjZB{{&pm zuG=G8(9&^W^?{B*me+WH-qaNT_dQbiD8t36GyBRL3U&I=rfq-xctXOr|5AGzJRY6O zv5lI%Zh=7bpIf`zm~A&d+`or!9pfuIx!sp9mG#Wx;ZnZ5|DChrQ63XJ=|wy24l?>T zt;tmP{e1cVk)E{12G;%cuRDzkSy2&0iO` z&rsB?{BFP?AhhVg`_lrumwo*%o0ai^TQ!1P#5qW5zj)2gj<@=);y#e$9xMs5VJlnN&dwUk2(w_%G%KR29T|6F3d{$SKG*;dqe+V+{_2|{dE;ll?}>~ z=hx+(;I%gm+`f{@eU$ETGWnNa&hB@4ehd%$i+yseKm8-*l}_;7SRj99 zjlvs#meT$cd$=wl3`3)B5d}GVa#p?|YKC2i1AGhnUC6n1=!#5uUkG(Z#RD)s51C;_-5Vty&W)w!PT$)Z?<|wSdn#e+BWBL3y%uNX=l0*?E9PmqlcB!u;TxIc z+}5`{*UNu@c_!w=1cApb;wv(HPFA{z>M&0Z@7vZ;WMt7Vwum>H@q7V;^Z8Zx184dl z{k&+Q@r1;s4@`43wEr>RPP(u#XwJ9R8j|JibQ^xBwp4IlH{ zKdvkPfB$5oP{77_`D~1Gf({A^Czc=a|9&C*dXal~PQeH3z_&B1?)`#wWP9ZFt@QhKs@E@b*Z-Tp&QZzu(Y(ETuKK9< zDJ)tlwv-_uD{l9{`dei;e-tg88o!s_{(pQ8Q%4_@e5iP-ueJUE1ZHFPtMB(5*siRg zWxX#Z?#fkP=}I+@(5yRqf0~!uoOM@Y{J-saL)ZbHRi%>yg=Gz|tA9v76mVVT!V>fI zynjCU+RT#S+wEAuki*Wv#Ky3|HzbkStnf}^-D~-8Zz34Ke__p;Jmbz($t=lbf8KHD zb~Bep}S5noAJQ| z)(97dbDUncCpMMFr#PQz=Q{ad;+ck>{RxlGzx>HI<6mC$pIXibiAwR&%Xuyfa^KzX z|AzLaUAgc7tbHc0zjDv_4ccG&f4r|Zc;CXt;<|m^sv}oy6MaPMg-q_8ldSD(DM^f~8`gU4y(A!@ z{MIhvjMCPJzIX31X;+%=uQ|~nF0yuF;PKvE{sa6$8Osj*YdQ8&zP7w&p?0_K#TizM zmp#kB!e}AIc4A)dPI0dO>n2;aJ>TRmdSKd~^>Jl!{KwNeX04pCUr2QK>V~5$3jVC< zj{3o0YyJP}H|a^MxQ>m zHcUAF^o0fMEupzSt#2Lg=zf=cD;)Fw@=CVGrYTG|X$!x7TEi}~^pElb+0@)FD??e4 z+0y4uT1@o`%vfN1C+R_)^K={gVtuZ~hd*|i*(cOyW^}Eoys_x^M6W%WmFJr6zE6~% z{{P{d+Dk_ZOMFy>m}lLWlViUmv{qS0$^U;q4f_X%$1C}hj{8({2>hKstK^ye|6dVB z`xzzDo;xsSF7xRrsQSqG+R$;$`+xP<_WxmKhA(Q;A{MUyYfj8fjzx~jdt`MxwQ2b%u+n*sli6`97_`jPRnZ4b^X?s)T zJNDcQ6ZYBuWL0~56rBYEE6?XoV_>kn1{B6w|uXJ#o4muFX|I_)&76B$xFdj z+ox=Sdh{vQwIb>Y|Ge{<;|%YAxX}EsdE#nW-QRrKlk4AeuVE@^UK{JFEx-K#+wZ-U;? zq_g&&=w1F)X~PMNeaqvLg%~5AXA8#PU!bw|eu{kkW68dmvu_+~;zzghg)^`*Zrwe4BFMm6bGo>NzX zm6E$$a);{vl`mvNJeexbPb@lcKV=Tnuai^%ncc5{bkk$$6Q?NxU(aMY-G9FN{=fb0 zc7Fx+{?zL&&=hcvvTVGc7UX-`@7TlYx}$&gwmrOXtoXd&p1V#9%^%;F+fl=>W8cV~ zC9(U>mWS8&atclq4bl#LctmK+5*h1ITh9Jeu9pw0S6`d^|0Sowr`z*yzr40^S6=ny z*4prLmAmJk-QRfpw|m_@u2&{+m(~Bh{$jDns!P}RpZ+}em|p$sZPWhTw`{72j%E<~zT6HZRS&&%Zq*sooAdW5zU#XL?8T9mn zZD)yIWImFka(YjG+GCqfN41LXd_Pyi;`{R3!=wK%Uh22dG-bHin*6PL)tQT@tjrE% zKH6sB*|I@OC&zuQANNR3s^VCRjS=J-~aLX*>|Qd z>>ISZe*M4v@bJ%+I>G1hHzr(LR~)(e1E2Qwmj0KUdM|vx+y3?+$ET7!(YI?qNG4>R zdM*F2>Ac<^`^T#S?%zs&wE9ovjk=J^l!*HBIj!p38^5v6UHhcZ{O5eOOYtumJ0fHs za@>-hc17-FuK;7L@W*wQJx6Z;f4GA~es!)`q>i$W9#cvoW7iGS7uJ!EA;p6qrV&`hDRs<{@>jgoqf4snS;*#7kL3w8oeei zdVOAir@S>O?%uWNTu!cHzKj3XS-jqII%~Vy2lp@kr02vf;&1m{Cfnd1ne(@5RvGIy zmnf-e<>#IFzU;{;pS<>#*3v)v`=#>3OGA1s}mXG#CuVd1}S*J~L1KX>2#o{bL_#ZG6OJHTzD zd}8TBan9Qu=cZly{JXdB|HYM?y#Igw;pF3%uPhbJe|l|XvRWAD?CQ^dcpQt$l?vsr zb+d2=UW%QQm*ytx5|PeqXk$bQx>L z?di9ZAKU*tcEkVS$q9`wXZuW;Vt?kM&*t*!Z+cFOH6O5g$0PJ|fnCr(Q?YG+2P1qQEzH3=_==te&-1 z=H8X`@WXHXZMT+l7}p(_x-dPs_m4sS=LUxMAA2Uuc0TSkvH$3UC5(JB`Db#{Pw~H2 zK2rScOHsGr$wZ&_lYiD67E&t|y0Y<9;d8MQPyc5oiK>|HXnyhZ-tGs_#qW78kKSzH z{MPN0ME-Xkd3Ra!z|KgO|37kAP{Ea6l1g}C4U zxc|R%yu9-5?MHp@H1zNOUsS=Gz4QT>ooM|IX`ZD=mu}a4&V79XgZA442SSx@U7X|o z?5#?R^u1Gj^J7CI4zOQm5He-FQuzGqmYEH*Yg7u~zx|<{E1~l)U`}5B{|xRI`VI^n z6$@qjZpEMDu(3aO;7Gz%!-ri7>;Hd{FlDoGT)+RVMr25y($%Mu`wl5oH2vLv%K6^= zyY`O%8$L31Ncb|Uecjca`{h9ImdVCN|2dOSwn&s(%?)ZxUo!R8_y3IBzN%^(+zj$m zc*Xy%&f|W#6o+GH*TIz?Z);2sd@F6uIx~06mJHFr&MAua-x{W0YhL|liHqFy6$>rH zH`EE%76)v|{(p!6c=>P519m#B0u!7RBSd0aMP4O|eo$Yy?y;h1Sm@T@-vuI_7Oq~R zc%k_Zhr{zCV@=sR{Dq%>`hMSkw0=T&U!#2IPnRu>GnOvaSP7D%$lZIG=2a3FR$a{ z8voXD9!gxs{ow$gGs7&Wf-~&~&_xJ2Fu`$Su zIrnkjKDNj68gnd|b9I+5=3x%-wY|Q`c>Y-jh7ywr)s=@97=)Q$Y3i7zet%z&yV_&h zUk-1lcC76S7Sa%HUL#)d_UYmzh-Qr6#nkj?t#RFIxR=>G##cW?_m7O~FXm0+zY87+JAyDe*geUi|V z2lJcx=eB(KH@7EY;yy3ygZYUvO*;%8`87Ncu;W=HdUCqA!{ntGUZ|e`Bl^MVRBOHa z`(GbFPX5dNUs>f#!Gb4>^IsTn*w^Qry}a-K|Gx)s8asY)nR5B-@`XE+h0Bkxe<8iE z=Rtz&QuV)!6gso|&(7cV`~ScDY#$eFRc-PTN_xc{P=405cL~FCw?>UlueXc}#Q}{1 z`_;Wdx__PQwd{DjV#&Pq6$>x>%P`d|Ffu6R#+}^w?^b&(+nc$md-DEXOmi}KVep&& ze`$m0ap{N8I`2FF&k#}wn#ho3@$UE@nNJf!FaO_Rzj$}WtXZ=Av(x@A&cAWu?E4${ z-`zj-;Xw+6?STxpr=BNSUURe@HmH=@@*sc1=064k_VqvhcJn1L-TJI@jM1QCf$s(m zuHCMcK5;A57PZXRfA+hM@n&`Xsfe8mT2dtY7<`Q6< ee_y8?C3NHcjF$O#7l;J+ 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%0A<`Z4?7 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

81R@GmcgQJDQLTY;m?fn(im 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 GF<|MRK;&(*@PCgtE6N$C?SgU(vz{EB|H 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%0DT8S&lTNI;Mvlp-2-eBsiP^i$h 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 z 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 ! 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


u6?1RQ{r-S~gRz-eHUGg5(JeyHj(Y!&usO)G zO4P`<@DDe3i-&i|D6D1 zk7?35_V=$COHF^&|F2+RVoC^ZU|ev?``clKY1^E1)9Tp-gt9D{m#7^nTx%Yh;p(JN z9<6i!T1|uc{_Hh^|JR>kWja;!V^vd;*Y)tppaVqqU;iKfxBlz@>!8{FL$YzdzPQKD zULPJ|SM}R{?;Qch@9S0l|6cdI93acUDk78S_^)HriWtvgW~r#CvNNM7DQp$vPfONC^6?D>pl(tUKYr;biO9@0m$G7mnWl zm>{;s`jJj~;EtE`&L5b-7Crs{9Nq+m1PLWs-_qF6huZ%zozUbix-ez^NAcSGUty=x ze80XAdK|`m&>-_a)uP>FpP<-|AZuP4V zqP1~(>)G$d{o12?^}*uxwN<~qUtd(UxAf(%FZS1$zP@N%1qy(Dd%wN{6* zFL=K`JZ{}y=Ie3I_x6L!F6P_o9a^tGsDAaqy!6%U3j%-RetlsL0Z)DlFfiI?rFJxk zFmUZZ%=)9fi-AdOf?_tmgDg*Jp2_cO& zT~0pVC%)OdmRTh}%VG8hcPTyX{Pq8@#eP4zf!Rm$&ykZ~=D*c^GMnwyQoH{<_%6&< z656K8^5Fc})-WaAqVxZseQPpmO`Q~_FJf@sG@<8S;Dt;6w^uvX9&gouzpe4xLf7)C zSHr(?I50SfF)%b7aA0I$IlwU8&!>Z-`t4;-9`@d{7%_gUIh%G&U`S!MPT#(QDOKjm zMNiw52F3=Jx^FWVA8@Wo?6$stCFQLkLwbAde{Mky-h%e;RSq7nU*-EA*l_8#tDI5J z%Lj8=d>&tOns;aJLZ(i)GWQv_I~yJz2@oDo zJZe}m<^GK&(;FBXIe#;(t^e9;kRr5X+k~h08$uVJjb8I>HN#cJ%a(BF_Q-^W?lR;%?t1dc3`e_b2cKx3|4=26 z^p=ZT`O0io#omYO%R71Jo}5{EXyVZ~4est5mRE|OR=?x8#8T?hbEa4}$A(=$h`Y-0 z_`ds}(wNyZ_8oCt7JXWQZF|rILCHz_Z0#JW8XV;ndjCCIc3tCSz5j3f*N!<{+6-si zwxvq)*D=g+JyaF!8MeXxaG2%df;DBTvv%<&ZJ1lSCHH@8gX8)oEd8~S5LtGMs3BXc>6($v3`9h&Y)ZuwuGXXeT<^_4=f z$@HHGm>A}23fj7OzcY1NFR|Ib|KI;Tl1bAac`sef)6&fqbKv~%N~ZHaj=1dk`^KE7 z<9x@VP4<7!8A>wV)RJp`Gwi4R_ct@SJ}z^QzsH>Xh*>_&`8WTTEW@;? zm$WBN`LzFm29xN1+3!ti$Ct4vE|m3T)sia>Fxs$!t97l|t8WZU3^w@@E~cz^F3T_V zzg%m*ZwEK`p^3hCyHvNo^)$SuJon=Cx@XO*&LX}st2qnUggEL|CQQlBxODG-<6@(G zKWDx?R$=>EX`8J{jOIc1N)NM`tL}ReCa-GBE40~{xKCj_hxNpVsg>H7Z!bXQ!^}{*YB%sjS{k4Gb|}c@UCX($>+g3| zJR=ntr>#6xUw@JL!~E!Xf4*OrTVM6JqU`tkeb~|ef69Bbr!_E6+`aYNYKF2~%uSDc z?i_6VcU-fMq3`>b)h`tPzmxxeyqRUO1&3@zal_Le0(X299Bkv7JAO@JkiFDkVWzoq z{sGZlO5baoHgSdMTzk*YQ78ORyM4)@>m4h!gw;Q@3-fC!{5=sUzxn=$&t}v2F^X=r z`lP>g=eEV0(yrWNS5D-f_dZ%~J45faKSImjO4dIxRG$zw^>*ENX4dRXb? zGmBl`=6L_GX7tS3*RQ8HuyD)@RY)@3{$}aP^|zS+{O4t=sCcum;q(E8q8<_L9&rJ4 z<2B6FE?8_oeRiV2X6En|hKB#mGi~EmOxnpfx97F z@)C;gw(mV4p?lHr(lXFppanS%44V#pi;jQbe|yUf37fSpE4&k9Z~c0#JF&!oK|rs2 z17rRFJq-d@JGgCUcJ7(2b*f2LL1ckPK}y`S#p~Zac%m(na(rd>k)8ZpItL!C3jOlI zp(p5Bx~=mWon~e&X>KKf?)+SzN?Oy-K^g+AM#J2N^HrbELefKgjG%z;ECTyQ> zmEo{qrr6yt4>cK2ZD+btFq=<+Q$X+uM^nF`;OY5$5;$C@uuC|nHHY2ww6eYNJB@*f z>i~m-ssbnT|34o(l3BL=yyJ9F?e!<72iZ4SeWr?v&WvMjVAL`QD0tOu6!3y?XY5T+ z(a+N~%BFa+X4kzkT~J@XC;auo+p3`ZQ4<&h3_5KXbnfpuR)2s&p@o67h@paG{`Nf% ziY%7W2OhcVZh6t)+RTz%AAYu=>shpRwax(shYJiWoXW0E|6f=3NUD_Bf01q}VTu36 z;oP%-Ly(KrPU-y%11_Gru5gh3CfC1z(*G1%f+ct#g?Trp6kE@~kf4yjpvKqCz!YNg zLUlfS%N&N)JF2w)U;8k{)q_>Z=$%kQk)rH1)x&4>_#Wg3Y9BxLWrC4m27?3RiBzTq zw^#Gl_U^mwz#zcDRuPlt)AT$fOt<`BPw3v`{0uvE=_#+-1Qw!exm;q_#vjGGdPb25&VTivgn^#4Kr@<06FuRa8wBK(0> z>Ii3pLFC-?f{cX=V^9Cs!r!mLpm6r@fnP`V&%e7_{zo?GxZV>C9Bg+QSX!Fq)g54P zU}0cka$s;^;azjD;;@DG<@Gj`&VQS>XYY)}oN1Hy|Eus@syJtXA;ZLq8A8?%9OQ%# zun2fM?-%n5S-i(hNpyZp= zd!}p9FqO}8_kH;v*~!(QQEK*<1`UQ}`|WQN7!+(6n3xMA7?>CsitjGw(cYqDKVzxo zs%!V01rGUqc=l(-SBov%rrI+wG8Q>72yieka;R4y&1Ya}GGGw+pYTA6Rlketk&Q&# zHSvFwxS2hQuSF_;_}R3i;Q)i5#T34qcTb6$_VYhtWk}om`NVFi>`$MbslR6wJ^Ulf z2)r?ag;U#|vGUFiRrbOrjc4l2X5U1OlkDYRPDrQ|49d{xDtkpWV$Li-5Ee@;P1=KwSAFoz0 zba=qMwI}@W{yEFH_r1UUKlc_7|2L-Hd)TIy&v1x1#JW=A@#|kRFX~P-u(R(e;F?zT z+u7~y!EfR2g>}EUYv;DD{IJ{Q@MdABnb(5o*)}dar}EP(nTq<_|2@&WW$qi;hTna?bxKuF(SpLbefQs`K4Y&v z&K`dCyZpw;UCH|4zj8#a|HtkMy#H&a;haS|R+n6|m;ZA3pFD5jeZ|^8^4veIWpfzK zR~Kfs$-njge8b^yG4qW0aN+9TFT_78ObJ|f>i1TedB6K}CAb>b^R@4_D}P<@xZ&Vw z^L_jKO6#A$3cYp3uRgJ*{Quwc4Z=LfwlS}9{j^lt%fR^(@8p!a;`{pRuQD#P+i%%_2xZ(W5SqA|fsrBXM+xIR`S%-g8+a^5b>6Cf zyAVCSkNeM+-4EVHv^}`b#kqW$$E)>!YrCx#*S(g#UsGNm?8UyW)#>uP(>H$`8(UQD zO#Gv@?$-PW4u{-arVXxoM{n0O!1;JN$XDg|gr|LJqm`nPXF@*%xx zu97?QR%zG9H)MVK9{%@0*6z3a+ghd+urEtckeRdQfkA!s19h3cm-@S=?|-#p*N%_1 z|3wr3v_@52-^BH#)Bb$&?;idq9h3OBWQG3s-J_My^D624gA6c;hKjqrpk<|@?YSd^j}xc_WiE+`FWem&i_C6<)Yk~i!*!U{EuI1KWEmL;j?|VaoVvPPj%xT z?Y+b4UsILOthz>H+v_FH64?N2H`?9}al zkT<(g$x5NE8#Y-k628pxAV4+il#Ir-z4ML=^e9W@%~`}; zwxigf$K(bVLzQfzgrvlXF0qYbs?WL-ob(hH z^Blai)#U18AG3oIx%t+A*w@K3-)YB?S8tgepY%v!@0bZ%;u~A?_uNR3z(

1^Xs2JPWIiyz|f$e=uq)0RJ$f- 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

Ju@buTAPuxy%TILRSm(LIN+0gMib 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%0A-+TY>FJs%2pyh1W7?Rn|e5HPZ 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�NQKM`d)c#P+V^!e}q+usH9Fcd9Wb35L~ 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

A-RVUX05xhXg6cU6Ok$YT=+jn52hM+HLG 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 MNPu&24_tr)051b{3jhEB literal 0 HcmV?d00001 From b370788a0f117f571a9ebd687a1fec333ad1d7f0 Mon Sep 17 00:00:00 2001 From: Rich <23438379+Rich-Dunne@users.noreply.github.com> Date: Sun, 13 Sep 2020 03:15:17 -0600 Subject: [PATCH 151/276] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b73c262..a0cfb45 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## INSTALLATION Drag and drop the included GTA V folder into where your GTA V is installed. -![] +![How to install](install.mp4) ## HOW-TO USE ### Creating Paths: 1. To create paths, open the Scene Manager menu by pressing Left Shift + T (default) while on foot. Select "Traffic Menu," then "Create New Path." From e87b7985649bb6a5654dd8058238df85c8b9b79b Mon Sep 17 00:00:00 2001 From: Rich <23438379+Rich-Dunne@users.noreply.github.com> Date: Sun, 13 Sep 2020 03:18:57 -0600 Subject: [PATCH 152/276] Delete install.mp4 --- install.mp4 | Bin 730379 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 install.mp4 diff --git a/install.mp4 b/install.mp4 deleted file mode 100644 index 20ad114dcce5a33dd0674920c69482247e57bf54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 730379 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 ee_y8?C3NHcjF$O#7l;J+ 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%0A<`Z4?7 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

81R@GmcgQJDQLTY;m?fn(im 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 GF<|MRK;&(*@PCgtE6N$C?SgU(vz{EB|H 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%0DT8S&lTNI;Mvlp-2-eBsiP^i$h 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 z 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 ! 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


u6?1RQ{r-S~gRz-eHUGg5(JeyHj(Y!&usO)G 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

1^Xs2JPWIiyz|f$e=uq)0RJ$f- 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

Ju@buTAPuxy%TILRSm(LIN+0gMib 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%0A-+TY>FJs%2pyh1W7?Rn|e5HPZ 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�NQKM`d)c#P+V^!e}q+usH9Fcd9Wb35L~ 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

A-RVUX05xhXg6cU6Ok$YT=+jn52hM+HLG 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 MNPu&24_tr)051b{3jhEB From 39656c8ec6811dee03814e87285a9d9d2ac23934 Mon Sep 17 00:00:00 2001 From: Rich <23438379+Rich-Dunne@users.noreply.github.com> Date: Sun, 13 Sep 2020 03:20:07 -0600 Subject: [PATCH 153/276] Add files via upload --- install.gif | Bin 0 -> 167847 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 install.gif diff --git a/install.gif b/install.gif new file mode 100644 index 0000000000000000000000000000000000000000..c84c6acf3be11bfb580a3aba6a68e2b27c8aa154 GIT binary patch literal 167847 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ү|*HwC*pN$E+T4n0wLss2!&synH8i=<3nzLf20+ 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 Date: Sun, 13 Sep 2020 03:20:21 -0600 Subject: [PATCH 154/276] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a0cfb45..1b1f33b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## INSTALLATION Drag and drop the included GTA V folder into where your GTA V is installed. -![How to install](install.mp4) +![How to install](install.gif) ## HOW-TO USE ### Creating Paths: 1. To create paths, open the Scene Manager menu by pressing Left Shift + T (default) while on foot. Select "Traffic Menu," then "Create New Path." From 1e29ad341b6809f118305172acc296b72f29d7c0 Mon Sep 17 00:00:00 2001 From: Rich <23438379+Rich-Dunne@users.noreply.github.com> Date: Sun, 13 Sep 2020 04:29:25 -0600 Subject: [PATCH 155/276] Update README.md --- README.md | 44 +++++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 1b1f33b..b38e698 100644 --- a/README.md +++ b/README.md @@ -2,25 +2,43 @@ ## INSTALLATION Drag and drop the included GTA V folder into where your GTA V is installed. -![How to install](install.gif) +![How to install Scene Manager](install.gif) ## HOW-TO USE +### Using the Menus: +Menu options with gold colored text are selectable, which means when you select these menu items, something will happen (opening a new menu, adding a waypoint, placing a barrier, etc). Menu options with white colored text are interactable (can be scrolled through, for example), but nothing will happen if you try to select them. + ### Creating Paths: -1. To create paths, open the Scene Manager menu by pressing Left Shift + T (default) while on foot. Select "Traffic Menu," then "Create New Path." -2. In the Path Creation menu, you can choose different waypoint types and speeds, as well as add and remove waypoints. The settings for each waypoint are how the AI will drive to THAT waypoint from the PREVIOUS waypoint. +1. To create paths, open the Scene Manager menu by pressing Left Shift + T (default). Select "Path Menu," then "Create New Path." +2. In the Path Creation menu, you can specify different waypoint options, as well as add and remove waypoints. The settings for each waypoint are how the AI will drive to **that** waypoint from the **previous** waypoint. 3. Adding a waypoint will create a waypoint at your player's position. -4. As you add and remove waypoints, blips will appear and disappear from the game map. Blips are numbered to correspond with their path. Blips are also colored to designate the following: Orange blips are the beginning of a path, red blips are the end of a path, and yellow blips are waypoints between the first and last waypoint. +4. As you add and remove waypoints, blips and world markers will appear and disappear if enabled in your settings. Blips are numbered to correspond with their path. Blips and markers are also colored to designate the following: Blue are collector waypoints, green are Drive-To waypoints, and red are Stop waypoints. 5. The path will activate once you select "End path creation," and cars will automatically follow the path when they are close to the first waypoint. -6. After creating paths, you can delete them via the Traffic Menu. -7. There is a "Direct nearest driver to path" option in the Traffic Menu which allows you to manually direct the nearest vehicle to a path of your choice. This option can be buggy when you are on-duty, as LSPDFR interferes. Directing a driver works better the closer you are to desired path. -8. The "Dismiss nearest driver" option in the Traffic Menu allows you to dismiss vehicles at "Stop" waypoints. This option can also be used to try and get vehicles unstuck from precarious situations. -9. Paths and cones will remain in the world after you die. Be sure to delete them when you're done! +6. After creating paths, you can delete them via the Path Menu. +![How to create a path](creatingPath.gif) -### Cones Management: -1. To place cones, open the Scene Manager menu by pressing T (default). -2. In the Cone Menu, you may scroll through different types of road cones, as well as place and remove cones. -3. For easier and more accurate cone placement, use the first persion view. -4. The AI will not drive around cones on their own. Place cones around your custom paths for maximum immersion. +### Other Path Menu Options +1. The "Direct nearest driver to path" option in the Path Manager Main Menu allows you to manually direct the nearest vehicle to a path of your choice. You may either direct a driver to the nearest path's first waypoint or the nearest waypoint in front of the driver. +![Directing drivers](directDriver.gif) +2. The "Dismiss nearest driver" option in the Path Manager Main Menu allows you to dismiss vehicles from their path, their current waypoint, or from their current position. Dismissing from a path will clear all driver tasks and they will no longer be controlled by Scene Manager. Dismissing from their current waypoint will either give the driver their next waypoint task, or dismiss them from the path if they were already going to the path's final waypoint. Dismissing from current position should be used for vehicles which might be stuck, but are not controlled by Scene Manager +![Dismissing drivers](dismissDriver.gif) + +### Editing Paths and Waypoints +1. In the Edit Path menu, you can disable and delete individual paths. When a path is disabled, it will not collect any new vehicles at collector waypoints. However, vehicles can still be manually directed to disabled paths. +2. In the Edit Waypoint menu, you can change the settings of each path's individual waypoints. +3. You can add new waypoints to the end of the path by selecting the Add as New Waypoint option in the Edit Waypoint menu. It is recommended to have the Update Waypoint Position option checked as you do this since it will create a 3D marker (if enabled in the settings) around your player so you can see the waypoint's settings as you change them. + +### Barrier Management +1. To place barriers, open the Scene Manager menu by pressing Left Shift + T (default). +2. In the Barrier Menu, you may scroll through different types of road barriers, as well as place and remove barriers. +3. The AI will not drive around barriers on their own. Barrier placement should be in conjunction with your paths. +![Barrier management](barrierManagement.gif) + +### Other Notes +1. Paths and barriers will remain in the world after you die. Be sure to delete them when you're done! +2. The first waypoint of a path must be a collector waypoint. If you edit the only waypoint of a path to not be a collector, it will automatically be turned into a collector. +3. Some settings in Scene Manager's .ini file can be updated in-game using the Settings menu. Saving these settings in-game will update the .ini so you don't have to change the settings every time you load the plugin. +4. You can add custom barrier objects to the barrier menu by adding them to the Barriers section of the .ini file. A link is provided in the .ini file to find object model names. ## CREDITS Author: Rich From 19dd7717c6c46eb12a937b7146b5e0764d6d694f Mon Sep 17 00:00:00 2001 From: Rich <23438379+Rich-Dunne@users.noreply.github.com> Date: Sun, 13 Sep 2020 04:37:34 -0600 Subject: [PATCH 156/276] Update README.md --- README.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index b38e698..5a24a60 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Scene Manager ## INSTALLATION -Drag and drop the included GTA V folder into where your GTA V is installed. -![How to install Scene Manager](install.gif) +Drag and drop the included GTA V folder into where your GTA V is installed. Everything is installed into the plugins folder. + ## HOW-TO USE ### Using the Menus: Menu options with gold colored text are selectable, which means when you select these menu items, something will happen (opening a new menu, adding a waypoint, placing a barrier, etc). Menu options with white colored text are interactable (can be scrolled through, for example), but nothing will happen if you try to select them. @@ -14,14 +14,11 @@ Menu options with gold colored text are selectable, which means when you select 4. As you add and remove waypoints, blips and world markers will appear and disappear if enabled in your settings. Blips are numbered to correspond with their path. Blips and markers are also colored to designate the following: Blue are collector waypoints, green are Drive-To waypoints, and red are Stop waypoints. 5. The path will activate once you select "End path creation," and cars will automatically follow the path when they are close to the first waypoint. 6. After creating paths, you can delete them via the Path Menu. -![How to create a path](creatingPath.gif) ### Other Path Menu Options 1. The "Direct nearest driver to path" option in the Path Manager Main Menu allows you to manually direct the nearest vehicle to a path of your choice. You may either direct a driver to the nearest path's first waypoint or the nearest waypoint in front of the driver. -![Directing drivers](directDriver.gif) 2. The "Dismiss nearest driver" option in the Path Manager Main Menu allows you to dismiss vehicles from their path, their current waypoint, or from their current position. Dismissing from a path will clear all driver tasks and they will no longer be controlled by Scene Manager. Dismissing from their current waypoint will either give the driver their next waypoint task, or dismiss them from the path if they were already going to the path's final waypoint. Dismissing from current position should be used for vehicles which might be stuck, but are not controlled by Scene Manager -![Dismissing drivers](dismissDriver.gif) ### Editing Paths and Waypoints 1. In the Edit Path menu, you can disable and delete individual paths. When a path is disabled, it will not collect any new vehicles at collector waypoints. However, vehicles can still be manually directed to disabled paths. @@ -32,7 +29,6 @@ Menu options with gold colored text are selectable, which means when you select 1. To place barriers, open the Scene Manager menu by pressing Left Shift + T (default). 2. In the Barrier Menu, you may scroll through different types of road barriers, as well as place and remove barriers. 3. The AI will not drive around barriers on their own. Barrier placement should be in conjunction with your paths. -![Barrier management](barrierManagement.gif) ### Other Notes 1. Paths and barriers will remain in the world after you die. Be sure to delete them when you're done! @@ -41,5 +37,5 @@ Menu options with gold colored text are selectable, which means when you select 4. You can add custom barrier objects to the barrier menu by adding them to the Barriers section of the .ini file. A link is provided in the .ini file to find object model names. ## CREDITS -Author: Rich +Author: Rich\n Additional credit: PNWParks fan for code assistance and extensive testing, Sereous, OJdoesIt, Vincentsgm, EchoWolf, FactionsBrutus From b2d767bb26f2053305b5d1cd2584ad0947972adc Mon Sep 17 00:00:00 2001 From: Rich <23438379+Rich-Dunne@users.noreply.github.com> Date: Sun, 13 Sep 2020 04:38:30 -0600 Subject: [PATCH 157/276] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5a24a60..39488cd 100644 --- a/README.md +++ b/README.md @@ -37,5 +37,5 @@ Menu options with gold colored text are selectable, which means when you select 4. You can add custom barrier objects to the barrier menu by adding them to the Barriers section of the .ini file. A link is provided in the .ini file to find object model names. ## CREDITS -Author: Rich\n -Additional credit: PNWParks fan for code assistance and extensive testing, Sereous, OJdoesIt, Vincentsgm, EchoWolf, FactionsBrutus +*Author: Rich +*Additional credit: PNWParks fan for code assistance and extensive testing, Sereous, OJdoesIt, Vincentsgm, EchoWolf, FactionsBrutus From 7982edfb94332f1519b7529e8c3dca9227a5dd05 Mon Sep 17 00:00:00 2001 From: Rich <23438379+Rich-Dunne@users.noreply.github.com> Date: Sun, 13 Sep 2020 04:38:53 -0600 Subject: [PATCH 158/276] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 39488cd..8c920a1 100644 --- a/README.md +++ b/README.md @@ -37,5 +37,5 @@ Menu options with gold colored text are selectable, which means when you select 4. You can add custom barrier objects to the barrier menu by adding them to the Barriers section of the .ini file. A link is provided in the .ini file to find object model names. ## CREDITS -*Author: Rich -*Additional credit: PNWParks fan for code assistance and extensive testing, Sereous, OJdoesIt, Vincentsgm, EchoWolf, FactionsBrutus +* Author: Rich +* Additional credit: PNWParks fan for code assistance and extensive testing, Sereous, OJdoesIt, Vincentsgm, EchoWolf, FactionsBrutus From 9471c07cbf2559fc4f8b5c2f30c5391e47d21f1a Mon Sep 17 00:00:00 2001 From: Rich <23438379+Rich-Dunne@users.noreply.github.com> Date: Sun, 13 Sep 2020 04:39:12 -0600 Subject: [PATCH 159/276] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8c920a1..c93e0ee 100644 --- a/README.md +++ b/README.md @@ -38,4 +38,4 @@ Menu options with gold colored text are selectable, which means when you select ## CREDITS * Author: Rich -* Additional credit: PNWParks fan for code assistance and extensive testing, Sereous, OJdoesIt, Vincentsgm, EchoWolf, FactionsBrutus +* Additional credit: PNWParksFan for code assistance and extensive testing, Sereous, OJdoesIt, Vincentsgm, EchoWolf, FactionsBrutus From d6fd840333f1b7c3f804ad610e968707e65835c3 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 13 Sep 2020 04:49:04 -0600 Subject: [PATCH 160/276] Adjusted menu descriptions and colors --- SceneManager/Menus/MainMenu.cs | 12 ++++++++---- SceneManager/Menus/PathCreationMenu.cs | 4 +++- SceneManager/Menus/PathMainMenu.cs | 2 +- SceneManager/Menus/SettingsMenu.cs | 2 +- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/SceneManager/Menus/MainMenu.cs b/SceneManager/Menus/MainMenu.cs index adf52da..f06163b 100644 --- a/SceneManager/Menus/MainMenu.cs +++ b/SceneManager/Menus/MainMenu.cs @@ -1,5 +1,6 @@ using RAGENativeUI; using RAGENativeUI.Elements; +using System.Drawing; namespace SceneManager { @@ -10,17 +11,20 @@ namespace SceneManager internal static void InstantiateMenu() { - mainMenu = new UIMenu("Scene Manager", ""); + mainMenu = new UIMenu("Scene Manager", "~o~Main Menu"); MenuManager.menuPool.Add(mainMenu); } public static void BuildMainMenu() { - mainMenu.AddItem(navigateToPathMenu = new UIMenuItem("~o~Path Menu")); + mainMenu.AddItem(navigateToPathMenu = new UIMenuItem("Path Menu")); + navigateToPathMenu.ForeColor = Color.Gold; mainMenu.BindMenuToItem(PathMainMenu.pathMainMenu, navigateToPathMenu); - mainMenu.AddItem(navigateToBarrierMenu = new UIMenuItem("~o~Barrier Menu")); + mainMenu.AddItem(navigateToBarrierMenu = new UIMenuItem("Barrier Menu")); + navigateToBarrierMenu.ForeColor = Color.Gold; mainMenu.BindMenuToItem(BarrierMenu.barrierMenu, navigateToBarrierMenu); - mainMenu.AddItem(navigateToSettingsMenu = new UIMenuItem("~o~Settings")); + mainMenu.AddItem(navigateToSettingsMenu = new UIMenuItem("Settings")); + navigateToSettingsMenu.ForeColor = Color.Gold; mainMenu.BindMenuToItem(SettingsMenu.settingsMenu, navigateToSettingsMenu); mainMenu.RefreshIndex(); diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index a3a0676..de748c8 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -23,7 +23,7 @@ namespace SceneManager internal static void InstantiateMenu() { - pathCreationMenu = new UIMenu("Scene Menu", "~o~Path Creation"); + pathCreationMenu = new UIMenu("Scene Manager", "~o~Path Creation Menu"); pathCreationMenu.ParentMenu = PathMainMenu.pathMainMenu; MenuManager.menuPool.Add(pathCreationMenu); } @@ -128,6 +128,8 @@ namespace SceneManager { collectorWaypoint.Checked = true; collectorWaypoint.Enabled = false; + speedZoneRadius.Enabled = true; + collectorRadius.Enabled = true; trafficRemoveWaypoint.Enabled = false; trafficEndPath.Enabled = false; } diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index 0567fb2..18d13b4 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -30,7 +30,7 @@ namespace SceneManager internal static void InstantiateMenu() { - pathMainMenu = new UIMenu("Scene Menu", "~o~Path Manager Main Menu"); + pathMainMenu = new UIMenu("Scene Manager", "~o~Path Manager Main Menu"); pathMainMenu.ParentMenu = MainMenu.mainMenu; MenuManager.menuPool.Add(pathMainMenu); } diff --git a/SceneManager/Menus/SettingsMenu.cs b/SceneManager/Menus/SettingsMenu.cs index 0e0ba34..27f9e61 100644 --- a/SceneManager/Menus/SettingsMenu.cs +++ b/SceneManager/Menus/SettingsMenu.cs @@ -18,7 +18,7 @@ namespace SceneManager internal static void InstantiateMenu() { - settingsMenu = new UIMenu("Scene Menu", "~o~Plugin Settings"); + settingsMenu = new UIMenu("Scene Manager", "~o~Plugin Settings"); settingsMenu.ParentMenu = MainMenu.mainMenu; MenuManager.menuPool.Add(settingsMenu); } From 8c3752a4832b9467f7ca98f5996f9b4fc8c35dca Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 13 Sep 2020 04:49:52 -0600 Subject: [PATCH 161/276] Adjusted distance check to nearest waypoint when dismissed. --- SceneManager/Object Classes/CollectedVehicle.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index ebcab5b..cd8b0c9 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -60,6 +60,7 @@ namespace SceneManager _stoppedAtWaypoint = false; _driver.Tasks.Clear(); + _driver.Tasks.PerformDrivingManeuver(_vehicle, VehicleManeuver.GoForwardWithCustomSteeringAngle, 3); if (_driver.GetAttachedBlip()) { @@ -70,7 +71,7 @@ namespace SceneManager var nearestCollectorWaypoint = _path.Waypoints.Where(wp => wp.IsCollector && _vehicle.DistanceTo2D(wp.Position) <= wp.CollectorRadius * 2).FirstOrDefault(); if (nearestCollectorWaypoint != null) { - while (nearestCollectorWaypoint != null && _vehicle && _driver && _vehicle.DistanceTo2D(nearestCollectorWaypoint.Position) <= nearestCollectorWaypoint.CollectorRadius * 2.5) + while (nearestCollectorWaypoint != null && _vehicle && _driver && _vehicle.DistanceTo2D(nearestCollectorWaypoint.Position) <= nearestCollectorWaypoint.CollectorRadius * 2) { //Game.LogTrivial($"{_vehicle.Model.Name} is too close to the collector to be fully dismissed."); GameFiber.Yield(); From e58dc71113f99b09b05b7ad9c36a02824305fc43 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 13 Sep 2020 04:50:35 -0600 Subject: [PATCH 162/276] Adjusted distance check of vehicle to waypoint position relative to waypoint's collector radius --- SceneManager/AITasking.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 40dd4e2..6fab725 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -17,7 +17,7 @@ namespace SceneManager { float acceptedDistance = GetAcceptedStoppingDistance(waypoints, waypoints.IndexOf(currentWaypoint)); Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} distance to collection waypoint: {collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position)}"); - if(collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position) > (currentWaypoint.CollectorRadius)) + if(collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position) > (currentWaypoint.CollectorRadius + 0.5)) { Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} is driving to waypoint {currentWaypoint.Number}"); collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)263075, acceptedDistance); From 19409be1d98507e2f5b01c763f359ab9a25c8cc7 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 13 Sep 2020 04:50:51 -0600 Subject: [PATCH 163/276] Disabled test version message --- SceneManager/GetUserInput.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SceneManager/GetUserInput.cs b/SceneManager/GetUserInput.cs index a8a7d20..9c57295 100644 --- a/SceneManager/GetUserInput.cs +++ b/SceneManager/GetUserInput.cs @@ -15,10 +15,10 @@ namespace SceneManager GetControllerInput(); // Display this message for test versions only - if (MainMenu.mainMenu.Visible) - { - Game.DisplaySubtitle($"You are using a test build of Scene Manager. Please report any bugs/crashes in the Discord server."); - } + //if (MainMenu.mainMenu.Visible) + //{ + // Game.DisplaySubtitle($"You are using a test build of Scene Manager. Please report any bugs/crashes in the Discord server."); + //} MenuManager.menuPool.ProcessMenus(); GameFiber.Yield(); From 66fe80380cc374ceabb267fb81a1187841dfa814 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 13 Sep 2020 04:51:56 -0600 Subject: [PATCH 164/276] Adjusted vehicle collection LINQ argument from distance to collector waypoint < radius to <= radius. --- SceneManager/VehicleCollector.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index 051ef3c..ad1ac80 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -61,7 +61,7 @@ namespace SceneManager private static Vehicle[] GetNearbyVehiclesForCollection(Vector3 collectorWaypointPosition, float collectorRadius) { - return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorWaypointPosition) < collectorRadius && Math.Abs(collectorWaypointPosition.Z - v.Position.Z) < 3 && v.IsValidForCollection() select v).ToArray(); + return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorWaypointPosition) <= collectorRadius && Math.Abs(collectorWaypointPosition.Z - v.Position.Z) < 3 && v.IsValidForCollection() select v).ToArray(); } private static CollectedVehicle AddVehicleToCollection(Path path, Waypoint waypoint, Vehicle v) From 47653dfc47fca2b0320e56bdce3aa8f5bb8bd618 Mon Sep 17 00:00:00 2001 From: Rich <23438379+Rich-Dunne@users.noreply.github.com> Date: Sun, 13 Sep 2020 05:02:44 -0600 Subject: [PATCH 165/276] Delete install.gif --- install.gif | Bin 167847 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 install.gif diff --git a/install.gif b/install.gif deleted file mode 100644 index c84c6acf3be11bfb580a3aba6a68e2b27c8aa154..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167847 zcmZ?wbhEHb%wn-(u3%tL{Lk&@8WQa67~pE8XTZ$Jz`&sRlZAzyfq_AXfq{Vmq-^=W zKQF)h{rLFz?^}QWJ^lUf)8Bu8{~^HNzkmPy{rl(7pWnZK|N8ao$IqWXe*E|j2H(DY z|Mul&J{t5cyaR2`O2M-@Ue)9C$vuDp=zIycP{iRo5Prdwp z?A6cR&;M?H{%_NhKXWesoO|x$s;lpIoO^Wa>hr6&9^Srv`{vD?H*Vax4gy!MUq5m6 z#)T_au3Wry>HLKYXU?5JbN1}%)2C0IIC=c|@q>r=?l^pI>;99QckSJ{fB~@i%QDGqw zA!H;dA|wbA5f&0eLPEkqf3}%420zv`^Bq$&tD8Mhsk3a(ad;)w3#Lp|j z$7{;Pna9f7&BWBp$k@TiSkJ;#z`&5nz>vbg5Y52g!oa`}ihBfR=4auv6cqLplMa=X z&6bd_msjXfQ<`R!9z)bwvIs@{-WvNoq;X+`t&##gW zSa7hJLs%>3#D;~3+Xa-p=6GyebhKN-IP1=djf;=>D>!$_cy3y9aPY3826u@ZBhK{&dJTo&(C*g=3>3IX~o6G9+S0VPi&ocWe$ux#hdn+u*L(ZAySpnszq)&R`+BD}Q9Cb*xNO_- z@Nmax36^rcImtQClx81(wqw)%(=&{-@15DX`T6+;rp)(lO)YqIc}4JZ6Nz^*JFZVq zO|JH}-tzYLj^fw%&hFm+enms_v@qX2I})$0OZ1-S^ZV=j=NA@x&-dHAE5GW-=4^G( z{FZ})UsV1b+sG1Jpm_P%<<j=DNLf0%UTwcDzs@l>QGrHa?eq{i)CIp^I8qL z%0s-{?)8|g3k$Hbc(%Ds_)(8>pM~$5iOF`XGe0cgl#OCpAR@~Yq2S5Q_oR=PVNY?Z z@ITotPE8^+C%7^SCEl1Y!Wb%8Y)^~% z`m%Q@@Ci6{JZ_p`DYivnhBV^~mg&54g8q{fBwxxiL~ylaPGilDx;RaE;?4;xbX{*g zTe)J{s;s<1zAIWD|Fo}Vs`orwxc&LsRgzndS!S;}*v9dYLxhhb=gY0^*oy-QGku;nV3h@LG^-08#Huct}(3x{)j=-a$Z zZ}!T%Q&zX`?|i(^df`mTZQAQM^VXewziD!prrLgnF70PqzgT$d*`Ct-?YH@SntGv) zYe=-}!S1S)FIK5c&-rw+Xm3};Df!0hv99IED&*FgEMKO*e&4nWoep!i1gzP}W~lwq zdP3LALwpQeFBWXMFW38U%K0?G1KVe*$s{b9lfsrLV31(jq1<%YR=+E!N?Fk#~;SsUGupJ5Jtm zJ-5kC%m3cQ(>i`4#cNH=`(`-ix5(`hapNdy5n0sUC$PmV!b;%C3oRSXH<1Y%pQgAa zhc9@;_RihEQR%X;^~^Z7f@QbaW*%VPB>8Kf_0<#n{i+Q94KHi%-ne{s!MmHc?G)eL z?|QY%;c@eP#dnv(_rLkrzy1Bc-yecQc6x5yx5jd9W!1X<5o`}1+3Rh}U{z;3(HVB) zQT+}NkJe+~bq;*&YmA!gB)IR1ZKmPN#+yk&AGCIut(uwHr2P3x1IIN-=18uDC7(o? z1vjV$%>B?*CLG7M+kE%?K+T#9$q7I6Dz;Z{EMWh)V3YXrNA5?Iq(0VuRz5i=<*Cr0 zlNt2^f4Uq~3i%=`NuAhYw9dCD^zrQ7LQkxe zW%VoE&n!_hpSen9)rmT$#3X04>H9TiT~ZHT^GI~-j-z@}f{~9_NgY!N+ijM1Ch_6! z#n<)9SS6-SjNJQ1w(MH!p*L4HIoED}eEVIQzAe+`>CBs^8R{Neke+tFe9|q|ZRbSR zCExqxxySpq&dzoN^@KAqVync}ub(_u7UW)ZTar^FI%Q|`gioEz|DAd6$0O8TeB{ym zbqPzg|9M{6y+%ND#uo0CXIu@o?EJh?pm&9fc+vTpFF!A`FznDa+Z7nLVUnoK-50TU zJ}zAr!lBQ7RK-*M)TL>=O6H1g6?OZXDIjs<%QB0znmo@A>E!TEOsS|oJ~__o$|9+& zwT5$F`t+Z=vdrr1%79wIc^_6@sd4+dD&p*_u*g|gR$VGtoxr;~;`pf@>#Dv^N%37B zb^X+}S2Mn@3Cvj?^W5wDuC!-s3+~R3{eJ5DzF${0E6%Qd{?F^iA*pX04ZF=zcrO?&P;^JI=0Ml@WdWi%6#QQI2(d0SEe}W;n>11_+rqRrgO^`(($-sUB8M z-m$USJqyU=e$Q+=*=YlohO~w=UqR2Z|a9_+mC8as^Uz#*SVlU z!a{(9%j3tLpI%G$aWj5!X6X@Rs$V5>l9j=HO|<}X^^$!oWd+shJ`a2Mi0|9EXnp

M?i4;j3eTPAD!)N1Vo-BGw`~7Y<@1CC>j3an8mbJXHvQzN}l|_ z`@+$8wcQ_++IL7CW0fp2{8W8MO(6N?+Xs1*=l3*gh&La+tji`oPnBQ2K%CL}7*mm` zOpJiF%L)IuP5!c#dSz6F#YM zIlq0I%9>BJnoOU0I&R;mP4{x1FjJ%Kg)pMKF+?bnZt zq|cml)7zxH>4kf7#VrmG_Env{xsUS>?^^ln)2h;jx9xkZTJGHVHh1ydI|{|s*KTus z>pork>}`>QY`#(32$#L9i zeU}^g{MX%`^WMKWZa3lF<~=(Swy}#Q^!&W?|Ifq8`X^pVD!obfjoW?g?4LW?`^yj9 z-urB|wAF{j@7_Mpulac4dhTOcd$AMpc00ZNwoSbJk0)D|`QPVaar2q)4f(r+_edn! zl@-iCU-f>y=<#-Jt9vK;~P5=~k!B9%Rw zoDMc>t`Je*(PZ)>Lia_}o4{tP9nA_A%@!|&r3G4?ELvP5THGpHJZ7|b?P&42(c<@` zB|xGz$f7kQqBX3dHDX3<)Q;Ae8?A9aS`#GNk}TR%BHGd_+A?OeW$kG5d(muvLRe0q zy~v`yB%-~nqP=29d)1Einj7tPKiV54I+`pxS|U2yDmwmk%;@Oa(b03Gqwhz@1c}Z` z7M)WfI;T~1&Y00TYe#3@i?;j~!Zs3Ji&j+3`_U=c%Ao&%W$})#H5Q3WGrG(a1^gCt zt&Qm3#u2@qqkH>~?mZe!KJ48~uXWdc}=QRTeTxDX{2XVBlED==Oj~AfazhAp@TSqsRva-U0^R z4-6uleG-j*vW$#M518&$usA(nQet3KYGSl&VD(R6(Lcb*pYV^t*kH1L0?XSM%n}Lx zicS6VJp^3^Sif%Ib~?%ZErB)g0*lQA)~FAx@fTQQ7cg6GV77VA_kn@`-UHqb2biLM zGD$l!SU#ANaFf;2ftig#RPO>y#>{D%FPZjz>^nSx=Y+uYqM1B@3s`>}2njH-7#awq zY6`FgFtA>j&c(oDaDYK8k->a|0M`K~^@R+gD;bR*Fxwtr_P@Yv`+(V~fl+EDgV@7~ zk_QRKis?I+K2CI`oHb2`$ z4s!3B!2NGBx6@AUT@BpX0cdzf5UW6FCMmEeD5AGhYM;S2p6frsl^lKP0BtB?hKFIXmVU9!8#Mc=!cm7;D{Ux*A2PVY@ z6Qh0!%*zyHXJB?J=>0!|r$B(cNQ%8+0?&U27G(t%gMwvB2N{eEX2wgcXtG-IZ|b8;i7+nS zp5V%|bsfvnbsIi#t-HXr_5s%h0q#u)*1gGcePJaiuz_XQO=cs34NTG-j2)P#Rc^2| zm^_Jdg^j|}EG;J828Q~b%=;EC5v$(#!=RUA0fT$PB=v{$nFTi0M$Xl0V0!m}PwuxM zZvmtHhkr~-zgWI4;6L#|JG+7BR|3C{!7}|1jN%I>2u)lj!pP|Pfyupqr|<#S`VU+i zHf(v%wZ5=`$KwN&=Y&nlip&YOn2jx&jUKFE5!e)&y`h1Nb?3^BvWbiV514sAOpiIe zb%NH)$zCh>Ml#IEVwBj(EqiOF(JJn332bj(&in9kN}>SY@>#1wPp(>P6}sl@s+5KO z0vov}2J&r}+WGGY+mnRV2WPE*VZip#K>jJin(5tqXQ~9_B-zeK?ppSHPLijlM&sJg zo~#N7IB#v>-DJIc^J?BX3{0U0^Y0r7@+7$K{J@T@(+ zbzFewfrIn|fj&L~CcS?jCI^4uKQLk4rUNqt6Q|qWVrF>|(__Uv`6tVZ=$T2km;(w} z!xH$vH?T?^WE6~E@}pqmkLr!t8*DfV7~Bh1Cm3~? z**L6cWItB0O86o}m4P0~@n692&F8Pr`LV;PYnm_vktJMSfSZn5k zJ`7e14*oD$HdFEtFXI-$gN*hI7>_q>*|Ol!mI)X3f8ge3umB$V5UP^wz8ux*9 zmh|3B+4J3O1!EgdB&jnEHR!)>IIIYLP^7Ynf{)Ie;6ZpdqFdwuL zIDCfrs7$}*Yi64U*7w!?M%jW~3M>zAFkD`J$4h<8l76P~WV!{l&* z#nIvE1{vm*zTj}ZNnYJ|c^q#}>%IBJo8j5%n@43AJxF_Ru!J*IPeuZ+O6UjDg8-!z~XuU*S+OB_dr1Jp=jdv z9S;_2_sy%my?ybo?dP?2?DBrB+;>Ga?~!x|!{!-}9`|k6Imf2=ZoA>RcVAw<6K#CJ zWdDIhp6z$#2M+#eOj&|`jEq7KjFJjGhYVPAVn2%7vkLJu3VdKVrzkkf=Be@l7S9Bh zTR;9W>t0~8XJBzGVDWyy5_gZqUg6o{=fTXI9nyq_%IE8}LderI64^iSYQ-Gl3W50>qI zyJGzVF29v54DY;a-#=ZqUGMDshS%>`aD8|$C*=9IX}$lu%G-|?S+Ui7@7l)C*K+%+ zP~(FY`~RG||L63-`EUJhPM3HnA#nbBkiy3s^Z(w`=LuZ!QQ*Qy!H*x64gM(!v{&bz zS}t>AwG4}&0*jHq^qfit9tKA71iuKA|7&lXWp^(i0D3g>oK^1Q$oQS*F=i z1_c)#W=PAj^K6g|$?#=UjN5S_yv>b6Qh(O34-40ynPHgvZf8N^70q6wA8~sG4klzA ztxwK0%V1(Uw>oNT#>G`nUx!EUDyjdO#l8KSwuRy>69efTN@CSERbL()WR{dU)-%<% zZVu0;O(`ea&RU##EH`atQ)}Bl2ZsiR&`Zfj=GghVea$jT4ZFO+kzvd8p4~+cceQFy zUl+T(cGQ;l;ACze-+RT^oOVUhMC(cVdqty1sY>Dt>DE zG{=2@+~2BiZ}0AJmyiEf^W#$P<7;PcZ__n9*xawVuG`>z|Ry?3uPhVL^kK%8h^LTH;EWR#`8!%Xr0UTyo)owj^8W!SxVcvYIi?2icUm@$XsI-|+*Y0?>YW1|;pBAM~i%KYbI$yluMW4ap z1!tJ#Yt!a_m5W}z<@mK~zFkblQWYE8jo&&5uQgc};N5GQda}XS?Df0Tx!dp6aj!Eq z>M-^@z%5yxYf}zvt77wr`nPq4qXXNg$gMXotGSN z5eaQkWK)~waEL>(>4##PVv9u+r+S^iAx`D8H-t{FnV2tTPLdFrZ>aOb>%#h)ABQ5uw^ki&GW;;nu|aeya}|I%Se>JlGq^RvbgoZgwEXTCxHxi3Y1|ck$H=OYc~CB@LWn=Z zfLXHR*px+{N$>cYXRQ1B&Ppl3;X_FBniNrg)3ZX3r6C)<wjE@faDb89PN9KMdlPR!i?j5tA8y4= z9g|sg7_{HE2-?(NI5*>B@w|5>j@Gw#vg+=5)*#Z<*y3Trl5l`Y!gWOgtKx;ZdftA*Reg=wUW_FUqOu|j0-`cyf=?B&E>qCgm?Z4uYREeMjBSu!`O6rUyOaKD ziT_cU{5?T7(P8Ecxe1@#+n?TEFlmR^*_eYCPtUcIV`hZwB6!V zVqd*Sg7m!|Z*$KU-hTC`o3T*)fMB1(EM)~p6HkvrrPCE=soON}zSbMe_(O6IbC3e_ z^dctKSpwV*RIsCaV22-g$$^Hll%}#~|tz3&SdH3r9|$4NWBv)-rw-XcKwFy>2h>E4kzclf(C0 zX()uTtjXkcdeO8r|W)ge=Kplp!FeRe#hhO zYsB7Ju3|P|{PKV^U_+DWf`&H%~ zNp5a@gOk*Q19i;87Zv^;O<++LVC1klz$kR<0;{9JA)zH3HcNCgFpE!UU_K(`%$ah4 zS@##CkVVZUouyye70On2^m`JN?LpG@HJU3jjDoYHa@wvRbl^zr^W!pG z-X}6efq~JZ(aI}8P~y*FiK78VbHA1_i1V!CiJq`&O8f`5MZ$A=zaJ=?wpXXASD5Rm zq~zwvB@B%z33?&9H)U4bsQJ2WkCLRo1ShqRjp+gR4tH=mR^PgOZuK3<#tS!JI&!F; zmO5>8>*9=seCE3nGxz=9B>nC~$pcpVA4yHKwk~z6d33$mE`;Cp>KZq8>p0ohk=K7+ ze|F$&LFd8j`2X8v4w)X`AiuO(=E*+?_9f=Ful(bGU0pu!>k55a@pp_Hawcm?+WS(5zTRbExBB2%I=l6*NN?n)$@K{;GLD?T{UT2ZXa|WO^?9gvH}SCjnM(rV zg^#>al*Hy)%w;Rs#AdxhDf5JZ(1N}tjxM<$lcF2u3V%_O)vd2Q!<;Zt;>zP^K>x;r6lFRbGX1-yJF3&3MTm(j7$;JTsK=w8*F>I zpyBbWHTzy$mwjN%Q`n&?FIG64i!fNsakgCI94y5kbAs{K?mn?g+r)P4{kDtYtI$I3 zj}3eh`^q0r6uzh+`jbmNgGn_*QkkL2%cQBNut~##srK=92ID6A16&JMPGl)&QrKZv zD8$2GZSk(#;(fPf%L2`h+|sHK7^P=0Hdu;$72YWpY_iCxS${#JY($a&|o<^LB#Xc1gF5&hbGsoeUZR^ zU#eZW!nF9sp@&SZg&%Ya8CcZ{xY&NQKakRk;XZs}F`w~^CdL(vG6x!EZ!j))@mlJ0 zYH`k~r6pdAr+7)dV9I%YxZr^RrvsC!hK8m9hvtm!&N_;&DH9bm_icQ!{y?H2`xJA5 z0vU-6Mnw-MwFOLd(v18U8XB5qnl3X4bTEn=9Bn*^-mTi!aA&H_5G86n{qZg9-jeg*mw1T2 zXzR<_GjYrL-&@X4ayj|8WNk2a&(tF}(_^;ksjwF_wE9jkEmUaLh-i|_XqY?4^9=X8 zLWWZ>C74&5oVs-Sg3OHzd{>?M{s!>q?v<8ceq%6^PjMnoM3d%%?GJw|R8()@G-ZXj z#p#7N6eb1jlQ%GsU1z|ywJD%C9AMUW9f@lkpmp*DFN*rOj$L)H4}W7 zRv!@G;M*W6A{emirVm%)m$NTAnv@0DOp3W5&*6R|GPUdqcentXd`IwGi-s3#j%%M_ zvJGxK*1&v9f=%9or`~2;>S_1JE$r{-@YU1^87G*us+_kz&7`x#BJW09-V3&}hV#)! zJ<1kbjg)o&^W|#%Q&L`%o9s7Mg`tqUsN&#Wo?XyJK{T{Fs2Cyk^@Z^$hfADGR zs~1g|9$(A*dM%$dyr6f+Ym30oQi>Z@PRq}{*mgj(gfiZGvXz78g+n0Kj-U!Y6;gPWQ_U^kTiK^H3_KHv4 zV|rUEAo6xw+SaYvXH5%l?8%>TGW+N?uBm;wyw^`my^}8+{@Os0>tRFVgr>8i9Eyd4 zQX5xv6j*H4cQiUJ;uToIBp&AY*tr@*u)^r5Jo+TN$P#nZ(1r*19$;WR@e=Fnf$V@J2fer`K@^jgkRKD`-t z6z9e08C)!oP!z~uD&4w4ZN|S95(ihzSb5~))=u6@NzBYma%+!xEs<2)FtaLv>3>tK z!o)ysZYhNm=J!mw@29#xP&L%ty5nU4!%rqAHjVr9PTiRJ`zZH?2Gtcz>I%Vc4&JkD zV4foC@MZ%8(-cNy2dni}j4Ld7W^Fz9=i{oI#gXzm7=Fy1Q~#kcsem;&aY``L+0 zd<$EXJ~Y<92z_~CD&s!)nl;<%r=$k9Hf2a()%kJjO-5tXIVKGSW@8VJ)P)I#0lhj8 z)HP<<-%4mGf54Wf@KESmTgJ3!nRe?kw>`_ydzg1(Sz29tXxhVkwshOVL;P#4Y(s*$1 z^#&&0f~OhHsZrCi*By0ls1ee>@#;VTLu#_D+>fW11fE@%n2==FsiWX=OQEs+1zY;G z+d1>jXCF&D@r~_x-tCeLyUP_C3$DF6%Qn4G@A>&Sn|~}G^A8+g{bn>Nuel^t`uC^=jc0xP;Vya7nCOp?2Y-yvBxS z^JXee*wAb#8M#65@>Dy1qlJo|J6Kn@t8(19ahHK>MJ!9lLN=yGMbG3n$w959L2a&Q zx|(miv}h1qz^*;xfWQN$Sxax~a0nj~Xlq-+t|^gK*vM$9kdi3CrhK5!{g|xrhc5ST zjiHmWKF>{&cj%h+^sM2fl=BS@RTCPWVpW1IukdZTZ(=R#F4|b7pz_Y6srm+E^#=DH z^Il7?f4b`#Bjb)H)f2A|7&K+PejTrO`;<~2VEO?_a z|BXg}QAGgz>33}v35@5SebU>{cb@I7!FlG)MQRZptlti@{%CByR+ekALSDn6>Ca7h zr4RF;SS-))V1NCC>E64ycJG_?Es~n1HECSCs3ySF;`gFH;e}#@q}0TBZcEx2gN3P!#gOlCWnJnVSnU-a9gHgoM~GP}XFxS}bxe)Y=^ zCQXjUhbB{>s=OBb-x^uan!>@T8F2IM1cvGxO;Rf~t7}rDr)BTx+ooO7B>9h{tolNO zEI*I-hmY!vpDqc!VGImS-j|@gp^rJBy)=ToG~h>TeS2GZMOxjDj`$y){uMRfKXo6k zcptDf)yUIOy!d5>e3sMam=mqh4XtJ``u`csHm;ENdoi=XV>!#pKHK-j_U3#J^6!+V zGI@$ODH@cp%$_-ulj$-mlV-z<%>jbaf!Pe%cGGu;v+n-J`nz4_M3={sBVrwP{_7>@ zCN>3#cLnAjZPVSTcB%c%jQ3S9+O;P%c3Ch;{pQbMu#G%1#_G4K}c-gGnve!qL%ruxcziRwGcgo8IhB^*|)Dt4xABg-j z{oNWL;pb*mm^#C|?!oUj229GkKHgl$%hAxNzJY!1J3h7*?X~$z4T`-65(4HwnHsM% z9kTd)(z2pO{a>f~zx~Glo~YNggtK>_|MC2Jk-_&LMc>XJ*dhMI@pJXg)`*N|8(n4t z4Vh-g8B7c1Y@dI&yWXf1RKM-yG<*A`o<&V^vQ0nbn^ZY|O<%cU%@0QP8SJ?hzj_!t z*fymw{`|Q3D7S<`QjdV4k{ge>{WObCC;iTDaYL7!1s56^o0xeuG8hCec1#Z6Af=G; z@{_91j1%8(KHli>&B)BU=EmVm&F=lR-zS}!k?4P4R4(ev(VSOXUN&+E{&>6lQIo0< zr`@VIzyGQ8@Xbj%S#@AS;nVq|6a24l%6(mQWR7KF3vcnmX>S`^mVYw(`DHb~c5+HeP#SUrp<>uRFzb!cWaJSgC%< z=*ek!!K#4m!ZAQj1iNprQSoH@x zekj=(9tyrM9{Z#~x$mFls~O4ScPc(BPjDzRd?Nn6RrnmgBhSb4BEbQQt-`(rhDQWg z6~8nK1)Wj$k(ndoImcm>L`i@Xx9OJv7va#7iQL?s2N+rT8kRILtIWJ|NKkX_mAgKs zcc)zTv;8Y_CBRj7>Xo41h6YWde>jwTYy%B0x`=%JaM<70H%6h!sPM?dGln)S3vbv5 zt+*N=t$adpy1~%{0r#2xInz z*m@-Mgrc5&+YIi`&u-#w5|>&(FY3O3!a})LlW(W;SsS@Z<8u#rB#%kBwOwuzaObE! zBH+Zp*mBWHt`uIdRz)3JQB-AEmqklb5%7efsKrClN<9Xr!x2Lp4e$3c+l-W*&k(F(OthKzre+NZp z+kzdRy1X_wxV_b0cOcN8J22z*2S#>{5C3ewT+}|$z%2QN<*4X4osSI6uZpT0M8X^< zwifxDgdY?8{wVvr=)KF|Wv$>FZax1 zPrV!=+j-x%RGe^@J~iR+6^nzNei6K8iArn&ogY^y{(CI{WkEalN{7~Zlf+EF2~8p^ z3|b}5E$)aDWE1FKIBCbhW&ZvW@r+y!4RTjfN^f!Y@XssY*RXk*&$U>XMMa^J-Q++m zM@5Xx0|QGPnS-oh6^;z98&>TUNoJX!oXpQ*(5%1V-$LFThc-K<&K|c-54nvE8s21x z&%S*&o#n`iLkX`Y^7!vuG-cg~5TjQQXH*Fsp1|~G8k53-V{cRsGIDKD-rjeC|A|Js z<@XEjb|1F(E5BGC|9$uU1AUeIzd!gi^<0gb$>N{(Okr;tc=o87ZT`7n+8zey$v-1b zD6LS8p7O#n<--G3;~$H7kFBt?`O(DrSo3`4rOET+9~`WWDOuw8Ved=l_c%fBq%an<~r$kH%>`9Vw)|ofSSyOUVV8okFi`r9%cytyByPk6hci`ml zs-M)VZQ$CV)Zi>PIj~3lzyi+0oC+LlH?;%~yyDz6iIK@=L9_mkqyI|2TsoL7^Z0U7 z?k78*2~7s86n3eEoGSR*(ZtR5foa7ouUSf!Ok!&aTCCFEF?|(?FWMw<^7Wm=a^g46 zGhSNQxAW50b!A)U$9~SbUSbkFtM0FM0`qOzEGdD;TQ)jL;u(th_fo}o-4M_#Q9M{^ zw2bHc#7OZY3T&m@eB9oz=x2NodH&)gvw86rJ+<2oZo0ZDY`$gnMKeCD2@wTbwrx|5 z`xtSsEA&Iy_WjKFa+|rkBML4Wosei-kRssbI;*5q{V!+4TScDqCI`tX9k-R=zMh(M z>ZwG~hVzVZ2i)XOG%#2io+)BAn4#+MkhM0ITm5x0qo$0rM7Zc(?wSoO+JBTK{{>a7 zj-T7!s?G3l+W*T>MHeuz*51jU@z;{U>XPC^&fpz~9tXI$8pkA->_s^i?zgI-J z>b4_l`(`l9Yi~OFtZB~qoom>4A22@G^f*;_LqE$tg|>>UZCljte6%_GftC9~I`b_F zjY*SxQgU+`e3tpFa9ezbD{RXliGHhNG9}tib+<3tF?pkt(S+(&bs0s@_&rUcm)1PH zAF)vGyM>#`ypxO@B_7KQH7sKf3+?%1aDbJo&Pk}^!DYvKK`uQD(ZWaEaS|b`B$70b zg(emRACNo1rI!)MAT7{Z7xPf=cSqCokHrkd3l?8lW@ozU=tRDd%~DsNy(s8N)_omm zpL68eKO4h!#b+113-NN^dE%&E#l`N;X^Gs)3eJ+J1Rl%0c_90~Legf=SthYN#~Ey2 z9O|lj^H`yIA-Ao=+7(OH-xYRCU-Jt*z;SHJyVCWySq&K)Jyj09tL)EYnY`@`ql1E1 zO2ke15WzOXKE;AY>BSF@YWy&q5Xdhu<94F(iYAd6T)uoY;_D;|4!&7b(5lgLj#VP# zN0f+f_FsliGleevm@C@0jeWzOr+W34XOiC)x%BUOX12ewE+;o4_Os0OJ1IKnn)SXc z6s~=tq;GX;^13fejqk3vdT)8ff6t9&!FykY?XRls>-)O4c<<}D^k0`3>wP<1xA#q& z{qBnw*L~Z%dGFiHEdK%+J#D`2G{5k+Y`^tA*=1k%eBS%MuDtrjOTCJ|zkBSSdN>FB zDfCM3arxLY{XD15!mg9g8A6}Vuz9w7!u-?8aiX){$6MO{@@GbAchl@(s?SSqcYgzsXfipAh$LgXTW1 zTLv}%7!qVA+wV(=f8Tb~Tlm+d`n}I@HrBG}{D1!}y!rwA`Z^Ki2TorC8|}6n{Cns6 zJ=Oi+YyS$*|G)dre$~In&;LK@!f=oM<<28-zxuy+m3wsb$ba4kwH69*&&HRFC@`&P z(5Q*C>X7^Ax!^r#{G&>ycdGZJ0u+A!Yh94K;(#&Fe6E5AzdM=UtxY)Muz=xOoK?^L z;1dh}zrFu^X#(rL1Ak=~a6MuEG*@15TI{d2@ha^TqNMa;7|tVp06G^suN1CqvF*(QT|!_ZG1CCDy%} zD^aCb*l}MV=)T2_1+PON@?MJ*<60yuw1D^Cd?~pEL9?XmvWY@&kDBfrm%i5^wXKD9 z6_fatIJLYanN6+lLgzp0y#IP><0IDQFNOD*!tOswZG5uw5YsJr^)9BTwhwgN?lWvy zq_yMGlcS63LgJr_CcI8f(h9q0ut?y;Re6Ij1>L&)|8%!G3hq&QB=}fdP5G7Oyhpx_ zZxWSstCUm^J(RX<{7|{@@lxhziu1HC$!qaBs7oc~OjvA^vH1DkdCyW8X)!F?xaO!4 z*W*WXl}v;lJ$jkM=Q59tOXcTRrN1W^vstxD9BQ$ZT5RINsQawJvP$l+=M&qoC(i?u z%?`zBev)_iwZLS}W9K>*Q>6yIPf9v=3)DN}{x5Ad{IN*+T*_6)MJo4Fk2d~0{QYlA;G^Sj=Q7v{ zIGEpIu(z8h_iO>b)zbi`r{8QJSX3Q~wNiepx-8V}YE*@)i`=qj2bU)NQqm5K3pw{7 z(Jsx@?5L_)TB01< z#JZAY{z-E03RQj8p0By7;^+40%E{xA%MP1xEfkGYDw2BUEporGEydg6{x{Pl1x;zr zMoMCO^K1_-Vy(MZy3197jX@?%UH97}sWNAgC(YGTOQTzqWacf`oRwa4=#jy{;8Ox;+3|a!3u^Z*Z~T{)R%Nw> zyXpB0-+2K==~7uMynE7P-PGEOmOuWuJT2?tYtQ)wyD}Q)DOadzWbR7%Kh@dx#)2ZT z%!`KU#Y&1%`yM^+9@)$6=pOT44BSH4Vx zSkx8z?uD1t{S>DA+SgXwzI$_3?um(-E`wOc(InL~RXO2(_a92CJ(rxnMr!__m-Eha z<<{NPK42H8CiQRa+bu^ghrQ`M^yrc9TX&{hz731cyREr#OZnT`wL7`e=gGah`YY|S z-^({I=RMrkav|;Q>(IEzNefN1a&CIPYnZj>d7Z?mWpD1-K7T%K-OIX&{qxqnTBrBA zZQYA5+1JO`z1bJ^>fE}w_wtl?y?gB>`|jJi_ut&#{#*Bf@BPh}@7{g7b4qCaC%yb& z7X8n5`d{QU?}T1HC;R@v#Jn$Q>%Zmce=o~lBf0+TuQ}iQ^nXrU|8w5@Lk;;qW=Z_o zw*L1%{XfUn|5}%yq?-Tdp8mgQ>;Ij4_ve!S&8_km-mYihH((Us@bl~X|7nvM^$nQK zH!w>-{2~^{bb0PyyA7=I25jjCCZ)nY{}ev3T%Y?pa|1`e0q1msRV^F5D?YGmPvG3X zfqTCJ4}TcT>APItV|eZx@I5!+SzW-J@5B1qK!AOtz;=E1{Ve?73yvkc7tl8pHaGmT zsK8ssP-ydf;qZ;3@gF~VeH8Kc$Z7BwX^;_X-zd>f=IFxg;iUl-_SB z^EgIu`3Ii+w>OnLhW-tpEA<_ZlojrN#njzlgcf<-<$p!${TC2Z#H=TL`~G#$lln5d6N-$ zv6T6GV|Qb-^v?p9KbhPw(z8FBm$BKRf3pPhW?lWwW)nACt^cfDZmhZ4*yi|Wh25J~ z!#CU9H?})$U_Rg2D*3Ycb7KegFC4Rtk9ri?|K9ANzQyTyflLaMs?8x~l_r<(jS3-K zT;omL(zm$fo4A*6aj!S=XfJWoKH)Tdi)Vjg4KFWMydWLXzBQuXG;;dZ$oZyG%eO|YH;vxDHG2O))0pF1W6qn#Uf&vf-!$&| z*0}ek@!z+`|2Iuw-a9uoX36`vu-llWxNl4GH%krQmKtxCmcA`5 z-z>d+TY9}&M*FsmezVN!+cM{yWi8*9wcady`?l=;W;w^V<(xOmy}m8?zFFRLvvg^* zF!|Et|7HdGTkUzw3&pn=%9|IdZ!gj}FE-y^Y;RuTzP-fXyfl1!X}oz^`u4JX^YZfT z<@M$j?b|E*%`2yGubgjQwS0Tkdh_b-<|XDPfvZdMrA=$EZ?C;?UiW-^-Fx%;@7wFI zZ+B5IQ}i)y6#wz_7jsQ?Q_X+#X7e4*_7*Mg%auZ8*$=q18sA<0Pb9WY_->ndQv39~ z?d=gA(m$^LWPWmjv1{>;&ObKau&`i|b)6;~7eyg3|gP40Hwztev^ zX2S2g6Ov;mGGCiGdB>%n%%U2Nf?F7PdKl(7G%(k+H17Oh&%wyVanSU5)TGn5rdM0~ zw(acimzk;k^Mc{d$<8~c1T##H{wc5j!Cu4v>fE30H+Qx_{CVr8<)x363_mSr_0O4Q zUpd9Ua;ouxsrw6#2Ffn@9lF^2^5Xi~C6Dhcararu{;QqWYPPi1oMbDem|xnByBIou zU7h%A&CFki7VKK?K6#n=uG#Wcix%%(_5J*sbicLwch^4OIdlE4t6QsP@3&lZ-16V8 zvub6N^4CQlyX2P}eP-7;NmY?=@g4Kun%#@-5Z>+mCRJos`g_s&QX0Q6T-p`<;?c*8 zOT9a+86}=L{?o3Lv0nebe|>S)2J1zS_8ux*w)(>+>*`MmJjd8JUsjmtmQeTVLBF?l zoApA&n8oTB-YS-5AGrN{*Z&vXYC1Va$w%fN;0akUNABI>?bVm}{$5>PrL1*trq-J8 zkE)~Jtg894`&jz!&D=Hzp2u$OU-Dw&yeX5k>x66yTYebXEfsxd!+cHAYv1!@#eXhU z+H5%f>!;E9!_ti2Ph7h3SeTijDREVNc#>z?o)rD(gwTxE-Ie{%1btP>_Df6{2a zzSy(c0Nab!Jr@t}+Hm}spzFRTmk%Gh(5$`p2uHxb=~62am#HzXQOng@6`l9`rIy`t zqc!giK7MhS<@)1gA!ToPOIGDvT7A=9f%V%`b%A|**43@-R}^^WeB-lP)}^{f=j;Nt z_8exhE1jk0RFxqg_uFfq%W1WLkHl*y3;$YgU3WO6&ZoeBRm#7o_a{D;fBUX6_afK2 zou8gx`9GC)(#y70|Gf>YgZ$!K&b`#$V%x8j^~YVo^54>TcjX*b2rTVNkYZsMR14WL zAl-CvqmlOrK?(FBiINN@nnK|AlT-t)^y$t`1NCwRq7H4{ix%i-3j) z3mBPM**EAdxn7VP)uQ~O*McMbU2s1~M_MGO(1C5z<&5unUrsA{c*v7i+jsgiJ?mzU zIwO~!uX=~()!Or!y*zp2@renh$3iS5AKopA_3Kuf^|(0cx}azE8);W%|G6A)ZEio! zm*$=|(B8joXTjHVQ&x7HKk4|XmHF`eLig!*bF03tiQZkuYrXBw%_F&2)s}giXQehe z-CU`-;E+`Q%*Ov!Mp<+J6+gcc%A;E)bnD*(;ZM@L`d2*=@W|i$tz(w{vZ9_}{s;dT zIVi|3bjyCBC;H{$Gh2r0q78Nrle{}+L#6g`IGu2?Ds=k(;PVFsQO%xnI|Y?n&e&ee zu+gv=bNY0`a1G0!fD?+HI+spd-}2~`_J$)$r**dQF#9WNayD!0t!#>(s1bVQf`Hw{ zh@zJ#4Citg?fTCZwL$gkp_&|vLmYQDo#y3y^+IXU4H=I!f}szUmbScGy=KmF9j;}5 zvR_Lk`>b@5@tP+WoTTYy_cvwZb`N3Q2@AZI?$-DDs^#r&d*aKP&lgIflqPB!i|1aw z8lJdR|KytktB!|N6`Y;wwYto9MfjREYqYN=MyHlWBq#qfowiu~zsfePl(}m;Zz(SC zy>=^m}h%_p00PgzZ+_ z-Mnc-eEr(4n4*umGXg6gs~USON-DXYa6@jIM&fI=z8jCa4c#2#)pk~Y+Fh`E&nMl9 z#(FmwcJ;dK^qA^v*YPwbzD@7hw9IusulDYK``tRW@?ZFkiMiV{9dVRAp6DO<^J(JyyFZ^V?2r4ky6${+&ckl~d2=7ne1Grv`>FHe{(L;C zU;pdX^J8|^qBm~J{rUc|-@f?s%k}sF{eJE?zwpGx$oYT2?NqmCxs~4IrOCAa9r@M&G zD==RY^v_lL&*M&(s6bJ{T^AfIjtc3BadiioJeKrsciFhIzmwq%gUCY(_u~sUnnbO+ zoG0~p!MzG4CvF=~c~zAuHoH3dT1`~$UXd_+v$e4LML@fZ;!hW6wsiAEp~;+qCK7!g zT+FpEPWEoA@CfX?l-9Xt2D8G32^%$BDthkB<5iaQ7Vz5?IdxC3fO6?<-*rnS&-|&V z*(iBt*33_d>o%-KQyvPJkY>90$-UElV;yrtSai8qQt=Z z(M47$y(P@$L;%<1xo>O44SA0-aHJ&iW(6=yT}U`@n!?D$<8Z zq(!3irFUYM)tiFstOKX7F|N5T!0}_jydPhjc+&!y4W1P9+IcMX{ONvn%BCqRPj|lz zUMLmXooN!rRdJA8L}6leg$Qqg#bNQX3#=3GJ)ZxkIQI3qkGqzw+gcV>`a1eymF}v2 zUX1oDoJ8v;gm!!png7GaIl^^U+onxZH+<@TohUf_hSJ%spP2YL8^j+~n>DZTk(|29n`mS{2?AW(?(|6zf znpfnT9eAwoC48MO=K`JlK743*oWu7|YsL{( zvyYvDbCN{Y&p4{frr&(?Wx^-Dmc1M|G~>@ZFiV{%U*dMR;PET&Bt>h-BOC=ECr+G` zqN+dhq;Hu~d7@16l_H*ewZ|F$#e0$$eY(tOKh0r6`=5tO_A}3=?ga zlABPv)b_%Q$lF!H`>vX<)4lup{-gvMmWz!GLm#pQW&b*wtM+vE*;Jntt;sXbwJbBS zTyx*XI+3fI&2;7Ck6AC){o1}#?R$Y`?VIAyKP7HOn5`1ey%Y6&n#}REZ+oNnfq4FAB>dA$0*?FWZr z@xGZg`qytBXxX+aVC5-2^(TcDe8t;)-!LZquio|A%>4Mpz5g<5mp60U=&w6a&;6;^ zz2=Fl`^J5ZdLN3J=bpJ!@%{LF#+bIxmah)m{n%6cF1jsQ_D1CSU90rx^}9>o-Jx3l zZAx*Ql_b;7!?)Wk=bOsiab#c2YdT@;5_VhG#P60DE!OWiyz)VM%;&wlzAs7^@%Lx0 zm9Jq<`d@u?;e;RkzavFW=2xy0^)EXsKjY3~KhuXt&%TWNy!TW8^WBTMd4KJ^zW3x2 zv2E;^9E&@;t-mF#cf9u8_RH+-?-HU($xPEAf<^ECJTXAvoZ z&&SxMLQg$2+3^3|%ZJx(?`{a+cBk|or^EW@-`#QS;(7nRy!5yI`|R8I|KRS0^StV*+>0%G9O~yjs`0U3Zg@G# z=gGPJ8^;)LYzlb2?ZS4sfM@#zzNrNKo1`nT;r#U}x%Z0B|8w{-!R14e$Az~$bf1O! z{txnhETQ)|<-)V95AWxF_&Dv|2aZL5az3yh?foa#&n5GoLw4fsNfQ_Z`8YBS_=N-6 z7a3eo>l0f0PvGRM+*c{&0o(~uPqzF&tJ@Y zf#Cu>>xbW3fdcaHgnzx~*VX-z_U@BefYA51f0+b%%HIk;6x^+3$Z$D8;AY@srVlsR zE-=)t7LI*$J8Z!#AHx?cn|K}buJ8!S|J9RDW%!ZOz#7NPufJYC@`C()A2IHe@~akb zPI2Ifdcd0Gz~a!rZ05jh@PJ82K{d2UHFA?`>?hSkBem2bwaiUw(Lqx2eNxS9uLqs| zy30j2*!Ow>|DT)-U;b&V=X(71f`Y(rG3D!ANf)OSeVX+4<%52$#~-zh_deb*@ry|Q z)gSMEH%(G#o20F4bo7J2{QtFA&6a+x7Mn&It0@MbP%(aHRcw~I*(`VS8N1ItPQ?bEmks=d)q*#h zwia8+PG(vDz+$4YWq+_){$|U$pDh<&K2UVIr>xk7`?87PXVvD(7CSdvrwWxVGPXHd zY;&@B*RtTQRg(?8KN|#Iw!ZuMpKZ91&FNyhmz(XLf41q>u&oxhzAbF`ceAy#w!>ad zd(JHm&IQV@!M3%=*0Dv_|35oM8W+7=#nl%azKVg3#l(5>2?xt9&Yy)HD?eM^6t+;@ z;u0S0B&y&l-oO~Kg{vij%OJ!#^-Gz}7Ps6hO<#gt>VvI)x426RyGkEmlzG6|v4tz? z0LP0&x2aPO=WX$v`=!I-iq-XEcj+tcYp@ zvryfA`4q?KOOETm_{JJ}i#m98PVrD=V3JbsOkcj>gh2c(;A`M^4s$Qj5K*Q8 z>8~N)p;`>0!PbZRJXG{T7`jzF^Vj}}(`=mp0><#L>zUsfb8ok~$z*i}Oaa;V}t(t6M3mZ5T z{T@37r8GU-+PC3qc%p`v=oEX;DG`=ts>Y(g?w~WZU5%@|YmvhhhQ>QA@y8eTe_7(T zZAteDGcGnI_NZLDBOHle`&?qao0?7cW-^t{T9V-WC}#e*iizQs@!Rd^l*jCEP~kaJ zxma9FPdw+~%0yprcOE5+w(^io+tV(8Yr0nEa{F3tyXe0>_iujE?RlZsgn70vxN)!` zRII?(kzFOhY12vJD-H~9M+(HJvc0%oC;mMpkU^@0LF!9cs%Cl73g!6ZvaD1k4ZcuE zwJ;B_>%r^_j%!|2L+2BISZWes9#;EMB=6}o?}y(Twr6r)W+>u3#9Of7BMU<>cUIp<&)(PHQf@}nU;NRy zI@BtNxwzCN%lfOk%?=MUi=ev-5+WKVHD+1aP3m@>?YlW9%ly-dFYPqV>&*FYs;1Lv zsMp#UlRTmDMo_av=kDoUu@+U_J3IbYG_AcpW&Wb6oDGT7#U}q*5$O^+ZRd{GbJM+U zhxA+*FM8!T@0|#fOghuK9Se;73RM$kdM8NVvygu@V}ZbqS@(ZP&iL84U9ePV zE2qymT@g7ubhdbSovgYo3&WLP;q^bK_igW75VC9b^N2>tivInQb9Bp_{(U^OAUVm@ z>Z-@3nWfV!LbiRKqx`5}jz!8(BB+7GfMMmFABS2$DwT1&Ot7nrKb{#Yek%68N||hA z$C0Tq$9Fl1w8pesO^)cOx~Y<6+?@C`Qpv+<(MpLG`b%sj%q$(6Ys{tUt)e2FZ@Ihg zVpMQfoh;eEa}!I~TJLS0K@8VteV?Jt?WHLn9`YzcvwT<4i^FTZ7nMXFQh0P};acSd zj;`GjTd#7kmblL7mbtDGvNa(7dY_bAkP=6uQj7nk2dnol@!jXLtyOu8YD?wB?+QOy z=Ju6uF-@H`_4f|RLz}1Xp2PpN{h5{0E35FQk{N;=i_|=J=pJ7FUuuJ4nf=A>UhKF3 zd2#PvB7H#KZ1;wiBk5;Z_eH;8Ia9Xswe_Bl)mlu}J?C$`aPMXW9SSo?{?_abc1u<) zW$6pe$&@5I>s zneH5O#C?yy|DU6Ycgl}NyW3W&I#wOMzxn7&(_@u;j`yn^wU;`s7;-%J&hg$qCss3` z$c;H6Kjp+pk&_E;PEAZXc0FXn%saMo_xLQWIlc3a)|434{6D8UjZaVAa{BC_GjkuE z4mLV-G{)j&joU?=b5CQGuH0d|vFEJvm$RlN=YH-vFTCj7dztg0!RNo*L-J^8Zp>&w1-k2}X+ z@t<<#?(ZwHe~$#mUhSTImG{rp+_{I7W3Sauxpwo_wc6T)#j)2#Ctt7rd%d@IadYgA zjZ<#SesyE+-kQm=H!~;Qoc;Ia+P^-FV{h%Bd@J(Rt-W_WH^<&ioOFBl-`i*JIvu<<7^havN>pZad0Na@%87qz#O{NEhKiS;A#issi z<;+tDe;o9$zZX2eA!7eGZI9=rwcpZDeyhA+R}g=#^nY_z{g1QHzlYlX$ejOU>i?RU z`MHiZ-%{m&x@P}e`Msw$hE?^yE1&-|wf)W8{rjl>zusB<_k_y)S}gyEz2whL z`I0^Hm#)_Tx?TV8`?J5Iw*T(8|NFW>?@j!LkMcDPOpON`S-7QaIt&&bYUPo(s^KtP zbfi;6J8Dmd;o@VxGS*dpIE)Q#dj|Dz$M4$e3juC^*=3Zmv!I zhd-PqD=sW_>6WtXy3*9L)MvI;Etl!4D=R}*NA2x0U43nBKycMxF0(Z^Hm01OW!r7G z_SV*%v+Htx8a+ER%er9jN_x9FIEc(lBvEjkN7WVD7Jr)}u9qo~}uH&)X^rSgI z_Rtj1%W8g$Dt=e}-nJH@&(F9|fKIIBD7LpLs9--Q82Z_#dy$jt?s~ zcT3y%+3fuE^o;uTeKz5nV;9b?j^1Bavg6y^JG|!q`Rw-m`1s_sdcB@`aqPJpw|Dd3 zvfcOR=aI9w_xIcH|M&Ng_M-i|veoZ-U&z(6$(@L;=h8co(9CD|LdJXA()QaWj-l=e zZTl2YB(^VehnnI{O6ewUGnD6vWgEwlGNnq;Gj*!3ZfEMWsJxS@ZoXj}3#KHArKZkwDeFv| zm9=i?lj)3`EYjwDnCYqBlXI^#eO{H;i)USSr#LnIOZiScoYyATm9gmP*Pki>7W8qs zW-R%l>6N*3THGnI#bS1+RxX%SH%npJqCT&zm2#Q4GFQ!OI+azhY#&$lnoX-*`b7dQ zE*=r`kVtG1aAaX*5wPd+&e?cOt~+PbDZSG_apXUAPT; z4luF`SX^LW=92mFV9Tp%ZMnPO?K{16+np-zbvvHS>R#9U`klALo`3(i4SGM7{m$L- zcv^Mdu0MKz!VmD-^BC4MU(Wupm-F@Mf@6`cX9|zY8Jia#{H8P~zgcR2%#-6<>(6Y; zQoLSmu#ao8PjQy+{hs1;SwDkcuk|%pctmgym!rvsgL1tkm%Q}PmR$C;=PkYBs~=K) z)$e7`ztU?_i@y{dRk_d3ay6`fZ|Tjn`MrVHl~3oy-{9)?HM>=G-q$?!wh+(eqpH)N zmpK(g$Cf{6n!mQ}jQH&9=1%qDwiS>29>?ssm(ab};#7ZppXKq1^|g0c11~uHi-@R9 z`QbSA@|?<7s}AqBynQtGL%+c$?$760Ii}`acsXtTx$5^Dx7Gc~3FJ^_W#;iv^by$} zyw3XYK6`%KW&f@m))hJ;q1?kR9unwdsP{%!+V+rvf&lZO3!DGkKASF6`}>{rD}O^D zg@^qD${ZVy@COyd&H3>}Il=CWEK50Sr2OxD?FU#Eos>UvAk?rgktf-Mk?oK})9V&@ z8&(a5%2Uz`pLurt(_`%_Xz@x?Soh~)(;mfx)eo9^nO_-N-@K|KQzDl>&)bm(kuA- zqkWse1O>mEMIz@r-2O7G?_TvYN#f{_gGQUQdP~+kuDGTlts?WWw;*J`%+l234qTsX z$`{|b)%0D8+byMs`RC&;Y@8=O_ObQnb}v>|Rz2yHC1fE?Hyj(Ig{B9o`;iYU%A2}NrsC>hI0e|>z~pR;)8 znLizx;!}J)O^at;*>b{IRK)k6PgwEnJ1Hkje^2&xDlMM#MCF9}PvLU`(~9Tbv3Xv1 zDN?=c)Z|(3T-0pNnw+oE+dS{*PIbGloB?5?z;B@-L7-ax;4sl9WXmM<@3S`}ESe&xNuRcH6ytXGq6%~@J@Vr59JOvp^-t4^V% zs~dN}D%#Ygu&%2#FD{fXg5TuYmRW1poU~lsc!lfwnvJ5Cd2>Tz-dAnjDYtyx=Yy-` z!*Y<`zWL^b zsMVV{{9IG!(tYc`pm2wH%d*VY$+vDy>)NuuQa2~H`?mMRYo^;uL-Xoquf1BecI%Bd zx?3B%V}5XcpK$!m^1{H$cV0Zp+`hI_uViU=tZCqM(`&ZAW&3Y0eYg`{k@)jjHnfi&x6`TgR+3OrI8i@I(0lm0kHMOn3B|v@5#) zO_ez&V6&Ljdxj%h8&3l4J{K?08^e7#_rv z{Bgn!L%q7fo_wB7qRN|gnBJ41ImVI{$h9ZN!X~mz}R;+p=)4(u>0azs|MinRp7_o#twP^x_mf&LuaMUak(U zx~#DCOO#Qqs$cgk<#}P;D`pzK3aQRKFK4%vC4@Ko|At#zm-lU5s~q%d%Z^`Hx4+wJ zo_;nt;CIyx&XcB5Wxj7x#E;xacigsV{@I+(7Qb(v>?@00=KD4=dbZAub7kwd+fK`? zzJ2Y1Soe3^yW z{5ux1*G+1Y{&Swgyz`KF-}AQVPaX>NZ$9Gb^s#I8&qvB9cN{x@rf_1#pT{wLl^$+> zpR{JnsA%}_oE-jd;?(thd_bncw&Kw`7$n&Rds#|2JXZZ`)lB$`|lhwfAXQ@|Jp~AhkhJ; z{O#k4Et{Y8`&8O<{r==|u7)@J?9VyOyN@p5-+SJ@-!FW&-0^w&NiW0aKe{&C@9PG6 zt5^3uf8SF6`|aPin!WE#b$;J@`tSRJ=X;B5{r{|%u0MIg-|qVK{TCiu*B?Bnzu?Pq z{|B!ofBbdh`TB3tC;z^?{{8n}p8Y@Wde^bI{QFbr`~TO?^-~G?{RQ+G~ivR3Ej2aD{?hWdx4eT!}I9~*DpJQzrfS-Vw9zG&j$Xg;jkymESz>5M3y z9T_$=V(dIJ95R|Knw!1EYOOt5W~;W;ZfoJKXg>2aP4`EOkVNbM&~&AU)=gJirfqK( zKhfy?v@!lhUE+$6WRJFw>23c4TiY@%!eW1<<#9A+cZB9@v`4eHXOy-3c(li-wpYIh zsgy`-@Q7?$k=kMr*=CX2aU-JZL`u(zh(3>$2^kTSZX{2Mh?o|UJmW|BtQSdhUWCuf zNLtVlzUW8dl8W$U6^Sb%+QKWE)-G#VQxUR?BXQG;wskiWx41QL>u9gd2&+HQE#}(I zA=Z;*+QS&u6I0srb864tj&7Z0&AV^(xNYtEWZD}N+WWe+xA8@HE^E*275+Cp;vQIZ z-}MN;@6q>3rSI<4K8LM+*RJ;2f9*Rj+HYyve=M}$qO^bS)PAF_{oAhg8-DFyFFHZn zbi%UG30kES=1-lVvUS3Ys}q#JPM9eAZ=$T}#IDeZGNlunr%pVS(O2EtC#&freKK6> zXMjp%xZ2AAjhA6sodG(PVS1GT2Ap9=k^v?&L(Mn?EHp!{B>UtwBNSgwo_%Dpx9OD6 zAyZsRr@Z2r(y2PdThi0>W^lkxzo5+EkVwCu4F_wODl0gYKeUnxOrrh-N z<&5<2oR*m~P5A1xt6!$^h)(~qWZLwj(@G^>iz5T7Zu-=`^shVV(@^Q(w9~)*Wn^XM z3>B9dAGXXmcxA@RFEb8^%zS7vb8X1XnI%D=vyP1-{3p~9R&GcC^Ghl9H z^!(0Q7m{b~yE4mV<*YqNXKlP`y?&-Yvjb1gzVmeU;ZDng zm7XUm1CLt99X~mzZ}FTyk-3c~bL&IqmX*vcnle}J>6}-rbMHo)-;Q*9^m5vL$@qtv z^NO73`E8k(er2B7mwBqK^L{Ly_c_w+Bd603PS;rCmo5rAw#ZbX(g;l(}73i21BkORXhqoR=h|EpdOP z=fGv*!!^gVD$Sc~>GelTdV-hEEM96ld1;i^(q^}%v0B>ET~kOZ(F@nN`LpM+`X?>M_pQ_XtGB5)=G~Z^$V)jSaYp; zsJ7;8l+*dFyo*|E-@C4TowoLRmdeppdUsYC-TUS7;FaMcE{`X(7M-+eweMIrYx3F; z+t$9-GI$@A|50nbYSOy3Me7A7uP@%Rp6~Md{a@CfTeU9Iqm?;2^2@6HZ(SRB!Zv7V z{OjdC9m(}OpGSKmuh525B^%#Q+IVTpMqjUuEa@BNZ_CTB_EpJVsyMqqxqDOAl1+Ta zH|ciEt7-cgMeCZZ_A|3yrf*$nxO(%`#?2qUY+m(s!v=|s&bOD_bQjunZ+R%VW!04} z%RX)SFS2!s(N?z5tzoOT$R6Jkxmzauc0kh{T5+jZKv*IIklOBXk4?^wHWyJqQ*_DMSow(gjd)e@Ak z;mxldRhM>{hwhx_y~8Yh$4qI->92$5b*nFk4q0?sZOQ47W!1Z8?=GIZdROYPT@KH8 ztv{WXBAt`wz5C%m(cP}*yLU!=?Ot87_x0|XOndy*_Z+rP-)7ysqkGSb&^;mLd(Kvi zt*{QgG+Xt`>dJ8@B3OU^f^2Hm-hbe-DN*t@9$?jkgI-xSx4y4?Qo7e@$Y`GbU%GSVbOsW z(SvG62fITL{)jqIRDM9xCri4fT=vaDsltPkOb;mq9hzBsh);TF1joh?yAO%59jZ}3 zWT=zPcc)q)=kV`|hZbx-%y;SV@~?*_tPeMaA9m&ubhMH2&^c^TQ)6}Jh}N?sXV{Mh z`p9|JM2DR@?3z>IzUC-bD)4Pr}=g2h1#C5#cQo~bO_vd)mnYbPvxk)zh zQ({i`#Z(q{oV=fS^4Haqxob|&Vn4ia&WXi;D%*2Tb#$LvxBS%Vn$)#6)n~X)Z;Uy? z;Bk8E8<|ZyH9Oawo`3rEwdbez|B;v_8Y-DPvSx6eL) z>5bH}ISDsxcAWpyaPiF9+=XZF37%W?=Iqm$`hz)s{|=mc`{vwxp7S4d&VTkf|260Q z_nz}V*PQ=-=KS9`=l}CuVAQ?9?0bPV_X2zG1xX=E(!29+BKkr3B-HXD$7e#X~ z{#bL4`5~k9*^9DoFUs>?Qq;Yq?0ZQy_mX<=CC#;$w9j7BeS1lt_p+hxWnkJ4!SIzZ*TPT-khj=bMoCwy}mc6_uibj z_U7!~>)n4ZPdj^aq3*54zPFa@URscQYvtNotIytQeS6cc_tsk7+narFZ~eFS^2XfT zJJ;UcefGA(-&?l5xA*GaIqZ99ne3gTy?0Koz0?2qwoxuiPyqi|1y;8U7mx3~bG`TO z&9&FBt-X8q?cMvmm*>ec2PE)6&As@ z>AnB^?EN2aZw555+A2I?_Itq8#~N_pqJaYIp92qg;`oIGnEf8G7%DJ+EntzBz5RLt z*QyI_rXMb92Jl)NTvpI~B)gYS_T5FPb!$tSOW!e{VrDt)Y~xVC z@}=RS>|Unx4<2eScsq<}YAY%ze`7_iTFKOU>Tfo#$S* zzhmrq_hQ03Moop6Q{KH?T=zm)2=g`A2+gw*3gD?fck%UwSB`O) zw)eg6I`?}2yw?x?-W}?D_fqcCY`!;J`7VXcV|twT?q1zHv)rdI6Zn4~c=RZaS#!aA zd0(d639sMAy?51n|1R#|hga)9==r|M;bT9(;LVA1Z_e$zcvRqHVFQDE0FO`{kDCMI z@da-u>b>4<$K}iSSUcd8#<>^L>saS+c$n$%$ye_4w+*j8`Mr{!_gG{9!^w4@RQ*3I zt@|v?_vqk-$K3f}ew=;h5dUe_0%r5|Tn7424fx-iz5f&}_u1$DJFEYn4fVfVb@(zt z?&}IWR*U@?qv~I27w~I;c&|C{@#_g}diP&_$$Ey0Cwa4zI+y=h<4POl8znE_L z6w&`$!R}kw`S+o5U*jAe+3J6GfB!?t_suDRkAmxYMBXzVO5i!ZfaiF_PyYr6uZA~X z4Gf_N_!akG)IR@NZy#Tm{3C;Xzk2ju8~l6st1JH1ONOWI_3xJ0y-e8mV=MpD&Hk^H z|Nl6={;ucx-<#(>oqF$=ss5`?@vrvW|Fuv4*((3vhwOjMXZRdb_h*~_6UP0_S^MA1 zy!~5M|9j)Pi_iLhX!AYG+kf%Ng)e$`zu&BXadG}%SNkXI`oB-x|5e)e>&W~6(!2s8 zQzSAOlUdlg1Y}GS7Cc~J>JU`*TM}{ck!z2nY2Fi$i_PpB5h*&p=C5j5<{6mleqo{ZysH6`CGG4>R$W?iLj7=a@VxMa zhPhcHuP*gJDY00ZHT8|g!k~?5skg7ajowlC^xV?u>+fRs{Hy%>?&4y_+-$I8-ZZa5S0?Q(x~=|~f?Ro5hj_WO->`{L@0GrJ$jeMA(3#hX)&E~`s|QP= zieBr9jFPNl0=vI_@;2DN<(;zDqzmU3@a{@Jq4@b$$!FisvlcV)Sw3lK=9=f0^IY@h zo(F$fPM(;|mhO|F)3*jOAEEx*%YCNuH)LOZ9f6)fh}ymvJPCv$0) z_llgFm)>0*7`sJ8_UpYe%hTe~P26Tb5?XG45;;}ptL(0Iv(Dz*sf=9iQ}OHV4u5wk z|7YDD(c3w<*6VTO=~bcebC&DW}4zg+VyN`K=#?%&y)PMiJKTfBZT zQ>Q{qha(HGO2vW3_XpieaJ0B$!rdOY3ezUFS+ludIf6ML^ zU;kBnxBC0va=yUuza8>%8Me$Eat*O%w`R9rE_<+edR-NN^q^_ybp8MT%pPB;umAV^`~P|dwtxm^l>|oK z3I`UofJWv$!lE)i95~zpnuKc}NL_Pa<&K-sBs7P~_{~N~0lN*&@+A*AR$g%A^}Em_ zH0QYC8i&@(6A$J1=CE`6d+79}!Jokr- zhFf4)@RB6awH2;9X@T9*PZkNvZr@^}xn42nP`u=EVNS1rLqgdp$?>Z9 zEc>>?-R4ZEe#weG^?a2@>Y7ds2NSXcA-g0R@1{x$Y_#J!Exga8&0@M zZIb>ju*729gcEry9!~t{v%*Q!x6&)b%5lOfnN;oApI#Bif~IX=lB%0q=^gVdX!`Ca zsrt1)y%X4iXB<{h)1O}8qpG3E>0!_$Q1@X6uSY{3SHmpHwI?UKyEx6xe3E9q_or_` zTkxF6D(RMIEB#8A136qw>UCX=R5e9u2G!#&Y{izd8gNu zd7C&trZjoR{tB9LEM%GS(oEmns^B@#LY7-U&GfJR6}*5gbcM5OR$y<{m4$MSE4@se zf?F9{(xr|tpO~Fyy1w#ix5gvEoByt)h41|px}hy}O|ois2Zo*tiXCe>fkyTh7~cL3|+bm2W1&l59Pe_x}oE6Z9^-o zQ}T9($kG*wn<6CKlX$s#NY)@8}0?;X4ki<`wo<$2?IB-+4MUuXwKa9eJ1U?79U9xf3qzGFW$VRm9VE zE+QXeKeUDKd90dWdA2(4%d+sjuT%4@@BWVaP_%V*_LOGsH`Vcfo`vuKeKlWb!vR)3 z3r4QGx2uJ}Woyaa**?i;gTCdq4GDi%H5)o?{O8v6wmaeXCI@MeYX=?n79?g*cy#zj zEMrD2L*l=z8;AaE)o+ablcap(dZEs;!rt7PWSQp?$E}|g_SgPNR$z}j;jC6Pv9~5g zMLqJQcUsZpxjs+CT_oAA_a5YM*wFYP)U@o(YrQb;zz&xd$$iOc#WT;=q?v3kU!7g& zBK1^&+2VNQx#DHTbD!U7Qc+3d^vQ6Vzt;GH220~Pzs}7;ISlFS(z`C4-_Y0=E|Tta z{J@2YaW};(N_tGrNP4%YIi|mrY4)wRI;XEz8eh+lzP&T*>gu%8)vEYkB|P?D~__Q4@LV^0Kn6Yio0J z(xY$Repa@9@88^l_Uc=m0_)A5GBA}akG}glt$g=&UoZJ%)?9DOymmRVGKrj3ySsH) z=-!L5@2h`Hv#coOvfQ)ao%F(LLo0{xTx9{;HQ`6^zS`z@RJX2>d9gH`@bik}w*Lwz zw8uPARP2ZYdUluO%~NUwM4AUit4|oyuzez302r zYaY*LU|!L$@Nx3;nx~)xMbqOx&wgI>-1dLvh4#2Fi`8pi`qo!nSswRwb$ab<&w9oi z!3|786K0nmlPFnOZpmLM;PSrqfAs_Q_#cPW>pu3@*E~^=|9LvS?lbGfb_4hSy9*l} zzOJpWeUl#l`^NFAYdiPZ$JOkWyRBaT^K5@f$}I}Ysp$d~m?EdBJ}ceiYL z?>O+iap3>sAi(1&DB~!k<0x$7DB^RFSA->NwjFzgqePFRI%k}8?>Onb zank?eWWeKWDC2CT<81uqAe)DCn}qU$!?rw6^hA4{E$28}t#P*QaTc4i?PajD-5Y27 zKh6$0jpEg7l^I-|ZCqS@TwG&Z+;SRJYmOv)JM(6^c&%~q-s9qP#>MxJi{Bd;|35AP zJg$K`X)I8n^5{ZaHV%a__k1y>ZL`<5s}qUieSO zy-3Hs*v7rY$GueNSa{BH-D2m+IY(pWxL2)lufB3rETqLE!@cf}d;K5x1|E+_8IL9% zk7gB*iHnzUTX?kPc(m7ebo6+1&hhA4^+`y&Unu4k)7Br%XPzZ0gu;08Lve;UW;wK zmiTxrjqzHR)oum4*?Y8&0@0K{d`;Pa%H{SdIcpu>LIk-n{r;g9zC9b=4 zT3%M`{X3R(=Al!=9v6m9GCrr)_?+J3bLNcC*`DKv-}s#OId~+-=eUgTr8BxGM7&Sl z@wpn~do9QJdX4XmKR!3-_zLj&*6R4)Ipe$A%6HcV?;C%7AMp4+l<|9XMC+D~-;*t8 zEiU*zyW)Fq4)=W>zn63TUaj$ay~nS^!SC%9-={f#?^Vt|pVIx}h~Fn2|Iar5Ut&(b zjX8h#&AInA=bv+(-yw1S%NqaRd;I^LIe#kA|6h;y_ZEMKP`#fm+`q2)GusBR_y(}P z^=G?!>i?f}hcB(!F=@?RBa5A<)*N57<`LJ@!(QC_3$%+QE^OBbVATy2wha`KJ;xRs zIJG9=y^2ow2OX}fx;(xAwAoKz&@s@P^osFh*M*%*OoFA{LcW1Yx9Lr#HBJ(xnqxIwz`vnr=1a33Ty?>NL#?KKw|-e(r^H zM!E_N!P^8b8?O!V-W%ehDsFl=_p(eVyZ(WI zQja$NyO(w@3T3xmb0kV9>}}vNrdHDzjGVs%N@oP0EV_E0OP6b_j>pt1YZhGbsSV5M z4a@B1@LL;Zm2&w}7GuC)#z583;D4@7A-SQZ4LWvzC(7Ps)5v9Vo2or2=(^5_OVP2R z_D`?MsD?KQadB=9N?EF-6mfk=QrNtLYnieUO}Y_ETf>c zK@PI*)eIW?YjturG}Q)#YpAYu{TorSSErIU#KHDvd2QQ;Lzk|+3Yt1syCIab(KKS# z+Q`|y=UdK33dck|G-A@;&@{zJRqepV9a0+R9XbIPS9ZK&i)3xe6JT39b+yyepd&## zQ+co0gtjkUdcD&3*72k(a%*p;_MSPpCvvlG^p>N3b7P|gpWJ-V)RgjJ-}~-n*(uFh z3b&TpM!6gfKdPk@yLR>dyU}}f!)kORr`)~$Pkv?Ss?;8ttC!<@LpJ$FpPUJ{-9NM&us?Qb+T)96?*TS@{PS3d-uSRnCn*^&i>UscXij!wb2)4 z@80KHdW$RYN^0!=zp)Q=PhYRSd*iFFcmtDzw2S79h&!q4X8i4#$s6}_ZrrQfc@InP zKFW=IyL9dIuMIEO#(m(8|5!Wu_0c@RKivdozWD#K(F}YEZ)?vbpXg%ei}+)kz_sqdecyz+ zq34vIcFqXspTn5)eF@7mt<`B_%+XCU)f|<-DH!xWD7n&)39JOzX0>TWSeu3&(3*l zvNoAzZ?Y|4iep}^U09I4T#Acd$}3xDx4abhx)cvPW(&;}=WkxF`%--3QlxIA_`OT< z|CZvZ7Vi~z(fM3Tu-((yw$1)=Peb`q%_UQVwxxv3OO5hN4cnLMSN7Db@hO|`)2M%` z31-2e$DT%COa1&HmF?@(gt)Xcw~L9(7(H8jt;E}X<64g3YT%@oJ)(m){$4yZ2p3&GoUeb2ji)aX`Kn|W)cmR>z?m1Y|Pn^ zZo!z*xQ(NRExl!1QlVQzfMnbSH7`IvjoW%QQ4$c}sdHY81SLweJ) zj*0VTHM2G3Ml|O6B7cKiEe(LcS(hIs>Rzf zSavYUEohXS!6?0j+Ohe_gu@~=f<#~?M;qA&LOim71KJ7sO6lL%Q>~}`N?O`&t7ZXTi3kr zTTb1#Y`qV!x@NrEP?yVnEwf!OyD05N0tcJ61jF5XZ+A@V*tzWW(z5i*W3QzpUQSGF z*JF5LtiVuqBBxf4q0Hdf`g0t|x4mvK%bV_&_cSf<`Mu{I9eI!37~bxC_vRhb6uG=r zWiKE5y~~NnDNkr#zAp2|ynOk%7X~xlc23LaSoh-AJu3@~w%c+1ataOimR-AV=a*~u zeyv{K^l#bwj^$0{%cydD-<|Ph>NJifxlDHRTn_*DP4fymZhSCS$Pf%?tlf~sE1$D3 ztg%MnU%}e6_+Nd6->2rzJNC5LjZNlyd*X)n`EOSVM{v%MM=jcCK4P z%?b9}9qrW@nsh3d-}`dAx9sU(wDRBW zcPnw;&!HjzGUWZ6(CtMt%1YmteGtqq5S^aV5SGKTqBKrCzas9f(sYjN_e#>H-)rS# z|8p;2>O_9lx@W<~uU-VcKeOxD{8aukdHH1p@pt{+zw|s;7IfXYmZ!WlzI>a@=b%qt zlFiD`FYzwwW-i-bUi1G{`n0qFz4FTZ^M&5uYve1M>bKQC{~q)0d%gad3tPT7)mL=r zFK%|P_*eI|)&7iF$&Zfv6@BaHbh=l(RO@eGU{L(Y!pOn!pF!sn(?lj724RNf+}uLE zyrKdE5<)`KA|kS)qVi&5ieh3);^Io;;>yG$2?-Sm31vb^MM6SFQWAuuq*SD(Rb^yU z<>fV$l(p5=^fWaMb@j}Qj4Vw}ZOkp~t*o7FY+dc_-R&Jb92~tI9lac#yurxF(Fq+n zIr%s_<3r9azRoVbF0Q_=ZoY2rejXnFo}T{R-hsZpf&Tu%fq@~x!J(m{;o;#Ck&#g` zF)^{Rv2k&6@$vBq2?>dbiAhOG$;rtnDJiL`scC6x>FMbi85xloS6&010l~q+$)z#HCH8r)hwRLrM z_4V})4GoQrjZIBW&CSg%EiJ9Bt!-^>?d|Oy9UYyWon2jB-QC?iJw3g>y?uRs{r&wD zCQO((apI&&lO|7|JY~w1sZ*y;n>KCw^yxEZ%$PZI=B!z>X3w5IXU?3tbLY;RH*fy@ z`3n{-Sh#TEqD6}qFJ8Q4$&#f@mo8hjZ29u#D^{#nxpL*2HEY(dU%zqF=FMBSZr!$h z=gwVw_Uzlg|KP!cM-Cl6dgSQwqsLAjJAUf;iBrc_a8iZ z^!Ulsr_Y~1fAQkw%a<=-y?XWf_3O89-@beI?mY;6`0(N5$B&;refs?Q^OrAQzkd7n z?fdud-+%o0@#E*upTB~S3{Qdj)-@kuGXN@@W89Xh1yKh+FDCEH=W%EP- z;h`oK4yzi8z(r1Ntm;lND?Y}%HcQ!yoiPtgajf9;6?2&$kb1Dl!|u}LjwNY6O+SbO#-qzN^&d$-^-pRqi*}>7p(aFup*~8hz)5XQh z#ns!@&D+i0$KBo6!^6+h)6dJx-`hLD#|M<%eEov_{DS=bg98FU`7S63l=VVF!@|PC zBO)RqBO{}tqN1atM@}AGwQAMs)vMR6S+jQS+I8#JtzW->)22;Zwrtt9ZTpTLJ9q8c zy=Twfy?giX+kfD|fkOum9zJyF$l=3B4<9)O%ATMcdg2%;lb$?w{N!e);t2%coCYzkK=j_3QU<-+uh~ft=_5Lh{`|Bml~T{}>EKKzZXy6acy3^1k-drjLZA)B*ge|?d+UK4$| zt9IoEnHw83F4w*BGMFQpb7x+uq*Z zQT+Pe+1=aU-#^gIE$_Ey$H&JfCTqu^+q3iY^9zf;=lkv5_4W0Q&DrvBrM}$t3=w0hix)tFCMllv}ru*P??tTs8eIvibq{K+g?2CHaMp7 zxX0vL#^YX#XDc4}*?fEPxZik^2y`?H_fM0Lc%hiPK`)g z`E*)L*~_QX6WTPN%}AM+`D|v!vX#$fkKDV!B z`>DR5`By~7f;OcVjs8}lTN!=*w`OKIO)}bbVUfkZ%H?xs+}p8o-dv|w8T0y`v@};N zt-7VYs^ZzrtoclgjNn2M+%P%KIE68UAs19A@^f>cbKoIr)5qpK6BTy%GKc6V`c zcXjn}bMtU__wexW^z!oZ_V)Ji@$vQb_4D)d_xBG72nY-e36xj{`Oa>QeK@ ztK-h@+WPwXhUC*k6^e3K=I_6LZTu$i{hxV$)Srsa%Pvm#?=P^;{PO%^ z`?UFUYY+W;FTRUiH?I2I-}yhU%Qk#IdVFrp=d0!lO^i+3AC%p3S=2m=;#=N+gK(hCg$emR+g6V29~3pos+%2v%Q0hgM+K1qr0P%hm(`1le4F@vzN1r z7r3S6?dj>`<>l++!dvyBBWPBw4eyk*Olty{Nl z+qP}{_U$`%>;M%lyLRmcl`f!`*S>ww66WB+gNF_sI(+!>kt0Wr9zA;O*sC-XE?v5O`SKM|33Bz?wQJWwy_p-g zZ{LQssvbXi^7QG`XQ1xP3rJt)&6_un?#u^Biwe@5`urKxqJlK4AnmH}-y!`Oc@q8881N#0Gy z*{@(pAPPyBW6p6PpxA`J?#C?Gj0IM2RU*_PsfO z|5el4*!^X9tIQ7GT9x|$aBtN2y!%TVKlAk!{K$B)e`0f(-0X@&&yI^r{a+JZ_U7fh zwbzgBv$4#5dU`fbKKp#x?>}yCx%ilm16)3Un;U_Qo{WwRCJf8DxcI?s4bV`Cpr90_ z>m?$By?lU;VyH?#L~f ztEd>Lsv4@P8L6uqsjC}nXc%i~m}qI4YU`Nm>RB2X+8CSIo0&OUSU6i*yV}^g+u3>A zJ9s%bdOJ9JV~%&gMVy>{iA2sWe$Fm_F0TGAt^scDf$knb9-hITULoE-VctGrKE5F2 z>l^Ot7w+dD?(ZM&9}p1`7!ep085A595)u^}79AcQ6A>936&)WNn;0LTl$e;3oD3Qa z83yAZl$Q_S!U0q^fD48b$4{I(dGhorP?2!%+_?)Eq2n3g;fxzMZ{ECh>(-syx9{G$ zbMNlmd-v|$zjyD!{reB@-+y@j{=)|k9zJ;R2opVg_y~+1KYR#9Po6w`{`}?3m#^Qv zdH4SPhmRjWfkr*Pe1(jAz=k|PMFhUm0WuEqjX_=lseA}{$gIRH4eEnEY_1p3&bnjq zQR!HRjC0qY=b+wS)(XBl*C(J!JS0hu%=ezI%>#b!joESTLOFYWiaT>SF@4g2nsv)f^8cMkOiZkLx43 zw(G7m`MsS<|8%k1IhD`eJ2pH#+##%uRzC3j{dqVi;B(r!|7O{2e=AL%onIIj9+q46 z_29M1p~5Y)k!4x8`wFZ3))th%ZQUZhSnsXm_oPRQdb#({t@--y;=$tCZR_@I%eb@; zIvfKo3cfM$F{U&4frnxrdnEN zT3Tk>+Gg6?=5VB|YoVuSWnf@!XlP?(WM^XPU}g>~E-bBFtZm$EZQbqcp(TbRjuHbl zLW;A*fDDp?O9?+$H$OKwe|L`n56=KkuRw2~AYb2LfB(?HpzzSp$cTvOn3%Zu_=KdS zq`^5PI&L&n3&2E?cpD`N|b5SFc>PcGc>2Yu2n^vv$MUbsN{M z-?V=H=Jgx4Y}l}6!^W)}Hg4UxaofgC5VU>crtO3jvqOC{K(N0;IUMsF`AQS zPJw$KkdYd2=i~fY=m03Fz_zJ__^n>9ZFvUcLs8dA@)D5v`H%`SZ8W zpTB+i0!QD!e*OOS>yK~WetiG_^T&^0NZpmci1q;z3({23H$f^2K*KRS`X-Vbpy3z^ zX*za zLq*GlE|cxQnKkZ-bT^oOW-E8Y`?>P4BJbt!sZcXmzvj^3E?CTa*+`2Z`yxu;#uH@JA z)6VAgc7JRCeGUA6zxaZnM=YeP!3i49-NbN*A%MXZ+SMRx{Ez`RF68C4 z6cn_=kDR};ThoN9q8i=8s-fQ3Jnek4-Jcmh=_`c ziiwSl8{ShY@TLT4Vr3)BK<;i(cLFq!yB{`?dkFhL?kUJXE@Z$0KJ9`$asi)D0Z*Vn z=TIO8$r;cn#(C(F?}dvOK%I~)sFNwT@7}%p@ZrO!PoKVe_3F)=H}BrP15ccQnh#&U zf@Vxe=v*Kb9?&V3e+-5ODCLJUk1v}QXgJrkMdF|9o)a4vyEjRidj0X(lmhN*gn+vm zveCO*Jc}2dnQ2-)&*enk;&b!a^8Z;s7k=Tt@c#)>(S_Al8+CL2`aJ2&Z+o(?tHGgzsB63 zhn~)v6+}g$lRjc%N>~wiSOPK`gq@U-P?C^<%=;)yNhyOT zeN@1cKB|yOA0;Kwq>rkqmb$vOrlzj8ww|7zfq{XMv9XDnnHhM}2YGzc7Bs$T=U{K| z=-}Y&=;-X|g??5;^OM+>gEm^-SiwC-y|^c3NIz#lRjtz5}?_iov_&-&lxpws`WMBf+D*-h&Kr^lPA3b{X{Q2|OuU~)q^y&Ne@4tTi zf=`>G=6G^=pjO5f2K_I;+&3&Z*vzKSBH6Ja(W#zW)@#oLekJElcFnM!j*p41-Ll+S ze@<+C>@jJtR+3HR#+V67TC$tgSoCrD)En8q`XYWV?M#n#X_NA&_sdW8KQUudJTzs& z#d@ietP7szduY#L>kXQ6%e&3KAWrb#o&#U!PnzPD*4Znm!f-gw;7{i4iyxAmRd4;d zT9EPmfw@HdBF~yxTNSR&ZJxVIMQ7WJ*kkOaR`Yr`zE4`C$ou%noSTJb8o(n5;Oc%R z!+8c721!sx7USj?ha(;y2^f;(<%J+AK0XlQ=a=T^mlhC^5fG3O6qFSdloJw?6B3da z76x@DL_`!}{R#BE49>+$Qc@~1GHP;i8VU-Uii+CG$~r14dTMG08XAV0n#NjMCfeGj zIy$Dhx@Nk%=6ZVO`uY|I1{Q{fmPSTa#>Q4ACe|h<)~2S`rlvM#W;W*LwiXt)R#x`b zHjcKoPIh*nfksD1S0`sT7gu*Ta8~vl&B%mSP{1c|*R5N>VZ%nyXd-AR5j1rR$-cYy z?A^0>-`;)u_w75dZ~wvl2M+B&aOl9n!v_u?K6vo(!9z#D=;$F(U*YJX!yt4R)M+?| zGL3Qk#PQ=NPe2A0PMtY@`s^9-IOBy27q48odgI28+qduByLbP=gNM(bzj*WJ?S~H^ zKYjZA<;z#l8i=poz~cem@PqHD0J2~L-V6YZA%Is+fM#%!FeoD*VX%eG-tt!|7#S=) z+%EUWu*M^Bp?xQ>c2G}6;Uc#VaqF}{8HOru?eFj9nrIp&dQIiCoVDcn#RuLqI8tXl z37h=DcMeu<)i?0v%Vu*(cWhf zede0s$=xb%jn3tKeY$^ku4Vl(E34Fui?cp1S|($q0M6LpaexknGYql}VxWu-nt|ly z6~?HcLCZ4Wm9&@`zDgQ@4GqcI1Z!wDH61N216^HXLqjtY6Dtb~J8Nr4TRRtf2R8>t z4@c0XfR{69J-;ug+wSh~<{seg5$Ns_=m8q#0}b?fcm{iThQN`hXNad4cI4$1;^hrO z-aet;KA}Fop}xMMzJ6hT{$c(B;Q@gWK|vA0A(5e>QDNcH;PJq?nArIE_{7A-&7Z#jycBB5;w8(LEM2~I*@|V$S1w<%YQ>7xD_5=o4GVxr23D^vwty{lo!^SO}w`||KZRhqKyLax|yLh2`)Apzc33Z^JV-WYGp_-3Dxa^4KwGt_IB>fHU+3aBKbY<;&NuT>}jf-nskW z0cgtc`Sa(Hmiqhm??Dp-(DhBwkv=RL8#Ob3|NaBA1PZhW3bYF9H*^^kXdM*pae&PX z`U22)ykOi8Lr}*4ulFOFW8)&nPGM=Ml;eC#$9hC9%SwI-K5?F?Ecz>Y=cGl>Q#AEA zrMwhUJTrsEd)<`q%MX0#ScR9p_WY23W`XurLDN}6FHdEg^BKwh6pT479kKY=9H~Op z9SmFlJS_NHq-EV1-+AyuIj`HzmExEF6)T;YFTBa@>^+VP6K-(VU%B(_@6QXIruBwG zMzs}hS!bqox&CX;H2maoYO1r>xjlu&kp4KhrCq~toI!#?0+f%1xVeRSctm-5#rXKd z`S~RT1SACoL5*!8AsKi+Mrv$>M)lCz+f>QN%F3EJTH2tsRhE|4R?xLoj<$BrcJ{9J z_HLjo?%?j=2ttld?oLkbPR{PmE*{{;1fK5ho*o`vo}Qq!1fwenur6^#YiV!TuyNC- z&0Dr?1=K6Mlr~3Bp*|QI{$O@E$59|k5(+9xSG`x;JbO^L065L@wikyj$g4*FH zj-P*cVnx{?tv*Q!g&eVWNngQZ?g zYLRLsFZu5suQyC}+H>ObqpkgxrD97eH%1*>;H3NQji)b1&_boHl_E}8UtXTfVx7e; zaQgm)FxK^_dUi~m!Bc-FrA4&*lhe(5@0Op@Ok(QMrA|x}RM-yB-y&)7UMWWDY<%y5 z9KoRGk4q(!mMF-x_vTE0nliyqHP~)O@n^4@&`vYBN-kzN#2^aE%0yMkNLd+6znQ|U z3|=OwrK+l}rlzZ*p{J>-udQvMt81jMZ)|92Vq#)u3SJh3v?$2d*47?ru_UC^>@wPE z#=lw_yi^%JgTETm&|bY}?V2^~)~;Q*cHR1Q>o%-kzY(@9h?rS?a32~mi4UE{KXKv& zc>ey(*|X>16Zeo=dvNC%G;x3J+VyMKZd|{9Y)1i_wV0GP3^y+th@oK)BH!G1Jr4@kFuOoaZui+ zO_)Dy%MOFZZrw7Hb-$+-Dxc_6_Ovpo+!XFLl_N6hjChK~zS%#dPHp+IR_)vzc}K3d z&xF$h7AkCK{mD6H!N~%#W{;_-w!A!6z?kt<_|mFZ{>%Su;G6s~e>Tthc>RvQ%Ux#J ztHxfu$0L*=aWK)~PvC6D?`lq}SN>dmaeK=HGl}@VgpfoYV=I;WXX?g-r>1d+ zAy2jEGVEm#0%c+*CSE2cK4xY<78ZV1Rsl9PAr1}^E-p|nnwM9SpI=%?NKQmV0Y1Nm zRue!*-%N%R7J}|O~+bI&raRYN!{2*!^Bm? z)J@Y2gtW}vp~%8R8-{c&JajBQbS*s$tUQdYJWQ-T%xpX?Y&|S(J*;d!tnEB(>^y9d zk-dkly@wqLdD_`Sk-dYb184@{%hAcp+1cCG&DY(--_t9=+b7V^KPV_DBs4TEJRCGA zj=J1AVd##JFIcc(@!}=Rm#?a%T*?VBm-u*Ci z0L;Zs?%j7_@4kbOo;GX_?&#qo$B!RBcIMQvi|3AAxp4gYrIR}z`LkEAUO|@QfHoI^@CV31IjD0D*i;Gxk{uf!+B5tMGbqUjXtu96R}1o~xOo3iFNHdG^s!hdZdB-Aa?r%C8dYx8N6|J`w&s?(d z;$kQLZO#s-pXlw8yLL(e0==<`~m_3Kr3`ZLcm*vhTV1raQgRGjK!h*hng8=>~vN*JUUV@tmAj4Vq(J4zW+*cQ_43y zJXFT!tLG9P@bpl@|640-+zmQ>XB)}xQ*L+_FBtf?>Dir^Yg+dg=sw!2BE{dexjw){ z)W+#R zF)}eRFfuYQFfcMQGBLBTuyL|;@^JC;@$&QY3GiVeegS@dK@buU6c7~T7Z>1D=jE~H z;tXSB&1Pn;WfW>*&}(M!Xl00QXGrN{$m(avX=NxbV`wa3>MY`DD3>T{bM~4TXV{bN zSY42vpAX%GmyZP$6cm=`7B*xRb!V2%%&T2h*swLPdv)fFxdn^*i&nIkZm2EWT2{8L zq)#l2kwJqH%CQe$hVDgG(lUA>3U$?nw-S&nJ2WqxnE#38^>DcGl*Z-_}{BQG% zzk42iI(OyT#Y>kiUc7kW!iDqa&!0Ve_Vnq~Cr_O^dGh4(<0p1_(gbnccc| z`_`@7AaLvU{p)w{gVvjYmYm&(fCmrmgEPyc$B#i7=JDevj~>5#_~hNgr>~woefAWT zd7eE70dVet?zn@lQU&k3gKWHm3`~J{-+lb_@#81x9=y+B@a6Lt@IW-U>kAo-hE$oz z9a_-lykDSkDQG4{8gBmg@6X?VKmY#w^X1>)oBw`a`uFSFzi+SpJ^K6a;=g|vKw0u1 z!+%a0571;1<_;nWp3p`Xn<)N$tMCU(2yvBJbjFH>Ubrf$?ndcxq>l=So|H7$p z9&;lK9=M%~G<=Z%&v8dw^?wca1wHH+GwyVq)V(gyZ2d6&A!r9tN~|Pbh>FLf(ie(8 z_BLis@vll%r2GC9ZaZ$jK;q+}>{GsnZZ<^bt@LmD|Mzi%yj9d8$=ujF%?Y#ge~2xU zwQ4(=Djb%ufnPNImqhYRw$i5LuJs2`s?9q(S98ML>bRe?JKO%X_ zAy23NS$kr^f=w6M?#!@K+C8T(V%EX_J|@)}Z}N|NYTcf?&G%N0Trii)1N#eM+!~Hu zd?M?1onD)*mvj8t!{nW}wyjp~|N1EHtzfv7`OBOeOdP8={z>{dCr9mTPMmLk!(}6&kuGxN@fm~Q-|tq;UHNCeJ=?!;o3;mdzcM)+xSmIOXZ4XkpRY#5 z-8I@8-+!}Ym*Di=Z#OgSOE!9XzOxFf+<)%NM~~yZd$t}hyq%l(PoB>$X~ETBb7q!T zr{ChS*nQ^f-7gonT6R@jZ?x}tKmT3f-~NWjeL6e#{#xX-)Chw`#6F$c8Er=+2t-F{cHcR({ENTS@TP}_%pls zowd7v@R?`K<@@{p{{=V2mftz1$h0e^T<-H-cRkVNKRdmGy|iU7`E1+u$#a#LI7949gAC&Y-bES&a+*`9rxmd`(% zBa>I$Ymu>M{LtayvnWO5+suhAX(kfZ9Cw5?rfLX2E3w;nGfZvzt{*S`I}>;oOB|1w zpvmOj*tW5yv!zI8T|r>?GzUJ(=N`wcj-Bf%a!yWIrLrvYVYmIajf)l7Jw4hVZY&Sg zS)wF<@`Rh!q~txbZ!4>Np7e?e>S>?yMAiJ{Nx!O~u$fmLtGj!i3Yt}9w9w~?X86fd zVY@EruAFm9JKghi)U8Px8$(X(mY+Nw_v@4L&OfL1+da=DNnKVrxaE=I^pj`OW*N;q z*R#xId8TJZ(C1k<&ODP@yYg&a)#useE)OI_InNc%`aH+!k(!gl3(WwX##WJskENmy zxwaozX*~bms*B&{4xOuUJ2F@A(1|nCjtexjvBZB}qi!XB>cYeo!Se-zRyaFtThTDf zWs&u*=S?QF0=t7)77GQ&e^~Lrf8|7$g;K1U&f%wmx^1o~a6Zj&j(9FSRqM#I>e(EA z#ZLk|E{K#GOkFvpN9^*vZC_S+q@M6@bqf)>buyjn;G;zzM>hoLW?7sL?hF0iaFx+@ zRj^*oLH3_7cJ%pO2%ME9ao;IaYxA>oUz1$9(En4GXMTOik?nLV`-D~Cy4-WC9vsT% zJO4{vU$=jK-qc&c+u3g{vHG@=BT|c#b@$4*7dI?nyQuW>*H^!mhl@>jM@~z3lr}gL z>%HYt^n970H}!s%UfUXA{O?hp#_Js{x@T$`c&Dc>RnxdBR#Ld&)Ga}wYd0T1{I>N} zRd2rdp>xZRX2%~f)k<03?RU~HFJD_Zlv!FSbnisJtld|oF0N|Zv@BJ8v-I2Ma@S|3 zS65!=c)_bxb4*)#+16Ei->#lqra58h53wgDvy;!2^S5u^b8!0dj>D2%8{O`*DPP@X zd34L z@9VTTyCPRP^L;T_%(=wlyuorwl(K;8jCeQw^tMM&&#WI~VC#|+`GB*jzg~z3f7^6Ofc5NaM{&uCn^Io- zRT{mCldhiG@-J;;>83Zy*1xBp{Fb&k(&%k^^zCUE_ifv@{qBRD;@`I)q^;b3*!Nx0 z?^&K9Jll3&Kl`q@Z};5~ecui4>%OnLT|Mo~zU}+I+n%cV{QEw`{3ZLD{XR5t7d>F} z-*ISa$A?zyKMyx$TO3jMD|G%BHCgohj$?;A-xaQ^eyqT6dE}pp-ls{k=NPHj?>rT5 zH)G1?KTi$XyH6+keV$dG`poS7&T~_nKF|IA=efg6%M0y(B~v-}zVPt3^5|RlWtsKe zrQ+gGFE97|y3ytDiO}=Au1&A|+MoaTb;5p*%ZL5GE$QF;CWHOg&CBP$%~`+qZ9)6b z+mHRePd>l*T?PBkyPwaMcfH^Hz9Ig{eP;iPCjNaNI_`geD15%6Qh(pa3Gv?_EBjX# z`0x8PWB<3O#^)=O^Y?vTAphyPv;VJ`efz$ws4uu)I`h{x>AJ6nO7_0_S^Mke?SFS< zKU=)cKmWVz`o8Z6rayb%>|c{|IBw=q|9#K<*Z+BDU;X1;f1U0^{lBlaPx^K3e4XaT zf9wCgE1&fH9)G>+LH&Q9%qRVM=5Mcfas9tmf!h^BJKCbbz&MU72bH=1$}Ht9(;$1^q?MKnh_Hk-|84sC3xFL5O8qQauODm)sc4l;Y>n8_D!H&V=0~f@!`1|g zHg=ZQ1KX-oX0)|EWR$z`>$r&|cC}lU31P@{rLqf!XSS%Cm5c785)xG> z+UqLh{wW%Dbj@h5zR|w#Q+q>%aJNNgeqcx63+)bxjww4jlM*}IIXX-Zb}srMTJ?j! zcLnqGA038Hp~OY~lj=)DoqXS1;P zNJh_z6+LHO^jy&By^_)U%%WervG2}~zWXow9!d0nxzVqY*#GK9?^}t!4<3F0Dkdm1 zPPlub@4=70#~S?{k`v_?PWWLlf$wC$(9DU_juV+~PWYWMK}vFx*ujZBEBjeFCo0XH zB}NfD7#vSv<7^qg9_a#HcmDW#gzb2O)zcuudBoK!w@TK&w4jhxe)B`3DNoZ4PF zp>yX9shczUG$&4woXKH1bIQy9X_Yg-%$PYVvv1DLnKypST=27dQKrQ63;gpgaIU(^ zIqw4hbAwr%!e=!X@+~~TIlEx?j?UQ&Kg` zAM%`Yu5!)^&Z<+M;s;;OxmG#*g5=zp|IFtW74n^}oO|RX=bn{wryieMD9H7IbKZQ1 zc{9@Iu^wdjAUXe&<@_&^^S@Qj|1op^kDCm67uf#&oX;S&fGLXcSL6b=ss$Xg7I5ua zz;kN>->(G%QVWHw7K%hI6suY&F>4{KSIwN6Y;wOAD$HUlRS=MhTJ$xNk!jWnt{vS&M~dv1#90 z@_!|pm(l-(KTy+S=O|? zn^V~Ym({*no+dS)zk&a%1#jAg1xyS0`vm4!2lOtA;+Z#VzEA-Ftg89d2|S-PSNKM; z{*_!XWdi5FlMF%!R&~!>-Fj=~qAu>~uQ=xZTKT@R2esxOU$vTN0sGYq{@Gmf zx1VBI7{$LsVg5y{wO6xNU!Ae`2G`o#R`Zv8t^Fj)P#e(O%dqNe0{@{^YuIkBh`lx4 zUQ58yYUPxyl|K~LRDW2*J!{R!$~AwY=FhEK_n&J%zX9)3uKAf<3-UK`&iF7tlwmdF zFSaeGmQ@$5dsDSB&uRnDf{lMy@r!xS|9@&@N7Tm8p6mKPFfdhbQ0v|#{rcZZrVadQ z0&8@n*XT=cWkGd`t>uuqyHY(lT^g3&efAzMuUF@0Nn~xf- zt5sOTFR=Y%=BA6g);M)<-x0O-!^`b;-D?cA87?eXpR#(f>*>YmKc~gbWOJ`x;yG(` z+wDzt57t~hwQBAw_WNC%XLzm3f4!x*Vdc%Ll`pf{eg*U{iR#_KHD5b=hxBQF-rXB! zY~Y-8fOE?)w$OmxAp)y&53uocvsG5_IJA1nAFs_zy>^}Bn!iVD-I8d2&EG4Ryxut{ zde_X^dy4;gt((1jjkor;TiQF)9&A4tz4^iJT@BsbLIG>GomwTdfp>ZLzQfw{-<_In zr#0jMgB|_R%UE9TI!>0GrhfH_vIhVcXz^MaH+`HyfA5yPbS9M^&#-05g zuhtuA&##`a_73-a^EKNq?Am2*v+v`|18ENHp3Po$rfW6VpOw}+hdxT~uQ;`1V%7f4 z2^>?kcAk2@iCub~LCt}AQU_<>+7c*zOuc*Ms^14bbMBb2nt$?ygW_|x#_c}1_4L;K z3!G^N+kI+|8$|7iusOD9*RJDPNB>>A#bNY%my!3euL(Rk+{>-+94Nod?sWRZn%5`l zXRp2Jb!76L!=HBUuY0in!m4$Z(tCW~9O>p>nNYRAtYJyG&Kk8po1Ja8^S?Qok$qsJ z&Sr<%r#9Z%xX5eouMZqK3cDr#9NQ{=M&LAC-35+y-N#R?Sy*-EP(#m}Qk)2|Q7pI){z_)62Pe>(!ofF}t>{T6s2mptVA-Pv0)?SUVT^U!q zQS<;C)2i!p9`OHPz$h+oZ?8YDbH}Lbmgn9pzJITr6u253do}#u+^f;C zr+Q7zm>f*cve&&a_PuSjj5_?Z+&7DM4s+ar^Vg;lU?*03FpJCmK7iaIR`Fm%b?%j>CcZELgGfohY`tX2X?tzfqLy>t) znfKi~$9s3Z?cGhbf;@HtMhXItVjrr+JyMHXEWYj@+qru(>mIzh+2y|Xj>Nuu((@kZ z`*j=6yT`ijA;-IW=6sJ=`aY1Xd+_$|Lwma}OT8y1_a3{|J()A(iSfQirtcp6{d?jl z_tYltiC)~($sA9$<~`Lt_cToJalGG?M7?KIUOctVduG=6EVk}x>bXa`@1Aw7c;>A4 zJjCyLQ^xau-s_%L#XT?B_pIXHllpaSHF{5d_C0O&Yis9wR=n>;=8YFQ^PW$zYnx>E zqATuYOvTG!zZbLiy=<&|K6l>B`E{*x=Dk>&_j2LA=jroaE%1BRWcO;_zt-jNo^RgQ zy7k_x?S8F0|Gn7#u4S*^%l+$G4!(PNIIrcX->c(tEhqQAIk4|lN8amm^IFc@y}iQs zwomWPwR_E1_q}zx@%G-k<_B``tSsI=$!mUA_s(d>yI1d;-rReq_2b=#yrxff@0B9n ze|y*XW8QnI9q<3-HU9heUP$5t)B6UN_zzqaA2{+Gxb}Zwy77VUeSL%hr^f+C$p!4& z47j`n*mrcW&yf50-H$chfn!R+KgN0kE{_1llMb8`57;;Hefp)xTJFHHM1i$>!N=+e zJc|#oRDbwnaR0rL|7WxQ&sOI@+x`E{p#MoF|C7u9&$j)qJmxnF$A1)`|IvHGXTSO{ zf%1(4`@g=s{xxoWU4s0#XXf8h^y|{z$Nqi)`22gz`Rca%AKRw?=+dw5x&LGB_a77bt0vk1ToV3s8h_P{ z`9J4u|2e0>a^C-+Q^bEQ;;&p1|Es6`*NXm%Rr`OnT>rI>zv9iCa}ycPfATs1t>^r& zGw1*DT-bQO_TA6ld&K`7%C9~W|7YXM9sR$Sp3tv7{_p;umEZqdh_8w;V4w8iT=xQw z&H|1d`W%fD&ad9UwN8M0qru;c>VKc<&pq{iY2D0!i}w6^`~Kg7_J5!5&wI_k{!8@# z?e717$yffl|DWNb{{x36R$e)m837NS+IVH{S|kD=xpax@#vPdv_}Jc{gKgoar`Zvk z(k?8EeayBlW>@L^M`u@u=RfwDWtw~M$jsp9e)DW=|FKAgya-t2+AHTeDm>ey@4=_CLFU z10%aif!Uu+!My9=8fb5DWS4I-aN_K=3b1From}9=YyM<|Gr#GYfW3b|z0yC-@9$#h zDjFW6cZB8VZXGkR^d%eJr1Sr9cU!7-stCD>1*%MR=2A=%aAaa+nHm~as5&j8pvA~b zbNP}Yb@A)UhR5Emda}t|fB%zDrv$~P2>KYGcQN)Aus!8}gxgyu*w^y;l7E~1J|3wF z_O|~1WV640=3(JukN>G`32^5Bt9?O--E~W#yL@YjhU>{YMnT^CM@=rbs~t7)^R;I+ z4e_vS-5eC??`nG0((`I?Xn1_9sgIf9kx7>#@{gK^i$~8w#f9t;A@xDmoMEGb##&G)u`O037E^rQb^G$7%c!arPi{D?}9$&xq>G$|Xb~CetCVn@Iux8=39f<+rWfn=DvaJ-MunYpg%4wmWCe zF*EDjt@=*Yx!dpOt;pT+d|9=^&ez9ozuo=$+3q)cf3wYby`Ncq&#Qyn?sHxq7EZ5u zaa6i}&hz8S%WIyU)IR>_$!X)~GEdH0v;Tc`-dX+b!;9YTe;-^9PQQEqYIOVFd)Jef z-@SV?`*`jB$oM#uXLsuPf0jLHzaCccsK5SN#gpmwVU^G3|G!%KV)_2is#oj7uU5U; z&L3L+ZvXKs)gO-6htzyJZ+@lb%k}rcwcqY9zg+v{xqEQkulL_C)&2QCKdAoS|NRsH zGgvr?aZYGpx0%TJPjJTpUd;)O{4Eoh6)hYS-=6a|h!$ftt*x$Uk`%dahO1svYIiKl;-GyJZbo9MJ*h6r0q178nMHAS zB~MC{e%f)!{MpLz;v>n$*JileZCcwWF(pi%m2-vtJ%b6&E>HNmGgrHq8D)0&ELK+K zoMr2GX%f@QC#vc*J$mIExhR(`_8C)@0V23#($DN>U@)Dc$qvi?49A0$~AH3*)I=`7p`>9^eb+=y5$-7 z#+heD^Cr($|MJY-UBa)hZo-_WcOF;a~fy zfBxSi_w5>K$+>R3%RehbVB_@X;y;gjMQ&IiQICKwRgP}rL1S3+fr(}HS<-$tjm|)PFcS2^Gkng@sNdS zeJfno-U*y2Ww}&uYoTvx)}sYdR}cA4UDdexRp{?&p=+P@u8v)MJN%%P`NqDlxv8eF zZ(W#mZOhuJYwMa*R^IFK-hNIrr*!M;2aj(3TeWAI(E8fFx8fPIckI1axM7yao5Y3F zB93aU+psTtjf$l7&BeacHuY8O@acP>IwM!Kxn|3o^lGuFi_dztEZuuEGcbGSIlscK z8*<)eTfW}JEp=(@CfCJTg{yboco#Nx@7G-IM(LOvm#($-sN@yiF1h2OHobROsowDg z(y=|h(|3t&epjkGE%xoKyd8I+DwQ9cZSb)#y!5`QzUb-MagA%I?_KBozIyVDxS!9u z_kEojTk}!+$nSUIaeu$AfBQxHfeh1(122s}G?u2{(Kr=)@Q>_==G~HsoXwLDiOM~1 zHO%qj&9|5<`^~`GQRY#3-;5)lOg?tLo|z>2c=A!*d(XQQ-}wKNJa4hUbeo}L;he|K z?`9n5`uee7S}H}+dCCdbc`qhT%n4N0w_NO7X5_w5=4rp*%u`BRKTY+Xm8!dV%IVm+ zm(vfv2{P=rT$XBP?0a#}v)Surp0z6dJiA&d-I96gxl*}Tb3f*U*uJ-1S^Ld6m{In{ za=uv?f=s_GTskxzwM%~W$C~5 z(&^93%=;e5=1ZTQea~dm_r2UV@@m)X-2dx$aX;fchdTZ}DNN=S?E>>Yu!+riC>#Cb zu&PL5r~8G6qT+Xt8rm6l<=^R&`o5!l=G{9JtgD`^)U$kGHLr+a?VP9I3V)t{DO^1B zHO~{%{P$-I`R-5lu6|yy_~-eP!X*pudp>tPpMRdW`%9p<>5B{HWLNsnZFS#X zwR_dP(q}nyUmG0xbzPh%H{^HBo9NHKZWd22+j_t4ZSMNBw;$#$*l>PsbkX+R86W1A zdtICR{_3sY_s>2qKd9dSp*273f#7_}qx%0k+RJMWD#-s#FrD|Qb>p9>?2{|cvbTMn zTfgYCDROG@`2V+|Q2o#7mVaNDpZNPxU-0jHd8NPK?b{g+Fr;)asyMV7 z9AI|oUt#xJ|K8!p^(Wz z2B(7}YbJ8daS(5DkjQb63~`XMagbJVkl}HV{bDb7$6o%3y}}xM#VPhmHTKFW_9{O1 zswVboGWO~$_8M>OG_Tlc?fGZ-XGUw>inVFUj%&SJ91U7^SlFI9?bJ&VH~4YL;7zMx zPFs2hTaxkNaz|$a5oaTl-4-U|I#-;mW2|gs#I={~>l0`R_2^G6V4Hk`EnlF$Si{-= z&tYc{mhcm;@e*v#J#ASYM_hAU+{W)GW=Xk@LVxjlapOeP6;_VHRa^Al9SW7c!Zod zo+Hz|3mQ$V{P1Xlat&3q<`^0Mni}#8pE$TZ?ZCv8zZNa=^Nz;Zkr@S^WtdC)_ zTyT2Vmead)dR$L#Xdzv7Doft$Qdp{CP#A=1Vd$}$Qy9T8l1iCa`xYqkh51)&R#1yd%flCjVWhu zE;)N^im$Xr$Fe64P7luB`*QX^%ee<%e7P1hI4PWaB;xmA4vXpm=KD)plmt4gU-)Wu zoO4=mu6{#z$@za@&i`k*z#w{oQS}0o=>=xj3oM}*SW_>sm0nGzc2-##qzrYsgm zFWX$bZ2R=G-PgsfC!h~8*az0qWPquKRFOX!W()EjN3H`-fobWFX`nR`Puagy4^*2oR5F)vu- z8QQ#Z4tu+By2czkeV|9sA#%#!_CVRIQKdJhx89sF_2$f_SH-TLMuxbFPuo zSnpmCy?ash?!QZ>cQ3o%y%Ku&YUkRg=+Avr7heZ_twbXv(<=uWE%IRH}2M27MqTHPnX87oO?IR z_1=@C&CllEH8~r5SN7JIUKWQLcOxwBe{a42W9t2%OYi^MdjI#)`+u(9|NHd*zpwZI zvp!%Dd%&pnfXVCuv)cofZ}IUTTH}A*IFZ`sEE1Xbfo1{mp16cPaZP*TR`$f6t<9q^F~y@Twc|m$0q3cu2?ZBiF6JD&VbBXg||J8nD#VsS!!e-i_APG*?Wm{dChze8Z1^kO%QvQsP-&L zj@3xxnbwWwq`Joodt1ZbwI)q_mbvU%*0yKa$DZX}dzSm`S>Cs2`E1V%#GV(bJufnQ zUhMX~MDBU&h9_wSY(9N$nG5c?Jb7|jG?3?CALlxbr?vMU1cp7WXM52gmJuR$SLAL( zn!}5huotaqFWTZ>L?26)efLoQUuyfd7v0BR^jv$9wxWgWK!*2+jNWb0Eo^PQW-lkZ zy_^#Ea%$SkX=N{`x4oP(?d8m6FK2CgIs4elIoDp!efDx*T1I+Bdd0No*$ij7w%y?_ z<4ib{-gx8rGO?$1ZLd~Ld$n@et5w@xtv>c@&9zr+pS@alFYCPSRo;rWjcTtqnZ4fZ zmc98Ovuf-m)xGCkJYMgZ_Il^C*Sog8-d)!gbK&*gXRr62YuzZvwnyyELA5uB%-$S! zdvhf0&C#?s$I9LuZ+mlM+MAQh-kjR@=Jc|hjE1(1j^~wnS=?@~{-vFHP+#!slG)qK zZf~!Iy}g?D_FCE7>uqmuq~-GY-P|y*?e?*^cdos?`|Rz#Z*T9jy?Y?`?xEVdN9S_c z+}=G2%VXR3Hr3$W^R{;{roDT)?A@zv?_M8!_vYHWx6j_a`}XcV+xrhVfllcc` z_YW-LA6U~ru$6ycm;c}~?E~lX4<394X$>EEu7BWt{(5zi%Jq**__W7X`AtmcPO9&Fzy) z_`gr8>7UffKdHBW(wP29bNMH&@FLr^{PYcP43Y*zl+y#2Gr@{e54QciDuUY*DJbKd(JH$DN0PxkCz9K=iN^gi)2v^%?haS8w8 zn*PPD{EK`07mw**JePm*@-NA04L@UNli zU&G43hPRh`h_^>>|9CppMeuB)?EL(*YefV;e0601mLOhs{o8v%j@MD{-%`TArKW#N zEB}_>{w-trx6I|=Qq$YAkAKU#UY54uW9Eu)`Rv~d#J?A+e=josUhMw8B>a16`uDQ( z@8#{^E2e+1{I|S3!@j+Ge`!p7du@My?EO-^bdGrOAC2lin#_MRyZ>kj|IwQMqpkc$ zd;5>}{;b9u4PIM+bRYlGbNxr}^B;ZRfAq8eoFM*l;{G2c7B9c=Yx^Gdb87m}Y2`ns zxBr|m{pZZ(KWAG-eG1FvhJw=GZqy{-KB z_V(X9rvKi#{P(Wyzjq)1z32Mxz0ZH|`~G`B`=0~ie-5huIb{Clu=}4Q;eU>X|M~H* zTz2}emHOLOZNG79`=8Ut|D3u0=j`)8|IU5?bDsV0h5diZFTA;A{`d0rH$T3y9Z&yz zt^Dux_P;l#|Gl~V@2%~BZy*1A=lb8f&;Q>0{`WrnzX#&~9;*L)Wd855`@bjQ|DO8S zooN3PJN?he`IC7C{=VA&@AdJ2Z_fX#c<|=k_kZu7=g6|NKUe?%$^8Fk_y1qQ|9?&Y z|E>K0_xArkrvLxB{Qs}*|9>C<|L6Muzt8{w`~Lqwdq)KmyO2)C2Zci|T;fJKFFq)` zG=5eKniKwB$*t$VS<#ypAC*r`P;#H7lle*I)D*4oO?O_rQav-nDE-o!%+G4)=2(?~ zdc#?KZ_5IwcA>dufiXvycuhCTef352%8H=nL2I+VYF%3swY}(V+pDkIH#Q_4pQM}p zP3Kmp?nGEiB!8?P(dD0BP7 zB=z8RIX{h_otb4`{O-+9;};hexlh*1{blm%%Bt|qd2eSG-@UOZ{qnlGmki$B*;W4e zS?>fk49q93kJySqB~=E|}w z%Ns5(>pZh`+VRDU4lUfUf8pLe3y$xae{Scz%RA>?-ZlU7o<*1UFTHed#ihfmE*)Ka z>FByk$JSpux#`mBEtk*lx_aU0-K!U#+`Ren;lsBtUVixe;WPLw)34vZfBW&{`;VVL ze*F0U?fdty-@kwP{{7RB?{9woc=qe(qu)Os{Qmyn_qT_?zdru``RT6@&wssn_3P!k zpHDyjy#M*3F?j!i0CCu*?IGMOp#^wcC>*Q%MGo0pxPZIWDe z@G3^PGI_s?WBq$FkgRifzw1ygA}x)lRAFxnZ+TEV-3CLv(GNadNs=xA$e9%?De) zKjZEG@jhwiZ3Xi$Np83F_SRUcuUk2}L)xqhc`}^GGXRkkswchn`?;fl9=KKq*Q=IpjE4fcG`jW7*d8(~;kyvOUk?RuZ{Umy2$) zD<3~>S@EX0t4k-&;(WiX+lf98&e9`&?MqTFb=lZ4-F(!&yy6GnB#WXaeeLs74kb;| zPWs`cwx}YbKaFMYQD=|fBIcLP&0X8Q>?`w5teE-O;g`Ra+$-Zm zwb;dL9(if6UNWOoD{bB4SN0bUJWjM8G`hQkcf3=%`UytTKtcW`iUbaZrba&mTdc5wk873T&%VamgU>Ss)qrbV=7`cBJp zUQ%SWuGDy2h2EY@%_B9cXX+F#)yrOQkhH=fmMIc3#(%)9S! z?3Df4GxpTX+u65d>#P-9mag3lxeNnz-W2(#*B?J|;>4LVCoWt#e&x!s>(`Iox^?94 z-NO$a9D4lt$n)pNU%fj0_U-xi?=OA)c;)lw>tDa#{rdIMw{K6seR~Z<&%b|v`u+RE z@856#_;Kmy&yzoY?)&v?+wb4&e*a$b=g+J^f2RHYJMr(|p1*(F|A9-_zkl1nsP*rk z)<1t*K(yi9GMnf~%bFz%0r^w8YDho{upPlL4+$P}TqU9`? zQgZ2nRHxPR6^1226IB<^RuHXS9DII$-QRyNF5YZ=dCdL)j?SlL>)-6PvwHhM_{6%m z@^kC|&HQR+Hs@yD|7SO5PELQjf7_dT=U%3l-MLYecJbBC>Fw{M4t$XMZUOr ztUk!trd^da`)$T=^KkXgw{v5@-H9kHf4C|1u7&2qO>M`MXYEzL!Eg6){npuk#lmzf zH~;#v0>{qy%0|N3C2UZ7)Mn)dMXH3v^t^LggXS4;WxBVQ)6%Y{8WI@?01*Yun> z%S=~353YSCa;>UA!}&a>D0U=P->ER}vs`v}@j1)K8_WYCC+C2V+vs9A%wWKvG#rZ^ zM^Aq{-$?V|EZwMjh2)tc*&DeEkFb`WWh%SGSbl|}{2JMax%>)8`FZ||6H*oXOe&TK zRP@zVrY@{>+gW9Jrb^*pHzR)X7I;1<`rDyDZeEbr>s-#2o;Z{c|l zZf9R@b*%Jzj71ezDc>*_MFEn}Z*047LxOMB+vuDrVzJ2@Y)2AxT$M4@ieE`~LmO_wVgUfRzkcoi^=s#^Ut50tTKW6;fOdvW=jvads*sAE9#}K)p;L>1qSYLa!h|E;?Alp19UC7X z>z8%z`xz0q#AA}MZ=1_agXyQI8zi5qIa&1Z%xsHnts^Imm-#i>Ha|=9(7j_>^6JV$ zYxTSpz6)(cgOtleCc7DT|`llklUvjUQWM4n^ z-xuBx{&hPKO^f}vxa?{`ylo?E_$K4!6BACY4Bfu=)%&k9_8T7t%}Q4PVR5C6b>8Mz zQUd$W9$-CxJ7>3!)vhe|MVn8h`z`eH-SNNn%{haTY9ZrWHJt0$j=CDG^zc+^N zDh09T5A7dCJmt@w#KCqit>R3fd%=^QAN*$FmY2kpe{z&1#ZTtg*4y)cMslcK^PX)U zs#9eSU6*O&DC3)8yvUq!S^<_EJ>vG07<&1C38L*=Y zhIg2#lJQ+7(Hm2vI-AG(A-bPIpz75&gJ{&9lD$H~&4 zW+;4`t^8@8+UG@DpO@->UatRTg~69qMqgGNe_3n#b%Vv%&DLMH+J4(+_icy6x1EmP zb~%09?fh+z%eQ@Q-}bwIJLviCu+O(+{@+dneLETa?PSQeQ=wl^hJHC2_W4Bk$Kw(2 zk43#X68qv{!sC4@_jYIA+Ld>8XUT=_)u*;L9ogJ{Was=N2ezCzcJSiGi??sze){z3 zyLayhmTr(O%vecMt_A!1@89o#|9<}a_wC=m&;R~?{P*wezke_P{d@B7-@||Z?*99C z(?%%&t|Nb5S_wVq(e|!G@+y3w0mVf^?{QI}|-@ldr{w?|UZ{ELu zGynaY^zUEazkl#j52@gTlz@L*|NU4K2ntbnptPRE8t2U8`~ zLA$4u9lJ#h)4q6YQgNRk=Gtd+a+9j#6wOer63@*lXJ!~>zp|+mUU+7zb+gqQ$xqLH z7J9@B`DU1`3~uzE`LE`c$*ZHwLMBG>rhUn{HaB{Aov4)9>xj9j%jdafhrYQrE3 z;p}SnT_!IpUu>u~d#O9`<@KeHE2G~|lzDS|>B)=tUc5D3?p%3e!^z1j?!UgdTRExN zch`KyhZh!VKN62F{nY-#>-%qI8-ZnYfA#(`zS_6mWY=rH&An>19u;zrm+7BO+`Qt8 z&G{GNx75y_w3W91Fg1-+x`<^(bREma;Hc`xFOQGcGhW+#zWM9KV|-04dxK}m8eQPgAe0{}*h{bJ7J|1jSUDn94 zSUHCwDXI6rhQ}?XoG*cKeF8;4JTk?v?YQ6m+4YlDN2x%D!sJ&|uXPl3x!gEkljD;l zUuT-;e#@?9$8rv}845x&(rq)!9lYyyL8sI-dzEy(?JXTn0cXnPH^MzDZ_JybO!wqUn)}f z0><*f%!cBWj4>~HHi-!}2QYZrLm1sDIXo8|QbfT{vmgk~zpXLt{4n&<-fy3OeR^+xG3-j~+dG{rdGMPo8}E@ZtOS z?~p^w{!s*ef{Vcy-~#a0zkgT3rQex<|Bn6pxA)(_9k4=g^}m11{{36<@84W-p*Iy= z?)Crs*ZuEbC#=EO4sP~ANLb?!QU?BO`}eo?-=7vxN%*7T@7LPDpR51AFaPtd?9aP0 zMB@)sD#FM31eCpEIyNL7?F5}EapS_G4n_g80j`L{nh>)|VHQS{=%MCRqax9%;uvS(@a@g0Vb zOYZT=->c-E`}lP4`PkVx!P3vp_iin0t9)Cu-@8XZF{@W;$X zL(?ORawguBdfvRm>e8~hzh;8&Dlg-b^Y^<3MW6XGDa-A*UVc#T%0jFA7mZ(4rQLaN zwaERZY`*)GSsPz`kUD6(P0sWF;?FN7Z|}Z8*U;jJ)WpjX${jhM`f8uQTr8(F!NiTP zLGt1^KczQ@Z4Z>WCbe@Y_by~sbQ4;2?Ox;e#1)F|J(WKex-c0%^JwggU9mu|!{yO~ zE}@ghCDb}BlKgvA-#IT(>;2oV?DBYTuw0LW(jpF}&L6_JCJOjok5Iew^zn^JKKnk) zP8DE1e#3ThO#4Z-*$bA+OZP(bET43%S3LK2|Ot0ep=4{vV!GR1=E`f#y1t< z$p#1s?)|>4Vgk1kS>M&OziZ@t-^BgCh4+0MA7skmL$}C>Ua=4T5+5c?eV8oseyYOz z=}PZrs=l42@phi>n}vq27Mnd^V*Plj)177B*OrHzUlwy>Y4YL48G9GxZJk@Xacbvys-*7DJiV&q= z{uEf(cj4i7(4E{8f(u={MZhQOJU-B^z+WZfxhdt?1P%9@F(->sPfgKHKDFe>r>AFT zTZmq3nYnrSnYm`QT&A2;o?loj+r7x;RLSB?6MPr@)o=x^y4oJ1A9r_`fwtSa1nw$P z$!V`6Hl?ngXFB8Bn;YBm_8#i}U7{DUs_d}V*=RA1`!g=CtCS93cgG_C`U2nBU(;2$ zo@6hY9rpT7zM#Bi(J!4(*DXt4Excgi zy>2_lw*31&FKUm~?0&xO7-Y-=`dXe7|B+W$}HV$3EZMW%{>V zzF+_IfckNT$-Tu3e0FVZZkPFDtKre|>g2)W>Eg$xBvyQ}d~v^Bu}>q?Qgz#u1u2au z9&)70x!vfHX$_H3_WtR4tV5>pNb}>aUq2Ebr?CCY2&#JfL-<~=`>BQPG8J!%XH8a1 zHNV;S=&G}%{X^ZznUyhBC38|fsW3&$_t<>u$ljpqG_y2w+LYTVA1yXL%rAQ4__RCY z+0Bbt$yP}n^7S&0I;KsznU>)hFzedP+R3xF%v?I(bJj}F{>w!3`U?fva&@{dbxzaDS? z^YPBVpCAAI`T6f3_7mobFFH|G{sot!-@#?(`+xsl{rmUq-@ixy{@wrg@6Nw}xBvaS z2`)UZgWHXl{{1@(Za3}+ca}H&`?nfga?bwuZ!)-{2q_^UB&?i-w+w$Zff|Q@S`g(S zdTX!;-Ws&H2yG4igti9nKw5*6+j1l~tDTvtm-|YlbMmuu^QEevv3N~c1aA#qZuOaM zH#f@QmFp`1wQ)yRg=9Oei`^^5A|0l4b5q#)MZK%a)?V1=ck@v1@3OqGIb|F9&hDNl zy{qi~qodW=`RUGFwMKlZ}xwMe?;b)DcD z26Jb%p5Byp(O`RM+8O__SGTukempEAx$V@^Es;yhO1tIvN3RXqf9rb1-2AC`WX^ll zW^I2QJ^^om_M>pzy^VGcZ%b~^*8dcn z95Ulh(D|AfSFX>{ow4E44eLLxCegMF5-#0p_%c&{p5_eG6BnCr`g$ZbUW=Wvuubac z@fli-R&EKk9NRW2bV}_#E}=VP#iIT$QKk&<S{@u%!3u zq*-}dY3(N`^pq}FaXD~xv%k)ji$$k(moHU2ogAK|5}o|(hLB?3j1H$%+m8{E&zzU6 z%;?r$vEWme?lZ%0x8?{l{+yZmhOtX9wK?hA@`Y(>FC|lY+Mb9fGzq3jI73GUxj-X> zZy2>1+ZYT-TY*Hh0uvJxlai8>lao_YQU>Q$pwp*MpD|;`%$YOspEtf_$rA99G%F8&@sbwtU9!rF}=|mRy(?d1Hd>{Z74S&C;*x1>V$hzO80^3!c>h4SH5GzN=sa z4T)AVLQ7Rhk=n%dzK!oghrowk(T|g)K24YZG*|WWLQT*p=UUURo2@}(ntNTpAN2fw z%_f%hPgQ@v)cpNk|L<25sN)Ll#6n80PHd5JvPnYS%?u>rF zZR;v?z03PbTA8kOmw;~t7O&mT7i(Gco#Ye zdvdGu*sgb5vd_H^v(HW6b!$`N-YUW5w6j~XZgzX;Kij6Wz3}mw9Siw*|D;=;yVLj7 zP3-Kftr?f96<;5-jQu?Sy~)3Py?faaW|uG4ea$)+Df9WgNp$|YY0}#_exAGV>#wWT z#W_Dr7aoo*Jdu&?qyN41+S$f8xovz6rc)0`8t!!w?rY@8x_r}kugu{{OMy!&F%}2D zIGs(CkXrmO?ediNs1D=a756$d*cxe_2_%B2WZI&(b0t3%`}H_?L>hAx z9gpm~DR8;lc#ds{iub41|LdHkyo&z#eor-X8I?3#HDk1BlTG23T(D`?vK zncwCw>+idfnYCbF%gl=9wQA`r)6Bj_q_9q2`^z8FI|i@+i(+zNOl43WEf;Z=i+Kq_ z?WxYQGtJlJ>g>!{IZ`NlzF72niNO6*?k8pJFUnb7mBTy23~wuNB2f8(Jgb7-POAd9 z)2dnCfhJbiL96r{x!yN(ziZ`t*Dm<3Q}|u4#JdU7?JnYnpJ>8cq`%Vu>goIPdk+`04S&6`j7&a+jk zSFc_JIv#rMx^?Sz?%a9o*s<%^uRnYC?8Ao--@bkO_3Ia&Ba~5_b9i`=mfjC=Px%XY za^w?uVDQ7ge{aB3B#>_MMev-+;eY@3{rk5I+|1hyo)cLIZtSf9Pm3)0_ixU>e>495 zoAU49gn$2fz$1i^vJ;I&Y6L>sf#8V}P-ppD9cY9Qd1CneG}LlY1>PFm0UI0C{IK|B zv`X-*8gOe+KYCk>XYmrB>88bLdn|*O`*+wB{*$?7_`-dWho;om8CzZkE%S8_yKMGu zj#cUNBdL>*eOP&Ph4j+e$?n^7ZkFDir}?EyQ0G|At23u`XTO^jw2keq-yO5<`Zr5& zvOQv5DV}7u^Phs~s^H@SD)njCZ|Yh|q$ajseKhIn_l}L}=O=u*80tOq?bG&$r(Ojg zsSs4H|EIBW-C>US$UN1L^YSvz>ZlxRRhYf>%5uIXn_hX$zIS$leq{ZD*D6AB(}L#O zU15H1c4|-J&Q1HpZ-4bxnY+uT=1Ko#*7EOZ-`ifEl3V5Md9UK--!p!z7O%+Jx%J)N z;}at5uPENB?R@e*Mz(cIt6#Vp=ZguEM+4gzG+i+DxYjJROhi7i<3jqi)=wUX=GV(E z`yv~;Uoj~YgoXVDT- z$)K#1hmSc5CImQjCiU1RiRA@#O^J;B;Suy8y_DtClZ?c^k{OZzd^U9`wi_6AR!-XL zIjOJCb=ll`d0E$%+mte{niNsHNOb8!P2bR~p^>>qp@V_osgUJN{*09j2BXCtj^Zvh zHa0FUES6c@64lvm-j%pyC?br>SP43ftbx_l9y*X%Jd%HboI(v`HxBc$l4|{(hfP70_Q_&EFbv%KFg3jVw*`t!aVR1kfy2TkDqZU#+Z{B8XQZ4W|< zFL;^O0d5%fgNwe!;K9SK|Nb3f|NoCtApigW577+NM{frH z5P%N`CLiop-~|l^J~=W$pus>@@L-@cXfV(OJQ(N( z9t>;)4F-CF1_NXEsZ>}px5V8)RI6pKb9Yx+<0IA8<@!;J>zKLo zEZ@iOE`4=nZ8m%Uy@Yk2@64U;Gt+*G*(oem5l$rMH-R74kUp(lQ<2qlw zHFL;rQK==1!k^E%URks~c~djH`!n8>w7cfF1K*kXlx&@0zCL%}+|M6Rwe}S4dVDi-+PoOwvNwqjw5?Ac<(5vp`Z99UVxB!Wwmth0%H~)6 z)c2ZSozB-XKZBh%#pmjGvUo@u3kDtIYtjxilQW&{sPWM9Qic0XD~VZ467^)tI1*|U z{~0B9s%mQZ=$#9BrdV<6iBnIj!K5wsQ%*cl;;}GWcVdCj6xkb#-CxgbK3j3Rf-O=1 zOJ?!?NpiXFkw%*oFZ-t6?3vDO{A^+SQ@2yT-+B$-DSkdW;8ML$%M3m)H~hH5_~RLN6|lIkhbH(9-t z-ye;jPVJu-9EDgrcrq8#$L$ACc1#5qXmkGkTLhj8S^MwbR`AsDG4PDZ4RGV|J-EgA z1H8HhrA#A(gHjA)_J%)V>kUta^@iKPz2VQ0-f$1NH|)Uu?Th4=7iSi_^lI65nmoO< zTw``yi`Uh~S5}5@4%^cexH`Nu#<))Qwn2{5rVP$mwllV^y|6X!_MzU{WqPq&65sFI zyUIN8^1hOGrfahyyl0)v02 z<(UK&UJE+ymg_qwd+vj@*LJ?TcXDSvN)dKG(#|Jq*WIynnc2JT-bEYz)vZ(ZRDE?l z84#cS_D_oWm6QMeN$`K^kl5(na7^3z@7mob3s(wCK3{C}b+Ju})WUVg?(RK)XStxU zylnlI_FKv&PZAg8{;S-=oArs+si%T<*|wgFUvsbdHp|5}N6DAiD4lI#k<#F8s$Z~; zw_SE=TYRlbSj8-Z;|tq(yJdEIv^N@FbAK#n_Grh%_T@hXld^2*d9W*Jajm@Ayxi2O zUH-I!r=p=k*NTOcMHwxW>Y^68Et2EZJE7|OK{i9C%;Qn{lgvMJJuj9o*K|Hn({1zV zgwoNAg&tXNPg)9=tk5l%&sW@RwL_GW+^hZW52jGhc?qopG5QZXYTyeKKCI>oO!&2w(H z<(7QSQ^is@N(CO2aXl?(ds)Hq8ZklA6#GQv90hP3zKrqufm z0nmIzujq$9u@4g@Kxm@mhl!FOCP{(TOiz~nI9d7w2+4ey0!CBiK1`GUFhlXfOr;Mq zRo>51eK%X<%^a;)bM#)$HF!SP z3-&H3+qtlI+oG0Di+k2BnYwD}TwLp9cI?;z=?Fi4`t<$#_g}w${rU6fAMiaUWRy90 zwLoT*A?pT_r$XS125#M+*F3Wu9mbp~% z-q~6D?#^24?`Nf)R|Z!`8N07v6S?`riBN9NX)6Bt@6Mevy`3i=z1-pG*}KtV_qNXn zx_|1cyC%Q1S(VmLYi@t(gvB=NkLvEuzx43*bnTbMr}NgjEp#{;BvvwGqFVhw6G5vx z8O1jX%Tt+-mQA~qXxn{0Yu4dolWvyJv)`^Fb#Bf6!)3TQ!fv)sik$6KXg9& z@wjxS{H8*7=~9RCN6uSjmYz(U`lfiA{T|C7(FMjvDpIz;T#BMqXJrK4NSr)}HF^S{ zXIhxuj2rDUyZMXQRHkrO8b_%0yx8cjJX6QrKRL!}iFkbRrH1sgr5$L714h|SK- zjePDL8awrBSS+l)2QJxGGEZeRA1&EPnDfm^iLFf!?9FnYpKHCoz+iWg`tcIEi=`4b z%7pKh^FONOc~-^svYO)+c>UhnY8Eg8kK@&{z5}g`<_0zM+W6i>CR@9NKuceGL_w=x z`ouo;iGS#qc;7Dx+I%}r@!c$S$m*BZi%niEws^k6{_Y~TOA7-}Er>cWKW)pr(lv8y zm&|ToFspm^j0w}GO`~M?W5b3G`}gm^bm`LL$B!Ya`=~Us_YVf( zMJ|y+sjkyBW9?dQ2BkUAlFPL^GBfbG?>wQ}I2NnG7aof^d!1ZXT};}V|M<*O=kUBa z=2^}&o0fR^%IsO6aBvm3_}dj>UH2}v#&V0@HQVf>*_7=4eYI7-_e8rd+qT6k*_6I| z5_m;_ja6=CrQMok-(K%^X;gL(E8%~$a}#r8(3e*;0ur2ietk_2c~NY;;lYDNOEPqI zQVzBrHsadDkz5hlt)8A?c#H$-6b;#8;h{@QrOIixF zm98zFK80mzXlitRqGv#OXkY8h>0Gv=S3^Q$VPkgS&gu!~#f-8HQlrf>)Mi<7Oh|5= ze|e&Jd#cm449i7XMr(7mx96)KDwI1{EPkz2=uSD`!wT*vm7LEjIbK$=y{=+?Q^f)r z(yC?#O>ROOVKuCvg8}LhvksvBYHj@B<$8k9OLpzUkDkirX8a)DZAlVv_kmHRMV z@xv^Y4|CK$%+vg^Q0M&;gZC>;->O<22Z`pTvAa82E=T??9` zz|~pZzJ2=+&?WFYA-BNq*|TTw-o5+w?c2Y9KiXZkec)A?>~S3{QdiP;x>LjO1)qI{{8p|UH|v--@gyw!8pirmiyo> zA7{Xgwr$|jZ9aINUq5W#0$hs0*Yo{u2KAqRG=K&K(KdCQp9N`_X$UNIZs(D-Gs(!C zYhCg2(ZS;FeKAMc_)l(4w#c8ir|hAMU5NPlCEiVXkCz5pOq_dqwkrFsDck!Vc+L4O zcJt@+XMBrm|CgQ9d2u1;bmjkFx<$@cc>`DVd^zg#^TOQIb+B!+%i*SrL=V()5Wu#ov-YszmnP4{3}0eVQmwW{JBhhqkEIy z%4`#vaol%FrmyaCT2aQqp0~FOIsHrh4(r7$|5cy8?b)1~I}Tn^ zLFSp}EdknPH&67+S08b77wb8GR(ZOz;4K}$ufNV-D7ursXQqw+-019rSSz6uEAGFj z4c$9ig#FS2>qp;(0!^hfg_IBE=@bP=Gs`}?;_%JpP*iBhNyYm%AD29t?D$M@%X#J2 z2NT;B`zNGd3Nn#&S>R;x_R3{<5xdYwzDBi6CU|I1E1A@yrxkM1RWkRAAZ+yrcn$Gc z=B13P46>s|5NZ(=6%`d79UT)BLziiTn)>>hhK8EP#+s(4+UDl^mX@a0*4DPRw)Xb+ zj*gDb&d#o`uI}#co}QlG-rl~xzW)CH2@@tvoH%jPq)C$}Po6Sm%G9Y-DQrI>&yo@> zf{q+Ha_Q2=Cr=)K{P+>lZ-h0Hh@}65hq}Iki;0xe@02M5M|Fr!1)%4?A{g;n5@7|QZd{Ok|ao*!QX?HHiUOno6X_w2@wPv># zXg-{-@MN;|vk4Nf*|<*H#NZzWJ5AojdK)!FT_D9`1Vo;p~xr zVxOBkjh|Mkk%wKbPx?pEjB-r9WfY?@vD$A6vQ+WqhPR!$CHFZc6&+O=|~^y}L= z&&Th-@`fRM&(GP*3T{8`k}tom_w&Rx)A-}te(sUUtKG#~U-!nQLN2%1ymkHM=jY=p zK1!|U&6yrL@50SLo3hNJ3Z)!B&s~Yx)wo?F^{7hVMJ2~;(BuGQc#IM2Y7x+i-8#0n4V-VAxZbw# zyldlo*CFt}Tljsi==%v0?qy8OFYO7G^Yzgwd7cDeqWRYq@Co4i?L`g*O| z^Y!LWH(EZ~Z2e@b?US8OFZO%9JnsMUZ0M`YF>h`szrC0K_F?9`$2o7G=Dm4d`1)nZ zn^zTYURS++Q~U01-Me@7AKur0`cU`fW9`?^wco(#`OU+aE+tN;1E{^yT|Uq2gv z{c8ICyZO(bmcM^n|Dw!NLi%JK|NeFU{oD2TZ};E7eSiK;`u%&>uV2f4{o45J*Pid+ z&;0&<`}glBfBwAt`}fP=zdyjUlth+>Sd<}(B=``1fWo164o=fK9s-M8>suZK%&EAT zFXYPbi5GYeDd_P_{OATeY(QegC2UfJl%6qD&lk6x#Tmm z8fAWbeqfPvqm4_a>$AkAv~$zMa-!bJheU16S@26))6sEfJ#nTxcVh2^lb(i*JOjp~avQ;cz&oQJg zE#dAXF3ov0L0vj~RvZoU;F`!bP0!?J$keE)K+AxD@U+Y+p`N8LpE?*GZBh-je0$~c zOrEJFL0;N>J)x^Iz-8Gp=5>tL3})c640HiHahMSdn3Sty{P4+_`Jd-o5+x?>~6(;Gsi@4j(>z6bz0XJ9gs4iBqRe zoj!f~?Af#D&Ye4d{`>_nxOnm6rAwDCU%q_x>eXx4uHCqC19B7k?c2BS+_`i2?p@f; z=MNr&uReeL`0GNmMW#-?$ef#m_ z`_G?0e*OCS`}eOue}4b{`v+;K1Eh!d6TEco6L^!teei(%@qeIg`QMPJCNdVaq%aWtsk2t%z-9jM8a3lEzJ-Em|IhN#^csf?6prF5KMQrQqE3 zrpz$;P%H1u${w{%OT8zl^3Qv+;#1_7Ougcu7Rg}cQ+;O31221)D4d^X9K22>YOTh_ z#S*D`AyQMKf|u(roHd8*%d)H45z%t4r?xJ;o|SO8O-A~v`q`!NSJz$D`no)FS?1Gs zOI}ZVb#ss4@tNMo`Q&WMUY_baeX?wI?2Zi8F6Z#|n^I4II@c5>N))mPX4JKlG_M&I*J>cf3(`f+7%-=xU1x9;ex{e9_0(D8n` zi*x_}p1x99tm=~|OI!s*)HOf93rk%tHtxH-@J>@z;1l_#rFRt<<}ig>1lCGSQhV6; zqtarc<^R+O$RfZa*DVw%{;+3yVtaDJ$)jP9+s^#e2+ZGfHR8PN z0m;gwNlQ9R*s__rxthxz z@(*!dno;sBGu@+fTIBP2HLo}`T#J82zE~i5^5ybrJxX2y^DFqis4trA_3Fi9p@}P3 zE^GFSTDhPg>{sUEYB?#*6^s96XsukcENl5fiIk?Q%=t6ovRwufe&WO~`u9YM9}GKj;>5|5Cn1IKnKNe~@4|qP5=;gtXHNfBh{ezUEkHI^<&ck-a?glSuTLLafA;bQVmAxI{6(bO` z6H!#Yp9AlSIyJv}aCUS1`?$T8@2{EOc_Hv{S0&HyubBO??1e)vFW~TxjLs^ zi}>cH`^ycvm5$83oVI%g$IZ28ey(3?J6U?WB8%sijMEh|Q=M|GHmKSy;aNIwvFFv5 z9`hpkuf2Y?RsQk@wzm^=Z}!JsYUcf2n6i4?!fQK<{y&ZM_?~-fg6r3Jswb|kjosML z{Z3YA!rPmzQ9HHHco!Jlu1g5?dunaqe{XNj`l6UqkqQ}?a~96C(I_c;eoV>syY;Nk z3C|8JOFaJV`{WmnCwF|ECi`>I>bDE0q;9YI>CX_^EU&MvF6r1%`aFfzZBEDfb4SIc zHg>0nXG~boP<-QPzj#I7f~v;%*LUZ~8|H=H!2X!A}(_@RTJHC)><7)bm;4H!xAy>opO8imA&xOwy68m=c~L}4qx&k0MfnB3GoDmQxn;&ewi8H#izfyK zhAb8<=H*OGku1!5jEqbS3=EuHT>OIkg2IAA!a|bLlA0FUCT2!9HZ~sa9-+a3;i19d zVPUZmVeR&Qlg-knm>12`OIppu+r_{+@e*U;Nwo>ff=K|4zU7cjg6%JpKIF>E}Pry!dtY&7X6hexLpJ^TMw`*MI(g z`0>Zn55Hdi{QKn(s1<;v>j4$|3kQE-;P>x8zkmP!_51fPF!=fF*Uz6nfBXa=b^GJT z_wPTxe+M0T`|bPpZ{I-Z>$h(R^!3|UB=7|Zd`1PIkibV6`0(-LhYt|+;lqay?>~Ha zj|$$wz}vU)-h#m!FnIm?^_w@Z-@bkQ;p6kqU!HvZ_W1jc$AA7j1JBhx0`J4T`S17T zfB!Ck(fNO$PyBnc@87E(f1Yps@oLwn4@WZ1}|Q` zc>esw^XJc>K7IP+$@NnUAuPm>eWlvuAaMd@zjH}XKtK4d+rPzoIG{r#Hr(lj_f(O zf7SlAYqqUgvTpUt)$4Yw*m82=#uHOk9PFC6qksO&84DIonKfh5tiDOp+PnKZn%i5d z>*|WiYl{oZvU3WOGV1a&X7;8}nwvIbdETTo+0`5Ja@H3FZz+;H*vx-slFZe)O3(H= zy*lRk_LR?y{qeWAlCpqKi`-Zc#b&Fr!Ik|cH z`S}jbT(VwUR$N@{F8B<=%9Fu=vr_FDYpZi>@==a8o3EfAgR>TzX%C5LvBl~Q{<35{z zCJ!C#n~vOVm1s-9Rgv*ELLkTJ-gHUc{{@F;37pWJJhMKi?6OqR{ukfR*T&vj=AX7H zv~sCKa@pbNX~!?jcslK}$7EiC%MP87?G404x_XqiO-q|u$Txj~L;fYs)O>}1o#{pF zazE5_Qsic&ng`6f+1nHE_c>+CtWc}7`r-G=U$i?jNGzJPV%e%!t3+5U?|S}QSQ!@B z=AP$qZiT`vN@|uRnQJ{Hdv#-l@au)!r@F$qBf$?ac-~1I>W?{}S2( z^O$*m$(hy|ap^hgeS5{!cgyayM(;_X8!L7M7;VqVIa_AUyZ*|N+cG%{r@GfIKetKi z!vU7_TW=m*m-i&=klfK*cU`v3JEpig=+c5m4wF~?)Z>?&@33Iy*RQi8bEUtV869WT zy1lWN;gjRzZE<2O4<_lazs7q~|L~l9X>zZpd!90TY_m33>AuaDQ!f^JI-hJ&yZfb1 zalee|RL$z>4_717WA7bOhWbnE|@cHIZgr+LdClxd$Wnd0Zn_w|xVSJV#f8+uY3uFWZb zw=*$ja){zYz1H3*A*+g#Zm-*2cRKsl=Y4s%vvvx4tlA@ee_#H-*2y+{XU?&Tzw4U1 z|IND%f8Wh6Ugq-u-j?aR_;V{Ywz}>&+%n1j-mh(YR%g6D`h0K9_vcTh=kJSInE!pN z!xD3mk1sQqa;=3ooY{*b=O4w$y%zm-v>*o8L?w=G>?e$%F(xTjIK3Dh&r?m<_#>$cN%O%<- ze7~vXsT;%ju)=8HYL#xgf9;#1_}V>=D3zUP>n-dN^j^d-z`E2T^5?^iPD}V7>wN5r zII}2af`y@O-Vx8JTQSX(O6UKm_}G)-vp9Z-g_-HDkG%ywi)E%Ca+5jtv9IFHV!7`( zCR#1(>u=y$qQJh=-Tqkrgbtr2O5!J-oNu*EoY1pGMSZ50yVk@>GtMkgGnbU~F8VZi z0nbv6+mB8L&iXWEg->dr*UD32yFN|bz{07W?0Gus)~9J~GgbAI2vu@OM*e>w&6ER?! zBV3qfsc&?)AS*@wb&7|zbCX}=mB|X<|Aj2G`>rXF=B76P+nzL6r-OX|TMo^=FQVbf zFiW7#?8ri~#uqN%3i)C;9-hNKQN#V+$$;KZpBL}_qMl;4Dxfn%IN0*z3a1dMfR=fi zmq;aMI{U4XF8QOd*kEb8r{}An3BO9FE7kJ2ukZA0n)X=6JokjjWG{im)0EAxg&Z@E zUC^KLPkB}F+AK>0t8+zD9;|vbp)Iuf^O>BO;Mo^kUV5><3Te(0UX@fu`<{{N@ym2UM; z_?z_ozz3UEjR$u|vBhuSdEI4AgQ`s|`|@u~Z}@Dez8V<)C7|NK6VtVGZ$vXS#YJpo z{5L5{H0mK!y~JFxHjlcW(M^}+vUYtvyHV?X^o&177DxGZX8TUQ^+-Tk@|fN>O|`I` zCv4hVR%PX8v@qM;6}P{+VcOfGulf-XwlQ|XpG z+1~UiMt}Exk=rvi1zy`Y&-7&Sp&v6=@V9Z;@J5|&YLh&dqGwR{UGY9Evz7U;6&kgE zd#*XjZ{OAySL}Ik&eKMND2~rON6l6hUVe3L+W`ZFWX;R;}*rb=-qK6>2q(7eaJJ+esk%R z^w|S^7HX}!AC{abQD@iRafs3LL#w#zL(Q`*53Bo~XbZN{5XkpDrhl%`Bx=uN1^%5U z{yBg8IC1u$CmQV@Cxg#@nzp^>sb2riGuC{cXWstvjB&l?x$<+x=U?r4?!a$lRIm4C zk+ke|7yDh8rteF>eD_1YPyenf%`?BOjQ;y-!Wye<+s~D@S=)BT^6$Q3zw+zG*?-?e z>R8{pe(sxF-QMop{@r(`|NLfl?(e&bx}nx{Cgg(X8v(d`rn7inl_Kb z&sQAO*!OWl|DM=adG05p|9zTXY4gnd{Lj@H`#vw=-y3MB|LfB1dFo5-_r40RpLAvO zzpoqKD?eQ*_xslEc^d2X?|oOke!`v4|GppiZu_CVzWSl?{~znk?LJM^$ZpbI_eE96%ESi4IDcfWR^GZ{Al2Q-XLJnctEXD zq@vL>tx;k}qy5rGnIDb6pEN31G#yuIQmJU#m(rxMqiOq+CY>Km-%P99S(;5ciuEFz zEiAmuXEfWK@U*_s?BL;PFVW(1!oxYD#UrB7=!b{rjTYhZ7C(vB3YONOh}Hs^*033^ za@$*`FKLbA2#Wa8niS!ZXwjDTqHL+6+0^p39FNkN8*K$I+A=xpeI(k;ZZzdrv{!j} zr|xL4TcK6^qrK^ba-&5@+Yg0*trZ54LYYpbWW@2oH3(w){f3O zH#+D2=v*MtwaB7tNkrGOimnwix>oJzT63do-H)yf65X3Dy0=7hZ>#9u;n6*Dh3C#2 z-TQuYACTxdWYKdZqUTse&xsj5r*`z5nbEmh!*dP?>m`fcD-pfdDtd3s=)JY0_s)&p zdp~*~Nc26j=z9{;_pGAt#f-jJJNn+-=zI60?}J4DCyV|s5&hpP`rl=6UkvCyzr$lz zMQ@8oG21GQLJ*J#LS6OJ15HAoGABm zqJrckCCf=Fk(1PRPP{0<%W|{7v!(M&#Dq|Rf0K|uj&dD}6C)@p; z>>xSC$#RNI{D1JE!H`oR;@7d1zLl&o0y8IB&YTiCb6Vxh88c_j+BtL1&6)Fl&Rifl zYmw!wC6Tk1RnA&5bJnVzv)0_4weIJv4U)4rS2Gba6HJ@=C}Nnq|J%ehw~=U%Ivdt>I@TmN>>y>oN!y`OU* zNX~m?Iqym2yl0j3Ud){LYUjK+H|M?kIq!qy{7;tizeLXeRyj}8bFMz4FiRo>+eQfn zsRc|{3s|BSuvIPKn6-dQYeDG@*ApveFrJ)o<|OMm&AHhH3-cx{l-jjW=GH>FUkeqa z7AaXRQi)omR<%fD)*`K4i*#-+()+c@Kx(m()nb#V#b#BDEoLpY+O^o`)?&M?#lJIE zwr*PB61BvwYKceGg19dW0t6O@ZkRJMa$!=z!t4bLiwc%T%vu_?YiZ1_rE$NOCP*zy zvRalBwJfb_S;nkoS-Y0y+*+3RYgvKR@*=C{B~i=Es+L#GT3)qld5zcdEk^B3za$uU zE%`TvW1$e&Owq1|c?C-=F082fuwsJL%1Kr$r$nusR<&}*td+BNt(DO{8qZNkXD}1F`g`}1S zM=dRSu%e2AqalIg)UGvWZml`@Yt03zwU?~cUWrObw&(Q=P zrfi<$1w5w5C=L3)#t z^(K|*O={JfG-hwo+Pz8V_P8sU(%85%XW^cBtUXZtCP3HuTo&y~H z44i8(aIJg5wLyS;O9J=y2JW2`xOZLP-Xp+sBw%Y;_11{lTcdVwjk&!w?)TON>1|2Y z+ft&prB!dsn7u7)_qLqd+wy*IE0Eq^WWBv4dV5**_KMlttGu`WJ~^K=P^v+CN0arA zmgpUA)jK+7@947L@o%QP7LRJV?v3BfYD`Md2zrf{ndyBvH*5H5MTdQa9y|sJqo!fiw{oeaPdfy}K zeNUqIJ*(dL(3|hT>+SW`d*1!t_aS-@pH=7nUrRb>apx^y@43Jg+sKmmaQ{`t1C5FY zLL3j=X=mY>bAW5l0iHVt`2HLakU1!1b5JDaAdk&{&kIYwc`r;_z+IHUaq0H{|Jkx^ zZ^TvCh^W`pirqP&=DuI*%pQ?lYv$c6)gE{PsiQHbq}{ z?~&QVwufQwh5~MjKcWsglKy|h0(C@!YigYK9MGL}@Br80;8$!16F4RaaPPcuBrfo1 zd*ZR|#$$F1kL@o%$~EVx{uLe4=f^mCjz`NJ zKI+BO^MGs10`8PMCoVFcNUaf_kW<~%b3k{^j8KM|!Br>vHyqisLEwwPsYN!YzBKU5 zJUk#^c#_-j$m*PvJccJ&0uSl%NN##_ika~=XW_v$H3B=<2x;mZ+|F~5>Ep5GK6O*q zoU)&K(D&5Qyax6v1)jtj?t=`c{sf%8c834>MOm1g{?8z4zy=@?|a?pHokAPAM9m z*xMuUa?QDIHfP@SoXHA2z0K#$PMh;@*9g3>5mM(l9no`c-JfHBYtD-^o?l;n#%0aX zZ`Q}p#qeC}=04(Z_Il6Rn|Jtc_Xs@NAaLiv)W87VqX&5Z%og|}aPg|mMbTVA@xSN( zPxyD9b>SuL+VlH$F0?70XYx6(VSC2l>}m5@p-*=%{o8$dW6t>xJ{Q)cUr-7^!ufX3 z@lzMdb$A4F&kC=-4J>+3t;O(N|zw@9lF93`GnFR{Y^-j=S!$ z;X(13^V=)EvWm+kDFHOCg5*ty^y7vr@zclrN4xHtFj&98e|zt?j8e0$z(?Jaw~ zCu?g3xa}UO#NFN=dz~xpDgU|K{}-?d7~Csads{N^uKU4GqCvZoAHN5v~ z^aa*mANZCmxL?qF!0z0=ws`^_wKq5>zF^w;;GDpn{||1r+1~az@N}u&gAKZTE9@99 zez^Upf#p%c4e{LD4-y_Q6>@VcuwSr!%`EVG+uv8+vAk`uy#KskvE6(1c<$j#Z=WUp zdvoOMsoiU@Tl79qwYww9CzO;|RXk6y{2%}Qe}eb^-falESI76_CGRO;xhL;xS?BH( zxGTWgm-l4iI)2Z82Nd_d^Q#kZx$ypJEH$zgC?sE#`(?+r)J?Ohk1dOYCS zxbH)R-pB0>x99O5*nZ&Ee}^|54Y%jl-QFO3r|0cW*1CU7xBulo7r-m9|KZtx4^G)W zjeGmdX#KP2cdkvf`@Dz?3!zb`TqpFi2>?)m?@ z_xyLU_80x%-}}vX|AQRs*L7bL0$3jy{G4+BUEuncow6TT6`x*xa5J<1Tju%)907dl zx&lYu@dVj@i&Eedt^dUE=UeUm*W2g+-f{MOQvCOheK$VdIX-F5qozHNoa2Rz{;hld z#P@OSx-XV`KNVzu`P=hP?|(6q|KjZne(Z_ z3bla8`?Dm?>sTa%o_I`B_3d&g3VP}_O*gj5=V#C}pD8A}_m0dAe(pEVw)P*3)D;z> zMXtSau3lT7GfebpwNieNqa3o*X>Ht5EfY^6jlfkg50#Gb$~m<4>|8YUbi~QZzrTJq zOJBdgXQz^F-y5-`-Qu;s4m1cVAM>)9^ySXJsn*-yc_=Y=OxUw~qLO>tb^#uT0`CV$ z8JXv}{=34&$h74g>;Fz^1-&l}98VO~{)h)J*nE!JXkFglC}Y>IY1Z9~dv7L$J=)kU zpROsr)A#A=x%TaHvA;^5c&?3(kBY8NUp>$9(lWWYnsaMo_qWMLf6KYGRpqu?pZ59r zHoH}K2mYLGzaim}@@*x*o^_R8RXm$M%#zkW*e?+BL5oc~M!<{(^<@=@8l=}n+--VqJN;D8Mvq+s9&i5*5O60Y& z4eW`O_c!Hm@*o=3(Z0}m-@6|l_>(XBP zw^H#U$JO?Hn0q?Sy6~vD`R%vQ^PY+%Eq%jgp4apLm`!oz?`wN*9I*a(yx^j%`<%kd z{`R*Ep9h3(dU;a**t)Oh(wEmppUYnVwRo2M^Vm0+0@?4CT%DdgH}Yh#lx5k@=g0O| zKJVT8w=$yi|E}`a)&FcO-rkhkXSJiZT=wU6?f83{FVDN%Uw(1<{*+$_*SF7q^Y;1k zf4Mhx^zD}IK6+oE=G%Yv2eYn;AF$n-ulvz?!P$SC-0j)emQ}N~B(P+gJ8+&m*|5;~ zj%D3~iPdu+i@&{)VEtgb!oPjqEY_Xl7@;jh`$;^P+-zS0XQYSmN$tHgO zB}q(nD-r}+JC>~BH4I6T2;IV?wu3qC1H00ZNDlWE7NW~OwCLnK^m0jb?!EG%?c&Yj z>?V_(m8V_okzMpavb)6bqUXjm#VL!}{%`ERIPpVHsED(ue<7pfq6;ne0~$CVENtLk zGNHdUWDd8hQdcoUpn~ZVHy+;){60IJC;eaX(A-9W#b0KVx+#m2#@-H3|6|FM7V|8Y z3f<|oddbA8@=1$@O_TU7>@G6uZfLhmV>o)~=Ea=qo2%hJKNdCRyz@_r2aNWRRT{)bsmBgRk2>fnDgt3plSOYS`YLjatZxh>z8+_+hd0& zPpXHr^rI>LhAEEsCkeT!JP}xK_9n$3@_>i@4P~k46I!fVtwL9YU0oG^G%M`=6n~C) z#bMtVvLlXW@n>?hEKGOJj=H)lY#Y;+g#uGGTy?twdyB3t_Ir}5>&Wr%lGVJDR{gz7 z39+|=Z1noXKde&W&U@u5S0uF3cJIot%QJgQI3BLBnd=y+Hk;3Lg|g)H4Qs+&t)nhY zyS63xsTSj2E$vNShqtb;U2A*hR@kj;*S2l0;@(FWf(CT~dGbNpA1w z)SeF!N0a1?XEucEnsZN;Zg#IUA>HoIMix-EUEc1CM>d&C_aInfuS`2s!9D%cqofYwmm5b-0t| zp9I_1V;_$e_Lc5Q-g9<(?bp_;wI5$c{rz|SguB}&2j(-kyM%VEJLs#xq}X%xa^;NU z;m3-mZQYZ4<=2nnt|rqaw8x~>zdOt{*K=8vcO#?tkI%BVZ?etiUDeOHq;kRg4-V1y z1DWbyDWCWJ_k7aRS1AwfnVt$>QpCJ=&f~|9eWxw>;`cmLd)XFhRXOFD$y2%7DE<1I zsmFzk>rV1?)TS&r+rYrie?{kc{kolJ*XdNGGp9FSV@+rZt@Pd6Z1_{#abWu^=M zYQA8+y!AqR-~B1Vxi@^xZ{IxM_O04_uARbutt&t0uGP9D_-5O;UGq15D|0w__Er6@ z#VpU%GIlWU;^+OhVwZ?yz}5}FJ>RHF-#&0+-@HxJ?>@}DVTb$$XANyZs zJa4jPI$!BRzCSgr>{kzV&MBC|d`M2Yym5{GxsMy770&;v*s&%vm!Bag=Gppf4n`Nx zF-N>!%<{PG_vyw1pTf`Eypf%6y3#i`&u+i+^FzzF=g-f1vFQ8P7q`8uYNUNjPxY6* zn!0|~)uruU{WE3Pq`qB#=wx2DRr5dD_f_@Q4j=!OO)Njgyjs1+{;gr*{=-pU8Vvr} z$M5T&_WRHCg49iq`tMfUd-?mLZqK(T2Wu+Nyq@v%?DbX8<{$s*TNx*{N%i-Or)vuK z&ENO>Vcg!;`SYvtPe)m2uK)Y(_TBS$eouaS>BX-1!u}b%)z1F=e!Tu--}=3OzTf}< zpZx%X$N@%`1573dm|YIAgdAW^IlxwOfW74a$CLw{OAc_ou@8{mbYs`PzmxX1SMT2C zy)5YW?tR+3w`N;k{k)rhOT)(Iy>(8@W?bHxd)v~%VYlF#tp}v-Z%Q|8{Jit0w3W(@ z{R$$76jcr>nH*AfIiwPDNHyh=fR!_2B2dn;5JZS8r!}t)cnku-%u#_AEyn zM2O zsu*&_aJQ3(%h3>-ZPq+?ziuB6Y&jZXV-+yvXq1mh)Rve2h|bOv<;oyW||N?m1d>#a-+1@w$I0bLw5(U(TMu z&2+-CrET-gwk(kos%zNt8cuY)Ve44Z+MF`G&BrA7!inA|9=QQ-JzGv}`FK=N;p8Nf zlapl_GgUk|4Npusq7<{EE&D(#TNGPT$Hepqk4zR%l_zW(A5N}oV6t4%mh_;ltK{V7 zo1S8q+GG;EBnrHi*D&_~Il4sWP{oE*tEaSkUU1za*(iUbas3~!NngA+++h?9I5{i4z^-tjjqe46_yn&wmXm!Mr~h4f z(zdlCG(g5Vb3f$y*;LF<&}9^8s{F_oMZJp z_cZ1FgT{7_sTV2^wAXC7z|lGK$d(boVz{Agj*oOLhuW)Os#CO% zl$rF@aQtiixFqO#(qIbSq7t2#}1b5bk9 zNAzyc@sf+;y%%EyEs2yFl zB{3vo?$yWI7azDRirYASCZ|Z8&qdMPK<}f>l1qKWcD2cUy_o%hRUzS8+Sk_X7ak7| zGG|z{g$uOrbCIsS!N4~;R9)3Y<1M?+(xCSut(7}2X+Ayo$>h99?wR8~XHLdQ8`(-5 zuWc}nm8seqZl=qY{jVc9+o0`orhDLuV4JhSwpRnLTx65@&|1WB#jfCn-4FJB4Mk23 zcKc7)F0Z_*P!gii5aK!aiq47<3DXvLjy50HxqhyZ{&)GSZ-g06&~x!}U&nJXsI)Pd zH87~QaaQV8p4|~oUqwd5N*~lZ6fN5?e0P7ugSKP=r&81N%Sss~R7DC7EXw|IF*~Ad z_0d~vTCer;%u8-y%NA&N@sQ5$x;oXXZGO@vN0#tH+3SZtv=`Z4*XeCaczaT4L-g*} zGmaA@wobe*v9PU*^^R$*bj{lEA2xP%y6o8u^BP2115dCw-3{6C;PUdE8+H;G@-zap ztF%&Q892>SOJ1c^+Yl*ib^Bic>oTWbiyfp?X7KW`6vSSSjd>e*#$)c4gwjBXxhoI&v-p; z(mim$!dK?d+3QBEcdA71JT`9o`zQPgXGC4bo#T6h{cLYset0792YWl~mCOqqj=dX% z7pXm4wJdv6yVIriB75z9>}FV=$U(V zKTkOKvP(N=Bs^I8;N2N+@uy9@_TCPwdtw+WBWU+fV&YT9n3lhDlB}Mxi}STM>fYd< z`|!cWM45l>nH4uWo<0e7XrKN|GhHffxmEiE-z3|tXNGEP=D9Mwy%{0ed%x^%6W_nI ztU^|g8%e=zJ~<7K1rM|x_>+{E`shH=%B;AR5qJA@_MI^QXXj~k?RosJhUb%>SMaH2 z|6AQ%dX@Y0lUn7JR|ZdNt=q2nJgI%$wsUV1-@5yH49($b3ager>FrDLwv&y&(Z=_o zLC~QwPdB`6Xr>NeTbAhU2TzSNMuCZ2iGI_u*3&&5adJr$CB_;*FB(vhb(Lg&QZ zOAX{`mFTr@0h{;?w&iDEY8h>x#uQiP!B(<@<@~J_?%B^%mSu_EdZxQJR_EWd zu6_6Cn59>Fq)$qDu9Ek>Qg6*Vv8>H6y*BB13rcuzxD)wFG-LfSHO}s<;w|gu*Y0VV z*VpQ|r7i4iyWf_Myp%6KzSm4{US1d#zv0d4V{guUW9^TdlYD`V?*_v^K8Z~J9}Sc2 zq^mua+3aF740}8!?DkZ#r|*1vg52f?KRdT)#fv=|so`#~H@}SD^7G{Zj=U?4Z%(A0 zef*9s|3%y1FKsL4US6n{C4TJkl6!K}`~0QNp4l0+)OTc6tc!T*6y8EqlC~G4S>g zU(0)ES?r|^#R|Bq3mEM~F6O@dESqw;kMGDarK4eIm)PzKIrb>j?*eOY6WiRJV=n{y zo@Ja1li`2Spdgwna-vc2M}wHdZ0ma)lDii2?O5dK742B_psiPE8&Pp}TJh}3 zfeT?Gmo`ib4Vu~YnRTApv)a!N+X~8Z-rrh!MPPk==!}-`e?^yf=5N#c@`uf5^TEPr zzM2kISFNXKe>3|a;CprVvXUU#i#*(FE=^ywcNKroRgv#EuzOV4toCN{;SW6LLscKm z2;+3(d;cLR)=Z`RR(xxI;@rRoo`s^zQ^e9|%lu#v7ii9Y&>*P6Xvo1N_@j{d>bV(m z{-TOSPUYW}>je!iyuG{awwA<~zdv$?^b*Tv6lpz=xV87|re*K%DQ z#ql!b{qGFbKXa!ln$*8qcC|e6&JDZ&X?$!IVZAwe7){-?KiYVl)w19_$yBvQ_lA26{;dr@5jf@e=^=H!=6E9?GeTp2xYeeV4C?fRUPvyYdpyq>w_`O5>T3O{nICe{4f-|=f* zxXdc?;uBN9vmJWZyP!6L#Z%yaS^?ibJ&qrn>{%Vt75D@GNd(sMKREp2ZsW_fjI8_b zz1&~1SD$a6z3hJWKOHG=YK5ydx82_umio)B`smHlWA9&Fijk4}-yq1rWSG&|+Rm84 zQ}oVea^8Ej zKPsQ-k7aAp4EIw!)WegyGUUYjr`~}-($1Ypznpe@4(r~=*OKqjo#r~V3(20^lyNXG za9hF6M^`k(^YRzH6?#X;-Agrc|qUYR}$Y*TibpqqW|O~?AI>q38@f789Qqv-ji zwb|eG?(M1i{^{-O@A?l8G<_F~dF;j~=g=v)wdkqVH0`LJJ%5u=f9N;On`K^XmlnA+ zNPLldzE0vVldQ{8JCiOydu{sW#-`fL%in&Qy}O+ldg=9a{gC|+{{9iv_uDg@y?)WN z(zk!3e-u3aw;=_Cx0~x=<%H5Sp4oBhq2n(S>~UguFKz_ z@q3}y_61H~O+?LV?k}RIhR|4M`O$HHL|x>Jeiv+=lD{zMYh^%@Apf#AJ0zj zpX_jIWpub#V5w*WV^r%^hcF2X^#w^Bk{SywBP%o(b!zR>Slpc0F(awRl5J+nl$+|0 zI_~_bc$BfkHF0jKiCC&~|I%kKk{7O2TQRwKk%VUIB;^W)F8j}Sn%RTa?yE}i-`m7| z#s5*tlBEGLWiOwGYiB7wi&R-yeraaJDiaN7gRh6vYJQw~?ytJ4YPMRqm#5JAd4@q- zmv64Ci&onDy6U#Zo{y)j_4n4>u3ET6HjFDNZ)3`;oBdY=mt6Q)r~l0IQct~5>f;>V z!)>c}3p!s}=d{b~rT>~upPc>eWS+m8y;@xQyU=mD?JhZf$HETuow{GT^-(vQx2W>W z1d)_w5*gcE3LUS--Cj2PwwKM81*L8mTUD6m6}@YC{!~Zz;{1;?rW3wK)tX+5l&{KP zA`|p0vG!lqG|6JXZ!d4iu!PngL_F{ulc^S|B~-) z+#PLxVndyP(6>$hVrw59={&U2w{3Mxkz1#BO5NkTEB4o!-`kO2v;JX2vQWUI48A6c@~9k%imH160b%c88|Sou^hKK}LH^g8kGri53L zE4^mlTE}cU*WgSdZ}&XrVAs7h7rd-0PTzC?qb72o^nJCt;Qb9HP5VCU@_AS&b3I>h zxWDR)e@Vc%bZzJ8$f$ebC6w)$-7 zNwZOI(RyKe?_;;FR18PjnuV*Fj;-J}-F)-%t!I0lKjh$WaCj)e9BN*_;e&@~(zM8w z6IxE&{%vS`pdI6Pf_IcPpI;V6i zzwju0`7~Xy(M{ATsx_%8WXY+P6$=-vyfk%D;H+Ovx6^kd_Ga_tE)rS#l%qIET6kVS zp2pvcSDrEYzn<#)FTeKo?SPi9b5iFXt9`MFaa%F*{HM}RDehNop1U@ltan>3|5ac` z&A)bb6M?17X{Omu;^GF;hD|L3qJ}&GY`|r27{%DHyoOb6KqA z@zTTcdeF1q5zmS^d=cDdJ%BNnTaUfbs{KLuH&q@GJ)Ol z(d(wxB~G%2EAshYNi*N!@Z9h(X$MonU+xE&=9MvTh&_=VI_bee)olm)w%tm)`66N} z$C^E2S99F7vR9o>`X*!Lc#tonpjrCDf+K2XA342tH_91k9OPctpEKPn{YQdqN|kd!nXu%emK82J=4eS-}xpd`M#B zr<+W^syxX{%-ZZs7V+=p<$un?YU0qqyZFqcu)zY<`_e~UM z$m1=VD_X1%tnTMyczAh<*;a{w-l%}{zpirq^U$p?RSJ=r@9g<$#m2lsogMLy#dhd! z)C!!Sn=+YUo7BnNb$&sCGQTxmyO!R0*PUAXy6J{9qqg5xiLkq`B6c%xo&W9~`;OHO zC6}%4CcXI9b^mRym^KUJw{7KaN3>tmru*q$7jRnHP|%Z_a9BKLnSRao#QVS0nD;%o zuqCx6g*Q87@gx4Z6-OuTm=KuJaPN8C_Z88%-}RR-*nPXKbfv#vcHnxmr#s{7GN{UmWuk{AFjdZ~GbV_+)4uA8*@CHW^RXD40{eR>^Q)%VgBFBTm1hNmb*6p-Wm0O?}2L@ukl;m z|8JV;ydv>cZFkTap0gY*w{sRcO;OCbdAO@KQ6flQ;L8KHU-EMwD(>Zc6gE}iz*7#c zvYA|m61e}(dp|Xj$LWZnV6dZ4l940Js;3GpzZ7K`EtF`B5&!joZ&IM(v_+bA@yQz( zGTT1(JVF=Q&AYN}sgy-mqQj)yr{6x1e3ta}<9!FN zg_>q6-xn^@vRcSHC!+IggKLxuuaE3@QHk!gG5>3u|G6$$aZ}!7Q%rej!<>VM*Un9p zGD|czOSGzM3vvm3{lbTR-4oAQin}^h#GfrW@%G7yUMBZGnKM6wIhB&E^F;cND05rg zIo!#pd1U$_+ef=?Q&r|k#{U$Z&3kQj;N0@i2LY#M2ArF{Yw2vSzPplDDn{F`MR?r{ zw@``6lXr1@B2gHY(fLm-?%7heXD$l2luTC%#I8$B5L+O9=&ERHr1zI33Ec};Y>rCL zID)IZ>pxzt&rMBrONmKaHt+1ygtBM9WhGYiK8fcFNZ6;scx*{($c@%Q*Nl0Ow=a0s zZ?a5($KpPhWvhJBX045MTrhKX;v z4q0DIi?d}p78&Chv;5dfrGm2OiJa<%ZRu|`(%&ekKb*Kc`~d&?z4!bVK5wiLtT~om z+Li8BvAotvxFRd=iQ@dHXCsZATD;m)=6-#ik>>Jm?wr~^*WcbNl0yGx!Mw#>a5>2gQqXVU+EK^TCUHGYig5xFR58;xuP@AuO+VG=GJGmA}e|Biuw;#YPj=l+=txSke3kC8Z4P_W>>Zr0%HJ9eXU?*laM<#X)8ekiCN_nc zNi18}Tr+<#%Wew8pVlaIB`w~jIRRJhe->S}cJ8bdaj|7rBo*qkPOQ8;|6XR~rxhn6 zeqx=8bCS}%bcrmB$@QO__tLkKSdmb>K z(p)~XVa+b-J(Vw+)@CN|T)E>O-yExW-FphROO>4B=HA#EKfg|H!=`Hs++411eDyq2 zmUolvjlH*9(~it|*=*J$UH4F&n`yr74hPi$=H@spZPyhnD$G_t9?db5-^X-tpWpmX zXIFb&(RN<5`m5;6ecQA{W@_$i3_m9K_@v&Ale@CAHPcQx$xod&&wwkHt3c-4%vBq- zB(f#rKgr(T_sZFF$+a(rITvTV-1#o)W9XaXUiUw8K8~u3yS(j%QDb&=@9L}P{B|zO zxOMU6jANSrFD5+;jh+80!IDL5@4JUl{}!8P2a;(EJSMA*cjY(N*fu0SGJ5@_?dc3DJpsGCs8>%OCuLd&zV(mQeH-U{El=rsRnlv@ z8)nxYviImJ#5r8xTkY8ONaEGPy{nFJbse;0dBgRJ`JL&bLyvMDQ(pa<+F z(pr+{G3jaPUeZc46FU0ooioFyxS6Utp+&dio*gkxY3BJJ>=Ko4zRCH3nmp@aW&gx>rl@2=zZSOWW|LEo=WX-H+eq&(K?9%ahOf zIG4eF!~e=R9Gjy=)<1Qc_1O6Wv-I|j(vO+%azJ40v~bwIl$La zY|+gidwZj0K5wtuLRQa+1t(_RoaPa)wtjm~kwDHS+snpB<}71Ay4i1rx<>H(TARh+ zqu6ZMaF%3jPN@sA?>flw<^WH~ExrlH(({a6!##GIC2rf<+_jF|EamX+C&fkYj9I)g z?S-E+8Lx5pu8}9Q<$Ox9%ddNdM^Xa zGXm|8eEOw5*)1e#W%c;9)YpGEgT=f2*$*0?*ue9c!=pcPlGfKi{iJx|Qa=^b=bIMV|Gw!N z|0;1ctGBcJc2x(<24-^uapUh9Va^&p&(%JjDbZ=#`pi=|Fl3v0)YhmqrkS_Bqi??u zT9y>^eT%#P(uEIA1LS4ue6w~qu3B;|yel*-b8l{~Cv%?p(tzMqRw2w5N3I8lWhtB8 z$xqG-=1)&zE(r1eT43P7WN<+LLX*A=vxN)ukGA~NRnbNlvW&|QteUi-G)Sh*tiQ8Mi6h8ibE!YAYtMEn9fUG*(_J z=XdE2)|`XSrdwUO%_XP9-7MMqZ?iMk<9oZ`&ilN{IZs;WZre=TOY8j_zICno5-zfB zR@#xsO*!TEUyG|<^Euc{)f@C37(eP9Hg0jQuANgZ8S&@q@>5*~`bl#Cwj7C=;~I5B z=S-dKCa1TbEZo; z#NO2H)U~{$YuQ&Z$9hpg@X{}bD(7*V1<&8nb)T(^pS9ci+JY$=Q`xObj{Eg~KWwhz zz*OQabmWkc1T%|Gv+18szN`(3>(`eD%Rb6lV_<(o#$Ds-$M^?P@2>w#e!6Mh>shy! z)$d}dubgpxS4>Z(cgF40jH>G=XKgD5VKEsmhPC5<^rVa;;b{sOibAFlr425@jO^W%Gw2zo~f3}bgHjhtA&wu-| zZ~exu!s~i22e}J=?RzD$FT3-W)rtMA>*nuxYAU~{?cNmOo$0ez+}?3^@7zwV3A{_bS* z#W{GE@AMFlxgs_7y8O$pN#4Hs$@QZ{p27Y7e~%iwoM``ZVl~UNBAW^I;T(tbX72LU zzsRKY%v5Fa;gDBlq04Tl7F!gsKbWVTaW?!%p})~*uhbc#pSaC+7Vv+tblMyKM$h>~ zou_y0n=soCWqVd_UZ1{b`P=AYHeU|gI_&zWepqP>lgKBzCzSF(k+TTiZ z<$DI-+glPcRh#Dinz7GF|M0c$VC^}M#k&1>B7d2`ad&yt{O3`!%O9({jQz833O-u8 z>ksEY!87e&Ufb*DU9fZL5VV+(;MmNRDI2n5LZWj!zoOlgtskbeh$m^qo!Rm4qLN#; zBzsej#iSI^$!hBJLUtC-v#vzloXntQ7$8yxT zQrW9AC(TxnE%864xpK{=Q`$G1^w;ftwM%>b-d{~YXAJpwxgFxze)E}>QDgGuv*yXo z!G0H?m1Ia39Fa_yDOjXj>>XF=bPz%5&*toQzXKqcgor{>y?m%N{E z5e)V*y?e#qUpFS?N}#81=qb0IOU|GEeTe1i)$q(WBG)3FCr`a*p1XJJp_o$JlUL#! zdBbk33z)lppZ>>xuS0L9E`K!jX1a8dSd`Gxxnf(g)`n)>$ldu?>|&C<>$a;oC(nxA zE}CyE9xHtP?$+3;dwRp~RbFHc5A~Q_8y+8Z^=|pKy1#3=9yI8x?y#v6^ovMb|HgJ& zXtUzFk_R2C%WfR%)ZJ(BxK-@kjpP>TIMYkLo^ryECq1;0eA*gvZpYJf`@YC$iO$E$ z?@TQ$`|xy5^PQRLhBa*#FXGbmZe;{!i+z8-v{iam=G^(qj9Uz%=x;aoM_Ctie|@M>d_gdsqiky3@`^93-dwERSY~&=@<%(L`16ks4vKBA zIHv9RFP`09vHk0@>hF7hvt{zf|1tPo_9bqq`MQ+3Z!7&}J|14FXv2E%ae6}C1?7Z< zua9-@|48#UT(D#-d0ef>JoVQ$^RD7A2kIF_7MKZy@BQbypsu}ejxERW21ibV%8QdP zKU}o1m*HDqb5ch;YxVMezEhc%%#IHnL{2zxo$^;uZJGbn?&<;wp(AZ7XYM~|xzYP) zrk>Yhx#P$E=stOzENylN_$79 zJJ&7^0i9dP^``Ih8Eg-+oLZ zYGWTqi?XtBm?F=;^%Gxr-;uwb?xY}AVB`Kp<<=w*BQ>VfZvT?|pM7rbJK^eAx;*E; z_H#BZ7pqAvTWeyp!)KnddZgbxg(Xxj{`-3x7ovLilAEdyVA9e;Va@%fgePaK}^lJMJH`$lG= zRq)C~Qbm`V3%cgmD!lMIvPN0*<$@NgNf%wx*gWTP&sp~G^$ST)?$Gu9x1G~9pPx8? zzh&}bW9jF|-Yj$tiD90b$&<;TTrgwutPds(SJWkx!}ng^QkZY_Cv={ni#CE ze)&pH>&%&tQ{szHE&be~B~Z;1#PjXNv6rt{eCB+*vV_4W%jM`6%dR-nrneTdfqOY; z_w`*(mS@#`xGcl#|4aU<_Y<;tKX2c!@Ty4Ur?P^na@ytDX#s`{SHEW1UU_}NJHuv% zKdV1}$hh*ZF_5P{_0EH5>^D7ciZolqWJ}9-hiY7WyIxAfBdz**L>!-%oC}M5WFWWE zzN6})e95;jAL25fHZgmt)8x0FU$Q3LaNC--@@wv%GpDxPy%*+jd6kauKi+A#OEs@| zR?N-Gua}OUwf0*6!&_2?8)wJ9&6~cveDb^UM$tR(`lj!BYWlu1mO1Y0G_O4`O5ayM zl#c(hZu-7%FD3mCv*Z81o4)_=*Z1{|G6{_QGY+tteP|S%lfbG!;~;O@hh{~YL{9%1 zheWr1Xf>RZ$eTaouc|v8`r>Ps~r0On@ zI2C*EQ{UP@sfPVC&!qCjPhXmoCej{xHn;5a?1y)BP24TdeN8paYMz*G`+ny6+Hard zGyap!aO9tLq1EimLczHiuKKes_LhBFtSFo5=|Ahz)NP<)!hw)) z%vYA0eHHZdofcA`diCqv%@h3p#s>Cpz4~Rt*R_Sd{53~rUEk{$vD#cVM{s}DiG6-= z*H}ko*Xhi@`RB#)&Ce5aGX1S14zP7^-QJY@LCE^p6*=uqpP#WAa{Si%lJRZReBRvr z^|SA`Un&c~*E_Ysefn*KJadbKcc-eHX|j#6m?FLFVy|h8wf3{TvRzke^IP>}Y(HP? zIxPF{cGdnF58cju51SOgTX@0AHs*k<_J%EOc^%F&cO|xmPdS^@q8_9BNaDch_;bCi zca*fZ2QZx7sq~MXWseM_#s79Og%3p>8I8JD;_P8h3_fq}SS%G$ce*_S&>&zU8vj$UNWnRMRv_LF;Ex~BsB z3It+xqh7cv?O4=W@MN#dHi_>0jQ#UmI+WjE?Kl*nW|z97{r#iJlNOgJZ%l`D>)&&%cjDash=tR@wjo#Y48Q+6r7sHWv~v!AJjeWhi_*U%AGA*yXrH^F zy=Z|H&wCw~fMcry@_7UpMK{<=OwgIe7d1eWOcsiWPZ_lKBhSbC1c*RN?sIHG<>Bp@r@XR%&POE ziTxs}e3DZyip0Nrkzy#EZTP0>!t*70BIWCTHN1No5TI?dQDU{vUkG)*v<6P&~PxZM&1)%a5{|7sb{yi9dCaJ$&)XjKl{Ul6Yq@{@rj$^bn&= z(?Qn%j^YOvGVV6`aOk1LmHv-!&P#ndCsnsjy2OS1n!)>=gYSzPKN=K?K7Y?Gpa0S0 zla|}24+8!l)+nk~Cw@3}P}$N*-QGxLebQeB0qwF&%D$66{>ynN@#&pJ#2MA^dTP0h z*B%LU_Pxo^QPa_T|9QiwKgXEFcWlz$JL&VWL#!WD_zxapWz~~gS@>kZL4l1;asq*Z zzU#SmDRJ#+l$gDNMKIyT3V*&OejKMae%+$*qv@0Oi%WXSf|7#8zg9VZpR-VARv-Ju zCiY7I=NIzcZ2Krt>ZiZ4P+wH|W!?mFe*uZkb8L+P+FYN7`9I4u1V7giWYqfnOe5H| zy3cg8q4CxOl4h6X7OsDLt?-%Nrw=;+4}Si$;i^fW_>T`SsvKYcTli0DXOar9 z{=dE;Rbj^u21UHVpPnB&`0*7#1M7O_etj99{{KRb_Mt*THzxeE`Sj!2dApCnf3rTx zPY9CvlCSpLnCkitWi0FY$ItvVR(xyDPCG_yYr7vQI z+J2K|P8)g@t`jpYWLX)Yvu!HtRK6FB96dgM{Bh)<#G!+{hYm`#OpJ{+Ft{G-Eq~ST zc}T3c@UKH6zge!v{}$CgWokOn?);b8>XxM0V!V z*z(CCo0($VC$b$6vD*0FU)n6baZ3DFrkL8bOq>@LEJd|Z^Q% z5m(8zkjky$|Bf2`t7=KF{2E#w_F>gR$MsB_-bMeazNMFL4G%WWdSCpn#Z<82)6qF% zS`)wK@O+SevB7rER@c=jQITsOTzVU|@#~juNiv=WsZYbcDohriyDlm9y!L}@F|`7W zX_o_(FB^t#mj1RyEPAt1<_DpReZK<4#2CeS%P0O2GnZgD*8X-afxpyTaJqhMu-VfP z6Wz_;ir*51KNl(&`?p>)2%ao!UT*1m-FE#V&t>^9oWg&uQWXC^sVp(LWb5XF!0lIT z);~!wOIyE4uv$_3)@H|iGwlS%4_}O();Fp0n*0;E;@BJ-zB%jz*Ob4j%tI?xw5wX| zWb><*Pjh<9|8dFo|C`MIg?-;s zrgyDRL$n`=NXJUF$%`fSUv5)3eb6?&;{QTXsZA2=7D*gXl+oA}%pT%UIV~c4lhmn3 z=_O_#nL^YyidD;hkvKN}qt2J^t3MoOvxtAnQ!Xx2Ir}5)E5EkeR+&$ed%joH+M0yK zf9>1KQ1|$I#hy}^Ib>N83qz8YmEiO85X7l>pB;&}*mX_yC_;j=+ z1CKa1rtdttX07On_0nq&=1ec&dryFK+RTaBKWidXcSWtW*mKk3iQ=5Q-)5b6k}aJ) zXS&X#xXSwENQR3y7jKe0zQlX({hjmtd*}Jzbc^+!_IBr*N0ujd?3~X!>(+mG4$;^9BS$X~-V$^XncU!L{-ZtI29)|}iGccyCg`Za4gqu1V-I{krx zY1cxT7qgE4usR~Qd!JHtnp$++pI__GE?(umW&`){4J&mv+8Rkn+};?tX4BQvTWs03 zKJ8g#SZ!+(eZ*q+2HV>w9is2KMIR4|-c@A1tIRsFDmp@M_tvYAwmR!NohQ9@QFPq0+aXQSJH9WgnQ&(H$}>A|O6}ZOZM$ms;$yQHpPKzI`doC# zI_o{Bn|6e6^L${v@9FRI&utqN7i|8|xbEg`+e^PE|GGW-pLGP2OyITZ{nHIL!ISO>Wo#CRZ2F_U=8u=$ZMh|T&aC{iU8(x?*@rT9 z45#PLiSxP>;3spm)Ai`mB`()dr~|0lIdM9wcnR7)@X0|!~Ty^ za)Yf1u})?5$n+6&yW!gn4%4S8^o{Q+~= z-eaYIq!|vdyF5I&T=wSFyS8G9lG7Y7*3QXnj#+DMv-bGi4ZVAGX2eKtVLToeeI?8;0Y-*4HAdubo|VP5HC@F-4heiqa(s>=uhX z${MbA)*jEVxiE1q%Z5icIc0C@GCbyvmG^j{f9Bk6(OSVRi!QeQ*?oSl&YC-ND{Ri3 zydyKk=I+UZGEoll%l>Hnb6EK7X3fg`f3*w}WwmUdxhtGX-FLNe-c?;&*(nR3<=Z`< z7v!F)yT+QX# zGS8RBoZKDvvR?JvMwe@xa@st0W&a;CN<3gZbx?YqB72Midx3&6lkMY~wYUB!UT}3} zu2Fbg9`l%c@2$jl%&TM{FI^(;aqo%$z1?SH_h0<`%J=`(wK6CF*PdP((^#i)#{J>j z-e1rEE52}-eV49qCh`B<(0GoB|MD^MSE6lCx5mqN{Qpu||GoSFY2UrtYidNS?#e|i z_W%YZ9)-!!lo&U+a z?w`K>zs-l_*c@1ws7Q(2ox0uW3nSBn1NHy+3D|TPC_4GRO#35k+O+U+;IlJxXDfb; zck5hmBGkm(Y2k^9D&DhfI*pc|nyM4MtA;Z;QKwb%f8rvujgOA@$lAB5?AW;QSlfbg ze-$#;vuflzwI$_9l(?PmQl4hER?_&X&qN`~e-~POJWe__@O4R`UHuXdv;N!7yS>d< zdRzMOKHcBPB^Rpm7=>&;_N4E~!K-T%SN~Yf-@xv2yH+xHU**v#QuBZ3@$ww~p+r4l9 zJ6pZlHEpNm l$!L`tTza>+eSyb6#U=hOPL3`Y8aZcedC;Qsw^gxCEbl~OyWG8{ z63KmzYLcnb5|`afm{WS-k>#yD9cN9i+kEE9;{0ePoxL~G-~hw+gT@EgcYM9Um~GK@ zD0#xKFB}d0O`_LN+aJ|cx>OuyRBcbJg-+Z59sso|y8izB=wpY^zP?<+Ejt&m>>`o7Mi4z03K^+=Th% zRhL$#wf3n^NnBo&%ayfak(gLga=)utWa{+PZINCpdshjW2MVbi_Xv-hxwPc@!!p6r zXB87x%(baZ5nFRi&N^cD>laS~8uzPd&5sN|tGXt@R`6GVtNIViXB$FNv(IfiYiD&S z!rt(RuWP|k*EcaI4lQ}JUFhcLz&UT1tz5Zc-n-v<`~Q85e$}yJ){d;MrqJesLtOfQ zUhUVvo0Ynb&)>&z#m_LGcb=Xz&Gn8M#=g-%G5g)?mB-cQ%fua6K5d0omxeU=$6}%V zKE-DnJ99oqDnuVGJg5DzN9RJ;q&q9myUF)XI;FC#N@=yna>>ob#`eCYS6Mi7|9$oR z8Pu-Z7!vroU)7(p&w$^;ezwhw%2l`fqAE`}ZVlU0+-AN$2Ic z-JdU|KdriYHMrKc{ibr-pXHb9|6lsl*1TWnOV8x~x?iu>{}1|Jy^+7(=~2C0{nSP7 z@%8_Hy|>@}yW!*deLwH=H9S+6W#I2Pz;fzry+?q;50(?#4qixZ5?P~Q`yp`~lT|^p z%o~NX5-aX z%M$JQ%w6t>K4nhQNtCR8(I4~8(7k>OZ~hlYru!uh9E(mI$SZM?zJKSK+%CsptfJ#R`WhYXpy4&boAr&(>IV z^_9man>)|f)Lm%%_2s77`%7ol>n_U+hb)oj6!MT)nKIq1@VM2)o9D{EJ)82WW+5a0 z%tK!HiYL2do$|iLu|#v)q(w@Rmkd0a`c03q$Q{1e?)80pf6)|XR*swQoE)3_za=!u z8kIWw=4bKGy!1uhaIR)hOIPp`xs>I$z8-{J%k*`ERC)5_s zI&(HpXTzDax{P@mnTyQdN1n0&7nD3fuk*RfWsghJir+SI6{=f$CPlXH_@eNNMIoYo zLs-+D7B=gb8?V#Gt6Td-x27C@YhUvF)|If(ZCi4+^Ygp=9;>N{ z-2UJedHmI#=7_H{Ii;Nif<>`gHyvKCbTY5(sg^`elX&v~CEgCYJFo9srRLf7G-E>8 z=U%zHX&%fPLD|zxF4-@-w8&uL61mcq0=|omZhCV?U(GN(VaWssiv?$MoWyoXoqFXj z@4VE&(P<*@%Y9L=K z-)HBLHLnhzuUGrn$;}(OM$YBPZ->g~gy7fcaIkn5Tws-0{NyJ1k zJp00Kz4T?C=^NSFDa@M~j zVyR`!hnH90DIZ^bk4yvS?UJ&UF5u1!D1XZQHaGG_OWH$*1|Z+rIpRb>0ej{IHMywvAB)c9x; z`S@J$%uCf*Pr7m)sh-X2{oU;S=VjI>-HkpSmVSLAV`lqf`S%r-9&vJh-z1a$i{ie# z3fjwZFz`I1<_U9g+jAF0u_~$=agUf4dXDL`=zp$$9NO#Kkco5Z+*FMU^4I1_Z7KZ+$EV?B3HDF zq%U*mHDi&OCh&e6=LXh_qwWPKw}!R1)t(9s<;zIQD2=+_+R)t=wrXpvPaZwCr!>#0DgGO4spFx*x1|El${b>^$~A9mkWS0uZwiu3#@5dBWCq&IK;FUNLYExFQVp@51c-We0(X#5ntJt#YJ(`SW zRG6Nye7fB1aj}D?htRHLMS90OWH)hMn-EsIymPvTOZSV;%%bL3%ALv^i>AKFUbv!b zb%)S`6J0V!T`z;Xlo%@~m{(5u-nDZ@_x}f7yE_y%cGzux(S6vX$M}WaQH`#?ifqm8 z_J=xp&Rg{C<>+l=?0NFI=W<8yYK`8TD{M}66jg*eb%Z#wrJ8O&!SuYN@8ycV*C+bk zzUX_;(f?7S|FcK`*Npz}9sNI7^#4B5|Mx}ze~t-^niH5kC$MHt_!MDy`$TU=V6UE_ zZ)!;8H1$-Cga4S!5+;gwPLy0ZQTpUW*_RXLIVUMpW0%1PQMC+WVN zq|Z6oP;;`e=Va5L6Lls`FxfHT!Nm!>g1%`_oJ`9DRRbqVX!ePg@SCli;(c<8@5?Fv zoKpierv`gY4P80K!qbpz=j6!lQ^}cH>ZNGv>JcHN_B2pwV$gZxiRyt< z#D7k(GvN=*oL=5Jy>jLB>XXxJUrzV$oGQF{YILPo>`JeA&S`T~eOL@54IC3Z*rR5P zM$Ma=z+NiwY{o=;&*}9iXU=^&b3W&+g_^S#ubkNU(xBOMhGF823rDHge>DD=8_Rfi?CaB07 zFl)}_kzBwe{*zD1l;Kvxe0fdYuc7m0e)7p5nDpL&NnDect!tvy13nic=I=A-i_M&8 zTg3G1S}gvPyRw{5H-Xu)Ymv6q5^c#PaivVB8u)ZSaQnZSsIrRJWWmHh zuO$vzOXa%eSXTC&IXU@UWt~rnw^v%~zmwNQPG8IUb=>>HwA^p)t&hrbojxqHV)9wm zE^uEg?`wMQo1L>=X3ku@GNp9o#8V&Un=Rn8&YC3KHBt7|3K`3E@n0*%SMod$;1k|8 zaq_N-+^gmrWifxsTy$yzQ~#=!Q>#{r%wptCSTyU@QuUS0Z#MA0R9LiMVRb~-M5_gS zx*t|;+_iYeEv8crOCr2h8#OH5t+jf77vGUxOC>dVjkwmh{#tT4YqePB>PrDj1Eu&P zqn5mxutdvpt;El@;ivd!%$oR6YTa6?IVWH0ui#v!yK&Z+lAIb5KkMt2Zbh#4n-upOZ5uY?0Cf#<2~uV)|#MIJVr|w z-L6`ETRZq?=IRHtd2gNGd+HVM-PyZqEVsQ6+Lkt3D5JYFYj@@MFLl$udVfy$`D&h9 zm{oQ1$g;nu6b^l>uSknnl)_jqZQ3|npjmqT=LyVmzc*#AVk%bKxgzSISi*u!3#2Dz zF`r4fF%ZgMXTirNytd+pDcOHz53#_}x6$=TvqwZ*w-`rB@u_uTu{75Bet_x8S4 zr^?zg$F!wjb&LCpxh21=a;N!)c?bk#2FMn%3fM-5-^mh8L~S###uuO&OGc&}&eRla#P=gkt& z?qiO==d>oA3!QWB@tv*8Yp1`@(fO!zzEg48gc;d3C$d-0F#WY>L+zY6zUqlr*pB?y zEp=RVZ0_A-KYt!uzV}LJ?Q}n0?SOx>SGgR|Pd-tk+kW-wkL4;0H&~x2 z^4+#Fc*+9VR|}XAFiu}}YF^Avsn}CHx_9ljS@?VA!tKAWO8cn%&%8VN_sLeROZRja z@XbB+--_wR+)Y>hUhUAmt#Wp=!K+(_-dkpHEjH)6uW7q_(X=gR*4(tbb>!jht#R3_ ztq$;RzIFLf%&meo=N|4^`e62wt5F@#cAsOvchA@J_Tr@5+j|9e=5}qBsGKZ5(QNV6 zDLb9)e2>K{AO6}jM{1s^jGeXezT5krWgEVGY|r<^QE!&9 zoR(zX&UsoZ2Rk@ z|2j?c-Y9*1{r;wxhG10U&KV0oy*lal_Uq->A9laFllyfyySzxTrX?ceb&+xqXo=d78pzEqZKZR99@HgwqZ((O|>!;7u7R<@k)bf%4Uhi*OynjOa{>Rg1%vKjH zuBz6l-(tf2-j(Ytd-{LQe{VRezjw}ii_;0emiPZ! zx!?K-->FHyG{KTTlxQNU;q1XzUdeLznA~} zf&RbO|F1mpf4g|dvC`UPEoy- z8y6lrcL=KbEs41J$hAk(H1Elci;vwWD7yBkL|%I0IYn*anv|QDo}QknnR;$XFQ#q#FkKDOwd~>HwEt9C%6^)>!b&Tv~FF2cdI@Toyr|r36c>Vm& z()Z8q-v0i6*6dbh^*EX27rT~xoOdsK)BF2Z|FIZPk^Noz^j2iP^z(anf0uuFxR>j` z&OMvLCyU?Dx;9(NDxv;Tbi8Shn{&YQs2e% zav{6Ce5!yev%JWrbOzC$DLkIS@{2$DT0EXoyh$T*)@Q%IHFG9dE`4yjP>xsp(FG}O6|ODJ^Sfr6^F%3r$uE)9uupOX{KDw=cD0r zbx#?;?ar2-Tb|Iw&8How!jre@o^&^_gn6s-w2GvO0?T%|wiU1a`mp<-^|v37J9OB7 z9_*R^v?66n@Un=Msr))WZ%mG!R+&~7xh!(e^xoc|Y4fVvu0Cs#`m%HL9NDn&2MZ^M zMfolGpIDH|Q7Yu?e2esX1^U~YuZ|`-C!HQ&xP*+n@9EGGBhpPvPp}e@kzeJJo);;hJcf6!{tfRHms;_-+B}@kD8i+<=){4X z3yxE0@qzY`=MAfxcvwt-99kMU zK~-!|!qS8j0(^EySmi%B@H@V+7gKYw*NRY>sbaLqaH?lu?e0Y3)7LDvUD(iezi5$D z(G3CdF9F?lf9A6XENE_35mcO!(9RR%+{^Tj+2e=gMS21t9P;3|F=9~^U{rBbX!4ZW zsE}gvxHQFh)&DIUd$ekLvuhr7mb?&bbo5abPOUuaaA}>w`jV4kN7PTd=%sWk+(@-7 zzj@kSE2YD=W|?8V%9((3YMp0V&MxFz>Q+(ZI`zhr=eu{A+0OX$aQ14RY4p@89osX|6*I8=6d4mVAu4YEot~KQ46bgHu^fFRq6&MLd@0nV@Yk zb(Q&rPT!K(QQ7g^uZFecT;*k{Xk+?U$bISTP*x^wYU=+4`Fg^OpO7I3zj zxGjH^Zu!~Y3eVcgw_odiP_Z)P-sfZDxwoctRPEm_@O$6+y}?cEYyN7_`_i<%T>sAd z$-jQbvy>m-y{R|1Le}TO!ү|*HwC*pN$E+T4n0wLss2!&synH8i=<3nzLf20+ zS2w7|9=}`A9rz@ck$-B}Pu=)N>87M*4A0^jyjOSE=EzArHa~J(=3}~d&9w;+Dom~Y zIBZsAPIT#2J#4>hQ)<(i3GCew&1PvFUByS9GzDzxQ7T%_99$tg!6nkrc3siz?&7D4 z+?A&Vw=Hcgl94s|e|VnDp$wNRYbM%9r<}@DGkI)PBPexWygnw*BfjX#>NbJNlbklZ zWUzW5&mj2B{_q|CSuw)Azgf)@htw)T%Z92YJIVwH%*6E{VC428aD|-Ih_r<%LdrIfV{5loB|KFdjN!7~R-*<06 zd7ppgw{LIfew-YB@}@F(rRc%ApJubKfBLuUr%2|!&x`Lbd;XiNN~Ck%mpSD&UN7%N zT#Sm@y?XiIJHGqFuGo8g-I`wWdgbX-&ci;R_NdpL$XkEyj&;WOqtkc4Up=FY+r9ol z)pXO(YyAbEcYpu7P?fXqy^JUi|Nmc)rx$*j#9h0;M*dI7^uK#g{{MIBw$%0){)Qnl zVqOOSPW$=ce8sof9`#>?HwGB0aaU}b$zjrW!~WlC^Z&aQ8EUrtb~Y~E&B=0ygEi(r zPPT)@qW$sR2X00z58Svo{PUI$Wm8cDQ>B}WjjejZq#dnab#NbXh`M}0iF?ljX-?Y{ z|5#%uv~&O5wL#m=e3OQ0mclgUZH|RzM`moZcACO;Wl8gHW#%nrA16EBT6{2ud7sti z4%33Rj0P45iFWpkhN27X1&;+C9XGcIFAAFFFw^*u{LE!$GLt5BIBKbwXir)2*NCNv zVRexOTaiXPYXn2}hsh1QH!x07HwxTt+G4S+dT05g#b!Dk#+3(I<{Yw;*=wD%{_XB{ zJv&$nHQ3oA8nR}zWoERqNw~;=nYv;1if*ApDq4q1l@=~5b~awL-DAp;>8p0U*|Ed> z$zGqBExsm(Jq65}GuX-+81iPYWhJziDL7By-YL6!i%`^pki(k)6_l7>HKY|;{5r5@ zg|cYyLM!fnTaLsn*%RL~|F6=qRGs!{gJWeG?IC9b7A)R(MEm$hYxlogZgHDA3<{2C z6*LwLuoqrn%QTq2EqQD3`!bpKf(vXbuCOh7tofMaH@!d-SY*L z0YkHn#Hm-CPhCCi^}^F`)he$od#twB$ZhkPFtf({XP5WWncgfby?5K_?=g|vYa_7l zjrY4>ryp_pFiZLz3eo#_m__bI_dc%KcKs!%j~>~6?1?PHn*B4Tc%EA0le7EG-IG3F zZ~Ht7@Huayd*O=g#TcVkANn&xcHT8OdwI&5D{JPS`D65I2VeDx#Xk);t6H7DY2x*B z_geNNo9~qDGC0_Gj>pe@_1PN_9rQjrOyA8X{^eLlv$FgRW$`y$H&f1SE%LkZa=Xl( zgK{-)FYowzS(}x2Smv#94P3m9ztd^f3%~b!v_90#Wx9Px@6RCvnZrhN*bBWmGHX`2 zo0u)nHowteZuv&@!5aS^HeRbw9kxwru={h^!R2U($PQzZ&F#%czKKk&nPuU%W*J-Q zh1t9Puin)6XK@WwaSc8a;6Kxyaq5l=t$&AJbsQC1r4h1d=j;Xk!n~RyrgKYljwSmX zOU*e}@n=fLl8aqUTSFQ(y>Gi!9@?_<@wumeE{btqx+Hn2G{-%y<#>9FTgw{WxFeU& zw*)M>wZ1OpSUt~)Mjeknnc!m@!Nzk0Aud-4e7`X6+NN^(@{SRlGN^IUc^%$K9 zajj8OtxWRN;M)NwQbMoA@vcl0z0y*$KjZJl)Yv&$bA3|&oxL_;PS}K3*AfIn3y!YM z4V5W+x-s82oY(vMk;w3k#^L36@K7k_`4h7b*=LCf2A8t`5I+! zeA0~AZy9keC%m;+ziq2@yRL6lZ^YJF5j$5#Jn)F8IiMO8~H45I{Mz66%(0PeWLFL!}QvlA`>EKsWu93h-|%Ja#({= zs`c!(JuAJnc<$M7_g}sFh%<6W=FJ7YH)q*KExCIk$y({|le51zC7=W`4aDyDM_T+5?iQyGon7SH<3b{4lcbb7bF(h8<6%7T2!&SG4K2GmmOe z_4&6sJNbIM_kF#6EA#ed$(x5%qmG!WA3b|pDbP%D#FkNF zjMvvjPJ0!@y!2@DB6GpQvqm!=w$He8rFQOB-Psd$Z=DU*xY>HAV|K6SoV(sq7ulWe z-iuv&|L?4cx{_9}iw;d=WOt;r|)l2^3aAGn#V z8p8NZn<-A}`>uHIeGhUA5{z1}alBj288++x)%^_b5_o?-Si<@6UPZi+pNz1al*lt) z(YSw!2Qm}qS3bNUlPIYcap11y!QQ>>=Mrz-dAN4-L7guTd5?uDumvfu+bwrZdy4O) zp4g-V+N+hy9?fZe^nS{tbwvl1rMF1Z-risXFB2#Sv+; z^DEEot^?5$I>~-)a<2Pk_DQG8aiq!3V3hcv8vkjcdd<_Psp>Io(Nk_biM=)}ZrRLu zwbaCaj0y&6VgKY5i=7W!B`r6MS{BH?b-DLeqm}0l6>RlOz8BMWBjZ`Tf1RBk8)w44 zXF1o>1SGcmG9Sw4+w2u}FYWSTHm3`!TLS$io%bqvUM}~b;+mc5xPb=)gI3*DNIaZ(=4jcz$E|5gGw03B5=)a?kWo|C(Lc?h@7?q8eStn& z7ka-1uzST#Yz@tH~9@3XDaO6ay0AkwZtQC z)<^$!$WOSr@0&co0i&Q(=dT&ZPU*cly-#sZnB;}ujiL&Td>W1M0zR>RZ-3m)V!!j| z;mX|G>*iebla#*JyX#%<)StOiIN#lo$a~}_`B+Z!$v>W_ad{Im^Cnd0o$ttd`Ay>0 zKZ)1xc;1|Q7k20^@0GXD9_D_Sm-um=qZVK48>=Uu-(CN*&ne*9zHk2?exJ7B?Y9~4 zj`h6Xm*0Bwecwxq7^wo?P1ls$68_i8G3=LMY}ZQu#?WNUvpVdan9+Nd_SvkV z#lzzTOwz?|oP2^8XQ#vzy;J61|IzQ0&!7G{=B$36L*sg3%dDdFraO&-F7y@kM%7s*cD=l*p{k<)(UAYX(e)$k zY55a8KF3b_)bi?MlDCq?{3Fa-?E;K}rdvMkeS1;m{^vD2KX#lfbV~nxGd63voViOS zZ$-uV^KXlcW@<>xKkvExi^Qwqgg?c<_`VdKD)HSPyTWyA$vmr@7y50gE}1%6Y+JU& zM!Y!GzA()Fxbblgevc-;2MlTX-_riG^Zj6V_U{xl=al*7I-)c%q{ie(bxn4eN z<@d&&TyZ-yO?Ei7}a6_Z+ji#&&*5n6m%gWy`Up{9A`}CFV zP1+5O{0)tQ7pe*v*z+rHnRq2mQLu=0}4}LC(SckHP$J-hJh$4F6-9_$PPfFO3ULYtH}D)A)O; z{F!{aY1Fg+He*MTEv2E!jy~0QCb3nYQ>Zd3j|2-=>p)b8i0C`0@MFdnSE`=KJ}dO;l7x1zx)4_*Zm0-(Fk$yX{|X z`ls`UtGgf6W>@^zGiVIfYt)jcNq75V^}o(-&N=3zFJIryY>-&+Nd90G8^4mxjvU3q zZG4P^e5W9y7$<*;ls}(S5*OTPTx9a&z>_`~$F0m? z87DjxeRF3+{LxLS5#@Pzo4$SOE791Yc%)vaR>^Noh2i64ee%wII+dSJ%$}wjd~Qu; zvEKrxPAS(_Q&tAA&|Mnk&D(acx#-@uvaJRQ4tJUsrCjIJj(%WYyV?5A->m8DKHT1H z|3;KA{{Z{_Ewxi*boPEoJa=t<^7(bO*5BXVGmYc(|7`v9(_~wI-71rpmzMc24q{Y} zw+k@baJGJm-3+UL|Ni}FmRQih{7q$EBa70E1@12zx82KlH}lve^N=NBiT_%^YtEQZ z*Yt7v!gl#4iA5dC&r%jts4TKjXnxgsEiO}UZ(3`Q@wpSCoziw9fnC<0ZY=J%|CgRr z;UKi~Zr8$%?zgIS8!s=J{Lq1OsfETPj~RWgNi&yDi!Q31G+}zFWLmPj)r&`ylIDe| zI?FD)xomd+A<0M6XB>@u?v=7_MM_Iq)skmUIiDm~ENB+Gbz_dX=qwHQ3N_A!izI*U z8}^d)81ufEm^uPYW3Rf zX**t3?BM#fYTnv&RjTU`3q`*v-*qk}XYM|$Sy>y}G^N*Wx$M-Y<9B7z$($7{?4o72 z-EWfqr{{G|Nl|b5t$8mevA^DQI(hrEL(=Q_h)=Z6pZMa~sY&e0AFP|$-%Zk5vzJ+z zCvPw7_l|tO-`{?}?|ZK#v+>9gIUB=HuER$R_Vf9xT+3l*5DSWz>YXEWL~QY#qUEBi z|0o{Q&wP{bS{?b}poeO5OYtm5=i8gk+Y6sEy1=n-P2PT^;49Z7FLdhMakH9T^65fw zu*VL(YXK2_B$rB6u&;FWn_*#6DEnfqFP48BVh^o6&ciI+OuA6kF zadOnYcniC1(|FF2=x_3T%cAO{qS~Xs zZ|9#CyZ+vZr#$*Zjml&{?N=(y ze?As3U4Q7(>-T(r3RrF)j=oY=tlz+Nh3^&H4$1d3m#{n#zW?S_y4|i6zrsD6-JkqR z?9W@{Yfsk&a~zAX3Je(5w80Bpg~tq%1Q3!7RweaVfS3%CGIUE zVJE%Jqcu!MS<*G=sF9LeoBGEj=6{S~wv7u7`-+a7kbJ&E*mPZCEFX_D!`m0f?WLCV zHRN#0UEkquw{K&5b4-d1>&X*SL_P&3)u^aOzBu7EO=VKoEEP5DnR~sfj8ta%h^RYf zo;uL@X^O05>O!xTr^5Yor*1gIq0Ra9ROBP0)J|PWPOU%%(N-+#I#7vtIgSRH?8iHq4Wr&*7fc6dZFcM$OEciAiA30{2Ti>eiK} zeyP(YD?gWMwEBJHTy~TD{)F3u%Zis*b!Qney)KM9F*x~dfP*PY8D;p+2=x*ZocJH)+c7u$Gi^O`E(E0M)B zuXU{nWzG9~E8wP~jpB)|`hSBPV`p2;-1yFPQ^YH6z5iYlw@zx9*W#MQcJS9U8NYRT ziD!9IRI{Vx1IwmOGdLRNJ!Q#&u(mT&Dym?n{_Vvq5*Vpi>zRu!g zVwvPMMZv1#Mt<|_7`>%p(~kaaPf)eGk@twB>-^n!{fmD8JM}W``}|o)-?eQyefRUS z6T4T3WK!nnU zM(H`SEbT!DU6VF6YwwZds17>hvS>rAwT>iDdC*~pM;qF`b2R?wg&wh2+SnQ0BO#C+ zbkr_sV|Vr%VTtgdV_$uq+{<~BeD1-FNmkR|m+brbSlM6gM1M@K>8v+T)SY)qDK9dd zv^qve)p*iL$%&gB3ST%M``dmhOwQP2!yXUa$qHw);)-YeKlrri%27FmB`Y|$DyJDe zu2fEwTQbeJp-F7T0hT7YEer1cIq>)FH0$zn#*1|~r8{KJWHVpD$Xn*X{7-Dd0al|K zjh^@aTzx2URkr*#Z;^?_ocxG$7SpV=lEm)52v>e`vHr>@i$fcGb6zB{J1`vLtNP3A z%pGD;f1f>f-#wdA zaX#?$vxpy-+cxs%COnorZgI@$OYe*ItB&3{#3&upv`Sj!-_omRO)XBI?MRxDwUb%P zzTGUUuQxm9vE=y;6(=jKx9xa1ZFQ0I)?yv?BDv`{FH{_N$ZYKq^sis>z-hhF#m6U} zX#8{Ddooz==cUzt>nHCoIdO({*VWzgCN5hX_`2iEGNrwF-+U7HE>2o5boG2)*@o$b zZ_TrI-`>ktZgi^lRm^(p`%CAR^*xJq@p@m~{@(7`f%c3KE$cTtT-#A0pjr2kH}8*# z{QQz#-us?RnZD?$t;o+azso-dzNu-m-d z<^%?=2Mj_9j8YF6|0yk4_hzc1gp-oNA!P@rpd*KLZXD8m!lW;9*vO&zekd57hX>VogCUH5Os^W1vC`zV3$)dRjy3H-kv@G~U} zT=I+*bvBeZEGWf%RJYmqgp7&HVc{rd_HA)y8HX)vnypVTv&>QWb@j+4g~sq72e|86 z1-jV(DmwB`N|ajlP-;`6^sa}}hZ1GD9x$0bV0L>D6tI9bX#rc&0`_&xRz3}u2bgX4 zG@CD2z;&r5T7i-K(EU3-3sQn zy&!7%i<8$X*?QMw>qE&lrxx=&DQiA@X!0&m>y!MCoqjAwoY@>0bnhMcB{R*!uHSLd zQJ)!$xj!v(2zg``_sGWUiAzw5Yt$3hOayQWO<~l^)2zo#%?Aa26mZ6sb9|j z>QpxPmSlB`#bB1Q{;Cu{F=eTwC%%tT{9ZlrTb5{BwnX#UViC0i7eAb4?rCtyQ+~YX ziG)?V5UcV^Th-i(C#8mE{d*c#r26mY5|dYo9#M}2uGe_)9`!A5n+$*w#_pwaORxSVC}-dyns3A(Br5>PZNaF5~Y?Iom%RCX{p`2 zcy=|1)0GEAFEv|VIPAGf)kW%YV%D>?qO^3b#3ZJr5w}#$l9a{S)Y5J(NniCWYg1bG zJNb;dl-ONqz8ueTZavF=l$ICg9hsYAa!%FMNG3Pv2wUVgkrAg{GUg-fs>cwf#%bU_Gjy){vO3SNSUa=^>YSnYTNy~G%(o5H+ z*PMD@Bb89i_B?l)qW#y4ekb*58V4o_WlofOIZ-KdlGe*fMwyeXUQTw(oZ|Iz ziq^{4U*~r&TG4e*qdQOYPvE)KH5$G$PjcTR8B{&)ebv`FBQc99bM~&6xr;m*PrRIS zDRb_vmvbLw&U^K8-lxp@zh2H~%3AR5rTvMOjv@!_1swR>RxaD}qUTtOug)r;JByT} zjv0K)`0DaxcGjz9>(r*nymI8oTG91t#iXp2vsSHW(pngo*_F2P--MQzxdJXTSGlfv zq~v%bWAVJqM;&2nlKOfVtu(iLrS$BDW85p@RITMo*_(uxEf>;qn)7P2Q}!0G*IVke z7RqHYuE`QzprJ3|Z0I9%G`CS=-b?X5R|6xzV>ev{&a&{l%6k0cmHDv->nSgT+>$IV z9bxA@XdaeYv1a9_U$6IXdO9uO^#P%rgHk$kg0LT*Nu7)*)|`oYeel+s zvyaxyS9>$(+M53l59&T}();0br0%tlozt$omrl3NpS;)qv1H}qMXWrxm`gidE%*G> z-s`t$PgCZ}RXLR#-<)pBy^)nZ@l4LmS#NJH%DuJf?X69@w|Bk0eJJ= zWzE_fS?``HB~QEX_IXp@i>`MsCat^kE@z=$&VN^C783{NGq;&^4oui5XTD@LtH_aG z2eV@KEO{GreT`ILz*_D1uhv=Qy|Irt7qh~(&+C=Xp;z_|0{iqHU5#_wUzGPXDqlVA zBxA<=Z$z{>P;JpR?ZoT$KN7)qBP{x^sWsf3@x1>tpMfSW=iStdkOY zo$9czG2s2zU+@3_+m-lj-FpV%0!HZ%jLHSSw!NRTPyh8UJ>~=J-t4;fcU59<7rTwe z`&5QQY{doa)dmVFdJNqkI5w+KQ~AKTxPWW*2d>TQZ{Az`|KcIxQyW@CP8gne%>LMb zz1@KGa{>SL<(!)f1h_v62!CW0aJjk9pzv7%-}?>x)*prUFJln@C=y&Ky7;}|`5d9w z&x9Tq2s?iiZ#LYN(J4B)P;&OhZ%Kw{m%S4!-pF2EC~>$@W`2jr{6g8=AGwxqWXvec z+qO|UeVGh%kpe&G^gD%$(wi8cf0TQiCSU$Rn){P-{m0odpHza4e*8PkbXrr0<*-_D zk$Uwf_2wdt?oS$%i!^6{(p+5hPpjBS$Y2xSe?yhSn`GvPbHD!hGHJEe<08G+pY%Q( z>2EI5ZvLQs{F8yRVb#SV#~u0l+MkV#i;d@h(%-&GS@^R_@w!^s&AQo}jI%$R6>rva zHdgjFHtqg=`rCEW>u+?+i>+3FwkrQ*{=Lwmzt~23b>qxpqs^af9~T?%E|xyL+2;4= z{-_9B;{rS3636GC?1~HR|9^IRy}X~ZM9n?k#k-{6#$=n{7uRHyj*ya_DJAaJB@H=W z+`GScOm_E}{Ka$emeLs|UYkq2?T>lwF7Y{S;(y?a&+RY1t6h8_fARZl;_;%ypSd(3 z`iMVwX`u91dx5Wk+NS>MUxTc_`j~$W_I_gO?fx|+`m0Cy*U;=zxAd=J)uk@wU&Fgg zpS6CCm~DE0>etBCTdyzu8nt`tg{@zsPjB6Q^lQxR(#2Q5#=ibKt_9yAYJB=ZfGX|Ey*}4(fC{P_36pZ-%{+Srv!gXojolz`CHobscFUE()UkEZ~m5{ zJtbrEx6I9xGZ%l$vYwo^`CB&o9W%6y}Y|z-F8c9 z|MyCJHwOj=#h)yUY7GAwbe1w`FdStTVqU)T^0UP!Z_hh+Yxa>_Qx4tlKlH5i=;z+E zzo%aKH{-&;85jS}y!da)&A*$T{@wiS-?o?kj=ubN`UMo7dGYtmi{Iy7{5t#Q_xW#s zFaG^^_20h-|Ng!B_wW6`e}De{`}+?&_zRZ$4N~*x@4p}a{(brP@7=$Dum1ge^6%fR ze}Aw1`*Y#nx08S0ANuop|KC?f|Ghl_@5Q5k?_d1;`u6XiUw{An`TO_J-@kwVpn~5> z;1?432?IaC;QNms-;uyKF!=iI8wh><_7x1ieEs_6%hxYozI^`j<@09<`uyqB=TDzL zef;$4<3|Yk_yG*wfB5kJ{rh+C-@kkJ{v8;+ef##!o40S?ym<`mxOe~ly?giW-o1PK_MKa| zZr{3f>n0f7xN+_Jjq4C_?fUgAH?Lo~d;RpCo5yb6K6B&7<*Qe(T)BGr%9X2^u3W!x z<>t97*Uw$Lbm8K~3m|ar+_|%7&z(JU_RNXXr%#k)6BtA2@LE z(4m8ejvPFDVbAqzJ8xgv{QS!5uUD4-zBvEanW>)+Hb2`@dwW~!)g2R$Z=17i-Tc+7 zSFK#NYQ?J6OIEI3ymaaO`3vSuUoxp{-GuU^J)I}&XJ0H^bt`|}z4WzD{1-pcopDce z!VQ+*%e-YrdD9Pb=4=x!onzcy;op~^R+F2Tla-&JmtRnjS5RD1*;G~2*;Cv#E5BoY zQNzZH{2lF)$NK$__FA3l;XGW+vL}dhvl!177J-FKg1wAZZLE=LCpIiR+%BN(HOFJ)qNCjs##whx2r6~-D>!$_cy3y9a}Xwye0g*rWed%&9FaFE0;R>^0YG>#9>rA~t8; zJ+*c9_4NsdrCeSvUUPGE#^qJ9r?;)Wy}jV^skz?U*WKM+@%h!=)7#hI-(Pr?OU`G< zhKGkcgw;(}hIKqXK0(=gp3lxrPfyP<&c1hM=jP|<7dUsz`R>~C^70D9`@v^+ZGC-x zL-Kw<=iOzqOm|%0a`UWo-~0Oqnz`lu_U!oh_{3!G_;Y)9etv#ovG;txy}Q1?zAd+{r%(f>-*>T@BjawflcE< z1B+P3gT^1Z>i3#>%w9Zbj_yslmh2v~<4CJd%84VwGG#9wwkx!0JnB%Hmhq@lW7&#F zT{_!dJnA+$rt!GPC+Zlg<^pPS}Wv5vZhFBbKfy?U{Df}7UMB~!w(UM`)Hw(8}wIc2Y2E?>~5 z^=icur(bDvir*zaUse9>^7GaIHXPH+cB}ujV9A1Jv8s$kU40Ko=P(xM{!LawRPL?baJY)mn2_ZhG~$&+(kryB$xuem`H^ocCji=$>Cu z$98W!s{MY?muuPY_x^ac`u)B?-(J7p&%mzp;Q)(x&WD2>uXnGVQ&RVP?dqp)Ivz%KXDU7UNB-tOc( z*W9W~pDbjTuV-NLP?!>)_w#A`CS3y9vudO2|UIJw1XKKmtH<}TJNFCd2ZeH3z)dxTyWR_`{hb_{@<@R z(%1j}cBlOP-|r9fd$LwNncTnSQq%JF|9(lcKG=7&F=Ar&l+g8x?vHDH>^KzLWSTgX z7IH6OVBf)&xP?imGoeLI?1Y2&lAMyY1@m8;G;Rvz`OqYBX2IK42M=c5$ZNh-(8l3< zgXe+iV#ya0$1N^QJXG-EQR})B3wY8!4olto&}MOFAz%54!*ahqwEuJ9StL-dVV5`c zeTRFp=&u{ckEmH0DyA_v{Jta3QJR~`lf9r>j>)mZS;a}PJAp-6hLO|5<55qB&tpl` z=Uu)LPQq#3i*Jg}*u*~RUG1!Zxl-Rx9Jh^H+${4)fqki?hm+OgmW~j1t8)hr6}CK< zo?zl8ukLx$E9%pv8E2NLnV&rASM_P~0-mKB?k7(w9eX)th0gr#(|#NY+Z9yH@*&nJ z&GIyZNK;+rgl4%d2T#ZS`ZWE(8&$JSj6OLMpXI)9Xg7M>c&1w7@{E0F*vy(d&t{oj zo_XFz&34vI-{df6`8#i(nXL9aS2XMMoEJXJt*)OuSGMc(+z&m=ZJt}6uYT}&-j9E0 zmfL;r$9Jt?@F&kRt8O}5(aitHY1aZh88al3J7fNaPd5KxhrqWa)+-k zz1nw8U63Rq&l9a0IQ`TWHb(_v-ML8&6B2pCrYLsTJGl61Zwg*q^<{b7)6C%GUQ;%N ziLCVeqaJzvRM@o-jr?K`oi&88L=rj>WuYvPYDDSxwx}7q-IcuTG-8cT|VMwT@Lup_$>QqZUX! z-a2jWzZ^BD2|cGzHS)J4u%xR#ioD1bwnaR5ZGm7>RNKq=!MblRc7%gDr6`$}n zN0*!3>d!-gz8kqN4bpcyip)2h3C$}!+kWT6tnYi+7B;Xh@s2!wk6)mpp{30CcWhVH z_I-C<^E11%V^m*#-+!j|wLDv6C)bgUn+`2#b{1Cb{AtIsU+Ae;%R%l3$39KpQ?_bD zTWj~(+yjNXjs<*B5OL&Ww`MuCaP9_I^E=CfclGpyZ0f@&RrR{;3!G*j;X{S2@Z$<>^F5t>~GHObd=r zw|teN@w-_vv996Y^!hytQu0U6I#{~eKk#9)oUe5Jad1xmjWf?To=e;-W?-PbEaHi> zev&Ysn%jh8_GF3Oi%y2BG3xC&6RaOUbGypggVsh4O;Q#IE;+;&JG$IWe}7=7!t#He zb6Jy~Z+LZMhfQ40%JjXLm^UYtG>aX}{@ife*?Nbx?3T7CZMJW$*A$6qU$-8Yz2LLq(H#Ms?d!S^W~(S$DIVZc z*{Hgl(?R0)qG@GjTe3f-=mkfL`KPgQ>csMCI6Euo8MsgRe=xtkV5S1^_x33(W%#`K zV`Q0@ub4iUr?+=I^Mmwb=3D=>H+v(*2GPjjXpbGRn+ zb?s{BQ=!LyxQ5z&)SA8cO;#BD)uVe#jFlHWiAiVE*8lcrinlcXmi+N&8E;Xo&=k8%l2=`i zUv1=F&L8vbroHvI#QM@7&HEL0P1x~a_oV8DYkoc5!(Q=VT3GY;dbS9?qto*aIfR~6 zFX3aXRldS=`FmaF^g{9U+S$)ie@#n^d|tZETtJ+?OtPa+q?9{sT4`JuAJg{2r0_bC z9i`u%r^s6fTrF>ix>#Rmmagz3*HN^Bg`>tyqGiLR1_2WWrU0JO4HW{6jY=xDO5am= zIh6WbFMKP&7wFcg<<5H}p(u4(y`Xz}!nc$;?u|dpS|c*}EBCFtSy=8MYVZ&d&3NM7YRqPgmBLndH=kp2`Hs73a5rFOOK!18sEPo zsqu&TpVZ>4(9T&JDgq(yYZDkVFL2#8;Ame_BP__t!Lhaz&Tp*N*+B5gRJHeT=*9XT+TP(X-|u*QE&e^;db< zFtF!3upg}GiJK~@H7)*vgyESL5$7cOo_R=gPwQLzfxT;SZ%0K$!&1Tf9-YrU^dA4H zej3sL>xJmFR-WJC1Nsj`6_3JKaloKti&r#d+HNB-(E;_M0)pM%T%#NbY;{2KY zl{creJ5IODoE926p-!@sg5rvb7%;!Rz>qqDJ7ZZ{ z_Xh5-2D6^doTr^OkJW3zo11f*TIWr8G4In#iH|=QMBn7&d%zrWjp2`(z=aQU88&ci zN#JLiCD53<;CSbPpHCOucAclFwQ#NALY=NDB3TQ6uFRBZm?-mVp+eW9b2De}I=R5Q zYR;LJbG~1l^W^6uU9Vzhk3P3s(+sN?8aEW0-Qtt|wNQK39GhK>m1ivoU$&ShaZ$9_ z0`Ff^dQ!_&ZZ7%xljWACfV9?9i(89hy_WELb+TnGvi}ubI%`2n)snQQ&0e#X`*6;g zVL7F)D(+vh)r#L7E1ES|9Gc3^m#{*$E4|KQQlHnP4yjp^2Md23ujHMWCN#0W_(x^Z zG2y6hIT9C{jt6*f91yT@@VIb*aaoiHn}Wc4FOQW~0xKLmHvZyYt;M@@*Xo^G0t+sz zVisH@lOS+p)#@Eu0{d32IoY*lkCxzOE#9rC1eST#OH5>5uEl#u%dpjI<+F&DeV&3L z+gjt6ue5Kh~{?wT5Nm2FndREZG~53vA>!*l_jN29eio+y~cRda$0ea046TCZ5K% z8{E0%to81`T6=+GT}I_UL6Pr`I~;hGp9?=uSi9J4vtIXRv5)JNvIQ&;@Kj$|!NFZE zaeDKQSpwP(Jp2vJCG1>mA2uKD;@Zl^#d?5;$9rp7v_QmZMnCQ~YzMZ)ac}$oU`wp^ zw*9NtDOPW>)n4yjEs)(U;CXwU$mC60t9x{2&lGh`opFKh;q%(+>>|N-hFj_a=bjbr zV@Tb0z2LOLX07rxmWA7cD~gJL%!S?mf9(#7-j;HE^@W7p z$7iojz1_b}vL(^mw^eNK(pneVw$8MGM`y;WOtW&P!n(}zg2~rXR5&FY2fn^=FZ-WR>*l{W8}_PsJ2R&Bhs{?D(iS~7AUwfE2V*k5r|U~@T- z48wtW-}#?kPtDqMATwr7#_MD9I}R+^o>rw(DL&^w3`hIF$Ip-5K7OEO&mn$;edoH4 zD$HhHdtsy6oZam_8_#%os2x9&wtCHl3%i4EZw)wo(!A#6-s+>LE*w6_eRz@1kp}4# zFS1TN?miLJeS$;!2vg%)xoYi}GqXLUR+@VrYmb^) zDmkYjdq4k!+D!t-CoMmgKiJQZ=Pdu-U30Z zH|E|s`$lH%e@=S#URBn;_GS51N82j~xhI@w zAK6uNepAi~Js$x->D^v)Pbc5r=sf$1koKjT+*KiSE+oaAv3@o|^Y7YIGBeiR-1OQj zSI^*b%bkK}vkFSWFU#_zcCWtdbA4TQSixEA)@N%Pqs7)g)7d%e*Ui^=wjJr>x%KPH z)HS!xORe2dzG3CwTl@t_PwrYB%zbF{pOXQ|XL*_r{EhGcRTPUeA?y>agl7ui}fn_t`4$w_M!8|NK7xrTZ*$H4JqRyhZO< z&sy?h#e=fy8`Ed5NauOD?#P3^<~Jr~J)An@fy})Swto+Go9! zzLipb_qFqywd5ZAUwKsfZ zc~AZHwDatqm&83Ut9u@+Cy;FS@Lzf7^SXb}8{}Rz*}ZVT`b7GlR?EB>UHe}2?0YKz zk$)QJtnTYCro_FRR`+rS-}Cl$>awY#^ZvbDAopsK-K!;j!l@tm+nia$Tfz$h*y|HG zdMq z?fGYKh3zBw`6C3=3y*&*U1I+6$-my`d4b~Z1C{Upd#85)!7-lqF`6L(#fB3C6%FJ+ z8`*z0iT`X?|Jh>xXRH06ZSH@z`~TTN{)?0S7nk@iZuMVW`W62>*oTM4dRlOFHhkdv zA1faps45>K$R85P9}&I(gV>MAtp_qy7H~_|SLL+7durDoS^rgJ>$mv&PX+TIem<-G zpFyRp{(Hsz?^XN1*WCYJqrd1ItI&S~#lW2^wv|6R=Ktv0|D)&rkG}suCdmJsWdCzY z{Lg9iKWEJUIcxvVIro3g@z)6Xz`uH*Mek?!mI)ja47h^N$A<;#b~`Uh=%AG$gJ zjM3DnL1b87#eGw;8L|GV|+#U#C!BIPUb zf3Ma5y)pmqt^I%R?Em|E6YGD258ppqG$e3zJ8&-D@QZu?H?0>drQWYhKJh!ijCXgy z#}EHg1?;~hpYGTkqHsGzq(g_%J5pPv^no@*0=14)ecMdwMvJ-i`iBB z`qAU*)9>5u`~BrF>l*$035QyF<=y5)d`vplEBe3rjo^_KdAk-4%c7K%LTWzqYW~$Z zxqivGwA6RL+uW$HS=ZLa?r)Qg{+4rVYwrDHbECKCYKLvB`5B(ZD`Qpp;{#_&N8r++ zn{VvC&%7vaEM#;gQRleu^jkejf}hUB6;!jm=HU6JwSs%a`J&6KlTG5xUUqy?=YeEPm@ZTcTI&`TWK>W6$?RlP2u@%JAj=O5T;P z->ZMzG5N!RCbm8L8Vq-X4Kz6RPU1Vl5SWth`YMX2zvZKs%LhyOdKM#(sUI$Ruiw{q zh22PXddenG_4zGEUYg5OE*Yq5{%SWmZE*X{<_jxcoZYTl_j{3#@p%_xU(@R;n|;mi zw;20bK40>0v!C_*BgX!=-=AzgZ*^Q^aZmlV4Cg+pFAta}IPe6rO!D(P=yqbqBJYh# zO%f(66q$LoE(Y-#s5%A*Xs+r%;N|`Ggi}bmQ%11QV&|`mXCYOpu*!=4E)ToUMmTtI~a{ad1 ztvL;6J%dWGr%qQ=>b~>ZW8b7Do8qe9AKf0;wPlab=5tQ3dwm>EE9^*U=6AD5Y!y%2 zk=QQZW|7pXzHCQQxBfAUf27M!otcI ziZhR@PF0wdUAEqKd)U9D@6x#U?>ZIC)UIcsv2bVbtVIhGg-$*%xUZ$YX6ll+q3-jl z{a)VgnxQz2Iaa2`Z1K`WlU*-oZr>NVD{Y~l*d4CYwCFXP=T~WD?JQj~JN?y?I?IBC zFRQkDR6ajzUU*b|`Xs^Q^5sV+)+JAq*vx}YnElDCvEsm<`B?(UW?XGHc+%ovjxr)=(k)O|9TeYJ{ z%O<6Td)bENX0p0ZGL;U>N%0HmJl`sqTPky2Ix$6e{o7NuERz<8tWj+)JMl6jOE?o~}Q0Y1;N9sd_s%ddGdcG<`oynnCM7OP?gM%QKF5~Q;DQ!tJ zS!(H<^{Ghu`Vlp=cZL>*ll-H9{&d|TwPXl-Iy>_Z^K5po*kR(Es9gF zoRd5^)j&kt;^A^Do0}&#sEW)DKD>DCBh5=YYA5Bh8me2^KMic3b!nNSljttGmLsZJWBLZG|GAaG|S5M4s>>4OgwCkN>y~wymBmk=yTZYnoX9wbAL;!C7MY%m=UC^ID~JFz?dr*|M3p%DitMx%Oq*@mfE>pBI-b zG`qg@e5;=SWR;nx3SM${{qU8##lZ8f?E3Eetoap3t>ZpTE8la(AiwJB?znIBw(ou4 znqTwOI{w|F>HEGP&98gQeJ}CL_Wef~3>vxvdGZsQ3)$TYnnd>`u$kXD$lq4bqH2@K z<^NJn{8&Mo>7GQs@*9Wc*$O*cWggYP;bxik@w%|s#w(^57$rp83VTv*lK)9vzj4gG zPbhUwcB?+ea^8{$%!*Ld6gBNg>D3xX)g&4@oEV(=OBxPKo%+D4 zZIj69F3`lUb~%M@w#3mn3lAyno4{uA%Wp!p?kB!%6DA|TDEEG#x<#W)sknD*c?|+Pf7FYpCy=@;Vk=aL1wJ@?HkAQ zidMMaeH_I8^U8^~vMoz(bC2!)bzxIj$y({&*U6t}8ShIgmSb|v$(nxq&hul_H+lX| zPXG5^^6vY#@;$b>ZzI%aUF+HRb#eFG-189!1#_+)Ryd)X-y|+`^HrMJ?w>tb&E|I= z@~=1CD`@-L_4cicJI%Juob1)AYmvlT#PR8XqFvFX>yi(v^2`r=gFLt=PU!fzy}IY# z_ITf7m%h)WVt0<+x#P}Ld-kdx|9fv*+3&t^SGPR#Huhug>)ltcY}Gri`0=s*7nzsg z$E}*%*L_G&zxz6V`nF4&>)zHR$6OD%|3iG4U%S1`q2~$h)pry(mj>^Sepi0{_kyGI za%^KXQ{-Wy%+Sdv{uZ0m6vZR+`w4jaHX4bKgZ0b>jpiH`<*x{ zr<>gk=Bv6i{h!^r>gko2&z@Uy#C+vf!F9}rJnNU-IDap$o4@z*O}@%$@pdT<3~a(H zp8Qr9+#i>Hz$QgYvF5UL^cUCsx-U!fldl->eN%tjt~Hx~=G({I-+SY$Z{NRH@JKq| z>sh+cuf-}Y;URUuj@Q*)zi(gv%YMhNl<&JI$L(M8_i)^|yWjWKT5i6>ZGSJ?@)0x3 zd1;Yz+HBvG_cJoH+@HKBwBkTg!EVOr*7^umo>7^E^r3r+V{1(uo77jakky zv$#tboQyn>#IcX7WdE6(8jL!)lqazn~f!R9=3OVR|H z2d{gcL?6_?a!`7+#r2F+c)`K5#g31?4<|`De`$7Mk=fwmv+vX4J!hHsgf4Kgp0m-?k7gY?CX;gX^=13;mJRQi58M_$u)^4hS;sQK#5p0uDXpee{7f!8xa%$a|Q|nnyZxA`XQRVa|lhd1BPHzc0y*1_ZwvyA^TTbto za(buDX;uqQjpnVLk9XU~*!~mVb3l2I!;^jgCJW8DV;jBZ)RC6Wt8F%{S#tV#%b62X z&YWCw=G2xmr;nUDzU4HFv!{H`u0o&PQ6Xn8vX~r8kvV?m%)cukXRoH5y;gGedW-M6 zJ3cJ0ee7aP58F6hx^mXi*tfOk?0uGV4@AyARPj4K=PdK;v-|e=UP#$fmn zzDFI;KH75b^^tRLuJ~QIIhS?#bau4WpU*yF%Dne~G&yK)wdpwdBE?^I_PHY~&%K>; z{^yeOzqa^qcysQkr(d%6`TGv%<%7>3&NN)ni_EJjQ`P_=aXKa z|9oXL!&zUZqXAOJ0X2>n*uGxiXT2!kdz#&M4#(B4oPWUY>-%cQ8o3Fn(jI2qvFE3|F+8e zo>!2)q^){_(dN=cZv)lROZu#r4UYO~>=oBkJ%7>QyvWvo;v<*LTsMes71tNNY`OHZ zRj#+uR&nE4Q!Um2?b6HkzA_eT#Vxm9b~3%qSsEA}uK2Tt3LL#W{dC}7AKN^eK#!#twB}y%D!p1I7^0u=4#dkHjWRc;yA9AnKEp1xpp!qZ0jDDvWn};t=B4I zy|ezMhQ-&OPLI7-JM~%y?~Sa`vw=&6Y`}vwZOCU+Oc#HmttXd#b7T^i=N|rZ=v++|UfX5%M@#G&i*4 z=}n!TS9GslITqsG9U9&<^%~a!wrQ^3Q%b`!MI*PUL{5I|wQQ=-)Y@A!WN&Pm61nxx zt(mqrvRTi|KK1^W5)oExK?Qpxohj~st$H` zj+?Pl84`G}?Yrw$#v7J#H+s)guO+$Hlipt4s~WS`CuZf{Q+uCAvv-8o&W%|sa;NIV ztz_0a$8GO4rQZ2>QS|QVwRd(ejaetsepr?*^X{Dkxp&wPwB0;=C+$Xb=G!~_bYsug zGMvo~KM;HKj&8*I)YG%3PMZC9%beKD&t0N*LZdYTgR(b-CRRj8@4d03_3nwK*Ww=B zz4bLbt2aD;!mW>?ceotd?ze`${~En+%dM&pSF3pMe(k-pw&&LVqwzJSVc*tXuNG~4 zbT;P4RED2lPkrx=FPm}y@7ntlRAUm(hW{#U_;>Zx|EUbCd1D#X9&qW!AK03}_APqJ z-UrNLagS}|Hl$t&zI)ABwAUmz!mRdQc<(*+z#xtV_p&y`?GW`o%o{dsZ#<_%6f;BO zZ{5fXvDf!aO;DV6Oa9#{zG-)o-u_EeeRfLj+@09kq#T0=xqqiL*WEdv`iQISk>a;R z?PsTyzdd4K@kpEPv2I+LZr-CusrQYJ#V0(y@%!qX^QwtkT<&QE#`!1T%dbuJ>P=Mt z7$mjrYTgRAniKbA++vPSWsuFgp0?oj+9?SSWMkMX9v{lR?jD!4JT>xL=@Z#^UYdM& zWB;Zw=EYj8J({X}hqWy^^qQCdxs-sor{8oR2YtI5%om|1cGG)X%%QgryyX(AOP{)> zJ+)rvEo>H=D|_Bn_qN^LoAzZ_9rA=MTN|8@vDd6qS!k6HEurkd;K`QEzRNI&E_YUd}U8(9ZSo-mzKFUJbvoq{9|knmnH}G z#l*k3Jz-mXqNsOG-P0*)FE`YrD}}vWf826bH)@uiMCF*@XWMHkxLW%-o1!Xiz!ry z`BKYptoFLXvdn30*EajT{^I(Y-|zmqJt@oVuI<#jH}hP~zG}`|Y2PQ)WW|IPD%N@+N zFPiNoTBh7&2`=a>^ZXk6yeuI1YuQP*1d~?32`p{_EzS}w4lkH(cQ9KPFqp>O zfKqQo`L%uJrv4?h_sdh$%hKD+GMATSA1@2>|1qWgeQW&mg7VgO^YW7L^0M;sis|K5 z`%4nrKP0`c=$8+u-z%9|tLo){Hkkixa$mRE{r8se-&@mvZ!7=3U0!CD`u7>rD`u_#G5h$B zIor#V+`kC_|Mh~WdLsLeN%B7?xBouu{^v;epQGu2j>T8+Y_FI(|HrKD6?3ke`aJ)< zpS@;+`0sxQ)vFGd|G6Ok_oDjWOXjs(+G}?0uR3+SdQ9fsqYi~WTIVk^Y)BnFOrvH1n{NJneipMLf zPHz9bW_wMZZC(D<7f-{_+>)<8q+j*g{r{Kn|6kw#eQ>>Q&H6uk{I9;xPkb&~Z>{n_ z<2~zV_S$dtGliHrgqYZcbTU3D9BSbbH_CbOLGeh3kb2OXjE_pkdU!VPElOQAS;ei3 zkC*9+`*~T*ybBWqA20QuUT>6sX-(#5wR3Z<%0JEVe5x+09lftdbMrFZxi%jEWtgsg z*1WPJXnD}utgl+v)SVLI zx3=X!X3FdRF7J3_UHav9xxdZcbv4=B}F_y<_Kb>nXnfY<_)tb=~`p?~U&dA9Qsl|L=^oOj<50b$6jyU)H0I%jZ>YIJ-rmMbOJ4G49>hG>L*v-s3YG!tXAZNj+Ie?NpgO zr}tQrMg5K)v*N{`L`xqkHaqv8h}e``kC_TR z)t1SsqAV7hmm8mo@O;?AoO)ArVXIWv#px2iEacnsPNk%ExLa9iE}c4!LwHKn3CpET zHLj0&7|wpM)M98jRid$Kd%6d}g5mlwVZfBbq-<0wUtLNQywZC4j zSiDQ{qQ!X$lRgs}9}_-ffmBNkC(}K_{7h%8X1`f=w`zC7>W`TmDN8rMGGDar<*MCz z;rA-V&qeMpidr6bv16CIv1rJG=krdflz7`RUSF*9kMoY$lDC^Lz7l1&=HO`AaPYpD z&Bxq_Z6`C<Po`H*crI^z*?coY&ay7;`R~Y}4!Dd4zjD=$g#douGaDn@rtVmc6kbzTcm(Uw8P)`nlGBi{9&{E#BnR8^7cL z|9^XiRuiMGM_#9#oPGAwj}Wbv9KMn_%r|b{aA!L8GN*QpbL^X0TkTFM9%x!x&HmCN zV#3#hev#55?(B{c`$g})tCOg{<-e#*Z7=JFHZvB1^`CYa+UFW^L z!tGVUs)`ezqq1vmEN_3IRQy;W>9$(<&PI)oP1()UK4-Mq&E)l|;(xK)lNs*UruHX-EqX;Y+~9qqemQ$ zKfGF1f|@q3nWm+<(%ac{Q~9rM#sB9#Onrqm&xolE`ncVvp9*hgs+e45ygJh2xw&=dv=507MAR*py6=s>wAp*_nfb@G zES>*LZl3>d&8e=gX7D~2MtC`$PbUiNkrc&m@W1|g`9?d!Hir4zY3+(jRU0F7< zd!tIM_4ef#v#&NU{%Vui_ipA!v%h@3|7$dTLa(rHoWSbUq?}b}FpISAoU`4X7dFv~=i>t2h6?0j;UnVR1C+GEpSwZXey=paj zdGz{GqigeIAM*AeY280{)5@iXRdmwwGj5pcZQeNV@0#8}v;4QcyS#L!Z7zfP>yzi2 zwryP(+n*7+>ioZ%Vq3TI&dU=1ee3S0Z#Em(zR79LymDLUde%V7RhLg|y^T8&y65on98d4) zkCV3V+ivt;{p#xbfAyB^{Fha=u9kU?_Mc7D_Osb-s6WY)z-YW9h$ZYzqw<>jEasU9 zdG{5}mU?jY?S%!h3=z65sydHe2hH#lJ7&-|dr9J~X-f~wUwhk;+;dMz|K$+8lcdg_9*pcbM(EJUN#! zclYgg_fBsAY{VmfA)4dx3Kqjp6W-N6PrJ*Q^?f(g9-+fUI5}#Qga;5JucbcdC)|RDubxFs|gqPFvE`5r+`6}{=$~p0_ z|HmIm?6>IdPyet_z?p+P-AQCo0ZYC?%Eaf2JDq*r9dG+`(NxF1LrC$N$IS4Ky%YD| zkhsou@2AuEXL0K}50;+$xc5uVLw^qQou_NxHA}=Qdffka`gS?n-j<3DrvC0JdXipW zmqyC^_|AS3pL*i!dSN;BkH@?XTRyZbIKTVe_jBgA`Daep@x1ku@WwrkulQ!{PPco1 z@%HbyjCb<0#p7lBm-cbvtfC&Ci6OJEJ$ko5`JIn2-f?Iduoy%%JJnmW63Y>Ww|0=-W z>Y(4V2yaHK(|;!lSadQUbU1hA;e6&aKK+I(EJ_JKKg56EaQMnqp*Io9T)furA@G^oxm0rEW9d))2-#jSN4}X6V@JF5F_Gz zqBVwBPfj+%+0@|>Ur?ebr_Yu*_dhQ@r)%OZTQ$Ypa>A`IiBImxZ%@udNi;2BeiOU!$-0vI;#_wWc_xrQP2^!BzJW`<;9`Ou`!2D)tJoX8qLo= zJh#arFlkUjnb-QHsS!vzh zxo12f#!WTpmCn+G0ZT)@mU>pnhb7$$b$ayjijzRrQ=dhTpNq~9f2QK{W=ZLnCH~VS z1C}i`Kk!e{yrel!ZfW#4Ri^`~r6-=oSVhMETAFx{Eg`5qf$v$b=(9w-W$`M{N_5nc z7tKg^QcDYyHU1S_eo(yNWH@)&v)!?2Y15X)cq}UkSe9WXkvVHwcGjaGJFlm3PJPh& zEUPFwd*8CWuEd;W3D;QT3_Ks_`bFoxTUMColAk2|pf)_0>v@4%bfMhx5;>MExArW% z^xCyEj=c>i^<7^6%B{$1ar!*@3@i1rUr|ggcaJGvFW>gu$Vn`HntU$X^02wj*SjvS z_DV06I$nA!z2sqfoz(NXHn;j;>V=67RYl8}vT8I-9cgHCYm{1%%b3x;>sfQ1TZ`9= z%)pG+Y0p}#+}i$SX`~fqv?r;#uVJd0bU$ZZLh-fb9dap6MPaL_X4K8g=sLBGD=W5p z*VXQSDLwCGdf8U?=85c ziq<&RePC47Ii!}+JXcQ3KjX00ltXF;OiBVw3NILC4;+-5a!@?tps>zCL5@cL2QTNa zh2<({bv;};@6*cpOj@ZNS_`FCt=N|3tD&{nN^6Oi*3u}gWm#IwtF*e6RwnG!>YDg! z-nWrIzdZN8Va<<+XbPgyHYX;*H1 zy;A7)s$Z`cUV6R8Z1q~F>~(&x*Imk7FQijxtEn2|G^Om2M#xLeB~4lxD`ymCPS4`> zPY^d_aGuepIdff;)`FF@`kZD5>8RRh?z*LR)#-3vRrOI!B9>g{T8)Bn8j^H}Q}pqt3LcCXr+ov*YDtaA1{>1OG! zJs_r~IA!h4dAhfjt-ZBQ_x856xA*DZIkxuBxqrHMudTg%Pxs!lwfElX-v74t{y*IZ z`*g1<efZt#>q@#e(x%-gdVN4|U3!GBpU1mqf$I+@Y46j^IWtTBNn7qbw(J8| zd3(yjey}c%vcU^Ann{#^MSM^@p%DMb#O$dkAr&lgN z`0_u$%DXUSeFoe6k9_*C?y>w3TK{8_{?A)Se@LyrdTssrY3u(axqZo6`!H`^cT#>@ z=K5_$YcHSE|9t8FzgzmupWiX9U-s+UyK_SC|Jr>BdGP-CA^m@59nAj@uMhu{|1fLa z#jw>3x5M6QHTgVnmOH>`cA`aFX2XSu4=YXb*mPpJGZ4DH;fmeI&sr{i4F%7{bRR|Kb1oKBT5`}<=aA4ECW9kP z<{j@Y>#hIfRUoupe;Uh2!S(qIc5LM5|Hx*4^W(jbLfRjGift5JzcJ@X0ULACr)M9e z_&@O-|L~_RpO?Ex+I$nw`4-XLdS4H%6U+a|pw8r5z^wY-iSUHx9O{geE1BTe-pMSXoUZsV;>KJwrHq{H2-b9mGF zHXZ5eV*baUe!nZS+HWYl*hu7aflafqpTy_?eFeL;J|~oZwEuJH?K;OD2R~>We{Uea zMIqZ*`+dI6WkVQ+-LVDY`;iY`Fr*9 zqe2W!Dn0)WY4$LwFdP!n$@5%n6p=hF!rv(J^XfY=M}pQ&iObPUd2_6+MY}@B&7e{9hlBHv22BG; z#{&))I?j$y4w*SHxE(lP{@}awg$8qnhPuz+?=9S1+M9E7-=UMsa%N3pI=w4Xb{(beyEGun31ZwNGbMY58IP!-?@si>}V$y2TZfxGg(3|Cn^%V)lUw zFM0DR=|R2OM>Vc&_0e!reY3;IpmBED522o>3F(K-GY;5qanPS(*?HN)Y>y@LpXR#X zhs-h>W~V#Py?kUYzr&>aKg~{jpRIq`{*BXu(?9FjE4X`@=Y(5M_Sji?+G6qQi&N8E zH3QZwm;AJEs8lsL=+n@kY4B6;h$XLrbHnNFEB%VE&k1YM%IJ@YVPmkr~{wnsCs)oxAh6{c!Fm~v= zU%Bu!%jVm=wx%C8TC+oU&(GTFzv^~ZuKvGk!iTE(=58M#ns?yWw8}n<~^&=84 z7QPCTe(wkSwS6OsaZCPHiYW0tkhpTq9JMUayWmM8oum5NA zbElorHSHcYm50iVUjI2-pU3$4U6@XzW=X}3crZzVYyX&7L;n3g^6$8WeVIc2k@Now(zj=Sw>kR1^j-a#ck!;#`%7ca zZ=JS&;-~fA-@}i8pX~8G{KoU-Z(rJZa?6_@Tj$@}zJGDc|8uL?DXTEO72aO9yjpd> z{rwy>d8PQ=Y}sA8aFRHBd+Z~O-Aq$GfPLmd125+&!eZN=_j9Blj*E}{(^mb!^4nWQ!;~> z`!95xY89H~EAP~&Q>2Mwz!%WJ=Zj=R33tnRb;FrJtYg*e)h}Ln~}; zOfw&^^|m#^2eMy^^{h4dmeaZ|R{4mn)tA@XD=YP7Wag|)oTL`GD(8>Uvoo`f*oVFQ zX}mSf%6+oa^?h@z%io)Or{BG0T71Jb<*d|_?&|HwZym@#eEw~~zw&MS+Uw8f-(U3a zp|2{ZXWr6jGn(I6{!^LsZquu-U46zZiah~`I6avkYJCjQ?w{almbq5*4@=YA_3e*7 zWgii^>s08n=YiM6qq|DHHy#!DUNS*RAXI0g+r@923l;xMII0|&!d9|o=ZP90564$V z*#f&&7WM?4(&Xgw*Vfu5q1Dvex^{yv^3ws_7cw(h=HsK%Hk^rbR`5@u-n?JslTOKew@SjTLlO+wkuHRJE6n5{vv`2c`mG>7t+k=Ar=06h?aM_Z1 z_v`h<{@Ajc8)x4AcDwL=?DxBs?`6N=s^5S7Yfj7eyFVUJ^#51-U~2xopEqaL$NhR) z{NMk%(^IvG$QI#inThGLE!)0)Jn23mY5DdwkNKTM8kbD+^U!=cB_t#=b!x)7zJ1C|IaBPeO001-?onjSo|h5iEdf&UvGvZFIPdM^p^+h zKhy0)mmCsVa$x2L2DJ?)XU--rkgEsEvm%q?J=L?DQ>h z68UJ{s`+d>m#W^xPT!J6+H)jaHT@=bg>L!xNOa>2R~@Io?$|Gn#1Bdw(_BFJqXbAch_D!Dil;^qjnVEj2>n6{ATk_ocq2&3(MZxpFZh3C| zai+i5h2Z&rzo=XO{ORBLZL<(7?{XD|ha7G?N`f5*EdLgYB3ly5#nZH6-`jsy1%6Os3VaVa|M{!Z^j2B`x%iP8H z6?iSU{lfj?tgzmeFIv~FmdHPK5V2b^WocW%OK;(c;d|drU0)mP8qX*lagcA?hE~%z ziGtNP_Nz_X*jxH0S&{q3QMYNErt-c?(VZQ6_LZn$heeCxrd^?S5?+f^C7Qj(t~x22 zbgc<8dVTMTRP;?Vm01yzFPBaEIo0Y(;<^ToBMK2-91r=X?>K7uuJGT)*)dP`rtdsk z`mT7PbnHvN>AS9OeOJ11cI?}{>ANqQ9w~3-zT?ng#$OuH8SeYLHD&9D;ybVBrT&qy z>N_`W-`BtF(c#t6Kgw3|7IeJM`)UwAm8t0ftJ#M}!8r-6`ZEslmVIbelu6|DpK(ZZ z+lN-eIf=aaGY-psGidw&f!*%K!aXGum}T~KX?$%9-MVJ)m2Ae$c**nA*5+P)|9#8V z`~TmW@mGEL*xx9VqR2n09<`@m}Ek?we3o=``2m$&LMmOPysu%t^O>Kl6O;x6kt# z|H)=J^3S@^YW8KJ;M@#X{aF`#%f2jDl+E-spT(#4?UU5AIdStle{#&#{@i`h#@Tf9 z%q!>D6xQWepJ27k<#l?gFOwjf9eIA%wXNH}t}UFK9s7RP^}XM|u5XmhN#vh>`QlrP!VO{!rALYg6?wEODi|@yl zJJB0{iEo%!x;B6A>)7wVt{;>u+t@$%O{)3tn-}MmZCyY2ZEpGR+YjZ+cW%G?iu3*# z;TPKq+RSBc^SkeIOFUh2aPqlF;_hFC1msKi_}{I5QugPuqI~5^|9PLLZvXStaDL_4 z{CS_}e*g2_QNHS8|GY0t&Hui1jh}hcUG}5%ee3&oe_M8(F8{Dq{_gh0H^XkH#oXzN z|MR|4zUCqS{2xcn|9zY|zvij_{GVsb|9xI4U;EO3{;#Xs|9#ykUwTb>-{ouDqG$eo z_xyH$yH!-rW{k|vv@9&55_5XgJpa1Xc_WyrB&aeObe*XWz-~az-G+KO zJU6iTeqaeSU=1x`joiQ*`++slfGxFv&33}yxbuwi0yB^KUpcj&sn#G$&)~bB9&_#n zj@}O(xfjGXFiLYZ{LOKc3_C5h&5^m~0PC?tPRRqD3k$@jZQyKm;G9{ob%z1Z{tetW z&vR`w;5@s5=i~*paz?IjZMH*$2WZfXYK)M1qHT!jQkS=I43qT zcLfM=8uGCR^2>e{R5TP)Efmt+D5U#Q$k0$&w~(XzpB~3b*V|Pe*j+#7HwAE5eiR8b z6!qW8*5k;WkRWjK3~Lo5)0zUweU8jE3~U+)*dqkRYaPTC7qBTPh_inbjV%;tohYGr zKq9_S;-rswDACkn4O6irl+kzkNL z{ZaCEq0B==xu=D4FE`4){V4a*Q2uM7{QHd}#T&vL3Ypvs6+AD>^L|ojHW24ppeC|O zEyqF9>6FBNUnR!}iu>2Hrd<@9)~G1HNzFir$z+o9<$fhc1r+W<|C7|!i8AuF0oBm$n5Yy z)R0lzut-nwfJWse$=pk9n;yz9+n|2fQ9*2yKI&pK>22{bkhEjB&=+$8d|X`-=Ns&Jdq z1a{UUvqEF@(qePR!={y=%^Qs^T0g7R6kGIuwwP#aX#`a%}?SF2z|NGgV(ZqqZ#DQ~*18<1k`pq`3pB*H(ILdx;R5Wo?EpgJ^;-ve< z$#9CT@DxkteADa2iY1E9t|cy>TU>mEOsN2;lgDZu0vAiMC{5R${)L8dp1$(*JYVmjJD;CewU4f z&N=!RAN0BS#U|5Hmd#1>Qi#7|Vt}A%!1@sT%0%fCB0?383X>FVD;EZ-{u2$--5PYX zG3b18(0|5YW78nV&=AFkzU)rH=QjsCe+{-3wM~C0&5|U|#2}P(HN<~v*iYjyb|uM- zgVIb2VcA!0)vrpJB-*x`+D_gYSZ?Ayd7X3UW^chJ+scK$ii$EyqV|%ewvwgMw~GUK zuSQ?|9Jo<2;AU{lO=JJdR|1Y-mA^4nob5pL#i=pOSAEVm#$KEn`Pf+K&_aoQjXuey z!qZHJ4k$AGxEjBCY65eESXO8Rb65obw|L>J(k$Pk+d^&29YZ9qh3S4v)D;V}FB9)E z4cq-NDLFL!dvWB{ugSNK!_J1wVwqAMUn~w_T~y>gwZ&JWY4x}IyT;Y_TZ5Kg&si=mbYx-B;qAHE7BU5)iMzi?giq}- z+?tpAEyVp=($U0{UPrNrF#E^f<=Gl)CyRDXzM86T7GYghRy?&Q`)g2sXuG>fLw!ku zthkG!c~HJZKwxR3^N-fXZ)NV^eFDQ3mMOMe70y1cSp0KF;7qfi=o>+bS9_Yn^QM1q z4Bt`A{jaj}^Oo$JKdRquYu_0@+1j#fVnyzJiE7nvA%BbVmzP!l46U||EJ(eo&v-2< z^I*hkiNe>#wWli*e}4*H{3Bd>>$KFH)vcv=Ti%eJ30q9e=O{(qTp+hn$4;>73Qq_>6TRg1N$TDI-BEZr~Z`!htM=*Nu5 z+a?=_b(%`f|9Eqrr{tv763Ncx^A~>4)SrcdvQfjZNwVJ=?jZ1dlSX-&+b@tTEe%yG3=^U*YsIVmQqo{ zlV|cO#j-#0lbq`Ra7zrUWT>Nf8|%-0=9^JhMFOWzU;a`gbmc-{@#^xaw}PHmmOuRB zzgx1!eD}t+W*g6%E`43K)^lpz%IRDDt8+OQ1v!RRsZI<3dwr_s)ri2W!O^n|3ay2@ z6sH+i*%eCm3YSjjj0(8FJ<(n)fCbR_~t{pe-5#(JZM;R z*mBR|qy3)uZya{5IpX_Z-Xpb4;`8SYgfa z%00)YUv>?=bG)_YL~YFR&Oaw6&N#g&b2wU^pEAjnp124oNC;BYGcjm zoib)y_nbaxbH?@a>7#qjoSma^^3R#8HD`16&))oV_Tio@cWlnR+;c89``lZb^I!MO z{7`fL@1OJD%g-~`Uf{G%V%d8^(Dq{gIrrw6i?V+&{{Hvuf@19@&AIj}doLNowpSzfUR6xG8f$wkb*@4}?X}#!SF`_KE1i3# zxb}MO-pkd0ueZ*<)LeU`H}+!p-y2hFFHEkzIXCwF?7ugc+MZinduwg%+0}nTvCyv$7{o|Gjf{?+HthUDyBK<+i>1u=ZYZ%)OU??}gsE_p$cA zYs~$hfA1UKxzAYl;Arpz&VLWKUw$B1_i$zKL&<*+r(S-jSof$s_>tznN0pZ!8P+{c z4}NU@-thi?^)~v=*?*b`|Gl~T@9@?wi?9ECyK(ZHhjs5B%bmD8@7>3Le=ga* z|7qv+ZQpyw{YRhLec-%r&A$JG;QTB9>^@5FH|O8~QStvddHYYA{}+qx|71AdNX`DU z<^MLl{huA@TbSE_@w}gJxBp9^{c(5uuaW-~{q}!NjQ0$)|CSlg?*Hdqw*7a*Q|~@T zeXq6miu?aP(f&v4{I8w+e+2&jF>(Hvsr5e{_y3$b|MNooUxxL+R?h#l_Wv(M``=sV zf84qMx8VQZ2j~C$aJ2pp>zwemUtI?^ek9kr*!aPhHT8SAP)97an{OjPln zWz#uHY3kIFH90?xmYtbpR`Th>pJI-PQ*&*qfBoS!S#e>ZOShD5m&wXYOFbjE)kqen zotFR51V|G{l~Xo}}$HQ6~<$9L6oo3FdGv*h)yz1`CjB3EQA zU$=Ia`GyAvTezj|dMpet?oD61Ds{ERrY9$-fL5~Z)b!pQcsVF{w&j)=7ngX?wwpV> zFn#}oz}-REyVrMiSO4dmSMcr5#ly4h`|bArTJ*SkeLcVZzCS;OZ#ysVx8MKo@3Xht zpYbO&F!4pquD>nVkbk59_NnUz0Z>7}; zmdj5L^7B-U@d)cooffs}c}nv6zuQx1B=zmQJT+xrXWFcLU^U7GL%a@h0sH?8y#lJ;;c2bFpC-`|~HcSfZ%3Ss_c2(x` zc}>S(E??BA6}w`|ye_S>oJY^%R;}9?^=ef>6KD3?ZNJi9t=;ubD{|eQe_U%4_OW^A zY%Ju>&e?P-Oyl)*c0KOgEk%mjxm&NXxxU?cD=#}}+nqXYJ@pjMk z&7Yqso@o7@XG_05yYH7?XYt-G-R|mVzjS(=^O|<}yZe^51&8%HIm40q2gzu*4u?yCDu(<{C|X!{=a z<6+nNX+IwI?Y{Qo@ubOOKc7rX4*U6ZmjAS$&*qtPR7{!Q?-&1k$$Y(-7h4vctEyjR zf4l0<-I;pTZxb)(RlkdQxUTwr_{VqEA7-sRBDs1IcmJMMN9pg`uqPgUZ`b~QTWA`;qXb(pz%Sp0`t!22iW8En}p`bv1hr_$R(c&y zAu@v989S7f0t>uilJ3uX;j+iku&ZRYlIX*YNs>{%ek#Ll z%|gT8kZ5J;h0l(e8|n5Hxk$;r_SjVx$&=B{sCyiSXKYTCq z{Fkf7^OxUJw^wXCU*C3qKGW7n2X3x|%}OOrT(K)yrC(j(aWYvXGe^VKKI39{m%(DG zv$C9aUQ7Z%95~z~4hgUL&}zi8Zt>;UZQk)*muD0;OW#h={C2J3^2`H{d?hQI<$f@9 zILbH)PIz&|Ag9XKOJl0g)Eh49^Q^dnraTf^8R4oE7s#_DNPoH2)0O^>S|N+1LRVjY zoF!d$>+*cI(iN_@T9Nb9!?x6wu1zX^9X(MzeEllZHMx7UKYf}NwqaB0nmSRrgy*Ni z4~bnXZ@>FG;q9)7yZ=nXHk9`2Bo|kO?G4(te%e%>w5P9boGLRbpS)B%-938uB{i{4 zD{|*%$=|+pr7mpqve2BI$nQ}X?}=^S%$t)Nx%>9Tr{A_5RJ~h}8-3@ztoV+TSML|`?VjY%m4fP{^^&-gjyb#{qIdTJQrG%&}cB@0N=eB zJ3X0)^$HRDS=W7dtXK1}F{eUa_S=U?4s-YgUpF6C+a}W$dghUs_q(G^l7*eAHWpIZ z6-QN$eQbB+c`Wz)#}S8hhW+_APxie0cjK66*qurJcb*)!wLBImc4ta!OzQqv$&-{%)G2P<2$$Bq-{HBc`jqN@!XSX&#jwv&sRN@n*Y0J zt3C6qtR^{=D_pr5%M`6HdPJKn?tJ#bomuzNq-T;#wR<;vC(lZob#KdQtGAg`8?COW zNt>>8O?wqwt#ftNHHp>Hxf{a|MYThC^hZ9SR#HoIB-_N`}P+jp;Bo8Npp>XF>`EvItxG8S4K zO+Hq%E7tch%kJNI#k;?^?exiy6_334<6Qarqc!>U`Z|mX;Dh@)KnM5VVqVDT#9+a& zoQq48n_CQw#Cdqcd3Ypvc_nyxCHeRy`T3>z`K1K}qy+_K1O;VFfz6_HMO&_aI~^^wzYM$ckpm@@^W(ac5?P{cJXy_@pW{D5A^T| z^6(7y^a}Cv4h5qyFK-m&?H%Ur6YlL3h70-lhWYr0`}&6a`i1-Xhx_?Q_y!Cnu+-rlx0PWM*e)=j7z%=H}+*<>lw+ z7Zel}78Vv26%`j3mz0#0mX?;4m6ey5S5#C~R#sM3RaIA4*VNS1*4Eb5)z#P6H#9Uf zHa0djH8nRkx3sjhwzjslwY9gmcXV`gc6N4kb#-@l_w@Ai_V)Jm_4W7nPna-a;>3xQ zCQX_=dGeGgQ>IRxI&Ipt>C>mrm@#AK%$c)h&6+)X_MAC$=FXivZ{EE5^XD&EuwdcB zg^Ly~TD*Aik|j%)E?v58*|O!!m#cq*@Cr_R}dFu43Q)f<}K6Coa*)wO) zojrU0+`04TFI>2I@#3XRm#({T}xN+m=&6~Gw-MW4I_MJO-?%ut7@7}%p z_wPS=@ZjOYhmRgTdi?nDlP6D}K7IP^*|X=*pTBtV;^oViuU@@+`}Xbo_wPS^`0(k| zr!QZ=eEyUBoQh5P70$!Z=FJu^4VJvUb;Q^@7J z@C%QHEQg;ObZvTK-DJ7QEw$>>XUJQxYf61hi>>kLMt!=EUYpQQxZe(O>Vq$G(Zfj|2Z*AjbXXj#P?`m)FX7Awc;Nb4y=;7e# z>FDI?=;Q?|E1<=Nx0AECv$MCe3kbQmc)PgzxVrkdy7{=d`MSINdU*JGdir~L1$cW0 z`uGI;`UUy>2L}d*1P6zPhK7ZQM?^(MMMp=+#KgqL#>U0P#mC1dBqSszCMG2%B_}7R zq@<*#rlzH(rKhK7WMpJ!W@cq&4aL#`TokN=6$9(nt=q7E{l@hhHf`9jY2(Jt8#is) zv}w!c&09Bb*|ufNwyj&YZ{4c;1swhIDPu`nKO{008|iwN`gz5E?vG1DGIJ$yM|sG+`D%VTnIdZ6aX(? zynOTK?S~H^zkK=n?c4VsKYsrD^^3^-4$Jr0X;5kK54ALaUE{$a=sdAe1aytZ#>MVk z68~cVcx+m7a*eGX$;b8`dhNkN@M)85|PZWlU<+u^nRq{xEL z|NfYpNA_&2|H`$lbK(2_ng{qE%bwYhI*~zQ^4=fmzHX0C8!V6b?asV8eaeHlj>>O4 zLDzT$uZ}wlxyIx4Jm1~h-rn9({QBP6-P`eBJOtb{9=3>tWjt(^NL%r+O{VO{!hnB2k`p?Vgfx;m)P!0VHK_jE ztkj^pOCq`6c%O%|li54-#XZ)Kt}Az%tFbKU<9=EZ->o_+V@a*&q8&^6ZRXur-0xsz zsXAFZD)Uii^g0PhVFhlw#4&wf=w=LISZ;5ZW#v_26f{jeZnaAGHof%KW;rV&3gE012Acj4WFYu{Gf|FiYgzrFAO9s2O^?5Dq% zKK;J=@!NxsZy&#Z^5orvCvR^(d3gy$zI*uO!@DP+em?p1_sOS!qX;mt-?!iYe*FIT z^Uwd^fB*ma`|rMv28=fJFZ^6IkzZY!W8d-CT^GbN#dr6IX4*fgL z1M2?&I2uvIc}P7W`zYfM+0eTiSr3+rt~)lT_^+l}RMM3R;R`w*2wu6L*3NnCQNyRD zGY-^gH;FG!X)<&dDAT_cv7m}I?Ynp}AJ6q!Rr@Axm+x9EYAG;5JFGILTiWfaVkBe3 zkHrN{6PHVL&S&MEAAh6MGa!pua9SFZ;D(or%8KT79-MtGuskC3%F1v>(+V+{=(#UM zcS=ufW#U@adoA_mm1)VP51uwx^;X_^nN=9e0yQqJ#6^pKEX`lA z>1E8Sf4xVSN3L8m)lGZRnoRc9i^CMR%S^j+A#1tgOtEd6Y=?q=$*nrTcKc1r@}gTg zj#svN-P+J(CjE4(=moAh4%?YNB(7WLcUrrB!{1pC<~7I8TG2RbQKhcaji*)5_XIzh zow0Y~#?#U>{%O6MUCh{gd(nK>>#KCOGIV(B?c|)_y)O0DrR_5(pZgc7v%{#V{iB0c z+|7?i%{M*!*gLuP&6^WuV$;@7Qs;lESEYV`^^N4&tS_Hzmo$FUzeD1g$EMRl&QD*L z=d65|Ipb;UuEGteda(kP|3t6dUy-YKSL&)@TiMoCtJ8W-_qgoVD6MAsAu&J6rv3GK zdj^#N)n!5AYg2cX9dEhuFM{v++wb>f-k$xwqd`2c!ljA7?#H7Z^(i|Z^}65t@%aCN z%iEvKVD|fIuNX7$=X0U_b330en7(iBi~l(c4KLTs_Y1SGF~3vrdduUj<<<-~4Bwfz zey z>G^f97-S~={rP75`+vVb9M}K<=gal{|9^ixU;qE#pYQMg|7YM?z`*WtfJy2@1BcH7 zCh-#o*sMM@3iK>sQTI5=6$QR?h|T=OLB6UF%?dmVIov%C3C;S@qT#cUEBwSEv0Wcp z4SE*xVBR^j9dzeVyT=hFsgE5VK8u8=pE#ms^|3RcXOYNqkE2>qAG;#XEE3y(;;3Gg zV8g$P+v3MHju>=J?8$iY@b;k@$IPAu^yHK*mPxNTW^wLgpRUbg`!^lO?dApaSFKeoRBTpEtj@YH*}e^{oEMUjzoo~M7in&xx#q)v;>8SIOULd&A>zx z{~Ra32}uE~tAcm7h92qFw7~@4s>B z*!61{uHC(N>*d=g-+#aO^AC=m|Ni&v`@d)3{yqKj@9Ad*dh!`o-GBb~@{NJA^|NcDt_vgjGzaRho`-Qy?N)OThI4r>>{_p>PlBMuy z`S%Z>frMoL<2IT4Qg|JM$2yQcurG0j8%PDnfd7zsJe~vZ-GS7t$Jsc&x2=g}Om6)l z@L_#!!^X77r&@pcAGo!x;`Of?r?6Y#@Uii_!6Cj%+h8?~%8lt0oTc8>23Bo(dfkQbaIN41U4|CXe{TgWo|wJ9EMlr6 z_TrXu2g_c27Q=e5`Qctj*T=i^a{^fe!k$&|k_4Ckx)@bQF#yMob4jp(Nb z?A4aP*%YF^x#rVp6MfOmXH1{>Tsdp;I%l$`1L*ER7xCOL7d_P1e!1jh{`Sk|0Oq#` zE~vTZe!UuzzV_?2nDVz@uP3zYn%xKv{(JC7#`3k_Zslx$`|WmtdhE6ft|7AD?^Zlt z`~Ba&n(u4B+;I|4+eBG|=sp5j0GzBX*{CczHdY<*g;NAZYGB4{m@cZonc72i(|hz=(nH*Vp}icRK(7-!qs0_dk~wC}_GY{z3lYukZVpnm#nNYq-tIv|tOflUl?7XoY|8 zmfJ6FWMgktR$ySYFyS=|FfE^~aEWh*L$Jez7M?i^{(QMU?YrpPChyM)w^BMxrR3If zaz1e62(CCRBjnriPpd_qJKDo;(ZPUBGm&Va#oJsKJq&0sWL|V}-VbLvw!%8+HS-1k zHy-4B)XMHX!=a9gV+(8E0o`R5$m6DaH$Qpdw(#u4 z?pzn;3%}Ua&G{OIU}#+bz%jTXnP;tcB}|FCmx<2WgN$e^ctSon&&hQJGa`DS^(~UDd1#^lg zHYO@)RK7UK_aooGiDi}^XGh@o7eNc8_hz`fe(4;$%(zq5_n~~@hrrCNE3;mhtk9I4 zaj7+FeG`A}OFMO|3rta8Sae0BJQ}%zt;Ir{oO!j(y|d0v77|%BVb9XQ$f^*zZBwSR z&t2tvy8UwfA(I84)+G6xdY!8f>z%Hq^V;%aW?17Q(WV5|m3;3#kE%3%?fAu_EwElI zc>A`})z@FI3g~}zIx?#?W6F~U{?(n1sa(1}S94Mml`SGUoxasSUzC%~yE`QLR}qs| z?J5KH*?#Ov0dr2>$qw9Tb=k;IY{OaM9Xc+~kE0yhE;^=^WJ-xjpF1b;cH6s;3*=^2 zdYE(x>|hjFm;ZFtxu@^Uwy%s?C&k$iet(tOD$6_ZVcFg>H;lH_-m{g7JLG-u(>-1N zXTIyJZnoe1y6gMiNN%2*=ic$lPHx}#in9KI$8g6Jh zIXhv&+x&w9_g*#2$~@$%EtMVq<%JQAAyc zanzu1V^6xz<83S~;IU&i(Ae=mrW*{B45|#vIk`ljlS!ayBynC|3FsV>fV6<1jG&OL zkg%Mvh`flXqNtb>3@M9>A&{7uvY5Dvn7A@7Brc&W4w+<y2>Yvb>@?S}dRqXKm?Ggd{K7ZR?X4tFv zdopoe5Rl-hzn0=)+i_%;y;L@DR`bQyh=V0BAITk=9j@=Vul6ew-<~pq#3^n3^Hjt2lW|jDd>Rsj0I1Wf_smY0a~=z1ng<6+2z(bIv#W>AyAo^h)32YcjX zG)D}}Hghz! zbTPMfx3KlJwDYpE^R}}0wzBuJviGsJ_px?>BVTI=D6(y^9pnK4)gF1 z^YjV#@(uU)3-|Gl@C}IY4~h&7jtUNq4h@e9kBp6sj*E#+h>uT9N&?Lj4}(b}NJd|= za@ERJt5<<$jES8x#>nXV4^Shc-?(|}=Iwj8?>)Ht;PJgj&+b2Y@!;93hcDhediC+~ zo6nEmetq)p`;+%So_zTA^yBZRAOC>Rr@v1@=-<;%I1thZ!1FKvUVi=e?%ThQ-~WC3 z@%PKmf8T$D#%Vzr{RkqX3&veAG+21J{lDIqWR8uC96N=jqgpx)AG`Jab*lO^V?(k> zmkR$Zo0W#CE)xv`cg08w&GDIJ;#{_Sr(wEBu2ovso${deiwiUj-*G#vzTY3J$L$rv z#p7z9tFcIEkHgpb!ij(9IJicvmvfP2lwvZzcs{DDCG~7wNz&T+TssQwlZ+MHB<}5r z;yuPH^W%QPp(uXkvXvEvCy(`+JN3mB8a-{FcG~FNo}GmcPR{=<=eOqOhX;q6^q1TG z)rYJF=>lc!IHsKp-Hhf8%gv0PEKQv3ty}{fJX1XVs=@+i=0t9)josUqaByPck;zG0 zC+EzZP@mSb#Ho9~W#0+&X%{?aUrJbdwPN+<{*C9i>^u4R;=yM(PrQG4^83rvzdl_2 z_2uU8UypzPd-?a@vw#1d{`>bBj9&fw_x9hv_n^U%fB$}isW1Qjz5Dy``JaFHfBd`t z<=@56|E_%b_xSt2*FXP#`i*0}Vps^{9?rlyN+oxYxF7D? z|No%_G5^sgR5%#}8ay^GI@&D(nf(P%s4U@dIB;a5M)0bbli=B3Yo-UuM$695wkUpe z=j7$bKC{%Txn#Yzthl&X<)_Bl&Mhl1FArGU^=GHaiYuTAm0GW@udc06INX(b^Xlsx zn=>x23XPb?&$TT3@u|7pTXp3n3tqmudpdl1tewH9Z?Zl+3{LE?G2k!&tp!=)m8v7^ zQ2Fuk=^4iVr!X#Hl4syG>h4>$1$Fj!^SqNg5BczPq+-ne+FyTWe4zOAlM9Qz=lkv5 z_4W0QYVH?nu9(f|-nsc7Z1%U5f5!()=JdO!n~BIDi!FHeS0ma{3^e=8Cw1guyF#1B{C1^j8IL-z%CjmM4r zJ2aSC`FTtlyN&s#2lPAq`hK2S)FnY+q9fDt2MwNPmiL|b4=k9?B(Pvv1GDyrWd~R; zr8*q27m1mvI@Rvo@+mX@mc5K~6x#8?DIjK58lz+AC&y=*Nm-KVMT#O0jX{<7BxPpR z2&{Ux@QLUVWqDx^k;W{pKaZP&6#rzV&)pZG{(o6-ilh7IsX_igh&AdfL>q z;%jE+ihl<(XDyvOSMK}Dsf)ziSFPORR=%WLbVF6t{H;t;&*#KU(mcc{d`44Xg_o|i zz_e&9?aa(;O|OFd-ZRRzvs^tsrf7XLA;4 zRUfb~e3m(DO~a?t?(<8Zb*^81w|A%JzU6nTR&H$2)6qOs6B3ZWTjKEdcMkJbs=eKM z?A*^)`({}6^%3vkpHFi!9v~{Q1q+O1tR4Qiom2SLI)-YwG?q?}w4h z7yGE@HB#4DkMruzE2v*vzP~Jyd9Tz>fr_2#CztMg^Y)hC?gvXR8f(XyWS2Pa`H|K3 zKG(9y;DGkFtf}XA<=oZ(9=&u+eO=$I+rGiIxl1N@B^0tvn^e2@wfO!y`Y(dE|Eqda z6#s5_p^?N+%jc{DCOQQ86(wadB}82?zm$M59xwv|{x_Y^}dAoafdwPO8 zrK4R^Jc}FGty{NY!^X{e6Q>dAGi*BZ~onR z|L@Vqf6u>w77u&^w@82f`S<%TbhQAaPJ@u}3hn${XqQx2E9L}jITNHpljf3{ftXo% z{^c{=WmKA~Xo!aGMPi=X5Vu{yWuen}V6|bxa z-JCVGO7!)$^$8Qpc)hpfoL?7rc2%sjknZj61+ICsy{G5h*-Y2Z@9*uaWae&r z@qPWngB`-sU%Ukj5{^z#w(j$>EPQxshH>`2GdnjwKfl1aTh4damY0`TP`aE6UZGLC zoC#c^J?c;aRcIQ^Ry^v`+4ka5x4|)u$2}(3G9LF@JX`U&&*s~U$Ndg$nolOUh-E&R z=%Kdq$s`}Mmro`KxPi{P3CnysH6m^0(`hkfFP~0NXw!T)BV}6VvzZyoRz91Rv+d=x z*#*ZmpU)||mic^c#j};q=hb|B`Fwr@o7Rg3En-XQqv{f&c%_)2Ja`}Qbtye3SOv`$;a>cS$uU4(u_UhH@D;th!y8F9SFhI}VAFoH;fPrFn~f*bR=?SF#_aW*%@^FX-)^}Qmi>0?jkMKox7{gw{dW6< zHtlyio=nSrxAVoa)$ew_+4lO~?hnVb-|zWyE&F|`giNpso68Gp6}JChe(O6jv2z+6 z{P(ZI;E;pfnGOAX_Gglh{J#?Xp-<$$@%f{cX@B}{WbVKCXn$UyvC#30fX|UrYOgB{ zY`OP*>K9z+@Q44*@eK}}&ev$L?U zx3qM$vUakuaj~;=wReE5WA$=!@&>J4b@6d_@o{nWadY$a@bvTa^7r!g_x1_!^$qm% z3knE;jy;Z!JYrkJj<$pyv4)*S0}^O!*deP{AtR5^pTBtd^3|I+h^6WuKYsrF`3rp5 z@%#55KYk#OIYL*j6I#Cx>LP*$B>pk{{fSo0bFuQZfQxxCcCI5QK&w`T&Ff@5KRrHD zujIWd=H&+!ujx9;r&?wPE%Tjf5P$EEr_pkkc@CD(YAj7wT18;`*cC++8Ok!0Nl~!^F1fFQ@l0Z22?!hz|2V<0K=4 zm>Y}IMA!T{FMQ}sM^c(Qhd{iM=AUFK~A+*|9L-j)G z?%lgDUcC79>C+GJawL3n7myYs#U%P*iVMT{x1d7Fv5}cq?vHvv;=vYPS+x|4j}H%a z@rb&qbWB|2+AC-sB%@K3a&n@)pwg2Y1Lu<=;VfL{+^-rc#DmnSGh)(Uc+Tj| zxLi<3P*4~P5)c#sAt3=#aZyDjMQt5zLjwa7BSUKgg8(g^S~=C_{L&{_MXxdn-(V2F z!60&tQTzm}>Sk`M`TX9Kgd;m7;v1xrs^zls)XLH{t7G)*{ViIZoF?l;tyIX~CRKYt zs{63igk#cEPAE*iUfuE^Suo3kY&d3$c$o{E?wtq~`B zLeEYNzAz=^{It-EGo!E0PkFGc{K@K`$E&B^T|E2j+w8zNoxW!E zveheBu3EVgLatoCV#Ts$%a<%&zI5rbB}OAD#wU53pXYCTS-$gC%l@~Mj=!IC`u&1aFBczuu;$>k4g1e; z-gkP}z9akhA3S{M(9t7DPk`puK$B~bnYHsEaN)v*3zsfmzIOfkwVR+_Ss?P}P0-$~ zn>TOWz75`(b^ji8TNZd@)}u!cA3b{b5KMyDplupYpMv&iJ%9e<`HL4I@;R7%fec>0 zcnJlsUcGt)t{mUKd-oO&KCK$4{R=e)2JYGm*fAS7e_g#ic`JZSy)-`}VI{@(xh_x8WvH~xLQ^zYq?zt8vme6a2J?e)JN z?fL!o%9^g^Ru}(@R;W@nX4sYJ$RJTYp&PURmjV}4|mCW zZ(DP7bDX?J?CPLt(c764PtNrg7h8qDwr37Iy{*V`@Bc4dx6aHoUV*<;w|Lu`>XlB7 zeoHy0yRF?(Sbk!%cKo?LJ3l{1j8Y=@sQl}mA6L-ulacMxYXAGcALK9p-zFZuZ{5DX zzkhsweIGJP$)@oDI!X!Oqrzl2fq{ubqd>0eb?S<^>i4Fq@}?)Qrl0G0W|I71-SNpQmpAS3>ty2PS{>74$i%)r@6JLFwMB0}9#<^iF;QEl$0P0i-XG6a zzu))g+w1rHD=ia(CNVFVqFZgNdL?(&YNg^c2Agk`PS==Um;_obR`XG<{6m$ynpnOP zr^Kb zz5=(-$a@+%vP*Bcq+2$n@YBgj9y_(}l{a28SM4=W`ls|{dj7wkbw6}ElIR z`9r<+nLd6yB}?82c1U^sDE#-I;ZOWam+MTITFb1V`7E&JvYf!*fBVx9vhj@$kE*x$gjM1kG&gp<^#2^~I5l*CVZaM(PUIH6~W ziuzB6t(+=Vnw__Ki)XN!>^YRU*@0Dk+J$*Rvp!8(;j>gL{N$;yU7x0I@OjGI6=Kks z!J(Skar^6z39Y(s9wu%OII89$c{)kz^NbTd%Z#RvkFfgcT#yOtl7RNo$70voQXK$rL>%YL$FFeny%;;FIu#R(!af%{u<-gl5$_F~n z)&2TBpMiIUL#41*=D)|&G&&z~7ksp-mB! zIv!#h7O?7SD2i8}I4rqk0^80GCE@M`E8Nn(F3-C4Wf}Xz9;O?S1~#%SV%s(x)eE>4 zF!>g%$dnFEzv-v0EVB}wYxVTy3MZ=xu`iUwt5-D3cCBi87r02ksCHGvaj$Eewz)g~ zzwvVJieLQ|Nlrpd2U=yHWt~^M(<QzyX2HW5K7qX_WDqGMjr-CdEvV@aV7+%N zjNeA>uzd}8%gtGi3O6*0M6$Q}N^-6rnSg!T<>U;QFaFzw9EIlJJgBE!ucESdS! z3vZ{~Q=7R>+3)i|ZSR^Sk>JE#IS1FZ^7%wG#rPllx>%-Vqe9}BQ`@-Q=NaW4b!@wl zC$TeWS^lJrIxp%4b{%$3C@M%kouMMWbK7=Sre!a)Gb$9sFCE=`bjD?GwnCPuvlDdJ zt?It*Wp+GhS3z9&9B1uYjYlGis_K&F7y8`){%*&Pm}483U5>sJ^CL>Z*UV_je488| zah4s6W+e4Vv?b<&bEv(9Z5>*)D7=Q(@!L$2L= zOY;vaK1nvWI(gCTn_xvFui}f}C#~6jY+5@ve{zfR4KI$8tsi@HbM9Ze$Hdt_<)H7! zZymd@Zq)nkckb>ZEB=(bdry6q{C8;sYsKw~LtZNlmbV|s@M8b7P3l`ofjDnwzJKJU zy`|smk2T(QO^-SeyYBlw>3L75p1=O=%eozxbc;W}I2Lul|9(Z|=Gz}j{x7b};Q0B( zr;K&?gRjRv9V@WllYN@7p7HE<+s#6LR;ecHzpw0H$CUTkJH~SWA|PdC-$zT`;T zzDv8XcJg$;ilq_PHqCgepC0a0TE1_xLd10|sWS_>bypmGz0NkRMw6IP4fMR~Ud!<(DexFB| z|NT(f_P31P>DSijBHZ~EGj#m={=AB|-*jrZR_6A9>)HGwG9@na|NDB}ziw07{l`p+ znd=tx_oPk9kbJPb?&ov=`q}gDzxo>7B=+J0&+j!_{~m?cGg&l568#9nCHgEjAaMcPuw>*ulqlqsi?@ zOF)H?#|a@*i56Lnn!p*YRu--M7PgpGv_?s^MV@H=|DielMN86*wrGo{Eon`$FZjQ1 zXz`V3$ckt;@MufRXwArIuhD2sv0$@P5Quk>d7!}f-+}4hjt9K57g(4YS!;iE2z#{s zXJGp$z^9UsBU8YA_5*Y5176_bZ^q=Iag70WJT9@2i`S5 z_}A^|+5e;G){DxDh*qByO(i>eA4OE>bmZklwB564x3K7YGb8Qpi`FWMzPA?rXTJ6o zXtY1r(f4IX|Af^3!iu&}C;FLohX3p6cj{zno>6p0adGpI3 zlQ=XdTkZ7G^PFV;bMmt*lM^_mxM=!0?QD0QIpuiC6vmZP{5ZXRJSX~FPF*cB)xdLV zM5I^P%*l~Ar#^F=yxqO^gT*B0ms8U!!xDDZNM}w+t(=x8nV#txTIn&(RK>E(=A z&$h#gGtWLSxcuC<`!LI_$XO{FGWR~!9Z>NyVC7g6IjhgJ?aRly6Bm3BO$n(#(6Qm> zjFbxbEuH2ISNgY3n7#Yt?9R$QjYC@e!iFmz*iJdX(fojYSLB@Lm14q84DO4}a{dJi zL_9JOFs@y+h4Z{7N8JOKE15Hdisl-Av0+Wrcznrr4ueIH!JKjd*5{FPbwU&~H=D5u zY703V-apLI?J)0a<^1ZI^YmQ2-*^fXUszDA5LfgeDgOgo?g6&!4QyEp*uoMPRCO-+ zwQ|92Pk{!5MGY4$>IxRUGY&6RU@y49HuvblmYMTkODY%y!G!3QP-hQ)@v zoOD^7Gl~VC1#>hja5NsUsK3DeKAFAv16#<0#rd6KKYuRNFA;D)!s2s*B}R%hP=Phb zfHfq5HB5jx=+!iV3k+GW82B7KC#y{Req%y-Q)}w!Rg=&DTD|m?$VIE=mv>FNYPITo*V;q7 z*1FzYdt7SGNv(B{cdgp@YVGx30?S`be(`Jald9Dhq}F}hHTmJgMjo#`HOPw+3Pr0ujN$UD7AZ|%GKLN$nD_%#f`+#jSda=)uifPp#v)z0$OMOMvv&pzh6H(wkLwum6@M8N7RI%Q zuV*^FUgpu(wCZgcyEpF*+-O|A@o(1TOzG`K*4yP6x7pp^vZ88J$?oknx3}{rZok&G z{lluQb;ruoeQLQ z>FnN_#JweD^>&$u>^Ta%*4*A@=(x-Nw1DI4)y}&Gt1mG9-@sLah* z2ma&*%xV|7{~g#Zlep)^Y{C7%1?>y=oYvkedvMRXf4_w`XzyUTt+K6qx84FSUO_%q zLpJG!dva+^qPY|cJIHjdz(`A z_J7tp=Fb+ada(CF^nokgyrvTliUuCM;Juf>M^Mn_Ah+US{lbH$KKtcu1ZCF~^bYku0^7UUcqSfV-g8Lj&K|vIm$7aA5Ci{zKLR(Q^bIX$xGM zee{3B;eQVfF&FOHpM5Ox4S!nCu>v1~oeBHiOCRU_c=Z2=!(}{dk$(>U%knw4_rkG+ zH3AiP1gsp6iPxN{s@Y?@;aKyXqb+-mpIv?Y{{-$vpOfV_0@>(}gec_ZNFv(w|u zUjC0vObc1K9v)%g5oEiwCsgLxHSK*f{+u|Fz4zJb%$PX>p*2U{4NhG0KFxFR@Z=Z# zue47dtU1Y3czE}mJtunhY+1AK&2F{@ImeIIoZ)pmGo|C~Tkf-`<{Unyv*+FHGdmT| zayp(Z@HsrG=B&(xqr2Xm*|X*x-CbLQ0Pi^&Tv@FgCf zD|5uA=HDghzZbb{FFxzJsN{P|g7=aZ@2Nv`F2%iJFC}Ia<&K6VmpK8 z?wJyEY0{so_j68|oVm7B;M&nOS94?c7x{K}_UyOlJy;@pEN#shi@8^i*<3W$xnZ|g z;P;)Kf9D(#Sje?QTfoOxaQ&MDPtFL0%oPZ`yZe>*xwhOJH~(C#eS0(6_j20bVtCA&#ge&>$$S~N^AElvOOQW=Xz`H$=PquM$6pD&AnPsdxLl4jb*QQE|U@L z`^!I3_vV$=`=)5@5#M`Z?!Pmam!3U6o#(E|+RK6uuh#b76M|TBO&hB|_dus>p^+?&%FXvp`t9?&E_RgW+8xD6jH%1@2JzHI5A(#GzD}shM zukAhBx##GO52v$y_VMwazw!4dm*4sQdmd!|In6Wi>dx4QJnJ5coV}FVdrkfx_x%I= z9%&z6U3-uF;KPHx4|&(^*PCF?ex zlTV+Y+PzDq@j-L!-(#Q8Uj3|dZQ9=xIcx5Bo_VV1cWu(0lZkO> zrs*7aSa+Xm;j#F0w=#5}<@!CK{@k48#hudC%_V=;tJN_fO zyO(nxa4NjndhbPA^$VBWL&s%BdfvU5X18@h-Q-Dn51a#EPXG7PefGc0xC{~Wdds}AQ^XZg=^ z{NEDoKP8|4Vw3+(wewrt{%@iAU-RaFF3|t3?fKm$|9hhTx2pZ0Yw{=6t^XDx|Kncg zXQv5YedB+~SN;gj|I+yWn~4LXiNm*k{-2_nKjZ7ayW4-7p3gXA|Mxlh6X)^&m|FjN zaX#Y`f0mZ|Uvuw&t)Ks6wLi1ygI`PhnV0GR=AZd%+x>4lK-J~X!uP+KIsZ(N|91HO zuNnW||2W?N=g*2iIrU%8?*HvA|NGMXKU?~LoR0r|z5i!({I}cs6Rz<8dh5sh(4RSf z{okki`=8f;5uNb+oIi6!{-5{x|L)rVyt@Cxu6#y@z(%&UVH*NEZ%y&Mw8)`m!JlS{ zz(+1!qPlTMW&}QV>yx#uW04Gc;xS3pcb?14pr>BF0k_udWX`y_G;l@2)}^0(?sCnpt6QqqgPV z-PgMNOV*j0ruonAy!@&j!Ntry$+pVuUBaPOUU|1U7LV_&Dckw%YV<;;c&Yl{S-z_x zKBt|VYg_*>@8_g-*LKH#Ra)%W%=C0o>cmB?veDmiZf%`yv~IWP`Uq4D-U0uuX_pZXcc;3GGmkV@%{Hpl$^z7m@>u#HTPrj%7 zg?G-+KQ+I;zFn@*JM-tp#CzIbc+c4}va5Ws_%rP>pX9%cK;KPVY6?!fnADeSa5~F( zr*H4Vs7wI|PF)s57s1Pi3ikdrYjHJ|dL*3ZA|BuJaf#5^$GHdhw{ZCHlPG_((Y+_l zC%{pp@%IIH<^DT@Cs=ZGdR6mY)u=s+9`O_&&J+)Nz02-wB2Q78f^$eqfk3jL)ER@2@YKS&A))N^WSwtBN-vn!oihFCw99GsJB|kV zxc*$$Y}9pTTTJfGGrIQo@)Vb|>F<%9%BFY1bo)IQdscNOc8>!~r^+PURhh#fCGoH) z`>pGZbFQ^nS5CIb|0_-mxLP8S)O~--jOA_2dv+un8;ea!>a$go^qye8Y1jFmtY( zRo3d~vv-|bwfzD9sgf(<`ge<2RxXJuxt7lES$Zp9{blgt-|J+`?>isXx_f=E(&EgussC+% zcIJfd``JCC+^(uq?C8;o4W`romA}~BUswHZ_V<6kpTtf|Hrcyh#-!xL(d+wqKkfb_ z^X>8Vboug6XXXEx*nhh}zu)H5j>EEV656d!DDvsAbo%>mQ8=sWibUSr4rbXm0tfzo zY^)c*GvD6iMSqn?v(&o?cjIY>Jdq2UgnK292#LJdqdG-jpyvUL&V-9Sr8}CXF0DAu zR=VRbU!6gVvd%-!;2npaZT-Nf-}8_syW+6Sy9=GREDJe2Gn__`f`4vdpM|^%Dj8*ncyn6^+CZeV{cjeiOg`cPU{Yf)$)jSt8 zskr#rnx}mGEjc<27(@>XFuL6M;8i~D^NePjew+#DQEQUw8rq!SLD%lT$p^dV#! z-%8K(9S0up|BrAozWwq-`@hT6KTdg}z{bcJ$r0T8TSd)XmHlES-xql=j&$KU2mGh5 zyRvvo&kMHakr&NfmI#`x&3qiebtaq1bVY~sD&4~?FSf~j&GU?X7PRqY$T7#Qy{^8R zq5spa>L-=XiK>0&yVNserIhHJqQ|S)Y*(IO;M>60*YZS4rSjVD&`XWE2bQRbSN?1F ztNS!zp@?$uOQ~zh--MPQ2uV*^ZWXbmYwK*U*yRb5(%ZLu+OQ^a?wgxh+&AoInQl(H zt)s2~`|A0oYa1E&zRECqwc{=3RH+W;)&q zy=o@9!}Ial@bK!GCtT*s6OO#ipZR<96S4ALVXN~>JgZ~pr-pCb`84m$p5KR)e{2*u z#{2%%Gz0cqryean|1^>PXhd8{LzB>RU;Uz++8u5MhxW!CQLMSE5&!AjqJ2{$SgJmI zZ~A(#asPrJ`Mk_MH>$oA$Ue(pGfHFR4op!x$o(!)_LBjJS3{E6X@lcdGc*#yq9hKV zkYH;!KgjWqwfRSq_X=lu51lUI-wdnn8cE)oLxd$z4?%Tn9itnk~nt{>aBX})f*)C2|IQ)~yf zZ??@VntuDv$$Q^+Ufr9Q@o)L;yYJh+Z+fi2Zh6LWecg?XI@1;=W%}Hh-Ol#SYGsdr z8^*@z)C%^zyI(1@%n#X_t*dX zUjOeO`vC@#1B@yMzAfI*`Ps+ltFkyN5}ddi`)2_ z6pJ-Br&_cL%CrfY929mrC=zl|H07XJ$wBd!gA!8?N-jAlwdJ7nk%KZ<4$3|`DEH-{ zJj)@$Gu^2U8&w~fUX`}zmD#}c+MNH>0dD4lX%h~CE{ost?~wM9LpoOu={`B6_vMg2 z%V7hN!-gt{jZ6+3yBszNIc%D8*ldZD0L#JBh{bimdwD_*srFcZE^fDFQMCMW*q-Hx zgUAs_l_O3jN1R=bxP%;WO*!ILa>Tvmh{u#8o=c8+Z8_q7FGu59j)j=G z2CE#kYT4AeLn~S3XsXPyw31`#EypsZ9LrpCENjcL>?6l=t{lsKaxCx5v3!=}1tP}_ zRgM?EIgqO3mh7U_wLvwx~ zR8DU)IlbBC^cEJ^z8R+q8W<%cm}R-z^)4(ZIM5XPfj#FyjANXF<@vFBu_he4vr7yk@_MGN*Iu{#o?pDn?*-vdc22AI+_*`6aPV$D&%pBiq zXU>^votO1G|E1;Zw-Wz3A)QP9Fdm%a&-;l@Z-L*v6yLuret+&PxV@)!=amJ&t|%~w z2GlED_$zYm;F2>xRW7i|UNBS$IGw_DQ09!Th5w8c|7T|cuD%KQtmDhad-1! Date: Mon, 14 Sep 2020 10:52:01 -0600 Subject: [PATCH 166/276] Added #ifdebug preprocessor for test version subtitle message. --- SceneManager/GetUserInput.cs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/SceneManager/GetUserInput.cs b/SceneManager/GetUserInput.cs index 9c57295..81adff8 100644 --- a/SceneManager/GetUserInput.cs +++ b/SceneManager/GetUserInput.cs @@ -8,18 +8,15 @@ namespace SceneManager { while (true) { - // Keyboard GetKeyboardInput(); - - // Controller GetControllerInput(); - // Display this message for test versions only - //if (MainMenu.mainMenu.Visible) - //{ - // Game.DisplaySubtitle($"You are using a test build of Scene Manager. Please report any bugs/crashes in the Discord server."); - //} - +#if DEBUG + if (MenuManager.menuPool.IsAnyMenuOpen()) + { + Game.DisplaySubtitle($"You are using a test build of Scene Manager. Please report any bugs/crashes in the Discord server."); + } +#endif MenuManager.menuPool.ProcessMenus(); GameFiber.Yield(); } From af2476bb2fc50c6ee97ad5754b0ffcec8dfedb80 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 11:30:14 -0600 Subject: [PATCH 167/276] Extracted Draw3DWaypointOnPlayer method to PathMainMenu for when a new path is created. Removed referencs to DebugGraphics class --- SceneManager/DebugGraphics.cs | 73 ------------------------------ SceneManager/Menus/PathMainMenu.cs | 50 +++++++++++++++++--- SceneManager/Menus/SettingsMenu.cs | 9 ---- 3 files changed, 43 insertions(+), 89 deletions(-) delete mode 100644 SceneManager/DebugGraphics.cs diff --git a/SceneManager/DebugGraphics.cs b/SceneManager/DebugGraphics.cs deleted file mode 100644 index 606f921..0000000 --- a/SceneManager/DebugGraphics.cs +++ /dev/null @@ -1,73 +0,0 @@ -using Rage; -using System.Drawing; - -namespace SceneManager -{ - class DebugGraphics - { - public static void LoopToDrawDebugGraphics(Path path) - { - GameFiber.StartNew(() => - { - while (SettingsMenu.threeDWaypoints.Checked) - { - if (MenuManager.menuPool.IsAnyMenuOpen() && path != null) - { - for (int i = 0; i < path.Waypoints.Count; i++) - { - if (i != path.Waypoints.Count - 1) - { - DrawLinesBetweenWaypoints(path, i); - } - } - } - GameFiber.Yield(); - } - }); - } - - // Can this be extracted to the Waypoint or Path object - private static void DrawLinesBetweenWaypoints(Path path, int i) - { - if (path.Waypoints[i + 1].DrivingFlag == VehicleDrivingFlags.StopAtDestination) - { - Debug.DrawLine(path.Waypoints[i].Position, path.Waypoints[i + 1].Position, Color.Orange); - } - else - { - Debug.DrawLine(path.Waypoints[i].Position, path.Waypoints[i + 1].Position, Color.Green); - } - } - - public static void Draw3DWaypointOnPlayer() - { - GameFiber.StartNew(() => - { - while (SettingsMenu.threeDWaypoints.Checked) - { - if (PathCreationMenu.pathCreationMenu.Visible) - { - if (PathCreationMenu.collectorWaypoint.Checked) - { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)PathCreationMenu.collectorRadius.Value * 2, (float)PathCreationMenu.collectorRadius.Value * 2, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)PathCreationMenu.speedZoneRadius.Value * 2, (float)PathCreationMenu.speedZoneRadius.Value * 2, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); - } - else if (PathCreationMenu.waypointType.SelectedItem.Contains("Drive To")) - { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 80, false, false, 2, false, 0, 0, false); - } - else - { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 80, false, false, 2, false, 0, 0, false); - } - } - else - { - break; - } - GameFiber.Yield(); - } - }); - } - } -} diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index 18d13b4..f14fcc1 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -37,9 +37,9 @@ namespace SceneManager public static void BuildPathMenu() { - // New stuff to mitigate Rebuild method - pathMainMenu.OnItemSelect -= PathMenu_OnItemSelected; - pathMainMenu.OnCheckboxChange -= PathMenu_OnCheckboxChange; + // Need to unsubscribe from events, else there will be duplicate firings if the user left the menu and re-entered + ResetEventHandlerSubscriptions(); + MenuManager.menuPool.CloseAllMenus(); pathMainMenu.Clear(); @@ -69,11 +69,16 @@ namespace SceneManager } pathMainMenu.RefreshIndex(); + + MenuManager.menuPool.RefreshIndex(); + } + + private static void ResetEventHandlerSubscriptions() + { + pathMainMenu.OnItemSelect -= PathMenu_OnItemSelected; + pathMainMenu.OnCheckboxChange -= PathMenu_OnCheckboxChange; pathMainMenu.OnItemSelect += PathMenu_OnItemSelected; pathMainMenu.OnCheckboxChange += PathMenu_OnCheckboxChange; - - // New stuff to mitigate Rebuild method - MenuManager.menuPool.RefreshIndex(); } public static ref List GetPaths() @@ -158,7 +163,7 @@ namespace SceneManager { pathMainMenu.Visible = false; PathCreationMenu.pathCreationMenu.Visible = true; - DebugGraphics.Draw3DWaypointOnPlayer(); + Draw3DWaypointOnPlayer(); // For each element in paths, determine if the element exists but is not finished yet, or if it doesn't exist, create it. for (int i = 0; i <= paths.Count; i++) @@ -324,6 +329,37 @@ namespace SceneManager } } + private static void Draw3DWaypointOnPlayer() + { + GameFiber.StartNew(() => + { + while (SettingsMenu.threeDWaypoints.Checked) + { + if (PathCreationMenu.pathCreationMenu.Visible) + { + if (PathCreationMenu.collectorWaypoint.Checked) + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)PathCreationMenu.collectorRadius.Value * 2, (float)PathCreationMenu.collectorRadius.Value * 2, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)PathCreationMenu.speedZoneRadius.Value * 2, (float)PathCreationMenu.speedZoneRadius.Value * 2, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); + } + else if (PathCreationMenu.waypointType.SelectedItem.Contains("Drive To")) + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 80, false, false, 2, false, 0, 0, false); + } + else + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 80, false, false, 2, false, 0, 0, false); + } + } + else + { + break; + } + GameFiber.Yield(); + } + }); + } + private static void PathMenu_OnCheckboxChange(UIMenu sender, UIMenuCheckboxItem checkboxItem, bool @checked) { if (checkboxItem == disableAllPaths) diff --git a/SceneManager/Menus/SettingsMenu.cs b/SceneManager/Menus/SettingsMenu.cs index 27f9e61..de40767 100644 --- a/SceneManager/Menus/SettingsMenu.cs +++ b/SceneManager/Menus/SettingsMenu.cs @@ -44,7 +44,6 @@ namespace SceneManager { if(selectedItem == saveSettings) { - // Write to .ini Settings.UpdateSettings(threeDWaypoints.Checked, mapBlips.Checked, hints.Checked, speedUnits.SelectedItem, barrierPlacementDistance.Value); Game.DisplayHelp($"Settings saved"); } @@ -52,14 +51,6 @@ namespace SceneManager private static void SettingsMenu_OnCheckboxChange(UIMenu sender, UIMenuCheckboxItem checkboxItem, bool @checked) { - if (checkboxItem == threeDWaypoints) - { - if (threeDWaypoints.Checked) - { - DebugGraphics.Draw3DWaypointOnPlayer(); - } - } - if (checkboxItem == mapBlips) { if (mapBlips.Checked) From f200a7bf22e5bcf1a626ce456af8fb094ae5850a Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 11:30:52 -0600 Subject: [PATCH 168/276] Replaced Game.LogTrivial calls with calls to new Logger class. --- SceneManager/EntryPoint.cs | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/SceneManager/EntryPoint.cs b/SceneManager/EntryPoint.cs index a75af57..d6edc62 100644 --- a/SceneManager/EntryPoint.cs +++ b/SceneManager/EntryPoint.cs @@ -28,7 +28,7 @@ namespace SceneManager Assembly assembly = Assembly.GetExecutingAssembly(); System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location); var version = fvi.FileVersion; - Game.LogTrivial($"Scene Manager V{version} is ready."); + Logger.Log($"Scene Manager V{version} is ready."); } private static void DisplayHintsToOpenMenu() @@ -72,25 +72,14 @@ namespace SceneManager // Clear everything BarrierMenu.barriers.Clear(); VehicleCollector.collectedVehicles.Clear(); + PathMainMenu.GetPaths().Clear(); - Game.LogTrivial($"Scene Manager has been terminated."); + Logger.Log($"Plugin has shut down."); Game.DisplayNotification($"~o~Scene Manager\n~r~[Notice]~w~ The plugin has shut down."); } } } -//GameFiber.StartNew(delegate{ - -//}); - -//public static Vehicle[] GetNearbyVehicles2(Vector3 OriginPosition, int amount) -//{ -// return (Vehicle[])(from x in World.GetAllVehicles() orderby x.DistanceTo(OriginPosition) select x).Take(amount).ToArray(); -//} - -//Type t = typeof(int); -//Game.LogTrivial($"Scene Manager V{Assembly.GetAssembly(t).GetName().Version} is ready.");*/ - //// id is hardware ID and needs to match PatronKey, which is also hardware ID //if (Settings.id == Settings.PatronKey) //{ From 3ebe712148a51c141c124bc9ddd5d2ad569baf35 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 11:31:30 -0600 Subject: [PATCH 169/276] Created new Logger class to automatically display Trivial or TrivialDebug messages based on program's build state. --- SceneManager/Logger.cs | 16 ++++++++++++++++ SceneManager/SceneManager.csproj | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 SceneManager/Logger.cs diff --git a/SceneManager/Logger.cs b/SceneManager/Logger.cs new file mode 100644 index 0000000..8df0206 --- /dev/null +++ b/SceneManager/Logger.cs @@ -0,0 +1,16 @@ +using Rage; + +namespace SceneManager +{ + class Logger + { + public static void Log(string message) + { +#if DEBUG + Game.LogTrivialDebug($"{message}"); +#else + Game.LogTrivial($"{message}"); +#endif + } + } +} diff --git a/SceneManager/SceneManager.csproj b/SceneManager/SceneManager.csproj index 15cb3bf..5f83c6d 100644 --- a/SceneManager/SceneManager.csproj +++ b/SceneManager/SceneManager.csproj @@ -51,8 +51,8 @@ + - From 70ef7a6596473ec49892d773148e2098a4938325 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 12:00:45 -0600 Subject: [PATCH 170/276] Updated TracePlayerView distance value to reference BarrierPlacementDistance from Settings class. --- SceneManager/Menus/BarrierMenu.cs | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index 1d2d565..d3a2609 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -48,16 +48,12 @@ namespace SceneManager public static void CreateShadowBarrier(UIMenu barrierMenu) { - if (Settings.EnableHints) - { - Hints.Display($"~o~Scene Manager\n~y~[Hint]~y~ ~w~The shadow cone will disappear if you aim too far away."); - } + Hints.Display($"~o~Scene Manager\n~y~[Hint]~y~ ~w~The shadow cone will disappear if you aim too far away."); - //Game.LogTrivial("Creating shadow barrier"); if (shadowBarrier) shadowBarrier.Delete(); - shadowBarrier = new Rage.Object(Settings.barrierValues[barrierList.Index], TracePlayerView(15, TraceFlags.IntersectWorld).HitPosition, rotateBarrier.Value); + shadowBarrier = new Rage.Object(Settings.barrierValues[barrierList.Index], TracePlayerView(Settings.BarrierPlacementDistance, TraceFlags.IntersectWorld).HitPosition, rotateBarrier.Value); Rage.Native.NativeFunction.Natives.PLACE_OBJECT_ON_GROUND_PROPERLY(shadowBarrier); shadowBarrier.IsGravityDisabled = true; shadowBarrier.IsCollisionEnabled = false; @@ -90,16 +86,16 @@ namespace SceneManager private static void UpdateShadowBarrierPosition() { DisableBarrierMenuOptionsIfShadowConeTooFar(); - shadowBarrier.SetPositionWithSnap(TracePlayerView(SettingsMenu.barrierPlacementDistance.Value, TraceFlags.IntersectWorld).HitPosition); + shadowBarrier.SetPositionWithSnap(TracePlayerView(Settings.BarrierPlacementDistance, TraceFlags.IntersectWorld).HitPosition); void DisableBarrierMenuOptionsIfShadowConeTooFar() { - if (shadowBarrier.Position.DistanceTo2D(Game.LocalPlayer.Character.Position) > SettingsMenu.barrierPlacementDistance.Value) + if (shadowBarrier.Position.DistanceTo2D(Game.LocalPlayer.Character.Position) > Settings.BarrierPlacementDistance) { barrierList.Enabled = false; rotateBarrier.Enabled = false; } - else if (shadowBarrier.Position.DistanceTo2D(Game.LocalPlayer.Character.Position) <= SettingsMenu.barrierPlacementDistance.Value && barrierList.SelectedItem == "Flare") + else if (shadowBarrier.Position.DistanceTo2D(Game.LocalPlayer.Character.Position) <= Settings.BarrierPlacementDistance && barrierList.SelectedItem == "Flare") { barrierList.Enabled = true; rotateBarrier.Enabled = false; From 530686a8b2ba74b2f5a01fb208ca0f442459c90c Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 12:01:28 -0600 Subject: [PATCH 171/276] Removed menu option to adjust barrier placement distance and removed any references for it. --- SceneManager/Menus/SettingsMenu.cs | 5 +---- SceneManager/Settings.cs | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/SceneManager/Menus/SettingsMenu.cs b/SceneManager/Menus/SettingsMenu.cs index de40767..f5c3294 100644 --- a/SceneManager/Menus/SettingsMenu.cs +++ b/SceneManager/Menus/SettingsMenu.cs @@ -13,7 +13,6 @@ namespace SceneManager hints = new UIMenuCheckboxItem("Enable Hints", Settings.EnableHints); private static SpeedUnits[] speedArray = {SpeedUnits.MPH, SpeedUnits.KPH }; public static UIMenuListScrollerItem speedUnits = new UIMenuListScrollerItem("Speed Unit of Measure", "", new[] { SpeedUnits.MPH, SpeedUnits.KPH }); - public static UIMenuNumericScrollerItem barrierPlacementDistance = new UIMenuNumericScrollerItem("Barrier Placement Distance", "How far away you can place a barrier (in meters)", 1, (int)Settings.BarrierPlacementDistance, 1); public static UIMenuItem saveSettings = new UIMenuItem("Save settings to .ini", "Updates the plugin's .ini file with the current settings so the next time the plugin is loaded, it will use these settings."); internal static void InstantiateMenu() @@ -30,8 +29,6 @@ namespace SceneManager settingsMenu.AddItem(hints); settingsMenu.AddItem(speedUnits); speedUnits.Index = Array.IndexOf(speedArray, Settings.SpeedUnit); - settingsMenu.AddItem(barrierPlacementDistance); - barrierPlacementDistance.Index = barrierPlacementDistance.OptionCount - 1; settingsMenu.AddItem(saveSettings); saveSettings.ForeColor = System.Drawing.Color.Gold; @@ -44,7 +41,7 @@ namespace SceneManager { if(selectedItem == saveSettings) { - Settings.UpdateSettings(threeDWaypoints.Checked, mapBlips.Checked, hints.Checked, speedUnits.SelectedItem, barrierPlacementDistance.Value); + Settings.UpdateSettings(threeDWaypoints.Checked, mapBlips.Checked, hints.Checked, speedUnits.SelectedItem); Game.DisplayHelp($"Settings saved"); } } diff --git a/SceneManager/Settings.cs b/SceneManager/Settings.cs index 71d3349..768ef45 100644 --- a/SceneManager/Settings.cs +++ b/SceneManager/Settings.cs @@ -50,17 +50,14 @@ namespace SceneManager foreach(string key in ini.GetKeyNames("Barriers")) { - //Game.LogTrivial($"Key: {key.Trim()}"); - //Game.LogTrivial($"Value: {ini.ReadString("Barriers",key)}"); barrierKeys.Add(key.Trim()); var m = new Model(ini.ReadString("Barriers", key)); if (m.IsValid) barrierValues.Add(m.Name); - //barrierValues.Add(ini.ReadString("Barriers", key)); } } - internal static void UpdateSettings(bool threeDWaypointsEnabled, bool mapBlipsEnabled, bool hintsEnabled, SpeedUnits unit, float distance) + internal static void UpdateSettings(bool threeDWaypointsEnabled, bool mapBlipsEnabled, bool hintsEnabled, SpeedUnits unit) { ini.Write("Other Settings", "Enable3DWaypoints", threeDWaypointsEnabled); ini.Write("Other Settings", "EnableMapBlips", mapBlipsEnabled); From 480ef8975f1cd9d02113181904a176836bc767e9 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 12:02:20 -0600 Subject: [PATCH 172/276] Removed unncessary code, updated references. --- SceneManager/Menus/PathMainMenu.cs | 2 +- .../Object Classes/CollectedVehicle.cs | 85 +++++++------------ 2 files changed, 34 insertions(+), 53 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index f14fcc1..62ebd5f 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -224,7 +224,7 @@ namespace SceneManager if (collectedVehicle == null && (directOptions.SelectedItem == "First waypoint" || directOptions.SelectedItem == "Nearest waypoint" && nearestWaypoint != null)) { Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} not found in collection, adding now."); - VehicleCollector.collectedVehicles.Add(new CollectedVehicle(nearbyVehicle, path, false)); + VehicleCollector.collectedVehicles.Add(new CollectedVehicle(nearbyVehicle, path)); collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle).FirstOrDefault(); } diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index cd8b0c9..bc962dd 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -5,91 +5,72 @@ namespace SceneManager { public class CollectedVehicle { - private Ped _driver { get; set; } - private Vehicle _vehicle { get; set; } - private Path _path { get; set; } - private Waypoint _currentWaypoint {get; set;} - private bool _tasksAssigned { get; set; } - private bool _stoppedAtWaypoint { get; set; } - private bool _dismissed { get; set; } = false; - private bool _skipWaypoint { get; set; } = false; + public Ped Driver { get; set; } + public Vehicle Vehicle { get; set; } + public Path Path { get; set; } + public Waypoint CurrentWaypoint { get; set; } + public Waypoint NextWaypoint { get; private set; } + public bool StoppedAtWaypoint { get; set; } + public bool Dismissed { get; set; } + public bool SkipWaypoint { get; set; } - public Ped Driver { get { return _driver; } set { _driver = value; } } - public Vehicle Vehicle { get { return _vehicle; } set { _vehicle = value; } } - public Path Path { get { return _path; } set { _path = value; } } - public Waypoint CurrentWaypoint { get { return _currentWaypoint; } set { _currentWaypoint = value; } } - public bool TasksAssigned { get { return _tasksAssigned; } set { _tasksAssigned = value; } } - public bool StoppedAtWaypoint { get { return _stoppedAtWaypoint; } set { _stoppedAtWaypoint = value; } } - public bool Dismissed { get { return _dismissed; } set { _dismissed = value; } } - public bool SkipWaypoint { get { return _skipWaypoint; } set { _skipWaypoint = value; } } - - public CollectedVehicle(Vehicle vehicle, Path path, Waypoint currentWaypoint, bool tasksAssigned) + public CollectedVehicle(Vehicle vehicle, Path path, Waypoint currentWaypoint) { - _vehicle = vehicle; - _driver = vehicle.Driver; - _path = path; - _currentWaypoint = currentWaypoint; - _tasksAssigned = tasksAssigned; + Vehicle = vehicle; + Driver = vehicle.Driver; + Path = path; + CurrentWaypoint = currentWaypoint; } - public CollectedVehicle(Vehicle vehicle, Path path, bool tasksAssigned) + public CollectedVehicle(Vehicle vehicle, Path path) { - _vehicle = vehicle; - _driver = vehicle.Driver; - _path = path; - _tasksAssigned = tasksAssigned; - } - - public void AssignPropertiesFromDirectedTask(Path path, Waypoint currentWaypoint, bool tasksAssigned, bool stoppedAtWaypoint) - { - _path = path; - _currentWaypoint = currentWaypoint; - _tasksAssigned = tasksAssigned; - _stoppedAtWaypoint = stoppedAtWaypoint; + Vehicle = vehicle; + Driver = vehicle.Driver; + Path = path; } public void Dismiss() { GameFiber.StartNew(() => { - if (!_vehicle || !_driver) + if (!Vehicle || !Driver) { return; } - _dismissed = true; - _stoppedAtWaypoint = false; + Dismissed = true; + StoppedAtWaypoint = false; - _driver.Tasks.Clear(); - _driver.Tasks.PerformDrivingManeuver(_vehicle, VehicleManeuver.GoForwardWithCustomSteeringAngle, 3); + Driver.Tasks.Clear(); + Driver.Tasks.PerformDrivingManeuver(Vehicle, VehicleManeuver.GoForwardWithCustomSteeringAngle, 3); - if (_driver.GetAttachedBlip()) + if (Driver.GetAttachedBlip()) { - _driver.GetAttachedBlip().Delete(); + Driver.GetAttachedBlip().Delete(); } // check if the vehicle is near any of the path's collector waypoints - var nearestCollectorWaypoint = _path.Waypoints.Where(wp => wp.IsCollector && _vehicle.DistanceTo2D(wp.Position) <= wp.CollectorRadius * 2).FirstOrDefault(); + var nearestCollectorWaypoint = Path.Waypoints.Where(wp => wp.IsCollector && Vehicle.DistanceTo2D(wp.Position) <= wp.CollectorRadius * 2).FirstOrDefault(); if (nearestCollectorWaypoint != null) { - while (nearestCollectorWaypoint != null && _vehicle && _driver && _vehicle.DistanceTo2D(nearestCollectorWaypoint.Position) <= nearestCollectorWaypoint.CollectorRadius * 2) + while (nearestCollectorWaypoint != null && Vehicle && Driver && Vehicle.DistanceTo2D(nearestCollectorWaypoint.Position) <= nearestCollectorWaypoint.CollectorRadius * 2) { //Game.LogTrivial($"{_vehicle.Model.Name} is too close to the collector to be fully dismissed."); GameFiber.Yield(); } } - if (!_vehicle || !_driver) + if (!Vehicle || !Driver) { return; } VehicleCollector.collectedVehicles.Remove(this); - Game.LogTrivial($"{_vehicle.Model.Name} dismissed successfully."); - _driver.BlockPermanentEvents = false; - _driver.Dismiss(); - _vehicle.IsSirenOn = false; - _vehicle.IsSirenSilent = true; - _vehicle.Dismiss(); + Game.LogTrivial($"{Vehicle.Model.Name} dismissed successfully."); + Driver.BlockPermanentEvents = false; + Driver.Dismiss(); + Vehicle.IsSirenOn = false; + Vehicle.IsSirenSilent = true; + Vehicle.Dismiss(); }); } } From fdd454783f9c7a21423025727b5dd175a52270af Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 12:03:29 -0600 Subject: [PATCH 173/276] Made GetNearbyVehiclesForCollection a local function within LoopForNearbyValidVehicles. Removed condition regarding a deprecated TasksAssigned property. --- SceneManager/VehicleCollector.cs | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index ad1ac80..0947170 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -34,39 +34,29 @@ namespace SceneManager break; } - Game.LogTrivial($"Vehicle: {vehicle.Model.Name}, Waypoint collector radius: {waypoint.CollectorRadius}, Distance to waypoint: {vehicle.DistanceTo2D(waypoint.Position)}"); + Logger.Log($"Vehicle: {vehicle.Model.Name}, Waypoint collector radius: {waypoint.CollectorRadius}, Distance to waypoint: {vehicle.DistanceTo2D(waypoint.Position)}"); - var collectedVehicle = collectedVehicles.Where(cv => cv.Vehicle == vehicle) as CollectedVehicle; + var collectedVehicle = collectedVehicles.Where(cv => cv.Vehicle == vehicle).FirstOrDefault(); // If the vehicle is not in the collection yet if(collectedVehicle == null) { SetVehicleAndDriverPersistence(vehicle); CollectedVehicle newCollectedVehicle = AddVehicleToCollection(path, waypoint, vehicle); - newCollectedVehicle.TasksAssigned = true; GameFiber AssignTasksFiber = new GameFiber(() => AITasking.AssignWaypointTasks(newCollectedVehicle, path.Waypoints, waypoint)); AssignTasksFiber.Start(); } - // If the vehicle is in the collection, but has no tasks - else if (!collectedVehicle.TasksAssigned) - { - Game.LogTrivial($"[WaypointVehicleCollector] {vehicle.Model.Name} already in collection, but with no tasks. Assigning tasks."); - collectedVehicle.TasksAssigned = true; - - GameFiber AssignTasksFiber = new GameFiber(() => AITasking.AssignWaypointTasks(collectedVehicle, path.Waypoints, waypoint)); - AssignTasksFiber.Start(); - } } - } - private static Vehicle[] GetNearbyVehiclesForCollection(Vector3 collectorWaypointPosition, float collectorRadius) - { - return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorWaypointPosition) <= collectorRadius && Math.Abs(collectorWaypointPosition.Z - v.Position.Z) < 3 && v.IsValidForCollection() select v).ToArray(); + Vehicle[] GetNearbyVehiclesForCollection(Vector3 collectorWaypointPosition, float collectorRadius) + { + return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorWaypointPosition) <= collectorRadius && Math.Abs(collectorWaypointPosition.Z - v.Position.Z) < 3 && v.IsValidForCollection() select v).ToArray(); + } } private static CollectedVehicle AddVehicleToCollection(Path path, Waypoint waypoint, Vehicle v) { - var collectedVehicle = new CollectedVehicle(v, path, waypoint, false); + var collectedVehicle = new CollectedVehicle(v, path, waypoint); collectedVehicles.Add(collectedVehicle); Game.LogTrivial($"[WaypointVehicleCollector] Added {v.Model.Name} to collection from path {path.Number}, waypoint {waypoint.Number}."); return collectedVehicle; From 24e9b518107dd2dccfb4292cd69216d37f2a1ed3 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 12:08:00 -0600 Subject: [PATCH 174/276] Updated log statements to use Logger class --- SceneManager/VehicleCollector.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index 0947170..0f0eb7f 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -37,7 +37,6 @@ namespace SceneManager Logger.Log($"Vehicle: {vehicle.Model.Name}, Waypoint collector radius: {waypoint.CollectorRadius}, Distance to waypoint: {vehicle.DistanceTo2D(waypoint.Position)}"); var collectedVehicle = collectedVehicles.Where(cv => cv.Vehicle == vehicle).FirstOrDefault(); - // If the vehicle is not in the collection yet if(collectedVehicle == null) { SetVehicleAndDriverPersistence(vehicle); @@ -58,7 +57,7 @@ namespace SceneManager { var collectedVehicle = new CollectedVehicle(v, path, waypoint); collectedVehicles.Add(collectedVehicle); - Game.LogTrivial($"[WaypointVehicleCollector] Added {v.Model.Name} to collection from path {path.Number}, waypoint {waypoint.Number}."); + Logger.Log($"Added {v.Model.Name} to collection from path {path.Number}, waypoint {waypoint.Number}."); return collectedVehicle; } @@ -78,7 +77,7 @@ namespace SceneManager driverBlip.Scale = 0.25f; v.Driver.IsPersistent = true; v.Driver.BlockPermanentEvents = true; - Game.LogTrivial($"A missing driver was created for {v.Model.Name}"); + Logger.Log($"A missing driver was created for {v.Model.Name}."); } return true; } From 66cfe955579a9f8d9448f4872f645d1f8b1a6653 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 12:11:44 -0600 Subject: [PATCH 175/276] Removed code pertaining to Patreon verification --- SceneManager/EntryPoint.cs | 12 ------ SceneManager/SceneManager.csproj | 1 - SceneManager/Verification.cs | 68 -------------------------------- 3 files changed, 81 deletions(-) delete mode 100644 SceneManager/Verification.cs diff --git a/SceneManager/EntryPoint.cs b/SceneManager/EntryPoint.cs index d6edc62..cadf4c7 100644 --- a/SceneManager/EntryPoint.cs +++ b/SceneManager/EntryPoint.cs @@ -79,15 +79,3 @@ namespace SceneManager } } } - -//// id is hardware ID and needs to match PatronKey, which is also hardware ID -//if (Settings.id == Settings.PatronKey) -//{ -// Game.LogTrivial($"Patron status verified."); -// Game.DisplayNotification($"~o~Scene Manager\n~g~[Patreon]~w~ Thanks for the support, enjoy your session!"); -//} -//else -//{ -// Game.LogTrivial($"Patron status not verified."); -// Game.DisplayNotification($"~o~Scene Manager\n~y~[Patreon]~w~ Thanks for using my plugin! If you would like to gain access to benefits such as ~g~new features for this plugin~w~, ~g~early access to new plugins~w~, and ~g~custom plugins made just for you~w~, please consider supporting me on ~b~Patreon~w~. ~y~https://www.patreon.com/richdevs"); -//} diff --git a/SceneManager/SceneManager.csproj b/SceneManager/SceneManager.csproj index 5f83c6d..9c579ae 100644 --- a/SceneManager/SceneManager.csproj +++ b/SceneManager/SceneManager.csproj @@ -69,7 +69,6 @@ - diff --git a/SceneManager/Verification.cs b/SceneManager/Verification.cs deleted file mode 100644 index 1665e4a..0000000 --- a/SceneManager/Verification.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System.Management; -using System.Text; -using Rage; - -namespace SceneManager -{ - class Verification - { - // https://www.codingame.com/playgrounds/11117/simple-encryption-using-c-and-xor-technique - // Get hardware ID from user - // encrypt hardware ID - // show encrypted ID in log - // decrypt ID for hardware ID - // Give user their hardware ID for ini - // Pass hardware ID through encryption for a match - public static string GetID() - { - // Get processor ID - ManagementObjectCollection mbsList = null; - ManagementObjectSearcher mbs = new ManagementObjectSearcher("Select * From Win32_processor"); - mbsList = mbs.Get(); - string processorID = ""; - foreach (ManagementObject mo in mbsList) - { - processorID = mo["ProcessorID"].ToString(); - } - - // Get HD ID - /*ManagementObject dsk = new ManagementObject(@"win32_logicaldisk.deviceid=""c:"""); - dsk.Get(); - string hdID = dsk["VolumeSerialNumber"].ToString();*/ - - // Get MoBo ID - ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_BaseBoard"); - ManagementObjectCollection moc = mos.Get(); - string motherBoardID = ""; - foreach (ManagementObject mo in moc) - { - motherBoardID = (string)mo["SerialNumber"]; - } - - string uniqueID = processorID + motherBoardID; - string encrypted = passThrough(uniqueID); - //Game.LogTrivial($"Processor ID: {processorID}"); - //Game.LogTrivial($"HD ID: {hdID}"); - //Game.LogTrivial($"Motherboard ID: {motherBoardID}"); - //Game.LogTrivial($"{uniqueID}"); - Game.LogTrivial($"{encrypted}"); // Get this value from user's log as their key. When they put it in the .ini, it will go back through passThrough and match with their uniqueID - //Game.LogTrivial($"Decrypted: {passThrough(encrypted)}"); - return encrypted; - } - - public static string passThrough(string id) - { - StringBuilder szInputStringBuild = new StringBuilder(id); - StringBuilder szOutStringBuild = new StringBuilder(id.Length); - char Textch; - for (int iCount = 0; iCount < id.Length; iCount++) - { - Textch = szInputStringBuild[iCount]; - Textch = (char)(Textch ^ 1); - szOutStringBuild.Append(Textch); - } - - return szOutStringBuild.ToString(); - } - } -} From eb52aee317e1a4c2b79dfefff986d4b8a51c71ec Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 12:13:01 -0600 Subject: [PATCH 176/276] Removed unnecessary code --- SceneManager/Object Classes/Barrier.cs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/SceneManager/Object Classes/Barrier.cs b/SceneManager/Object Classes/Barrier.cs index ce935d5..3f8f9a3 100644 --- a/SceneManager/Object Classes/Barrier.cs +++ b/SceneManager/Object Classes/Barrier.cs @@ -5,19 +5,15 @@ namespace SceneManager { class Barrier { - private Rage.Object _barrier { get; set; } - private Vector3 _barrierPosition { get; set; } - private float _barrierRotation { get; set; } - - public Rage.Object Object { get { return _barrier; } set { _barrier = value; } } - public Vector3 Position { get { return _barrierPosition; } set { _barrierPosition = value; } } - public float Rotation { get { return _barrierRotation; } set { _barrierRotation = value; } } + public Rage.Object Object { get; set; } + public Vector3 Position { get; set; } + public float Rotation { get; set; } public Barrier(Rage.Object barrier, Vector3 barrierPosition, float barrierRotation) { - _barrier = barrier; - _barrierPosition = barrierPosition; - _barrierRotation = barrierRotation; + Object = barrier; + Position = barrierPosition; + Rotation = barrierRotation; } } } From 8d52f31ea2b03627c69d55c3a96f4299305b6d5a Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 12:13:41 -0600 Subject: [PATCH 177/276] Changed Game.LogTrivial reference to Logger.Log --- SceneManager/Object Classes/CollectedVehicle.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index bc962dd..e3658f6 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -65,7 +65,7 @@ namespace SceneManager } VehicleCollector.collectedVehicles.Remove(this); - Game.LogTrivial($"{Vehicle.Model.Name} dismissed successfully."); + Logger.Log($"{Vehicle.Model.Name} dismissed successfully."); Driver.BlockPermanentEvents = false; Driver.Dismiss(); Vehicle.IsSirenOn = false; From 02a603ad1551c36b8f4ee2c99b54dae47adf6ea6 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 12:15:34 -0600 Subject: [PATCH 178/276] Removed unnecessary code and updated references. --- SceneManager/Menus/PathCreationMenu.cs | 2 +- SceneManager/Object Classes/Path.cs | 23 +++++++---------------- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index de748c8..7cf1bcd 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -149,7 +149,7 @@ namespace SceneManager Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Path {i + 1} complete."); currentPath.State = State.Finished; currentPath.IsEnabled = true; - currentPath.SetPathNumber(i + 1); + currentPath.Number = i + 1; // For each waypoint in the path's WaypointData, start a collector game fiber and loop while the path and waypoint exist, and while the path is enabled foreach (Waypoint waypoint in PathMainMenu.GetPaths()[i].Waypoints) diff --git a/SceneManager/Object Classes/Path.cs b/SceneManager/Object Classes/Path.cs index 6275acb..1a8e9b3 100644 --- a/SceneManager/Object Classes/Path.cs +++ b/SceneManager/Object Classes/Path.cs @@ -6,27 +6,18 @@ namespace SceneManager { public class Path { - private int _number { get; set; } - private bool _isEnabled { get; set; } - private State _state { get; set; } - - public int Number { get { return _number; } set { _number = value; } } - public bool IsEnabled { get { return _isEnabled; } set { _isEnabled = value; } } - public State State { get { return _state; } set { _state = value; } } + public int Number { get; set; } + public bool IsEnabled { get; set; } + public State State { get; set; } public List Waypoints = new List(); public Path(int pathNum, State pathState) { - _number = pathNum; - _state = pathState; + Number = pathNum; + State = pathState; DrawLinesBetweenWaypoints(); } - public void SetPathNumber(int pathNum) - { - _number = pathNum; - } - private void LowerWaypointBlipsOpacity() { foreach (Waypoint wp in Waypoints) @@ -56,7 +47,7 @@ namespace SceneManager public void DisablePath() { - _isEnabled = false; + IsEnabled = false; foreach(Waypoint wp in Waypoints) { wp.RemoveSpeedZone(); @@ -69,7 +60,7 @@ namespace SceneManager public void EnablePath() { - _isEnabled = true; + IsEnabled = true; foreach (Waypoint wp in Waypoints) { if (wp.IsCollector) From 7aedb19090bc154648fb3d7787baa32bf48d00f7 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 12:23:48 -0600 Subject: [PATCH 179/276] Removed unnecessary code and updated references. --- SceneManager/Object Classes/Waypoint.cs | 150 ++++++++++-------------- 1 file changed, 60 insertions(+), 90 deletions(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 3f01705..6d29e02 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -6,57 +6,43 @@ namespace SceneManager { public class Waypoint { - private Path _path { get; set; } - private int _number { get; set; } - private Vector3 _position { get; set; } - private float _speed { get; set; } - private VehicleDrivingFlags _drivingFlag { get; set; } - private Blip _blip { get; set; } - private bool _isCollector { get; set; } - private float _collectorRadius { get; set; } - private Blip _collectorRadiusBlip { get; set; } - private float _speedZoneRadius { get; set; } - private uint _speedZone { get; set; } - private bool _enableWaypointMarker { get; set; } = true; - private bool _enableEditMarker { get; set; } = false; - - public Path Path { get { return _path; } set { _path = value; } } - public int Number { get { return _number; } set { _number = value; } } - public Vector3 Position { get { return _position; } } - public float Speed { get { return _speed; } } - public VehicleDrivingFlags DrivingFlag { get { return _drivingFlag; } } - public Blip Blip { get { return _blip; } } - public bool IsCollector { get { return _isCollector; } } - public float CollectorRadius { get { return _collectorRadius; } } - public Blip CollectorRadiusBlip { get { return _collectorRadiusBlip; } } - public float SpeedZoneRadius { get { return _speedZoneRadius; } } - public uint SpeedZone { get { return _speedZone; } set { _speedZone = value; } } - public bool EnableWaypointMarker { get { return _enableWaypointMarker; } set { _enableWaypointMarker = value; } } - public bool EnableEditMarker { get { return _enableEditMarker; } set { _enableEditMarker = value; } } + public Path Path { get; set; } + public int Number { get; set; } + public Vector3 Position { get; set; } + public float Speed { get; set; } + public VehicleDrivingFlags DrivingFlag { get; set; } + public Blip Blip { get; } + public bool IsCollector { get; set; } + public float CollectorRadius { get; set; } + public Blip CollectorRadiusBlip { get; set; } + public float SpeedZoneRadius { get; set; } + public uint SpeedZone { get; set; } + public bool EnableWaypointMarker { get; set; } + public bool EnableEditMarker { get; set; } public Waypoint(Path path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector = false, float collectorRadius = 1, float speedZoneRadius = 0) { - _path = path; - _number = waypointNum; - _position = waypointPos; - _speed = speed; - _drivingFlag = drivingFlag; - _blip = waypointBlip; - _isCollector = collector; - _collectorRadius = collectorRadius; - _speedZoneRadius = speedZoneRadius; + Path = path; + Number = waypointNum; + Position = waypointPos; + Speed = speed; + DrivingFlag = drivingFlag; + Blip = waypointBlip; + IsCollector = collector; + CollectorRadius = collectorRadius; + SpeedZoneRadius = speedZoneRadius; AddSpeedZone(); - _collectorRadiusBlip = new Blip(waypointBlip.Position, collectorRadius) + CollectorRadiusBlip = new Blip(waypointBlip.Position, collectorRadius) { Color = waypointBlip.Color, }; if (SettingsMenu.mapBlips.Checked) { - _collectorRadiusBlip.Alpha = 0.5f; + CollectorRadiusBlip.Alpha = 0.5f; } else { - _collectorRadiusBlip.Alpha = 0f; + CollectorRadiusBlip.Alpha = 0f; } DrawWaypointMarker(); } @@ -73,69 +59,69 @@ namespace SceneManager void UpdateDrivingFlag(VehicleDrivingFlags newDrivingFlag) { - if(_drivingFlag == VehicleDrivingFlags.StopAtDestination && newDrivingFlag != VehicleDrivingFlags.StopAtDestination) + if(DrivingFlag == VehicleDrivingFlags.StopAtDestination && newDrivingFlag != VehicleDrivingFlags.StopAtDestination) { - foreach(CollectedVehicle cv in VehicleCollector.collectedVehicles.Where(cv => cv.Path == _path && cv.CurrentWaypoint == this && cv.StoppedAtWaypoint)) + foreach(CollectedVehicle cv in VehicleCollector.collectedVehicles.Where(cv => cv.Path == Path && cv.CurrentWaypoint == this && cv.StoppedAtWaypoint)) { - Game.LogTrivial($"Setting StoppedAtWaypoint to false for {cv.Vehicle.Model.Name}"); + Logger.Log($"Setting StoppedAtWaypoint to false for {cv.Vehicle.Model.Name}"); cv.StoppedAtWaypoint = false; } } - _drivingFlag = newDrivingFlag; + DrivingFlag = newDrivingFlag; if (newDrivingFlag == VehicleDrivingFlags.StopAtDestination) { - _blip.Color = Color.Red; + Blip.Color = Color.Red; } else { - _blip.Color = Color.Green; + Blip.Color = Color.Green; } } void UpdateWaypointSpeed(float newWaypointSpeed) { - _speed = newWaypointSpeed; + Speed = newWaypointSpeed; } void UpdateCollectorOptions() { if (collectorWaypointChecked) { - _isCollector = true; + IsCollector = true; RemoveSpeedZone(); - _speedZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, SpeedZoneRadius, speed); - _blip.Color = Color.Blue; - if (_collectorRadiusBlip) + SpeedZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, SpeedZoneRadius, speed); + Blip.Color = Color.Blue; + if (CollectorRadiusBlip) { - _collectorRadiusBlip.Position = Game.LocalPlayer.Character.Position; - _collectorRadiusBlip.Alpha = 0.5f; - _collectorRadiusBlip.Scale = collectorRadius * 0.5f; + CollectorRadiusBlip.Position = Game.LocalPlayer.Character.Position; + CollectorRadiusBlip.Alpha = 0.5f; + CollectorRadiusBlip.Scale = collectorRadius * 0.5f; } else { - _collectorRadiusBlip = new Blip(Blip.Position) + CollectorRadiusBlip = new Blip(Blip.Position) { Color = Blip.Color, Alpha = 0.5f }; } - _collectorRadius = collectorRadius; - _speedZoneRadius = speedZoneRadius; + CollectorRadius = collectorRadius; + SpeedZoneRadius = speedZoneRadius; } else { - _isCollector = false; + IsCollector = false; RemoveSpeedZone(); - if (_collectorRadiusBlip) + if (CollectorRadiusBlip) { - _collectorRadiusBlip.Delete(); + CollectorRadiusBlip.Delete(); } } } void UpdateWaypointPosition(Vector3 newWaypointPosition) { - _position = newWaypointPosition; + Position = newWaypointPosition; RemoveSpeedZone(); AddSpeedZone(); UpdateWaypointBlipPosition(); @@ -143,26 +129,26 @@ namespace SceneManager void UpdateWaypointBlipPosition() { - _blip.Position = Game.LocalPlayer.Character.Position; + Blip.Position = Game.LocalPlayer.Character.Position; } } public void AddSpeedZone() { - _speedZone = World.AddSpeedZone(_position, _speedZoneRadius, _speed); + SpeedZone = World.AddSpeedZone(Position, SpeedZoneRadius, Speed); } public void RemoveSpeedZone() { - World.RemoveSpeedZone(_speedZone); + World.RemoveSpeedZone(SpeedZone); } public void DrawWaypointMarker() { // This is called once when the waypoint is created - GameFiber.StartNew(() => + GameFiber.StartNew((System.Threading.ThreadStart)(() => { - while (SettingsMenu.threeDWaypoints.Checked && _enableWaypointMarker && _path.Waypoints.Contains(this)) + while (SettingsMenu.threeDWaypoints.Checked && EnableWaypointMarker && Path.Waypoints.Contains(this)) { if (EditWaypointMenu.editWaypointMenu.Visible && EditWaypointMenu.editWaypoint.Value == Number) { @@ -205,7 +191,7 @@ namespace SceneManager } } } - else if ((_path.State == State.Finished && MenuManager.menuPool.IsAnyMenuOpen()) || (_path.State == State.Creating && PathCreationMenu.pathCreationMenu.Visible)) + else if ((Path.State == State.Finished && MenuManager.menuPool.IsAnyMenuOpen()) || (Path.State == State.Creating && PathCreationMenu.pathCreationMenu.Visible)) { if (IsCollector && CollectorRadius > 0) { @@ -227,44 +213,28 @@ namespace SceneManager GameFiber.Yield(); } - }); + })); } public void EnableBlip() { - if(!PathMainMenu.GetPaths().Where(p => p == _path).First().IsEnabled) + if(!PathMainMenu.GetPaths().Where(p => p == Path).First().IsEnabled) { - _blip.Alpha = 0.5f; - _collectorRadiusBlip.Alpha = 0.25f; + Blip.Alpha = 0.5f; + CollectorRadiusBlip.Alpha = 0.25f; } else { - _blip.Alpha = 1.0f; - _collectorRadiusBlip.Alpha = 0.5f; + Blip.Alpha = 1.0f; + CollectorRadiusBlip.Alpha = 0.5f; } } public void DisableBlip() { - _blip.Alpha = 0; - _collectorRadiusBlip.Alpha = 0; - } - - public void RemoveWaypoint() - { - _path = null; - _number = 0; - _position = new Vector3(0,0,0); - _speed = 0; - _drivingFlag = 0; - _blip.Delete(); - _isCollector = false; - _collectorRadius = 0; - _speedZoneRadius = 0; - RemoveSpeedZone(); - _collectorRadiusBlip.Delete(); - _enableWaypointMarker = false; + Blip.Alpha = 0; + CollectorRadiusBlip.Alpha = 0; } } } From 730e85fe3c99bf9fd6d93b799f5cad6609fb28a1 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 12:33:34 -0600 Subject: [PATCH 180/276] Changed Game.LogTrivial references to Logger.Log. Changed LoopWhileDrivingToWaypoint methods to local functions --- SceneManager/AITasking.cs | 81 ++++++++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 31 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 6fab725..66c253d 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -16,12 +16,12 @@ namespace SceneManager if (currentWaypoint != null) { float acceptedDistance = GetAcceptedStoppingDistance(waypoints, waypoints.IndexOf(currentWaypoint)); - Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} distance to collection waypoint: {collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position)}"); + Logger.Log($"{collectedVehicle.Vehicle.Model.Name} distance to collection waypoint: {collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position)}"); if(collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position) > (currentWaypoint.CollectorRadius + 0.5)) { - Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} is driving to waypoint {currentWaypoint.Number}"); + Logger.Log($"{collectedVehicle.Vehicle.Model.Name} is driving to waypoint {currentWaypoint.Number}"); collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)263075, acceptedDistance); - LoopWhileDrivingToWaypoint(collectedVehicle, waypoints, currentWaypoint, acceptedDistance); + LoopWhileDrivingToWaypoint(acceptedDistance); } if(currentWaypoint.DrivingFlag == VehicleDrivingFlags.StopAtDestination) { @@ -36,12 +36,20 @@ namespace SceneManager { return; } - Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} all tasks complete."); + Logger.Log($"{collectedVehicle.Vehicle.Model.Name} all tasks complete."); if (!collectedVehicle.Dismissed) { collectedVehicle.Dismiss(); } + void LoopWhileDrivingToWaypoint(float acceptedDistance) + { + while (VehicleAndDriverNullChecks(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(currentWaypoint.Position) > acceptedDistance) + { + //Logger.Log($"Looping while {collectedVehicle.Vehicle.Model.Name} drives to waypoint {currentWaypoint.Number} ({collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position)}m away)"); + GameFiber.Yield(); + } + } } private static void DriveVehicleToNextWaypoint(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) @@ -54,7 +62,7 @@ namespace SceneManager var vehicle = collectedVehicle.Vehicle; var driver = vehicle.Driver; - for (int nextWaypoint = currentWaypoint.Number; nextWaypoint < waypoints.Count; nextWaypoint++) // Do we need to make this <= count? Or nextWaypoint = currentWaypoint.Number - 1? Is this dependent on direct vs. normal collection? + for (int nextWaypoint = currentWaypoint.Number; nextWaypoint < waypoints.Count; nextWaypoint++) { if (!VehicleAndDriverNullChecks(waypoints, nextWaypoint, collectedVehicle)) { @@ -66,7 +74,7 @@ namespace SceneManager collectedVehicle.CurrentWaypoint = waypoints[nextWaypoint]; float acceptedDistance = GetAcceptedStoppingDistance(waypoints, nextWaypoint); - Game.LogTrivial($"{vehicle.Model.Name} is driving to waypoint {waypoints[nextWaypoint].Number}"); + Logger.Log($"{vehicle.Model.Name} is driving to waypoint {waypoints[nextWaypoint].Number}"); if (waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) { collectedVehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)17040299, acceptedDistance); @@ -75,7 +83,7 @@ namespace SceneManager { collectedVehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263075, acceptedDistance); } - LoopWhileDrivingToWaypoint(collectedVehicle, waypoints, nextWaypoint, acceptedDistance); + LoopWhileDrivingToWaypoint(nextWaypoint, acceptedDistance); if (collectedVehicle.SkipWaypoint) { @@ -95,26 +103,36 @@ namespace SceneManager collectedVehicle.Driver.Tasks.PerformDrivingManeuver(collectedVehicle.Vehicle, VehicleManeuver.GoForwardWithCustomSteeringAngle, 3); } } - } - public static void LoopWhileDrivingToWaypoint(CollectedVehicle collectedVehicle, List waypoints, int nextWaypoint, float acceptedDistance) - { - while (VehicleAndDriverNullChecks(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && waypoints.ElementAtOrDefault(nextWaypoint) != null && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position) > acceptedDistance) + void LoopWhileDrivingToWaypoint(int nextWaypoint, float acceptedDistance) { - //Game.LogTrivial($"Looping while {collectedVehicle.Vehicle.Model.Name} drives to waypoint {waypoints[nextWaypoint].Number} ({collectedVehicle.Vehicle.DistanceTo2D(waypoints[nextWaypoint].Position)}m away from collector radius {waypoints[nextWaypoint].CollectorRadius})"); - //Game.LogTrivial($"Distance of front of vehicle to waypoint: {collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position)}"); - GameFiber.Yield(); + while (VehicleAndDriverNullChecks(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && waypoints.ElementAtOrDefault(nextWaypoint) != null && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position) > acceptedDistance) + { + //Logger.Log($"Looping while {collectedVehicle.Vehicle.Model.Name} drives to waypoint {waypoints[nextWaypoint].Number} ({collectedVehicle.Vehicle.DistanceTo2D(waypoints[nextWaypoint].Position)}m away from collector radius {waypoints[nextWaypoint].CollectorRadius})"); + //Logger.Log($"Distance of front of vehicle to waypoint: {collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position)}"); + GameFiber.Yield(); + } } } - public static void LoopWhileDrivingToWaypoint(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint, float acceptedDistance) - { - while (VehicleAndDriverNullChecks(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(currentWaypoint.Position) > acceptedDistance) - { - //Game.LogTrivial($"Looping while {collectedVehicle.Vehicle.Model.Name} drives to waypoint {currentWaypoint.Number} ({collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position)}m away)"); - GameFiber.Yield(); - } - } + //public static void LoopWhileDrivingToWaypoint(CollectedVehicle collectedVehicle, List waypoints, int nextWaypoint, float acceptedDistance) + //{ + // while (VehicleAndDriverNullChecks(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && waypoints.ElementAtOrDefault(nextWaypoint) != null && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position) > acceptedDistance) + // { + // //Logger.Log($"Looping while {collectedVehicle.Vehicle.Model.Name} drives to waypoint {waypoints[nextWaypoint].Number} ({collectedVehicle.Vehicle.DistanceTo2D(waypoints[nextWaypoint].Position)}m away from collector radius {waypoints[nextWaypoint].CollectorRadius})"); + // //Logger.Log($"Distance of front of vehicle to waypoint: {collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position)}"); + // GameFiber.Yield(); + // } + //} + + //public static void LoopWhileDrivingToWaypoint(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint, float acceptedDistance) + //{ + // while (VehicleAndDriverNullChecks(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(currentWaypoint.Position) > acceptedDistance) + // { + // //Logger.Log($"Looping while {collectedVehicle.Vehicle.Model.Name} drives to waypoint {currentWaypoint.Number} ({collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position)}m away)"); + // GameFiber.Yield(); + // } + //} private static float GetAcceptedStoppingDistance(List waypoints, int nextWaypoint) { @@ -128,7 +146,7 @@ namespace SceneManager dist = (waypoints[nextWaypoint].Speed * waypoints[nextWaypoint].Speed) / (250 * 0.8f); } var acceptedDistance = MathHelper.Clamp(dist, 2, 10); - Game.LogTrivial($"Accepted distance: {acceptedDistance}"); + Logger.Log($"Accepted distance: {acceptedDistance}"); return acceptedDistance; } @@ -136,17 +154,17 @@ namespace SceneManager { if (collectedVehicle == null) { - Game.LogTrivial($"CollectedVehicle is null"); + Logger.Log($"CollectedVehicle is null"); return false; } if (!collectedVehicle.Vehicle) { - Game.LogTrivial($"Vehicle is null"); + Logger.Log($"Vehicle is null"); return false; } if (!collectedVehicle.Driver) { - Game.LogTrivial($"Driver is null"); + Logger.Log($"Driver is null"); return false; } return true; @@ -156,22 +174,22 @@ namespace SceneManager { if (waypoints.ElementAtOrDefault(nextWaypoint) == null) { - Game.LogTrivial($"Waypoint is null"); + Logger.Log($"Waypoint is null"); return false; } if(collectedVehicle == null) { - Game.LogTrivial($"CollectedVehicle is null"); + Logger.Log($"CollectedVehicle is null"); return false; } if (!collectedVehicle.Vehicle) { - Game.LogTrivial($"Vehicle is null"); + Logger.Log($"Vehicle is null"); return false; } if (!collectedVehicle.Driver) { - Game.LogTrivial($"Driver is null"); + Logger.Log($"Driver is null"); return false; } return true; @@ -183,8 +201,9 @@ namespace SceneManager { return; } + var stoppingDistance = GetAcceptedStoppingDistance(currentWaypoint.Path.Waypoints, currentWaypoint.Path.Waypoints.IndexOf(currentWaypoint)); - Game.LogTrivial($"{collectedVehicle.Vehicle.Model.Name} stopping at waypoint."); + Logger.Log($"{collectedVehicle.Vehicle.Model.Name} stopping at waypoint."); Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, stoppingDistance, -1, true); collectedVehicle.StoppedAtWaypoint = true; collectedVehicle.Driver.Tasks.Clear(); From 89771ab3df2fcf81bd02fc7c6f11b556760975cd Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 13:16:49 -0600 Subject: [PATCH 181/276] Refactored some private functions to local functions, updated public functions to internal. --- SceneManager/Menus/BarrierMenu.cs | 263 +++++++++++++++--------------- 1 file changed, 129 insertions(+), 134 deletions(-) diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index d3a2609..87eec52 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -10,22 +10,21 @@ namespace SceneManager { class BarrierMenu { - public static UIMenu barrierMenu { get; private set; } - public static List barriers = new List(); - private static UIMenuListScrollerItem barrierList = new UIMenuListScrollerItem("Select Barrier", "", Settings.barrierKeys); + internal static UIMenu barrierMenu = new UIMenu("Scene Manager", "~o~Barrier Management"); + internal static List barriers = new List(); + private static UIMenuListScrollerItem barrierList = new UIMenuListScrollerItem("Spawn Barrier", "", Settings.barrierKeys); private static UIMenuNumericScrollerItem rotateBarrier = new UIMenuNumericScrollerItem("Rotate Barrier", "", 0, 350, 10); private static UIMenuListScrollerItem removeBarrierOptions = new UIMenuListScrollerItem("Remove Barrier", "", new[] { "Last Barrier", "Nearest Barrier", "All Barriers" }); private static UIMenuItem resetBarriers = new UIMenuItem("Reset Barriers", "Reset all spawned barriers to their original position and rotation"); - public static Rage.Object shadowBarrier; + internal static Rage.Object shadowBarrier; internal static void InstantiateMenu() { - barrierMenu = new UIMenu("Scene Manager", "~o~Barrier Management"); barrierMenu.ParentMenu = MainMenu.mainMenu; MenuManager.menuPool.Add(barrierMenu); } - public static void BuildBarrierMenu() + internal static void BuildBarrierMenu() { barrierMenu.AddItem(resetBarriers); resetBarriers.ForeColor = Color.Gold; @@ -40,13 +39,11 @@ namespace SceneManager barrierMenu.AddItem(barrierList, 0); barrierList.ForeColor = Color.Gold; - barrierMenu.RefreshIndex(); - barrierMenu.OnItemSelect += BarrierMenu_OnItemSelected; barrierMenu.OnScrollerChange += BarrierMenu_OnScrollerChange; } - public static void CreateShadowBarrier(UIMenu barrierMenu) + internal static void CreateShadowBarrier(UIMenu barrierMenu) { Hints.Display($"~o~Scene Manager\n~y~[Hint]~y~ ~w~The shadow cone will disappear if you aim too far away."); @@ -59,53 +56,84 @@ namespace SceneManager shadowBarrier.IsCollisionEnabled = false; shadowBarrier.Opacity = 0.7f; - GameFiber ShadowConeLoopFiber = new GameFiber(() => LoopToDisplayShadowBarrier(barrierMenu)); + GameFiber ShadowConeLoopFiber = new GameFiber(() => LoopToDisplayShadowBarrier()); ShadowConeLoopFiber.Start(); - } - private static void LoopToDisplayShadowBarrier(UIMenu barrierMenu) - { - while (barrierMenu.Visible && shadowBarrier) + void LoopToDisplayShadowBarrier() { - if (barrierList.Selected || rotateBarrier.Selected) + while (barrierMenu.Visible && shadowBarrier) { - shadowBarrier.IsVisible = true; - UpdateShadowBarrierPosition(); + if (barrierList.Selected || rotateBarrier.Selected) + { + shadowBarrier.IsVisible = true; + UpdateShadowBarrierPosition(); + } + else + { + shadowBarrier.IsVisible = false; + } + GameFiber.Yield(); + } + + if (shadowBarrier) + shadowBarrier.Delete(); + + void UpdateShadowBarrierPosition() + { + DisableBarrierMenuOptionsIfShadowConeTooFar(); + shadowBarrier.SetPositionWithSnap(TracePlayerView(Settings.BarrierPlacementDistance, TraceFlags.IntersectWorld).HitPosition); + + void DisableBarrierMenuOptionsIfShadowConeTooFar() + { + if (shadowBarrier.Position.DistanceTo2D(Game.LocalPlayer.Character.Position) > Settings.BarrierPlacementDistance) + { + barrierList.Enabled = false; + rotateBarrier.Enabled = false; + } + else if (shadowBarrier.Position.DistanceTo2D(Game.LocalPlayer.Character.Position) <= Settings.BarrierPlacementDistance && barrierList.SelectedItem == "Flare") + { + barrierList.Enabled = true; + rotateBarrier.Enabled = false; + } + else + { + barrierList.Enabled = true; + rotateBarrier.Enabled = true; + } + } + } + } + + //------------ CREDIT PNWPARKS FOR THESE FUNCTIONS ------------\\ + // Implement Parks's 'Get Point Player is Looking At' script for better placement in 3rd person https://bitbucket.org/snippets/gtaparks/MeBKxX + + HitResult TracePlayerView(float maxTraceDistance = 30f, TraceFlags flags = TraceFlags.IntersectWorld) => TracePlayerView2(out Vector3 v1, out Vector3 v2, maxTraceDistance, flags); + + HitResult TracePlayerView2(out Vector3 start, out Vector3 end, float maxTraceDistance, TraceFlags flags) + { + Vector3 direction = GetPlayerLookingDirection(out start); + end = start + (maxTraceDistance * direction); + var barrierObjects = barriers.Where(b => b.Object).Select(b => b.Object).ToArray(); + return World.TraceLine(start, end, flags, barrierObjects); + } + + Vector3 GetPlayerLookingDirection(out Vector3 camPosition) + { + if (Camera.RenderingCamera) + { + camPosition = Camera.RenderingCamera.Position; + return Camera.RenderingCamera.Direction; } else { - shadowBarrier.IsVisible = false; - } - GameFiber.Yield(); - } + float pitch = Rage.Native.NativeFunction.Natives.GET_GAMEPLAY_CAM_RELATIVE_PITCH(); + float heading = Rage.Native.NativeFunction.Natives.GET_GAMEPLAY_CAM_RELATIVE_HEADING(); - if (shadowBarrier) - shadowBarrier.Delete(); - } - - private static void UpdateShadowBarrierPosition() - { - DisableBarrierMenuOptionsIfShadowConeTooFar(); - shadowBarrier.SetPositionWithSnap(TracePlayerView(Settings.BarrierPlacementDistance, TraceFlags.IntersectWorld).HitPosition); - - void DisableBarrierMenuOptionsIfShadowConeTooFar() - { - if (shadowBarrier.Position.DistanceTo2D(Game.LocalPlayer.Character.Position) > Settings.BarrierPlacementDistance) - { - barrierList.Enabled = false; - rotateBarrier.Enabled = false; + camPosition = Rage.Native.NativeFunction.Natives.GET_GAMEPLAY_CAM_COORD(); + return (Game.LocalPlayer.Character.Rotation + new Rotator(pitch, 0, heading)).ToVector().ToNormalized(); } - else if (shadowBarrier.Position.DistanceTo2D(Game.LocalPlayer.Character.Position) <= Settings.BarrierPlacementDistance && barrierList.SelectedItem == "Flare") - { - barrierList.Enabled = true; - rotateBarrier.Enabled = false; - } - else - { - barrierList.Enabled = true; - rotateBarrier.Enabled = true; - } - } + } + //------------ CREDIT PNWPARKS FOR THESE FUNCTIONS ------------\\ } private static void BarrierMenu_OnScrollerChange(UIMenu sender, UIMenuScrollerItem scrollerItem, int oldIndex, int newIndex) @@ -172,103 +200,70 @@ namespace SceneManager } currentBarriers.Clear(); } - } - private static void SpawnBarrier() - { - var barrier = new Rage.Object(shadowBarrier.Model, shadowBarrier.Position, rotateBarrier.Value); - barrier.SetPositionWithSnap(shadowBarrier.Position); - Rage.Native.NativeFunction.Natives.SET_ENTITY_DYNAMIC(barrier, true); - barrier.IsPositionFrozen = false; - Rage.Native.NativeFunction.Natives.SET_DISABLE_FRAG_DAMAGE(barrier, true); - //Rage.Native.NativeFunction.Natives.SET_DISABLE_BREAKING(barrier, true); - - barriers.Add(new Barrier(barrier, barrier.Position, barrier.Heading)); - removeBarrierOptions.Enabled = true; - resetBarriers.Enabled = true; - } - - private static void RemoveBarrier() - { - switch (removeBarrierOptions.Index) + void SpawnBarrier() { - case 0: - barriers[barriers.Count - 1].Object.Delete(); - barriers.RemoveAt(barriers.Count - 1); - break; - case 1: - barriers = barriers.OrderBy(b => b.Object.DistanceTo2D(Game.LocalPlayer.Character)).ToList(); - barriers[0].Object.Delete(); - barriers.RemoveAt(0); - break; - case 2: - foreach (Barrier b in barriers.Where(b => b.Object)) - { - b.Object.Delete(); - } - if (barriers.Count > 0) - { - barriers.Clear(); - } - break; + var barrier = new Rage.Object(shadowBarrier.Model, shadowBarrier.Position, rotateBarrier.Value); + barrier.SetPositionWithSnap(shadowBarrier.Position); + Rage.Native.NativeFunction.Natives.SET_ENTITY_DYNAMIC(barrier, true); + barrier.IsPositionFrozen = false; + Rage.Native.NativeFunction.Natives.SET_DISABLE_FRAG_DAMAGE(barrier, true); + + barriers.Add(new Barrier(barrier, barrier.Position, barrier.Heading)); + removeBarrierOptions.Enabled = true; + resetBarriers.Enabled = true; } - removeBarrierOptions.Enabled = barriers.Count == 0 ? false : true; - resetBarriers.Enabled = barriers.Count == 0 ? false : true; - } - - private static void SpawnFlare() - { - var flare = new Weapon("weapon_flare", shadowBarrier.Position, 1); - - Rage.Native.NativeFunction.Natives.SET_ENTITY_DYNAMIC(flare, true); - GameFiber.StartNew(() => + void SpawnFlare() { - while (flare && flare.HeightAboveGround > 0.05f) + var flare = new Weapon("weapon_flare", shadowBarrier.Position, 1); + + Rage.Native.NativeFunction.Natives.SET_ENTITY_DYNAMIC(flare, true); + GameFiber.StartNew(() => { - GameFiber.Yield(); - } - GameFiber.Sleep(1000); - if (flare) + while (flare && flare.HeightAboveGround > 0.05f) + { + GameFiber.Yield(); + } + GameFiber.Sleep(1000); + if (flare) + { + flare.IsPositionFrozen = true; + } + }); + + barriers.Add(new Barrier(flare, flare.Position, flare.Heading)); + removeBarrierOptions.Enabled = true; + } + + void RemoveBarrier() + { + switch (removeBarrierOptions.Index) { - flare.IsPositionFrozen = true; + case 0: + barriers[barriers.Count - 1].Object.Delete(); + barriers.RemoveAt(barriers.Count - 1); + break; + case 1: + barriers = barriers.OrderBy(b => b.Object.DistanceTo2D(Game.LocalPlayer.Character)).ToList(); + barriers[0].Object.Delete(); + barriers.RemoveAt(0); + break; + case 2: + foreach (Barrier b in barriers.Where(b => b.Object)) + { + b.Object.Delete(); + } + if (barriers.Count > 0) + { + barriers.Clear(); + } + break; } - }); - barriers.Add(new Barrier(flare, flare.Position, flare.Heading)); - removeBarrierOptions.Enabled = true; - } - - //------------ CREDIT PNWPARKS FOR THESE FUNCTIONS ------------\\ - // Implement Parks's 'Get Point Player is Looking At' script for better placement in 3rd person https://bitbucket.org/snippets/gtaparks/MeBKxX - internal static Vector3 GetPlayerLookingDirection(out Vector3 camPosition) - { - if (Camera.RenderingCamera) - { - camPosition = Camera.RenderingCamera.Position; - return Camera.RenderingCamera.Direction; - } - else - { - float pitch = Rage.Native.NativeFunction.Natives.GET_GAMEPLAY_CAM_RELATIVE_PITCH(); - float heading = Rage.Native.NativeFunction.Natives.GET_GAMEPLAY_CAM_RELATIVE_HEADING(); - - camPosition = Rage.Native.NativeFunction.Natives.GET_GAMEPLAY_CAM_COORD(); - return (Game.LocalPlayer.Character.Rotation + new Rotator(pitch, 0, heading)).ToVector().ToNormalized(); + removeBarrierOptions.Enabled = barriers.Count == 0 ? false : true; + resetBarriers.Enabled = barriers.Count == 0 ? false : true; } } - - internal static Vector3 GetPlayerLookingDirection() => GetPlayerLookingDirection(out Vector3 v1); - - internal static HitResult TracePlayerView(out Vector3 start, out Vector3 end, float maxTraceDistance, TraceFlags flags) - { - Vector3 direction = GetPlayerLookingDirection(out start); - end = start + (maxTraceDistance * direction); - var barrierObjects = barriers.Where(b => b.Object).Select(b => b.Object).ToArray(); - return World.TraceLine(start, end, flags, barrierObjects); - } - - internal static HitResult TracePlayerView(float maxTraceDistance = 30f, TraceFlags flags = TraceFlags.IntersectWorld) => TracePlayerView(out Vector3 v1, out Vector3 v2, maxTraceDistance, flags); - //------------ CREDIT PNWPARKS FOR THESE FUNCTIONS ------------\\ } } From 9cf578f380f7d4ec84a0d4192bc6fb2362562eae Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 13:17:14 -0600 Subject: [PATCH 182/276] Changed public methods to internal --- SceneManager/AITasking.cs | 21 +-------------------- SceneManager/Logger.cs | 2 +- 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 66c253d..281b1b2 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -6,7 +6,7 @@ namespace SceneManager { class AITasking { - public static void AssignWaypointTasks(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) + internal static void AssignWaypointTasks(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) { if (!VehicleAndDriverNullChecks(collectedVehicle)) { @@ -115,25 +115,6 @@ namespace SceneManager } } - //public static void LoopWhileDrivingToWaypoint(CollectedVehicle collectedVehicle, List waypoints, int nextWaypoint, float acceptedDistance) - //{ - // while (VehicleAndDriverNullChecks(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && waypoints.ElementAtOrDefault(nextWaypoint) != null && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position) > acceptedDistance) - // { - // //Logger.Log($"Looping while {collectedVehicle.Vehicle.Model.Name} drives to waypoint {waypoints[nextWaypoint].Number} ({collectedVehicle.Vehicle.DistanceTo2D(waypoints[nextWaypoint].Position)}m away from collector radius {waypoints[nextWaypoint].CollectorRadius})"); - // //Logger.Log($"Distance of front of vehicle to waypoint: {collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position)}"); - // GameFiber.Yield(); - // } - //} - - //public static void LoopWhileDrivingToWaypoint(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint, float acceptedDistance) - //{ - // while (VehicleAndDriverNullChecks(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(currentWaypoint.Position) > acceptedDistance) - // { - // //Logger.Log($"Looping while {collectedVehicle.Vehicle.Model.Name} drives to waypoint {currentWaypoint.Number} ({collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position)}m away)"); - // GameFiber.Yield(); - // } - //} - private static float GetAcceptedStoppingDistance(List waypoints, int nextWaypoint) { float dist; diff --git a/SceneManager/Logger.cs b/SceneManager/Logger.cs index 8df0206..d92eba5 100644 --- a/SceneManager/Logger.cs +++ b/SceneManager/Logger.cs @@ -4,7 +4,7 @@ namespace SceneManager { class Logger { - public static void Log(string message) + internal static void Log(string message) { #if DEBUG Game.LogTrivialDebug($"{message}"); From e173d9da0ce6138c5a4dc4a25656015ead05f16f Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 13:19:28 -0600 Subject: [PATCH 183/276] Updated methods from public to internal --- SceneManager/EntryPoint.cs | 2 +- SceneManager/GetUserInput.cs | 2 +- SceneManager/Hints.cs | 4 ++-- SceneManager/Object Classes/Path.cs | 18 +++++++++--------- SceneManager/Settings.cs | 4 ++-- SceneManager/VehicleCollector.cs | 8 ++++---- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/SceneManager/EntryPoint.cs b/SceneManager/EntryPoint.cs index cadf4c7..5abc3d0 100644 --- a/SceneManager/EntryPoint.cs +++ b/SceneManager/EntryPoint.cs @@ -10,7 +10,7 @@ namespace SceneManager { public class EntryPoint { - public static void Main() + internal static void Main() { AppDomain.CurrentDomain.DomainUnload += MyTerminationHandler; Settings.LoadSettings(); diff --git a/SceneManager/GetUserInput.cs b/SceneManager/GetUserInput.cs index 81adff8..3cfb264 100644 --- a/SceneManager/GetUserInput.cs +++ b/SceneManager/GetUserInput.cs @@ -4,7 +4,7 @@ namespace SceneManager { class GetUserInput { - public static void LoopForUserInput() + internal static void LoopForUserInput() { while (true) { diff --git a/SceneManager/Hints.cs b/SceneManager/Hints.cs index b1410be..6a52d42 100644 --- a/SceneManager/Hints.cs +++ b/SceneManager/Hints.cs @@ -4,9 +4,9 @@ namespace SceneManager { class Hints { - public static bool Enabled { get; set; } = SettingsMenu.hints.Checked; + internal static bool Enabled { get; set; } = SettingsMenu.hints.Checked; - public static void Display(string message) + internal static void Display(string message) { if (Enabled) { diff --git a/SceneManager/Object Classes/Path.cs b/SceneManager/Object Classes/Path.cs index 1a8e9b3..d142e93 100644 --- a/SceneManager/Object Classes/Path.cs +++ b/SceneManager/Object Classes/Path.cs @@ -5,13 +5,13 @@ using System.Drawing; namespace SceneManager { public class Path - { - public int Number { get; set; } - public bool IsEnabled { get; set; } - public State State { get; set; } - public List Waypoints = new List(); + { + internal int Number { get; set; } + internal bool IsEnabled { get; set; } + internal State State { get; set; } + internal List Waypoints = new List(); - public Path(int pathNum, State pathState) + internal Path(int pathNum, State pathState) { Number = pathNum; State = pathState; @@ -45,7 +45,7 @@ namespace SceneManager } } - public void DisablePath() + internal void DisablePath() { IsEnabled = false; foreach(Waypoint wp in Waypoints) @@ -58,7 +58,7 @@ namespace SceneManager } } - public void EnablePath() + internal void EnablePath() { IsEnabled = true; foreach (Waypoint wp in Waypoints) @@ -74,7 +74,7 @@ namespace SceneManager } } - public void DrawLinesBetweenWaypoints() + internal void DrawLinesBetweenWaypoints() { GameFiber.StartNew(() => { diff --git a/SceneManager/Settings.cs b/SceneManager/Settings.cs index 768ef45..d4b50b4 100644 --- a/SceneManager/Settings.cs +++ b/SceneManager/Settings.cs @@ -4,14 +4,14 @@ using System.Windows.Forms; namespace SceneManager { - public enum State + internal enum State { Uninitialized, Creating, Finished } - public enum SpeedUnits + internal enum SpeedUnits { MPH, KPH diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index 0f0eb7f..9001519 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -6,14 +6,14 @@ using Rage; namespace SceneManager { - public static class VehicleCollector + internal static class VehicleCollector { // Driving styles https://gtaforums.com/topic/822314-guide-driving-styles/ // also https://vespura.com/fivem/drivingstyle/ - public static List collectedVehicles = new List(); + internal static List collectedVehicles = new List(); - public static void StartCollectingAtWaypoint(List paths, Path path, Waypoint waypoint) + internal static void StartCollectingAtWaypoint(List paths, Path path, Waypoint waypoint) { while (paths.Contains(path) && path.Waypoints.Contains(waypoint)) { @@ -87,7 +87,7 @@ namespace SceneManager } } - public static void SetVehicleAndDriverPersistence(Vehicle v) + internal static void SetVehicleAndDriverPersistence(Vehicle v) { v.IsPersistent = true; v.Driver.IsPersistent = true; From c141396d641bb689ac92b04e82e72b954fa36a9e Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 13:20:31 -0600 Subject: [PATCH 184/276] Updated public methods and properties to internal --- SceneManager/Object Classes/Barrier.cs | 8 ++-- .../Object Classes/CollectedVehicle.cs | 22 +++++----- SceneManager/Object Classes/Waypoint.cs | 40 +++++++++---------- 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/SceneManager/Object Classes/Barrier.cs b/SceneManager/Object Classes/Barrier.cs index 3f8f9a3..ec5e390 100644 --- a/SceneManager/Object Classes/Barrier.cs +++ b/SceneManager/Object Classes/Barrier.cs @@ -5,11 +5,11 @@ namespace SceneManager { class Barrier { - public Rage.Object Object { get; set; } - public Vector3 Position { get; set; } - public float Rotation { get; set; } + internal Rage.Object Object { get; set; } + internal Vector3 Position { get; set; } + internal float Rotation { get; set; } - public Barrier(Rage.Object barrier, Vector3 barrierPosition, float barrierRotation) + internal Barrier(Rage.Object barrier, Vector3 barrierPosition, float barrierRotation) { Object = barrier; Position = barrierPosition; diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index e3658f6..a7526d3 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -5,16 +5,16 @@ namespace SceneManager { public class CollectedVehicle { - public Ped Driver { get; set; } - public Vehicle Vehicle { get; set; } - public Path Path { get; set; } - public Waypoint CurrentWaypoint { get; set; } - public Waypoint NextWaypoint { get; private set; } - public bool StoppedAtWaypoint { get; set; } - public bool Dismissed { get; set; } - public bool SkipWaypoint { get; set; } + internal Ped Driver { get; set; } + internal Vehicle Vehicle { get; set; } + internal Path Path { get; set; } + internal Waypoint CurrentWaypoint { get; set; } + internal Waypoint NextWaypoint { get; private set; } + internal bool StoppedAtWaypoint { get; set; } + internal bool Dismissed { get; set; } + internal bool SkipWaypoint { get; set; } - public CollectedVehicle(Vehicle vehicle, Path path, Waypoint currentWaypoint) + internal CollectedVehicle(Vehicle vehicle, Path path, Waypoint currentWaypoint) { Vehicle = vehicle; Driver = vehicle.Driver; @@ -22,14 +22,14 @@ namespace SceneManager CurrentWaypoint = currentWaypoint; } - public CollectedVehicle(Vehicle vehicle, Path path) + internal CollectedVehicle(Vehicle vehicle, Path path) { Vehicle = vehicle; Driver = vehicle.Driver; Path = path; } - public void Dismiss() + internal void Dismiss() { GameFiber.StartNew(() => { diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 6d29e02..01aa78e 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -6,21 +6,21 @@ namespace SceneManager { public class Waypoint { - public Path Path { get; set; } - public int Number { get; set; } - public Vector3 Position { get; set; } - public float Speed { get; set; } - public VehicleDrivingFlags DrivingFlag { get; set; } - public Blip Blip { get; } - public bool IsCollector { get; set; } - public float CollectorRadius { get; set; } - public Blip CollectorRadiusBlip { get; set; } - public float SpeedZoneRadius { get; set; } - public uint SpeedZone { get; set; } - public bool EnableWaypointMarker { get; set; } - public bool EnableEditMarker { get; set; } + internal Path Path { get; set; } + internal int Number { get; set; } + internal Vector3 Position { get; set; } + internal float Speed { get; set; } + internal VehicleDrivingFlags DrivingFlag { get; set; } + internal Blip Blip { get; } + internal bool IsCollector { get; set; } + internal float CollectorRadius { get; set; } + internal Blip CollectorRadiusBlip { get; set; } + internal float SpeedZoneRadius { get; set; } + internal uint SpeedZone { get; set; } + internal bool EnableWaypointMarker { get; set; } + internal bool EnableEditMarker { get; set; } - public Waypoint(Path path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector = false, float collectorRadius = 1, float speedZoneRadius = 0) + internal Waypoint(Path path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector = false, float collectorRadius = 1, float speedZoneRadius = 0) { Path = path; Number = waypointNum; @@ -47,7 +47,7 @@ namespace SceneManager DrawWaypointMarker(); } - public void UpdateWaypoint(Waypoint currentWaypoint, VehicleDrivingFlags drivingFlag, float speed, bool collectorWaypointChecked, float collectorRadius, float speedZoneRadius, bool updateWaypointPositionChecked) + internal void UpdateWaypoint(Waypoint currentWaypoint, VehicleDrivingFlags drivingFlag, float speed, bool collectorWaypointChecked, float collectorRadius, float speedZoneRadius, bool updateWaypointPositionChecked) { UpdateDrivingFlag(drivingFlag); UpdateWaypointSpeed(speed); @@ -133,17 +133,17 @@ namespace SceneManager } } - public void AddSpeedZone() + internal void AddSpeedZone() { SpeedZone = World.AddSpeedZone(Position, SpeedZoneRadius, Speed); } - public void RemoveSpeedZone() + internal void RemoveSpeedZone() { World.RemoveSpeedZone(SpeedZone); } - public void DrawWaypointMarker() + internal void DrawWaypointMarker() { // This is called once when the waypoint is created GameFiber.StartNew((System.Threading.ThreadStart)(() => @@ -216,7 +216,7 @@ namespace SceneManager })); } - public void EnableBlip() + internal void EnableBlip() { if(!PathMainMenu.GetPaths().Where(p => p == Path).First().IsEnabled) { @@ -231,7 +231,7 @@ namespace SceneManager } - public void DisableBlip() + internal void DisableBlip() { Blip.Alpha = 0; CollectorRadiusBlip.Alpha = 0; From 514211dd96ab31f76090b5dd1021955f2ebbbc1d Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 13:23:03 -0600 Subject: [PATCH 185/276] Updated public methods and properties to internal, changed Game.LogTrivial calls to Logger.Log --- SceneManager/Menus/EditPathMenu.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/SceneManager/Menus/EditPathMenu.cs b/SceneManager/Menus/EditPathMenu.cs index f0100b1..8193e21 100644 --- a/SceneManager/Menus/EditPathMenu.cs +++ b/SceneManager/Menus/EditPathMenu.cs @@ -7,18 +7,17 @@ namespace SceneManager { class EditPathMenu { - public static UIMenu editPathMenu { get; private set; } + internal static UIMenu editPathMenu = new UIMenu("Scene Manager", "~o~Edit Path"); private static UIMenuItem editPathWaypoints, deletePath; - public static UIMenuCheckboxItem disablePath; + internal static UIMenuCheckboxItem disablePath; internal static void InstantiateMenu() { - editPathMenu = new UIMenu("Scene Manager", "~o~Edit Path"); editPathMenu.ParentMenu = PathMainMenu.pathMainMenu; MenuManager.menuPool.Add(editPathMenu); } - public static void BuildEditPathMenu() + internal static void BuildEditPathMenu() { editPathMenu.AddItem(disablePath = new UIMenuCheckboxItem("Disable Path", false)); editPathMenu.AddItem(editPathWaypoints = new UIMenuItem("Edit Waypoints")); @@ -54,12 +53,12 @@ namespace SceneManager if (disablePath.Checked) { currentPath.DisablePath(); - Game.LogTrivial($"Path {currentPath.Number} disabled."); + Logger.Log($"Path {currentPath.Number} disabled."); } else { currentPath.EnablePath(); - Game.LogTrivial($"Path {currentPath.Number} enabled."); + Logger.Log($"Path {currentPath.Number} enabled."); } } } From 47a5ea5879c11f80b67d8d63b05e7832b3b02b04 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 14:45:38 -0600 Subject: [PATCH 186/276] Set default state of EnableWaypointMarker to true, fixed DrawWaypointMarker not working correctly --- SceneManager/Object Classes/Waypoint.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 01aa78e..6f367f5 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -17,10 +17,10 @@ namespace SceneManager internal Blip CollectorRadiusBlip { get; set; } internal float SpeedZoneRadius { get; set; } internal uint SpeedZone { get; set; } - internal bool EnableWaypointMarker { get; set; } + internal bool EnableWaypointMarker { get; set; } = true; internal bool EnableEditMarker { get; set; } - internal Waypoint(Path path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector = false, float collectorRadius = 1, float speedZoneRadius = 0) + internal Waypoint(Path path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector = false, float collectorRadius = 0, float speedZoneRadius = 0) { Path = path; Number = waypointNum; @@ -146,7 +146,7 @@ namespace SceneManager internal void DrawWaypointMarker() { // This is called once when the waypoint is created - GameFiber.StartNew((System.Threading.ThreadStart)(() => + GameFiber.StartNew(() => { while (SettingsMenu.threeDWaypoints.Checked && EnableWaypointMarker && Path.Waypoints.Contains(this)) { @@ -213,7 +213,7 @@ namespace SceneManager GameFiber.Yield(); } - })); + }); } internal void EnableBlip() From 4dbe037cddd26baf0f9020a721196ca4b75628e5 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 14:46:43 -0600 Subject: [PATCH 187/276] Refactored menu item initializations, updated Game.LogTrivial calls to Logger.Log --- SceneManager/Menus/EditWaypointMenu.cs | 132 ++++++++++++------------- 1 file changed, 65 insertions(+), 67 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 99e6392..c40c1ec 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -11,89 +11,87 @@ namespace SceneManager { private static VehicleDrivingFlags[] drivingFlags = new VehicleDrivingFlags[] { VehicleDrivingFlags.Normal, VehicleDrivingFlags.IgnorePathFinding, VehicleDrivingFlags.StopAtDestination }; private static string[] waypointTypes = new string[] { "Drive To (Normal)", "Drive To (Direct)", "Stop" }; - public static UIMenu editWaypointMenu { get; private set; } - public static UIMenuItem updateWaypoint { get; private set; } - public static UIMenuItem removeWaypoint { get; private set; } - public static UIMenuItem addAsNewWaypoint { get; private set; } - public static UIMenuNumericScrollerItem editWaypoint; - public static UIMenuListScrollerItem changeWaypointType = new UIMenuListScrollerItem("Waypoint Type", "", waypointTypes); - private static UIMenuNumericScrollerItem changeWaypointSpeed; - public static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path"); - public static UIMenuNumericScrollerItem changeCollectorRadius = new UIMenuNumericScrollerItem("Collection Radius", "The distance from this waypoint (in meters) vehicles will be collected", 1, 50, 1); - public static UIMenuNumericScrollerItem changeSpeedZoneRadius = new UIMenuNumericScrollerItem("Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 5, 200, 5); - public static UIMenuCheckboxItem updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false, "Updates the waypoint's position to the player's current position. You should turn this on if you're planning on adding this waypoint as a new waypoint."); + internal static UIMenu editWaypointMenu = new UIMenu("Scene Manager", "~o~Edit Waypoint"); + internal static UIMenuItem updateWaypoint = new UIMenuItem("Update Waypoint"); + internal static UIMenuItem removeWaypoint = new UIMenuItem("Remove Waypoint"); + internal static UIMenuItem addAsNewWaypoint = new UIMenuItem("Add as New Waypoint", "Adds a new waypoint to the end of the path with these settings"); + internal static UIMenuNumericScrollerItem editWaypoint; + internal static UIMenuListScrollerItem changeWaypointType = new UIMenuListScrollerItem("Waypoint Type", "", waypointTypes); + private static UIMenuNumericScrollerItem changeWaypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 80, 5); + internal static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path"); + internal static UIMenuNumericScrollerItem changeCollectorRadius = new UIMenuNumericScrollerItem("Collection Radius", "The distance from this waypoint (in meters) vehicles will be collected", 1, 50, 1); + internal static UIMenuNumericScrollerItem changeSpeedZoneRadius = new UIMenuNumericScrollerItem("Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 5, 200, 5); + internal static UIMenuCheckboxItem updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false, "Updates the waypoint's position to the player's current position. You should turn this on if you're planning on adding this waypoint as a new waypoint."); internal static void InstantiateMenu() { - editWaypointMenu = new UIMenu("Scene Manager", "~o~Edit Waypoint"); editWaypointMenu.ParentMenu = EditPathMenu.editPathMenu; MenuManager.menuPool.Add(editWaypointMenu); } - public static void BuildEditWaypointMenu() + internal static void BuildEditWaypointMenu() { - var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Value - 1]; - Game.LogTrivial($"Current path: {currentPath.Number}"); - // Need to unsubscribe from these or else there will be duplicate firings if the user left the menu, then re-entered - editWaypointMenu.OnItemSelect -= EditWaypoint_OnItemSelected; - editWaypointMenu.OnCheckboxChange -= EditWaypoint_OnCheckboxChanged; - editWaypointMenu.OnScrollerChange -= EditWaypoint_OnScrollerChanged; + ResetEventHandlerSubscriptions(); + var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Value - 1]; + //Logger.Log($"Current path: {currentPath.Number}"); editWaypoint = new UIMenuNumericScrollerItem("Edit Waypoint", "", currentPath.Waypoints.First().Number, currentPath.Waypoints.Last().Number, 1); - editWaypoint.IndexChanged -= EditWaypoint_OnIndexChanged; - editWaypointMenu.Clear(); editWaypointMenu.AddItem(editWaypoint); editWaypoint.Index = 0; - var currentWaypoint = currentPath.Waypoints[editWaypoint.Value - 1]; - Game.LogTrivial($"Current waypoint: {currentWaypoint.Number}, Driving flag: {currentWaypoint.DrivingFlag.ToString()}"); + var currentWaypoint = currentPath.Waypoints.Where(wp => wp.Number == editWaypoint.Value).FirstOrDefault(); + //Logger.Log($"Current waypoint: {currentWaypoint.Number}, Driving flag: {currentWaypoint.DrivingFlag.ToString()}"); + if(currentWaypoint != null) + { + editWaypointMenu.AddItem(changeWaypointType); + changeWaypointType.Index = Array.IndexOf(drivingFlags, currentWaypoint.DrivingFlag); - editWaypointMenu.AddItem(changeWaypointType); - changeWaypointType.Index = Array.IndexOf(drivingFlags, currentWaypoint.DrivingFlag); + editWaypointMenu.AddItem(changeWaypointSpeed); + changeWaypointSpeed.Value = (int)MathHelper.ConvertMetersPerSecondToMilesPerHour(currentWaypoint.Speed); - editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 80, 5)); - changeWaypointSpeed.Value = (int)MathHelper.ConvertMetersPerSecondToMilesPerHour(currentWaypoint.Speed); + editWaypointMenu.AddItem(collectorWaypoint); + collectorWaypoint.Checked = currentWaypoint.IsCollector; - editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector Waypoint", currentWaypoint.IsCollector, "If this waypoint will collect vehicles to follow the path")); + editWaypointMenu.AddItem(changeCollectorRadius); + changeCollectorRadius.Value = currentWaypoint.CollectorRadius != 0 + ? (int)currentWaypoint.CollectorRadius + : changeCollectorRadius.Minimum; - editWaypointMenu.AddItem(changeCollectorRadius); - changeCollectorRadius.Value = currentWaypoint.CollectorRadius != 0 - ? (int)currentWaypoint.CollectorRadius - : changeCollectorRadius.Minimum; + editWaypointMenu.AddItem(changeSpeedZoneRadius); + changeSpeedZoneRadius.Value = currentWaypoint.CollectorRadius != 0 + ? (int)currentWaypoint.SpeedZoneRadius + : changeSpeedZoneRadius.Minimum; - editWaypointMenu.AddItem(changeSpeedZoneRadius); - changeSpeedZoneRadius.Value = currentWaypoint.CollectorRadius != 0 - ? (int)currentWaypoint.SpeedZoneRadius - : changeSpeedZoneRadius.Minimum; + changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; + changeSpeedZoneRadius.Enabled = collectorWaypoint.Checked ? true : false; - changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; - changeSpeedZoneRadius.Enabled = collectorWaypoint.Checked ? true : false; + editWaypointMenu.AddItem(updateWaypointPosition); + editWaypointMenu.AddItem(updateWaypoint); + updateWaypoint.ForeColor = Color.Gold; + editWaypointMenu.AddItem(removeWaypoint); + removeWaypoint.ForeColor = Color.Gold; + editWaypointMenu.AddItem(addAsNewWaypoint); + addAsNewWaypoint.ForeColor = Color.Gold; - editWaypointMenu.AddItem(updateWaypointPosition); - editWaypointMenu.AddItem(updateWaypoint = new UIMenuItem("Update Waypoint")); - updateWaypoint.ForeColor = Color.Gold; - editWaypointMenu.AddItem(removeWaypoint = new UIMenuItem("Remove Waypoint")); - removeWaypoint.ForeColor = Color.Gold; - editWaypointMenu.AddItem(addAsNewWaypoint = new UIMenuItem("Add as New Waypoint", "Adds a new waypoint to the end of the path with these settings")); - addAsNewWaypoint.ForeColor = Color.Gold; + EditPathMenu.editPathMenu.Visible = false; + editWaypointMenu.RefreshIndex(); + editWaypointMenu.Visible = true; + } + - EditPathMenu.editPathMenu.Visible = false; - editWaypointMenu.RefreshIndex(); - editWaypointMenu.Visible = true; + void ResetEventHandlerSubscriptions() + { + editWaypointMenu.OnItemSelect -= EditWaypoint_OnItemSelected; + editWaypointMenu.OnCheckboxChange -= EditWaypoint_OnCheckboxChanged; + editWaypointMenu.OnScrollerChange -= EditWaypoint_OnScrollerChanged; - editWaypointMenu.OnScrollerChange += EditWaypoint_OnScrollerChanged; - editWaypointMenu.OnCheckboxChange += EditWaypoint_OnCheckboxChanged; - editWaypointMenu.OnItemSelect += EditWaypoint_OnItemSelected; - editWaypoint.IndexChanged += EditWaypoint_OnIndexChanged; - } - - private static void EditWaypoint_OnIndexChanged(UIMenuScrollerItem scrollerItem, int oldIndex, int newIndex) - { - var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Value - 1]; - var currentWaypoint = currentPath.Waypoints[editWaypoint.Value - 1]; + editWaypointMenu.OnScrollerChange += EditWaypoint_OnScrollerChanged; + editWaypointMenu.OnCheckboxChange += EditWaypoint_OnCheckboxChanged; + editWaypointMenu.OnItemSelect += EditWaypoint_OnItemSelected; + } } private static void EditWaypoint_OnScrollerChanged(UIMenu sender, UIMenuScrollerItem scrollerItem, int first, int last) @@ -153,7 +151,7 @@ namespace SceneManager currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], SetDriveSpeedForWaypoint(), collectorWaypoint.Checked, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, updateWaypointPosition.Checked); } - Game.LogTrivial($"Updated path {currentPath.Number} waypoint {currentWaypoint.Number}: Driving flag is {drivingFlags[changeWaypointType.Index].ToString()}, speed is {changeWaypointSpeed.Value}, collector is {currentWaypoint.IsCollector}"); + Logger.Log($"Updated path {currentPath.Number} waypoint {currentWaypoint.Number}: Driving flag is {drivingFlags[changeWaypointType.Index].ToString()}, speed is {changeWaypointSpeed.Value}, collector is {currentWaypoint.IsCollector}"); updateWaypointPosition.Checked = false; Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Waypoint {currentWaypoint.Number} updated."); @@ -192,7 +190,7 @@ namespace SceneManager { if (currentPath.Waypoints.Count == 1) { - Game.LogTrivial($"Deleting the last waypoint from the path."); + Logger.Log($"Deleting the last waypoint from the path."); PathMainMenu.DeletePath(currentPath, PathMainMenu.Delete.Single); editWaypointMenu.Visible = false; @@ -206,12 +204,12 @@ namespace SceneManager currentWaypoint.CollectorRadiusBlip.Delete(); } currentPath.Waypoints.Remove(currentWaypoint); - Game.LogTrivial($"[Path {currentPath.Number}] Waypoint {currentWaypoint.Number} ({currentWaypoint.DrivingFlag}) removed"); + Logger.Log($"[Path {currentPath.Number}] Waypoint {currentWaypoint.Number} ({currentWaypoint.DrivingFlag}) removed"); foreach (Waypoint wp in currentPath.Waypoints) { wp.Number = currentPath.Waypoints.IndexOf(wp) + 1; - Game.LogTrivial($"Waypoint at index {currentPath.Waypoints.IndexOf(wp)} is now waypoint #{wp.Number}"); + Logger.Log($"Waypoint at index {currentPath.Waypoints.IndexOf(wp)} is now waypoint #{wp.Number}"); } editWaypointMenu.Clear(); @@ -220,7 +218,7 @@ namespace SceneManager if (currentPath.Waypoints.Count == 1) { Hints.Display($"~o~Scene Manager\n~y~[Hint]~w~ Your path's first waypoint ~b~must~w~ be a collector. If it's not, it will automatically be made into one."); - Game.LogTrivial($"The path only has 1 waypoint left, this waypoint must be a collector."); + Logger.Log($"The path only has 1 waypoint left, this waypoint must be a collector."); currentPath.Waypoints[0].UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], SetDriveSpeedForWaypoint(), true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, updateWaypointPosition.Checked); collectorWaypoint.Checked = true; changeCollectorRadius.Enabled = true; @@ -235,15 +233,15 @@ namespace SceneManager float convertedSpeed; if (SettingsMenu.speedUnits.SelectedItem == SpeedUnits.MPH) { - //Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); + //Logger.Log($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); convertedSpeed = MathHelper.ConvertMilesPerHourToMetersPerSecond(changeWaypointSpeed.Value); - //Game.LogTrivial($"Converted speed: {convertedSpeed}m/s"); + //Logger.Log($"Converted speed: {convertedSpeed}m/s"); } else { - //Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); + //Logger.Log($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); convertedSpeed = MathHelper.ConvertKilometersPerHourToMetersPerSecond(changeWaypointSpeed.Value); - //Game.LogTrivial($"Converted speed: {convertedSpeed}m/s"); + //Logger.Log($"Converted speed: {convertedSpeed}m/s"); } return convertedSpeed; From de3aade534f04a1f46d10e0930773fe76c674b81 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 14:47:05 -0600 Subject: [PATCH 188/276] Refactored menu item initializations, updated Game.LogTrivial calls to Logger.Log, refactored SetDriveSpeedForWaypoint as local function --- SceneManager/Menus/PathCreationMenu.cs | 88 +++++++++++++------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 7cf1bcd..9f7b1b8 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -13,41 +13,47 @@ namespace SceneManager private static VehicleDrivingFlags[] drivingFlags = new VehicleDrivingFlags[] { VehicleDrivingFlags.Normal, VehicleDrivingFlags.IgnorePathFinding, VehicleDrivingFlags.StopAtDestination }; // Implement custom driving flag for normal private static string[] waypointTypes = new string[] { "Drive To (Normal)", "Drive To (Direct)", "Stop" }; - public static UIMenu pathCreationMenu { get; private set; } - private static UIMenuItem trafficAddWaypoint, trafficRemoveWaypoint, trafficEndPath; - public static UIMenuListScrollerItem waypointType = new UIMenuListScrollerItem("Waypoint Type", $"~b~Drive To (Normal): ~w~AI obeys traffic as much as possible{Environment.NewLine}~b~Drive To (Direct): ~w~AI ignores pathfinding rules{Environment.NewLine}~b~Stop: ~w~AI stops at the waypoint until dismissed", waypointTypes); - private static UIMenuNumericScrollerItem waypointSpeed; - public static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path. Your path's first waypoint ~b~must~w~ be a collector."); - public static UIMenuNumericScrollerItem collectorRadius = new UIMenuNumericScrollerItem("Collection Radius", "The distance from this waypoint (in meters) vehicles will be collected", 1, 50, 1); - public static UIMenuNumericScrollerItem speedZoneRadius = new UIMenuNumericScrollerItem("Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 5, 200, 5); + internal static UIMenu pathCreationMenu = new UIMenu("Scene Manager", "~o~Path Creation Menu"); + private static UIMenuItem trafficAddWaypoint = new UIMenuItem("Add waypoint"), trafficRemoveWaypoint = new UIMenuItem("Remove last waypoint"), trafficEndPath = new UIMenuItem("End path creation"); + internal static UIMenuListScrollerItem waypointType = new UIMenuListScrollerItem("Waypoint Type", $"~b~Drive To (Normal): ~w~AI obeys traffic as much as possible{Environment.NewLine}~b~Drive To (Direct): ~w~AI ignores pathfinding rules{Environment.NewLine}~b~Stop: ~w~AI stops at the waypoint until dismissed", waypointTypes); + private static UIMenuNumericScrollerItem waypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 80, 5); + internal static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path. Your path's first waypoint ~b~must~w~ be a collector."); + internal static UIMenuNumericScrollerItem collectorRadius = new UIMenuNumericScrollerItem("Collection Radius", "The distance from this waypoint (in meters) vehicles will be collected", 1, 50, 1); + internal static UIMenuNumericScrollerItem speedZoneRadius = new UIMenuNumericScrollerItem("Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 5, 200, 5); internal static void InstantiateMenu() { - pathCreationMenu = new UIMenu("Scene Manager", "~o~Path Creation Menu"); pathCreationMenu.ParentMenu = PathMainMenu.pathMainMenu; MenuManager.menuPool.Add(pathCreationMenu); } - public static void BuildPathCreationMenu() + internal static void BuildPathCreationMenu() { pathCreationMenu.AddItem(waypointType); - pathCreationMenu.AddItem(waypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 80, 5)); + + pathCreationMenu.AddItem(waypointSpeed); waypointSpeed.Index = 0; + pathCreationMenu.AddItem(collectorWaypoint); collectorWaypoint.Enabled = false; collectorWaypoint.Checked = true; + pathCreationMenu.AddItem(collectorRadius); collectorRadius.Index = 0; collectorRadius.Enabled = true; + pathCreationMenu.AddItem(speedZoneRadius); speedZoneRadius.Index = 0; speedZoneRadius.Enabled = true; - pathCreationMenu.AddItem(trafficAddWaypoint = new UIMenuItem("Add waypoint")); + + pathCreationMenu.AddItem(trafficAddWaypoint); trafficAddWaypoint.ForeColor = Color.Gold; - pathCreationMenu.AddItem(trafficRemoveWaypoint = new UIMenuItem("Remove last waypoint")); + + pathCreationMenu.AddItem(trafficRemoveWaypoint); trafficRemoveWaypoint.ForeColor = Color.Gold; trafficRemoveWaypoint.Enabled = false; - pathCreationMenu.AddItem(trafficEndPath = new UIMenuItem("End path creation")); + + pathCreationMenu.AddItem(trafficEndPath); trafficEndPath.ForeColor = Color.Gold; trafficEndPath.Enabled = false; @@ -68,12 +74,10 @@ namespace SceneManager private static void PathCreation_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) { - // Do I need to implement a distance restriction? Idiots place waypoints unnecessarily close, possibly causing AI to drive in circles if (selectedItem == trafficAddWaypoint) { var anyPathsExist = PathMainMenu.GetPaths().Count > 0; - // If no paths exist, then add a new path to the collection at index 0. If paths do exist, then we want to add a new path at the first null index if there are no non-null paths where pathFinished = false if (!anyPathsExist) { AddNewPathToPathsCollection(PathMainMenu.GetPaths(), 0); @@ -96,12 +100,31 @@ namespace SceneManager { PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(firstNonNullPath, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlags[waypointType.Index], CreateWaypointBlip(pathIndex, drivingFlags[waypointType.Index]))); } - Game.LogTrivial($"[Path {pathNumber}] Waypoint {waypointNumber} ({drivingFlags[waypointType.Index].ToString()}) added"); + Logger.Log($"[Path {pathNumber}] Waypoint {waypointNumber} ({drivingFlags[waypointType.Index].ToString()}) added"); ToggleTrafficEndPathMenuItem(pathIndex); collectorWaypoint.Enabled = true; trafficRemoveWaypoint.Enabled = true; PathMainMenu.createNewPath.Text = $"Continue Creating Path {pathNumber}"; + + float SetDriveSpeedForWaypoint() + { + float convertedSpeed; + if (SettingsMenu.speedUnits.SelectedItem == SpeedUnits.MPH) + { + //Logger.Log($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); + convertedSpeed = MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeed.Value); + //Logger.Log($"Converted speed: {convertedSpeed}m/s"); + } + else + { + //Logger.Log($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); + convertedSpeed = MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeed.Value); + //Logger.Log($"Converted speed: {convertedSpeed}m/s"); + } + + return convertedSpeed; + } } if (selectedItem == trafficRemoveWaypoint) @@ -111,7 +134,7 @@ namespace SceneManager { if (PathMainMenu.GetPaths().ElementAtOrDefault(i) != null && PathMainMenu.GetPaths()[i].State == State.Creating) { - Game.LogTrivial($"[Path {i + 1}] {PathMainMenu.GetPaths()[i].Waypoints.Last().DrivingFlag.ToString()} waypoint removed"); + Logger.Log($"[Path {i + 1}] {PathMainMenu.GetPaths()[i].Waypoints.Last().DrivingFlag.ToString()} waypoint removed"); PathMainMenu.GetPaths()[i].Waypoints.Last().Blip.Delete(); PathMainMenu.GetPaths()[i].Waypoints.Last().RemoveSpeedZone(); @@ -145,23 +168,19 @@ namespace SceneManager var currentPath = PathMainMenu.GetPaths()[i]; if (PathMainMenu.GetPaths().ElementAtOrDefault(i) != null && currentPath.State == State.Creating) { - Game.LogTrivial($"[Path Creation] Path {currentPath.Number} finished with {currentPath.Waypoints.Count} waypoints."); + Logger.Log($"[Path Creation] Path {currentPath.Number} finished with {currentPath.Waypoints.Count} waypoints."); Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Path {i + 1} complete."); currentPath.State = State.Finished; currentPath.IsEnabled = true; currentPath.Number = i + 1; - // For each waypoint in the path's WaypointData, start a collector game fiber and loop while the path and waypoint exist, and while the path is enabled foreach (Waypoint waypoint in PathMainMenu.GetPaths()[i].Waypoints) { GameFiber WaypointVehicleCollectorFiber = new GameFiber(() => VehicleCollector.StartCollectingAtWaypoint(PathMainMenu.GetPaths(), PathMainMenu.GetPaths()[i], waypoint)); WaypointVehicleCollectorFiber.Start(); } - MenuManager.menuPool.CloseAllMenus(); - //pathCreationMenu.Reset(true, true); // Trying to see if we can get away with resetting the menu instead of rebuilding it PathMainMenu.createNewPath.Text = "Create New Path"; - PathMainMenu.pathMainMenu.Clear(); PathMainMenu.BuildPathMenu(); collectorWaypoint.Enabled = false; collectorWaypoint.Checked = true; @@ -207,26 +226,7 @@ namespace SceneManager } } - private static float SetDriveSpeedForWaypoint() - { - float convertedSpeed; - if (SettingsMenu.speedUnits.SelectedItem == SpeedUnits.MPH) - { - //Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); - convertedSpeed = MathHelper.ConvertMilesPerHourToMetersPerSecond(waypointSpeed.Value); - //Game.LogTrivial($"Converted speed: {convertedSpeed}m/s"); - } - else - { - //Game.LogTrivial($"Original speed: {waypointSpeeds[waypointSpeed.Index]}{SettingsMenu.speedUnits.SelectedItem}"); - convertedSpeed = MathHelper.ConvertKilometersPerHourToMetersPerSecond(waypointSpeed.Value); - //Game.LogTrivial($"Converted speed: {convertedSpeed}m/s"); - } - - return convertedSpeed; - } - - public static Blip CreateWaypointBlip(int pathIndex, VehicleDrivingFlags drivingFlag) + internal static Blip CreateWaypointBlip(int pathIndex, VehicleDrivingFlags drivingFlag) { var spriteNumericalEnum = pathIndex + 17; // 17 because the numerical value of these sprites are always 17 more than the path index var blip = new Blip(Game.LocalPlayer.Character.Position) @@ -256,10 +256,10 @@ namespace SceneManager return blip; } - public static void AddNewPathToPathsCollection(List paths, int pathIndex) + internal static void AddNewPathToPathsCollection(List paths, int pathIndex) { var pathNum = pathIndex + 1; - Game.LogTrivial($"Creating path {pathNum}"); + Logger.Log($"Creating path {pathNum}"); Game.DisplayNotification($"~o~Scene Manager\n~y~[Creating]~w~ Path {pathNum} started."); paths.Insert(pathIndex, new Path(pathNum, State.Creating)); trafficRemoveWaypoint.Enabled = false; From d60c9ff105e6473b22f594e5f09b0367a455a802 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 14:47:37 -0600 Subject: [PATCH 189/276] Refactored menu item initializations, updated Game.LogTrivial calls to Logger.Log, updated public methods to internal --- SceneManager/Menus/PathMainMenu.cs | 110 ++++++++++++++--------------- 1 file changed, 54 insertions(+), 56 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index 62ebd5f..864b87d 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -11,18 +11,18 @@ namespace SceneManager static class PathMainMenu { private static List paths = new List() { }; - - public static UIMenu pathMainMenu { get; private set; } - public static UIMenuItem createNewPath { get; private set; } - public static UIMenuItem deleteAllPaths; - public static UIMenuNumericScrollerItem editPath = new UIMenuNumericScrollerItem("Edit Path", "", 1, paths.Count, 1); - public static UIMenuListScrollerItem directOptions { get; private set; } - public static UIMenuNumericScrollerItem directDriver = new UIMenuNumericScrollerItem("Direct nearest driver to path", "", 1, paths.Count, 1); - public static UIMenuListScrollerItem dismissDriver { get; private set; } - public static UIMenuCheckboxItem disableAllPaths { get; private set; } - private static List dismissOptions = new List() { "From path", "From waypoint", "From position" }; - public enum Delete + + internal static UIMenu pathMainMenu = new UIMenu("Scene Manager", "~o~Path Manager Main Menu"); + internal static UIMenuItem createNewPath; + internal static UIMenuItem deleteAllPaths = new UIMenuItem("Delete All Paths"); + internal static UIMenuNumericScrollerItem editPath; + internal static UIMenuListScrollerItem directOptions = new UIMenuListScrollerItem("Direct driver to path's", "", new[] { "First waypoint", "Nearest waypoint" }); + internal static UIMenuNumericScrollerItem directDriver; + internal static UIMenuListScrollerItem dismissDriver = new UIMenuListScrollerItem("Dismiss nearest driver", $"~b~From path: ~w~AI will be released from the path{Environment.NewLine}~b~From waypoint: ~w~AI will skip their current waypoint task{Environment.NewLine}~b~From position: ~w~AI will be released from current position. This can be used for stuck vehicles, and is the default behavior for vehicles not collected by a path.", dismissOptions); + internal static UIMenuCheckboxItem disableAllPaths = new UIMenuCheckboxItem("Disable All Paths", false); + + internal enum Delete { Single, All @@ -30,12 +30,11 @@ namespace SceneManager internal static void InstantiateMenu() { - pathMainMenu = new UIMenu("Scene Manager", "~o~Path Manager Main Menu"); pathMainMenu.ParentMenu = MainMenu.mainMenu; MenuManager.menuPool.Add(pathMainMenu); } - public static void BuildPathMenu() + internal static void BuildPathMenu() { // Need to unsubscribe from events, else there will be duplicate firings if the user left the menu and re-entered ResetEventHandlerSubscriptions(); @@ -47,13 +46,16 @@ namespace SceneManager createNewPath.ForeColor = Color.Gold; pathMainMenu.AddItem(editPath = new UIMenuNumericScrollerItem("Edit Path", "", 1, paths.Count, 1)); editPath.ForeColor = Color.Gold; - pathMainMenu.AddItem(disableAllPaths = new UIMenuCheckboxItem("Disable All Paths", false)); - pathMainMenu.AddItem(deleteAllPaths = new UIMenuItem("Delete All Paths")); + pathMainMenu.AddItem(disableAllPaths); + disableAllPaths.Enabled = true; + pathMainMenu.AddItem(deleteAllPaths); + deleteAllPaths.Enabled = true; deleteAllPaths.ForeColor = Color.Gold; - pathMainMenu.AddItem(directOptions = new UIMenuListScrollerItem("Direct driver to path's", "", new[] { "First waypoint", "Nearest waypoint" })); + pathMainMenu.AddItem(directOptions); pathMainMenu.AddItem(directDriver = new UIMenuNumericScrollerItem("Direct nearest driver to path", "", 1, paths.Count, 1)); directDriver.ForeColor = Color.Gold; - pathMainMenu.AddItem(dismissDriver = new UIMenuListScrollerItem("Dismiss nearest driver", $"~b~From path: ~w~AI will be released from the path{Environment.NewLine}~b~From waypoint: ~w~AI will skip their current waypoint task{Environment.NewLine}~b~From position: ~w~AI will be released from current position. This can be used for stuck vehicles, and is the default behavior for vehicles not collected by a path.", dismissOptions)); + directDriver.Enabled = true; + pathMainMenu.AddItem(dismissDriver); dismissDriver.ForeColor = Color.Gold; if (paths.Count == 8) @@ -68,20 +70,18 @@ namespace SceneManager directDriver.Enabled = false; } - pathMainMenu.RefreshIndex(); - MenuManager.menuPool.RefreshIndex(); + + void ResetEventHandlerSubscriptions() + { + pathMainMenu.OnItemSelect -= PathMenu_OnItemSelected; + pathMainMenu.OnCheckboxChange -= PathMenu_OnCheckboxChange; + pathMainMenu.OnItemSelect += PathMenu_OnItemSelected; + pathMainMenu.OnCheckboxChange += PathMenu_OnCheckboxChange; + } } - private static void ResetEventHandlerSubscriptions() - { - pathMainMenu.OnItemSelect -= PathMenu_OnItemSelected; - pathMainMenu.OnCheckboxChange -= PathMenu_OnCheckboxChange; - pathMainMenu.OnItemSelect += PathMenu_OnItemSelected; - pathMainMenu.OnCheckboxChange += PathMenu_OnCheckboxChange; - } - - public static ref List GetPaths() + internal static ref List GetPaths() { return ref paths; } @@ -98,10 +98,9 @@ namespace SceneManager } } - public static void DeletePath(Path path, Delete pathsToDelete) + internal static void DeletePath(Path path, Delete pathsToDelete) { - // Before deleting a path, we need to dismiss any vehicles controlled by that path and remove the vehicles from ControlledVehicles - Game.LogTrivial($"Deleting path {path.Number}"); + Game.LogTrivial($"Preparing to delete path {path.Number}"); var pathVehicles = VehicleCollector.collectedVehicles.Where(cv => cv.Path.Number == path.Number).ToList(); Game.LogTrivial($"Removing all vehicles on the path"); @@ -149,7 +148,7 @@ namespace SceneManager paths.Remove(path); BuildPathMenu(); pathMainMenu.Visible = true; - Game.LogTrivial($"Path {path.Number} deleted."); + Game.LogTrivial($"Path {path.Number} deleted successfully."); Game.DisplayNotification($"~o~Scene Manager\n~w~Path {path.Number} deleted."); } @@ -329,6 +328,29 @@ namespace SceneManager } } + private static void PathMenu_OnCheckboxChange(UIMenu sender, UIMenuCheckboxItem checkboxItem, bool @checked) + { + if (checkboxItem == disableAllPaths) + { + if (disableAllPaths.Checked) + { + foreach (Path path in paths) + { + path.DisablePath(); + } + Game.LogTrivial($"All paths disabled."); + } + else + { + foreach (Path path in paths) + { + path.EnablePath(); + } + Game.LogTrivial($"All paths enabled."); + } + } + } + private static void Draw3DWaypointOnPlayer() { GameFiber.StartNew(() => @@ -359,29 +381,5 @@ namespace SceneManager } }); } - - private static void PathMenu_OnCheckboxChange(UIMenu sender, UIMenuCheckboxItem checkboxItem, bool @checked) - { - if (checkboxItem == disableAllPaths) - { - if (disableAllPaths.Checked) - { - foreach (Path path in paths) - { - path.DisablePath(); - } - Game.LogTrivial($"All paths disabled."); - } - else - { - foreach (Path path in paths) - { - path.EnablePath(); - } - Game.LogTrivial($"All paths enabled."); - } - - } - } } } From d29e38f25c9f3819b9a5ab7abe8a177df7fb23b2 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 14:48:00 -0600 Subject: [PATCH 190/276] Refactored menu item initializations, updated public methods to internal --- SceneManager/Menus/SettingsMenu.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/SceneManager/Menus/SettingsMenu.cs b/SceneManager/Menus/SettingsMenu.cs index f5c3294..d1f0191 100644 --- a/SceneManager/Menus/SettingsMenu.cs +++ b/SceneManager/Menus/SettingsMenu.cs @@ -7,22 +7,21 @@ namespace SceneManager { class SettingsMenu { - public static UIMenu settingsMenu { get; set; } - public static UIMenuCheckboxItem threeDWaypoints = new UIMenuCheckboxItem("Enable 3D Waypoints", Settings.Enable3DWaypoints), + internal static UIMenu settingsMenu = new UIMenu("Scene Manager", "~o~Plugin Settings"); + internal static UIMenuCheckboxItem threeDWaypoints = new UIMenuCheckboxItem("Enable 3D Waypoints", Settings.Enable3DWaypoints), mapBlips = new UIMenuCheckboxItem("Enable Map Blips", Settings.EnableMapBlips), hints = new UIMenuCheckboxItem("Enable Hints", Settings.EnableHints); private static SpeedUnits[] speedArray = {SpeedUnits.MPH, SpeedUnits.KPH }; - public static UIMenuListScrollerItem speedUnits = new UIMenuListScrollerItem("Speed Unit of Measure", "", new[] { SpeedUnits.MPH, SpeedUnits.KPH }); - public static UIMenuItem saveSettings = new UIMenuItem("Save settings to .ini", "Updates the plugin's .ini file with the current settings so the next time the plugin is loaded, it will use these settings."); + internal static UIMenuListScrollerItem speedUnits = new UIMenuListScrollerItem("Speed Unit of Measure", "", new[] { SpeedUnits.MPH, SpeedUnits.KPH }); + internal static UIMenuItem saveSettings = new UIMenuItem("Save settings to .ini", "Updates the plugin's .ini file with the current settings so the next time the plugin is loaded, it will use these settings."); internal static void InstantiateMenu() { - settingsMenu = new UIMenu("Scene Manager", "~o~Plugin Settings"); settingsMenu.ParentMenu = MainMenu.mainMenu; MenuManager.menuPool.Add(settingsMenu); } - public static void BuildSettingsMenu() + internal static void BuildSettingsMenu() { settingsMenu.AddItem(threeDWaypoints); settingsMenu.AddItem(mapBlips); From 9deec7d113eda989772f7897814415fe64500882 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 15:01:53 -0600 Subject: [PATCH 191/276] Updated plugin attributes --- SceneManager/EntryPoint.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/EntryPoint.cs b/SceneManager/EntryPoint.cs index 5abc3d0..b8d32fa 100644 --- a/SceneManager/EntryPoint.cs +++ b/SceneManager/EntryPoint.cs @@ -4,7 +4,7 @@ using System.Reflection; using System.Windows.Forms; using Rage; -[assembly: Rage.Attributes.Plugin("Scene Manager [Release Candidate]", Author = "Rich", Description = "Manage your scenes with custom AI traffic pathing and cone placement.")] +[assembly: Rage.Attributes.Plugin("Scene Manager", Author = "Rich", Description = "Control your scenes with custom AI pathing and traffic barrier management.")] namespace SceneManager { From 5ae4a13f2beda4dd1b191a47ce434a26dc40ae14 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 14 Sep 2020 16:42:51 -0600 Subject: [PATCH 192/276] Moved some variable assignments back into their build menu method. --- SceneManager/Menus/EditWaypointMenu.cs | 9 ++++----- SceneManager/Menus/PathCreationMenu.cs | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index c40c1ec..b50943a 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -17,8 +17,8 @@ namespace SceneManager internal static UIMenuItem addAsNewWaypoint = new UIMenuItem("Add as New Waypoint", "Adds a new waypoint to the end of the path with these settings"); internal static UIMenuNumericScrollerItem editWaypoint; internal static UIMenuListScrollerItem changeWaypointType = new UIMenuListScrollerItem("Waypoint Type", "", waypointTypes); - private static UIMenuNumericScrollerItem changeWaypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 80, 5); - internal static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path"); + private static UIMenuNumericScrollerItem changeWaypointSpeed; + internal static UIMenuCheckboxItem collectorWaypoint; internal static UIMenuNumericScrollerItem changeCollectorRadius = new UIMenuNumericScrollerItem("Collection Radius", "The distance from this waypoint (in meters) vehicles will be collected", 1, 50, 1); internal static UIMenuNumericScrollerItem changeSpeedZoneRadius = new UIMenuNumericScrollerItem("Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 5, 200, 5); internal static UIMenuCheckboxItem updateWaypointPosition = new UIMenuCheckboxItem("Update Waypoint Position", false, "Updates the waypoint's position to the player's current position. You should turn this on if you're planning on adding this waypoint as a new waypoint."); @@ -49,11 +49,10 @@ namespace SceneManager editWaypointMenu.AddItem(changeWaypointType); changeWaypointType.Index = Array.IndexOf(drivingFlags, currentWaypoint.DrivingFlag); - editWaypointMenu.AddItem(changeWaypointSpeed); + editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 80, 5)); changeWaypointSpeed.Value = (int)MathHelper.ConvertMetersPerSecondToMilesPerHour(currentWaypoint.Speed); - editWaypointMenu.AddItem(collectorWaypoint); - collectorWaypoint.Checked = currentWaypoint.IsCollector; + editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector", currentWaypoint.IsCollector, "If this waypoint will collect vehicles to follow the path")); editWaypointMenu.AddItem(changeCollectorRadius); changeCollectorRadius.Value = currentWaypoint.CollectorRadius != 0 diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 9f7b1b8..d726e3e 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -16,7 +16,7 @@ namespace SceneManager internal static UIMenu pathCreationMenu = new UIMenu("Scene Manager", "~o~Path Creation Menu"); private static UIMenuItem trafficAddWaypoint = new UIMenuItem("Add waypoint"), trafficRemoveWaypoint = new UIMenuItem("Remove last waypoint"), trafficEndPath = new UIMenuItem("End path creation"); internal static UIMenuListScrollerItem waypointType = new UIMenuListScrollerItem("Waypoint Type", $"~b~Drive To (Normal): ~w~AI obeys traffic as much as possible{Environment.NewLine}~b~Drive To (Direct): ~w~AI ignores pathfinding rules{Environment.NewLine}~b~Stop: ~w~AI stops at the waypoint until dismissed", waypointTypes); - private static UIMenuNumericScrollerItem waypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 80, 5); + private static UIMenuNumericScrollerItem waypointSpeed; internal static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path. Your path's first waypoint ~b~must~w~ be a collector."); internal static UIMenuNumericScrollerItem collectorRadius = new UIMenuNumericScrollerItem("Collection Radius", "The distance from this waypoint (in meters) vehicles will be collected", 1, 50, 1); internal static UIMenuNumericScrollerItem speedZoneRadius = new UIMenuNumericScrollerItem("Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 5, 200, 5); @@ -31,7 +31,7 @@ namespace SceneManager { pathCreationMenu.AddItem(waypointType); - pathCreationMenu.AddItem(waypointSpeed); + pathCreationMenu.AddItem(waypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 80, 5)); waypointSpeed.Index = 0; pathCreationMenu.AddItem(collectorWaypoint); From 2241e107dee247cf5a403844355e832fdb2f51fb Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 15 Sep 2020 13:49:10 -0600 Subject: [PATCH 193/276] Removed GetPaths() method from PathMainMenu and updated references to paths list. --- SceneManager/EntryPoint.cs | 6 ++-- SceneManager/Menus/EditPathMenu.cs | 4 +-- SceneManager/Menus/EditWaypointMenu.cs | 8 ++--- SceneManager/Menus/PathCreationMenu.cs | 50 +++++++++++++------------- SceneManager/Menus/PathMainMenu.cs | 11 +++--- SceneManager/Menus/SettingsMenu.cs | 4 +-- 6 files changed, 42 insertions(+), 41 deletions(-) diff --git a/SceneManager/EntryPoint.cs b/SceneManager/EntryPoint.cs index b8d32fa..efde765 100644 --- a/SceneManager/EntryPoint.cs +++ b/SceneManager/EntryPoint.cs @@ -54,9 +54,9 @@ namespace SceneManager private static void MyTerminationHandler(object sender, EventArgs e) { // Clean up paths - for (int i = 0; i < PathMainMenu.GetPaths().Count; i++) + for (int i = 0; i < PathMainMenu.paths.Count; i++) { - PathMainMenu.DeletePath(PathMainMenu.GetPaths()[i], PathMainMenu.Delete.All); + PathMainMenu.DeletePath(PathMainMenu.paths[i], PathMainMenu.Delete.All); } // Clean up cones @@ -72,7 +72,7 @@ namespace SceneManager // Clear everything BarrierMenu.barriers.Clear(); VehicleCollector.collectedVehicles.Clear(); - PathMainMenu.GetPaths().Clear(); + PathMainMenu.paths.Clear(); Logger.Log($"Plugin has shut down."); Game.DisplayNotification($"~o~Scene Manager\n~r~[Notice]~w~ The plugin has shut down."); diff --git a/SceneManager/Menus/EditPathMenu.cs b/SceneManager/Menus/EditPathMenu.cs index 8193e21..59db1a7 100644 --- a/SceneManager/Menus/EditPathMenu.cs +++ b/SceneManager/Menus/EditPathMenu.cs @@ -32,7 +32,7 @@ namespace SceneManager private static void EditPath_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) { - var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index]; + var currentPath = PathMainMenu.paths[PathMainMenu.editPath.Index]; if (selectedItem == editPathWaypoints) { @@ -49,7 +49,7 @@ namespace SceneManager { if (checkboxItem == disablePath) { - var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index]; + var currentPath = PathMainMenu.paths[PathMainMenu.editPath.Index]; if (disablePath.Checked) { currentPath.DisablePath(); diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index b50943a..073915f 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -34,7 +34,7 @@ namespace SceneManager // Need to unsubscribe from these or else there will be duplicate firings if the user left the menu, then re-entered ResetEventHandlerSubscriptions(); - var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Value - 1]; + var currentPath = PathMainMenu.paths[PathMainMenu.editPath.Value-1]; //Logger.Log($"Current path: {currentPath.Number}"); editWaypoint = new UIMenuNumericScrollerItem("Edit Waypoint", "", currentPath.Waypoints.First().Number, currentPath.Waypoints.Last().Number, 1); @@ -95,7 +95,7 @@ namespace SceneManager private static void EditWaypoint_OnScrollerChanged(UIMenu sender, UIMenuScrollerItem scrollerItem, int first, int last) { - var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Value - 1]; + var currentPath = PathMainMenu.paths[PathMainMenu.editPath.Index]; var currentWaypoint = currentPath.Waypoints[editWaypoint.Value - 1]; if (scrollerItem == editWaypoint) @@ -136,7 +136,7 @@ namespace SceneManager private static void EditWaypoint_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) { - var currentPath = PathMainMenu.GetPaths()[PathMainMenu.editPath.Index]; + var currentPath = PathMainMenu.paths[PathMainMenu.editPath.Index]; var currentWaypoint = currentPath.Waypoints[editWaypoint.Index]; if (selectedItem == updateWaypoint) @@ -160,7 +160,7 @@ namespace SceneManager if (selectedItem == addAsNewWaypoint) { - var pathIndex = PathMainMenu.GetPaths().IndexOf(currentPath); + var pathIndex = PathMainMenu.paths.IndexOf(currentPath); var drivingFlag = drivingFlags[changeWaypointType.Index]; var blip = PathCreationMenu.CreateWaypointBlip(pathIndex, drivingFlag); if (!currentPath.IsEnabled) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index d726e3e..170e8c8 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -76,29 +76,29 @@ namespace SceneManager { if (selectedItem == trafficAddWaypoint) { - var anyPathsExist = PathMainMenu.GetPaths().Count > 0; + var anyPathsExist = PathMainMenu.paths.Count > 0; if (!anyPathsExist) { - AddNewPathToPathsCollection(PathMainMenu.GetPaths(), 0); + AddNewPathToPathsCollection(PathMainMenu.paths, 0); } - else if(anyPathsExist && !PathMainMenu.GetPaths().Any(p => p != null && p.State == State.Creating)) + else if(anyPathsExist && !PathMainMenu.paths.Any(p => p != null && p.State == State.Creating)) { - AddNewPathToPathsCollection(PathMainMenu.GetPaths(), PathMainMenu.GetPaths().IndexOf(PathMainMenu.GetPaths().Where(p => p.State == State.Finished).First()) + 1); + AddNewPathToPathsCollection(PathMainMenu.paths, PathMainMenu.paths.IndexOf(PathMainMenu.paths.Where(p => p.State == State.Finished).First()) + 1); } - var firstNonNullPath = PathMainMenu.GetPaths().Where(p => p != null && p.State == State.Creating).First(); - var pathIndex = PathMainMenu.GetPaths().IndexOf(firstNonNullPath); + var firstNonNullPath = PathMainMenu.paths.Where(p => p != null && p.State == State.Creating).First(); + var pathIndex = PathMainMenu.paths.IndexOf(firstNonNullPath); var pathNumber = firstNonNullPath.Number; - var waypointNumber = PathMainMenu.GetPaths()[pathIndex].Waypoints.Count + 1; + var waypointNumber = PathMainMenu.paths[pathIndex].Waypoints.Count + 1; if (collectorWaypoint.Checked) { - PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(firstNonNullPath, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlags[waypointType.Index], CreateWaypointBlip(pathIndex, drivingFlags[waypointType.Index]), true, collectorRadius.Value, speedZoneRadius.Value)); + PathMainMenu.paths[pathIndex].Waypoints.Add(new Waypoint(firstNonNullPath, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlags[waypointType.Index], CreateWaypointBlip(pathIndex, drivingFlags[waypointType.Index]), true, collectorRadius.Value, speedZoneRadius.Value)); } else { - PathMainMenu.GetPaths()[pathIndex].Waypoints.Add(new Waypoint(firstNonNullPath, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlags[waypointType.Index], CreateWaypointBlip(pathIndex, drivingFlags[waypointType.Index]))); + PathMainMenu.paths[pathIndex].Waypoints.Add(new Waypoint(firstNonNullPath, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlags[waypointType.Index], CreateWaypointBlip(pathIndex, drivingFlags[waypointType.Index]))); } Logger.Log($"[Path {pathNumber}] Waypoint {waypointNumber} ({drivingFlags[waypointType.Index].ToString()}) added"); @@ -130,24 +130,24 @@ namespace SceneManager if (selectedItem == trafficRemoveWaypoint) { // Loop through each path and find the first one which isn't finished, then delete the path's last waypoint and corresponding blip - for (int i = 0; i < PathMainMenu.GetPaths().Count; i++) + for (int i = 0; i < PathMainMenu.paths.Count; i++) { - if (PathMainMenu.GetPaths().ElementAtOrDefault(i) != null && PathMainMenu.GetPaths()[i].State == State.Creating) + if (PathMainMenu.paths.ElementAtOrDefault(i) != null && PathMainMenu.paths[i].State == State.Creating) { - Logger.Log($"[Path {i + 1}] {PathMainMenu.GetPaths()[i].Waypoints.Last().DrivingFlag.ToString()} waypoint removed"); - PathMainMenu.GetPaths()[i].Waypoints.Last().Blip.Delete(); - PathMainMenu.GetPaths()[i].Waypoints.Last().RemoveSpeedZone(); + Logger.Log($"[Path {i + 1}] {PathMainMenu.paths[i].Waypoints.Last().DrivingFlag.ToString()} waypoint removed"); + PathMainMenu.paths[i].Waypoints.Last().Blip.Delete(); + PathMainMenu.paths[i].Waypoints.Last().RemoveSpeedZone(); - if (PathMainMenu.GetPaths()[i].Waypoints.Last().CollectorRadiusBlip) + if (PathMainMenu.paths[i].Waypoints.Last().CollectorRadiusBlip) { - PathMainMenu.GetPaths()[i].Waypoints.Last().CollectorRadiusBlip.Delete(); + PathMainMenu.paths[i].Waypoints.Last().CollectorRadiusBlip.Delete(); } - PathMainMenu.GetPaths()[i].Waypoints.RemoveAt(PathMainMenu.GetPaths()[i].Waypoints.IndexOf(PathMainMenu.GetPaths()[i].Waypoints.Last())); + PathMainMenu.paths[i].Waypoints.RemoveAt(PathMainMenu.paths[i].Waypoints.IndexOf(PathMainMenu.paths[i].Waypoints.Last())); ToggleTrafficEndPathMenuItem(i); // If the path has no waypoints, disable the menu option to remove a waypoint - if (PathMainMenu.GetPaths()[i].Waypoints.Count == 0) + if (PathMainMenu.paths[i].Waypoints.Count == 0) { collectorWaypoint.Checked = true; collectorWaypoint.Enabled = false; @@ -163,10 +163,10 @@ namespace SceneManager if (selectedItem == trafficEndPath) { // Loop through each path and find the first one which isn't finished - for (int i = 0; i < PathMainMenu.GetPaths().Count; i++) + for (int i = 0; i < PathMainMenu.paths.Count; i++) { - var currentPath = PathMainMenu.GetPaths()[i]; - if (PathMainMenu.GetPaths().ElementAtOrDefault(i) != null && currentPath.State == State.Creating) + var currentPath = PathMainMenu.paths[i]; + if (PathMainMenu.paths.ElementAtOrDefault(i) != null && currentPath.State == State.Creating) { Logger.Log($"[Path Creation] Path {currentPath.Number} finished with {currentPath.Waypoints.Count} waypoints."); Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Path {i + 1} complete."); @@ -174,14 +174,16 @@ namespace SceneManager currentPath.IsEnabled = true; currentPath.Number = i + 1; - foreach (Waypoint waypoint in PathMainMenu.GetPaths()[i].Waypoints) + foreach (Waypoint waypoint in PathMainMenu.paths[i].Waypoints) { - GameFiber WaypointVehicleCollectorFiber = new GameFiber(() => VehicleCollector.StartCollectingAtWaypoint(PathMainMenu.GetPaths(), PathMainMenu.GetPaths()[i], waypoint)); + GameFiber WaypointVehicleCollectorFiber = new GameFiber(() => VehicleCollector.StartCollectingAtWaypoint(PathMainMenu.paths, PathMainMenu.paths[i], waypoint)); WaypointVehicleCollectorFiber.Start(); } PathMainMenu.createNewPath.Text = "Create New Path"; PathMainMenu.BuildPathMenu(); + PathMainMenu.pathMainMenu.RefreshIndex(); + pathCreationMenu.RefreshIndex(); collectorWaypoint.Enabled = false; collectorWaypoint.Checked = true; speedZoneRadius.Enabled = true; @@ -216,7 +218,7 @@ namespace SceneManager private static void ToggleTrafficEndPathMenuItem(int pathIndex) { - if (PathMainMenu.GetPaths()[pathIndex].Waypoints.Count > 0) + if (PathMainMenu.paths[pathIndex].Waypoints.Count > 0) { trafficEndPath.Enabled = true; } diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index 864b87d..3769c1b 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -10,7 +10,7 @@ namespace SceneManager { static class PathMainMenu { - private static List paths = new List() { }; + internal static List paths = new List() { }; private static List dismissOptions = new List() { "From path", "From waypoint", "From position" }; internal static UIMenu pathMainMenu = new UIMenu("Scene Manager", "~o~Path Manager Main Menu"); @@ -81,11 +81,6 @@ namespace SceneManager } } - internal static ref List GetPaths() - { - return ref paths; - } - private static bool VehicleAndDriverValid(this Vehicle v) { if (v && v.HasDriver && v.Driver && v.Driver.IsAlive) @@ -233,6 +228,10 @@ namespace SceneManager } collectedVehicle.Driver.Tasks.Clear(); + if (collectedVehicle.StoppedAtWaypoint) + { + collectedVehicle.StoppedAtWaypoint = false; + } if (directOptions.SelectedItem == "First waypoint") { diff --git a/SceneManager/Menus/SettingsMenu.cs b/SceneManager/Menus/SettingsMenu.cs index d1f0191..4bd6db2 100644 --- a/SceneManager/Menus/SettingsMenu.cs +++ b/SceneManager/Menus/SettingsMenu.cs @@ -51,7 +51,7 @@ namespace SceneManager { if (mapBlips.Checked) { - foreach(Path path in PathMainMenu.GetPaths()) + foreach(Path path in PathMainMenu.paths) { foreach(Waypoint wp in path.Waypoints) { @@ -61,7 +61,7 @@ namespace SceneManager } else { - foreach (Path path in PathMainMenu.GetPaths()) + foreach (Path path in PathMainMenu.paths) { foreach (Waypoint wp in path.Waypoints) { From f2909ef6a8efdd0c45abb56938ae62de4863fc48 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 15 Sep 2020 13:50:02 -0600 Subject: [PATCH 194/276] Removed unnecessary else statements, changed Z-height for waypoint currently being edited. Added condition for drawing edit waypoint to ensure it's only changing the waypoint markers for the selected path. --- SceneManager/AITasking.cs | 4 +-- SceneManager/Object Classes/Waypoint.cs | 35 +++++++------------------ 2 files changed, 12 insertions(+), 27 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 281b1b2..77e06a1 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -77,11 +77,11 @@ namespace SceneManager Logger.Log($"{vehicle.Model.Name} is driving to waypoint {waypoints[nextWaypoint].Number}"); if (waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) { - collectedVehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)17040299, acceptedDistance); + driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)17040299, acceptedDistance); } else { - collectedVehicle.Driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263075, acceptedDistance); + driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263075, acceptedDistance); } LoopWhileDrivingToWaypoint(nextWaypoint, acceptedDistance); diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 6f367f5..d473333 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -150,56 +150,41 @@ namespace SceneManager { while (SettingsMenu.threeDWaypoints.Checked && EnableWaypointMarker && Path.Waypoints.Contains(this)) { - if (EditWaypointMenu.editWaypointMenu.Visible && EditWaypointMenu.editWaypoint.Value == Number) + if (EditWaypointMenu.editWaypointMenu.Visible && PathMainMenu.editPath.Value == Path.Number && EditWaypointMenu.editWaypoint.Value == Number) { if (EditWaypointMenu.collectorWaypoint.Checked) { if (EditWaypointMenu.updateWaypointPosition.Checked) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); - } - else - { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, 1f, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, 1f, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, 1f, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, 1f, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); } + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, 2f, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, 2f, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); } else if (EditWaypointMenu.changeWaypointType.SelectedItem == "Stop") { if (EditWaypointMenu.updateWaypointPosition.Checked) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); } - else - { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); - } - + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 2f, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); } else { if (EditWaypointMenu.updateWaypointPosition.Checked) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); } - else - { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); - } + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 2f, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); } } else if ((Path.State == State.Finished && MenuManager.menuPool.IsAnyMenuOpen()) || (Path.State == State.Creating && PathCreationMenu.pathCreationMenu.Visible)) { - if (IsCollector && CollectorRadius > 0) + if (IsCollector) { Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, CollectorRadius * 2, CollectorRadius * 2, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); - if (SpeedZoneRadius > 0) - { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, SpeedZoneRadius * 2, SpeedZoneRadius * 2, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); - } + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, SpeedZoneRadius * 2, SpeedZoneRadius * 2, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); } else if (DrivingFlag == VehicleDrivingFlags.StopAtDestination) { @@ -218,7 +203,7 @@ namespace SceneManager internal void EnableBlip() { - if(!PathMainMenu.GetPaths().Where(p => p == Path).First().IsEnabled) + if(!PathMainMenu.paths.Where(p => p == Path).First().IsEnabled) { Blip.Alpha = 0.5f; CollectorRadiusBlip.Alpha = 0.25f; From 53caddcc44af27ea722feb908cad821754aa9c56 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 17 Sep 2020 16:11:08 -0600 Subject: [PATCH 195/276] Added null check for removing nearest barrier --- SceneManager/Menus/BarrierMenu.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index 87eec52..a682fac 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -245,9 +245,12 @@ namespace SceneManager barriers.RemoveAt(barriers.Count - 1); break; case 1: - barriers = barriers.OrderBy(b => b.Object.DistanceTo2D(Game.LocalPlayer.Character)).ToList(); - barriers[0].Object.Delete(); - barriers.RemoveAt(0); + var nearestBarrier = barriers.OrderBy(b => b.Object.DistanceTo2D(Game.LocalPlayer.Character)).FirstOrDefault(); + if(nearestBarrier != null) + { + nearestBarrier.Object.Delete(); + barriers.Remove(nearestBarrier); + } break; case 2: foreach (Barrier b in barriers.Where(b => b.Object)) From 454918f011cab1940f6b86bd74ada112fb4e8ed6 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 17 Sep 2020 16:11:19 -0600 Subject: [PATCH 196/276] Changed alpha of all markers to 100 --- SceneManager/Object Classes/Waypoint.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index d473333..aa622cf 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -183,16 +183,16 @@ namespace SceneManager { if (IsCollector) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, CollectorRadius * 2, CollectorRadius * 2, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, SpeedZoneRadius * 2, SpeedZoneRadius * 2, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, CollectorRadius * 2, CollectorRadius * 2, 1f, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, SpeedZoneRadius * 2, SpeedZoneRadius * 2, 1f, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); } else if (DrivingFlag == VehicleDrivingFlags.StopAtDestination) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); } else { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); } } From ca6a272276e883cc7d100c5b97bc674bd33e78aa Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 17 Sep 2020 16:12:12 -0600 Subject: [PATCH 197/276] Added WaitForCompletion to VehicleManeuver.GoForwardWithCustomSteeringAngle and cleared tasks afterwards to try and fix vehicles rarely getting stuck with this task. --- SceneManager/AITasking.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 77e06a1..83db7cd 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -100,13 +100,14 @@ namespace SceneManager { return; } - collectedVehicle.Driver.Tasks.PerformDrivingManeuver(collectedVehicle.Vehicle, VehicleManeuver.GoForwardWithCustomSteeringAngle, 3); + driver.Tasks.PerformDrivingManeuver(collectedVehicle.Vehicle, VehicleManeuver.GoForwardWithCustomSteeringAngle, 3).WaitForCompletion(); + driver.Tasks.Clear(); } } void LoopWhileDrivingToWaypoint(int nextWaypoint, float acceptedDistance) { - while (VehicleAndDriverNullChecks(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && waypoints.ElementAtOrDefault(nextWaypoint) != null && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position) > acceptedDistance) + while (VehicleAndDriverNullChecks(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && waypoints.ElementAtOrDefault(nextWaypoint) != null && vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position) > acceptedDistance) { //Logger.Log($"Looping while {collectedVehicle.Vehicle.Model.Name} drives to waypoint {waypoints[nextWaypoint].Number} ({collectedVehicle.Vehicle.DistanceTo2D(waypoints[nextWaypoint].Position)}m away from collector radius {waypoints[nextWaypoint].CollectorRadius})"); //Logger.Log($"Distance of front of vehicle to waypoint: {collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position)}"); From 91e154a86668e91637346abe52931a4b36d75968 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 20 Sep 2020 12:52:32 -0600 Subject: [PATCH 198/276] Refactored to allow barriers to be respawned if they were deleted outside of the plugin --- SceneManager/Menus/BarrierMenu.cs | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index a682fac..8a0de4c 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -179,24 +179,25 @@ namespace SceneManager { RemoveBarrier(); } - + if (selectedItem == resetBarriers) { - var currentBarriers = barriers.Where(b => b.Object && b.Object.Model.Name != "0xa2c44e80").ToList(); - foreach (Barrier oldBarrier in currentBarriers) + var currentBarriers = barriers.Where(b => b.Model.Name != "0xa2c44e80").ToList(); // 0xa2c44e80 is the flare weapon hash + foreach (Barrier barrier in currentBarriers) { - if (oldBarrier.Object) - { - var newBarrier = new Rage.Object(oldBarrier.Object.Model, oldBarrier.Position, oldBarrier.Rotation); - newBarrier.SetPositionWithSnap(oldBarrier.Position); - Rage.Native.NativeFunction.Natives.SET_ENTITY_DYNAMIC(newBarrier, true); - newBarrier.IsPositionFrozen = false; - Rage.Native.NativeFunction.Natives.SET_DISABLE_FRAG_DAMAGE(newBarrier, true); - barriers.Add(new Barrier(newBarrier, newBarrier.Position, newBarrier.Heading)); + var newBarrier = new Rage.Object(barrier.Model, barrier.Position, barrier.Rotation); + newBarrier.SetPositionWithSnap(barrier.Position); + Rage.Native.NativeFunction.Natives.SET_ENTITY_DYNAMIC(newBarrier, true); + newBarrier.IsPositionFrozen = false; + Rage.Native.NativeFunction.Natives.SET_DISABLE_FRAG_DAMAGE(newBarrier, true); + barriers.Add(new Barrier(newBarrier, newBarrier.Position, newBarrier.Heading)); - oldBarrier.Object.Delete(); - barriers.Remove(oldBarrier); + + if (barrier.Object) + { + barrier.Object.Delete(); } + barriers.Remove(barrier); } currentBarriers.Clear(); } From 561b8f3a2194782994ea67e00bdaa7e25b9d1250 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 20 Sep 2020 12:53:16 -0600 Subject: [PATCH 199/276] Fixed waypoints not updating correctly when adding a new collector waypoint --- SceneManager/Menus/EditWaypointMenu.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 073915f..2a8691a 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -104,7 +104,9 @@ namespace SceneManager changeWaypointSpeed.Value = (int)MathHelper.ConvertMetersPerSecondToMilesPerHour(currentWaypoint.Speed); collectorWaypoint.Checked = currentWaypoint.IsCollector; changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; + changeCollectorRadius.Value = (int)currentWaypoint.CollectorRadius; changeSpeedZoneRadius.Enabled = collectorWaypoint.Checked ? true : false; + changeSpeedZoneRadius.Value = (int)currentWaypoint.SpeedZoneRadius; updateWaypointPosition.Checked = false; } @@ -170,7 +172,7 @@ namespace SceneManager if (collectorWaypoint.Checked) { - currentPath.Waypoints.Add(new Waypoint(currentPath, currentWaypoint.Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value)); + currentPath.Waypoints.Add(new Waypoint(currentPath, currentPath.Waypoints.Last().Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value)); } else { @@ -183,6 +185,7 @@ namespace SceneManager editWaypoint.Index = editWaypoint.OptionCount - 1; editWaypointMenu.RefreshIndex(); updateWaypointPosition.Checked = false; + Logger.Log($"New waypoint (#{currentWaypoint.Number + 1}) added."); } if (selectedItem == removeWaypoint) From 5fe643ea4248f99e4a687901e603fe8428e6f140 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 20 Sep 2020 12:54:09 -0600 Subject: [PATCH 200/276] Refactored dismiss driver options. "From position" is replaced with "From world" --- SceneManager/Menus/PathMainMenu.cs | 89 ++++++++---------------------- 1 file changed, 24 insertions(+), 65 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index 3769c1b..f58606d 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -8,10 +8,17 @@ using RAGENativeUI.Elements; namespace SceneManager { + public enum DismissOption + { + FromPath = 0, + FromWaypoint = 1, + FromWorld = 2 + } + static class PathMainMenu { internal static List paths = new List() { }; - private static List dismissOptions = new List() { "From path", "From waypoint", "From position" }; + private static List dismissOptions = new List() { "From path", "From waypoint", "From world" }; internal static UIMenu pathMainMenu = new UIMenu("Scene Manager", "~o~Path Manager Main Menu"); internal static UIMenuItem createNewPath; @@ -19,7 +26,7 @@ namespace SceneManager internal static UIMenuNumericScrollerItem editPath; internal static UIMenuListScrollerItem directOptions = new UIMenuListScrollerItem("Direct driver to path's", "", new[] { "First waypoint", "Nearest waypoint" }); internal static UIMenuNumericScrollerItem directDriver; - internal static UIMenuListScrollerItem dismissDriver = new UIMenuListScrollerItem("Dismiss nearest driver", $"~b~From path: ~w~AI will be released from the path{Environment.NewLine}~b~From waypoint: ~w~AI will skip their current waypoint task{Environment.NewLine}~b~From position: ~w~AI will be released from current position. This can be used for stuck vehicles, and is the default behavior for vehicles not collected by a path.", dismissOptions); + internal static UIMenuListScrollerItem dismissDriver = new UIMenuListScrollerItem("Dismiss nearest driver", $"~b~From path: ~w~AI will be released from the path{Environment.NewLine}~b~From waypoint: ~w~AI will skip their current waypoint task{Environment.NewLine}~b~From world: ~w~AI will be removed from the world.", dismissOptions); internal static UIMenuCheckboxItem disableAllPaths = new UIMenuCheckboxItem("Disable All Paths", false); internal enum Delete @@ -106,6 +113,10 @@ namespace SceneManager Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(cv.Vehicle, 1f, 1, true); } cv.StoppedAtWaypoint = false; + if (cv.Driver.GetAttachedBlip()) + { + cv.Driver.GetAttachedBlip().Delete(); + } cv.Driver.Tasks.Clear(); cv.Driver.Dismiss(); cv.Vehicle.IsSirenOn = false; @@ -134,7 +145,7 @@ namespace SceneManager } } - Game.LogTrivial($"Clearing path.WaypointData"); + Game.LogTrivial($"Clearing path waypoints"); path.Waypoints.Clear(); // Manipulating the menu to reflect specific paths being deleted @@ -231,7 +242,9 @@ namespace SceneManager if (collectedVehicle.StoppedAtWaypoint) { collectedVehicle.StoppedAtWaypoint = false; + Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, 0f, 1, true); } + collectedVehicle.Directed = true; if (directOptions.SelectedItem == "First waypoint") { @@ -259,69 +272,15 @@ namespace SceneManager if (nearbyVehicle) { var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle).FirstOrDefault(); - switch (dismissDriver.Index) + if(collectedVehicle != null) { - case 0: - Game.LogTrivial($"Dismiss from path"); - if (collectedVehicle != null) - { - collectedVehicle.Dismiss(); - } - else - { - goto case 2; - } - break; - - case 1: - Game.LogTrivial($"Dismiss from waypoint"); - if (collectedVehicle != null) - { - if (collectedVehicle.StoppedAtWaypoint) - { - collectedVehicle.StoppedAtWaypoint = false; - } - else - { - collectedVehicle.SkipWaypoint = true; - collectedVehicle.Driver.Tasks.Clear(); - } - - if (collectedVehicle.CurrentWaypoint.Number == collectedVehicle.Path.Waypoints.Count && !collectedVehicle.StoppedAtWaypoint) - { - Game.LogTrivial($"Dismissed driver of {collectedVehicle.Vehicle.Model.Name} from final waypoint and ultimately the path"); - } - else - { - Game.LogTrivial($"Dismissed driver of {collectedVehicle.Vehicle.Model.Name} from current waypoint task"); - } - } - else - { - goto case 2; - } - break; - - case 2: - Game.LogTrivial($"Dismiss from position"); - if(collectedVehicle != null) - { - collectedVehicle.StoppedAtWaypoint = false; - Game.LogTrivial($"Dismissed driver of {nearbyVehicle.Model.Name} from position (in collection)"); - } - else - { - if(nearbyVehicle.Speed < 1f) - { - Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(nearbyVehicle, 3f, 1, true); - } - nearbyVehicle.Driver.Tasks.Clear(); - nearbyVehicle.IsSirenOn = false; - nearbyVehicle.IsSirenSilent = true; - nearbyVehicle.Driver.Dismiss(); - Game.LogTrivial($"Dismissed driver of {nearbyVehicle.Model.Name} from position (was not in collection)"); - } - break; + collectedVehicle.Dismiss((DismissOption)dismissDriver.Index); + } + else if(dismissDriver.Index == (int)DismissOption.FromWorld) + { + Game.LogTrivial($"Dismissed {nearbyVehicle.Model.Name} from the world"); + nearbyVehicle.Driver.Delete(); + nearbyVehicle.Delete(); } } } From 4b4f596024a809919f3a92cfb69ab5442b303ee6 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 20 Sep 2020 12:55:07 -0600 Subject: [PATCH 201/276] Added Model property and set all properties to get only --- SceneManager/Object Classes/Barrier.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/SceneManager/Object Classes/Barrier.cs b/SceneManager/Object Classes/Barrier.cs index ec5e390..d894caf 100644 --- a/SceneManager/Object Classes/Barrier.cs +++ b/SceneManager/Object Classes/Barrier.cs @@ -5,13 +5,15 @@ namespace SceneManager { class Barrier { - internal Rage.Object Object { get; set; } - internal Vector3 Position { get; set; } - internal float Rotation { get; set; } + 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; } From 64587347d709258b4e7ad8492956df4e6de32799 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 20 Sep 2020 12:56:06 -0600 Subject: [PATCH 202/276] Added Directed property and set all initial bool properties to false. Refactored Dismiss function. --- .../Object Classes/CollectedVehicle.cs | 98 ++++++++++++------- 1 file changed, 63 insertions(+), 35 deletions(-) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index a7526d3..825edfa 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -10,9 +10,10 @@ namespace SceneManager internal Path Path { get; set; } internal Waypoint CurrentWaypoint { get; set; } internal Waypoint NextWaypoint { get; private set; } - internal bool StoppedAtWaypoint { get; set; } - internal bool Dismissed { get; set; } - internal bool SkipWaypoint { get; set; } + internal bool StoppedAtWaypoint { get; set; } = false; + internal bool Dismissed { get; set; } = false; + internal bool Directed { get; set; } = false; + internal bool SkipWaypoint { get; set; } = false; internal CollectedVehicle(Vehicle vehicle, Path path, Waypoint currentWaypoint) { @@ -29,49 +30,76 @@ namespace SceneManager Path = path; } - internal void Dismiss() + internal void Dismiss(DismissOption dismissOption = DismissOption.FromPath) { - GameFiber.StartNew(() => + if (!Vehicle || !Driver) { - if (!Vehicle || !Driver) - { - return; - } - Dismissed = true; - StoppedAtWaypoint = false; + return; + } - Driver.Tasks.Clear(); - Driver.Tasks.PerformDrivingManeuver(Vehicle, VehicleManeuver.GoForwardWithCustomSteeringAngle, 3); + if (dismissOption == DismissOption.FromWorld) + { + Game.LogTrivial($"Dismissed {Vehicle.Model.Name} from the world"); + Vehicle.Driver.Delete(); + Vehicle.Delete(); + return; + } - if (Driver.GetAttachedBlip()) + Dismissed = true; + Dismissed = false; + Driver.Tasks.Clear(); + if(StoppedAtWaypoint) + { + Logger.Log($"Unstucking stopped vehicle"); + Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(Vehicle, 0f, 1, true); + GameFiber.StartNew(() => { - Driver.GetAttachedBlip().Delete(); - } - - // check if the vehicle is near any of the path's collector waypoints - var nearestCollectorWaypoint = Path.Waypoints.Where(wp => wp.IsCollector && Vehicle.DistanceTo2D(wp.Position) <= wp.CollectorRadius * 2).FirstOrDefault(); - if (nearestCollectorWaypoint != null) - { - while (nearestCollectorWaypoint != null && Vehicle && Driver && Vehicle.DistanceTo2D(nearestCollectorWaypoint.Position) <= nearestCollectorWaypoint.CollectorRadius * 2) + while(Vehicle.Speed < 1f) { - //Game.LogTrivial($"{_vehicle.Model.Name} is too close to the collector to be fully dismissed."); GameFiber.Yield(); } - } + }); + StoppedAtWaypoint = false; + } - if (!Vehicle || !Driver) + if(dismissOption == DismissOption.FromWaypoint && CurrentWaypoint.Number != Path.Waypoints.Count) + { + Logger.Log($"Dismissed from waypoint."); + SkipWaypoint = true; + SkipWaypoint = false; + } + + if(dismissOption == DismissOption.FromWaypoint && CurrentWaypoint.Number == Path.Waypoints.Count || dismissOption == DismissOption.FromPath) + { + Logger.Log($"Dismissed from path."); + GameFiber.StartNew(() => { - return; - } + // check if the vehicle is near any of the path's collector waypoints + var nearestCollectorWaypoint = Path.Waypoints.Where(wp => wp.IsCollector && Vehicle.DistanceTo2D(wp.Position) <= wp.CollectorRadius * 2).FirstOrDefault(); + while (nearestCollectorWaypoint != null && Vehicle && Driver && Vehicle.DistanceTo2D(nearestCollectorWaypoint.Position) <= nearestCollectorWaypoint.CollectorRadius * 2) + { + //Game.LogTrivial($"{Vehicle.Model.Name} is too close to the collector to be fully dismissed."); + GameFiber.Yield(); + } - VehicleCollector.collectedVehicles.Remove(this); - Logger.Log($"{Vehicle.Model.Name} dismissed successfully."); - Driver.BlockPermanentEvents = false; - Driver.Dismiss(); - Vehicle.IsSirenOn = false; - Vehicle.IsSirenSilent = true; - Vehicle.Dismiss(); - }); + if (!Vehicle || !Driver) + { + return; + } + + VehicleCollector.collectedVehicles.Remove(this); + Logger.Log($"{Vehicle.Model.Name} dismissed successfully."); + if (Driver.GetAttachedBlip()) + { + Driver.GetAttachedBlip().Delete(); + } + Driver.BlockPermanentEvents = false; + Driver.Dismiss(); + Vehicle.IsSirenOn = false; + Vehicle.IsSirenSilent = true; + Vehicle.Dismiss(); + }); + } } } } From fb433612a33d65c8e87631225036f74edc0e084d Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 20 Sep 2020 12:57:27 -0600 Subject: [PATCH 203/276] Set default values for optional constructor parameters. Added null check to UpdateDrivingFlag method --- SceneManager/Object Classes/Waypoint.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index aa622cf..ac4fac7 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -20,7 +20,7 @@ namespace SceneManager internal bool EnableWaypointMarker { get; set; } = true; internal bool EnableEditMarker { get; set; } - internal Waypoint(Path path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector = false, float collectorRadius = 0, float speedZoneRadius = 0) + internal Waypoint(Path path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector = false, float collectorRadius = 1, float speedZoneRadius = 5) { Path = path; Number = waypointNum; @@ -61,10 +61,10 @@ namespace SceneManager { if(DrivingFlag == VehicleDrivingFlags.StopAtDestination && newDrivingFlag != VehicleDrivingFlags.StopAtDestination) { - foreach(CollectedVehicle cv in VehicleCollector.collectedVehicles.Where(cv => cv.Path == Path && cv.CurrentWaypoint == this && cv.StoppedAtWaypoint)) + foreach(CollectedVehicle cv in VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle && cv.Path == Path && cv.CurrentWaypoint == this && cv.StoppedAtWaypoint)) { Logger.Log($"Setting StoppedAtWaypoint to false for {cv.Vehicle.Model.Name}"); - cv.StoppedAtWaypoint = false; + cv.Dismiss(DismissOption.FromWaypoint); } } DrivingFlag = newDrivingFlag; From 5ad6e61973e3c027064804912515aab7f850d17c Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 20 Sep 2020 12:58:32 -0600 Subject: [PATCH 204/276] Added more null ref checks. Refactored initial task assignment to take into account whether a vehicle was Directed --- SceneManager/AITasking.cs | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 83db7cd..d1c2137 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -13,23 +13,20 @@ namespace SceneManager return; } - if (currentWaypoint != null) + if (currentWaypoint != null && collectedVehicle.Directed) { float acceptedDistance = GetAcceptedStoppingDistance(waypoints, waypoints.IndexOf(currentWaypoint)); Logger.Log($"{collectedVehicle.Vehicle.Model.Name} distance to collection waypoint: {collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position)}"); - if(collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position) > (currentWaypoint.CollectorRadius + 0.5)) - { - Logger.Log($"{collectedVehicle.Vehicle.Model.Name} is driving to waypoint {currentWaypoint.Number}"); - collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)263075, acceptedDistance); - LoopWhileDrivingToWaypoint(acceptedDistance); - } - if(currentWaypoint.DrivingFlag == VehicleDrivingFlags.StopAtDestination) - { - StopVehicleAtWaypoint(currentWaypoint, collectedVehicle); - } + Logger.Log($"{collectedVehicle.Vehicle.Model.Name} is driving to waypoint {currentWaypoint.Number}"); + collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)263075, acceptedDistance); + LoopWhileDrivingToWaypoint(acceptedDistance); } + if (currentWaypoint.DrivingFlag == VehicleDrivingFlags.StopAtDestination) + { + StopVehicleAtWaypoint(currentWaypoint, collectedVehicle); + } DriveVehicleToNextWaypoint(collectedVehicle, waypoints, currentWaypoint); if (!VehicleAndDriverNullChecks(collectedVehicle)) @@ -39,6 +36,7 @@ namespace SceneManager Logger.Log($"{collectedVehicle.Vehicle.Model.Name} all tasks complete."); if (!collectedVehicle.Dismissed) { + Logger.Log($"Dismissing {collectedVehicle.Vehicle.Model.Name}"); collectedVehicle.Dismiss(); } @@ -54,7 +52,7 @@ namespace SceneManager private static void DriveVehicleToNextWaypoint(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) { - if (!VehicleAndDriverNullChecks(collectedVehicle)) + if (!VehicleAndDriverNullChecks(collectedVehicle) || currentWaypoint == null || currentWaypoint.Path == null) { return; } @@ -72,6 +70,7 @@ namespace SceneManager if (waypoints.ElementAtOrDefault(nextWaypoint) != null && !collectedVehicle.StoppedAtWaypoint) { collectedVehicle.CurrentWaypoint = waypoints[nextWaypoint]; + Logger.Log($"{collectedVehicle.Vehicle.Model.Name} current waypoint: {collectedVehicle.CurrentWaypoint.Number}"); float acceptedDistance = GetAcceptedStoppingDistance(waypoints, nextWaypoint); Logger.Log($"{vehicle.Model.Name} is driving to waypoint {waypoints[nextWaypoint].Number}"); @@ -85,6 +84,11 @@ namespace SceneManager } LoopWhileDrivingToWaypoint(nextWaypoint, acceptedDistance); + if (!VehicleAndDriverNullChecks(collectedVehicle)) + { + return; + } + if (collectedVehicle.SkipWaypoint) { collectedVehicle.SkipWaypoint = false; @@ -101,12 +105,16 @@ namespace SceneManager return; } driver.Tasks.PerformDrivingManeuver(collectedVehicle.Vehicle, VehicleManeuver.GoForwardWithCustomSteeringAngle, 3).WaitForCompletion(); - driver.Tasks.Clear(); + if (driver) + { + driver.Tasks.Clear(); + } } } void LoopWhileDrivingToWaypoint(int nextWaypoint, float acceptedDistance) { + //Logger.Log($"Dismissed: {collectedVehicle.Dismissed} SkipWaypoint: {collectedVehicle.SkipWaypoint}"); while (VehicleAndDriverNullChecks(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && waypoints.ElementAtOrDefault(nextWaypoint) != null && vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position) > acceptedDistance) { //Logger.Log($"Looping while {collectedVehicle.Vehicle.Model.Name} drives to waypoint {waypoints[nextWaypoint].Number} ({collectedVehicle.Vehicle.DistanceTo2D(waypoints[nextWaypoint].Position)}m away from collector radius {waypoints[nextWaypoint].CollectorRadius})"); @@ -128,7 +136,7 @@ namespace SceneManager dist = (waypoints[nextWaypoint].Speed * waypoints[nextWaypoint].Speed) / (250 * 0.8f); } var acceptedDistance = MathHelper.Clamp(dist, 2, 10); - Logger.Log($"Accepted distance: {acceptedDistance}"); + //Logger.Log($"Accepted distance: {acceptedDistance}"); return acceptedDistance; } @@ -188,14 +196,11 @@ namespace SceneManager Logger.Log($"{collectedVehicle.Vehicle.Model.Name} stopping at waypoint."); Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, stoppingDistance, -1, true); collectedVehicle.StoppedAtWaypoint = true; - collectedVehicle.Driver.Tasks.Clear(); - while (currentWaypoint != null && VehicleAndDriverNullChecks(collectedVehicle) && collectedVehicle.StoppedAtWaypoint) { GameFiber.Yield(); } - Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, 1f, 1, true); } } } From 077854ffc1f22912b136ca0f52af2c0a1023c4ff Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 20 Sep 2020 12:59:17 -0600 Subject: [PATCH 205/276] Slightly increased distance check for getting vehicles near collector waypoints --- SceneManager/VehicleCollector.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index 9001519..f263132 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -34,7 +34,7 @@ namespace SceneManager break; } - Logger.Log($"Vehicle: {vehicle.Model.Name}, Waypoint collector radius: {waypoint.CollectorRadius}, Distance to waypoint: {vehicle.DistanceTo2D(waypoint.Position)}"); + //Logger.Log($"Vehicle: {vehicle.Model.Name}, Waypoint collector radius: {waypoint.CollectorRadius}, Distance to waypoint: {vehicle.DistanceTo2D(waypoint.Position)}"); var collectedVehicle = collectedVehicles.Where(cv => cv.Vehicle == vehicle).FirstOrDefault(); if(collectedVehicle == null) @@ -49,7 +49,7 @@ namespace SceneManager Vehicle[] GetNearbyVehiclesForCollection(Vector3 collectorWaypointPosition, float collectorRadius) { - return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorWaypointPosition) <= collectorRadius && Math.Abs(collectorWaypointPosition.Z - v.Position.Z) < 3 && v.IsValidForCollection() select v).ToArray(); + return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorWaypointPosition) <= collectorRadius*1.5 && Math.Abs(collectorWaypointPosition.Z - v.Position.Z) < 3 && v.IsValidForCollection() select v).ToArray(); } } From 58a09087eecb73f0d8edec9810e51222beeb65ed Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 20 Sep 2020 13:17:37 -0600 Subject: [PATCH 206/276] Fixed collector radius blip updating position to player's position when waypoint's position is not updated --- SceneManager/Object Classes/Waypoint.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index ac4fac7..da1882b 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -93,7 +93,6 @@ namespace SceneManager Blip.Color = Color.Blue; if (CollectorRadiusBlip) { - CollectorRadiusBlip.Position = Game.LocalPlayer.Character.Position; CollectorRadiusBlip.Alpha = 0.5f; CollectorRadiusBlip.Scale = collectorRadius * 0.5f; } @@ -130,6 +129,7 @@ namespace SceneManager void UpdateWaypointBlipPosition() { Blip.Position = Game.LocalPlayer.Character.Position; + CollectorRadiusBlip.Position = Game.LocalPlayer.Character.Position; } } From 55af040a6b804e1a7479d451c9959b7cd9609301 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 21 Sep 2020 11:29:26 -0600 Subject: [PATCH 207/276] Increased maximum waypoint speed from 80 to 100 --- SceneManager/Menus/EditWaypointMenu.cs | 2 +- SceneManager/Menus/PathCreationMenu.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 2a8691a..1333903 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -49,7 +49,7 @@ namespace SceneManager editWaypointMenu.AddItem(changeWaypointType); changeWaypointType.Index = Array.IndexOf(drivingFlags, currentWaypoint.DrivingFlag); - editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 80, 5)); + editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 100, 5)); changeWaypointSpeed.Value = (int)MathHelper.ConvertMetersPerSecondToMilesPerHour(currentWaypoint.Speed); editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector", currentWaypoint.IsCollector, "If this waypoint will collect vehicles to follow the path")); diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 170e8c8..8d220c8 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -31,7 +31,7 @@ namespace SceneManager { pathCreationMenu.AddItem(waypointType); - pathCreationMenu.AddItem(waypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 80, 5)); + pathCreationMenu.AddItem(waypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 100, 5)); waypointSpeed.Index = 0; pathCreationMenu.AddItem(collectorWaypoint); @@ -84,7 +84,7 @@ namespace SceneManager } else if(anyPathsExist && !PathMainMenu.paths.Any(p => p != null && p.State == State.Creating)) { - AddNewPathToPathsCollection(PathMainMenu.paths, PathMainMenu.paths.IndexOf(PathMainMenu.paths.Where(p => p.State == State.Finished).First()) + 1); + AddNewPathToPathsCollection(PathMainMenu.paths, PathMainMenu.paths.IndexOf(PathMainMenu.paths.Where(p => p.State == State.Finished).Last()) + 1); } var firstNonNullPath = PathMainMenu.paths.Where(p => p != null && p.State == State.Creating).First(); From 03d18f621ff7a0479e759383a003c31c83789604 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 21 Sep 2020 11:30:21 -0600 Subject: [PATCH 208/276] Added functions to update path blips and path numbers when a single path is deleted. --- SceneManager/Menus/PathMainMenu.cs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index f58606d..ba94194 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -52,6 +52,7 @@ namespace SceneManager pathMainMenu.AddItem(createNewPath = new UIMenuItem("Create New Path")); createNewPath.ForeColor = Color.Gold; pathMainMenu.AddItem(editPath = new UIMenuNumericScrollerItem("Edit Path", "", 1, paths.Count, 1)); + editPath.Index = 0; editPath.ForeColor = Color.Gold; pathMainMenu.AddItem(disableAllPaths); disableAllPaths.Enabled = true; @@ -152,6 +153,8 @@ namespace SceneManager if (pathsToDelete == Delete.Single) { paths.Remove(path); + UpdatePathNumbers(); + UpdatePathBlips(); BuildPathMenu(); pathMainMenu.Visible = true; Game.LogTrivial($"Path {path.Number} deleted successfully."); @@ -162,6 +165,27 @@ namespace SceneManager EditPathMenu.disablePath.Enabled = true; } + private static void UpdatePathBlips() + { + foreach (Path p in paths) + { + foreach (Waypoint waypoint in p.Waypoints) + { + var blipColor = waypoint.Blip.Color; + waypoint.Blip.Sprite = (BlipSprite)paths.IndexOf(p) + 17; + waypoint.Blip.Color = blipColor; + } + } + } + + private static void UpdatePathNumbers() + { + for (int i = 0; i < paths.Count; i++) + { + paths[i].Number = i + 1; + } + } + private static void PathMenu_OnItemSelected(UIMenu sender, UIMenuItem selectedItem, int index) { if (selectedItem == createNewPath) @@ -268,7 +292,7 @@ namespace SceneManager if (selectedItem == dismissDriver) { - var nearbyVehicle = Game.LocalPlayer.Character.GetNearbyVehicles(1).Where(v => v != Game.LocalPlayer.Character.CurrentVehicle && v.VehicleAndDriverValid()).SingleOrDefault(); + var nearbyVehicle = Game.LocalPlayer.Character.GetNearbyVehicles(16).Where(v => v != Game.LocalPlayer.Character.CurrentVehicle && v.VehicleAndDriverValid()).FirstOrDefault(); if (nearbyVehicle) { var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle).FirstOrDefault(); From b3ca91e7a760f7e5bd4dfa111ae6fe7842dc0275 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 21 Sep 2020 11:31:16 -0600 Subject: [PATCH 209/276] Fixed collector radius blip changing size on update when the player did not change the size in the menu. Added nullref checks for blips in updating the blip position. --- SceneManager/Object Classes/Waypoint.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index da1882b..30a2ff5 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -94,7 +94,7 @@ namespace SceneManager if (CollectorRadiusBlip) { CollectorRadiusBlip.Alpha = 0.5f; - CollectorRadiusBlip.Scale = collectorRadius * 0.5f; + CollectorRadiusBlip.Scale = collectorRadius; } else { @@ -128,8 +128,14 @@ namespace SceneManager void UpdateWaypointBlipPosition() { - Blip.Position = Game.LocalPlayer.Character.Position; - CollectorRadiusBlip.Position = Game.LocalPlayer.Character.Position; + if (Blip) + { + Blip.Position = Game.LocalPlayer.Character.Position; + } + if (CollectorRadiusBlip) + { + CollectorRadiusBlip.Position = Game.LocalPlayer.Character.Position; + } } } From 77bf3750bb6fc039ed024635c32048ccf5b9dcae Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 21 Sep 2020 11:32:08 -0600 Subject: [PATCH 210/276] Added condition for IsValidForCollection that the vehicle's engine is on. Added loop checking for vehicle driver after a driver has to be created --- SceneManager/VehicleCollector.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index f263132..0c1dc70 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -63,7 +63,7 @@ namespace SceneManager private static bool IsValidForCollection(this Vehicle v) { - if(v && v.Speed > 1 && v.IsOnAllWheels && v != Game.LocalPlayer.Character.CurrentVehicle && v != Game.LocalPlayer.Character.LastVehicle && (v.IsCar || v.IsBike || v.IsBicycle || v.IsQuadBike || (v.HasSiren && !v.IsSirenOn)) && !collectedVehicles.Any(cv => cv.Vehicle == v)) + if(v && v.Speed > 1 && v.IsOnAllWheels && v.IsEngineOn && v != Game.LocalPlayer.Character.CurrentVehicle && v != Game.LocalPlayer.Character.LastVehicle && (v.IsCar || v.IsBike || v.IsBicycle || v.IsQuadBike || (v.HasSiren && !v.IsSirenOn)) && !collectedVehicles.Any(cv => cv.Vehicle == v)) { if(v.HasDriver && !v.Driver.IsAlive) { @@ -72,6 +72,10 @@ namespace SceneManager if (!v.HasDriver) { v.CreateRandomDriver(); + while (!v.HasDriver) + { + GameFiber.Yield(); + } var driverBlip = v.Driver.AttachBlip(); driverBlip.Color = Color.Green; driverBlip.Scale = 0.25f; From 64c7afed1497a572c8c219bd8c9f54b89623c424 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 22 Sep 2020 14:24:07 -0600 Subject: [PATCH 211/276] Added loop to ensure driver is deleted before the vehicle is deleted upon dismiss from world --- SceneManager/Menus/PathMainMenu.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index ba94194..e4623b8 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -303,7 +303,16 @@ namespace SceneManager else if(dismissDriver.Index == (int)DismissOption.FromWorld) { Game.LogTrivial($"Dismissed {nearbyVehicle.Model.Name} from the world"); - nearbyVehicle.Driver.Delete(); + if (nearbyVehicle.HasDriver) + { + while (nearbyVehicle.Driver) + { + nearbyVehicle.Driver.Dismiss(); + nearbyVehicle.Driver.Delete(); + GameFiber.Yield(); + } + } + nearbyVehicle.Delete(); } } From d684d57cb2cc8ffb443763cd6bf67a749c661323 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 22 Sep 2020 14:24:59 -0600 Subject: [PATCH 212/276] Added loop to ensure driver is deleted before the vehicle upon dismiss from world --- .../Object Classes/CollectedVehicle.cs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index 825edfa..c3b84cb 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -40,13 +40,19 @@ namespace SceneManager if (dismissOption == DismissOption.FromWorld) { Game.LogTrivial($"Dismissed {Vehicle.Model.Name} from the world"); - Vehicle.Driver.Delete(); + if (Vehicle.HasDriver) + { + while (Vehicle.Driver) + { + Vehicle.Driver.Dismiss(); + Vehicle.Driver.Delete(); + GameFiber.Yield(); + } + } Vehicle.Delete(); return; } - Dismissed = true; - Dismissed = false; Driver.Tasks.Clear(); if(StoppedAtWaypoint) { @@ -66,12 +72,17 @@ namespace SceneManager { Logger.Log($"Dismissed from waypoint."); SkipWaypoint = true; - SkipWaypoint = false; + GameFiber.StartNew(() => + { + GameFiber.Sleep(100); + SkipWaypoint = false; + }); } if(dismissOption == DismissOption.FromWaypoint && CurrentWaypoint.Number == Path.Waypoints.Count || dismissOption == DismissOption.FromPath) { Logger.Log($"Dismissed from path."); + Dismissed = true; GameFiber.StartNew(() => { // check if the vehicle is near any of the path's collector waypoints From 139a1a4163467df7e6e95ead2de94e7cf89beb61 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 22 Sep 2020 14:25:25 -0600 Subject: [PATCH 213/276] Added collectorRadius to new blip parameter when waypoint is updated to collector --- SceneManager/Object Classes/Waypoint.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 30a2ff5..bc01f8a 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -98,7 +98,7 @@ namespace SceneManager } else { - CollectorRadiusBlip = new Blip(Blip.Position) + CollectorRadiusBlip = new Blip(Blip.Position, collectorRadius) { Color = Blip.Color, Alpha = 0.5f From c7ef4ab52dd478f383f729671a365babdfd14953 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 22 Sep 2020 14:26:28 -0600 Subject: [PATCH 214/276] Added guard clauses to return/continue if collected vehicle is dismissed/skipping waypoint. Added check in LoopWhileDrivingToWaypoint to ensure vehicles are driving to the correct position if a waypoint position was updated. --- SceneManager/AITasking.cs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index d1c2137..9dac846 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -62,10 +62,14 @@ namespace SceneManager for (int nextWaypoint = currentWaypoint.Number; nextWaypoint < waypoints.Count; nextWaypoint++) { - if (!VehicleAndDriverNullChecks(waypoints, nextWaypoint, collectedVehicle)) + if (!VehicleAndDriverNullChecks(waypoints, nextWaypoint, collectedVehicle) || collectedVehicle.Dismissed) { return; } + if (collectedVehicle.SkipWaypoint) + { + continue; + } if (waypoints.ElementAtOrDefault(nextWaypoint) != null && !collectedVehicle.StoppedAtWaypoint) { @@ -114,12 +118,20 @@ namespace SceneManager void LoopWhileDrivingToWaypoint(int nextWaypoint, float acceptedDistance) { - //Logger.Log($"Dismissed: {collectedVehicle.Dismissed} SkipWaypoint: {collectedVehicle.SkipWaypoint}"); while (VehicleAndDriverNullChecks(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && waypoints.ElementAtOrDefault(nextWaypoint) != null && vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position) > acceptedDistance) { + //Logger.Log($"Dismissed: {collectedVehicle.Dismissed} SkipWaypoint: {collectedVehicle.SkipWaypoint}"); + if (waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) + { + driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)17040299, acceptedDistance); + } + else + { + driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263075, acceptedDistance); + } //Logger.Log($"Looping while {collectedVehicle.Vehicle.Model.Name} drives to waypoint {waypoints[nextWaypoint].Number} ({collectedVehicle.Vehicle.DistanceTo2D(waypoints[nextWaypoint].Position)}m away from collector radius {waypoints[nextWaypoint].CollectorRadius})"); //Logger.Log($"Distance of front of vehicle to waypoint: {collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position)}"); - GameFiber.Yield(); + GameFiber.Sleep(100); } } } From 7688768d9badf09a44c2a2d54717eb5d4f2fde17 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 22 Sep 2020 14:40:24 -0600 Subject: [PATCH 215/276] Updated check when deleting vehicle to include all occupants, not just driver --- SceneManager/Menus/PathMainMenu.cs | 10 +++++----- SceneManager/Object Classes/CollectedVehicle.cs | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index e4623b8..1555a7c 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -303,14 +303,14 @@ namespace SceneManager else if(dismissDriver.Index == (int)DismissOption.FromWorld) { Game.LogTrivial($"Dismissed {nearbyVehicle.Model.Name} from the world"); - if (nearbyVehicle.HasDriver) + while (nearbyVehicle.HasOccupants) { - while (nearbyVehicle.Driver) + foreach (Ped occupant in nearbyVehicle.Occupants) { - nearbyVehicle.Driver.Dismiss(); - nearbyVehicle.Driver.Delete(); - GameFiber.Yield(); + occupant.Dismiss(); + occupant.Delete(); } + GameFiber.Yield(); } nearbyVehicle.Delete(); diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index c3b84cb..35b8300 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -40,14 +40,14 @@ namespace SceneManager if (dismissOption == DismissOption.FromWorld) { Game.LogTrivial($"Dismissed {Vehicle.Model.Name} from the world"); - if (Vehicle.HasDriver) + while (Vehicle.HasOccupants) { - while (Vehicle.Driver) + foreach(Ped occupant in Vehicle.Occupants) { - Vehicle.Driver.Dismiss(); - Vehicle.Driver.Delete(); - GameFiber.Yield(); + occupant.Dismiss(); + occupant.Delete(); } + GameFiber.Yield(); } Vehicle.Delete(); return; From 29221024095e33e073b53a2f699709f190705a5f Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 22 Sep 2020 14:49:54 -0600 Subject: [PATCH 216/276] Added function to loop while the path exists checking for vehicles which need to be dismissed for cleanup --- SceneManager/VehicleCollector.cs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index 0c1dc70..ed1b2a7 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -15,6 +15,8 @@ namespace SceneManager internal static void StartCollectingAtWaypoint(List paths, Path path, Waypoint waypoint) { + LoopForVehiclesToBeDismissed(paths, path); + while (paths.Contains(path) && path.Waypoints.Contains(waypoint)) { if (path.IsEnabled && waypoint.IsCollector) @@ -25,6 +27,29 @@ namespace SceneManager } } + private static void LoopForVehiclesToBeDismissed(List paths, Path path) + { + GameFiber.StartNew(() => + { + while (paths.Contains(path)) + { + Logger.Log($"Cleaning up bad collected vehicles"); + foreach (CollectedVehicle cv in collectedVehicles) + { + if (!cv.Vehicle.IsDriveable || cv.Vehicle.IsUpsideDown || !cv.Vehicle.HasDriver) + { + if (cv.Vehicle.HasDriver) + { + cv.Vehicle.Driver.Dismiss(); + } + cv.Vehicle.Dismiss(); + } + } + GameFiber.Sleep(10000); + } + }); + } + private static void LoopForNearbyValidVehicles(Path path, Waypoint waypoint) { foreach (Vehicle vehicle in GetNearbyVehiclesForCollection(waypoint.Position, waypoint.CollectorRadius)) From bbdcab048f584db425baa2244e0acf3e80f86ecf Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Tue, 22 Sep 2020 14:53:28 -0600 Subject: [PATCH 217/276] Changed dismissal loop timer to 1 minute --- SceneManager/VehicleCollector.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index ed1b2a7..0ae8671 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -33,7 +33,7 @@ namespace SceneManager { while (paths.Contains(path)) { - Logger.Log($"Cleaning up bad collected vehicles"); + Logger.Log($"Dismissing unused vehicles for cleanup"); foreach (CollectedVehicle cv in collectedVehicles) { if (!cv.Vehicle.IsDriveable || cv.Vehicle.IsUpsideDown || !cv.Vehicle.HasDriver) @@ -45,7 +45,7 @@ namespace SceneManager cv.Vehicle.Dismiss(); } } - GameFiber.Sleep(10000); + GameFiber.Sleep(60000); } }); } From 6247294039d5b7ace1590c734c522310d6e68c43 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Wed, 23 Sep 2020 05:21:11 -0600 Subject: [PATCH 218/276] Added check in vehicle dismissal loop for valid vehicle. Added code to remove dismissed vehicles from collection. --- SceneManager/VehicleCollector.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index 0ae8671..d771cdd 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -34,7 +34,7 @@ namespace SceneManager while (paths.Contains(path)) { Logger.Log($"Dismissing unused vehicles for cleanup"); - foreach (CollectedVehicle cv in collectedVehicles) + foreach (CollectedVehicle cv in collectedVehicles.Where(cv => cv.Vehicle)) { if (!cv.Vehicle.IsDriveable || cv.Vehicle.IsUpsideDown || !cv.Vehicle.HasDriver) { @@ -45,6 +45,8 @@ namespace SceneManager cv.Vehicle.Dismiss(); } } + + collectedVehicles.RemoveAll(cv => !cv.Vehicle); GameFiber.Sleep(60000); } }); From da1dd590f70878e2ab318491a56958133d1acc7a Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 24 Sep 2020 04:12:44 -0600 Subject: [PATCH 219/276] Added null check for vehicle in game fiber loop following unstucking a vehicle --- SceneManager/Object Classes/CollectedVehicle.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index 35b8300..c09de93 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -60,7 +60,7 @@ namespace SceneManager Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(Vehicle, 0f, 1, true); GameFiber.StartNew(() => { - while(Vehicle.Speed < 1f) + while(Vehicle && Vehicle.Speed < 1f) { GameFiber.Yield(); } From eba20888e079e5c89c4ff945e0588c4c5097ef64 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 24 Sep 2020 04:13:35 -0600 Subject: [PATCH 220/276] Renamed VehicleAndDriverNullChecks to VehicleAndDriverAreValid for better readability. --- SceneManager/AITasking.cs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 9dac846..a7fb5b0 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -8,7 +8,7 @@ namespace SceneManager { internal static void AssignWaypointTasks(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) { - if (!VehicleAndDriverNullChecks(collectedVehicle)) + if (!VehicleAndDriverAreValid(collectedVehicle)) { return; } @@ -29,7 +29,7 @@ namespace SceneManager } DriveVehicleToNextWaypoint(collectedVehicle, waypoints, currentWaypoint); - if (!VehicleAndDriverNullChecks(collectedVehicle)) + if (!VehicleAndDriverAreValid(collectedVehicle)) { return; } @@ -42,7 +42,7 @@ namespace SceneManager void LoopWhileDrivingToWaypoint(float acceptedDistance) { - while (VehicleAndDriverNullChecks(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(currentWaypoint.Position) > acceptedDistance) + while (VehicleAndDriverAreValid(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(currentWaypoint.Position) > acceptedDistance) { //Logger.Log($"Looping while {collectedVehicle.Vehicle.Model.Name} drives to waypoint {currentWaypoint.Number} ({collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position)}m away)"); GameFiber.Yield(); @@ -52,7 +52,7 @@ namespace SceneManager private static void DriveVehicleToNextWaypoint(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) { - if (!VehicleAndDriverNullChecks(collectedVehicle) || currentWaypoint == null || currentWaypoint.Path == null) + if (!VehicleAndDriverAreValid(collectedVehicle) || currentWaypoint == null || currentWaypoint.Path == null) { return; } @@ -62,7 +62,7 @@ namespace SceneManager for (int nextWaypoint = currentWaypoint.Number; nextWaypoint < waypoints.Count; nextWaypoint++) { - if (!VehicleAndDriverNullChecks(waypoints, nextWaypoint, collectedVehicle) || collectedVehicle.Dismissed) + if (!VehicleAndDriverAreValid(waypoints, nextWaypoint, collectedVehicle) || collectedVehicle.Dismissed) { return; } @@ -88,7 +88,7 @@ namespace SceneManager } LoopWhileDrivingToWaypoint(nextWaypoint, acceptedDistance); - if (!VehicleAndDriverNullChecks(collectedVehicle)) + if (!VehicleAndDriverAreValid(collectedVehicle)) { return; } @@ -104,7 +104,7 @@ namespace SceneManager StopVehicleAtWaypoint(waypoints[nextWaypoint], collectedVehicle); } - if (!VehicleAndDriverNullChecks(collectedVehicle) || collectedVehicle.Dismissed) + if (!VehicleAndDriverAreValid(collectedVehicle) || collectedVehicle.Dismissed) { return; } @@ -118,7 +118,7 @@ namespace SceneManager void LoopWhileDrivingToWaypoint(int nextWaypoint, float acceptedDistance) { - while (VehicleAndDriverNullChecks(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && waypoints.ElementAtOrDefault(nextWaypoint) != null && vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position) > acceptedDistance) + while (VehicleAndDriverAreValid(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && waypoints.ElementAtOrDefault(nextWaypoint) != null && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position) > acceptedDistance) { //Logger.Log($"Dismissed: {collectedVehicle.Dismissed} SkipWaypoint: {collectedVehicle.SkipWaypoint}"); if (waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) @@ -152,7 +152,7 @@ namespace SceneManager return acceptedDistance; } - private static bool VehicleAndDriverNullChecks(CollectedVehicle collectedVehicle) + private static bool VehicleAndDriverAreValid(CollectedVehicle collectedVehicle) { if (collectedVehicle == null) { @@ -172,7 +172,7 @@ namespace SceneManager return true; } - private static bool VehicleAndDriverNullChecks(List waypoints, int nextWaypoint, CollectedVehicle collectedVehicle) + private static bool VehicleAndDriverAreValid(List waypoints, int nextWaypoint, CollectedVehicle collectedVehicle) { if (waypoints.ElementAtOrDefault(nextWaypoint) == null) { @@ -199,7 +199,7 @@ namespace SceneManager private static void StopVehicleAtWaypoint(Waypoint currentWaypoint, CollectedVehicle collectedVehicle) { - if (!VehicleAndDriverNullChecks(collectedVehicle)) + if (!VehicleAndDriverAreValid(collectedVehicle)) { return; } @@ -209,7 +209,7 @@ namespace SceneManager Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, stoppingDistance, -1, true); collectedVehicle.StoppedAtWaypoint = true; - while (currentWaypoint != null && VehicleAndDriverNullChecks(collectedVehicle) && collectedVehicle.StoppedAtWaypoint) + while (currentWaypoint != null && VehicleAndDriverAreValid(collectedVehicle) && collectedVehicle.StoppedAtWaypoint) { GameFiber.Yield(); } From a833ab63d4cebe000f52c26cb7234072ac11aa52 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 24 Sep 2020 04:14:03 -0600 Subject: [PATCH 221/276] Commented out vehicle dismissal debug message to stop log spam --- SceneManager/VehicleCollector.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index d771cdd..98252ac 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -33,7 +33,7 @@ namespace SceneManager { while (paths.Contains(path)) { - Logger.Log($"Dismissing unused vehicles for cleanup"); + //Logger.Log($"Dismissing unused vehicles for cleanup"); foreach (CollectedVehicle cv in collectedVehicles.Where(cv => cv.Vehicle)) { if (!cv.Vehicle.IsDriveable || cv.Vehicle.IsUpsideDown || !cv.Vehicle.HasDriver) From e554039e0382be4bcb700f644549d6ec2be2c42d Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Fri, 25 Sep 2020 15:41:10 -0600 Subject: [PATCH 222/276] Removed unnecessary code pertaining to dismiss from waypoint --- SceneManager/Object Classes/CollectedVehicle.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index c09de93..6e9cc18 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -72,16 +72,16 @@ namespace SceneManager { Logger.Log($"Dismissed from waypoint."); SkipWaypoint = true; - GameFiber.StartNew(() => - { - GameFiber.Sleep(100); - SkipWaypoint = false; - }); + //GameFiber.StartNew(() => + //{ + // GameFiber.Sleep(100); + // SkipWaypoint = false; + // Logger.Log($"SkipWaypoint false"); + //}); } if(dismissOption == DismissOption.FromWaypoint && CurrentWaypoint.Number == Path.Waypoints.Count || dismissOption == DismissOption.FromPath) { - Logger.Log($"Dismissed from path."); Dismissed = true; GameFiber.StartNew(() => { From 35d7595f6af4db6ff4ffb713e87784ab933a2b0c Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Fri, 25 Sep 2020 15:41:38 -0600 Subject: [PATCH 223/276] Added condition to display taller markers if edit path is hovered --- SceneManager/Object Classes/Waypoint.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index bc01f8a..a630ded 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -187,18 +187,23 @@ namespace SceneManager } else if ((Path.State == State.Finished && MenuManager.menuPool.IsAnyMenuOpen()) || (Path.State == State.Creating && PathCreationMenu.pathCreationMenu.Visible)) { + float markerHeight = 1f; + if (PathMainMenu.editPath.Selected && PathMainMenu.editPath.Value == Path.Number) + { + markerHeight = 2f; + } if (IsCollector) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, CollectorRadius * 2, CollectorRadius * 2, 1f, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, SpeedZoneRadius * 2, SpeedZoneRadius * 2, 1f, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, CollectorRadius * 2, CollectorRadius * 2, markerHeight, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, SpeedZoneRadius * 2, SpeedZoneRadius * 2, markerHeight, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); } else if (DrivingFlag == VehicleDrivingFlags.StopAtDestination) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, markerHeight, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); } else { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, markerHeight, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); } } From 59d85e72a859377ad58a9983ae156ed25dba2b2a Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Fri, 25 Sep 2020 15:43:01 -0600 Subject: [PATCH 224/276] Fixed vehicle being incorrectly dismissed from path when user dismissed them from waypoint --- SceneManager/AITasking.cs | 40 ++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index a7fb5b0..e3442e7 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -36,7 +36,7 @@ namespace SceneManager Logger.Log($"{collectedVehicle.Vehicle.Model.Name} all tasks complete."); if (!collectedVehicle.Dismissed) { - Logger.Log($"Dismissing {collectedVehicle.Vehicle.Model.Name}"); + Logger.Log($"Dismissing {collectedVehicle.Vehicle.Model.Name} from path"); collectedVehicle.Dismiss(); } @@ -60,33 +60,35 @@ namespace SceneManager var vehicle = collectedVehicle.Vehicle; var driver = vehicle.Driver; - for (int nextWaypoint = currentWaypoint.Number; nextWaypoint < waypoints.Count; nextWaypoint++) + for (int currentWaypointTask = currentWaypoint.Number; currentWaypointTask < waypoints.Count; currentWaypointTask++) { - if (!VehicleAndDriverAreValid(waypoints, nextWaypoint, collectedVehicle) || collectedVehicle.Dismissed) + collectedVehicle.SkipWaypoint = false; + if (collectedVehicle.Dismissed) { + Logger.Log($"Vehicle dismissed, return"); return; } - if (collectedVehicle.SkipWaypoint) + //if (collectedVehicle.SkipWaypoint) + //{ + // Logger.Log($"Vehicle still skipping waypoint"); + // continue; + //} + if (waypoints.ElementAtOrDefault(currentWaypointTask) != null && !collectedVehicle.StoppedAtWaypoint) { - continue; - } + collectedVehicle.CurrentWaypoint = waypoints[currentWaypointTask]; + //Logger.Log($"{collectedVehicle.Vehicle.Model.Name} current waypoint: {collectedVehicle.CurrentWaypoint.Number}"); + float acceptedDistance = GetAcceptedStoppingDistance(waypoints, currentWaypointTask); - if (waypoints.ElementAtOrDefault(nextWaypoint) != null && !collectedVehicle.StoppedAtWaypoint) - { - collectedVehicle.CurrentWaypoint = waypoints[nextWaypoint]; - Logger.Log($"{collectedVehicle.Vehicle.Model.Name} current waypoint: {collectedVehicle.CurrentWaypoint.Number}"); - float acceptedDistance = GetAcceptedStoppingDistance(waypoints, nextWaypoint); - - Logger.Log($"{vehicle.Model.Name} is driving to waypoint {waypoints[nextWaypoint].Number}"); - if (waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) + Logger.Log($"{vehicle.Model.Name} is driving to waypoint {waypoints[currentWaypointTask].Number}"); + if (waypoints[currentWaypointTask].DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) { - driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)17040299, acceptedDistance); + driver.Tasks.DriveToPosition(waypoints[currentWaypointTask].Position, waypoints[currentWaypointTask].Speed, (VehicleDrivingFlags)17040299, acceptedDistance); } else { - driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263075, acceptedDistance); + driver.Tasks.DriveToPosition(waypoints[currentWaypointTask].Position, waypoints[currentWaypointTask].Speed, (VehicleDrivingFlags)263075, acceptedDistance); } - LoopWhileDrivingToWaypoint(nextWaypoint, acceptedDistance); + LoopWhileDrivingToWaypoint(currentWaypointTask, acceptedDistance); if (!VehicleAndDriverAreValid(collectedVehicle)) { @@ -99,9 +101,9 @@ namespace SceneManager continue; } - if (!collectedVehicle.Dismissed && waypoints.ElementAtOrDefault(nextWaypoint) != null && waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + if (!collectedVehicle.Dismissed && waypoints.ElementAtOrDefault(currentWaypointTask) != null && waypoints[currentWaypointTask].DrivingFlag == VehicleDrivingFlags.StopAtDestination) { - StopVehicleAtWaypoint(waypoints[nextWaypoint], collectedVehicle); + StopVehicleAtWaypoint(waypoints[currentWaypointTask], collectedVehicle); } if (!VehicleAndDriverAreValid(collectedVehicle) || collectedVehicle.Dismissed) From 13d22d218d7115af48e98ecb32ab6a15d00985bb Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Fri, 25 Sep 2020 15:43:15 -0600 Subject: [PATCH 225/276] Added PrefersSingleInstance attribute --- SceneManager/EntryPoint.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/EntryPoint.cs b/SceneManager/EntryPoint.cs index efde765..72bbc36 100644 --- a/SceneManager/EntryPoint.cs +++ b/SceneManager/EntryPoint.cs @@ -4,7 +4,7 @@ using System.Reflection; using System.Windows.Forms; using Rage; -[assembly: Rage.Attributes.Plugin("Scene Manager", Author = "Rich", Description = "Control your scenes with custom AI pathing and traffic barrier management.")] +[assembly: Rage.Attributes.Plugin("Scene Manager", Author = "Rich", Description = "Control your scenes with custom AI pathing and traffic barrier management.", PrefersSingleInstance = true)] namespace SceneManager { From cf0aa75644e240fd06520c041ea154be1c57aeab Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 26 Sep 2020 08:38:01 -0600 Subject: [PATCH 226/276] Fixed an issue where dismissing a vehicle from the last waypoint of a path was not working --- SceneManager/AITasking.cs | 2 + .../Object Classes/CollectedVehicle.cs | 41 ++++++++++--------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index e3442e7..5bd535e 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -215,6 +215,8 @@ namespace SceneManager { GameFiber.Yield(); } + Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, 0f, 1, true); + collectedVehicle.Driver.Tasks.CruiseWithVehicle(5f); } } } diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index 6e9cc18..da5eeca 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -56,15 +56,7 @@ namespace SceneManager Driver.Tasks.Clear(); if(StoppedAtWaypoint) { - Logger.Log($"Unstucking stopped vehicle"); - Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(Vehicle, 0f, 1, true); - GameFiber.StartNew(() => - { - while(Vehicle && Vehicle.Speed < 1f) - { - GameFiber.Yield(); - } - }); + Logger.Log($"Unstucking {Vehicle.Model.Name}"); StoppedAtWaypoint = false; } @@ -72,12 +64,6 @@ namespace SceneManager { Logger.Log($"Dismissed from waypoint."); SkipWaypoint = true; - //GameFiber.StartNew(() => - //{ - // GameFiber.Sleep(100); - // SkipWaypoint = false; - // Logger.Log($"SkipWaypoint false"); - //}); } if(dismissOption == DismissOption.FromWaypoint && CurrentWaypoint.Number == Path.Waypoints.Count || dismissOption == DismissOption.FromPath) @@ -86,12 +72,29 @@ namespace SceneManager GameFiber.StartNew(() => { // check if the vehicle is near any of the path's collector waypoints - var nearestCollectorWaypoint = Path.Waypoints.Where(wp => wp.IsCollector && Vehicle.DistanceTo2D(wp.Position) <= wp.CollectorRadius * 2).FirstOrDefault(); - while (nearestCollectorWaypoint != null && Vehicle && Driver && Vehicle.DistanceTo2D(nearestCollectorWaypoint.Position) <= nearestCollectorWaypoint.CollectorRadius * 2) + //var nearestCollectorWaypoint = Path.Waypoints.Where(wp => wp.IsCollector && Vehicle.DistanceTo2D(wp.Position) <= wp.CollectorRadius * 2).FirstOrDefault(); + var nearestCollectorWaypoint = Path.Waypoints.Where(wp => wp.IsCollector).OrderBy(wp => Vehicle.DistanceTo2D(wp.Position)).FirstOrDefault(); + if(nearestCollectorWaypoint != null && Vehicle.FrontPosition.DistanceTo2D(nearestCollectorWaypoint.Position) <= 5f) { - //Game.LogTrivial($"{Vehicle.Model.Name} is too close to the collector to be fully dismissed."); - GameFiber.Yield(); + while (nearestCollectorWaypoint != null && Vehicle && Driver && Vehicle.FrontPosition.DistanceTo2D(nearestCollectorWaypoint.Position) <= 5f) + { + //Game.LogTrivial($"{Vehicle.Model.Name} is too close to the collector to be fully dismissed."); + GameFiber.Yield(); + } } + else if(nearestCollectorWaypoint != null) + { + while (nearestCollectorWaypoint != null && Vehicle && Driver && Vehicle.FrontPosition.DistanceTo2D(nearestCollectorWaypoint.Position) <= nearestCollectorWaypoint.CollectorRadius * 2) + { + //Game.LogTrivial($"{Vehicle.Model.Name} is too close to the collector to be fully dismissed."); + GameFiber.Yield(); + } + } + else + { + Logger.Log($"Nearest collector is null"); + } + if (!Vehicle || !Driver) { From 4cb8c105693bfda4b9a0ffa2409d628b580a453e Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 27 Sep 2020 07:44:15 -0600 Subject: [PATCH 227/276] Fixed waypoints being highlighted when they shouldn't be --- SceneManager/Object Classes/Waypoint.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index a630ded..b0ea7cd 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -188,7 +188,7 @@ namespace SceneManager else if ((Path.State == State.Finished && MenuManager.menuPool.IsAnyMenuOpen()) || (Path.State == State.Creating && PathCreationMenu.pathCreationMenu.Visible)) { float markerHeight = 1f; - if (PathMainMenu.editPath.Selected && PathMainMenu.editPath.Value == Path.Number) + if (PathMainMenu.editPath.Selected && PathMainMenu.editPath.Value == Path.Number && (PathMainMenu.pathMainMenu.Visible || EditPathMenu.editPathMenu.Visible)) { markerHeight = 2f; } From 06777aa928c2a45d0b601fd40020a788b10e458b Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 1 Oct 2020 05:52:44 -0600 Subject: [PATCH 228/276] Added null check in driver creation --- SceneManager/VehicleCollector.cs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index 98252ac..bc876ae 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -103,12 +103,19 @@ namespace SceneManager { GameFiber.Yield(); } - var driverBlip = v.Driver.AttachBlip(); - driverBlip.Color = Color.Green; - driverBlip.Scale = 0.25f; - v.Driver.IsPersistent = true; - v.Driver.BlockPermanentEvents = true; - Logger.Log($"A missing driver was created for {v.Model.Name}."); + if(v && v.Driver) + { + var driverBlip = v.Driver.AttachBlip(); + driverBlip.Color = Color.Green; + driverBlip.Scale = 0.25f; + v.Driver.IsPersistent = true; + v.Driver.BlockPermanentEvents = true; + Logger.Log($"A missing driver was created for {v.Model.Name}."); + } + else + { + return false; + } } return true; } From 6ce58a7d8e06c90462574fa671fb8869a1efd984 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 1 Oct 2020 06:04:40 -0600 Subject: [PATCH 229/276] Added local function to create waypoint blip for Add As New Waypoint --- SceneManager/Menus/EditWaypointMenu.cs | 38 +++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 1333903..d026d0a 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -164,19 +164,19 @@ namespace SceneManager { var pathIndex = PathMainMenu.paths.IndexOf(currentPath); var drivingFlag = drivingFlags[changeWaypointType.Index]; - var blip = PathCreationMenu.CreateWaypointBlip(pathIndex, drivingFlag); + var newWaypointBlip = CreateNewWaypointBlip(); if (!currentPath.IsEnabled) { - blip.Alpha = 0.5f; + newWaypointBlip.Alpha = 0.5f; } if (collectorWaypoint.Checked) { - currentPath.Waypoints.Add(new Waypoint(currentPath, currentPath.Waypoints.Last().Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip, true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value)); + currentPath.Waypoints.Add(new Waypoint(currentPath, currentPath.Waypoints.Last().Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, newWaypointBlip, true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value)); } else { - currentPath.Waypoints.Add(new Waypoint(currentPath, currentPath.Waypoints.Last().Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, blip)); + currentPath.Waypoints.Add(new Waypoint(currentPath, currentPath.Waypoints.Last().Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, newWaypointBlip)); } editWaypointMenu.RemoveItemAt(0); @@ -186,6 +186,36 @@ namespace SceneManager editWaypointMenu.RefreshIndex(); updateWaypointPosition.Checked = false; Logger.Log($"New waypoint (#{currentWaypoint.Number + 1}) added."); + + Blip CreateNewWaypointBlip() + { + var spriteNumericalEnum = pathIndex + 17; // 17 because the numerical value of these sprites are always 17 more than the path index + var blip = new Blip(Game.LocalPlayer.Character.Position) + { + Scale = 0.5f, + Sprite = (BlipSprite)spriteNumericalEnum + }; + + if (collectorWaypoint.Checked) + { + blip.Color = Color.Blue; + } + else if (drivingFlag == VehicleDrivingFlags.StopAtDestination) + { + blip.Color = Color.Red; + } + else + { + blip.Color = Color.Green; + } + + if (!SettingsMenu.mapBlips.Checked) + { + blip.Alpha = 0f; + } + + return blip; + } } if (selectedItem == removeWaypoint) From 14378211b6c0d4117beb6d855381966077bab7e4 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 1 Oct 2020 06:05:05 -0600 Subject: [PATCH 230/276] CreateWaypointBlip is now a local function and not referenced elsewhere --- SceneManager/Menus/PathCreationMenu.cs | 64 +++++++++++++------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 8d220c8..7fcec61 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -94,11 +94,11 @@ namespace SceneManager if (collectorWaypoint.Checked) { - PathMainMenu.paths[pathIndex].Waypoints.Add(new Waypoint(firstNonNullPath, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlags[waypointType.Index], CreateWaypointBlip(pathIndex, drivingFlags[waypointType.Index]), true, collectorRadius.Value, speedZoneRadius.Value)); + PathMainMenu.paths[pathIndex].Waypoints.Add(new Waypoint(firstNonNullPath, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlags[waypointType.Index], CreateWaypointBlip(), true, collectorRadius.Value, speedZoneRadius.Value)); } else { - PathMainMenu.paths[pathIndex].Waypoints.Add(new Waypoint(firstNonNullPath, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlags[waypointType.Index], CreateWaypointBlip(pathIndex, drivingFlags[waypointType.Index]))); + PathMainMenu.paths[pathIndex].Waypoints.Add(new Waypoint(firstNonNullPath, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlags[waypointType.Index], CreateWaypointBlip())); } Logger.Log($"[Path {pathNumber}] Waypoint {waypointNumber} ({drivingFlags[waypointType.Index].ToString()}) added"); @@ -125,6 +125,36 @@ namespace SceneManager return convertedSpeed; } + + Blip CreateWaypointBlip() + { + var spriteNumericalEnum = pathIndex + 17; // 17 because the numerical value of these sprites are always 17 more than the path index + var blip = new Blip(Game.LocalPlayer.Character.Position) + { + Scale = 0.5f, + Sprite = (BlipSprite)spriteNumericalEnum + }; + + if (collectorWaypoint.Checked) + { + blip.Color = Color.Blue; + } + else if (drivingFlags[waypointType.Index] == VehicleDrivingFlags.StopAtDestination) + { + blip.Color = Color.Red; + } + else + { + blip.Color = Color.Green; + } + + if (!SettingsMenu.mapBlips.Checked) + { + blip.Alpha = 0f; + } + + return blip; + } } if (selectedItem == trafficRemoveWaypoint) @@ -228,36 +258,6 @@ namespace SceneManager } } - internal static Blip CreateWaypointBlip(int pathIndex, VehicleDrivingFlags drivingFlag) - { - var spriteNumericalEnum = pathIndex + 17; // 17 because the numerical value of these sprites are always 17 more than the path index - var blip = new Blip(Game.LocalPlayer.Character.Position) - { - Scale = 0.5f, - Sprite = (BlipSprite)spriteNumericalEnum - }; - - if (collectorWaypoint.Checked) - { - blip.Color = Color.Blue; - } - else if (drivingFlag == VehicleDrivingFlags.StopAtDestination) - { - blip.Color = Color.Red; - } - else - { - blip.Color = Color.Green; - } - - if (!SettingsMenu.mapBlips.Checked) - { - blip.Alpha = 0f; - } - - return blip; - } - internal static void AddNewPathToPathsCollection(List paths, int pathIndex) { var pathNum = pathIndex + 1; From 2523f8eb104071624ddfbd5573368c836dd1b3bf Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Fri, 2 Oct 2020 05:41:01 -0600 Subject: [PATCH 231/276] Reconfigured some conditionals in an attempt to fix nullref exceptions --- SceneManager/VehicleCollector.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index bc876ae..4e8c918 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -90,9 +90,9 @@ namespace SceneManager private static bool IsValidForCollection(this Vehicle v) { - if(v && v.Speed > 1 && v.IsOnAllWheels && v.IsEngineOn && v != Game.LocalPlayer.Character.CurrentVehicle && v != Game.LocalPlayer.Character.LastVehicle && (v.IsCar || v.IsBike || v.IsBicycle || v.IsQuadBike || (v.HasSiren && !v.IsSirenOn)) && !collectedVehicles.Any(cv => cv.Vehicle == v)) + if(v && v.Speed > 1 && v.IsOnAllWheels && v.IsEngineOn && v != Game.LocalPlayer.Character.CurrentVehicle && v != Game.LocalPlayer.Character.LastVehicle && (v.IsCar || v.IsBike || v.IsBicycle || v.IsQuadBike) && !v.IsSirenOn && !collectedVehicles.Any(cv => cv?.Vehicle == v)) { - if(v.HasDriver && !v.Driver.IsAlive) + if(v.HasDriver && v.Driver && !v.Driver.IsAlive) { return false; } From 3367e1a682cc5811e8a83689a0806c2f1802a6e1 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 4 Oct 2020 13:48:08 -0600 Subject: [PATCH 232/276] Restructured termination code --- SceneManager/EntryPoint.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/SceneManager/EntryPoint.cs b/SceneManager/EntryPoint.cs index 72bbc36..3d69be8 100644 --- a/SceneManager/EntryPoint.cs +++ b/SceneManager/EntryPoint.cs @@ -53,12 +53,6 @@ namespace SceneManager private static void MyTerminationHandler(object sender, EventArgs e) { - // Clean up paths - for (int i = 0; i < PathMainMenu.paths.Count; i++) - { - PathMainMenu.DeletePath(PathMainMenu.paths[i], PathMainMenu.Delete.All); - } - // Clean up cones foreach (Barrier barrier in BarrierMenu.barriers.Where(b => b.Object)) { @@ -69,6 +63,12 @@ namespace SceneManager BarrierMenu.shadowBarrier.Delete(); } + // Clean up paths + for (int i = 0; i < PathMainMenu.paths.Count; i++) + { + PathMainMenu.DeletePath(PathMainMenu.paths[i], PathMainMenu.Delete.All); + } + // Clear everything BarrierMenu.barriers.Clear(); VehicleCollector.collectedVehicles.Clear(); From 334ec2358c7ee393b66541fb8592321cf66a7052 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 4 Oct 2020 13:52:52 -0600 Subject: [PATCH 233/276] Organized code into local functions within DeletePath. Deleted duplicate speed zone removal code. collectedVehicle is now dismissed when directed to another path in order to remove them from their current path. --- SceneManager/Menus/PathMainMenu.cs | 131 +++++++++++++++-------------- 1 file changed, 68 insertions(+), 63 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index 1555a7c..ee3a79d 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -104,47 +104,9 @@ namespace SceneManager internal static void DeletePath(Path path, Delete pathsToDelete) { Game.LogTrivial($"Preparing to delete path {path.Number}"); - var pathVehicles = VehicleCollector.collectedVehicles.Where(cv => cv.Path.Number == path.Number).ToList(); - Game.LogTrivial($"Removing all vehicles on the path"); - foreach (CollectedVehicle cv in pathVehicles.Where(cv => cv != null && cv.Vehicle && cv.Driver)) - { - if (cv.StoppedAtWaypoint) - { - Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(cv.Vehicle, 1f, 1, true); - } - cv.StoppedAtWaypoint = false; - if (cv.Driver.GetAttachedBlip()) - { - cv.Driver.GetAttachedBlip().Delete(); - } - cv.Driver.Tasks.Clear(); - cv.Driver.Dismiss(); - cv.Vehicle.IsSirenOn = false; - cv.Vehicle.IsSirenSilent = true; - cv.Vehicle.Dismiss(); - - //Game.LogTrivial($"{cv.vehicle.Model.Name} cleared from path {cv.path}"); - VehicleCollector.collectedVehicles.Remove(cv); - } - - // Remove the speed zone so cars don't continue to be affected after the path is deleted - Game.LogTrivial($"Removing yield zone and waypoint blips"); - foreach (Waypoint waypoint in path.Waypoints) - { - if (waypoint.SpeedZone != 0) - { - waypoint.RemoveSpeedZone(); - } - if (waypoint.Blip) - { - waypoint.Blip.Delete(); - } - if (waypoint.CollectorRadiusBlip) - { - waypoint.CollectorRadiusBlip.Delete(); - } - } + RemoveVehiclesFromPath(); + RemoveBlipsAndYieldZones(); Game.LogTrivial($"Clearing path waypoints"); path.Waypoints.Clear(); @@ -163,26 +125,75 @@ namespace SceneManager EditPathMenu.editPathMenu.Reset(true, true); EditPathMenu.disablePath.Enabled = true; - } - private static void UpdatePathBlips() - { - foreach (Path p in paths) + void RemoveVehiclesFromPath() { - foreach (Waypoint waypoint in p.Waypoints) + Game.LogTrivial($"Removing all vehicles on the path"); + var pathVehicles = VehicleCollector.collectedVehicles.Where(cv => cv.Path.Number == path.Number).ToList(); + foreach (CollectedVehicle cv in pathVehicles.Where(cv => cv != null && cv.Vehicle && cv.Driver)) { - var blipColor = waypoint.Blip.Color; - waypoint.Blip.Sprite = (BlipSprite)paths.IndexOf(p) + 17; - waypoint.Blip.Color = blipColor; + if (cv.StoppedAtWaypoint) + { + Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(cv.Vehicle, 1f, 1, true); + } + cv.StoppedAtWaypoint = false; + if (cv.Driver.GetAttachedBlip()) + { + cv.Driver.GetAttachedBlip().Delete(); + } + Logger.Log($"{cv.Vehicle.Model.Name} task status before clear/dismiss: {cv.Driver.Tasks.CurrentTaskStatus.ToString()}"); + cv.Driver.Tasks.Clear(); + cv.Driver.Tasks.ClearSecondary(); + cv.Driver.Dismiss(); + Logger.Log($"{cv.Vehicle.Model.Name} task status after clear/dismiss: {cv.Driver.Tasks.CurrentTaskStatus.ToString()}"); + cv.Vehicle.IsSirenOn = false; + cv.Vehicle.IsSirenSilent = true; + cv.Vehicle.Dismiss(); + + //Game.LogTrivial($"{cv.vehicle.Model.Name} cleared from path {cv.path}"); + VehicleCollector.collectedVehicles.Remove(cv); } } - } - private static void UpdatePathNumbers() - { - for (int i = 0; i < paths.Count; i++) + void RemoveBlipsAndYieldZones() { - paths[i].Number = i + 1; + Game.LogTrivial($"Removing waypoint blips and yield zones."); + foreach (Waypoint waypoint in path.Waypoints) + { + if (waypoint.SpeedZone != 0) + { + waypoint.RemoveSpeedZone(); + } + if (waypoint.Blip) + { + waypoint.Blip.Delete(); + } + if (waypoint.CollectorRadiusBlip) + { + waypoint.CollectorRadiusBlip.Delete(); + } + } + } + + void UpdatePathBlips() + { + foreach (Path p in paths) + { + foreach (Waypoint waypoint in p.Waypoints) + { + var blipColor = waypoint.Blip.Color; + waypoint.Blip.Sprite = (BlipSprite)paths.IndexOf(p) + 17; + waypoint.Blip.Color = blipColor; + } + } + } + + void UpdatePathNumbers() + { + for (int i = 0; i < paths.Count; i++) + { + paths[i].Number = i + 1; + } } } @@ -219,14 +230,7 @@ namespace SceneManager { DeletePath(paths[i], Delete.All); } - foreach (Path path in paths) - { - foreach(Waypoint waypoint in path.Waypoints.Where(wp => wp.SpeedZone != 0)) - { - waypoint.RemoveSpeedZone(); - } - path.Waypoints.Clear(); - } + paths.Clear(); BuildPathMenu(); pathMainMenu.Visible = true; @@ -237,11 +241,10 @@ namespace SceneManager if (selectedItem == directDriver) { var nearbyVehicle = Game.LocalPlayer.Character.GetNearbyVehicles(1).Where(v => v.VehicleAndDriverValid()).SingleOrDefault(); - CollectedVehicle collectedVehicle; if (nearbyVehicle) { - collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle).FirstOrDefault(); + var collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle).FirstOrDefault(); var path = paths[directDriver.Index]; var waypoints = path.Waypoints; var firstWaypoint = waypoints.First(); @@ -268,8 +271,10 @@ namespace SceneManager collectedVehicle.StoppedAtWaypoint = false; Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, 0f, 1, true); } + collectedVehicle.Dismiss(); collectedVehicle.Directed = true; + if (directOptions.SelectedItem == "First waypoint") { GameFiber.StartNew(() => From 70b0adbf8ed0d4567ad0a5617b1a2c2f8cfc25f0 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 4 Oct 2020 13:53:31 -0600 Subject: [PATCH 234/276] Commented out potentially useless code checking vehicle's distance to nearest collector upon dismissal. --- .../Object Classes/CollectedVehicle.cs | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index da5eeca..497bc1a 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -68,25 +68,27 @@ namespace SceneManager if(dismissOption == DismissOption.FromWaypoint && CurrentWaypoint.Number == Path.Waypoints.Count || dismissOption == DismissOption.FromPath) { + Logger.Log($"Dismissing from path"); Dismissed = true; GameFiber.StartNew(() => { // check if the vehicle is near any of the path's collector waypoints //var nearestCollectorWaypoint = Path.Waypoints.Where(wp => wp.IsCollector && Vehicle.DistanceTo2D(wp.Position) <= wp.CollectorRadius * 2).FirstOrDefault(); var nearestCollectorWaypoint = Path.Waypoints.Where(wp => wp.IsCollector).OrderBy(wp => Vehicle.DistanceTo2D(wp.Position)).FirstOrDefault(); - if(nearestCollectorWaypoint != null && Vehicle.FrontPosition.DistanceTo2D(nearestCollectorWaypoint.Position) <= 5f) - { - while (nearestCollectorWaypoint != null && Vehicle && Driver && Vehicle.FrontPosition.DistanceTo2D(nearestCollectorWaypoint.Position) <= 5f) - { - //Game.LogTrivial($"{Vehicle.Model.Name} is too close to the collector to be fully dismissed."); - GameFiber.Yield(); - } - } - else if(nearestCollectorWaypoint != null) + //if(nearestCollectorWaypoint != null && Vehicle.FrontPosition.DistanceTo2D(nearestCollectorWaypoint.Position) <= 5f) + //{ + // while (nearestCollectorWaypoint != null && Vehicle && Driver && Vehicle.FrontPosition.DistanceTo2D(nearestCollectorWaypoint.Position) <= 5f) + // { + // Game.LogTrivial($"{Vehicle.Model.Name} is within 5f of nearest collector to be fully dismissed."); + // GameFiber.Yield(); + // } + //} + //else if + if(nearestCollectorWaypoint != null) { while (nearestCollectorWaypoint != null && Vehicle && Driver && Vehicle.FrontPosition.DistanceTo2D(nearestCollectorWaypoint.Position) <= nearestCollectorWaypoint.CollectorRadius * 2) { - //Game.LogTrivial($"{Vehicle.Model.Name} is too close to the collector to be fully dismissed."); + Game.LogTrivial($"{Vehicle.Model.Name} is within 2x collector radius, cannot be fully dismissed yet."); GameFiber.Yield(); } } From bf8985179de48fb098ae290a7bbd0d437c4ca49d Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 4 Oct 2020 13:57:44 -0600 Subject: [PATCH 235/276] Renamed some functions, added more logging. Reset directed vehicle properties before tasking. --- SceneManager/AITasking.cs | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 5bd535e..97abf7f 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -15,12 +15,14 @@ namespace SceneManager if (currentWaypoint != null && collectedVehicle.Directed) { + collectedVehicle.Dismissed = false; + collectedVehicle.Directed = false; float acceptedDistance = GetAcceptedStoppingDistance(waypoints, waypoints.IndexOf(currentWaypoint)); Logger.Log($"{collectedVehicle.Vehicle.Model.Name} distance to collection waypoint: {collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position)}"); - Logger.Log($"{collectedVehicle.Vehicle.Model.Name} is driving to waypoint {currentWaypoint.Number}"); + Logger.Log($"{collectedVehicle.Vehicle.Model.Name} is driving to path {currentWaypoint.Path.Number} waypoint {currentWaypoint.Number}"); collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)263075, acceptedDistance); - LoopWhileDrivingToWaypoint(acceptedDistance); + LoopWhileDrivingToDirectedWaypoint(acceptedDistance); } if (currentWaypoint.DrivingFlag == VehicleDrivingFlags.StopAtDestination) @@ -40,7 +42,7 @@ namespace SceneManager collectedVehicle.Dismiss(); } - void LoopWhileDrivingToWaypoint(float acceptedDistance) + void LoopWhileDrivingToDirectedWaypoint(float acceptedDistance) { while (VehicleAndDriverAreValid(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(currentWaypoint.Position) > acceptedDistance) { @@ -54,32 +56,32 @@ namespace SceneManager { if (!VehicleAndDriverAreValid(collectedVehicle) || currentWaypoint == null || currentWaypoint.Path == null) { + Logger.Log($"Vehicle, driver, waypoint, or path is null."); return; } var vehicle = collectedVehicle.Vehicle; var driver = vehicle.Driver; + Logger.Log($"Preparing to run task loop for {collectedVehicle.Vehicle.Model.Name}"); for (int currentWaypointTask = currentWaypoint.Number; currentWaypointTask < waypoints.Count; currentWaypointTask++) { + Logger.Log($"{collectedVehicle.Vehicle.Model.Name} in the task loop"); collectedVehicle.SkipWaypoint = false; + if (collectedVehicle.Dismissed) { Logger.Log($"Vehicle dismissed, return"); return; } - //if (collectedVehicle.SkipWaypoint) - //{ - // Logger.Log($"Vehicle still skipping waypoint"); - // continue; - //} + if (waypoints.ElementAtOrDefault(currentWaypointTask) != null && !collectedVehicle.StoppedAtWaypoint) { collectedVehicle.CurrentWaypoint = waypoints[currentWaypointTask]; //Logger.Log($"{collectedVehicle.Vehicle.Model.Name} current waypoint: {collectedVehicle.CurrentWaypoint.Number}"); float acceptedDistance = GetAcceptedStoppingDistance(waypoints, currentWaypointTask); - Logger.Log($"{vehicle.Model.Name} is driving to waypoint {waypoints[currentWaypointTask].Number}"); + Logger.Log($"{vehicle.Model.Name} is driving to path {currentWaypoint.Path.Number} waypoint {waypoints[currentWaypointTask].Number}"); if (waypoints[currentWaypointTask].DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) { driver.Tasks.DriveToPosition(waypoints[currentWaypointTask].Position, waypoints[currentWaypointTask].Speed, (VehicleDrivingFlags)17040299, acceptedDistance); @@ -215,8 +217,11 @@ namespace SceneManager { GameFiber.Yield(); } - Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, 0f, 1, true); - collectedVehicle.Driver.Tasks.CruiseWithVehicle(5f); + if(collectedVehicle.Vehicle && collectedVehicle.Driver) + { + Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, 0f, 1, true); + collectedVehicle.Driver.Tasks.CruiseWithVehicle(5f); + } } } } From 5f0fb1616040e25b46bf254f69bdb07d5188d297 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 4 Oct 2020 14:49:06 -0600 Subject: [PATCH 236/276] Removed dead code --- SceneManager/Object Classes/CollectedVehicle.cs | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index 497bc1a..ac41a58 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -73,17 +73,7 @@ namespace SceneManager GameFiber.StartNew(() => { // check if the vehicle is near any of the path's collector waypoints - //var nearestCollectorWaypoint = Path.Waypoints.Where(wp => wp.IsCollector && Vehicle.DistanceTo2D(wp.Position) <= wp.CollectorRadius * 2).FirstOrDefault(); var nearestCollectorWaypoint = Path.Waypoints.Where(wp => wp.IsCollector).OrderBy(wp => Vehicle.DistanceTo2D(wp.Position)).FirstOrDefault(); - //if(nearestCollectorWaypoint != null && Vehicle.FrontPosition.DistanceTo2D(nearestCollectorWaypoint.Position) <= 5f) - //{ - // while (nearestCollectorWaypoint != null && Vehicle && Driver && Vehicle.FrontPosition.DistanceTo2D(nearestCollectorWaypoint.Position) <= 5f) - // { - // Game.LogTrivial($"{Vehicle.Model.Name} is within 5f of nearest collector to be fully dismissed."); - // GameFiber.Yield(); - // } - //} - //else if if(nearestCollectorWaypoint != null) { while (nearestCollectorWaypoint != null && Vehicle && Driver && Vehicle.FrontPosition.DistanceTo2D(nearestCollectorWaypoint.Position) <= nearestCollectorWaypoint.CollectorRadius * 2) From 04758b3a451b1ee09ddf140e48dc269388627ec9 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 4 Oct 2020 14:49:59 -0600 Subject: [PATCH 237/276] Disabled assigning tasks in DriveToWaypoint loop. This fixed vehicles not being dismissed on plugin termination, but not sure if there is still a reason we needed to re-assign the tasks in a loop. --- SceneManager/AITasking.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 97abf7f..487d5a4 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -125,14 +125,14 @@ namespace SceneManager while (VehicleAndDriverAreValid(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && waypoints.ElementAtOrDefault(nextWaypoint) != null && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position) > acceptedDistance) { //Logger.Log($"Dismissed: {collectedVehicle.Dismissed} SkipWaypoint: {collectedVehicle.SkipWaypoint}"); - if (waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) - { - driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)17040299, acceptedDistance); - } - else - { - driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263075, acceptedDistance); - } + //if (waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) + //{ + // driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)17040299, acceptedDistance); + //} + //else + //{ + // driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263075, acceptedDistance); + //} //Logger.Log($"Looping while {collectedVehicle.Vehicle.Model.Name} drives to waypoint {waypoints[nextWaypoint].Number} ({collectedVehicle.Vehicle.DistanceTo2D(waypoints[nextWaypoint].Position)}m away from collector radius {waypoints[nextWaypoint].CollectorRadius})"); //Logger.Log($"Distance of front of vehicle to waypoint: {collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position)}"); GameFiber.Sleep(100); From 5d8256b53c9e6e9801554d1ec312634149ee09f0 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 4 Oct 2020 15:29:20 -0600 Subject: [PATCH 238/276] Commented debug message for vehicle dismissal --- SceneManager/Object Classes/CollectedVehicle.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index ac41a58..ee9ad54 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -78,7 +78,7 @@ namespace SceneManager { while (nearestCollectorWaypoint != null && Vehicle && Driver && Vehicle.FrontPosition.DistanceTo2D(nearestCollectorWaypoint.Position) <= nearestCollectorWaypoint.CollectorRadius * 2) { - Game.LogTrivial($"{Vehicle.Model.Name} is within 2x collector radius, cannot be fully dismissed yet."); + //Game.LogTrivial($"{Vehicle.Model.Name} is within 2x collector radius, cannot be fully dismissed yet."); GameFiber.Yield(); } } From e2924db25f28966690591e7b844d75dcee1a9570 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 4 Oct 2020 15:30:04 -0600 Subject: [PATCH 239/276] Changed vehicle collection radius from 1.5x collector radius to 2x. This should match the dismissal check radius --- SceneManager/VehicleCollector.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index 4e8c918..adee813 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -76,7 +76,7 @@ namespace SceneManager Vehicle[] GetNearbyVehiclesForCollection(Vector3 collectorWaypointPosition, float collectorRadius) { - return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorWaypointPosition) <= collectorRadius*1.5 && Math.Abs(collectorWaypointPosition.Z - v.Position.Z) < 3 && v.IsValidForCollection() select v).ToArray(); + return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorWaypointPosition) <= collectorRadius*2 && Math.Abs(collectorWaypointPosition.Z - v.Position.Z) < 3 && v.IsValidForCollection() select v).ToArray(); } } From 0a2ef225efb6608d17d4266eab22731118729e80 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 4 Oct 2020 15:31:06 -0600 Subject: [PATCH 240/276] Added condition to increase path marker height when directing a driver --- SceneManager/Object Classes/Waypoint.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index b0ea7cd..03038df 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -188,7 +188,7 @@ namespace SceneManager else if ((Path.State == State.Finished && MenuManager.menuPool.IsAnyMenuOpen()) || (Path.State == State.Creating && PathCreationMenu.pathCreationMenu.Visible)) { float markerHeight = 1f; - if (PathMainMenu.editPath.Selected && PathMainMenu.editPath.Value == Path.Number && (PathMainMenu.pathMainMenu.Visible || EditPathMenu.editPathMenu.Visible)) + if ((PathMainMenu.directDriver.Selected && PathMainMenu.directDriver.Value == Path.Number) || PathMainMenu.editPath.Selected && PathMainMenu.editPath.Value == Path.Number && (PathMainMenu.pathMainMenu.Visible || EditPathMenu.editPathMenu.Visible)) { markerHeight = 2f; } From 0da63a655a9d4ee7ec8289bd4d7112fd6ae9b792 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 5 Oct 2020 05:22:52 -0600 Subject: [PATCH 241/276] Adjusted distance value for collection and dismissal of vehicles --- SceneManager/Object Classes/CollectedVehicle.cs | 2 +- SceneManager/VehicleCollector.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index ee9ad54..14bbfbc 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -76,7 +76,7 @@ namespace SceneManager var nearestCollectorWaypoint = Path.Waypoints.Where(wp => wp.IsCollector).OrderBy(wp => Vehicle.DistanceTo2D(wp.Position)).FirstOrDefault(); if(nearestCollectorWaypoint != null) { - while (nearestCollectorWaypoint != null && Vehicle && Driver && Vehicle.FrontPosition.DistanceTo2D(nearestCollectorWaypoint.Position) <= nearestCollectorWaypoint.CollectorRadius * 2) + while (nearestCollectorWaypoint != null && Vehicle && Driver && Vehicle.FrontPosition.DistanceTo2D(nearestCollectorWaypoint.Position) <= nearestCollectorWaypoint.CollectorRadius) { //Game.LogTrivial($"{Vehicle.Model.Name} is within 2x collector radius, cannot be fully dismissed yet."); GameFiber.Yield(); diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index adee813..757c7e2 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -68,7 +68,7 @@ namespace SceneManager { SetVehicleAndDriverPersistence(vehicle); CollectedVehicle newCollectedVehicle = AddVehicleToCollection(path, waypoint, vehicle); - + Logger.Log($"Vehicle's front position distance to waypoint: {vehicle.FrontPosition.DistanceTo2D(waypoint.Position)}, collector radius: {waypoint.CollectorRadius}"); GameFiber AssignTasksFiber = new GameFiber(() => AITasking.AssignWaypointTasks(newCollectedVehicle, path.Waypoints, waypoint)); AssignTasksFiber.Start(); } @@ -76,7 +76,7 @@ namespace SceneManager Vehicle[] GetNearbyVehiclesForCollection(Vector3 collectorWaypointPosition, float collectorRadius) { - return (from v in World.GetAllVehicles() where v.DistanceTo2D(collectorWaypointPosition) <= collectorRadius*2 && Math.Abs(collectorWaypointPosition.Z - v.Position.Z) < 3 && v.IsValidForCollection() select v).ToArray(); + return (from v in World.GetAllVehicles() where v.FrontPosition.DistanceTo2D(collectorWaypointPosition) <= collectorRadius && Math.Abs(collectorWaypointPosition.Z - v.Position.Z) < 3 && v.IsValidForCollection() select v).ToArray(); } } From 4d305aea1530595f0b9264238d71d2928b701703 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 5 Oct 2020 05:49:11 -0600 Subject: [PATCH 242/276] Directed vehicles are now dismissed properly from their paths and re-collected. --- SceneManager/Menus/PathMainMenu.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index ee3a79d..2097e75 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -240,7 +240,7 @@ namespace SceneManager if (selectedItem == directDriver) { - var nearbyVehicle = Game.LocalPlayer.Character.GetNearbyVehicles(1).Where(v => v.VehicleAndDriverValid()).SingleOrDefault(); + var nearbyVehicle = Game.LocalPlayer.Character.GetNearbyVehicles(1).Where(v => v != Game.LocalPlayer.Character.CurrentVehicle && v.VehicleAndDriverValid()).SingleOrDefault(); if (nearbyVehicle) { @@ -252,28 +252,32 @@ namespace SceneManager VehicleCollector.SetVehicleAndDriverPersistence(nearbyVehicle); + if(collectedVehicle != null) + { + collectedVehicle.Dismiss(); + collectedVehicle = null; + } + // The vehicle should only be added to the collection when it's not null AND if the selected item is First Waypoint OR if the selected item is nearestWaypoint AND nearestWaypoint is not null - if (collectedVehicle == null && (directOptions.SelectedItem == "First waypoint" || directOptions.SelectedItem == "Nearest waypoint" && nearestWaypoint != null)) + if (collectedVehicle == null && (directOptions.SelectedItem == "First waypoint" || (directOptions.SelectedItem == "Nearest waypoint" && nearestWaypoint != null))) { Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} not found in collection, adding now."); VehicleCollector.collectedVehicles.Add(new CollectedVehicle(nearbyVehicle, path)); collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle).FirstOrDefault(); + Logger.Log($"Collected vehicle is {collectedVehicle.Vehicle.Model.Name}"); } if (collectedVehicle == null) { return; } - + collectedVehicle.Directed = true; collectedVehicle.Driver.Tasks.Clear(); if (collectedVehicle.StoppedAtWaypoint) { collectedVehicle.StoppedAtWaypoint = false; Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, 0f, 1, true); } - collectedVehicle.Dismiss(); - collectedVehicle.Directed = true; - if (directOptions.SelectedItem == "First waypoint") { From 87e1b591f44bbc0f44d0fa3177b2c2b3bc1d1c2e Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 5 Oct 2020 06:11:47 -0600 Subject: [PATCH 243/276] Moved waypoint removal code to the Waypoint class --- SceneManager/Menus/EditWaypointMenu.cs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index d026d0a..3c171f4 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -185,7 +185,7 @@ namespace SceneManager editWaypoint.Index = editWaypoint.OptionCount - 1; editWaypointMenu.RefreshIndex(); updateWaypointPosition.Checked = false; - Logger.Log($"New waypoint (#{currentWaypoint.Number + 1}) added."); + Logger.Log($"New waypoint (#{currentPath.Waypoints.Last().Number}) added."); Blip CreateNewWaypointBlip() { @@ -230,11 +230,7 @@ namespace SceneManager } else { - currentWaypoint.Blip.Delete(); - if (currentWaypoint.CollectorRadiusBlip) - { - currentWaypoint.CollectorRadiusBlip.Delete(); - } + currentWaypoint.Remove(); currentPath.Waypoints.Remove(currentWaypoint); Logger.Log($"[Path {currentPath.Number}] Waypoint {currentWaypoint.Number} ({currentWaypoint.DrivingFlag}) removed"); From 5686363cb6e66fe778c40cee379365c169772640 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Mon, 5 Oct 2020 06:12:57 -0600 Subject: [PATCH 244/276] Fixed speed zones being added on non-collector waypoints. Fixed speed zone being created at the player's position instead of the waypoint's position. Added function to remove waypoint blips and speed zone. --- SceneManager/Object Classes/Waypoint.cs | 40 +++++++++++++++++-------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 03038df..7e933fa 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -31,18 +31,21 @@ namespace SceneManager IsCollector = collector; CollectorRadius = collectorRadius; SpeedZoneRadius = speedZoneRadius; - AddSpeedZone(); - CollectorRadiusBlip = new Blip(waypointBlip.Position, collectorRadius) + if (collector) { - Color = waypointBlip.Color, - }; - if (SettingsMenu.mapBlips.Checked) - { - CollectorRadiusBlip.Alpha = 0.5f; - } - else - { - CollectorRadiusBlip.Alpha = 0f; + AddSpeedZone(); + CollectorRadiusBlip = new Blip(waypointBlip.Position, collectorRadius) + { + Color = waypointBlip.Color, + }; + if (SettingsMenu.mapBlips.Checked) + { + CollectorRadiusBlip.Alpha = 0.5f; + } + else + { + CollectorRadiusBlip.Alpha = 0f; + } } DrawWaypointMarker(); } @@ -89,7 +92,7 @@ namespace SceneManager { IsCollector = true; RemoveSpeedZone(); - SpeedZone = World.AddSpeedZone(Game.LocalPlayer.Character.Position, SpeedZoneRadius, speed); + SpeedZone = World.AddSpeedZone(currentWaypoint.Position, SpeedZoneRadius, speed); Blip.Color = Color.Blue; if (CollectorRadiusBlip) { @@ -139,6 +142,19 @@ namespace SceneManager } } + internal void Remove() + { + if (Blip) + { + Blip.Delete(); + } + if (CollectorRadiusBlip) + { + CollectorRadiusBlip.Delete(); + } + RemoveSpeedZone(); + } + internal void AddSpeedZone() { SpeedZone = World.AddSpeedZone(Position, SpeedZoneRadius, Speed); From f0a5fb6d8051172e5157fde7d96bc42156962506 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Wed, 7 Oct 2020 05:00:29 -0600 Subject: [PATCH 245/276] Fixed vehicle and driver persistence not being set after dismissal/before recollection --- SceneManager/Menus/PathMainMenu.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index 2097e75..b4f78e4 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -240,7 +240,7 @@ namespace SceneManager if (selectedItem == directDriver) { - var nearbyVehicle = Game.LocalPlayer.Character.GetNearbyVehicles(1).Where(v => v != Game.LocalPlayer.Character.CurrentVehicle && v.VehicleAndDriverValid()).SingleOrDefault(); + var nearbyVehicle = Game.LocalPlayer.Character.GetNearbyVehicles(3).Where(v => v != Game.LocalPlayer.Character.CurrentVehicle && v.VehicleAndDriverValid()).FirstOrDefault(); if (nearbyVehicle) { @@ -250,16 +250,15 @@ namespace SceneManager var firstWaypoint = waypoints.First(); var nearestWaypoint = waypoints.Where(wp => wp.Position.DistanceTo2D(nearbyVehicle.FrontPosition) < wp.Position.DistanceTo2D(nearbyVehicle.RearPosition)).OrderBy(wp => wp.Position.DistanceTo2D(nearbyVehicle)).FirstOrDefault(); - VehicleCollector.SetVehicleAndDriverPersistence(nearbyVehicle); - if(collectedVehicle != null) { collectedVehicle.Dismiss(); collectedVehicle = null; } + VehicleCollector.SetVehicleAndDriverPersistence(nearbyVehicle); // The vehicle should only be added to the collection when it's not null AND if the selected item is First Waypoint OR if the selected item is nearestWaypoint AND nearestWaypoint is not null - if (collectedVehicle == null && (directOptions.SelectedItem == "First waypoint" || (directOptions.SelectedItem == "Nearest waypoint" && nearestWaypoint != null))) + if (collectedVehicle == null && directOptions.SelectedItem == "First waypoint" || (directOptions.SelectedItem == "Nearest waypoint" && nearestWaypoint != null)) { Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} not found in collection, adding now."); VehicleCollector.collectedVehicles.Add(new CollectedVehicle(nearbyVehicle, path)); From 159f7d28a39620aa759f2f051468e09d1e918cef Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Wed, 7 Oct 2020 05:01:00 -0600 Subject: [PATCH 246/276] Refactored Dismiss function to use local functions for each type of dismissal --- .../Object Classes/CollectedVehicle.cs | 56 ++++++++++++++----- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index 14bbfbc..e6ead13 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -39,17 +39,7 @@ namespace SceneManager if (dismissOption == DismissOption.FromWorld) { - Game.LogTrivial($"Dismissed {Vehicle.Model.Name} from the world"); - while (Vehicle.HasOccupants) - { - foreach(Ped occupant in Vehicle.Occupants) - { - occupant.Dismiss(); - occupant.Delete(); - } - GameFiber.Yield(); - } - Vehicle.Delete(); + DismissFromWorld(); return; } @@ -60,13 +50,49 @@ namespace SceneManager StoppedAtWaypoint = false; } - if(dismissOption == DismissOption.FromWaypoint && CurrentWaypoint.Number != Path.Waypoints.Count) + if(dismissOption == DismissOption.FromWaypoint) { - Logger.Log($"Dismissed from waypoint."); - SkipWaypoint = true; + DismissFromWaypoint(); } - if(dismissOption == DismissOption.FromWaypoint && CurrentWaypoint.Number == Path.Waypoints.Count || dismissOption == DismissOption.FromPath) + if(dismissOption == DismissOption.FromPath) + { + DismissFromPath(); + } + + void DismissFromWorld() + { + Game.LogTrivial($"Dismissed {Vehicle.Model.Name} from the world"); + while (Vehicle.HasOccupants) + { + foreach (Ped occupant in Vehicle.Occupants) + { + occupant.Dismiss(); + occupant.Delete(); + } + GameFiber.Yield(); + } + Vehicle.Delete(); + } + + void DismissFromWaypoint() + { + if (CurrentWaypoint == null || Path == null) + { + Logger.Log($"CurrentWaypoint or Path are null"); + } + else if (CurrentWaypoint?.Number != Path?.Waypoints.Count) + { + Logger.Log($"Dismissed from waypoint."); + SkipWaypoint = true; + } + else if (CurrentWaypoint?.Number == Path?.Waypoints.Count) + { + DismissFromPath(); + } + } + + void DismissFromPath() { Logger.Log($"Dismissing from path"); Dismissed = true; From aa13b6de6b16374b596c4e173a6ccfb2b4332d7e Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Wed, 7 Oct 2020 05:01:21 -0600 Subject: [PATCH 247/276] Added null check at beginning of tasking loop --- SceneManager/AITasking.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 487d5a4..383a620 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -69,7 +69,7 @@ namespace SceneManager Logger.Log($"{collectedVehicle.Vehicle.Model.Name} in the task loop"); collectedVehicle.SkipWaypoint = false; - if (collectedVehicle.Dismissed) + if (collectedVehicle.Dismissed || collectedVehicle == null) { Logger.Log($"Vehicle dismissed, return"); return; From 5a36a3582aa143a6aa416e006879e4ebf6e9a4bd Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Wed, 7 Oct 2020 05:06:44 -0600 Subject: [PATCH 248/276] Changed GetNearbyVehicles param value to max for getting nearby driver in directDriver option --- SceneManager/Menus/PathMainMenu.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index b4f78e4..2385dc0 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -240,7 +240,7 @@ namespace SceneManager if (selectedItem == directDriver) { - var nearbyVehicle = Game.LocalPlayer.Character.GetNearbyVehicles(3).Where(v => v != Game.LocalPlayer.Character.CurrentVehicle && v.VehicleAndDriverValid()).FirstOrDefault(); + var nearbyVehicle = Game.LocalPlayer.Character.GetNearbyVehicles(16).Where(v => v != Game.LocalPlayer.Character.CurrentVehicle && v.VehicleAndDriverValid()).FirstOrDefault(); if (nearbyVehicle) { From 0ad0136c3adc680b6d39e982caaf85c5124a880c Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 8 Oct 2020 05:45:42 -0600 Subject: [PATCH 249/276] Vehicle and driver persistence is now set when a vehicle is collected, inside the CollectedVehicle class. --- SceneManager/Menus/PathMainMenu.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index 2385dc0..a29ae0b 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -255,15 +255,15 @@ namespace SceneManager collectedVehicle.Dismiss(); collectedVehicle = null; } - VehicleCollector.SetVehicleAndDriverPersistence(nearbyVehicle); + //VehicleCollector.SetVehicleAndDriverPersistence(nearbyVehicle); // The vehicle should only be added to the collection when it's not null AND if the selected item is First Waypoint OR if the selected item is nearestWaypoint AND nearestWaypoint is not null if (collectedVehicle == null && directOptions.SelectedItem == "First waypoint" || (directOptions.SelectedItem == "Nearest waypoint" && nearestWaypoint != null)) { - Game.LogTrivial($"[Direct Driver] {nearbyVehicle.Model.Name} not found in collection, adding now."); + Game.LogTrivial($"[Direct Driver] Adding {nearbyVehicle.Model.Name} to collection."); VehicleCollector.collectedVehicles.Add(new CollectedVehicle(nearbyVehicle, path)); collectedVehicle = VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle == nearbyVehicle).FirstOrDefault(); - Logger.Log($"Collected vehicle is {collectedVehicle.Vehicle.Model.Name}"); + //Logger.Log($"Collected vehicle is {collectedVehicle.Vehicle.Model.Name}"); } if (collectedVehicle == null) From dcbf52c6bd19976ef6b492489832cd4716262709 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 8 Oct 2020 05:55:15 -0600 Subject: [PATCH 250/276] Added SetPersistence method to set vehicle and driver persistence when a vehicle is collected. --- SceneManager/Object Classes/CollectedVehicle.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index e6ead13..68cbf1f 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -21,6 +21,7 @@ namespace SceneManager Driver = vehicle.Driver; Path = path; CurrentWaypoint = currentWaypoint; + SetPersistence(); } internal CollectedVehicle(Vehicle vehicle, Path path) @@ -28,6 +29,14 @@ namespace SceneManager Vehicle = vehicle; Driver = vehicle.Driver; Path = path; + SetPersistence(); + } + + internal void SetPersistence() + { + Vehicle.IsPersistent = true; + Driver.IsPersistent = true; + Logger.Log($"{Vehicle.Model.Name} and driver are now persistent."); } internal void Dismiss(DismissOption dismissOption = DismissOption.FromPath) From 82c221355d6483c5e30958405216cf11c6621353 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 8 Oct 2020 05:55:53 -0600 Subject: [PATCH 251/276] Directed vehicles should now drive to their waypoint in accordance with the waypoint's driving flag. --- SceneManager/AITasking.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 383a620..fa4b3a7 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -21,7 +21,14 @@ 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}"); - collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)263075, acceptedDistance); + if(currentWaypoint.DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) + { + collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)17040299, acceptedDistance); + } + else + { + collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)263075, acceptedDistance); + } LoopWhileDrivingToDirectedWaypoint(acceptedDistance); } From a3b553cbff664d357d7b8113360b3b29b8cacc20 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 8 Oct 2020 05:56:20 -0600 Subject: [PATCH 252/276] Remove SetVehicleAndDriverPersistence method now that it is handled by the CollectedVehicle class --- SceneManager/VehicleCollector.cs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index 757c7e2..86c5dd9 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -66,7 +66,7 @@ namespace SceneManager var collectedVehicle = collectedVehicles.Where(cv => cv.Vehicle == vehicle).FirstOrDefault(); if(collectedVehicle == null) { - SetVehicleAndDriverPersistence(vehicle); + //SetVehicleAndDriverPersistence(vehicle); CollectedVehicle newCollectedVehicle = AddVehicleToCollection(path, waypoint, vehicle); Logger.Log($"Vehicle's front position distance to waypoint: {vehicle.FrontPosition.DistanceTo2D(waypoint.Position)}, collector radius: {waypoint.CollectorRadius}"); GameFiber AssignTasksFiber = new GameFiber(() => AITasking.AssignWaypointTasks(newCollectedVehicle, path.Waypoints, waypoint)); @@ -124,13 +124,5 @@ namespace SceneManager return false; } } - - internal static void SetVehicleAndDriverPersistence(Vehicle v) - { - v.IsPersistent = true; - v.Driver.IsPersistent = true; - v.Driver.BlockPermanentEvents = true; - v.Driver.Tasks.Clear(); - } } } From a47e736494ca2ed2d4ef796a10ec1d6d653d8fd4 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 8 Oct 2020 06:15:31 -0600 Subject: [PATCH 253/276] Refactored tasks for a directed driver into a local function. Removed dead code. --- SceneManager/AITasking.cs | 76 +++++++++++++-------------------------- 1 file changed, 25 insertions(+), 51 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index fa4b3a7..25cba93 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -4,6 +4,9 @@ using System.Linq; namespace SceneManager { + // Driving styles https://gtaforums.com/topic/822314-guide-driving-styles/ + // also https://vespura.com/fivem/drivingstyle/ + class AITasking { internal static void AssignWaypointTasks(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) @@ -15,20 +18,8 @@ namespace SceneManager if (currentWaypoint != null && collectedVehicle.Directed) { - collectedVehicle.Dismissed = false; - collectedVehicle.Directed = false; float acceptedDistance = GetAcceptedStoppingDistance(waypoints, waypoints.IndexOf(currentWaypoint)); - 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}"); - if(currentWaypoint.DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) - { - collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)17040299, acceptedDistance); - } - else - { - collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)263075, acceptedDistance); - } + AssignTasksForDirectedDriver(acceptedDistance); LoopWhileDrivingToDirectedWaypoint(acceptedDistance); } @@ -49,6 +40,23 @@ namespace SceneManager collectedVehicle.Dismiss(); } + void AssignTasksForDirectedDriver(float acceptedDistance) + { + collectedVehicle.Dismissed = false; + collectedVehicle.Directed = false; + //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}"); + if (currentWaypoint.DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) + { + collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)17040299, acceptedDistance); + } + else + { + collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)263075, acceptedDistance); + } + } + void LoopWhileDrivingToDirectedWaypoint(float acceptedDistance) { while (VehicleAndDriverAreValid(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(currentWaypoint.Position) > acceptedDistance) @@ -73,12 +81,12 @@ namespace SceneManager Logger.Log($"Preparing to run task loop for {collectedVehicle.Vehicle.Model.Name}"); for (int currentWaypointTask = currentWaypoint.Number; currentWaypointTask < waypoints.Count; currentWaypointTask++) { - Logger.Log($"{collectedVehicle.Vehicle.Model.Name} in the task loop"); + //Logger.Log($"{collectedVehicle.Vehicle.Model.Name} in the task loop"); collectedVehicle.SkipWaypoint = false; if (collectedVehicle.Dismissed || collectedVehicle == null) { - Logger.Log($"Vehicle dismissed, return"); + Logger.Log($"Vehicle dismissed or null, return"); return; } @@ -119,7 +127,9 @@ namespace SceneManager { return; } + driver.Tasks.PerformDrivingManeuver(collectedVehicle.Vehicle, VehicleManeuver.GoForwardWithCustomSteeringAngle, 3).WaitForCompletion(); + // Do we need this? if (driver) { driver.Tasks.Clear(); @@ -131,17 +141,6 @@ namespace SceneManager { while (VehicleAndDriverAreValid(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && waypoints.ElementAtOrDefault(nextWaypoint) != null && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position) > acceptedDistance) { - //Logger.Log($"Dismissed: {collectedVehicle.Dismissed} SkipWaypoint: {collectedVehicle.SkipWaypoint}"); - //if (waypoints[nextWaypoint].DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) - //{ - // driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)17040299, acceptedDistance); - //} - //else - //{ - // driver.Tasks.DriveToPosition(waypoints[nextWaypoint].Position, waypoints[nextWaypoint].Speed, (VehicleDrivingFlags)263075, acceptedDistance); - //} - //Logger.Log($"Looping while {collectedVehicle.Vehicle.Model.Name} drives to waypoint {waypoints[nextWaypoint].Number} ({collectedVehicle.Vehicle.DistanceTo2D(waypoints[nextWaypoint].Position)}m away from collector radius {waypoints[nextWaypoint].CollectorRadius})"); - //Logger.Log($"Distance of front of vehicle to waypoint: {collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position)}"); GameFiber.Sleep(100); } } @@ -183,31 +182,6 @@ namespace SceneManager return true; } - private static bool VehicleAndDriverAreValid(List waypoints, int nextWaypoint, CollectedVehicle collectedVehicle) - { - if (waypoints.ElementAtOrDefault(nextWaypoint) == null) - { - Logger.Log($"Waypoint is null"); - return false; - } - if(collectedVehicle == null) - { - Logger.Log($"CollectedVehicle is null"); - return false; - } - if (!collectedVehicle.Vehicle) - { - Logger.Log($"Vehicle is null"); - return false; - } - if (!collectedVehicle.Driver) - { - Logger.Log($"Driver is null"); - return false; - } - return true; - } - private static void StopVehicleAtWaypoint(Waypoint currentWaypoint, CollectedVehicle collectedVehicle) { if (!VehicleAndDriverAreValid(collectedVehicle)) From b17135814c71d8ba9fac4c31858364a232191a34 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 8 Oct 2020 06:15:48 -0600 Subject: [PATCH 254/276] Removed irrelevant comment --- SceneManager/VehicleCollector.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index 86c5dd9..babb56a 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -8,9 +8,6 @@ namespace SceneManager { internal static class VehicleCollector { - // Driving styles https://gtaforums.com/topic/822314-guide-driving-styles/ - // also https://vespura.com/fivem/drivingstyle/ - internal static List collectedVehicles = new List(); internal static void StartCollectingAtWaypoint(List paths, Path path, Waypoint waypoint) From a68de1d56a9c6fd4bbe42bf8bb44f6872c2a8bc8 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 10 Oct 2020 07:29:39 -0600 Subject: [PATCH 255/276] Fixed vehicles being dismissed prematurely when directed from one path to another. --- SceneManager/Menus/PathMainMenu.cs | 23 +---- .../Object Classes/CollectedVehicle.cs | 86 ++++++++++++++----- 2 files changed, 69 insertions(+), 40 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index a29ae0b..3a10a37 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -12,7 +12,8 @@ namespace SceneManager { FromPath = 0, FromWaypoint = 1, - FromWorld = 2 + FromWorld = 2, + FromDirect = 3 } static class PathMainMenu @@ -141,11 +142,7 @@ namespace SceneManager { cv.Driver.GetAttachedBlip().Delete(); } - Logger.Log($"{cv.Vehicle.Model.Name} task status before clear/dismiss: {cv.Driver.Tasks.CurrentTaskStatus.ToString()}"); - cv.Driver.Tasks.Clear(); - cv.Driver.Tasks.ClearSecondary(); cv.Driver.Dismiss(); - Logger.Log($"{cv.Vehicle.Model.Name} task status after clear/dismiss: {cv.Driver.Tasks.CurrentTaskStatus.ToString()}"); cv.Vehicle.IsSirenOn = false; cv.Vehicle.IsSirenSilent = true; cv.Vehicle.Dismiss(); @@ -250,13 +247,6 @@ namespace SceneManager var firstWaypoint = waypoints.First(); var nearestWaypoint = waypoints.Where(wp => wp.Position.DistanceTo2D(nearbyVehicle.FrontPosition) < wp.Position.DistanceTo2D(nearbyVehicle.RearPosition)).OrderBy(wp => wp.Position.DistanceTo2D(nearbyVehicle)).FirstOrDefault(); - if(collectedVehicle != null) - { - collectedVehicle.Dismiss(); - collectedVehicle = null; - } - //VehicleCollector.SetVehicleAndDriverPersistence(nearbyVehicle); - // The vehicle should only be added to the collection when it's not null AND if the selected item is First Waypoint OR if the selected item is nearestWaypoint AND nearestWaypoint is not null if (collectedVehicle == null && directOptions.SelectedItem == "First waypoint" || (directOptions.SelectedItem == "Nearest waypoint" && nearestWaypoint != null)) { @@ -272,17 +262,12 @@ namespace SceneManager } collectedVehicle.Directed = true; collectedVehicle.Driver.Tasks.Clear(); - if (collectedVehicle.StoppedAtWaypoint) - { - collectedVehicle.StoppedAtWaypoint = false; - Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, 0f, 1, true); - } if (directOptions.SelectedItem == "First waypoint") { GameFiber.StartNew(() => { - AITasking.AssignWaypointTasks(collectedVehicle, waypoints, firstWaypoint); + AITasking.AssignWaypointTasks(collectedVehicle, path, firstWaypoint); }); } else @@ -291,7 +276,7 @@ namespace SceneManager { GameFiber.StartNew(() => { - AITasking.AssignWaypointTasks(collectedVehicle, waypoints, nearestWaypoint); + AITasking.AssignWaypointTasks(collectedVehicle, path, nearestWaypoint); }); } } diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index 68cbf1f..efe0ed9 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -14,6 +14,7 @@ namespace SceneManager internal bool Dismissed { get; set; } = false; internal bool Directed { get; set; } = false; internal bool SkipWaypoint { get; set; } = false; + internal bool ReadyForDirectTasks { get; set; } = false; internal CollectedVehicle(Vehicle vehicle, Path path, Waypoint currentWaypoint) { @@ -52,14 +53,16 @@ namespace SceneManager return; } - Driver.Tasks.Clear(); if(StoppedAtWaypoint) { Logger.Log($"Unstucking {Vehicle.Model.Name}"); StoppedAtWaypoint = false; + Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(Vehicle, 0f, 1, true); + Driver.Tasks.CruiseWithVehicle(5f); } + Driver.Tasks.Clear(); - if(dismissOption == DismissOption.FromWaypoint) + if (dismissOption == DismissOption.FromWaypoint) { DismissFromWaypoint(); } @@ -69,6 +72,11 @@ namespace SceneManager DismissFromPath(); } + if(dismissOption == DismissOption.FromDirect) + { + DismissFromDirect(); + } + void DismissFromWorld() { Game.LogTrivial($"Dismissed {Vehicle.Model.Name} from the world"); @@ -105,12 +113,64 @@ namespace SceneManager { Logger.Log($"Dismissing from path"); Dismissed = true; + + // Check if the vehicle is near any of the path's collector waypoints GameFiber.StartNew(() => { - // check if the vehicle is near any of the path's collector waypoints var nearestCollectorWaypoint = Path.Waypoints.Where(wp => wp.IsCollector).OrderBy(wp => Vehicle.DistanceTo2D(wp.Position)).FirstOrDefault(); - if(nearestCollectorWaypoint != null) + if (nearestCollectorWaypoint != null) { + // Enabling this will keep the menu, but the dismissed vehicle is immediately re - collected + while (nearestCollectorWaypoint != null && Vehicle && Vehicle.HasDriver && Driver && Driver.IsAlive && Vehicle.FrontPosition.DistanceTo2D(nearestCollectorWaypoint.Position) <= nearestCollectorWaypoint.CollectorRadius) + { + //Game.LogTrivial($"{Vehicle.Model.Name} is within 2x collector radius, cannot be fully dismissed yet."); + GameFiber.Yield(); + } + } + else + { + Logger.Log($"Nearest collector is null"); + } + + if (!Vehicle || !Driver) + { + return; + } + + if (!Directed) + { + VehicleCollector.collectedVehicles.Remove(this); + Logger.Log($"{Vehicle.Model.Name} dismissed successfully."); + if (Driver) + { + if (Driver.GetAttachedBlip()) + { + Driver.GetAttachedBlip().Delete(); + } + Driver.BlockPermanentEvents = false; + Driver.Dismiss(); + } + if (Vehicle) + { + Vehicle.IsSirenOn = false; + Vehicle.IsSirenSilent = true; + Vehicle.Dismiss(); + } + } + }); + + } + + void DismissFromDirect() + { + Logger.Log($"Dismissing from direct."); + ReadyForDirectTasks = false; + GameFiber.StartNew(() => + { + var nearestCollectorWaypoint = Path.Waypoints.Where(wp => wp.IsCollector).OrderBy(wp => Vehicle.DistanceTo2D(wp.Position)).FirstOrDefault(); + if (nearestCollectorWaypoint != null) + { + // Enabling this will keep the menu, but the dismissed vehicle is immediately re - collected while (nearestCollectorWaypoint != null && Vehicle && Driver && Vehicle.FrontPosition.DistanceTo2D(nearestCollectorWaypoint.Position) <= nearestCollectorWaypoint.CollectorRadius) { //Game.LogTrivial($"{Vehicle.Model.Name} is within 2x collector radius, cannot be fully dismissed yet."); @@ -122,23 +182,7 @@ namespace SceneManager Logger.Log($"Nearest collector is null"); } - - if (!Vehicle || !Driver) - { - return; - } - - VehicleCollector.collectedVehicles.Remove(this); - Logger.Log($"{Vehicle.Model.Name} dismissed successfully."); - if (Driver.GetAttachedBlip()) - { - Driver.GetAttachedBlip().Delete(); - } - Driver.BlockPermanentEvents = false; - Driver.Dismiss(); - Vehicle.IsSirenOn = false; - Vehicle.IsSirenSilent = true; - Vehicle.Dismiss(); + ReadyForDirectTasks = true; }); } } From 86206688b4853a2a9713b51b155c828bddf851ce Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 10 Oct 2020 07:30:14 -0600 Subject: [PATCH 256/276] AssignWaypointTasks now takes a Path parameter instead of a collection of Waypoints --- SceneManager/AITasking.cs | 85 +++++++++++++++++++++----------- SceneManager/VehicleCollector.cs | 2 +- 2 files changed, 56 insertions(+), 31 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 25cba93..88e46d8 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -9,7 +9,7 @@ namespace SceneManager class AITasking { - internal static void AssignWaypointTasks(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) + internal static void AssignWaypointTasks(CollectedVehicle collectedVehicle, Path path, Waypoint currentWaypoint) { if (!VehicleAndDriverAreValid(collectedVehicle)) { @@ -18,35 +18,46 @@ namespace SceneManager if (currentWaypoint != null && collectedVehicle.Directed) { - float acceptedDistance = GetAcceptedStoppingDistance(waypoints, waypoints.IndexOf(currentWaypoint)); + float acceptedDistance = GetAcceptedStoppingDistance(path.Waypoints, path.Waypoints.IndexOf(currentWaypoint)); + while (!collectedVehicle.ReadyForDirectTasks) + { + GameFiber.Yield(); + } AssignTasksForDirectedDriver(acceptedDistance); LoopWhileDrivingToDirectedWaypoint(acceptedDistance); + collectedVehicle.Directed = false; + Logger.Log($"{collectedVehicle.Vehicle.Model.Name} directed task is complete, directed is now false"); } if (currentWaypoint.DrivingFlag == VehicleDrivingFlags.StopAtDestination) { StopVehicleAtWaypoint(currentWaypoint, collectedVehicle); } - DriveVehicleToNextWaypoint(collectedVehicle, waypoints, currentWaypoint); + if(currentWaypoint != path?.Waypoints?.Last()) + { + DriveVehicleToNextWaypoint(collectedVehicle, path, currentWaypoint); + } if (!VehicleAndDriverAreValid(collectedVehicle)) { return; } - Logger.Log($"{collectedVehicle.Vehicle.Model.Name} all tasks complete."); - if (!collectedVehicle.Dismissed) + Logger.Log($"{collectedVehicle.Vehicle.Model.Name} all Path {path.Number} tasks complete."); + if (collectedVehicle.Directed) + { + collectedVehicle.Dismiss(DismissOption.FromDirect); + } + else if(!collectedVehicle.Dismissed) { - Logger.Log($"Dismissing {collectedVehicle.Vehicle.Model.Name} from path"); collectedVehicle.Dismiss(); } void AssignTasksForDirectedDriver(float acceptedDistance) { - collectedVehicle.Dismissed = false; - collectedVehicle.Directed = false; //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}"); + 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}"); if (currentWaypoint.DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) { collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)17040299, acceptedDistance); @@ -61,13 +72,13 @@ namespace SceneManager { while (VehicleAndDriverAreValid(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(currentWaypoint.Position) > acceptedDistance) { - //Logger.Log($"Looping while {collectedVehicle.Vehicle.Model.Name} drives to waypoint {currentWaypoint.Number} ({collectedVehicle.Vehicle.DistanceTo2D(currentWaypoint.Position)}m away)"); + //Logger.Log($"Looping while {collectedVehicle.Vehicle.Model.Name} drives to path {path.Number} waypoint {currentWaypoint.Number}"); GameFiber.Yield(); } } } - private static void DriveVehicleToNextWaypoint(CollectedVehicle collectedVehicle, List waypoints, Waypoint currentWaypoint) + private static void DriveVehicleToNextWaypoint(CollectedVehicle collectedVehicle, Path path, Waypoint currentWaypoint) { if (!VehicleAndDriverAreValid(collectedVehicle) || currentWaypoint == null || currentWaypoint.Path == null) { @@ -78,32 +89,37 @@ namespace SceneManager var vehicle = collectedVehicle.Vehicle; var driver = vehicle.Driver; - Logger.Log($"Preparing to run task loop for {collectedVehicle.Vehicle.Model.Name}"); - for (int currentWaypointTask = currentWaypoint.Number; currentWaypointTask < waypoints.Count; currentWaypointTask++) + Logger.Log($"Preparing to run task loop for {collectedVehicle.Vehicle.Model.Name} on path {path.Number}"); + for (int currentWaypointTask = currentWaypoint.Number; currentWaypointTask < path.Waypoints.Count; currentWaypointTask++) { //Logger.Log($"{collectedVehicle.Vehicle.Model.Name} in the task loop"); collectedVehicle.SkipWaypoint = false; - if (collectedVehicle.Dismissed || collectedVehicle == null) + if (collectedVehicle == null || collectedVehicle.Dismissed || collectedVehicle.Directed) { Logger.Log($"Vehicle dismissed or null, return"); return; } - - if (waypoints.ElementAtOrDefault(currentWaypointTask) != null && !collectedVehicle.StoppedAtWaypoint) + if(collectedVehicle.Driver == null || !collectedVehicle.Vehicle.HasDriver || !collectedVehicle.Driver.IsAlive) { - collectedVehicle.CurrentWaypoint = waypoints[currentWaypointTask]; - //Logger.Log($"{collectedVehicle.Vehicle.Model.Name} current waypoint: {collectedVehicle.CurrentWaypoint.Number}"); - float acceptedDistance = GetAcceptedStoppingDistance(waypoints, currentWaypointTask); + Logger.Log($"{vehicle.Model.Name} does not have a driver/driver is null or driver is dead."); + } - Logger.Log($"{vehicle.Model.Name} is driving to path {currentWaypoint.Path.Number} waypoint {waypoints[currentWaypointTask].Number}"); - if (waypoints[currentWaypointTask].DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) + if (path.Waypoints.ElementAtOrDefault(currentWaypointTask) != null && !collectedVehicle.StoppedAtWaypoint) + { + collectedVehicle.CurrentWaypoint = path.Waypoints[currentWaypointTask]; + //Logger.Log($"{collectedVehicle.Vehicle.Model.Name} current waypoint: {collectedVehicle.CurrentWaypoint.Number}"); + float acceptedDistance = GetAcceptedStoppingDistance(path.Waypoints, currentWaypointTask); + + Logger.Log($"{vehicle.Model.Name} is driving to path {currentWaypoint.Path.Number} waypoint {path.Waypoints[currentWaypointTask].Number}"); + Logger.Log($"{vehicle.Model.Name} driver is persistent: {driver.IsPersistent}"); + if (path.Waypoints[currentWaypointTask].DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) { - driver.Tasks.DriveToPosition(waypoints[currentWaypointTask].Position, waypoints[currentWaypointTask].Speed, (VehicleDrivingFlags)17040299, acceptedDistance); + driver.Tasks.DriveToPosition(path.Waypoints[currentWaypointTask].Position, path.Waypoints[currentWaypointTask].Speed, (VehicleDrivingFlags)17040299, acceptedDistance); } else { - driver.Tasks.DriveToPosition(waypoints[currentWaypointTask].Position, waypoints[currentWaypointTask].Speed, (VehicleDrivingFlags)263075, acceptedDistance); + driver.Tasks.DriveToPosition(path.Waypoints[currentWaypointTask].Position, path.Waypoints[currentWaypointTask].Speed, (VehicleDrivingFlags)263075, acceptedDistance); } LoopWhileDrivingToWaypoint(currentWaypointTask, acceptedDistance); @@ -118,9 +134,9 @@ namespace SceneManager continue; } - if (!collectedVehicle.Dismissed && waypoints.ElementAtOrDefault(currentWaypointTask) != null && waypoints[currentWaypointTask].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + if (!collectedVehicle.Dismissed && path.Waypoints.ElementAtOrDefault(currentWaypointTask) != null && path.Waypoints[currentWaypointTask].DrivingFlag == VehicleDrivingFlags.StopAtDestination) { - StopVehicleAtWaypoint(waypoints[currentWaypointTask], collectedVehicle); + StopVehicleAtWaypoint(path.Waypoints[currentWaypointTask], collectedVehicle); } if (!VehicleAndDriverAreValid(collectedVehicle) || collectedVehicle.Dismissed) @@ -139,7 +155,7 @@ namespace SceneManager void LoopWhileDrivingToWaypoint(int nextWaypoint, float acceptedDistance) { - while (VehicleAndDriverAreValid(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && waypoints.ElementAtOrDefault(nextWaypoint) != null && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(waypoints[nextWaypoint].Position) > acceptedDistance) + while (VehicleAndDriverAreValid(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && path.Waypoints.ElementAtOrDefault(nextWaypoint) != null && collectedVehicle.Vehicle.FrontPosition.DistanceTo2D(path.Waypoints[nextWaypoint].Position) > acceptedDistance) { GameFiber.Sleep(100); } @@ -169,14 +185,22 @@ namespace SceneManager Logger.Log($"CollectedVehicle is null"); return false; } - if (!collectedVehicle.Vehicle) + if (!collectedVehicle.Vehicle && !collectedVehicle.Dismissed) { Logger.Log($"Vehicle is null"); + collectedVehicle.Dismiss(); + //if(collectedVehicle.Driver) + //{ + // collectedVehicle.Driver.IsPersistent = false; + //} return false; } - if (!collectedVehicle.Driver) + if (!collectedVehicle.Driver || !collectedVehicle.Driver.IsAlive && !collectedVehicle.Dismissed) { - Logger.Log($"Driver is null"); + collectedVehicle.Dismiss(); + //Logger.Log($"{collectedVehicle.Vehicle.Model.Name} driver is null or dead"); + //Logger.Log($"{collectedVehicle.Vehicle.Model.Name} persistent: {collectedVehicle.Vehicle.IsPersistent}"); + //collectedVehicle.Vehicle.IsPersistent = false; return false; } return true; @@ -194,12 +218,13 @@ namespace SceneManager Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, stoppingDistance, -1, true); collectedVehicle.StoppedAtWaypoint = true; - while (currentWaypoint != null && VehicleAndDriverAreValid(collectedVehicle) && collectedVehicle.StoppedAtWaypoint) + while (currentWaypoint != null && VehicleAndDriverAreValid(collectedVehicle) && collectedVehicle.StoppedAtWaypoint && !collectedVehicle.Directed) { GameFiber.Yield(); } if(collectedVehicle.Vehicle && collectedVehicle.Driver) { + Logger.Log($"{collectedVehicle.Vehicle.Model.Name} releasing from stop waypoint."); Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(collectedVehicle.Vehicle, 0f, 1, true); collectedVehicle.Driver.Tasks.CruiseWithVehicle(5f); } diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index babb56a..b1ad917 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -66,7 +66,7 @@ namespace SceneManager //SetVehicleAndDriverPersistence(vehicle); CollectedVehicle newCollectedVehicle = AddVehicleToCollection(path, waypoint, vehicle); Logger.Log($"Vehicle's front position distance to waypoint: {vehicle.FrontPosition.DistanceTo2D(waypoint.Position)}, collector radius: {waypoint.CollectorRadius}"); - GameFiber AssignTasksFiber = new GameFiber(() => AITasking.AssignWaypointTasks(newCollectedVehicle, path.Waypoints, waypoint)); + GameFiber AssignTasksFiber = new GameFiber(() => AITasking.AssignWaypointTasks(newCollectedVehicle, path, waypoint)); AssignTasksFiber.Start(); } } From b7601920242f2a9409305312144fd60ab7a23c74 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 10 Oct 2020 07:31:47 -0600 Subject: [PATCH 257/276] Drivers now block permanent events upon collection --- SceneManager/Object Classes/CollectedVehicle.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index efe0ed9..d82dbfe 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -37,6 +37,7 @@ namespace SceneManager { Vehicle.IsPersistent = true; Driver.IsPersistent = true; + Driver.BlockPermanentEvents = true; Logger.Log($"{Vehicle.Model.Name} and driver are now persistent."); } From 526ff83f902d6aebe5984e6162a3c9263559857e Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 10 Oct 2020 15:52:14 -0600 Subject: [PATCH 258/276] Replaced waypoint type scroller item with checkboxes. Rearranged order of some menu items. --- SceneManager/Menus/EditWaypointMenu.cs | 42 +++++++++++++++++--------- SceneManager/Menus/PathCreationMenu.cs | 30 ++++++++++-------- 2 files changed, 45 insertions(+), 27 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 3c171f4..249800b 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -18,6 +18,8 @@ namespace SceneManager internal static UIMenuNumericScrollerItem editWaypoint; internal static UIMenuListScrollerItem changeWaypointType = new UIMenuListScrollerItem("Waypoint Type", "", waypointTypes); private static UIMenuNumericScrollerItem changeWaypointSpeed; + internal static UIMenuCheckboxItem stopWaypointType; + internal static UIMenuCheckboxItem directWaypointBehavior = new UIMenuCheckboxItem("Drive directly to waypoint?", false, "If checked, vehicles will ignore traffic rules and drive directly to this waypoint."); internal static UIMenuCheckboxItem collectorWaypoint; internal static UIMenuNumericScrollerItem changeCollectorRadius = new UIMenuNumericScrollerItem("Collection Radius", "The distance from this waypoint (in meters) vehicles will be collected", 1, 50, 1); internal static UIMenuNumericScrollerItem changeSpeedZoneRadius = new UIMenuNumericScrollerItem("Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 5, 200, 5); @@ -46,12 +48,6 @@ namespace SceneManager //Logger.Log($"Current waypoint: {currentWaypoint.Number}, Driving flag: {currentWaypoint.DrivingFlag.ToString()}"); if(currentWaypoint != null) { - editWaypointMenu.AddItem(changeWaypointType); - changeWaypointType.Index = Array.IndexOf(drivingFlags, currentWaypoint.DrivingFlag); - - editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 100, 5)); - changeWaypointSpeed.Value = (int)MathHelper.ConvertMetersPerSecondToMilesPerHour(currentWaypoint.Speed); - editWaypointMenu.AddItem(collectorWaypoint = new UIMenuCheckboxItem("Collector", currentWaypoint.IsCollector, "If this waypoint will collect vehicles to follow the path")); editWaypointMenu.AddItem(changeCollectorRadius); @@ -67,6 +63,16 @@ namespace SceneManager changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; changeSpeedZoneRadius.Enabled = collectorWaypoint.Checked ? true : false; + editWaypointMenu.AddItem(stopWaypointType = new UIMenuCheckboxItem("Is this a Stop waypoint?", currentWaypoint.IsStopWaypoint, "If checked, vehicles will drive to this waypoint, then stop.")); + editWaypointMenu.AddItem(directWaypointBehavior); + if(currentWaypoint.DrivingFlag == (VehicleDrivingFlags)17040299) + { + directWaypointBehavior.Checked = true; + } + + editWaypointMenu.AddItem(changeWaypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 100, 5)); + changeWaypointSpeed.Value = (int)MathHelper.ConvertMetersPerSecondToMilesPerHour(currentWaypoint.Speed); + editWaypointMenu.AddItem(updateWaypointPosition); editWaypointMenu.AddItem(updateWaypoint); updateWaypoint.ForeColor = Color.Gold; @@ -100,8 +106,11 @@ namespace SceneManager if (scrollerItem == editWaypoint) { - changeWaypointType.Index = Array.IndexOf(drivingFlags, currentWaypoint.DrivingFlag); + //changeWaypointType.Index = Array.IndexOf(drivingFlags, currentWaypoint.DrivingFlag); + changeWaypointSpeed.Value = (int)MathHelper.ConvertMetersPerSecondToMilesPerHour(currentWaypoint.Speed); + stopWaypointType.Checked = currentWaypoint.IsStopWaypoint; + directWaypointBehavior.Checked = currentWaypoint.DrivingFlag == (VehicleDrivingFlags)17040299 ? true : false; collectorWaypoint.Checked = currentWaypoint.IsCollector; changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; changeCollectorRadius.Value = (int)currentWaypoint.CollectorRadius; @@ -114,7 +123,10 @@ namespace SceneManager { if (changeCollectorRadius.Value > changeSpeedZoneRadius.Value) { - changeSpeedZoneRadius.ScrollToNextOption(); + while(changeCollectorRadius.Value > changeSpeedZoneRadius.Value) + { + changeSpeedZoneRadius.ScrollToNextOption(); + } } } @@ -140,19 +152,20 @@ namespace SceneManager { var currentPath = PathMainMenu.paths[PathMainMenu.editPath.Index]; var currentWaypoint = currentPath.Waypoints[editWaypoint.Index]; + VehicleDrivingFlags drivingFlag = directWaypointBehavior.Checked ? (VehicleDrivingFlags)17040299 : (VehicleDrivingFlags)263075; if (selectedItem == updateWaypoint) { if(currentPath.Waypoints.Count == 1) { - currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], SetDriveSpeedForWaypoint(), true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, updateWaypointPosition.Checked); + currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlag, stopWaypointType.Checked, SetDriveSpeedForWaypoint(), true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, updateWaypointPosition.Checked); } else { - currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], SetDriveSpeedForWaypoint(), collectorWaypoint.Checked, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, updateWaypointPosition.Checked); + currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlag, stopWaypointType.Checked, SetDriveSpeedForWaypoint(), collectorWaypoint.Checked, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, updateWaypointPosition.Checked); } - Logger.Log($"Updated path {currentPath.Number} waypoint {currentWaypoint.Number}: Driving flag is {drivingFlags[changeWaypointType.Index].ToString()}, speed is {changeWaypointSpeed.Value}, collector is {currentWaypoint.IsCollector}"); + Logger.Log($"Path {currentPath.Number} Waypoint {currentWaypoint.Number} updated [Driving style: {(DrivingFlagType)drivingFlag} | Stop waypoint: {stopWaypointType.Checked} | Speed: {changeWaypointSpeed.Value} | Collector: {currentWaypoint.IsCollector}]"); updateWaypointPosition.Checked = false; Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Waypoint {currentWaypoint.Number} updated."); @@ -163,7 +176,6 @@ namespace SceneManager if (selectedItem == addAsNewWaypoint) { var pathIndex = PathMainMenu.paths.IndexOf(currentPath); - var drivingFlag = drivingFlags[changeWaypointType.Index]; var newWaypointBlip = CreateNewWaypointBlip(); if (!currentPath.IsEnabled) { @@ -172,11 +184,11 @@ namespace SceneManager if (collectorWaypoint.Checked) { - currentPath.Waypoints.Add(new Waypoint(currentPath, currentPath.Waypoints.Last().Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, newWaypointBlip, true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value)); + currentPath.Waypoints.Add(new Waypoint(currentPath, currentPath.Waypoints.Last().Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, stopWaypointType.Checked, newWaypointBlip, true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value)); } else { - currentPath.Waypoints.Add(new Waypoint(currentPath, currentPath.Waypoints.Last().Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, newWaypointBlip)); + currentPath.Waypoints.Add(new Waypoint(currentPath, currentPath.Waypoints.Last().Number + 1, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, stopWaypointType.Checked, newWaypointBlip)); } editWaypointMenu.RemoveItemAt(0); @@ -247,7 +259,7 @@ namespace SceneManager { Hints.Display($"~o~Scene Manager\n~y~[Hint]~w~ Your path's first waypoint ~b~must~w~ be a collector. If it's not, it will automatically be made into one."); Logger.Log($"The path only has 1 waypoint left, this waypoint must be a collector."); - currentPath.Waypoints[0].UpdateWaypoint(currentWaypoint, drivingFlags[changeWaypointType.Index], SetDriveSpeedForWaypoint(), true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, updateWaypointPosition.Checked); + currentPath.Waypoints[0].UpdateWaypoint(currentWaypoint, drivingFlag, stopWaypointType.Checked, SetDriveSpeedForWaypoint(), true, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, updateWaypointPosition.Checked); collectorWaypoint.Checked = true; changeCollectorRadius.Enabled = true; changeSpeedZoneRadius.Enabled = true; diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index 7fcec61..e280897 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -10,14 +10,15 @@ namespace SceneManager { class PathCreationMenu { - private static VehicleDrivingFlags[] drivingFlags = new VehicleDrivingFlags[] { VehicleDrivingFlags.Normal, VehicleDrivingFlags.IgnorePathFinding, VehicleDrivingFlags.StopAtDestination }; // Implement custom driving flag for normal private static string[] waypointTypes = new string[] { "Drive To (Normal)", "Drive To (Direct)", "Stop" }; internal static UIMenu pathCreationMenu = new UIMenu("Scene Manager", "~o~Path Creation Menu"); private static UIMenuItem trafficAddWaypoint = new UIMenuItem("Add waypoint"), trafficRemoveWaypoint = new UIMenuItem("Remove last waypoint"), trafficEndPath = new UIMenuItem("End path creation"); internal static UIMenuListScrollerItem waypointType = new UIMenuListScrollerItem("Waypoint Type", $"~b~Drive To (Normal): ~w~AI obeys traffic as much as possible{Environment.NewLine}~b~Drive To (Direct): ~w~AI ignores pathfinding rules{Environment.NewLine}~b~Stop: ~w~AI stops at the waypoint until dismissed", waypointTypes); private static UIMenuNumericScrollerItem waypointSpeed; - internal static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If this waypoint will collect vehicles to follow the path. Your path's first waypoint ~b~must~w~ be a collector."); + internal static UIMenuCheckboxItem stopWaypointType = new UIMenuCheckboxItem("Is this a Stop waypoint?", false, "If checked, vehicles will drive to this waypoint, then stop."); + internal static UIMenuCheckboxItem directWaypointBehavior = new UIMenuCheckboxItem("Drive directly to waypoint?", false, "If checked, vehicles will ignore traffic rules and drive directly to this waypoint."); + internal static UIMenuCheckboxItem collectorWaypoint = new UIMenuCheckboxItem("Collector", true, "If chcked, this waypoint will collect vehicles to follow the path. Your path's first waypoint ~b~must~w~ be a collector."); internal static UIMenuNumericScrollerItem collectorRadius = new UIMenuNumericScrollerItem("Collection Radius", "The distance from this waypoint (in meters) vehicles will be collected", 1, 50, 1); internal static UIMenuNumericScrollerItem speedZoneRadius = new UIMenuNumericScrollerItem("Speed Zone Radius", "The distance from this collector waypoint (in meters) non-collected vehicles will drive at this waypoint's speed", 5, 200, 5); @@ -29,11 +30,6 @@ namespace SceneManager internal static void BuildPathCreationMenu() { - pathCreationMenu.AddItem(waypointType); - - pathCreationMenu.AddItem(waypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to the waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 100, 5)); - waypointSpeed.Index = 0; - pathCreationMenu.AddItem(collectorWaypoint); collectorWaypoint.Enabled = false; collectorWaypoint.Checked = true; @@ -46,6 +42,12 @@ namespace SceneManager speedZoneRadius.Index = 0; speedZoneRadius.Enabled = true; + pathCreationMenu.AddItem(stopWaypointType); + pathCreationMenu.AddItem(directWaypointBehavior); + + pathCreationMenu.AddItem(waypointSpeed = new UIMenuNumericScrollerItem("Waypoint Speed", $"How fast the AI will drive to this waypoint in ~b~{SettingsMenu.speedUnits.SelectedItem}", 5, 100, 5)); + waypointSpeed.Index = 0; + pathCreationMenu.AddItem(trafficAddWaypoint); trafficAddWaypoint.ForeColor = Color.Gold; @@ -91,16 +93,17 @@ namespace SceneManager var pathIndex = PathMainMenu.paths.IndexOf(firstNonNullPath); var pathNumber = firstNonNullPath.Number; var waypointNumber = PathMainMenu.paths[pathIndex].Waypoints.Count + 1; + VehicleDrivingFlags drivingFlag = directWaypointBehavior.Checked ? (VehicleDrivingFlags)17040299 : (VehicleDrivingFlags)263075; if (collectorWaypoint.Checked) { - PathMainMenu.paths[pathIndex].Waypoints.Add(new Waypoint(firstNonNullPath, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlags[waypointType.Index], CreateWaypointBlip(), true, collectorRadius.Value, speedZoneRadius.Value)); + PathMainMenu.paths[pathIndex].Waypoints.Add(new Waypoint(firstNonNullPath, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, stopWaypointType.Checked, CreateWaypointBlip(), true, collectorRadius.Value, speedZoneRadius.Value)); } else { - PathMainMenu.paths[pathIndex].Waypoints.Add(new Waypoint(firstNonNullPath, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlags[waypointType.Index], CreateWaypointBlip())); + PathMainMenu.paths[pathIndex].Waypoints.Add(new Waypoint(firstNonNullPath, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, stopWaypointType.Checked, CreateWaypointBlip())); } - Logger.Log($"[Path {pathNumber}] Waypoint {waypointNumber} ({drivingFlags[waypointType.Index].ToString()}) added"); + Logger.Log($"Path {pathNumber} Waypoint {waypointNumber} added [Driving style: {(DrivingFlagType)drivingFlag} | Stop waypoint: {stopWaypointType.Checked} | Speed: {waypointSpeed.Value} | Collector: {collectorWaypoint.Checked}]"); ToggleTrafficEndPathMenuItem(pathIndex); collectorWaypoint.Enabled = true; @@ -139,7 +142,7 @@ namespace SceneManager { blip.Color = Color.Blue; } - else if (drivingFlags[waypointType.Index] == VehicleDrivingFlags.StopAtDestination) + else if (stopWaypointType.Checked) { blip.Color = Color.Red; } @@ -233,7 +236,10 @@ namespace SceneManager { if (collectorRadius.Value > speedZoneRadius.Value) { - speedZoneRadius.ScrollToNextOption(); + while(collectorRadius.Value > speedZoneRadius.Value) + { + speedZoneRadius.ScrollToNextOption(); + } } } From d36c7fb0129b88b4464441a8308421d083dec973 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 10 Oct 2020 15:52:48 -0600 Subject: [PATCH 259/276] Refactored variable/object references to reflect changes in path creation/edit waypoint menus. --- SceneManager/AITasking.cs | 33 ++++++++++------------ SceneManager/Menus/PathMainMenu.cs | 6 ++-- SceneManager/Object Classes/Path.cs | 4 +-- SceneManager/Object Classes/Waypoint.cs | 37 ++++++++++++++++--------- 4 files changed, 42 insertions(+), 38 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index 88e46d8..ec9aea3 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -29,7 +29,7 @@ namespace SceneManager Logger.Log($"{collectedVehicle.Vehicle.Model.Name} directed task is complete, directed is now false"); } - if (currentWaypoint.DrivingFlag == VehicleDrivingFlags.StopAtDestination) + if (currentWaypoint.IsStopWaypoint) { StopVehicleAtWaypoint(currentWaypoint, collectedVehicle); } @@ -58,14 +58,15 @@ namespace SceneManager 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}"); - if (currentWaypoint.DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) - { - collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)17040299, acceptedDistance); - } - else - { - collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)263075, acceptedDistance); - } + collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, currentWaypoint.DrivingFlag, acceptedDistance); + //if (currentWaypoint.DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) + //{ + // collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)17040299, acceptedDistance); + //} + //else + //{ + // collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)263075, acceptedDistance); + //} } void LoopWhileDrivingToDirectedWaypoint(float acceptedDistance) @@ -111,16 +112,9 @@ namespace SceneManager //Logger.Log($"{collectedVehicle.Vehicle.Model.Name} current waypoint: {collectedVehicle.CurrentWaypoint.Number}"); float acceptedDistance = GetAcceptedStoppingDistance(path.Waypoints, currentWaypointTask); - Logger.Log($"{vehicle.Model.Name} is driving to path {currentWaypoint.Path.Number} waypoint {path.Waypoints[currentWaypointTask].Number}"); + Logger.Log($"{vehicle.Model.Name} is driving to path {currentWaypoint.Path.Number} waypoint {path.Waypoints[currentWaypointTask].Number} (Stop: {currentWaypoint.IsStopWaypoint}, Driving flag: {(DrivingFlagType)currentWaypoint.DrivingFlag})"); Logger.Log($"{vehicle.Model.Name} driver is persistent: {driver.IsPersistent}"); - if (path.Waypoints[currentWaypointTask].DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) - { - driver.Tasks.DriveToPosition(path.Waypoints[currentWaypointTask].Position, path.Waypoints[currentWaypointTask].Speed, (VehicleDrivingFlags)17040299, acceptedDistance); - } - else - { - driver.Tasks.DriveToPosition(path.Waypoints[currentWaypointTask].Position, path.Waypoints[currentWaypointTask].Speed, (VehicleDrivingFlags)263075, acceptedDistance); - } + driver.Tasks.DriveToPosition(path.Waypoints[currentWaypointTask].Position, path.Waypoints[currentWaypointTask].Speed, path.Waypoints[currentWaypointTask].DrivingFlag, acceptedDistance); LoopWhileDrivingToWaypoint(currentWaypointTask, acceptedDistance); if (!VehicleAndDriverAreValid(collectedVehicle)) @@ -134,7 +128,7 @@ namespace SceneManager continue; } - if (!collectedVehicle.Dismissed && path.Waypoints.ElementAtOrDefault(currentWaypointTask) != null && path.Waypoints[currentWaypointTask].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + if (!collectedVehicle.Dismissed && path.Waypoints.ElementAtOrDefault(currentWaypointTask) != null && path.Waypoints[currentWaypointTask].IsStopWaypoint) { StopVehicleAtWaypoint(path.Waypoints[currentWaypointTask], collectedVehicle); } @@ -157,6 +151,7 @@ namespace SceneManager { while (VehicleAndDriverAreValid(collectedVehicle) && !collectedVehicle.Dismissed && !collectedVehicle.SkipWaypoint && 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); } } diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index 3a10a37..f48a7e8 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -348,13 +348,13 @@ namespace SceneManager Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)PathCreationMenu.collectorRadius.Value * 2, (float)PathCreationMenu.collectorRadius.Value * 2, 1f, 80, 130, 255, 80, false, false, 2, false, 0, 0, false); Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)PathCreationMenu.speedZoneRadius.Value * 2, (float)PathCreationMenu.speedZoneRadius.Value * 2, 1f, 255, 185, 80, 80, false, false, 2, false, 0, 0, false); } - else if (PathCreationMenu.waypointType.SelectedItem.Contains("Drive To")) + else if (PathCreationMenu.stopWaypointType.Checked) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 80, false, false, 2, false, 0, 0, false); } else { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 80, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 80, false, false, 2, false, 0, 0, false); } } else diff --git a/SceneManager/Object Classes/Path.cs b/SceneManager/Object Classes/Path.cs index d142e93..af3a743 100644 --- a/SceneManager/Object Classes/Path.cs +++ b/SceneManager/Object Classes/Path.cs @@ -86,7 +86,7 @@ namespace SceneManager { if (i != Waypoints.Count - 1) { - if (Waypoints[i + 1].DrivingFlag == VehicleDrivingFlags.StopAtDestination) + if (Waypoints[i + 1].IsStopWaypoint) { Debug.DrawLine(Waypoints[i].Position, Waypoints[i + 1].Position, Color.Orange); } @@ -101,7 +101,5 @@ namespace SceneManager } }); } - - } } diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 7e933fa..fc4db2c 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -4,6 +4,12 @@ using System.Linq; namespace SceneManager { + public enum DrivingFlagType + { + Normal = 263075, + Direct = 17040299 + } + public class Waypoint { internal Path Path { get; set; } @@ -11,6 +17,8 @@ namespace SceneManager internal Vector3 Position { get; set; } internal float Speed { get; set; } internal VehicleDrivingFlags DrivingFlag { get; set; } + internal DrivingFlagType DrivingFlagType { get; private set; } + internal bool IsStopWaypoint { get; set; } internal Blip Blip { get; } internal bool IsCollector { get; set; } internal float CollectorRadius { get; set; } @@ -20,13 +28,15 @@ namespace SceneManager internal bool EnableWaypointMarker { get; set; } = true; internal bool EnableEditMarker { get; set; } - internal Waypoint(Path path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, Blip waypointBlip, bool collector = false, float collectorRadius = 1, float speedZoneRadius = 5) + internal Waypoint(Path path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, bool stopWaypoint, Blip waypointBlip, bool collector = false, float collectorRadius = 1, float speedZoneRadius = 5) { Path = path; Number = waypointNum; Position = waypointPos; Speed = speed; DrivingFlag = drivingFlag; + DrivingFlagType = (DrivingFlagType)DrivingFlag; + IsStopWaypoint = stopWaypoint; Blip = waypointBlip; IsCollector = collector; CollectorRadius = collectorRadius; @@ -50,9 +60,13 @@ namespace SceneManager DrawWaypointMarker(); } - internal void UpdateWaypoint(Waypoint currentWaypoint, VehicleDrivingFlags drivingFlag, float speed, bool collectorWaypointChecked, float collectorRadius, float speedZoneRadius, bool updateWaypointPositionChecked) + internal void UpdateWaypoint(Waypoint currentWaypoint, VehicleDrivingFlags drivingFlag, bool stopWaypoint, float speed, bool collectorWaypointChecked, float collectorRadius, float speedZoneRadius, bool updateWaypointPositionChecked) { - UpdateDrivingFlag(drivingFlag); + if(IsStopWaypoint != stopWaypoint) + { + UpdateIfStopWaypoint(); + } + DrivingFlag = drivingFlag; UpdateWaypointSpeed(speed); UpdateCollectorOptions(); if (updateWaypointPositionChecked) @@ -60,25 +74,22 @@ namespace SceneManager UpdateWaypointPosition(Game.LocalPlayer.Character.Position); } - void UpdateDrivingFlag(VehicleDrivingFlags newDrivingFlag) + void UpdateIfStopWaypoint() { - if(DrivingFlag == VehicleDrivingFlags.StopAtDestination && newDrivingFlag != VehicleDrivingFlags.StopAtDestination) + if (IsStopWaypoint && !stopWaypoint) { + Blip.Color = Color.Green; foreach(CollectedVehicle cv in VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle && cv.Path == Path && cv.CurrentWaypoint == this && cv.StoppedAtWaypoint)) { Logger.Log($"Setting StoppedAtWaypoint to false for {cv.Vehicle.Model.Name}"); cv.Dismiss(DismissOption.FromWaypoint); } } - DrivingFlag = newDrivingFlag; - if (newDrivingFlag == VehicleDrivingFlags.StopAtDestination) + else if(!IsStopWaypoint && stopWaypoint) { Blip.Color = Color.Red; } - else - { - Blip.Color = Color.Green; - } + IsStopWaypoint = stopWaypoint; } void UpdateWaypointSpeed(float newWaypointSpeed) @@ -184,7 +195,7 @@ namespace SceneManager Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, 2f, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, 2f, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); } - else if (EditWaypointMenu.changeWaypointType.SelectedItem == "Stop") + else if (EditWaypointMenu.stopWaypointType.Checked) { if (EditWaypointMenu.updateWaypointPosition.Checked) { @@ -213,7 +224,7 @@ namespace SceneManager Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, CollectorRadius * 2, CollectorRadius * 2, markerHeight, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, SpeedZoneRadius * 2, SpeedZoneRadius * 2, markerHeight, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); } - else if (DrivingFlag == VehicleDrivingFlags.StopAtDestination) + else if (IsStopWaypoint) { Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, markerHeight, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); } From 075856fbcea8eb93242cd5c750b2f46dc088681e Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 10 Oct 2020 15:56:10 -0600 Subject: [PATCH 260/276] Fixed waypoint blip color not being correct when adding as a new waypoint --- SceneManager/Menus/EditWaypointMenu.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 249800b..fe9024e 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -212,7 +212,7 @@ namespace SceneManager { blip.Color = Color.Blue; } - else if (drivingFlag == VehicleDrivingFlags.StopAtDestination) + else if (stopWaypointType.Checked) { blip.Color = Color.Red; } From 423dc57fcb93e38a68ebab9cf8a45a051c24fa47 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 10 Oct 2020 20:07:54 -0600 Subject: [PATCH 261/276] Updated references to waypoint driving flag. Edit Waypoint menu no longer rebuilds when a waypoint is updated. --- SceneManager/Menus/EditWaypointMenu.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index fe9024e..2154813 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -65,7 +65,7 @@ namespace SceneManager editWaypointMenu.AddItem(stopWaypointType = new UIMenuCheckboxItem("Is this a Stop waypoint?", currentWaypoint.IsStopWaypoint, "If checked, vehicles will drive to this waypoint, then stop.")); editWaypointMenu.AddItem(directWaypointBehavior); - if(currentWaypoint.DrivingFlag == (VehicleDrivingFlags)17040299) + if(currentWaypoint.DrivingFlagType == DrivingFlagType.Direct) { directWaypointBehavior.Checked = true; } @@ -110,7 +110,7 @@ namespace SceneManager changeWaypointSpeed.Value = (int)MathHelper.ConvertMetersPerSecondToMilesPerHour(currentWaypoint.Speed); stopWaypointType.Checked = currentWaypoint.IsStopWaypoint; - directWaypointBehavior.Checked = currentWaypoint.DrivingFlag == (VehicleDrivingFlags)17040299 ? true : false; + directWaypointBehavior.Checked = currentWaypoint.DrivingFlagType == DrivingFlagType.Direct ? true : false; collectorWaypoint.Checked = currentWaypoint.IsCollector; changeCollectorRadius.Enabled = collectorWaypoint.Checked ? true : false; changeCollectorRadius.Value = (int)currentWaypoint.CollectorRadius; @@ -152,7 +152,7 @@ namespace SceneManager { var currentPath = PathMainMenu.paths[PathMainMenu.editPath.Index]; var currentWaypoint = currentPath.Waypoints[editWaypoint.Index]; - VehicleDrivingFlags drivingFlag = directWaypointBehavior.Checked ? (VehicleDrivingFlags)17040299 : (VehicleDrivingFlags)263075; + DrivingFlagType drivingFlag = directWaypointBehavior.Checked ? DrivingFlagType.Direct : DrivingFlagType.Normal; if (selectedItem == updateWaypoint) { @@ -165,12 +165,13 @@ namespace SceneManager currentWaypoint.UpdateWaypoint(currentWaypoint, drivingFlag, stopWaypointType.Checked, SetDriveSpeedForWaypoint(), collectorWaypoint.Checked, changeCollectorRadius.Value, changeSpeedZoneRadius.Value, updateWaypointPosition.Checked); } - Logger.Log($"Path {currentPath.Number} Waypoint {currentWaypoint.Number} updated [Driving style: {(DrivingFlagType)drivingFlag} | Stop waypoint: {stopWaypointType.Checked} | Speed: {changeWaypointSpeed.Value} | Collector: {currentWaypoint.IsCollector}]"); + Logger.Log($"Path {currentPath.Number} Waypoint {currentWaypoint.Number} updated [Driving style: {drivingFlag} | Stop waypoint: {stopWaypointType.Checked} | Speed: {changeWaypointSpeed.Value} | Collector: {currentWaypoint.IsCollector}]"); updateWaypointPosition.Checked = false; Game.DisplayNotification($"~o~Scene Manager\n~g~[Success]~w~ Waypoint {currentWaypoint.Number} updated."); - BuildEditWaypointMenu(); + // Why am I rebuilding the menu?? + //BuildEditWaypointMenu(); } if (selectedItem == addAsNewWaypoint) @@ -244,7 +245,7 @@ namespace SceneManager { currentWaypoint.Remove(); currentPath.Waypoints.Remove(currentWaypoint); - Logger.Log($"[Path {currentPath.Number}] Waypoint {currentWaypoint.Number} ({currentWaypoint.DrivingFlag}) removed"); + Logger.Log($"[Path {currentPath.Number}] Waypoint {currentWaypoint.Number} ({currentWaypoint.DrivingFlagType}) removed"); foreach (Waypoint wp in currentPath.Waypoints) { From 822725ae2d22a70302191dd197051dd14545a3f2 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 10 Oct 2020 20:08:16 -0600 Subject: [PATCH 262/276] Updated references to waypoint driving flag --- SceneManager/Menus/PathCreationMenu.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SceneManager/Menus/PathCreationMenu.cs b/SceneManager/Menus/PathCreationMenu.cs index e280897..a93f727 100644 --- a/SceneManager/Menus/PathCreationMenu.cs +++ b/SceneManager/Menus/PathCreationMenu.cs @@ -93,7 +93,7 @@ namespace SceneManager var pathIndex = PathMainMenu.paths.IndexOf(firstNonNullPath); var pathNumber = firstNonNullPath.Number; var waypointNumber = PathMainMenu.paths[pathIndex].Waypoints.Count + 1; - VehicleDrivingFlags drivingFlag = directWaypointBehavior.Checked ? (VehicleDrivingFlags)17040299 : (VehicleDrivingFlags)263075; + DrivingFlagType drivingFlag = directWaypointBehavior.Checked ? DrivingFlagType.Direct : DrivingFlagType.Normal; if (collectorWaypoint.Checked) { @@ -103,7 +103,7 @@ namespace SceneManager { PathMainMenu.paths[pathIndex].Waypoints.Add(new Waypoint(firstNonNullPath, waypointNumber, Game.LocalPlayer.Character.Position, SetDriveSpeedForWaypoint(), drivingFlag, stopWaypointType.Checked, CreateWaypointBlip())); } - Logger.Log($"Path {pathNumber} Waypoint {waypointNumber} added [Driving style: {(DrivingFlagType)drivingFlag} | Stop waypoint: {stopWaypointType.Checked} | Speed: {waypointSpeed.Value} | Collector: {collectorWaypoint.Checked}]"); + Logger.Log($"Path {pathNumber} Waypoint {waypointNumber} added [Driving style: {drivingFlag} | Stop waypoint: {stopWaypointType.Checked} | Speed: {waypointSpeed.Value} | Collector: {collectorWaypoint.Checked}]"); ToggleTrafficEndPathMenuItem(pathIndex); collectorWaypoint.Enabled = true; @@ -167,7 +167,7 @@ namespace SceneManager { if (PathMainMenu.paths.ElementAtOrDefault(i) != null && PathMainMenu.paths[i].State == State.Creating) { - Logger.Log($"[Path {i + 1}] {PathMainMenu.paths[i].Waypoints.Last().DrivingFlag.ToString()} waypoint removed"); + Logger.Log($"[Path {i + 1}] {PathMainMenu.paths[i].Waypoints.Last().DrivingFlagType} waypoint removed"); PathMainMenu.paths[i].Waypoints.Last().Blip.Delete(); PathMainMenu.paths[i].Waypoints.Last().RemoveSpeedZone(); From 5d1a17ed1fdd3ff8658a816de50a9aaf880a5894 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 10 Oct 2020 20:08:59 -0600 Subject: [PATCH 263/276] Added new DismissOption enum for when a player enters a collected vehicle. Added null checking when deleting nearby vehicle from world. --- SceneManager/Menus/PathMainMenu.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index f48a7e8..e53bb33 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -13,7 +13,8 @@ namespace SceneManager FromPath = 0, FromWaypoint = 1, FromWorld = 2, - FromDirect = 3 + FromDirect = 3, + FromPlayer = 4 } static class PathMainMenu @@ -296,17 +297,18 @@ namespace SceneManager else if(dismissDriver.Index == (int)DismissOption.FromWorld) { Game.LogTrivial($"Dismissed {nearbyVehicle.Model.Name} from the world"); - while (nearbyVehicle.HasOccupants) + while (nearbyVehicle && nearbyVehicle.HasOccupants) { foreach (Ped occupant in nearbyVehicle.Occupants) { - occupant.Dismiss(); occupant.Delete(); } GameFiber.Yield(); } - - nearbyVehicle.Delete(); + if (nearbyVehicle) + { + nearbyVehicle.Delete(); + } } } } From 5ddcf3aead25b843a4ad09fdfbbd451497d8ef3d Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 10 Oct 2020 20:09:23 -0600 Subject: [PATCH 264/276] Added DismissOption.FromPlayer condition --- SceneManager/Object Classes/CollectedVehicle.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index d82dbfe..e95b946 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -54,6 +54,21 @@ namespace SceneManager return; } + if (dismissOption == DismissOption.FromPlayer) + { + if (Driver) + { + Driver.Dismiss(); + } + if (Vehicle) + { + Vehicle.Dismiss(); + } + Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(Vehicle, 0f, 1, true); + VehicleCollector.collectedVehicles.Remove(this); + return; + } + if(StoppedAtWaypoint) { Logger.Log($"Unstucking {Vehicle.Model.Name}"); From 69cf4a8cd34f954d87298207a5d9debca28a82df Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 10 Oct 2020 20:09:47 -0600 Subject: [PATCH 265/276] Adjusted driving style flags. Updated references to driving flag property --- SceneManager/Object Classes/Waypoint.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index fc4db2c..6ed7b67 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -7,7 +7,7 @@ namespace SceneManager public enum DrivingFlagType { Normal = 263075, - Direct = 17040299 + Direct = 17040259 } public class Waypoint @@ -16,7 +16,7 @@ namespace SceneManager internal int Number { get; set; } internal Vector3 Position { get; set; } internal float Speed { get; set; } - internal VehicleDrivingFlags DrivingFlag { get; set; } + //internal VehicleDrivingFlags DrivingFlag { get; set; } internal DrivingFlagType DrivingFlagType { get; private set; } internal bool IsStopWaypoint { get; set; } internal Blip Blip { get; } @@ -28,14 +28,14 @@ namespace SceneManager internal bool EnableWaypointMarker { get; set; } = true; internal bool EnableEditMarker { get; set; } - internal Waypoint(Path path, int waypointNum, Vector3 waypointPos, float speed, VehicleDrivingFlags drivingFlag, bool stopWaypoint, Blip waypointBlip, bool collector = false, float collectorRadius = 1, float speedZoneRadius = 5) + 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; Number = waypointNum; Position = waypointPos; Speed = speed; - DrivingFlag = drivingFlag; - DrivingFlagType = (DrivingFlagType)DrivingFlag; + //DrivingFlag = drivingFlag; + DrivingFlagType = drivingFlag; IsStopWaypoint = stopWaypoint; Blip = waypointBlip; IsCollector = collector; @@ -60,13 +60,13 @@ namespace SceneManager DrawWaypointMarker(); } - internal void UpdateWaypoint(Waypoint currentWaypoint, VehicleDrivingFlags drivingFlag, bool stopWaypoint, float speed, bool collectorWaypointChecked, float collectorRadius, float speedZoneRadius, bool updateWaypointPositionChecked) + internal void UpdateWaypoint(Waypoint currentWaypoint, DrivingFlagType drivingFlag, bool stopWaypoint, float speed, bool collectorWaypointChecked, float collectorRadius, float speedZoneRadius, bool updateWaypointPositionChecked) { if(IsStopWaypoint != stopWaypoint) { UpdateIfStopWaypoint(); } - DrivingFlag = drivingFlag; + DrivingFlagType = drivingFlag; UpdateWaypointSpeed(speed); UpdateCollectorOptions(); if (updateWaypointPositionChecked) From 90b9b1dd6469653f8b836435135887768bbeecbf Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 10 Oct 2020 20:10:53 -0600 Subject: [PATCH 266/276] Fixed a crash when trying to call DriveVehicleToNextWaypoint when the path has no waypoints. Removed dead code. --- SceneManager/AITasking.cs | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index ec9aea3..f12b8b9 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -33,7 +33,7 @@ namespace SceneManager { StopVehicleAtWaypoint(currentWaypoint, collectedVehicle); } - if(currentWaypoint != path?.Waypoints?.Last()) + if(path?.Waypoints?.Count > 0 && currentWaypoint != path?.Waypoints?.Last()) { DriveVehicleToNextWaypoint(collectedVehicle, path, currentWaypoint); } @@ -58,15 +58,7 @@ namespace SceneManager 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}"); - collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, currentWaypoint.DrivingFlag, acceptedDistance); - //if (currentWaypoint.DrivingFlag == VehicleDrivingFlags.IgnorePathFinding) - //{ - // collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)17040299, acceptedDistance); - //} - //else - //{ - // collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)263075, acceptedDistance); - //} + collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)currentWaypoint.DrivingFlagType, acceptedDistance); } void LoopWhileDrivingToDirectedWaypoint(float acceptedDistance) @@ -112,9 +104,9 @@ namespace SceneManager //Logger.Log($"{collectedVehicle.Vehicle.Model.Name} current waypoint: {collectedVehicle.CurrentWaypoint.Number}"); float acceptedDistance = GetAcceptedStoppingDistance(path.Waypoints, currentWaypointTask); - Logger.Log($"{vehicle.Model.Name} is driving to path {currentWaypoint.Path.Number} waypoint {path.Waypoints[currentWaypointTask].Number} (Stop: {currentWaypoint.IsStopWaypoint}, Driving flag: {(DrivingFlagType)currentWaypoint.DrivingFlag})"); + Logger.Log($"{vehicle.Model.Name} is driving to path {currentWaypoint.Path.Number} waypoint {path.Waypoints[currentWaypointTask].Number} (Stop: {currentWaypoint.IsStopWaypoint}, Driving flag: {currentWaypoint.DrivingFlagType})"); Logger.Log($"{vehicle.Model.Name} driver is persistent: {driver.IsPersistent}"); - driver.Tasks.DriveToPosition(path.Waypoints[currentWaypointTask].Position, path.Waypoints[currentWaypointTask].Speed, path.Waypoints[currentWaypointTask].DrivingFlag, acceptedDistance); + driver.Tasks.DriveToPosition(path.Waypoints[currentWaypointTask].Position, path.Waypoints[currentWaypointTask].Speed, (VehicleDrivingFlags)path.Waypoints[currentWaypointTask].DrivingFlagType, acceptedDistance); LoopWhileDrivingToWaypoint(currentWaypointTask, acceptedDistance); if (!VehicleAndDriverAreValid(collectedVehicle)) @@ -184,18 +176,12 @@ namespace SceneManager { Logger.Log($"Vehicle is null"); collectedVehicle.Dismiss(); - //if(collectedVehicle.Driver) - //{ - // collectedVehicle.Driver.IsPersistent = false; - //} return false; } if (!collectedVehicle.Driver || !collectedVehicle.Driver.IsAlive && !collectedVehicle.Dismissed) { collectedVehicle.Dismiss(); //Logger.Log($"{collectedVehicle.Vehicle.Model.Name} driver is null or dead"); - //Logger.Log($"{collectedVehicle.Vehicle.Model.Name} persistent: {collectedVehicle.Vehicle.IsPersistent}"); - //collectedVehicle.Vehicle.IsPersistent = false; return false; } return true; From 331aad38f81970bfa16a79de5df5b0226551fb2b Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sat, 10 Oct 2020 20:11:20 -0600 Subject: [PATCH 267/276] Added loop to check if the player enters a collected vehicle, and dismiss it as a result. --- SceneManager/VehicleCollector.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index b1ad917..c90c8a5 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -20,6 +20,13 @@ namespace SceneManager { LoopForNearbyValidVehicles(path, waypoint); } + + var collectedVehiclePlayerIsIn = collectedVehicles.Where(x => x.Vehicle == Game.LocalPlayer.Character.CurrentVehicle).FirstOrDefault(); + if (collectedVehiclePlayerIsIn != null) + { + collectedVehiclePlayerIsIn.Dismiss(DismissOption.FromPlayer); + Logger.Log($"Dismissed a collected vehicle the player was in."); + } GameFiber.Sleep(100); } } From f25da3e30749dbafe45a0ca62057d32f4abb2565 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 11 Oct 2020 14:57:57 -0600 Subject: [PATCH 268/276] Barrier menu width now adjusts to fit scroller item text --- SceneManager/Menus/BarrierMenu.cs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index 8a0de4c..ca628e4 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -150,6 +150,8 @@ namespace SceneManager { rotateBarrier.Enabled = true; } + + barrierMenu.Width = SetMenuWidth(); } if (scrollerItem == rotateBarrier) @@ -269,5 +271,27 @@ namespace SceneManager resetBarriers.Enabled = barriers.Count == 0 ? false : true; } } + + private static float SetMenuWidth() + { + float defaultWidth = UIMenu.DefaultWidth; + float width = barrierMenu.Width; + + barrierList.TextStyle.Apply(); + Rage.Native.NativeFunction.Natives.x54CE8AC98E120CAB("STRING"); // _BEGIN_TEXT_COMMAND_GET_WIDTH + Rage.Native.NativeFunction.Natives.ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(barrierList.SelectedItem); + float textWidth = Rage.Native.NativeFunction.Natives.x85F061DA64ED2F67(true); // _END_TEXT_COMMAND_GET_WIDTH + float padding = 0.00390625f * 2; // typical padding used in RNUI + + var selectedItemWidth = textWidth + padding; + if(selectedItemWidth <= 0.14f) + { + return defaultWidth; + } + else + { + return selectedItemWidth * 1.6f; + } + } } } From a06a2bbebe792ae378e14d1275de883c674f4ebe Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 11 Oct 2020 14:58:21 -0600 Subject: [PATCH 269/276] Added debug message for collected vehicle properties upon being directed --- SceneManager/Menus/PathMainMenu.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index e53bb33..2442b83 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -264,6 +264,7 @@ namespace SceneManager collectedVehicle.Directed = true; collectedVehicle.Driver.Tasks.Clear(); + Logger.Log($"Collected vehicle properties: Dismissed [{collectedVehicle.Dismissed}], Directed [{collectedVehicle.Directed}], StopppedAtWaypoint [{collectedVehicle.StoppedAtWaypoint}]"); if (directOptions.SelectedItem == "First waypoint") { GameFiber.StartNew(() => From 57a65e90316438e94e33bcd7f05c3ccf340a919d Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 11 Oct 2020 14:59:46 -0600 Subject: [PATCH 270/276] Fixed blip colors not updating correctly when a waypoint is updated. Fixed 3D waypoints not drawing when the setting is disabled then re-enabled. Fixed a crash when blip setting is disabled then re-enabled. --- SceneManager/Object Classes/Waypoint.cs | 125 ++++++++++++++---------- 1 file changed, 76 insertions(+), 49 deletions(-) diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 6ed7b67..1abff07 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -16,7 +16,6 @@ namespace SceneManager internal int Number { get; set; } internal Vector3 Position { get; set; } internal float Speed { get; set; } - //internal VehicleDrivingFlags DrivingFlag { get; set; } internal DrivingFlagType DrivingFlagType { get; private set; } internal bool IsStopWaypoint { get; set; } internal Blip Blip { get; } @@ -34,7 +33,6 @@ namespace SceneManager Number = waypointNum; Position = waypointPos; Speed = speed; - //DrivingFlag = drivingFlag; DrivingFlagType = drivingFlag; IsStopWaypoint = stopWaypoint; Blip = waypointBlip; @@ -85,7 +83,7 @@ namespace SceneManager cv.Dismiss(DismissOption.FromWaypoint); } } - else if(!IsStopWaypoint && stopWaypoint) + else if(stopWaypoint && !IsStopWaypoint) { Blip.Color = Color.Red; } @@ -124,6 +122,14 @@ namespace SceneManager else { IsCollector = false; + if (IsStopWaypoint) + { + Blip.Color = Color.Red; + } + else + { + Blip.Color = Color.Green; + } RemoveSpeedZone(); if (CollectorRadiusBlip) { @@ -181,56 +187,59 @@ namespace SceneManager // This is called once when the waypoint is created GameFiber.StartNew(() => { - while (SettingsMenu.threeDWaypoints.Checked && EnableWaypointMarker && Path.Waypoints.Contains(this)) + while (true) { - if (EditWaypointMenu.editWaypointMenu.Visible && PathMainMenu.editPath.Value == Path.Number && EditWaypointMenu.editWaypoint.Value == Number) + if(SettingsMenu.threeDWaypoints.Checked && EnableWaypointMarker && Path.Waypoints.Contains(this)) { - if (EditWaypointMenu.collectorWaypoint.Checked) + if (EditWaypointMenu.editWaypointMenu.Visible && PathMainMenu.editPath.Value == Path.Number && EditWaypointMenu.editWaypoint.Value == Number) { - if (EditWaypointMenu.updateWaypointPosition.Checked) + if (EditWaypointMenu.collectorWaypoint.Checked) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, 1f, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, 1f, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); + if (EditWaypointMenu.updateWaypointPosition.Checked) + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, 1f, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, 1f, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); + } + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, 2f, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, 2f, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); } - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, (float)EditWaypointMenu.changeCollectorRadius.Value * 2, 2f, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, (float)EditWaypointMenu.changeSpeedZoneRadius.Value * 2, 2f, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); - } - else if (EditWaypointMenu.stopWaypointType.Checked) - { - if (EditWaypointMenu.updateWaypointPosition.Checked) + else if (EditWaypointMenu.stopWaypointType.Checked) { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); + if (EditWaypointMenu.updateWaypointPosition.Checked) + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); + } + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 2f, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); } - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 2f, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); - } - else - { - if (EditWaypointMenu.updateWaypointPosition.Checked) + else { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); + if (EditWaypointMenu.updateWaypointPosition.Checked) + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y, Game.LocalPlayer.Character.Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 1f, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); + } + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 2f, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); } - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, 2f, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); } - } - else if ((Path.State == State.Finished && MenuManager.menuPool.IsAnyMenuOpen()) || (Path.State == State.Creating && PathCreationMenu.pathCreationMenu.Visible)) - { - float markerHeight = 1f; - if ((PathMainMenu.directDriver.Selected && PathMainMenu.directDriver.Value == Path.Number) || PathMainMenu.editPath.Selected && PathMainMenu.editPath.Value == Path.Number && (PathMainMenu.pathMainMenu.Visible || EditPathMenu.editPathMenu.Visible)) + else if ((Path.State == State.Finished && MenuManager.menuPool.IsAnyMenuOpen()) || (Path.State == State.Creating && PathCreationMenu.pathCreationMenu.Visible)) { - markerHeight = 2f; - } - if (IsCollector) - { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, CollectorRadius * 2, CollectorRadius * 2, markerHeight, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, SpeedZoneRadius * 2, SpeedZoneRadius * 2, markerHeight, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); - } - else if (IsStopWaypoint) - { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, markerHeight, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); - } - else - { - Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, markerHeight, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); + float markerHeight = 1f; + if ((PathMainMenu.directDriver.Selected && PathMainMenu.directDriver.Value == Path.Number) || PathMainMenu.editPath.Selected && PathMainMenu.editPath.Value == Path.Number && (PathMainMenu.pathMainMenu.Visible || EditPathMenu.editPathMenu.Visible)) + { + markerHeight = 2f; + } + if (IsCollector) + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, CollectorRadius * 2, CollectorRadius * 2, markerHeight, 80, 130, 255, 100, false, false, 2, false, 0, 0, false); + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, SpeedZoneRadius * 2, SpeedZoneRadius * 2, markerHeight, 255, 185, 80, 100, false, false, 2, false, 0, 0, false); + } + else if (IsStopWaypoint) + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, markerHeight, 255, 65, 65, 100, false, false, 2, false, 0, 0, false); + } + else + { + Rage.Native.NativeFunction.Natives.DRAW_MARKER(1, Position.X, Position.Y, Position.Z - 1, 0, 0, 0, 0, 0, 0, 1f, 1f, markerHeight, 65, 255, 65, 100, false, false, 2, false, 0, 0, false); + } } } @@ -241,23 +250,41 @@ namespace SceneManager internal void EnableBlip() { - if(!PathMainMenu.paths.Where(p => p == Path).First().IsEnabled) + if(!Path.IsEnabled) { - Blip.Alpha = 0.5f; - CollectorRadiusBlip.Alpha = 0.25f; + if (Blip) + { + Blip.Alpha = 0.5f; + } + if (CollectorRadiusBlip) + { + CollectorRadiusBlip.Alpha = 0.25f; + } } else { - Blip.Alpha = 1.0f; - CollectorRadiusBlip.Alpha = 0.5f; + if (Blip) + { + Blip.Alpha = 1.0f; + } + if (CollectorRadiusBlip) + { + CollectorRadiusBlip.Alpha = 0.5f; + } } } internal void DisableBlip() { - Blip.Alpha = 0; - CollectorRadiusBlip.Alpha = 0; + if (Blip) + { + Blip.Alpha = 0; + } + if (CollectorRadiusBlip) + { + CollectorRadiusBlip.Alpha = 0; + } } } } From 772e618628763bf228ed4de5e971a9dd9711448b Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 11 Oct 2020 15:00:08 -0600 Subject: [PATCH 271/276] 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; From 080701b0b1f46e5390636c0279dcdfa9e6b2c3ed Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 11 Oct 2020 15:01:32 -0600 Subject: [PATCH 272/276] Removed DismissOption.FromDirect --- SceneManager/Menus/PathMainMenu.cs | 3 +- .../Object Classes/CollectedVehicle.cs | 36 ++----------------- 2 files changed, 4 insertions(+), 35 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index 2442b83..c7c43d2 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -13,8 +13,7 @@ namespace SceneManager FromPath = 0, FromWaypoint = 1, FromWorld = 2, - FromDirect = 3, - FromPlayer = 4 + FromPlayer = 3 } static class PathMainMenu diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index e95b946..7436958 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -3,7 +3,7 @@ using System.Linq; namespace SceneManager { - public class CollectedVehicle + internal class CollectedVehicle { internal Ped Driver { get; set; } internal Vehicle Vehicle { get; set; } @@ -14,7 +14,7 @@ namespace SceneManager internal bool Dismissed { get; set; } = false; internal bool Directed { get; set; } = false; internal bool SkipWaypoint { get; set; } = false; - internal bool ReadyForDirectTasks { get; set; } = false; + internal bool ReadyForDirectTasks { get; set; } = true; internal CollectedVehicle(Vehicle vehicle, Path path, Waypoint currentWaypoint) { @@ -83,16 +83,11 @@ namespace SceneManager DismissFromWaypoint(); } - if(dismissOption == DismissOption.FromPath) + if (dismissOption == DismissOption.FromPath) { DismissFromPath(); } - if(dismissOption == DismissOption.FromDirect) - { - DismissFromDirect(); - } - void DismissFromWorld() { Game.LogTrivial($"Dismissed {Vehicle.Model.Name} from the world"); @@ -176,31 +171,6 @@ namespace SceneManager }); } - - void DismissFromDirect() - { - Logger.Log($"Dismissing from direct."); - ReadyForDirectTasks = false; - GameFiber.StartNew(() => - { - var nearestCollectorWaypoint = Path.Waypoints.Where(wp => wp.IsCollector).OrderBy(wp => Vehicle.DistanceTo2D(wp.Position)).FirstOrDefault(); - if (nearestCollectorWaypoint != null) - { - // Enabling this will keep the menu, but the dismissed vehicle is immediately re - collected - while (nearestCollectorWaypoint != null && Vehicle && Driver && Vehicle.FrontPosition.DistanceTo2D(nearestCollectorWaypoint.Position) <= nearestCollectorWaypoint.CollectorRadius) - { - //Game.LogTrivial($"{Vehicle.Model.Name} is within 2x collector radius, cannot be fully dismissed yet."); - GameFiber.Yield(); - } - } - else - { - Logger.Log($"Nearest collector is null"); - } - - ReadyForDirectTasks = true; - }); - } } } } From 8bbb30e072521c426d19a4d5ff06ecd069404f21 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 15 Oct 2020 14:51:42 -0600 Subject: [PATCH 273/276] Added check for if shadowBarrier is invalid after creation --- SceneManager/Menus/BarrierMenu.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index ca628e4..7bce8f8 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Drawing; using System.Linq; using Rage; @@ -51,6 +50,10 @@ namespace SceneManager shadowBarrier.Delete(); shadowBarrier = new Rage.Object(Settings.barrierValues[barrierList.Index], TracePlayerView(Settings.BarrierPlacementDistance, TraceFlags.IntersectWorld).HitPosition, rotateBarrier.Value); + if (!shadowBarrier) + { + shadowBarrier = new Rage.Object(Settings.barrierValues[barrierList.Index], TracePlayerView(Settings.BarrierPlacementDistance, TraceFlags.IntersectWorld).HitPosition, rotateBarrier.Value); + } Rage.Native.NativeFunction.Natives.PLACE_OBJECT_ON_GROUND_PROPERLY(shadowBarrier); shadowBarrier.IsGravityDisabled = true; shadowBarrier.IsCollisionEnabled = false; From 7ee307f8e61dc4dc8d75256a8c09140c6830b81f Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Thu, 15 Oct 2020 14:52:50 -0600 Subject: [PATCH 274/276] Commented out unnecessary logging for release --- SceneManager/AITasking.cs | 18 +++++++++--------- SceneManager/Menus/EditWaypointMenu.cs | 2 +- SceneManager/Menus/PathMainMenu.cs | 4 ++-- .../Object Classes/CollectedVehicle.cs | 7 ++++--- SceneManager/Object Classes/Waypoint.cs | 2 +- SceneManager/VehicleCollector.cs | 12 ++++++------ 6 files changed, 23 insertions(+), 22 deletions(-) diff --git a/SceneManager/AITasking.cs b/SceneManager/AITasking.cs index c6c973b..2790328 100644 --- a/SceneManager/AITasking.cs +++ b/SceneManager/AITasking.cs @@ -70,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.Directed}"); + //Logger.Log($"{collectedVehicle.Vehicle.Model.Name} Dismissed: {collectedVehicle.Dismissed}, Directed: {collectedVehicle.Directed}"); collectedVehicle.Driver.Tasks.DriveToPosition(currentWaypoint.Position, currentWaypoint.Speed, (VehicleDrivingFlags)currentWaypoint.DrivingFlagType, acceptedDistance); } @@ -96,19 +96,19 @@ 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}"); + //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($"Dismissed: {collectedVehicle.Dismissed}, Directed: {collectedVehicle.Directed}, StoppedAtWaypoint: {collectedVehicle.StoppedAtWaypoint}"); + //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) + if (collectedVehicle == null || !collectedVehicle.Vehicle || collectedVehicle.Dismissed || collectedVehicle.Directed) { - Logger.Log($"Vehicle dismissed or null, return"); + Logger.Log($"Vehicle dismissed, directed, or null, return"); return; } - if(collectedVehicle.Driver == null || !collectedVehicle.Vehicle.HasDriver || !collectedVehicle.Driver.IsAlive) + if(collectedVehicle.Driver == null || !collectedVehicle.Driver || !collectedVehicle.Vehicle.HasDriver || !collectedVehicle.Driver.IsAlive || collectedVehicle.Vehicle.Driver == Game.LocalPlayer.Character) { Logger.Log($"{vehicle.Model.Name} does not have a driver/driver is null or driver is dead."); return; @@ -121,7 +121,7 @@ namespace SceneManager float acceptedDistance = GetAcceptedStoppingDistance(path.Waypoints, currentWaypointTask); Logger.Log($"{vehicle.Model.Name} is driving to path {currentWaypoint.Path.Number} waypoint {path.Waypoints[currentWaypointTask].Number} (Stop: {currentWaypoint.IsStopWaypoint}, Driving flag: {currentWaypoint.DrivingFlagType})"); - Logger.Log($"{vehicle.Model.Name} driver is persistent: {driver.IsPersistent}"); + //Logger.Log($"{vehicle.Model.Name} driver is persistent: {driver.IsPersistent}"); driver.Tasks.DriveToPosition(path.Waypoints[currentWaypointTask].Position, path.Waypoints[currentWaypointTask].Speed, (VehicleDrivingFlags)path.Waypoints[currentWaypointTask].DrivingFlagType, acceptedDistance); LoopWhileDrivingToWaypoint(currentWaypointTask, acceptedDistance); @@ -194,7 +194,7 @@ namespace SceneManager collectedVehicle.Dismiss(); return false; } - if (!collectedVehicle.Driver || !collectedVehicle.Driver.IsAlive && !collectedVehicle.Dismissed) + if (collectedVehicle.Driver == null || !collectedVehicle.Driver || !collectedVehicle.Driver.IsAlive && !collectedVehicle.Dismissed) { collectedVehicle.Dismiss(); //Logger.Log($"{collectedVehicle.Vehicle.Model.Name} driver is null or dead"); diff --git a/SceneManager/Menus/EditWaypointMenu.cs b/SceneManager/Menus/EditWaypointMenu.cs index 2154813..ad91198 100644 --- a/SceneManager/Menus/EditWaypointMenu.cs +++ b/SceneManager/Menus/EditWaypointMenu.cs @@ -250,7 +250,7 @@ namespace SceneManager foreach (Waypoint wp in currentPath.Waypoints) { wp.Number = currentPath.Waypoints.IndexOf(wp) + 1; - Logger.Log($"Waypoint at index {currentPath.Waypoints.IndexOf(wp)} is now waypoint #{wp.Number}"); + //Logger.Log($"Waypoint at index {currentPath.Waypoints.IndexOf(wp)} is now waypoint #{wp.Number}"); } editWaypointMenu.Clear(); diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index c7c43d2..5b1c8ef 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -207,7 +207,7 @@ namespace SceneManager { if (paths.ElementAtOrDefault(i) != null && paths[i].State == State.Creating) { - Game.LogTrivial($"Resuming path {paths[i].Number}"); + //Game.LogTrivial($"Resuming path {paths[i].Number}"); Game.DisplayNotification($"~o~Scene Manager\n~y~[Creating]~w~ Resuming path {paths[i].Number}"); break; } @@ -263,7 +263,7 @@ namespace SceneManager collectedVehicle.Directed = true; collectedVehicle.Driver.Tasks.Clear(); - Logger.Log($"Collected vehicle properties: Dismissed [{collectedVehicle.Dismissed}], Directed [{collectedVehicle.Directed}], StopppedAtWaypoint [{collectedVehicle.StoppedAtWaypoint}]"); + //Logger.Log($"Collected vehicle properties: Dismissed [{collectedVehicle.Dismissed}], Directed [{collectedVehicle.Directed}], StopppedAtWaypoint [{collectedVehicle.StoppedAtWaypoint}]"); if (directOptions.SelectedItem == "First waypoint") { GameFiber.StartNew(() => diff --git a/SceneManager/Object Classes/CollectedVehicle.cs b/SceneManager/Object Classes/CollectedVehicle.cs index 7436958..19d9bf1 100644 --- a/SceneManager/Object Classes/CollectedVehicle.cs +++ b/SceneManager/Object Classes/CollectedVehicle.cs @@ -19,7 +19,7 @@ namespace SceneManager internal CollectedVehicle(Vehicle vehicle, Path path, Waypoint currentWaypoint) { Vehicle = vehicle; - Driver = vehicle.Driver; + Driver = Vehicle.Driver; Path = path; CurrentWaypoint = currentWaypoint; SetPersistence(); @@ -38,7 +38,7 @@ namespace SceneManager Vehicle.IsPersistent = true; Driver.IsPersistent = true; Driver.BlockPermanentEvents = true; - Logger.Log($"{Vehicle.Model.Name} and driver are now persistent."); + //Logger.Log($"{Vehicle.Model.Name} and driver are now persistent."); } internal void Dismiss(DismissOption dismissOption = DismissOption.FromPath) @@ -56,6 +56,7 @@ namespace SceneManager if (dismissOption == DismissOption.FromPlayer) { + Dismissed = true; if (Driver) { Driver.Dismiss(); @@ -71,7 +72,7 @@ namespace SceneManager if(StoppedAtWaypoint) { - Logger.Log($"Unstucking {Vehicle.Model.Name}"); + //Logger.Log($"Unstucking {Vehicle.Model.Name}"); StoppedAtWaypoint = false; Rage.Native.NativeFunction.Natives.x260BE8F09E326A20(Vehicle, 0f, 1, true); Driver.Tasks.CruiseWithVehicle(5f); diff --git a/SceneManager/Object Classes/Waypoint.cs b/SceneManager/Object Classes/Waypoint.cs index 1abff07..6c0cb13 100644 --- a/SceneManager/Object Classes/Waypoint.cs +++ b/SceneManager/Object Classes/Waypoint.cs @@ -79,7 +79,7 @@ namespace SceneManager Blip.Color = Color.Green; foreach(CollectedVehicle cv in VehicleCollector.collectedVehicles.Where(cv => cv.Vehicle && cv.Path == Path && cv.CurrentWaypoint == this && cv.StoppedAtWaypoint)) { - Logger.Log($"Setting StoppedAtWaypoint to false for {cv.Vehicle.Model.Name}"); + // Logger.Log($"Setting StoppedAtWaypoint to false for {cv.Vehicle.Model.Name}"); cv.Dismiss(DismissOption.FromWaypoint); } } diff --git a/SceneManager/VehicleCollector.cs b/SceneManager/VehicleCollector.cs index c90c8a5..50893d1 100644 --- a/SceneManager/VehicleCollector.cs +++ b/SceneManager/VehicleCollector.cs @@ -72,7 +72,7 @@ namespace SceneManager { //SetVehicleAndDriverPersistence(vehicle); CollectedVehicle newCollectedVehicle = AddVehicleToCollection(path, waypoint, vehicle); - Logger.Log($"Vehicle's front position distance to waypoint: {vehicle.FrontPosition.DistanceTo2D(waypoint.Position)}, collector radius: {waypoint.CollectorRadius}"); + //Logger.Log($"Vehicle's front position distance to waypoint: {vehicle.FrontPosition.DistanceTo2D(waypoint.Position)}, collector radius: {waypoint.CollectorRadius}"); GameFiber AssignTasksFiber = new GameFiber(() => AITasking.AssignWaypointTasks(newCollectedVehicle, path, waypoint)); AssignTasksFiber.Start(); } @@ -88,7 +88,7 @@ namespace SceneManager { var collectedVehicle = new CollectedVehicle(v, path, waypoint); collectedVehicles.Add(collectedVehicle); - Logger.Log($"Added {v.Model.Name} to collection from path {path.Number}, waypoint {waypoint.Number}."); + Logger.Log($"Added {v.Model.Name} to collection from path {path.Number} waypoint {waypoint.Number}."); return collectedVehicle; } @@ -109,12 +109,12 @@ namespace SceneManager } if(v && v.Driver) { - var driverBlip = v.Driver.AttachBlip(); - driverBlip.Color = Color.Green; - driverBlip.Scale = 0.25f; + //var driverBlip = v.Driver.AttachBlip(); + //driverBlip.Color = Color.Green; + //driverBlip.Scale = 0.25f; v.Driver.IsPersistent = true; v.Driver.BlockPermanentEvents = true; - Logger.Log($"A missing driver was created for {v.Model.Name}."); + //Logger.Log($"A missing driver was created for {v.Model.Name}."); } else { From 22dac470b72fd8c0f37565110ecca852362c78d7 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Fri, 16 Oct 2020 12:57:35 -0600 Subject: [PATCH 275/276] Invalid shadow barrier object now displays a message and returns. --- SceneManager/Menus/BarrierMenu.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SceneManager/Menus/BarrierMenu.cs b/SceneManager/Menus/BarrierMenu.cs index 7bce8f8..2a1b4ba 100644 --- a/SceneManager/Menus/BarrierMenu.cs +++ b/SceneManager/Menus/BarrierMenu.cs @@ -52,7 +52,9 @@ namespace SceneManager shadowBarrier = new Rage.Object(Settings.barrierValues[barrierList.Index], TracePlayerView(Settings.BarrierPlacementDistance, TraceFlags.IntersectWorld).HitPosition, rotateBarrier.Value); if (!shadowBarrier) { - shadowBarrier = new Rage.Object(Settings.barrierValues[barrierList.Index], TracePlayerView(Settings.BarrierPlacementDistance, TraceFlags.IntersectWorld).HitPosition, rotateBarrier.Value); + barrierMenu.Close(); + Game.DisplayNotification($"~o~Scene Manager\n~red~[Error]~w~ Something went wrong creating the shadow barrier. Please try again."); + return; } Rage.Native.NativeFunction.Natives.PLACE_OBJECT_ON_GROUND_PROPERLY(shadowBarrier); shadowBarrier.IsGravityDisabled = true; From 51748694d61adbabf11cfe166358254f487e60e8 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Fri, 16 Oct 2020 12:57:43 -0600 Subject: [PATCH 276/276] Removed more logging for release. --- SceneManager/Menus/PathMainMenu.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SceneManager/Menus/PathMainMenu.cs b/SceneManager/Menus/PathMainMenu.cs index 5b1c8ef..bb7803d 100644 --- a/SceneManager/Menus/PathMainMenu.cs +++ b/SceneManager/Menus/PathMainMenu.cs @@ -104,12 +104,12 @@ namespace SceneManager internal static void DeletePath(Path path, Delete pathsToDelete) { - Game.LogTrivial($"Preparing to delete path {path.Number}"); + //Game.LogTrivial($"Preparing to delete path {path.Number}"); RemoveVehiclesFromPath(); RemoveBlipsAndYieldZones(); - Game.LogTrivial($"Clearing path waypoints"); + //Game.LogTrivial($"Clearing path waypoints"); path.Waypoints.Clear(); // Manipulating the menu to reflect specific paths being deleted @@ -129,7 +129,7 @@ namespace SceneManager void RemoveVehiclesFromPath() { - Game.LogTrivial($"Removing all vehicles on the path"); + //Game.LogTrivial($"Removing all vehicles on the path"); var pathVehicles = VehicleCollector.collectedVehicles.Where(cv => cv.Path.Number == path.Number).ToList(); foreach (CollectedVehicle cv in pathVehicles.Where(cv => cv != null && cv.Vehicle && cv.Driver)) { @@ -154,7 +154,7 @@ namespace SceneManager void RemoveBlipsAndYieldZones() { - Game.LogTrivial($"Removing waypoint blips and yield zones."); + //Game.LogTrivial($"Removing waypoint blips and yield zones."); foreach (Waypoint waypoint in path.Waypoints) { if (waypoint.SpeedZone != 0)

=kKvE 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 z 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

=kKvE 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 z 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