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)