diff --git a/project/SPT.SinglePlayer/Patches/RaidFix/BotOwnerManualUpdatePatch.cs b/project/SPT.SinglePlayer/Patches/RaidFix/BotOwnerManualUpdatePatch.cs
new file mode 100644
index 0000000..ead0fd9
--- /dev/null
+++ b/project/SPT.SinglePlayer/Patches/RaidFix/BotOwnerManualUpdatePatch.cs
@@ -0,0 +1,81 @@
+using EFT;
+using EFT.Game.Spawning;
+using SPT.Reflection.Patching;
+using System.Reflection;
+using UnityEngine;
+using UnityEngine.AI;
+
+namespace SPT.SinglePlayer.Patches.RaidFix
+{
+ ///
+ /// Patch used to stop the allocation of a new every frame for all active AI
+ ///
+ public class BotOwnerManualUpdatePatch : ModulePatch
+ {
+ protected override MethodBase GetTargetMethod()
+ {
+ return typeof(BotOwner).GetMethod(nameof(BotOwner.UpdateManual));
+ }
+
+ [PatchPrefix]
+ public static bool Prefix(BotOwner __instance, float ____nextGetGoalTime, ref float ____nextTimeCheckBorn)
+ {
+ if (__instance.BotState == EBotState.Active && __instance.GetPlayer.HealthController.IsAlive)
+ {
+ __instance.StandBy.Update();
+ __instance.LookSensor.ManualUpdate();
+ if (__instance.StandBy.StandByType != BotStandByType.paused)
+ {
+ if (____nextGetGoalTime < Time.time)
+ {
+ __instance.CalcGoal();
+ }
+ __instance.SuppressShoot.ManualUpdate();
+ __instance.HeadData.ManualUpdate();
+ __instance.ShootData.ManualUpdate();
+ __instance.Tilt.ManualUpdate();
+ __instance.NightVision.ManualUpdate();
+ __instance.NearDoorData.Update();
+ __instance.DogFight.ManualUpdate();
+ __instance.FriendChecker.ManualUpdate();
+ __instance.RecoilData.LosingRecoil();
+ __instance.Mover.ManualUpdate();
+ __instance.AimingData.PermanentUpdate();
+ __instance.Medecine.ManualUpdate();
+ __instance.Boss.ManualUpdate();
+ __instance.BotTalk.ManualUpdate();
+ __instance.WeaponManager.ManualUpdate();
+ __instance.BotRequestController.Update();
+ __instance.GrenadeToPortal.ManualUpdate();
+ __instance.Tactic.UpdateChangeTactics();
+ __instance.Memory.ManualUpdate(Time.deltaTime);
+ __instance.Settings.UpdateManual();
+ __instance.BotRequestController.TryToFind();
+ __instance.ArtilleryDangerPlace.ManualUpdate();
+ if (__instance.GetPlayer.UpdateQueue == EUpdateQueue.Update)
+ {
+ __instance.Mover.ManualFixedUpdate();
+ __instance.Steering.ManualFixedUpdate();
+ }
+ __instance.UnityEditorRunChecker.ManualLateUpdate();
+ }
+ return false;
+ }
+ if (__instance.BotState == EBotState.PreActive && __instance.WeaponManager.IsReady)
+ {
+ if (NavMesh.SamplePosition(__instance.GetPlayer.Position, out _, 0.6f, -1))
+ {
+ __instance.method_10();
+ return false;
+ }
+ if (____nextTimeCheckBorn < Time.time)
+ {
+ ____nextTimeCheckBorn = Time.time + 1f;
+ __instance.Transform.position = __instance.BotsGroup.BotZone.SpawnPoints.RandomElement().Position + Vector3.up * 0.5f;
+ __instance.method_10();
+ }
+ }
+ return false;
+ }
+ }
+}
diff --git a/project/SPT.SinglePlayer/SPT.SinglePlayer.csproj b/project/SPT.SinglePlayer/SPT.SinglePlayer.csproj
index 91875af..a892478 100644
--- a/project/SPT.SinglePlayer/SPT.SinglePlayer.csproj
+++ b/project/SPT.SinglePlayer/SPT.SinglePlayer.csproj
@@ -19,6 +19,7 @@
+
diff --git a/project/SPT.SinglePlayer/SPTSingleplayerPlugin.cs b/project/SPT.SinglePlayer/SPTSingleplayerPlugin.cs
index 8cda941..3196f61 100644
--- a/project/SPT.SinglePlayer/SPTSingleplayerPlugin.cs
+++ b/project/SPT.SinglePlayer/SPTSingleplayerPlugin.cs
@@ -61,6 +61,7 @@ namespace SPT.SinglePlayer
new RemoveClothingItemExternalObtainLabelPatch().Enable();
new FixLocalRaidPatch().Enable();
new ScavIsPlayerEnemyPatch().Enable();
+ new BotOwnerManualUpdatePatch().Enable();
}
catch (Exception ex)
{