From 3a8d44fdd89487dc06d6c2bb54d4bb3fa2fe2c4f Mon Sep 17 00:00:00 2001 From: Paul Campbell Date: Thu, 26 Jun 2025 20:47:14 -0400 Subject: [PATCH] fix: Unlock EM4 skill on job which completes it only Adjust behavior of the EM4 skills to unlock only on the job which completes it. --- .../Characters/CharacterManager.cs | 4 +- .../Characters/RewardManager.cs | 42 +++++++++++-------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/Arrowgene.Ddon.GameServer/Characters/CharacterManager.cs b/Arrowgene.Ddon.GameServer/Characters/CharacterManager.cs index ff991b33e..8b4657d57 100644 --- a/Arrowgene.Ddon.GameServer/Characters/CharacterManager.cs +++ b/Arrowgene.Ddon.GameServer/Characters/CharacterManager.cs @@ -279,10 +279,10 @@ private Dictionary> CalculateAcquirableSkills(Chara // The skill level has no unlock requirements isRelease = true; } - else if (SkillData.Em4CustomSkills.ContainsKey(jobId) && SkillData.IsEm4Skill(jobId, skill.SkillNo, skillLevel.Lv)) + else if (SkillData.IsEm4Skill(jobId, skill.SkillNo, skillLevel.Lv)) { // The skill has an unlock requirement on EM4 - isRelease = character.HasQuestCompleted(QuestId.TheShiningGate); + isRelease = character.LearnedCustomSkills.Where(x => x.Job == jobId && x.SkillId == skill.SkillNo).Any(); } else if (SkillData.IsUnlockableSkill(skill.Job, skill.SkillNo, skillLevel.Lv)) { diff --git a/Arrowgene.Ddon.GameServer/Characters/RewardManager.cs b/Arrowgene.Ddon.GameServer/Characters/RewardManager.cs index 92b382803..e6cdeede4 100644 --- a/Arrowgene.Ddon.GameServer/Characters/RewardManager.cs +++ b/Arrowgene.Ddon.GameServer/Characters/RewardManager.cs @@ -49,27 +49,33 @@ public PacketQueue UnlockEM4Skills(GameClient client, DbConnection? connectionIn { var packets = new PacketQueue(); - var unlockedSkills = new S2CSkillAcquirementLearnNtc(); - // TODO: Track quest completion on per job instead of unlocking all - foreach (var (jobId, releaseId) in SkillData.Em4CustomSkills) + var jobId = client.Character.Job; + if (!SkillData.Em4CustomSkills.ContainsKey(jobId)) { - Server.CharacterManager.UnlockCustomSkill(client.Character, jobId, releaseId, 1); - - // Handle players who had existing skills before they were locked - var existing = client.Character.LearnedCustomSkills.Where(x => x.SkillId == releaseId && x.Job == jobId).FirstOrDefault(); - if (existing == null && client.Character.CharacterJobDataList.Any(x => x.Job == jobId)) - { - Server.JobManager.UnlockCustomSkill(client, client.Character, jobId, releaseId, 1, connectionIn); - } + return new(); + } - unlockedSkills.SkillParamList.Add(new CDataSkillLevelBaseParam() - { - Job = jobId, - SkillNo = releaseId, - SkillLv = existing?.SkillLv ?? 1, - }); + var releaseId = SkillData.Em4CustomSkills[jobId]; + if (client.Character.LearnedCustomSkills.Where(x => x.Job == jobId && x.SkillId == releaseId).Any()) + { + return new(); } - packets.Enqueue(client, unlockedSkills); + + Server.CharacterManager.UnlockCustomSkill(client.Character, jobId, releaseId, 1); + Server.JobManager.UnlockCustomSkill(client, client.Character, jobId, releaseId, 1, connectionIn); + + var unlockedSkill = new S2CSkillAcquirementLearnNtc() + { + SkillParamList = [ + new() + { + Job = jobId, + SkillNo = releaseId, + SkillLv = 1, + } + ] + }; + packets.Enqueue(client, unlockedSkill); return packets; }