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) {