From d9672aee6eae98218ac798fbb89097ad64f30482 Mon Sep 17 00:00:00 2001 From: Ryan Yappert Date: Tue, 26 Nov 2024 21:59:54 -0800 Subject: [PATCH] Tweak method of tracking clan quest completion so it should be slightly more robust. --- .../Characters/ClanManager.cs | 23 +++++++------------ Arrowgene.Ddon.GameServer/RpcManager.cs | 5 +--- .../Route/Internal/PacketRoute.cs | 9 -------- .../Route/Internal/TrackingRoute.cs | 9 ++++++++ .../Model/Rpc/RpcInternalCommand.cs | 1 + .../Model/Rpc/RpcQuestCompletionData.cs | 12 ++++++++++ 6 files changed, 31 insertions(+), 28 deletions(-) create mode 100644 Arrowgene.Ddon.Shared/Model/Rpc/RpcQuestCompletionData.cs diff --git a/Arrowgene.Ddon.GameServer/Characters/ClanManager.cs b/Arrowgene.Ddon.GameServer/Characters/ClanManager.cs index b4554a438..106dcfb76 100644 --- a/Arrowgene.Ddon.GameServer/Characters/ClanManager.cs +++ b/Arrowgene.Ddon.GameServer/Characters/ClanManager.cs @@ -6,10 +6,10 @@ using Arrowgene.Ddon.Shared.Entity.Structure; using Arrowgene.Ddon.Shared.Model; using Arrowgene.Ddon.Shared.Model.Clan; +using Arrowgene.Ddon.Shared.Model.Rpc; using Arrowgene.Ddon.Shared.Network; using Arrowgene.Logging; using System; -using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Data.Common; @@ -520,8 +520,11 @@ public PacketQueue CompleteClanQuest(Quest quest, GameClient client) { ClanQuestClearCount[characterId][quest.QuestScheduleId] = ClanQuestClearCount[characterId].GetValueOrDefault(quest.QuestScheduleId) + 1; - // TODO: Revise this; this is a hacky solution so I don't need a dedicated route just for this one mechanic. - Server.RpcManager.AnnounceClanPacket(character.ClanId, ntc, characterId); + Server.RpcManager.AnnounceOthers("internal/tracking", RpcInternalCommand.NotifyClanQuestCompletion, new RpcQuestCompletionData() + { + CharacterId = characterId, + QuestStatus = ClanQuestClearCount[characterId] + }); } if (ClanQuestClearCount[characterId].GetValueOrDefault(quest.QuestScheduleId) == quest.LightQuestDetail.OrderLimit) @@ -534,19 +537,9 @@ public PacketQueue CompleteClanQuest(Quest quest, GameClient client) } // For syncing across channels. - public void CompleteClanQuestForeign(Quest quest, uint characterId) + public void UpdateClanQuestCompletion(uint characterId, Dictionary questStatus) { - if (!ClanQuestClearCount.ContainsKey(characterId)) - { - ClanQuestClearCount[characterId] = new(); - } - lock (ClanQuestClearCount[characterId]) - { - if (ClanQuestClearCount[characterId].GetValueOrDefault(quest.QuestScheduleId) < quest.LightQuestDetail.OrderLimit) - { - ClanQuestClearCount[characterId][quest.QuestScheduleId] = ClanQuestClearCount[characterId].GetValueOrDefault(quest.QuestScheduleId) + 1; - } - } + ClanQuestClearCount[characterId] = questStatus; } public uint ClanQuestCompletionStatistics(uint characterId, uint questScheduleId) diff --git a/Arrowgene.Ddon.GameServer/RpcManager.cs b/Arrowgene.Ddon.GameServer/RpcManager.cs index 5087c29e1..1a7925e80 100644 --- a/Arrowgene.Ddon.GameServer/RpcManager.cs +++ b/Arrowgene.Ddon.GameServer/RpcManager.cs @@ -283,13 +283,10 @@ public ushort FindPlayerById(uint characterId) public void AnnouncePlayerList() { List rpcCharacterDatas = new List(); - foreach (var character in Server.ClientLookup.GetAllCharacter()) - { - if (character.Stage.Id != 0) + foreach (var character in Server.ClientLookup.GetAllCharacter().Where(x => x.Stage.Id != 0)) { rpcCharacterDatas.Add(new(character)); } - } AnnounceOthers("internal/tracking", RpcInternalCommand.NotifyPlayerList, rpcCharacterDatas); CharacterTrackingMap[(ushort) Server.Id].Update(DateTime.Now, rpcCharacterDatas); diff --git a/Arrowgene.Ddon.Rpc.Web/Route/Internal/PacketRoute.cs b/Arrowgene.Ddon.Rpc.Web/Route/Internal/PacketRoute.cs index 4a0bbebcf..b6897c934 100644 --- a/Arrowgene.Ddon.Rpc.Web/Route/Internal/PacketRoute.cs +++ b/Arrowgene.Ddon.Rpc.Web/Route/Internal/PacketRoute.cs @@ -122,15 +122,6 @@ public override RpcCommandResult Execute(DdonGameServer gameServer) } } } - else if (packet.Id == PacketId.S2C_CLAN_CLAN_QUEST_CLEAR_NTC) - { - // TODO: This is an abuse of this packet; it's not actually announced. - var parsedPacket = new S2CClanClanQuestClearNtc.Serializer().Read(data.Data); - var quest = QuestManager.GetQuestsByQuestId((QuestId)parsedPacket.QuestId).First(); - gameServer.ClanManager.CompleteClanQuestForeign(quest, data.CharacterId); - - checkFunc = x => false; - } else if (packet.Id == PacketId.S2C_CLAN_CLAN_SHOP_BUY_ITEM_NTC) { var parsedPacket = new S2CClanClanShopBuyItemNtc.Serializer().Read(data.Data); diff --git a/Arrowgene.Ddon.Rpc.Web/Route/Internal/TrackingRoute.cs b/Arrowgene.Ddon.Rpc.Web/Route/Internal/TrackingRoute.cs index 60a98944d..55adc062d 100644 --- a/Arrowgene.Ddon.Rpc.Web/Route/Internal/TrackingRoute.cs +++ b/Arrowgene.Ddon.Rpc.Web/Route/Internal/TrackingRoute.cs @@ -34,6 +34,15 @@ public override RpcCommandResult Execute(DdonGameServer gameServer) Message = $"NotifyPlayerList Channel {_entry.Origin}" }; } + case RpcInternalCommand.NotifyClanQuestCompletion: + { + RpcQuestCompletionData data = _entry.GetData(); + gameServer.ClanManager.UpdateClanQuestCompletion(data.CharacterId, data.QuestStatus); + return new RpcCommandResult(this, true) + { + Message = $"NotifyClanQuestCompletion for CharacterId {data.CharacterId}" + }; + } default: return new RpcCommandResult(this, false); } diff --git a/Arrowgene.Ddon.Shared/Model/Rpc/RpcInternalCommand.cs b/Arrowgene.Ddon.Shared/Model/Rpc/RpcInternalCommand.cs index ed04fdf9a..4589e334c 100644 --- a/Arrowgene.Ddon.Shared/Model/Rpc/RpcInternalCommand.cs +++ b/Arrowgene.Ddon.Shared/Model/Rpc/RpcInternalCommand.cs @@ -3,6 +3,7 @@ namespace Arrowgene.Ddon.Shared.Model.Rpc public enum RpcInternalCommand { NotifyPlayerList, // List + NotifyClanQuestCompletion, //RpcQuestCompletionData SendTellMessage, // RpcChatData SendClanMessage, // RpcChatData diff --git a/Arrowgene.Ddon.Shared/Model/Rpc/RpcQuestCompletionData.cs b/Arrowgene.Ddon.Shared/Model/Rpc/RpcQuestCompletionData.cs new file mode 100644 index 000000000..1cfd715d5 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Model/Rpc/RpcQuestCompletionData.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; + +namespace Arrowgene.Ddon.Shared.Model.Rpc +{ + public class RpcQuestCompletionData + { + public RpcQuestCompletionData() { } + + public uint CharacterId { get; set; } + public Dictionary QuestStatus { get; set; } + } +}