mirror of
https://github.com/sp-tarkov/modules.git
synced 2025-02-13 09:50:43 -05:00
Disabled various patches based on client analysis
This commit is contained in:
parent
6667e347f3
commit
32b2136630
@ -1,35 +0,0 @@
|
|||||||
using SPT.Reflection.Patching;
|
|
||||||
using EFT;
|
|
||||||
using HarmonyLib;
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
namespace SPT.SinglePlayer.Patches.Progression
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* There is no reason to update quest counters when exiting the hideout, so set the
|
|
||||||
* player's QuestController to null while calling HideoutPlayer.OnGameSessionEnd to
|
|
||||||
* avoid the quest controller counters from being triggered
|
|
||||||
*
|
|
||||||
* Note: Player.OnGameSessionEnd handles the player's quest controller not being set gracefully
|
|
||||||
*/
|
|
||||||
public class HideoutQuestIgnorePatch : ModulePatch
|
|
||||||
{
|
|
||||||
protected override MethodBase GetTargetMethod()
|
|
||||||
{
|
|
||||||
return AccessTools.Method(typeof(HideoutPlayer), nameof(HideoutPlayer.OnGameSessionEnd));
|
|
||||||
}
|
|
||||||
|
|
||||||
[PatchPrefix]
|
|
||||||
public static void PatchPrefix(ref AbstractQuestControllerClass __state, ref AbstractQuestControllerClass ____questController)
|
|
||||||
{
|
|
||||||
__state = ____questController;
|
|
||||||
____questController = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
[PatchPostfix]
|
|
||||||
public static void PatchPostfix(AbstractQuestControllerClass __state, ref AbstractQuestControllerClass ____questController)
|
|
||||||
{
|
|
||||||
____questController = __state;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
using SPT.Reflection.Patching;
|
|
||||||
using SPT.Reflection.Utils;
|
|
||||||
using EFT;
|
|
||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
namespace SPT.SinglePlayer.Patches.Quests
|
|
||||||
{
|
|
||||||
public class SpawnPmcPatch : ModulePatch
|
|
||||||
{
|
|
||||||
protected override MethodBase GetTargetMethod()
|
|
||||||
{
|
|
||||||
var desiredType = PatchConstants.EftTypes.SingleCustom(IsTargetType);
|
|
||||||
var desiredMethod = desiredType.GetMethod("method_1", PatchConstants.PublicDeclaredFlags);
|
|
||||||
|
|
||||||
Logger.LogDebug($"{this.GetType().Name} Type: {desiredType?.Name}");
|
|
||||||
Logger.LogDebug($"{this.GetType().Name} Method: {desiredMethod?.Name}");
|
|
||||||
|
|
||||||
return desiredMethod;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool IsTargetType(Type type)
|
|
||||||
{
|
|
||||||
if (!typeof(IGetProfileData).IsAssignableFrom(type) || type.GetMethod("method_1", PatchConstants.PublicDeclaredFlags) == null)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var fields = type.GetFields(PatchConstants.PrivateFlags);
|
|
||||||
return fields.Any(f => f.FieldType != typeof(WildSpawnType)) && fields.Any(f => f.FieldType == typeof(BotDifficulty));
|
|
||||||
}
|
|
||||||
|
|
||||||
[PatchPrefix]
|
|
||||||
public static bool PatchPrefix(ref bool __result, WildSpawnType ___wildSpawnType_0, BotDifficulty ___botDifficulty_0, Profile x)
|
|
||||||
{
|
|
||||||
if (x == null)
|
|
||||||
{
|
|
||||||
__result = false;
|
|
||||||
Logger.LogInfo($"profile x was null, ___wildSpawnType_0 = {___wildSpawnType_0}");
|
|
||||||
return false; // Skip original
|
|
||||||
}
|
|
||||||
|
|
||||||
__result = x.Info.Settings.Role == ___wildSpawnType_0 && x.Info.Settings.BotDifficulty == ___botDifficulty_0;
|
|
||||||
|
|
||||||
return false; // Skip original
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,73 +0,0 @@
|
|||||||
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();
|
|
||||||
var filteredSpawns = new List<SpawnPointMarker>();
|
|
||||||
foreach (var spawn in spawnPoints)
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrEmpty(spawn?.SpawnPoint?.Infiltration?.Trim()))
|
|
||||||
{
|
|
||||||
filteredSpawns.Add(spawn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var playerPos = Singleton<GameWorld>.Instance.MainPlayer.Transform.position;
|
|
||||||
SpawnPointMarker closestSpawn = null;
|
|
||||||
var minDist = Mathf.Infinity;
|
|
||||||
|
|
||||||
foreach (var filter in filteredSpawns)
|
|
||||||
{
|
|
||||||
var dist = Vector3.Distance(filter.gameObject.transform.position, playerPos);
|
|
||||||
|
|
||||||
if (dist < minDist)
|
|
||||||
{
|
|
||||||
closestSpawn = filter;
|
|
||||||
minDist = dist;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
___string_0 = closestSpawn.SpawnPoint.Infiltration;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
using System.Reflection;
|
|
||||||
using EFT;
|
|
||||||
using EFT.InventoryLogic;
|
|
||||||
using HarmonyLib;
|
|
||||||
using SPT.Reflection.Patching;
|
|
||||||
using SPT.Reflection.Utils;
|
|
||||||
|
|
||||||
namespace SPT.SinglePlayer.Patches.RaidFix
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// this patch aims to allow achievements and quests to activate/change and finish whilst inraid
|
|
||||||
/// </summary>
|
|
||||||
public class FixQuestAchieveControllersPatch : ModulePatch
|
|
||||||
{
|
|
||||||
protected override MethodBase GetTargetMethod()
|
|
||||||
{
|
|
||||||
return AccessTools.Method(typeof(Player), nameof(Player.Init));
|
|
||||||
}
|
|
||||||
|
|
||||||
[PatchPostfix]
|
|
||||||
public static void PatchPostfix(Profile profile, InventoryController inventoryController, ref AbstractQuestControllerClass ____questController, ref AbstractAchievementControllerClass ____achievementsController)
|
|
||||||
{
|
|
||||||
var questController = new LocalQuestControllerClass(profile, inventoryController, PatchConstants.BackEndSession, true);
|
|
||||||
questController.Init();
|
|
||||||
questController.Run();
|
|
||||||
|
|
||||||
var achievementController =
|
|
||||||
new AchievementControllerClass(profile, inventoryController, PatchConstants.BackEndSession, true);
|
|
||||||
achievementController.Init();
|
|
||||||
achievementController.Run();
|
|
||||||
|
|
||||||
____questController = questController;
|
|
||||||
____achievementsController = achievementController;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
using SPT.Reflection.Patching;
|
|
||||||
using HarmonyLib;
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
using EFT;
|
|
||||||
|
|
||||||
namespace SPT.SinglePlayer.Patches.RaidFix
|
|
||||||
{
|
|
||||||
public class PostRaidHealingPricePatch : ModulePatch
|
|
||||||
{
|
|
||||||
protected override MethodBase GetTargetMethod()
|
|
||||||
{
|
|
||||||
return AccessTools.Method(typeof(Profile.TraderInfo), nameof(Profile.TraderInfo.UpdateLevel));
|
|
||||||
}
|
|
||||||
|
|
||||||
[PatchPrefix]
|
|
||||||
public static void PatchPrefix(Profile.TraderInfo __instance)
|
|
||||||
{
|
|
||||||
if (__instance.Settings == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var loyaltyLevel = __instance.Settings.GetLoyaltyLevel(__instance);
|
|
||||||
var loyaltyLevelSettings = __instance.Settings.GetLoyaltyLevelSettings(loyaltyLevel);
|
|
||||||
|
|
||||||
if (loyaltyLevelSettings == null)
|
|
||||||
{
|
|
||||||
throw new IndexOutOfRangeException($"Loyalty level {loyaltyLevel} not found.");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Backing field of the "CurrentLoyalty" property
|
|
||||||
// Traverse.Create(__instance).Field("<CurrentLoyalty>k__BackingField").SetValue(loyaltyLevelSettings.Value);
|
|
||||||
__instance.CurrentLoyalty = loyaltyLevelSettings.Value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,41 +0,0 @@
|
|||||||
using SPT.Reflection.Patching;
|
|
||||||
using EFT;
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
using HarmonyLib;
|
|
||||||
|
|
||||||
namespace SPT.SinglePlayer.Patches.RaidFix
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Prevent BotSpawnerClass from adjusting the spawn process value to be below 0
|
|
||||||
/// This fixes aiamount = high spawning 80+ bots on maps like streets/customs
|
|
||||||
/// int_0 = all bots alive
|
|
||||||
/// int_1 = followers alive
|
|
||||||
/// int_2 = bosses currently alive
|
|
||||||
/// int_3 = spawn process? - current guess is open spawn positions - bsg doesn't seem to handle negative vaues well
|
|
||||||
/// int_4 = max bots
|
|
||||||
/// </summary>
|
|
||||||
public class SpawnProcessNegativeValuePatch : ModulePatch
|
|
||||||
{
|
|
||||||
protected override MethodBase GetTargetMethod()
|
|
||||||
{
|
|
||||||
return AccessTools.Method(typeof(BotSpawner), nameof(BotSpawner.CheckOnMax));
|
|
||||||
}
|
|
||||||
|
|
||||||
[PatchPrefix]
|
|
||||||
public static bool PatchPreFix(int wantSpawn, ref int toDelay, ref int toSpawn, ref int ____maxBots, int ____allBotsCount, int ____inSpawnProcess)
|
|
||||||
{
|
|
||||||
// Set bots to delay if alive bots + spawning bots count > maxbots
|
|
||||||
// ____inSpawnProcess can be negative, don't go below 0 when calculating
|
|
||||||
if ((____allBotsCount + Math.Max(____inSpawnProcess, 0)) > ____maxBots)
|
|
||||||
{
|
|
||||||
toDelay += wantSpawn;
|
|
||||||
toSpawn = 0;
|
|
||||||
|
|
||||||
return false; // Skip original
|
|
||||||
}
|
|
||||||
|
|
||||||
return true; // Do original
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -13,27 +13,31 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="Assembly-CSharp" HintPath="..\Shared\Hollowed\hollowed.dll" Private="False"/>
|
<Reference Include="Assembly-CSharp" HintPath="..\Shared\Hollowed\hollowed.dll" Private="False" />
|
||||||
<Reference Include="Comfort.Unity" HintPath="..\Shared\Managed\Comfort.Unity.dll" Private="False"/>
|
<Reference Include="Comfort.Unity" HintPath="..\Shared\Managed\Comfort.Unity.dll" Private="False" />
|
||||||
<Reference Include="DissonanceVoip" HintPath="..\Shared\Managed\DissonanceVoip.dll" Private="False"/>
|
<Reference Include="DissonanceVoip" HintPath="..\Shared\Managed\DissonanceVoip.dll" Private="False" />
|
||||||
<Reference Include="ItemComponent.Types" HintPath="..\Shared\Managed\ItemComponent.Types.dll" Private="False"/>
|
<Reference Include="ItemComponent.Types" HintPath="..\Shared\Managed\ItemComponent.Types.dll" Private="False" />
|
||||||
<Reference Include="Comfort" HintPath="..\Shared\Managed\Comfort.dll" Private="False"/>
|
<Reference Include="Comfort" HintPath="..\Shared\Managed\Comfort.dll" Private="False" />
|
||||||
<Reference Include="UnityEngine" HintPath="..\Shared\Managed\UnityEngine.dll" Private="False"/>
|
<Reference Include="UnityEngine" HintPath="..\Shared\Managed\UnityEngine.dll" Private="False" />
|
||||||
<Reference Include="UnityEngine.AudioModule" HintPath="..\Shared\Managed\UnityEngine.AudioModule.dll" Private="False"/>
|
<Reference Include="UnityEngine.AudioModule" HintPath="..\Shared\Managed\UnityEngine.AudioModule.dll" Private="False" />
|
||||||
<Reference Include="UnityEngine.CoreModule" HintPath="..\Shared\Managed\UnityEngine.CoreModule.dll" Private="False"/>
|
<Reference Include="UnityEngine.CoreModule" HintPath="..\Shared\Managed\UnityEngine.CoreModule.dll" Private="False" />
|
||||||
<Reference Include="Sirenix.Serialization" HintPath="..\Shared\Managed\Sirenix.Serialization.dll" Private="False"/>
|
<Reference Include="Sirenix.Serialization" HintPath="..\Shared\Managed\Sirenix.Serialization.dll" Private="False" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" ExcludeAssets="runtime" PrivateAssets="all">
|
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" ExcludeAssets="runtime" PrivateAssets="all">
|
||||||
<IncludeAssets>compile; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>compile; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.2"/>
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\SPT.Common\SPT.Common.csproj"/>
|
<ProjectReference Include="..\SPT.Common\SPT.Common.csproj" />
|
||||||
<ProjectReference Include="..\SPT.Reflection\SPT.Reflection.csproj"/>
|
<ProjectReference Include="..\SPT.Reflection\SPT.Reflection.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="Patches\Quests\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -2,7 +2,6 @@ using System;
|
|||||||
using SPT.Common;
|
using SPT.Common;
|
||||||
using SPT.SinglePlayer.Patches.MainMenu;
|
using SPT.SinglePlayer.Patches.MainMenu;
|
||||||
using SPT.SinglePlayer.Patches.Progression;
|
using SPT.SinglePlayer.Patches.Progression;
|
||||||
using SPT.SinglePlayer.Patches.Quests;
|
|
||||||
using SPT.SinglePlayer.Patches.RaidFix;
|
using SPT.SinglePlayer.Patches.RaidFix;
|
||||||
using SPT.SinglePlayer.Patches.ScavMode;
|
using SPT.SinglePlayer.Patches.ScavMode;
|
||||||
using BepInEx;
|
using BepInEx;
|
||||||
@ -19,18 +18,14 @@ namespace SPT.SinglePlayer
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// TODO: check if these patches are needed
|
// TODO: check if these patches are needed
|
||||||
new TinnitusFixPatch().Enable();
|
new TinnitusFixPatch().Enable(); // Probably needed
|
||||||
new EmptyInfilFixPatch().Enable();
|
//new EmptyInfilFixPatch().Enable();
|
||||||
new MaxBotPatch().Enable();
|
new MaxBotPatch().Enable(); // Custom code, needed
|
||||||
new PostRaidHealingPricePatch().Enable();
|
//new PostRaidHealingPricePatch().Enable(); // Client handles this now
|
||||||
new HideoutQuestIgnorePatch().Enable();
|
//new HideoutQuestIgnorePatch().Enable(); // Was only needed because FixQuestAchieveControllersPatch was causing issues
|
||||||
new SpawnProcessNegativeValuePatch().Enable();
|
//new SpawnProcessNegativeValuePatch().Enable(); // Client handles this edge case, revisit if bot count keeps going up
|
||||||
new SpawnPmcPatch().Enable();
|
//new SpawnPmcPatch().Enable(); // 2.5+ years old, PMC spawn system very different, likely not needed
|
||||||
// new ScavRepAdjustmentPatch().Enable();
|
//new FixQuestAchieveControllersPatch().Enable(); // Likely not needed, if cheevos don't appear, revisit patch
|
||||||
|
|
||||||
// new ArmorDamageCounterPatch().Enable();
|
|
||||||
// new AmmoUsedCounterPatch().Enable();
|
|
||||||
|
|
||||||
|
|
||||||
// Still need
|
// Still need
|
||||||
// new SmokeGrenadeFuseSoundFixPatch().Enable(); TODO: refactor as it causes exceptions to be thrown when grenade is tossed by player
|
// new SmokeGrenadeFuseSoundFixPatch().Enable(); TODO: refactor as it causes exceptions to be thrown when grenade is tossed by player
|
||||||
@ -60,7 +55,6 @@ namespace SPT.SinglePlayer
|
|||||||
new GetProfileAtEndOfRaidPatch().Enable();
|
new GetProfileAtEndOfRaidPatch().Enable();
|
||||||
new FixSavageInventoryScreenPatch().Enable();
|
new FixSavageInventoryScreenPatch().Enable();
|
||||||
new InsuranceScreenPatch().Enable();
|
new InsuranceScreenPatch().Enable();
|
||||||
new FixQuestAchieveControllersPatch().Enable();
|
|
||||||
new RemoveStashUpgradeLabelPatch().Enable();
|
new RemoveStashUpgradeLabelPatch().Enable();
|
||||||
new RemoveClothingItemExternalObtainLabelPatch().Enable();
|
new RemoveClothingItemExternalObtainLabelPatch().Enable();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user