diff --git a/Arrowgene.Ddon.GameServer/Characters/QuestManager.cs b/Arrowgene.Ddon.GameServer/Characters/QuestManager.cs index a526903fa..bdb62a1df 100644 --- a/Arrowgene.Ddon.GameServer/Characters/QuestManager.cs +++ b/Arrowgene.Ddon.GameServer/Characters/QuestManager.cs @@ -266,7 +266,7 @@ public static HashSet CollectQuestScheduleIds(GameClient client, StageLayo questScheduleIds.UnionWith(client.Party.QuestState.StageQuests(stageId)); if (client.Party.Leader is not null) { - questScheduleIds.UnionWith(client.Party.Leader.QuestState.StageQuests(stageId)); + questScheduleIds.UnionWith(client.Party.Leader.Client.QuestState.StageQuests(stageId)); } return questScheduleIds; diff --git a/Arrowgene.Ddon.GameServer/GameClient.cs b/Arrowgene.Ddon.GameServer/GameClient.cs index 2db4c15ee..6b7ecc884 100644 --- a/Arrowgene.Ddon.GameServer/GameClient.cs +++ b/Arrowgene.Ddon.GameServer/GameClient.cs @@ -19,6 +19,7 @@ public GameClient(ITcpSocket socket, PacketFactory packetFactory, DdonGameServer InstanceDropItemManager = new(this, server); InstanceShopManager = new InstanceShopManager(server.ShopManager); GameMode = GameMode.Normal; + QuestState = new SoloQuestStateManager(this, server); } public void UpdateIdentity() @@ -47,12 +48,7 @@ public void UpdateIdentity() public InstanceDropItemManager InstanceDropItemManager { get; } public GameMode GameMode { get; set; } - - public QuestStateManager QuestState { get - { - return ((PlayerPartyMember)Party?.GetPartyMemberByCharacter(Character))?.QuestState; - } - } + public SoloQuestStateManager QuestState { get; private set; } public bool IsPartyLeader() { diff --git a/Arrowgene.Ddon.GameServer/Handler/InstanceEnemyKillHandler.cs b/Arrowgene.Ddon.GameServer/Handler/InstanceEnemyKillHandler.cs index d31bed0c8..80bac000d 100644 --- a/Arrowgene.Ddon.GameServer/Handler/InstanceEnemyKillHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/InstanceEnemyKillHandler.cs @@ -161,11 +161,7 @@ public override S2CInstanceEnemyKillRes Handle(GameClient client, C2SInstanceEne } } - // TODO: This will be revisited so we can properly handle EXP assigned by tool and - // TODO: EXP determined by the mixin. For now, the default behavior of the mixin - // TODO: is the same as the original server behavior. var enemyExpMixin = Server.ScriptManager.MixinModule.Get("enemy_exp"); - foreach (PartyMember member in client.Party.Members) { if (member.JoinState != JoinState.On) continue; // Only fully joined members get rewards. @@ -191,7 +187,7 @@ public override S2CInstanceEnemyKillRes Handle(GameClient client, C2SInstanceEne gainedExp = (0, 0); } - var huntPackets = playerMember.QuestState.HandleEnemyHuntRequests(enemyKilled, connectionIn); + var huntPackets = playerMember.Client.QuestState.HandleEnemyHuntRequests(enemyKilled, connectionIn); queuedPackets.AddRange(huntPackets); S2CItemUpdateCharacterItemNtc updateCharacterItemNtc = new S2CItemUpdateCharacterItemNtc(); diff --git a/Arrowgene.Ddon.GameServer/Handler/PartyPartyJoinHandler.cs b/Arrowgene.Ddon.GameServer/Handler/PartyPartyJoinHandler.cs index 61c39f106..5337a2f91 100644 --- a/Arrowgene.Ddon.GameServer/Handler/PartyPartyJoinHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/PartyPartyJoinHandler.cs @@ -49,7 +49,7 @@ public override S2CPartyPartyJoinRes Handle(GameClient client, C2SPartyPartyJoin var quest = QuestManager.GetQuestByScheduleId(questProgress.QuestScheduleId); if (quest != null && quest.IsPersonal) { - join.QuestState.AddNewQuest(questProgress.QuestScheduleId, questProgress.Step); + client.QuestState.AddNewQuest(questProgress.QuestScheduleId, questProgress.Step); } } diff --git a/Arrowgene.Ddon.GameServer/Party/PlayerPartyMember.cs b/Arrowgene.Ddon.GameServer/Party/PlayerPartyMember.cs index 27a4cb45e..5a934a266 100644 --- a/Arrowgene.Ddon.GameServer/Party/PlayerPartyMember.cs +++ b/Arrowgene.Ddon.GameServer/Party/PlayerPartyMember.cs @@ -10,13 +10,10 @@ public class PlayerPartyMember : PartyMember public PlayerPartyMember(GameClient client, DdonGameServer server) { Client = client; - QuestState = new SoloQuestStateManager(this, server); } public GameClient Client { get; set; } - public SoloQuestStateManager QuestState { get; set; } - public override CDataPartyMember GetCDataPartyMember() { CDataPartyMember obj = new CDataPartyMember(); diff --git a/Arrowgene.Ddon.GameServer/Quests/QuestStateManager.cs b/Arrowgene.Ddon.GameServer/Quests/QuestStateManager.cs index d2281809f..b5d61de89 100644 --- a/Arrowgene.Ddon.GameServer/Quests/QuestStateManager.cs +++ b/Arrowgene.Ddon.GameServer/Quests/QuestStateManager.cs @@ -1020,13 +1020,13 @@ public override bool UpdateQuestProgress( uint questScheduleId, DbConnection? co public class SoloQuestStateManager : QuestStateManager { - private readonly PlayerPartyMember Member; private readonly DdonGameServer Server; + private readonly GameClient Client; - public SoloQuestStateManager(PlayerPartyMember member, DdonGameServer server) + public SoloQuestStateManager(GameClient client, DdonGameServer server) { - this.Member = member; this.Server = server; + this.Client = client; } public override bool UpdateQuestProgress(uint questScheduleId, DbConnection? connectionIn = null) @@ -1040,7 +1040,7 @@ public override bool UpdateQuestProgress(uint questScheduleId, DbConnection? con return false; } - var result = Server.Database.GetQuestProgressByScheduleId(Member.Client.Character.CommonId, questState.QuestScheduleId, connectionIn); + var result = Server.Database.GetQuestProgressByScheduleId(Client.Character.CommonId, questState.QuestScheduleId, connectionIn); if (result == null) { return false; @@ -1051,7 +1051,7 @@ public override bool UpdateQuestProgress(uint questScheduleId, DbConnection? con return false; } - Server.Database.UpdateQuestProgress(Member.Client.Character.CommonId, questState.QuestScheduleId, questState.QuestType, questState.Step + 1, connectionIn); + Server.Database.UpdateQuestProgress(Client.Character.CommonId, questState.QuestScheduleId, questState.QuestType, questState.Step + 1, connectionIn); questState.Step += 1; @@ -1063,7 +1063,7 @@ public override bool CompleteQuestProgress(uint questScheduleId, DbConnection? c Quest quest = GetQuest(questScheduleId); var questState = GetQuestState(quest); - var result = Server.Database.GetQuestProgressByScheduleId(Member.Client.Character.CommonId, questScheduleId, connectionIn); + var result = Server.Database.GetQuestProgressByScheduleId(Client.Character.CommonId, questScheduleId, connectionIn); if (result == null) { return false; @@ -1074,28 +1074,28 @@ public override bool CompleteQuestProgress(uint questScheduleId, DbConnection? c return false; } - Server.Database.DeletePriorityQuest(Member.Client.Character.CommonId, questScheduleId, connectionIn); - Server.Database.RemoveQuestProgress(Member.Client.Character.CommonId, questScheduleId, quest.QuestType, connectionIn); + Server.Database.DeletePriorityQuest(Client.Character.CommonId, questScheduleId, connectionIn); + Server.Database.RemoveQuestProgress(Client.Character.CommonId, questScheduleId, quest.QuestType, connectionIn); if (quest.NextQuestId != QuestId.None) { var nextQuest = GetQuest((uint)quest.NextQuestId); - Server.Database.InsertQuestProgress(Member.Client.Character.CommonId, nextQuest.QuestScheduleId, nextQuest.QuestType, 0, connectionIn); + Server.Database.InsertQuestProgress(Client.Character.CommonId, nextQuest.QuestScheduleId, nextQuest.QuestType, 0, connectionIn); } - if (!Member.Client.Character.CompletedQuests.ContainsKey(quest.QuestId)) + if (!Client.Character.CompletedQuests.ContainsKey(quest.QuestId)) { - Member.Client.Character.CompletedQuests.Add(quest.QuestId, new CompletedQuest() + Client.Character.CompletedQuests.Add(quest.QuestId, new CompletedQuest() { QuestId = quest.QuestId, QuestType = quest.QuestType, ClearCount = 1, }); - Server.Database.InsertCompletedQuest(Member.Client.Character.CommonId, quest.QuestId, quest.QuestType, connectionIn); + Server.Database.InsertCompletedQuest(Client.Character.CommonId, quest.QuestId, quest.QuestType, connectionIn); } else { - uint clearCount = ++Member.Client.Character.CompletedQuests[quest.QuestId].ClearCount; - Server.Database.ReplaceCompletedQuest(Member.Client.Character.CommonId, quest.QuestId, quest.QuestType, clearCount, connectionIn); + uint clearCount = ++Client.Character.CompletedQuests[quest.QuestId].ClearCount; + Server.Database.ReplaceCompletedQuest(Client.Character.CommonId, quest.QuestId, quest.QuestType, clearCount, connectionIn); } CompleteQuest(quest.QuestScheduleId); @@ -1111,14 +1111,14 @@ public override PacketQueue DistributeQuestRewards(uint questScheduleId, DbConne var questState = GetQuestState(quest); if (quest.HasRewards()) { - Server.RewardManager.AddQuestRewards(Member.Client, quest, connectionIn); + Server.RewardManager.AddQuestRewards(Client, quest, connectionIn); } // Check for Exp, Rift and Gold Rewards - packets.AddRange(SendWalletRewards(Server, Member.Client, quest, connectionIn)); + packets.AddRange(SendWalletRewards(Server, Client, quest, connectionIn)); // Check for any content released by completing the quest - packets.AddRange(RewardReleasedContent(Member.Client, quest, connectionIn)); + packets.AddRange(RewardReleasedContent(Client, quest, connectionIn)); return packets; } @@ -1132,7 +1132,7 @@ public PacketQueue HandleEnemyHuntRequests(Enemy enemy, DbConnection? connection { PacketQueue packets = new(); - if (Member.Client.Character.GameMode != GameMode.Normal) + if (Client.Character.GameMode != GameMode.Normal) { return packets; } @@ -1143,7 +1143,7 @@ public PacketQueue HandleEnemyHuntRequests(Enemy enemy, DbConnection? connection { Quest questObject = QuestManager.GetQuestByScheduleId(questScheduleId); - if (questObject is null || Member.Client.Party.ExmInProgress && questObject?.QuestType == QuestType.Light) + if (questObject is null || Client.Party.ExmInProgress && questObject?.QuestType == QuestType.Light) { // The UI indicates that light quests cannot progress during EXMs. continue; @@ -1160,7 +1160,7 @@ public PacketQueue HandleEnemyHuntRequests(Enemy enemy, DbConnection? connection // Stage 0 -> Not accepted, should never occur. // Stage 1 -> Accepted, but no work done // Stage N+1 -> Accepted, but with N work done. - Server.Database.UpdateQuestProgress(Member.Client.Character.CommonId, questState.QuestScheduleId, questState.QuestType, huntRecord.AmountHunted + 1, connectionIn); + Server.Database.UpdateQuestProgress(Client.Character.CommonId, questState.QuestScheduleId, questState.QuestType, huntRecord.AmountHunted + 1, connectionIn); } S2CQuestQuestProgressWorkSaveNtc ntc = new() @@ -1178,7 +1178,7 @@ public PacketQueue HandleEnemyHuntRequests(Enemy enemy, DbConnection? connection Work03 = (int)huntRecord.AmountHunted }); - Member.Client.Enqueue(ntc, packets); + Client.Enqueue(ntc, packets); } } } @@ -1189,7 +1189,7 @@ public PacketQueue ResendQuestWork() { PacketQueue packets = new(); - if (Member.Client.Character.GameMode != GameMode.Normal) + if (Client.Character.GameMode != GameMode.Normal) { return packets; } @@ -1200,7 +1200,7 @@ public PacketQueue ResendQuestWork() { Quest questObject = QuestManager.GetQuestByScheduleId(questScheduleId); - if (questObject is null || Member.Client.Party.ExmInProgress && questObject?.QuestType == QuestType.Light) + if (questObject is null || Client.Party.ExmInProgress && questObject?.QuestType == QuestType.Light) { // The UI indicates that light quests cannot progress during EXMs. continue; @@ -1223,7 +1223,7 @@ public PacketQueue ResendQuestWork() Work03 = (int)huntRecord.AmountHunted }); - Member.Client.Enqueue(ntc, packets); + Client.Enqueue(ntc, packets); } }