0
0
mirror of https://github.com/sp-tarkov/modules.git synced 2025-02-12 14:50:43 -05:00

Fix scav extracts (!176)

- Re-add the "EmptyInfilPatch" as it's necessary for scav raids, otherwise the extract controller doesn't get initialized

Co-authored-by: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com>
Reviewed-on: SPT/Modules#176
Co-authored-by: DrakiaXYZ <drakiaxyz@noreply.dev.sp-tarkov.com>
Co-committed-by: DrakiaXYZ <drakiaxyz@noreply.dev.sp-tarkov.com>
This commit is contained in:
DrakiaXYZ 2024-11-20 09:22:53 +00:00 committed by chomp
parent 5a58e03854
commit d58f48fc3e
2 changed files with 76 additions and 1 deletions

View File

@ -0,0 +1,75 @@
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using SPT.Reflection.Patching;
using SPT.Reflection.Utils;
using Comfort.Common;
using EFT;
using EFT.Game.Spawning;
using UnityEngine;
namespace SPT.SinglePlayer.Patches.RaidFix
{
/// <summary>
/// An empty EntryPoint string (string_0 in BaseLocalGame) causes exfil point initialization to be skipped.
/// This patch sets an EntryPoint string if it's missing.
/// </summary>
public class EmptyInfilFixPatch : ModulePatch
{
protected override MethodBase GetTargetMethod()
{
var desiredType = PatchConstants.LocalGameType.BaseType;
var desiredMethod = desiredType
.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.CreateInstance)
.SingleCustom(IsTargetMethod);
Logger.LogDebug($"{this.GetType().Name} Type: {desiredType?.Name}");
Logger.LogDebug($"{this.GetType().Name} Method: {desiredMethod?.Name}");
return desiredMethod;
}
private static bool IsTargetMethod(MethodInfo methodInfo)
{
return (methodInfo.IsVirtual
&& methodInfo.GetParameters().Length == 0
&& methodInfo.ReturnType == typeof(void)
&& methodInfo.GetMethodBody().LocalVariables.Count > 0);
}
[PatchPrefix]
public static void PatchPrefix(ref string ___string_0)
{
if (!string.IsNullOrWhiteSpace(___string_0)) return;
var spawnPoints = Resources.FindObjectsOfTypeAll<SpawnPointMarker>().ToList();
List<SpawnPointMarker> filtered = new List<SpawnPointMarker>();
foreach (var spawn in spawnPoints)
{
if (!string.IsNullOrEmpty(spawn?.SpawnPoint?.Infiltration?.Trim()))
{
filtered.Add(spawn);
}
}
var playerPos = Singleton<GameWorld>.Instance.MainPlayer.Transform.position;
SpawnPointMarker closestSpawn = null;
var minDist = Mathf.Infinity;
foreach (var filter in filtered)
{
var dist = Vector3.Distance(filter.gameObject.transform.position, playerPos);
if (dist < minDist)
{
closestSpawn = filter;
minDist = dist;
}
}
___string_0 = closestSpawn.SpawnPoint.Infiltration;
}
}
}

View File

@ -20,7 +20,7 @@ namespace SPT.SinglePlayer
{
// TODO: check if these patches are needed
new TinnitusFixPatch().Enable(); // Probably needed
//new EmptyInfilFixPatch().Enable();
new EmptyInfilFixPatch().Enable();
new OverrideMaxAiAliveInRaidValuePatch().Enable();
//new PostRaidHealingPricePatch().Enable(); // Client handles this now
//new HideoutQuestIgnorePatch().Enable(); // Was only needed because FixQuestAchieveControllersPatch was causing issues