From 301523766152b2d796ee3d5ca45644f777ac8428 Mon Sep 17 00:00:00 2001 From: SamSWAT Date: Thu, 29 Jun 2023 19:30:53 +0300 Subject: [PATCH] BlessRNG --- project/SamSWAT.HeliCrash/HeliCrash.cs | 37 ++++++++---------- project/SamSWAT.HeliCrash/HeliCrashPatch.cs | 23 +++++------ project/SamSWAT.HeliCrash/Plugin.cs | 12 ++++-- .../SamSWAT.HeliCrash.csproj | 5 ++- project/SamSWAT.HeliCrash/Utils/BlessRNG.cs | 38 +++++++++++++++++++ .../{ => Utils}/HeliCrashLocations.cs | 0 .../SamSWAT.HeliCrash/{ => Utils}/Utils.cs | 0 7 files changed, 74 insertions(+), 41 deletions(-) create mode 100644 project/SamSWAT.HeliCrash/Utils/BlessRNG.cs rename project/SamSWAT.HeliCrash/{ => Utils}/HeliCrashLocations.cs (100%) rename project/SamSWAT.HeliCrash/{ => Utils}/Utils.cs (100%) diff --git a/project/SamSWAT.HeliCrash/HeliCrash.cs b/project/SamSWAT.HeliCrash/HeliCrash.cs index 9068928..8be8651 100644 --- a/project/SamSWAT.HeliCrash/HeliCrash.cs +++ b/project/SamSWAT.HeliCrash/HeliCrash.cs @@ -35,35 +35,35 @@ namespace SamSWAT.HeliCrash { case "bigmap": { - return PickRandom(Plugin.HeliCrashLocations.Customs); + return Plugin.HeliCrashLocations.Customs.Shuffle().SelectRandom(); } case "Interchange": { - return PickRandom(Plugin.HeliCrashLocations.Interchange); + return Plugin.HeliCrashLocations.Interchange.Shuffle().SelectRandom();; } case "RezervBase": { - return PickRandom(Plugin.HeliCrashLocations.Rezerv); + return Plugin.HeliCrashLocations.Rezerv.Shuffle().SelectRandom();; } case "Shoreline": { - return PickRandom(Plugin.HeliCrashLocations.Shoreline); + return Plugin.HeliCrashLocations.Shoreline.Shuffle().SelectRandom();; } case "Woods": { - return PickRandom(Plugin.HeliCrashLocations.Woods); + return Plugin.HeliCrashLocations.Woods.Shuffle().SelectRandom();; } case "Lighthouse": { - return PickRandom(Plugin.HeliCrashLocations.Lighthouse); + return Plugin.HeliCrashLocations.Lighthouse.Shuffle().SelectRandom();; } case "TarkovStreets": { - return PickRandom(Plugin.HeliCrashLocations.StreetsOfTarkov); + return Plugin.HeliCrashLocations.StreetsOfTarkov.Shuffle().SelectRandom();; } case "develop": { - return PickRandom(Plugin.HeliCrashLocations.Develop); + return Plugin.HeliCrashLocations.Develop.Shuffle().SelectRandom();; } default: return new Location(); } @@ -71,7 +71,7 @@ namespace SamSWAT.HeliCrash private async Task LoadChoppaAsync() { - string path = Plugin.Directory + "Assets/Content/Vehicles/sikorsky_uh60_blackhawk.bundle"; + var path = $"{Plugin.Directory}/Assets/Content/Vehicles/sikorsky_uh60_blackhawk.bundle"; var bundleLoadRequest = AssetBundle.LoadFromFileAsync(path); @@ -82,6 +82,7 @@ namespace SamSWAT.HeliCrash if (_heliBundle == null) { + Plugin.LogSource.LogFatal("Can't load UH-60 Blackhawk bundle"); Debug.LogError("[SamSWAT.HeliCrash]: Can't load UH-60 Blackhawk bundle"); return null; } @@ -91,20 +92,14 @@ namespace SamSWAT.HeliCrash while (!assetLoadRequest.isDone) await Task.Yield(); - var requestedGO = assetLoadRequest.allAssets[0] as GameObject; + var requestedGo = assetLoadRequest.allAssets[0] as GameObject; - if (requestedGO == null) - { - Debug.LogError("[SamSWAT.HeliCrash]: failed to load asset"); - return null; - } + if (requestedGo != null) return requestedGo; + + Plugin.LogSource.LogFatal("Failed to load heli asset"); + Debug.LogError("[SamSWAT.HeliCrash]: failed to load heli asset"); + return null; - return requestedGO; - } - - private T PickRandom(List list) - { - return list[Random.Range(0, list.Count)]; } } } diff --git a/project/SamSWAT.HeliCrash/HeliCrashPatch.cs b/project/SamSWAT.HeliCrash/HeliCrashPatch.cs index 36b5507..e9c8b36 100644 --- a/project/SamSWAT.HeliCrash/HeliCrashPatch.cs +++ b/project/SamSWAT.HeliCrash/HeliCrashPatch.cs @@ -13,26 +13,21 @@ namespace SamSWAT.HeliCrash { protected override MethodBase GetTargetMethod() { - return PatchConstants.LocalGameType.BaseType.GetMethod("method_10", BindingFlags.NonPublic | BindingFlags.Instance); + //return PatchConstants.LocalGameType.BaseType.GetMethod("method_10", BindingFlags.NonPublic | BindingFlags.Instance); + return typeof(GameWorld).GetMethod(nameof(GameWorld.OnGameStarted)); } [PatchPostfix] public static void PatchPostfix() { var gameWorld = Singleton.Instance; - bool crashAvailable = LocationScene.GetAll().Any(); - string location = gameWorld.RegisteredPlayers[0].Location; - - if (gameWorld != null && crashAvailable && WillHeliCrash()) - { - var heliCrash = gameWorld.gameObject.AddComponent(); - heliCrash.Init(location); - } - } - - private static bool WillHeliCrash() - { - return Random.Range(0, 100) <= Plugin.HeliCrashChance.Value; + var crashAvailable = LocationScene.GetAll().Any(); + var location = gameWorld.RegisteredPlayers[0].Location; + + if (gameWorld == null || !crashAvailable || !BlessRNG.RngBool(Plugin.HeliCrashChance.Value)) return; + + var heliCrash = gameWorld.gameObject.AddComponent(); + heliCrash.Init(location); } } } diff --git a/project/SamSWAT.HeliCrash/Plugin.cs b/project/SamSWAT.HeliCrash/Plugin.cs index d070475..97c938c 100644 --- a/project/SamSWAT.HeliCrash/Plugin.cs +++ b/project/SamSWAT.HeliCrash/Plugin.cs @@ -2,21 +2,25 @@ using BepInEx.Configuration; using Newtonsoft.Json; using System.IO; +using System.Reflection; +using BepInEx.Logging; namespace SamSWAT.HeliCrash { - [BepInPlugin("com.SamSWAT.HeliCrash", "SamSWAT.HeliCrash", "2.0.0")] + [BepInPlugin("com.SamSWAT.HeliCrash", "SamSWAT.HeliCrash", "2.1.0")] public class Plugin : BaseUnityPlugin { - public static HeliCrashLocations HeliCrashLocations; + internal static HeliCrashLocations HeliCrashLocations; internal static string Directory; internal static ConfigEntry HeliCrashChance; + internal static ManualLogSource LogSource; private void Awake() { - Directory = Path.Combine(BepInEx.Paths.PluginPath, "SamSWAT.HeliCrash/").Replace("\\", "/"); + LogSource = Logger; + Directory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); new HeliCrashPatch().Enable(); - var json = File.ReadAllText(Directory + "HeliCrashLocations.json"); + var json = File.ReadAllText($"{Directory}/HeliCrashLocations.json"); HeliCrashLocations = JsonConvert.DeserializeObject(json); HeliCrashChance = Config.Bind( diff --git a/project/SamSWAT.HeliCrash/SamSWAT.HeliCrash.csproj b/project/SamSWAT.HeliCrash/SamSWAT.HeliCrash.csproj index 8c6de5f..2a591bd 100644 --- a/project/SamSWAT.HeliCrash/SamSWAT.HeliCrash.csproj +++ b/project/SamSWAT.HeliCrash/SamSWAT.HeliCrash.csproj @@ -63,11 +63,12 @@ - - + + + \ No newline at end of file diff --git a/project/SamSWAT.HeliCrash/Utils/BlessRNG.cs b/project/SamSWAT.HeliCrash/Utils/BlessRNG.cs new file mode 100644 index 0000000..e1552f4 --- /dev/null +++ b/project/SamSWAT.HeliCrash/Utils/BlessRNG.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace SamSWAT.HeliCrash +{ + internal static class BlessRNG + { + private static readonly Random Rng = new Random((int) DateTime.Now.Ticks); + + private static float Random(float a, float b) + { + var num = (float) Rng.NextDouble(); + return a + (b - a) * num; + } + + public static T SelectRandom(this IReadOnlyList list) + { + if (list.Count == 0) + { + return default; + } + + var index = Rng.Next(0, list.Count); + return list[index]; + } + + public static bool RngBool(float chanceInPercent = 50f) + { + return Random(0f, 100f) < chanceInPercent; + } + + internal static List Shuffle(this List l) + { + return l.OrderBy(x => Random(0.0f, 5f)).ToList(); + } + } +} \ No newline at end of file diff --git a/project/SamSWAT.HeliCrash/HeliCrashLocations.cs b/project/SamSWAT.HeliCrash/Utils/HeliCrashLocations.cs similarity index 100% rename from project/SamSWAT.HeliCrash/HeliCrashLocations.cs rename to project/SamSWAT.HeliCrash/Utils/HeliCrashLocations.cs diff --git a/project/SamSWAT.HeliCrash/Utils.cs b/project/SamSWAT.HeliCrash/Utils/Utils.cs similarity index 100% rename from project/SamSWAT.HeliCrash/Utils.cs rename to project/SamSWAT.HeliCrash/Utils/Utils.cs