diff --git a/project/Aki.SinglePlayer/AkiSingleplayerPlugin.cs b/project/Aki.SinglePlayer/AkiSingleplayerPlugin.cs index 430c2fc..2e18a34 100644 --- a/project/Aki.SinglePlayer/AkiSingleplayerPlugin.cs +++ b/project/Aki.SinglePlayer/AkiSingleplayerPlugin.cs @@ -64,6 +64,7 @@ namespace Aki.SinglePlayer new ScavSellAllRequestPatch().Enable(); new HideoutQuestIgnorePatch().Enable(); new LightKeeperServicesPatch().Enable(); + new ScavEncyclopediaPatch().Enable(); } catch (Exception ex) { diff --git a/project/Aki.SinglePlayer/Patches/ScavMode/ScavEncyclopediaPatch.cs b/project/Aki.SinglePlayer/Patches/ScavMode/ScavEncyclopediaPatch.cs new file mode 100644 index 0000000..e0694ca --- /dev/null +++ b/project/Aki.SinglePlayer/Patches/ScavMode/ScavEncyclopediaPatch.cs @@ -0,0 +1,47 @@ +using Aki.Reflection.Patching; +using Aki.Reflection.Utils; +using Aki.SinglePlayer.Utils.InRaid; +using EFT; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace Aki.SinglePlayer.Patches.ScavMode +{ + /** + * At the start of a scav raid, copy the PMC encyclopedia to the scav profile, and + * make sure the scav knows all of the items it has in its inventory + */ + internal class ScavEncyclopediaPatch : ModulePatch + { + protected override MethodBase GetTargetMethod() + { + return typeof(GameWorld).GetMethod(nameof(GameWorld.OnGameStarted)); + } + + [PatchPostfix] + public static void PatchPostFix() + { + if (RaidChangesUtil.IsScavRaid) + { + var scavProfile = PatchConstants.BackEndSession.ProfileOfPet; + var pmcProfile = PatchConstants.BackEndSession.Profile; + + // Handle old profiles where the scav doesn't have an encyclopedia + if (scavProfile.Encyclopedia == null) + { + scavProfile.Encyclopedia = new Dictionary(); + } + + // Sync the PMC encyclopedia to the scav profile + foreach (var item in pmcProfile.Encyclopedia.Where(item => !scavProfile.Encyclopedia.ContainsKey(item.Key))) + { + scavProfile.Encyclopedia.Add(item.Key, item.Value); + } + + // Auto examine any items the scav doesn't know that are in their inventory + scavProfile.LearnAll(); + } + } + } +}