From e9ff2caba2a39fb742c309bc8b03464b09feb28a Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sun, 7 Jul 2024 14:45:00 -0400 Subject: [PATCH] levelup, item and synchro device fixes --- nksrv/IntlServer/GetNoticeContent.cs | 2 +- .../Msgs/Character/GetSynchrodevice.cs | 16 ++++- nksrv/LobbyServer/Msgs/Character/LevelUp.cs | 56 +++++++++++++++++ nksrv/LobbyServer/Msgs/Shop/GetProductList.cs | 3 +- nksrv/LobbyServer/Msgs/Stage/ClearStage.cs | 5 +- .../LobbyServer/Msgs/User/EnterLobbyServer.cs | 7 +++ nksrv/LobbyServer/Msgs/User/GetMail.cs | 36 +++++++++++ nksrv/LobbyServer/Msgs/User/ReadMail.cs | 23 +++++++ nksrv/Protos/allmsgs.proto | 60 ++++++++++++++++++- nksrv/Utils/JsonDb.cs | 12 ++++ nksrv/Utils/Rng.cs | 5 ++ 11 files changed, 216 insertions(+), 9 deletions(-) create mode 100644 nksrv/LobbyServer/Msgs/Character/LevelUp.cs create mode 100644 nksrv/LobbyServer/Msgs/User/GetMail.cs create mode 100644 nksrv/LobbyServer/Msgs/User/ReadMail.cs diff --git a/nksrv/IntlServer/GetNoticeContent.cs b/nksrv/IntlServer/GetNoticeContent.cs index 76997da..af8e95f 100644 --- a/nksrv/IntlServer/GetNoticeContent.cs +++ b/nksrv/IntlServer/GetNoticeContent.cs @@ -13,7 +13,7 @@ namespace nksrv.IntlServer protected override async Task HandleAsync() { - await WriteJsonStringAsync("{\r\n \"msg\": \"success\",\r\n \"notice_list\": [\r\n {\r\n \"app_id\": \"3001001\",\r\n \"app_notice_id\": \"post-6rpvwgrdx1b\",\r\n \"area_list\": \"[\\\"81\\\",\\\"82\\\",\\\"83\\\",\\\"84\\\",\\\"85\\\"]\",\r\n \"content_list\": [\r\n {\r\n \"app_content_id\": \"post-9ilpu79xxzp\",\r\n \"content\": \"This isn't working\",\r\n \"extra_data\": \"{}\",\r\n \"id\": 48706,\r\n \"lang_type\": \"en\",\r\n \"picture_list\": [\r\n {\r\n \"extra_data\": \"{\\\"id\\\":\\\"TitleImage\\\"}\",\r\n \"hash\": \"44a99a61152b5b80a0466ff9f0cee2bc\",\r\n \"redirect_url\": \"\",\r\n \"url\": \"pnt-console-cdn.playernetwork.intlgame.com/prod/29080/notice/022681b1121a40259a575fbe587651b4.jpg\"\r\n }\r\n ],\r\n \"title\": \"New Character\",\r\n \"update_time\": 1717637493\r\n }\r\n ],\r\n \"end_time\": 1719431999,\r\n \"extra_data\": \"{\\\"NoticeType\\\":\\\"Event\\\",\\\"Order\\\":\\\"11\\\",\\\"extra_reserved\\\":\\\"{\\\\\\\"Author\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"Category\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"CreateType\\\\\\\":\\\\\\\"4\\\\\\\",\\\\\\\"IsOpenService\\\\\\\":\\\\\\\"0\\\\\\\",\\\\\\\"IsToping\\\\\\\":false,\\\\\\\"Keyword\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"Sort\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"TopEnd\\\\\\\":\\\\\\\"2000-01-01 00:00:01\\\\\\\",\\\\\\\"TopStart\\\\\\\":\\\\\\\"2000-01-01 00:00:01\\\\\\\"}\\\"}\",\r\n \"id\": 7560,\r\n \"picture_list\": [],\r\n \"start_time\": 1717617599,\r\n \"status\": 1,\r\n \"update_time\": 1717637494\r\n }\r\n ],\r\n \"ret\": 0,\r\n \"seq\": \"" + Seq + "\"\r\n}"); + await WriteJsonStringAsync("{\r\n \"msg\": \"success\",\r\n \"notice_list\": [\r\n {\r\n \"app_id\": \"3001001\",\r\n \"app_notice_id\": \"post-6rpvwgrdx1b\",\r\n \"area_list\": \"[\\\"81\\\",\\\"82\\\",\\\"83\\\",\\\"84\\\",\\\"85\\\"]\",\r\n \"content_list\": [\r\n {\r\n \"app_content_id\": \"post-9ilpu79xxzp\",\r\n \"content\": \"This isn't working\",\r\n \"extra_data\": \"{}\",\r\n \"id\": 48706,\r\n \"lang_type\": \"en\",\r\n \"picture_list\": [\r\n {\r\n \"extra_data\": \"{\\\"id\\\":\\\"TitleImage\\\"}\",\r\n \"hash\": \"44a99a61152b5b80a0466ff9f0cee2bc\",\r\n \"redirect_url\": \"\",\r\n \"url\": \"pnt-console-cdn.playernetwork.intlgame.com/prod/29080/notice/022681b1121a40259a575fbe587651b4.jpg\"\r\n }\r\n ],\r\n \"title\": \"New Character\",\r\n \"update_time\": 1717637493\r\n }\r\n ],\r\n \"end_time\": 1819431999,\r\n \"extra_data\": \"{\\\"NoticeType\\\":\\\"Event\\\",\\\"Order\\\":\\\"11\\\",\\\"extra_reserved\\\":\\\"{\\\\\\\"Author\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"Category\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"CreateType\\\\\\\":\\\\\\\"4\\\\\\\",\\\\\\\"IsOpenService\\\\\\\":\\\\\\\"0\\\\\\\",\\\\\\\"IsToping\\\\\\\":false,\\\\\\\"Keyword\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"Sort\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"TopEnd\\\\\\\":\\\\\\\"2000-01-01 00:00:01\\\\\\\",\\\\\\\"TopStart\\\\\\\":\\\\\\\"2000-01-01 00:00:01\\\\\\\"}\\\"}\",\r\n \"id\": 7560,\r\n \"picture_list\": [],\r\n \"start_time\": 1717617599,\r\n \"status\": 1,\r\n \"update_time\": 1717637494\r\n }\r\n ],\r\n \"ret\": 0,\r\n \"seq\": \"" + Seq + "\"\r\n}"); } } } diff --git a/nksrv/LobbyServer/Msgs/Character/GetSynchrodevice.cs b/nksrv/LobbyServer/Msgs/Character/GetSynchrodevice.cs index f396764..e06f72b 100644 --- a/nksrv/LobbyServer/Msgs/Character/GetSynchrodevice.cs +++ b/nksrv/LobbyServer/Msgs/Character/GetSynchrodevice.cs @@ -13,15 +13,27 @@ namespace nksrv.LobbyServer.Msgs.Character protected override async Task HandleAsync() { var req = await ReadData(); + var user = GetUser(); - var response = new ReqGetSynchroData(); + var highestLevelCharacters = user.Characters.OrderByDescending(x => x.Level).Take(5).ToList(); + + var response = new ResGetSynchroData(); response.Synchro = new NetUserSynchroData(); - response.Synchro.SynchroLv = 1; + + foreach (var item in highestLevelCharacters) + { + response.Synchro.StandardCharacters.Add(new NetUserCharacterData() { Default = new() { Csn = item.Csn, Skill1Lv = item.Skill1Lvl, Skill2Lv = item.Skill2Lvl, CostumeId = item.CostumeId, Lv = item.Level, Grade = item.Grade, Tid = item.Tid, UltiSkillLv = item.UltimateLevel } }); + } + response.Synchro.Slots.Add(new NetSynchroSlot() { Slot = 1 }); response.Synchro.Slots.Add(new NetSynchroSlot() { Slot = 2 }); response.Synchro.Slots.Add(new NetSynchroSlot() { Slot = 3 }); response.Synchro.Slots.Add(new NetSynchroSlot() { Slot = 4 }); response.Synchro.Slots.Add(new NetSynchroSlot() { Slot = 5 }); + + response.Synchro.SynchroMaxLv = highestLevelCharacters.First().Level; + response.Synchro.SynchroLv = highestLevelCharacters.Last().Level; + // TODO: Validate response from real server and pull info from user info WriteData(response); } diff --git a/nksrv/LobbyServer/Msgs/Character/LevelUp.cs b/nksrv/LobbyServer/Msgs/Character/LevelUp.cs new file mode 100644 index 0000000..c2018ad --- /dev/null +++ b/nksrv/LobbyServer/Msgs/Character/LevelUp.cs @@ -0,0 +1,56 @@ +using nksrv.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace nksrv.LobbyServer.Msgs.Character +{ + [PacketPath("/character/levelup")] + public class LevelUp : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var user = GetUser(); + var response = new ResCharacterLevelUp(); + + foreach (var item in user.Characters.ToArray()) + { + if (item.Csn == req.Csn) + { + item.Level = req.Level; + // TODO: subtract currency + + + response.Character = new() { + CostumeId = item.CostumeId, + Csn = item.Csn, + Lv = item.Level, + Skill1Lv = item.Skill1Lvl, + Skill2Lv = item.Skill2Lvl, + UltiSkillLv = item.UltimateLevel, + Grade = item.Grade, + Tid = item.Tid + }; + var highestLevelCharacters = user.Characters.OrderByDescending(x => x.Level).Take(5).ToList(); + + response.SynchroLv = highestLevelCharacters.Last().Level; + + foreach (var c in highestLevelCharacters) + { + response.SynchroStandardCharacters.Add(c.Tid); + } + + break; + } + } + JsonDb.Save(); + + + + WriteData(response); + } + } +} diff --git a/nksrv/LobbyServer/Msgs/Shop/GetProductList.cs b/nksrv/LobbyServer/Msgs/Shop/GetProductList.cs index 0268bb9..e74fc4d 100644 --- a/nksrv/LobbyServer/Msgs/Shop/GetProductList.cs +++ b/nksrv/LobbyServer/Msgs/Shop/GetProductList.cs @@ -20,14 +20,13 @@ namespace nksrv.LobbyServer.Msgs.Shop var response = new ResGetJupiterProductList(); foreach (var item in x.ProductIdList) { - response.ProductInfoList.Add(new NetJupiterProductInfo() { CurrencyCode = "US", CurrencySymbol = "$", MicroPrice = 0, Price = "0", ProductId = item }); + response.ProductInfoList.Add(new NetJupiterProductInfo() { CurrencyCode = "US", CurrencySymbol = "$", MicroPrice = 0, Price = "1", ProductId = item }); } WriteData(response); } catch(Exception ex) { Logger.Error("Error while handling GetProductList request. Have you replaced sodium library?" + ex); - ; } } } diff --git a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs index 7f43b7e..3f84358 100644 --- a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs +++ b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs @@ -148,12 +148,13 @@ namespace nksrv.LobbyServer.Msgs.Stage } else if (item.reward_type == "Item") { - user.Items.Add(new ItemData() { ItemType = item.reward_id }); + var id = user.GenerateUniqueItemId(); + user.Items.Add(new ItemData() { ItemType = item.reward_id, Isn = id, Level = 1, Exp = 0, Count = 1 }); ret.Item.Add(new NetItemData() { Count = item.reward_value, Tid = item.reward_id, - Isn = 123 + Isn = id }); } else diff --git a/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs b/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs index 86cb0ba..10564f8 100644 --- a/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs +++ b/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs @@ -56,6 +56,13 @@ namespace nksrv.LobbyServer.Msgs.User response.Items.Add(new NetUserItemData() { Count = item.Count, Tid = item.ItemType, Csn = item.Csn, Lv = item.Level, Exp = item.Exp, Corporation = item.Corp, Isn = item.Isn, Position = item.Position}); } + var highestLevelCharacters = user.Characters.OrderByDescending(x => x.Level).Take(5).ToList(); + response.SynchroLv = highestLevelCharacters.Last().Level; + foreach (var item in highestLevelCharacters) + { + response.SynchroStandardCharacters.Add(item.Csn); + + } // Add squad data if there are characters if (user.Characters.Count > 0) diff --git a/nksrv/LobbyServer/Msgs/User/GetMail.cs b/nksrv/LobbyServer/Msgs/User/GetMail.cs new file mode 100644 index 0000000..67e6704 --- /dev/null +++ b/nksrv/LobbyServer/Msgs/User/GetMail.cs @@ -0,0 +1,36 @@ +using nksrv.Utils; +using Swan; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace nksrv.LobbyServer.Msgs.User +{ + [PacketPath("/mail/get")] + public class GetMail : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + + var r = new ResGetMailData(); + r.Mail.Add(new NetUserMailData() + { + + Msn = 3, + Nickname ="nick", + Title = new() { IsPlain = true, String = "Our Server Fell" }, + Text = new() { IsPlain = true, String = "Our Game Was Down For 1 Second because the HP Laptop Which Hosted the Server Got Shut Down by the Lid Closing. As for the Reward for the Inconvience, free paid gems"}, + HasReward =true, + Sender = 102 + + }); + + r.Mail[0].Items.Add(new NetMailRewardItem() { ExpiredAt = DateTime.UtcNow.AddYears(10).ToUnixEpochDate(), RewardID = 1, RewardType = (int)CurrencyType.ChargeCash, RewardValue = 100000 }); + + WriteData(r); + } + } +} diff --git a/nksrv/LobbyServer/Msgs/User/ReadMail.cs b/nksrv/LobbyServer/Msgs/User/ReadMail.cs new file mode 100644 index 0000000..6eea0eb --- /dev/null +++ b/nksrv/LobbyServer/Msgs/User/ReadMail.cs @@ -0,0 +1,23 @@ +using nksrv.Utils; +using Swan; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace nksrv.LobbyServer.Msgs.User +{ + [PacketPath("/mail/read")] + public class ReadMail : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + + var r = new ResReadMail(); + //TODO + WriteData(r); + } + } +} diff --git a/nksrv/Protos/allmsgs.proto b/nksrv/Protos/allmsgs.proto index da63934..f792ebb 100644 --- a/nksrv/Protos/allmsgs.proto +++ b/nksrv/Protos/allmsgs.proto @@ -1237,7 +1237,8 @@ message NetUserSynchroData { repeated NetSynchroSlot Slots = 5; } -message ReqGetSynchroData { +message ReqGetSynchroData {} +message ResGetSynchroData { NetUserSynchroData synchro = 2; } @@ -1960,7 +1961,9 @@ message ReqWearEquipment { int64 Isn = 2; int64 Csn = 3; } -message ResWearEquipment {} +message ResWearEquipment { + repeated NetUserItemData items = 3; +} message NetCampaignFieldObject { string PositionID = 1; @@ -2114,4 +2117,57 @@ message ReqSaveCampaignFieldObject { NetCampaignFieldObject fieldObject = 3; } message ResSaveCampaignFieldObject { +} + +message ReqCharacterLevelUp { + int64 Csn = 2; + int32 Level = 3; +} + +message ResCharacterLevelUp { + NetUserCharacterDefaultData Character = 4; + repeated NetUserCurrencyData Currencies = 3; + int32 SynchroLv = 5; + repeated int64 SynchroStandardCharacters = 6; +} + +message NetMailRewardItem { + int32 RewardType = 1; + int32 RewardID = 2; + int32 RewardValue = 3; + int64 ExpiredAt = 4; +} + +message LocaleableText { + bool IsPlain = 1; + string String = 2; + repeated string Args = 3; +} + +message NetUserMailData { + int64 Msn = 1; + int32 Sender = 2; + int32 Type = 3; + int32 State = 4; + LocaleableText Title = 5; + LocaleableText Text = 6; + int64 CreatedAt = 7; + string Nickname = 9; + repeated string appNoticeId = 10; + bool HasReward = 11; + repeated NetMailRewardItem items = 12; + int32 Period = 13; +} + +message ReqGetMailData {} +message ResGetMailData { + repeated NetUserMailData mail = 2; +} + +message ReqReadMail { + int64 Msn = 1; + int32 Type = 2; +} +message ResReadMail { + } \ No newline at end of file diff --git a/nksrv/Utils/JsonDb.cs b/nksrv/Utils/JsonDb.cs index 2979e23..3840272 100644 --- a/nksrv/Utils/JsonDb.cs +++ b/nksrv/Utils/JsonDb.cs @@ -122,6 +122,18 @@ namespace nksrv.Utils MainQuestData.Add(tid, recieved); } } + + public int GenerateUniqueItemId() + { + var num = Rng.RandomId(); + + while (Items.Any(x => x.Isn == num)) + { + num = Rng.RandomId(); + } + + return num; + } } public class CoreInfo { diff --git a/nksrv/Utils/Rng.cs b/nksrv/Utils/Rng.cs index 071e0e7..a48bf08 100644 --- a/nksrv/Utils/Rng.cs +++ b/nksrv/Utils/Rng.cs @@ -16,5 +16,10 @@ namespace nksrv.Utils return new string(Enumerable.Repeat(chars, length) .Select(s => s[random.Next(s.Length)]).ToArray()); } + + public static int RandomId() + { + return random.Next(); + } } }