From 9d203958c3d6daeb7644bbf0ddae4a3f88296439 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Fri, 26 Jul 2024 14:41:09 -0400 Subject: [PATCH] Fix main mission obtain reward --- .../Msgs/Trigger/ObtainMainQuestReward.cs | 45 ++++++++++++++++++ nksrv/Protos/allmsgs.proto | 7 +++ nksrv/Utils/NetUtils.cs | 46 +++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 nksrv/LobbyServer/Msgs/Trigger/ObtainMainQuestReward.cs diff --git a/nksrv/LobbyServer/Msgs/Trigger/ObtainMainQuestReward.cs b/nksrv/LobbyServer/Msgs/Trigger/ObtainMainQuestReward.cs new file mode 100644 index 0000000..e39b9c7 --- /dev/null +++ b/nksrv/LobbyServer/Msgs/Trigger/ObtainMainQuestReward.cs @@ -0,0 +1,45 @@ +using nksrv.Database; +using nksrv.LobbyServer.Msgs.Stage; +using nksrv.StaticInfo; +using nksrv.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace nksrv.LobbyServer.Msgs.Trigger +{ + [PacketPath("/trigger/obtainmainquestreward")] + public class ObtainMainQuestReward : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var user = GetUser(); + + ResObtainMainQuestReward response = new(); + List rewards = new(); + + foreach (var item in user.MainQuestData) + { + if (!item.Value && req.TidList.Contains(item.Key)) + { + user.MainQuestData[item.Key] = true; + + var questInfo = StaticDataParser.Instance.GetMainQuestByTableId(item.Key); + if (questInfo == null) throw new Exception("failed to lookup quest id " + item.Key); + var reward = StaticDataParser.Instance.GetRewardTableEntry(questInfo.reward_id); + if (reward == null) throw new Exception("failed to lookup reward id " + questInfo.reward_id); + + rewards.Add(ClearStage.RegisterRewardsForUser(user, reward)); + } + } + + response.Reward = NetUtils.MergeRewards(rewards, user); + JsonDb.Save(); + + await WriteDataAsync(response); + } + } +} diff --git a/nksrv/Protos/allmsgs.proto b/nksrv/Protos/allmsgs.proto index 63284c6..86b18f1 100644 --- a/nksrv/Protos/allmsgs.proto +++ b/nksrv/Protos/allmsgs.proto @@ -2257,4 +2257,11 @@ message ResStoryDungeonEventData { int32 RemainingTickets = 1; repeated NetLastClearedEventStageData LastClearedEventStageList = 2; NetUserTeamData TeamData = 3; +} + +message ReqObtainMainQuestReward { + repeated int32 TidList = 2; +} +message ResObtainMainQuestReward { + NetRewardData Reward = 2; } \ No newline at end of file diff --git a/nksrv/Utils/NetUtils.cs b/nksrv/Utils/NetUtils.cs index 7ed63f8..d0ab6c9 100644 --- a/nksrv/Utils/NetUtils.cs +++ b/nksrv/Utils/NetUtils.cs @@ -76,5 +76,51 @@ namespace nksrv.Utils return 0; } + /// + /// Takes multiple NetRewardData objects and merges it into one. Note that this function expects that rewards are already applied to user object. + /// + /// list of rewards + /// user to pull old currency count from + /// + public static NetRewardData MergeRewards(List rewards, User user) + { + NetRewardData result = new(); + + Dictionary currencyDict = new Dictionary(); + List items = new List(); + + foreach (NetRewardData reward in rewards) + { + foreach (var c in reward.Currency) + { + if (currencyDict.ContainsKey(c.Type)) + currencyDict[c.Type] += c.Value; + else + currencyDict.Add(c.Type, c.Value); + } + + foreach (var item in reward.Item) + { + items.Add(item); + } + + foreach (var c in reward.Character) + { + Logger.Warn("MergeRewards - TODO Character"); + } + } + + foreach (var c in currencyDict) + { + result.Currency.Add(new NetCurrencyData() { Value = c.Value, Type = c.Key, FinalValue = user.Currency[(CurrencyType)c.Key] }); + } + + // TODO is this right? + foreach (var c in items) + { + result.Item.Add(c); + } + return result; + } } } \ No newline at end of file