diff --git a/project/Aki.Custom/AkiCustomPlugin.cs b/project/Aki.Custom/AkiCustomPlugin.cs index 0d16b9d..05c3739 100644 --- a/project/Aki.Custom/AkiCustomPlugin.cs +++ b/project/Aki.Custom/AkiCustomPlugin.cs @@ -61,9 +61,10 @@ namespace Aki.Custom new BTRTurretDefaultAimingPositionPatch().Enable(); new BTRIsDoorsClosedPath().Enable(); new BTRPatch().Enable(); + new BTRSpawnBotAtRaidStartPatch().Enable(); new BTRTransferItemsPatch().Enable(); new BTREndRaidItemDeliveryPatch().Enable(); - new BTRBaseLocalGameStopPatch().Enable(); + new BTRDestroyAtRaidEndPatch().Enable(); } catch (Exception ex) { diff --git a/project/Aki.Custom/BTR/BTRManager.cs b/project/Aki.Custom/BTR/BTRManager.cs index e23b216..0368846 100644 --- a/project/Aki.Custom/BTR/BTRManager.cs +++ b/project/Aki.Custom/BTR/BTRManager.cs @@ -161,7 +161,6 @@ namespace Aki.Custom.BTR var botsController = Singleton.Instance.BotsController; btrBotService = botsController.BotTradersServices.BTRServices; btrController.method_3(); // spawns server-side BTR game object - botsController.BotSpawner.SpawnBotBTR(); // spawns the scav bot which controls the BTR's turret // Initial BTR configuration btrServerSide = btrController.BtrVehicle; diff --git a/project/Aki.Custom/BTR/Patches/BTRBotInitPatch.cs b/project/Aki.Custom/BTR/Patches/BTRBotInitPatch.cs index 4598955..06b0779 100644 --- a/project/Aki.Custom/BTR/Patches/BTRBotInitPatch.cs +++ b/project/Aki.Custom/BTR/Patches/BTRBotInitPatch.cs @@ -25,63 +25,67 @@ namespace Aki.Custom.BTR.Patches return AccessTools.Method(typeof(BTRTurretView), nameof(BTRTurretView.method_1)); } - [PatchPostfix] - private static void PatchPostfix(BTRTurretView __instance, int btrBotId, ref bool __result) + [PatchPrefix] + private static bool PatchPrefix(BTRTurretView __instance, int btrBotId, ref bool __result) { var gameWorld = Singleton.Instance; if (gameWorld == null) { Logger.LogError("[AKI-BTR] BTRBotInitPatch - GameWorld is null"); - return; + __result = false; + return false; } var alivePlayersList = gameWorld.AllAlivePlayersList; bool doesBtrBotExist = alivePlayersList.Exists(x => x.Id == btrBotId); - if (doesBtrBotExist) + if (!doesBtrBotExist) { - try + __result = false; + return false; + } + try + { + Player player = alivePlayersList.First(x => x.Id == btrBotId); + + Renderer[] array = player.GetComponentsInChildren(); + for (int i = 0; i < array.Length; i++) { - Player player = alivePlayersList.First(x => x.Id == btrBotId); - - Renderer[] array = player.GetComponentsInChildren(); - for (int i = 0; i < array.Length; i++) - { - array[i].enabled = false; - } - - var aiFirearmController = player.gameObject.GetComponent(); - var currentWeaponPrefab = (WeaponPrefab)AccessTools.Field(aiFirearmController.GetType(), "weaponPrefab_0").GetValue(aiFirearmController); - if (currentWeaponPrefab.RemoveChildrenOf != null) - { - foreach (var text in currentWeaponPrefab.RemoveChildrenOf) - { - var transform = currentWeaponPrefab.transform.FindTransform(text); - transform.gameObject.SetActive(false); - } - } - foreach (var renderer in currentWeaponPrefab.GetComponentsInChildren()) - { - if (renderer.name == "MuzzleJetCombinedMesh") - { - renderer.transform.localPosition = new Vector3(0.18f, 0f, -0.095f); - } - else - { - renderer.enabled = false; - } - } - - var tuple = new ValueTuple(new ObservedPlayerView(), true); - var btrTurretViewTupleField = AccessTools.Field(__instance.GetType(), "valueTuple_0"); - btrTurretViewTupleField.SetValue(__instance, tuple); - - __result = true; + array[i].enabled = false; } - catch + + var aiFirearmController = player.gameObject.GetComponent(); + var currentWeaponPrefab = (WeaponPrefab)AccessTools.Field(aiFirearmController.GetType(), "weaponPrefab_0").GetValue(aiFirearmController); + if (currentWeaponPrefab.RemoveChildrenOf != null) { - ConsoleScreen.LogError("[AKI-BTR] BtrBot initialization failed, BtrBot will be visible ingame. Check logs."); - throw; + foreach (var text in currentWeaponPrefab.RemoveChildrenOf) + { + var transform = currentWeaponPrefab.transform.FindTransform(text); + transform.gameObject.SetActive(false); + } } + foreach (var renderer in currentWeaponPrefab.GetComponentsInChildren()) + { + if (renderer.name == "MuzzleJetCombinedMesh") + { + renderer.transform.localPosition = new Vector3(0.18f, 0f, -0.095f); + } + else + { + renderer.enabled = false; + } + } + + var tuple = new ValueTuple(new ObservedPlayerView(), true); + var btrTurretViewTupleField = AccessTools.Field(__instance.GetType(), "valueTuple_0"); + btrTurretViewTupleField.SetValue(__instance, tuple); + + __result = true; + return false; + } + catch + { + ConsoleScreen.LogError("[AKI-BTR] BtrBot initialization failed, BtrBot will be visible ingame. Check logs."); + throw; } } } diff --git a/project/Aki.Custom/BTR/Patches/BTRBaseLocalGameStopPatch.cs b/project/Aki.Custom/BTR/Patches/BTRDestroyAtRaidEndPatch.cs similarity index 82% rename from project/Aki.Custom/BTR/Patches/BTRBaseLocalGameStopPatch.cs rename to project/Aki.Custom/BTR/Patches/BTRDestroyAtRaidEndPatch.cs index d963b51..ab399eb 100644 --- a/project/Aki.Custom/BTR/Patches/BTRBaseLocalGameStopPatch.cs +++ b/project/Aki.Custom/BTR/Patches/BTRDestroyAtRaidEndPatch.cs @@ -7,7 +7,7 @@ using Object = UnityEngine.Object; namespace Aki.Custom.BTR.Patches { - public class BTRBaseLocalGameStopPatch : ModulePatch + public class BTRDestroyAtRaidEndPatch : ModulePatch { protected override MethodBase GetTargetMethod() { @@ -26,7 +26,7 @@ namespace Aki.Custom.BTR.Patches var btrManager = gameWorld.GetComponent(); if (btrManager != null) { - Logger.LogWarning("[AKI-BTR] BTRBaseLocalGameStopPatch - Raid Ended: Destroying BTRManager"); + Logger.LogWarning("[AKI-BTR] BTRDestroyAtRaidEndPatch - Raid Ended: Destroying BTRManager"); Object.Destroy(btrManager); } } diff --git a/project/Aki.Custom/BTR/Patches/BTRSpawnBotAtRaidStartPatch.cs b/project/Aki.Custom/BTR/Patches/BTRSpawnBotAtRaidStartPatch.cs new file mode 100644 index 0000000..ea0ad49 --- /dev/null +++ b/project/Aki.Custom/BTR/Patches/BTRSpawnBotAtRaidStartPatch.cs @@ -0,0 +1,34 @@ +using Aki.Reflection.Patching; +using Comfort.Common; +using EFT; +using HarmonyLib; +using System.Reflection; + +namespace Aki.Custom.BTR.Patches +{ + public class BTRSpawnBotAtRaidStartPatch : ModulePatch + { + protected override MethodBase GetTargetMethod() + { + return AccessTools.Method(typeof(GameWorld), nameof(GameWorld.OnGameStarted)); + } + + [PatchPostfix] + private static void PatchPostfix(GameWorld __instance) + { + var btrManager = __instance.GetComponent(); + if (btrManager == null) + { + return; + } + + var botGame = Singleton.Instance; + if (botGame == null) + { + return; + } + + botGame.BotsController.BotSpawner.SpawnBotBTR(); + } + } +}