From 04a2b8d2fadd7e2de2fc58347ab3bc94e943872b Mon Sep 17 00:00:00 2001 From: Mikhail Date: Thu, 4 Jul 2024 13:18:56 -0400 Subject: [PATCH] Stage rewards fully working, fixed main quest again, cash shop working --- nksrv/LobbyServer/Msgs/Shop/GetProductList.cs | 2 +- .../Shop/InApp/GetRetrivableProductList.cs | 23 ++++ nksrv/LobbyServer/Msgs/Stage/ClearStage.cs | 110 +++++++++++------- .../Msgs/Trigger/FinishMainQuest.cs | 3 - nksrv/Protos/allmsgs.proto | 11 ++ nksrv/Utils/JsonDb.cs | 5 + 6 files changed, 110 insertions(+), 44 deletions(-) create mode 100644 nksrv/LobbyServer/Msgs/Shop/InApp/GetRetrivableProductList.cs diff --git a/nksrv/LobbyServer/Msgs/Shop/GetProductList.cs b/nksrv/LobbyServer/Msgs/Shop/GetProductList.cs index c4e8997..0268bb9 100644 --- a/nksrv/LobbyServer/Msgs/Shop/GetProductList.cs +++ b/nksrv/LobbyServer/Msgs/Shop/GetProductList.cs @@ -20,7 +20,7 @@ namespace nksrv.LobbyServer.Msgs.Shop var response = new ResGetJupiterProductList(); foreach (var item in x.ProductIdList) { - response.ProductInfoList.Add(new NetJupiterProductInfo() { CurrencyCode = "US", CurrencySymbol = "$", MicroPrice = 212, Price = "22", ProductId = item }); + response.ProductInfoList.Add(new NetJupiterProductInfo() { CurrencyCode = "US", CurrencySymbol = "$", MicroPrice = 0, Price = "0", ProductId = item }); } WriteData(response); } diff --git a/nksrv/LobbyServer/Msgs/Shop/InApp/GetRetrivableProductList.cs b/nksrv/LobbyServer/Msgs/Shop/InApp/GetRetrivableProductList.cs new file mode 100644 index 0000000..ec19200 --- /dev/null +++ b/nksrv/LobbyServer/Msgs/Shop/InApp/GetRetrivableProductList.cs @@ -0,0 +1,23 @@ +using nksrv.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace nksrv.LobbyServer.Msgs.Shop.InApp +{ + [PacketPath("/inappshop/getreceivableproductlist")] + public class GetRetrivableProductList : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var x = await ReadData(); + + var response = new ResGetInAppShopReceivableProductList(); + // TODO + + WriteData(response); + } + } +} diff --git a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs index a7bab7a..d7ef864 100644 --- a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs +++ b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs @@ -27,7 +27,6 @@ namespace nksrv.LobbyServer.Msgs.Stage var clearedStage = StaticDataParser.Instance.GetStageData(req.StageId); if (clearedStage == null) throw new Exception("cleared stage cannot be null"); - user.LastNormalStageCleared = req.StageId; if (user.FieldInfo.Count == 0) { @@ -37,11 +36,13 @@ namespace nksrv.LobbyServer.Msgs.Stage DoQuestSpecificUserOperations(user, req.StageId); var rewardData = StaticDataParser.Instance.GetRewardTableEntry(clearedStage.reward_id); - user.FieldInfo[clearedStage.chapter_id - 1].CompletedStages.Add(new NetFieldStageData() { StageId = req.StageId }); if (rewardData != null) - response.Reward = RegisterRewardsForUser(user, rewardData); + response.StageClearReward = RegisterRewardsForUser(user, rewardData); else Logger.Warn("rewardId is null for stage " + req.StageId); + + user.LastNormalStageCleared = req.StageId; + user.FieldInfo[clearedStage.chapter_id - 1].CompletedStages.Add(new NetFieldStageData() { StageId = req.StageId }); JsonDb.Save(); } @@ -55,56 +56,83 @@ namespace nksrv.LobbyServer.Msgs.Stage if (rewardData.user_exp != 0) { - var newXp = rewardData.character_exp + user.userPointData.ExperiencePoint; + var newXp = rewardData.user_exp + user.userPointData.ExperiencePoint; var newLevel = StaticDataParser.Instance.GetUserLevelFromUserExp(newXp); if (newLevel == -1) { Logger.Warn("Unknown user level value for xp " + newXp); } - //ret.UserExp = new NetIncreaseExpData() - //{ - // BeforeExp = user.userPointData.ExperiencePoint, - // BeforeLv = user.userPointData.UserLevel, - // IncreaseExp = rewardData.character_exp, - // CurrentExp = rewardData.character_exp + newXp, - // CurrentLv = newLevel, - // GainExp = rewardData.character_exp - //}; - user.userPointData.ExperiencePoint += rewardData.character_exp; + // TODO: what is the difference between IncreaseExp and GainExp + // NOTE: Current Exp/Lv refers to after XP was added. + + ret.UserExp = new NetIncreaseExpData() + { + BeforeExp = user.userPointData.ExperiencePoint, + BeforeLv = user.userPointData.UserLevel, + + IncreaseExp = rewardData.user_exp, + CurrentExp = newXp, + CurrentLv = newLevel, + + GainExp = rewardData.user_exp, + Csn = 123, + }; + user.userPointData.ExperiencePoint = newXp; + + if (newLevel > user.userPointData.UserLevel) + { + // TODO: Commander Level up reward + } + user.userPointData.UserLevel = newLevel; } foreach (var item in rewardData.rewards) { if (item.reward_id != 0) { - if (string.IsNullOrEmpty(item.reward_type)) { } + if (string.IsNullOrEmpty(item.reward_type) || string.IsNullOrWhiteSpace(item.reward_type)) { } else if (item.reward_type == "Currency") { - Dictionary current = new Dictionary(); - - // add all currencies that users has to current dictionary + bool found = false; foreach (var currentReward in user.Currency) { - if (!current.ContainsKey(currentReward.Key)) - current.Add(currentReward.Key, 0); + if (currentReward.Key == (CurrencyType)item.reward_id) + { + user.Currency[currentReward.Key] += item.reward_value; - current[currentReward.Key] = (int)currentReward.Value; + ret.Currency.Add(new NetCurrencyData() + { + FinalValue = user.Currency[currentReward.Key], + Value = item.reward_value, + Type = item.reward_id + }); + found = true; + break; + } } - // add currency reward to response - CurrencyType t = (CurrencyType)item.reward_id; - int val = item.reward_value; - if (!current.ContainsKey(t)) - current.Add(t, 0); - var val2 = current[t]; - ret.Currency.Add(new NetCurrencyData() { Type = (int)t, Value = val, FinalValue = val2 + val }); - - - // add currency reward to user info - if (!user.Currency.ContainsKey(t)) - user.Currency.Add(t, val); - else - user.Currency[t] += val; + if (!found) + { + user.Currency.Add((CurrencyType)item.reward_id, item.reward_value); + ret.Currency.Add(new NetCurrencyData() + { + FinalValue = item.reward_value, + Value = item.reward_value, + Type = item.reward_id + }); + } + } + else if (item.reward_type == "Item") + { + for (int i = 0; i < item.reward_value; i++) + { + user.Items.Add(new ItemData() { ItemType = item.reward_id }); + ret.Item.Add(new NetItemData() + { + Count = 1, + Tid = item.reward_id + }); + } } } else @@ -133,6 +161,13 @@ namespace nksrv.LobbyServer.Msgs.Stage team1.Type = 1; team1.LastContentsTeamNumber = 1; + + user.Characters.Add(new Utils.Character() { Csn = 47263455, Tid = 201001 }); + user.Characters.Add(new Utils.Character() { Csn = 47273456, Tid = 330501 }); + user.Characters.Add(new Utils.Character() { Csn = 47263457, Tid = 130201 }); + user.Characters.Add(new Utils.Character() { Csn = 47263458, Tid = 230101 }); + user.Characters.Add(new Utils.Character() { Csn = 47263459, Tid = 301201 }); + var team1Sub = new NetTeamData(); team1Sub.TeamNumber = 1; for (int i = 1; i < 6; i++) @@ -143,11 +178,6 @@ namespace nksrv.LobbyServer.Msgs.Stage team1.Teams.Add(team1Sub); user.UserTeams.Add(1, team1); - user.Characters.Add(new Utils.Character() { Csn = 47263455, Tid = 201001 }); - user.Characters.Add(new Utils.Character() { Csn = 47273456, Tid = 330501 }); - user.Characters.Add(new Utils.Character() { Csn = 47263457, Tid = 130201 }); - user.Characters.Add(new Utils.Character() { Csn = 47263458, Tid = 230101 }); - user.Characters.Add(new Utils.Character() { Csn = 47263459, Tid = 301201 }); user.RepresentationTeamData.TeamNumber = 1; user.RepresentationTeamData.TeamCombat = 1446; // TODO: Don't hardcode this diff --git a/nksrv/LobbyServer/Msgs/Trigger/FinishMainQuest.cs b/nksrv/LobbyServer/Msgs/Trigger/FinishMainQuest.cs index bc2bf9c..dfcfc53 100644 --- a/nksrv/LobbyServer/Msgs/Trigger/FinishMainQuest.cs +++ b/nksrv/LobbyServer/Msgs/Trigger/FinishMainQuest.cs @@ -21,9 +21,6 @@ namespace nksrv.LobbyServer.Msgs.Trigger var completedQuest = StaticDataParser.Instance.GetMainQuestByTableId(req.Tid); if (completedQuest == null) throw new Exception("Quest not found"); - // set next quest as available - user.SetQuest(completedQuest.next_main_quest_id, true); - JsonDb.Save(); var response = new ResFinMainQuest(); WriteData(response); diff --git a/nksrv/Protos/allmsgs.proto b/nksrv/Protos/allmsgs.proto index 8489a44..15129b8 100644 --- a/nksrv/Protos/allmsgs.proto +++ b/nksrv/Protos/allmsgs.proto @@ -1855,4 +1855,15 @@ message ResProfileCardDecorationLayout { message ReqGetWallpaperInventory {} message ResGetWallpaperInventory { repeated int32 livewallpaperIds = 2; +} + +message NetInAppShopReceivableProductData { + string ProductId = 1; + string Token = 2; + int32 SubTid = 3; +} + +message ReqGetInAppShopReceivableProductList {} +message ResGetInAppShopReceivableProductList { + repeated NetInAppShopReceivableProductData Data = 1; } \ No newline at end of file diff --git a/nksrv/Utils/JsonDb.cs b/nksrv/Utils/JsonDb.cs index de3f65a..8f1cb11 100644 --- a/nksrv/Utils/JsonDb.cs +++ b/nksrv/Utils/JsonDb.cs @@ -47,6 +47,10 @@ namespace nksrv.Utils public int ExperiencePoint = 0; } + public class ItemData + { + public int ItemType; + } public class User { @@ -71,6 +75,7 @@ namespace nksrv.Utils { CurrencyType.CharPremiumTicket, 999999 } }; + public List Items = new(); public List Characters = []; public NetWholeUserTeamData RepresentationTeamData = new(); public List ClearedTutorials = [];