From 846b72ce9d419be6264eb1bffee59a7093b2abb1 Mon Sep 17 00:00:00 2001 From: Mikhail Thompson Date: Sat, 29 Jun 2024 15:11:42 +0300 Subject: [PATCH] main quest works --- ProtobufViewUtil/Program.cs | 4 +- nksrv/IntlServer/AutoLoginEndpoint.cs | 2 +- nksrv/LobbyServer/Msgs/Auth/DoEnterServer.cs | 21 ++++-- .../Msgs/Campaign/GetCampaignField.cs | 16 ++++- nksrv/LobbyServer/Msgs/GetGacha.cs | 1 - .../Mission/GetAchievementRewardedData.cs | 5 +- nksrv/LobbyServer/Msgs/Stage/ClearStage.cs | 70 ++++++++++++++----- nksrv/LobbyServer/Msgs/Stage/GetStage.cs | 29 ++++++-- .../Msgs/Trigger/FinishMainQuest.cs | 24 +++++++ .../Msgs/Trigger/GetMainQuestData.cs | 7 +- .../LobbyServer/Msgs/User/EnterLobbyServer.cs | 3 +- .../Msgs/User/GetAllFeatureFlags.cs | 37 +++++++++- nksrv/LobbyServer/Msgs/User/GetUser.cs | 3 +- nksrv/LobbyServer/Msgs/User/GetUserProfile.cs | 17 ++++- nksrv/LobbyServer/Msgs/User/GetWallpaper.cs | 2 +- nksrv/LobbyServer/Msgs/User/SetProfileIcon.cs | 24 +++++++ nksrv/LobbyServer/Msgs/User/SetWallpaper.cs | 3 +- .../Msgs/User/Tutorial/SetTutorial.cs | 2 +- nksrv/Protos/allmsgs.proto | 43 +++++++++++- nksrv/Utils/GreatLogger.cs | 2 + nksrv/Utils/JsonDb.cs | 33 ++++++++- 21 files changed, 299 insertions(+), 49 deletions(-) create mode 100644 nksrv/LobbyServer/Msgs/Trigger/FinishMainQuest.cs create mode 100644 nksrv/LobbyServer/Msgs/User/SetProfileIcon.cs diff --git a/ProtobufViewUtil/Program.cs b/ProtobufViewUtil/Program.cs index dea0a8e..9ddf67d 100644 --- a/ProtobufViewUtil/Program.cs +++ b/ProtobufViewUtil/Program.cs @@ -10,8 +10,8 @@ namespace ProtobufViewUtil { Console.WriteLine("Hello, World!"); - ResGetContentsOpenData s = new ResGetContentsOpenData(); - var inn = File.ReadAllBytes(@"C:\Users\Misha\Downloads\getusercontents-ch2complete"); + ResGetMainQuestData s = new ResGetMainQuestData(); + var inn = File.ReadAllBytes(@"C:\Users\Misha\Downloads\getmainquestdata-ch1complete2"); s.MergeFrom(inn); Console.WriteLine(s.ToString()); var outt = s.ToByteArray(); diff --git a/nksrv/IntlServer/AutoLoginEndpoint.cs b/nksrv/IntlServer/AutoLoginEndpoint.cs index 65a1c6a..4b5ee18 100644 --- a/nksrv/IntlServer/AutoLoginEndpoint.cs +++ b/nksrv/IntlServer/AutoLoginEndpoint.cs @@ -12,7 +12,7 @@ namespace nksrv.IntlServer protected override async Task HandleAsync() { - WriteJsonString("{\"del_account_info\":\"{\\\"ret\\\":0,\\\"msg\\\":\\\"\\\",\\\"status\\\":0,\\\"created_at\\\":\\\"0\\\",\\\"target_destroy_at\\\":\\\"0\\\",\\\"destroyed_at\\\":\\\"0\\\",\\\"err_code\\\":0,\\\"seq\\\":\\\"" + Seq + "\\\"}\",\"del_account_status\":0,\"del_li_account_status\":0,\"extra_json\":{\"del_li_account_info\":\"{\\\"ret\\\":0,\\\"msg\\\":\\\"\\\",\\\"status\\\":0,\\\"created_at\\\":\\\"0\\\",\\\"target_destroy_at\\\":\\\"0\\\",\\\"destroyed_at\\\":\\\"0\\\",\\\"err_code\\\":0,\\\"seq\\\":\\\"1719078088-4128751114-032279-4229229759\\\"}\",\"get_status_msg\":\"success\",\"get_status_ret\":0,\"get_status_rsp\":{\"adult_age\":14,\"adult_age_map\":{},\"adult_check_status\":1,\"adult_check_status_expiration\":\"0\",\"adult_status_map\":{},\"certificate_type\":3,\"email\":\"\",\"eu_user_agree_status\":0,\"game_grade\":0,\"game_grade_map\":{},\"is_dma\":true,\"is_eea\":false,\"is_need_li_cert\":false,\"msg\":\"success\",\"need_parent_control\":0,\"need_realname_auth\":0,\"parent_certificate_status\":0,\"parent_certificate_status_expiration\":\"0\",\"parent_control_map\":{},\"qr_code_ret\":0,\"realname_auth_status\":0,\"region\":\"724\",\"ret\":0,\"ts\":\""+ DateTimeOffset.UtcNow.ToUnixTimeSeconds() + WriteJsonString("{\"del_account_info\":\"{\\\"ret\\\":0,\\\"msg\\\":\\\"\\\",\\\"status\\\":0,\\\"created_at\\\":\\\"0\\\",\\\"target_destroy_at\\\":\\\"0\\\",\\\"destroyed_at\\\":\\\"0\\\",\\\"err_code\\\":0,\\\"seq\\\":\\\"" + Seq + "\\\"}\",\"del_account_status\":0,\"del_li_account_status\":0,\"extra_json\":{\"del_li_account_info\":\"{\\\"ret\\\":0,\\\"msg\\\":\\\"\\\",\\\"status\\\":0,\\\"created_at\\\":\\\"0\\\",\\\"target_destroy_at\\\":\\\"0\\\",\\\"destroyed_at\\\":\\\"0\\\",\\\"err_code\\\":0,\\\"seq\\\":\\\"" + Seq + "\\\"}\",\"get_status_msg\":\"success\",\"get_status_ret\":0,\"get_status_rsp\":{\"adult_age\":14,\"adult_age_map\":{},\"adult_check_status\":1,\"adult_check_status_expiration\":\"0\",\"adult_status_map\":{},\"certificate_type\":3,\"email\":\"\",\"eu_user_agree_status\":0,\"game_grade\":0,\"game_grade_map\":{},\"is_dma\":true,\"is_eea\":false,\"is_need_li_cert\":false,\"msg\":\"success\",\"need_parent_control\":0,\"need_realname_auth\":0,\"parent_certificate_status\":0,\"parent_certificate_status_expiration\":\"0\",\"parent_control_map\":{},\"qr_code_ret\":0,\"realname_auth_status\":0,\"region\":\"724\",\"ret\":0,\"ts\":\"" + DateTimeOffset.UtcNow.ToUnixTimeSeconds() + "\"},\"need_notify_msg\":\"success\",\"need_notify_ret\":0,\"need_notify_rsp\":{\"has_bind_li\":true,\"is_receive_email\":1,\"is_receive_email_in_night\":0,\"user_agreed_game_dma\":\"2\",\"user_agreed_game_pp\":\"1\",\"user_agreed_game_tos\":\"1\",\"user_agreed_li_dt\":\"\",\"user_agreed_li_pp\":\"1\",\"user_agreed_li_tos\":\"\"}},\"msg\":\"success\",\"ret\":0,\"seq\":\"" + Seq + "\"}"); } } diff --git a/nksrv/LobbyServer/Msgs/Auth/DoEnterServer.cs b/nksrv/LobbyServer/Msgs/Auth/DoEnterServer.cs index 4fbed29..abcf151 100644 --- a/nksrv/LobbyServer/Msgs/Auth/DoEnterServer.cs +++ b/nksrv/LobbyServer/Msgs/Auth/DoEnterServer.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using EmbedIO; namespace nksrv.LobbyServer.Msgs.Auth { @@ -16,17 +17,25 @@ namespace nksrv.LobbyServer.Msgs.Auth { var req = await ReadData(); + // request has auth token + UsedAuthToken = req.AuthToken; + foreach (var item in JsonDb.Instance.LauncherAccessTokens) + { + if (item.Token == UsedAuthToken) + { + UserId = item.UserID; + } + } + if (UserId == 0) throw new HttpException(403); + + var user = GetUser(); + var response = new EnterServerResponse(); var rsp = LobbyHandler.GenGameClientTok(req.ClientPublicKey, req.AuthToken); response.GameClientToken = rsp.ClientAuthToken; response.FeatureDataInfo = new NetFeatureDataInfo() { UseFeatureData = true }; - response.Identifier = new NetLegacyUserIdentifier() { Server = 21769, Usn = 10984769 }; + response.Identifier = new NetLegacyUserIdentifier() { Server = 21769, Usn = (long)user.ID }; response.ShouldRestartAfter = Duration.FromTimeSpan(TimeSpan.FromSeconds(86400)); - - // This was probably the public key for communication at some point during the game's development - // But, the developers chose to hardcode server public key in the client, which prevents this - // private server from "just working", so thats why hex patch is required. - // The only point of encrypting packets is to make it harder for me to develop this and users to use this. response.EncryptionToken = ByteString.CopyFromUtf8(rsp.ClientAuthToken); WriteData(response); } diff --git a/nksrv/LobbyServer/Msgs/Campaign/GetCampaignField.cs b/nksrv/LobbyServer/Msgs/Campaign/GetCampaignField.cs index 82d63cb..0c6bce0 100644 --- a/nksrv/LobbyServer/Msgs/Campaign/GetCampaignField.cs +++ b/nksrv/LobbyServer/Msgs/Campaign/GetCampaignField.cs @@ -24,6 +24,18 @@ namespace nksrv.LobbyServer.Msgs.Campaign // todo save this data response.Team = new NetUserTeamData() { LastContentsTeamNumber = 1, Type = 1 }; + if (user.LastStageCleared >= 6000003) + { + var team = new NetTeamData() { TeamNumber = 1 }; + team.Slots.Add(new NetTeamSlot() { Slot = 1, Value = 47263455 }); + team.Slots.Add(new NetTeamSlot() { Slot = 2, Value = 47263456 }); + team.Slots.Add(new NetTeamSlot() { Slot = 3, Value = 47263457 }); + team.Slots.Add(new NetTeamSlot() { Slot = 4, Value = 47263458 }); + team.Slots.Add(new NetTeamSlot() { Slot = 5, Value = 47263459 }); + response.Team.Teams.Add(team); + + response.TeamPositions.Add(new NetCampaignTeamPosition() { TeamNumber = 1, Type = 1, Position = new NetVector3() { } }); + } string resultingJson; if (!user.MapJson.ContainsKey(req.MapId)) @@ -38,13 +50,13 @@ namespace nksrv.LobbyServer.Msgs.Campaign response.Json = resultingJson; - + WriteData(response); } public static int GetChapterFromMapId(string mapId) { - switch(mapId) + switch (mapId) { case "fcbg_cityforest_000": return 0; diff --git a/nksrv/LobbyServer/Msgs/GetGacha.cs b/nksrv/LobbyServer/Msgs/GetGacha.cs index a4c1bfc..9479b04 100644 --- a/nksrv/LobbyServer/Msgs/GetGacha.cs +++ b/nksrv/LobbyServer/Msgs/GetGacha.cs @@ -16,7 +16,6 @@ namespace nksrv.LobbyServer.Msgs var req = ReadData(); var response = new ResGetGachaData(); - WriteData(response); } } diff --git a/nksrv/LobbyServer/Msgs/Mission/GetAchievementRewardedData.cs b/nksrv/LobbyServer/Msgs/Mission/GetAchievementRewardedData.cs index b950ac1..e53f5a7 100644 --- a/nksrv/LobbyServer/Msgs/Mission/GetAchievementRewardedData.cs +++ b/nksrv/LobbyServer/Msgs/Mission/GetAchievementRewardedData.cs @@ -12,9 +12,10 @@ namespace nksrv.LobbyServer.Msgs.Mission { protected override async Task HandleAsync() { - var req = await ReadData(); + var req = await ReadData(); + + var response = new ResGetAchievementRewardedData(); - var response = new ReqGetAchievementRewardedData(); // TODO WriteData(response); } diff --git a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs index 1741b0c..52ea2e6 100644 --- a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs +++ b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs @@ -31,30 +31,13 @@ namespace nksrv.LobbyServer.Msgs.Stage user.FieldInfo.Add(0, new FieldInfo() { }); } + DoQuestSpecificUserOperations(user, req.StageId); + // TODO: figure out how stageid corresponds to chapter user.FieldInfo[GetChapterForStageId(req.StageId)].CompletedStages.Add(new NetFieldStageData() { StageId = req.StageId }); JsonDb.Save(); - if (req.StageId == 6000003) - { - // TODO: Is this the right place to copy over default characters? - // TODO: What is CSN and TID? Also need to add names for these - // Note: CSN appears to be a character ID, still not sure what TID is - 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.TeamData.TeamNumber = 1; - user.TeamData.TeamCombat = 1446; // TODO: Don't hardcode this - user.TeamData.Slots.Clear(); - user.TeamData.Slots.Add(new NetWholeTeamSlot { Slot = 1, Csn = 47263455, Tid = 201001, Lvl = 1 }); - user.TeamData.Slots.Add(new NetWholeTeamSlot { Slot = 2, Csn = 47273456, Tid = 330501, Lvl = 1 }); - user.TeamData.Slots.Add(new NetWholeTeamSlot { Slot = 3, Csn = 47263457, Tid = 130201, Lvl = 1 }); - user.TeamData.Slots.Add(new NetWholeTeamSlot { Slot = 4, Csn = 47263458, Tid = 230101, Lvl = 1 }); - user.TeamData.Slots.Add(new NetWholeTeamSlot { Slot = 5, Csn = 47263459, Tid = 301201, Lvl = 1 }); - } // assign rewards if (StageCompletionReward.RewardData.ContainsKey(req.StageId)) @@ -102,6 +85,55 @@ namespace nksrv.LobbyServer.Msgs.Stage WriteData(response); } + private static void DoQuestSpecificUserOperations(Utils.User user, int clearedStageId) + { + if (clearedStageId == 6000001) + { + user.SetQuest(2, true); + } + else if (clearedStageId == 6000002) + { + user.SetQuest(3, true); + } + else if (clearedStageId == 6000003) + { + // TODO: Is this the right place to copy over default characters? + // TODO: What is CSN and TID? Also need to add names for these + // Note: CSN appears to be a character ID, still not sure what TID is + 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.TeamData.TeamNumber = 1; + user.TeamData.TeamCombat = 1446; // TODO: Don't hardcode this + user.TeamData.Slots.Clear(); + user.TeamData.Slots.Add(new NetWholeTeamSlot { Slot = 1, Csn = 47263455, Tid = 201001, Lvl = 1 }); + user.TeamData.Slots.Add(new NetWholeTeamSlot { Slot = 2, Csn = 47273456, Tid = 330501, Lvl = 1 }); + user.TeamData.Slots.Add(new NetWholeTeamSlot { Slot = 3, Csn = 47263457, Tid = 130201, Lvl = 1 }); + user.TeamData.Slots.Add(new NetWholeTeamSlot { Slot = 4, Csn = 47263458, Tid = 230101, Lvl = 1 }); + user.TeamData.Slots.Add(new NetWholeTeamSlot { Slot = 5, Csn = 47263459, Tid = 301201, Lvl = 1 }); + + user.SetQuest(4, true); + } + else if (clearedStageId == 6001001) + { + user.SetQuest(5, true); + } + else if (clearedStageId == 6001003) + { + user.SetQuest(6, true); + } + else if (clearedStageId == 6001004) + { + user.SetQuest(7, true); + } + else if (clearedStageId == 6002001) + { + user.SetQuest(13, true); + } + } public static int GetChapterForStageId(int stageId) { if (6000001 <= stageId && stageId <= 6000003) diff --git a/nksrv/LobbyServer/Msgs/Stage/GetStage.cs b/nksrv/LobbyServer/Msgs/Stage/GetStage.cs index c4cb726..960cff0 100644 --- a/nksrv/LobbyServer/Msgs/Stage/GetStage.cs +++ b/nksrv/LobbyServer/Msgs/Stage/GetStage.cs @@ -1,4 +1,5 @@ using nksrv.Utils; +using Swan.Logging; using System; using System.Collections.Generic; using System.Linq; @@ -18,15 +19,35 @@ namespace nksrv.LobbyServer.Msgs.Stage var user = GetUser(); var response = new ResGetStageData(); - response.Field = CreateFieldInfo(user, req.Chapter-1); - - - + response.Field = CreateFieldInfo(user, req.Chapter - 1); + + response.HasChapterBossEntered = true; + response.SquadData = ""; WriteData(response); } + public static NetFieldObjectData CreateFieldInfoWithAllStages(int chapter) + { + var f = new NetFieldObjectData(); + switch(chapter) + { + case 1: + f.Stages.Add(new NetFieldStageData() { StageId = 6001001 }); + f.Stages.Add(new NetFieldStageData() { StageId = 6001002 }); + f.Stages.Add(new NetFieldStageData() { StageId = 6001003 }); + f.Stages.Add(new NetFieldStageData() { StageId = 6001004 }); + + // Objects are collected i think + break; + default: + Logger.Error("ERROR: CreateFieldInfoWithAllStages: TODO chapter " + chapter); + break; + } + return f; + } + public static NetFieldObjectData CreateFieldInfo(Utils.User user, int chapter) { var f = new NetFieldObjectData(); diff --git a/nksrv/LobbyServer/Msgs/Trigger/FinishMainQuest.cs b/nksrv/LobbyServer/Msgs/Trigger/FinishMainQuest.cs new file mode 100644 index 0000000..46ebb14 --- /dev/null +++ b/nksrv/LobbyServer/Msgs/Trigger/FinishMainQuest.cs @@ -0,0 +1,24 @@ +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/FinMainQuest")] + public class FinishMainQuest : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var user = GetUser(); + Console.WriteLine("Complete quest: " + req.Tid); + user.SetQuest(req.Tid, true); // todo is this right? + JsonDb.Save(); + var response = new ResFinMainQuest(); + WriteData(response); + } + } +} diff --git a/nksrv/LobbyServer/Msgs/Trigger/GetMainQuestData.cs b/nksrv/LobbyServer/Msgs/Trigger/GetMainQuestData.cs index 936edf1..b2b7c46 100644 --- a/nksrv/LobbyServer/Msgs/Trigger/GetMainQuestData.cs +++ b/nksrv/LobbyServer/Msgs/Trigger/GetMainQuestData.cs @@ -8,9 +8,14 @@ namespace nksrv.LobbyServer.Msgs.Trigger protected override async Task HandleAsync() { var req = await ReadData(); + var user = GetUser(); var response = new ResGetMainQuestData(); - response.MainQuestList.Add(new NetMainQuestData() { IsReceived = true, Tid = 1 }); + foreach (var item in user.MainQuestData) + { + response.MainQuestList.Add(new NetMainQuestData() { IsReceived = item.Value, Tid = item.Key }); + } + WriteData(response); } } diff --git a/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs b/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs index fed3cbc..3208bcd 100644 --- a/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs +++ b/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs @@ -23,7 +23,8 @@ namespace nksrv.LobbyServer.Msgs.User response.User.CommanderRoomJukebox = 5; response.User.CostumeLv = 1; response.User.Frame = 1; - response.User.Icon = 39900; + response.User.Icon = user.ProfileIconId; + response.User.IconPrism = user.ProfileIconIsPrism; response.User.LobbyJukebox = 2; response.ResetHour = 20; response.Nickname = user.Nickname; diff --git a/nksrv/LobbyServer/Msgs/User/GetAllFeatureFlags.cs b/nksrv/LobbyServer/Msgs/User/GetAllFeatureFlags.cs index 08c08c3..f7d6a5b 100644 --- a/nksrv/LobbyServer/Msgs/User/GetAllFeatureFlags.cs +++ b/nksrv/LobbyServer/Msgs/User/GetAllFeatureFlags.cs @@ -15,7 +15,42 @@ namespace nksrv.LobbyServer.Msgs.User var req = await ReadData(); var response = new ResGetAllFeatureFlags(); - // TODO + response.Flags.AddRange([ + new NetFeatureFlag() { FeatureKind = NetFeatureKind.UnionRaid2, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.CooperationEvent, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.RookieArena, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.SimulationRoom, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.DailyEvent, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.Intercept, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.Attendance, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.Dice, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.StoryDungeonEvent, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.Tower, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.LostSector2, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.Subscription2, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.ArchiveEventSystem, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.ViewShortCut, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.PollEvent, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.ComeBackUserEvent, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.EventPass, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.FieldHubEvent, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.ShopEvent, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.MissionEvent, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.ChargeGachaEvent, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.MiniGameSortOut, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.CharacterSkillResetEvent, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.EventQuest, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.RewardUpEvent, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.SdbattleEvent, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.TextAdventure, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.ChallengeModeEvent, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.DailyFreeGachaEvent, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.BoxGachaEvent, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.DiceEvent, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.Bbqtycoon, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.Ce002MiniGame, IsOpen = true }, + new NetFeatureFlag() { FeatureKind = NetFeatureKind.SoloRaid, IsOpen = true }, + ]); WriteData(response); } } diff --git a/nksrv/LobbyServer/Msgs/User/GetUser.cs b/nksrv/LobbyServer/Msgs/User/GetUser.cs index 19667bc..a1fb61d 100644 --- a/nksrv/LobbyServer/Msgs/User/GetUser.cs +++ b/nksrv/LobbyServer/Msgs/User/GetUser.cs @@ -24,7 +24,8 @@ namespace nksrv.LobbyServer.Msgs.User response.User.CommanderRoomJukebox = 5; response.User.CostumeLv = 1; response.User.Frame = 1; - response.User.Icon = 39900; + response.User.Icon = user.ProfileIconId; + response.User.IconPrism = user.ProfileIconIsPrism; response.User.LobbyJukebox = 2; response.ResetHour = 20; response.OutpostBattleTime = new NetOutpostBattleTime() { MaxBattleTime = 864000000000, MaxOverBattleTime = 12096000000000 }; diff --git a/nksrv/LobbyServer/Msgs/User/GetUserProfile.cs b/nksrv/LobbyServer/Msgs/User/GetUserProfile.cs index 8786648..2454e25 100644 --- a/nksrv/LobbyServer/Msgs/User/GetUserProfile.cs +++ b/nksrv/LobbyServer/Msgs/User/GetUserProfile.cs @@ -1,4 +1,5 @@ using nksrv.Utils; +using Swan.Logging; using System; using System.Collections.Generic; using System.Linq; @@ -13,11 +14,21 @@ namespace nksrv.LobbyServer.Msgs.User protected override async Task HandleAsync() { var req = await ReadData(); - + var user = GetUser(); var response = new ResGetProfileData(); - - Console.WriteLine(req.TargetUsn); response.Data = new NetProfileData(); + Console.WriteLine("GET USER PROFILE NOT IMPLEMENTED: " + req.TargetUsn); + if (user.ID == (ulong)req.TargetUsn) + { + response.Data.User = new NetWholeUserData(); + response.Data.User.Icon = user.ProfileIconId; + response.Data.User.IconPrism = user.ProfileIconIsPrism; + } + else + { + Logger.Warn("Unknown User ID: " + req.TargetUsn); + } + WriteData(response); } } diff --git a/nksrv/LobbyServer/Msgs/User/GetWallpaper.cs b/nksrv/LobbyServer/Msgs/User/GetWallpaper.cs index 110e8f5..ba5be99 100644 --- a/nksrv/LobbyServer/Msgs/User/GetWallpaper.cs +++ b/nksrv/LobbyServer/Msgs/User/GetWallpaper.cs @@ -14,7 +14,7 @@ namespace nksrv.LobbyServer.Msgs.User { var req = await ReadData(); var response = new ResGetWallpaper(); - + response.WallpaperList.AddRange(GetUser().WallpaperList); WriteData(response); } diff --git a/nksrv/LobbyServer/Msgs/User/SetProfileIcon.cs b/nksrv/LobbyServer/Msgs/User/SetProfileIcon.cs new file mode 100644 index 0000000..786559e --- /dev/null +++ b/nksrv/LobbyServer/Msgs/User/SetProfileIcon.cs @@ -0,0 +1,24 @@ +using nksrv.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace nksrv.LobbyServer.Msgs.User +{ + [PacketPath("/user/setprofileicon")] + public class SetProfileIcon : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var user = GetUser(); + user.ProfileIconId = req.Icon; + user.ProfileIconIsPrism = req.IsPrism; + JsonDb.Save(); + var response = new ResSetProfileIcon(); + WriteData(response); + } + } +} diff --git a/nksrv/LobbyServer/Msgs/User/SetWallpaper.cs b/nksrv/LobbyServer/Msgs/User/SetWallpaper.cs index 3902d15..dff7d2f 100644 --- a/nksrv/LobbyServer/Msgs/User/SetWallpaper.cs +++ b/nksrv/LobbyServer/Msgs/User/SetWallpaper.cs @@ -14,7 +14,8 @@ namespace nksrv.LobbyServer.Msgs.User { var req = await ReadData(); var response = new ResSetWallpaper(); - // todo + var user = GetUser(); + user.WallpaperList = req.WallpaperList.ToArray(); WriteData(response); } diff --git a/nksrv/LobbyServer/Msgs/User/Tutorial/SetTutorial.cs b/nksrv/LobbyServer/Msgs/User/Tutorial/SetTutorial.cs index 44dfa6c..82b4abc 100644 --- a/nksrv/LobbyServer/Msgs/User/Tutorial/SetTutorial.cs +++ b/nksrv/LobbyServer/Msgs/User/Tutorial/SetTutorial.cs @@ -15,7 +15,7 @@ namespace nksrv.LobbyServer.Msgs.User.Tutorial var req = await ReadData(); var user = GetUser(); if (!user.ClearedTutorials.Contains(req.LastClearedTid)) - user.ClearedTutorials.Add(req.LastClearedTid); + user.ClearedTutorials.Add(req.LastClearedTid); JsonDb.Save(); var response = new ResSetTutorial(); diff --git a/nksrv/Protos/allmsgs.proto b/nksrv/Protos/allmsgs.proto index 19f13f9..e6136d8 100644 --- a/nksrv/Protos/allmsgs.proto +++ b/nksrv/Protos/allmsgs.proto @@ -1518,7 +1518,34 @@ message ResGetJupiterMarketingDetail { message NetProfileData { - // TODO + string desc = 1; + int64 lastActionAt = 2; + int32 exp = 3; + int32 lastCampaignNormalStageId = 4; + int32 lastCampaignHardStageId = 5; + int32 lastTribeTowerFloor = 6; + NetWholeUserData user = 7; + /*repeated NetProfileTeamSlot profileTeam = 8; + NetSimpleGuildData guild = 9; + NetCharacterCount characterCount = 10; + repeated NetUserRecycleRoomData recycle = 11; + int32 synchroLv = 12; + int32 synchroSlotCount = 13; + in32 infraCoreLv = 14; + int32 lastTacticAcademyClass = 15; + int32 lastTacticAcademyLesson = 16; + repeated NetMemorialCount memorialCount = 17; + int32 jukeboxCount = 18; + int32 costumeLv = 19; + int32 outpostOpenState = 20; + int32 costumeCount = 22; + string language = 23; + NetProfileFrameHistoryType profileFrameHistory = 24; + repeated NetProfileFrameData profileFrames = 25; + repeated NetProfileRepresentativeFrame representativeProfileFrames = 26; + repeated int32 recentAcquireFilterTypes = 27; + int32 simRoomOverclockHighScoreLevel = 28; + repeated NetProfileSimRoomOverclockHighScoreData simRoomOverclockHighScoreData = 29;*/ } @@ -1572,4 +1599,18 @@ message ReqSetTeam { message ResSetTeam { int32 type = 2; repeated NetTeamData teams = 3; +} + +message ReqSetProfileIcon { + int32 icon = 2; + bool isPrism = 3; +} +message ResSetProfileIcon { +} + +message ReqFinMainQuest { + int32 tid = 2; +} + +message ResFinMainQuest { } \ No newline at end of file diff --git a/nksrv/Utils/GreatLogger.cs b/nksrv/Utils/GreatLogger.cs index 08a686c..d30df73 100644 --- a/nksrv/Utils/GreatLogger.cs +++ b/nksrv/Utils/GreatLogger.cs @@ -34,6 +34,8 @@ namespace nksrv.Utils var oldFG = Console.ForegroundColor; Console.ForegroundColor = newFG; Console.WriteLine(msg); + if (logEvent.Exception != null) + Console.WriteLine(logEvent.Exception); Console.ForegroundColor = oldFG; } diff --git a/nksrv/Utils/JsonDb.cs b/nksrv/Utils/JsonDb.cs index 2be78ca..16f6ae8 100644 --- a/nksrv/Utils/JsonDb.cs +++ b/nksrv/Utils/JsonDb.cs @@ -35,7 +35,13 @@ namespace nksrv.Utils public int Skill2Lvl = 1; public int Grade = 0; } - + public class MainQuestData + { + public int TableId = 0; + public bool IsReceieved = false; + } + + public class User { // User info @@ -46,6 +52,8 @@ namespace nksrv.Utils public long RegisterTime; public int LastStageCleared; public string Nickname = "SomePLayer"; + public int ProfileIconId = 39900; + public bool ProfileIconIsPrism = false; // Game data @@ -60,6 +68,29 @@ namespace nksrv.Utils public List Characters = []; public NetWholeUserTeamData TeamData = new(); public List ClearedTutorials = []; + public NetWallpaperData[] WallpaperList = []; + public Dictionary MainQuestData = new() + { + {1, false } + }; + + public void SetQuest(int tid, bool recieved) + { + if (MainQuestData.ContainsKey(tid)) + { + MainQuestData[tid] = recieved; + return; + } + else + { + MainQuestData.Add(tid, recieved); + } + } + + public void RmQuest(int tid) + { + MainQuestData.Remove(tid); + } } public class CoreInfo {