2023-03-03 18:52:31 +00:00
using System.Linq ;
using System.Reflection ;
using System.Threading.Tasks ;
using EFT ;
using Aki.Reflection.Patching ;
using Aki.Reflection.Utils ;
using Aki.SinglePlayer.Models.RaidFix ;
2023-06-25 13:49:48 +01:00
using System ;
2023-03-03 18:52:31 +00:00
namespace Aki.SinglePlayer.Patches.RaidFix
{
public class GetNewBotTemplatesPatch : ModulePatch
{
private static MethodInfo _getNewProfileMethod ;
static GetNewBotTemplatesPatch ( )
{
_ = nameof ( IBotData . PrepareToLoadBackend ) ;
_ = nameof ( BotsPresets . GetNewProfile ) ;
_ = nameof ( PoolManager . LoadBundlesAndCreatePools ) ;
_ = nameof ( JobPriority . General ) ;
}
public GetNewBotTemplatesPatch ( )
{
2023-07-07 16:15:22 +01:00
var desiredType = typeof ( BotsPresets ) ;
_getNewProfileMethod = desiredType
2023-07-09 14:51:13 +01:00
. GetMethod ( nameof ( BotsPresets . GetNewProfile ) , BindingFlags . Instance | BindingFlags . NonPublic ) ; // want the func with 2 params (protected + inherited from base)
2023-07-07 16:15:22 +01:00
Logger . LogDebug ( $"{this.GetType().Name} Type: {desiredType?.Name}" ) ;
Logger . LogDebug ( $"{this.GetType().Name} Method: {_getNewProfileMethod?.Name}" ) ;
2023-03-03 18:52:31 +00:00
}
2023-07-09 14:51:13 +01:00
/// <summary>
/// Looking for CreateProfile()
/// </summary>
/// <returns></returns>
2023-03-03 18:52:31 +00:00
protected override MethodBase GetTargetMethod ( )
{
return typeof ( BotsPresets ) . GetMethods ( BindingFlags . Public | BindingFlags . Instance | BindingFlags . DeclaredOnly )
. Single ( x = > IsTargetMethod ( x ) ) ;
}
private bool IsTargetMethod ( MethodInfo mi )
{
var parameters = mi . GetParameters ( ) ;
2023-07-07 15:01:45 +01:00
return ( parameters . Length = = 3
2023-03-03 18:52:31 +00:00
& & parameters [ 0 ] . Name = = "data"
2023-07-07 15:01:45 +01:00
& & parameters [ 1 ] . Name = = "cancellationToken"
& & parameters [ 2 ] . Name = = "withDelete" ) ;
2023-03-03 18:52:31 +00:00
}
[PatchPrefix]
2023-07-09 14:51:13 +01:00
private static bool PatchPrefix ( ref Task < Profile > __result , BotsPresets __instance , GClass626 data , ref bool withDelete )
2023-03-03 18:52:31 +00:00
{
2023-07-09 14:51:13 +01:00
withDelete = true ;
2023-03-03 18:52:31 +00:00
2023-07-09 14:51:13 +01:00
return true ; // do original method
2023-03-03 18:52:31 +00:00
}
private static Profile GetFirstResult ( Task < Profile [ ] > task )
{
var result = task . Result [ 0 ] ;
2023-06-25 13:49:48 +01:00
Logger . LogInfo ( $"{DateTime.Now:T} Loading bot {result.Info.Nickname} profile from server. role: {result.Info.Settings.Role} side: {result.Side}" ) ;
2023-03-03 18:52:31 +00:00
return result ;
}
}
}