From 58600633fef592460a73f87c60a2043f6894423c Mon Sep 17 00:00:00 2001 From: Dev Date: Sun, 3 Nov 2024 21:44:37 +0000 Subject: [PATCH] Fixed a client error when it tries to add the same achievement to a profile twice --- ...KeyAlreadyExistsErrorOnAchievementPatch.cs | 26 +++++++++++++++++++ .../SPT.SinglePlayer/SPTSingleplayerPlugin.cs | 4 ++- 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 project/SPT.SinglePlayer/Patches/RaidFix/FixKeyAlreadyExistsErrorOnAchievementPatch.cs diff --git a/project/SPT.SinglePlayer/Patches/RaidFix/FixKeyAlreadyExistsErrorOnAchievementPatch.cs b/project/SPT.SinglePlayer/Patches/RaidFix/FixKeyAlreadyExistsErrorOnAchievementPatch.cs new file mode 100644 index 0000000..885a655 --- /dev/null +++ b/project/SPT.SinglePlayer/Patches/RaidFix/FixKeyAlreadyExistsErrorOnAchievementPatch.cs @@ -0,0 +1,26 @@ +using System.Reflection; +using HarmonyLib; +using SPT.Reflection.Patching; + +namespace SPT.SinglePlayer.Patches.RaidFix +{ + public class FixKeyAlreadyExistsErrorOnAchievementPatch: ModulePatch + { + protected override MethodBase GetTargetMethod() + { + return AccessTools.Method(typeof(AbstractAchievementControllerClass), nameof(AbstractAchievementControllerClass.OnConditionalStatusChangedEvent)); + } + + [PatchPrefix] + public static bool Prefix(GClass1368 achievement, bool notify, AbstractAchievementControllerClass __instance) + { + if (achievement.IsDone() && __instance.Profile.AchievementsData.ContainsKey(achievement.Id)) + { + // Tries to add same achievement key a second time, throwing a "An item with the same key has already been added" error + return false; // Skip original + } + + return true; // Do original + } + } +} diff --git a/project/SPT.SinglePlayer/SPTSingleplayerPlugin.cs b/project/SPT.SinglePlayer/SPTSingleplayerPlugin.cs index ff907d3..3c1c143 100644 --- a/project/SPT.SinglePlayer/SPTSingleplayerPlugin.cs +++ b/project/SPT.SinglePlayer/SPTSingleplayerPlugin.cs @@ -63,7 +63,9 @@ namespace SPT.SinglePlayer new ScavIsPlayerEnemyPatch().Enable(); new BotOwnerManualUpdatePatch().Enable(); new FirearmControllerShowIncompatibleNotificationClass().Enable(); - } + new FixKeyAlreadyExistsErrorOnAchievementPatch().Enable(); + + } catch (Exception ex) { Logger.LogError($"A PATCH IN {GetType().Name} FAILED. SUBSEQUENT PATCHES HAVE NOT LOADED");