From dd4366efcf607eff0ac944ff623e6cd31f7e44bf Mon Sep 17 00:00:00 2001 From: Dev Date: Wed, 12 Jul 2023 16:54:53 +0100 Subject: [PATCH] Partial revert of getnewbottemplate fix, added check to perform original method if bot profiles are already present --- .../RaidFix/GetNewBotTemplatesPatch.cs | 45 +++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/project/Aki.SinglePlayer/Patches/RaidFix/GetNewBotTemplatesPatch.cs b/project/Aki.SinglePlayer/Patches/RaidFix/GetNewBotTemplatesPatch.cs index 5d3fa75..2bb094e 100644 --- a/project/Aki.SinglePlayer/Patches/RaidFix/GetNewBotTemplatesPatch.cs +++ b/project/Aki.SinglePlayer/Patches/RaidFix/GetNewBotTemplatesPatch.cs @@ -6,6 +6,7 @@ using Aki.Reflection.Patching; using Aki.Reflection.Utils; using Aki.SinglePlayer.Models.RaidFix; using System; +using System.Collections.Generic; namespace Aki.SinglePlayer.Patches.RaidFix { @@ -50,12 +51,50 @@ namespace Aki.SinglePlayer.Patches.RaidFix && parameters[2].Name == "withDelete"); } + /// + /// BotsPresets.GetNewProfile() + /// [PatchPrefix] - private static bool PatchPrefix(ref Task __result, BotsPresets __instance, GClass626 data, ref bool withDelete) + private static bool PatchPrefix(ref Task __result, BotsPresets __instance, List ___list_0, GClass626 data, ref bool withDelete) { - withDelete = true; + /* + When client wants new bot and GetNewProfile() return null (if not more available templates or they don't satisfy by Role and Difficulty condition) + then client gets new piece of WaveInfo collection (with Limit = 30 by default) and make request to server + but use only first value in response (this creates a lot of garbage and cause freezes) + after patch we request only 1 template from server along with other patches this one causes to call data.PrepareToLoadBackend(1) gets the result with required role and difficulty: + new[] { new WaveInfo() { Limit = 1, Role = role, Difficulty = difficulty } } + then perform request to server and get only first value of resulting single element collection + */ - return true; // do original method + if (___list_0?.Count > 0) + { + // List of profiles already has data, do original function + return true; // Do original function + } + + try + { + // Force true to ensure bot profile is deleted after use + _getNewProfileMethod.Invoke(__instance, new object[] { data, true }); + } + catch (Exception e) + { + Logger.LogDebug($"getnewbot failed: {e.Message} {e.InnerException}"); + throw; + } + + // Load from server + var source = data.PrepareToLoadBackend(1).Take(1).ToList(); + + var taskScheduler = TaskScheduler.FromCurrentSynchronizationContext(); + var taskAwaiter = (Task)null; + taskAwaiter = PatchConstants.BackEndSession.LoadBots(source).ContinueWith(GetFirstResult, taskScheduler); + + // Load bundles for bot profile + var continuation = new BundleLoader(taskScheduler); + __result = taskAwaiter.ContinueWith(continuation.LoadBundles, taskScheduler).Unwrap(); + + return false; } private static Profile GetFirstResult(Task task)