main quest works

This commit is contained in:
Mikhail Thompson
2024-06-29 15:11:42 +03:00
parent 1229104086
commit 846b72ce9d
21 changed files with 299 additions and 49 deletions

View File

@@ -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();

View File

@@ -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 + "\"}");
}
}

View File

@@ -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<EnterServerRequest>();
// 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);
}

View File

@@ -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;

View File

@@ -16,7 +16,6 @@ namespace nksrv.LobbyServer.Msgs
var req = ReadData<ReqGetGachaData>();
var response = new ResGetGachaData();
WriteData(response);
}
}

View File

@@ -12,9 +12,10 @@ namespace nksrv.LobbyServer.Msgs.Mission
{
protected override async Task HandleAsync()
{
var req = await ReadData<ResGetAchievementRewardedData>();
var req = await ReadData<ReqGetAchievementRewardedData>();
var response = new ResGetAchievementRewardedData();
var response = new ReqGetAchievementRewardedData();
// TODO
WriteData(response);
}

View File

@@ -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)

View File

@@ -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();

View File

@@ -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<ReqFinMainQuest>();
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);
}
}
}

View File

@@ -8,9 +8,14 @@ namespace nksrv.LobbyServer.Msgs.Trigger
protected override async Task HandleAsync()
{
var req = await ReadData<ReqGetMainQuestData>();
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);
}
}

View File

@@ -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;

View File

@@ -15,7 +15,42 @@ namespace nksrv.LobbyServer.Msgs.User
var req = await ReadData<ReqGetAllFeatureFlags>();
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);
}
}

View File

@@ -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 };

View File

@@ -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<ReqGetProfileData>();
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);
}
}

View File

@@ -14,7 +14,7 @@ namespace nksrv.LobbyServer.Msgs.User
{
var req = await ReadData<ReqGetWallpaper>();
var response = new ResGetWallpaper();
response.WallpaperList.AddRange(GetUser().WallpaperList);
WriteData(response);
}

View File

@@ -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<ReqSetProfileIcon>();
var user = GetUser();
user.ProfileIconId = req.Icon;
user.ProfileIconIsPrism = req.IsPrism;
JsonDb.Save();
var response = new ResSetProfileIcon();
WriteData(response);
}
}
}

View File

@@ -14,7 +14,8 @@ namespace nksrv.LobbyServer.Msgs.User
{
var req = await ReadData<ReqSetWallpaper>();
var response = new ResSetWallpaper();
// todo
var user = GetUser();
user.WallpaperList = req.WallpaperList.ToArray();
WriteData(response);
}

View File

@@ -15,7 +15,7 @@ namespace nksrv.LobbyServer.Msgs.User.Tutorial
var req = await ReadData<ReqSetTutorial>();
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();

View File

@@ -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 {
}

View File

@@ -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;
}

View File

@@ -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<Character> Characters = [];
public NetWholeUserTeamData TeamData = new();
public List<int> ClearedTutorials = [];
public NetWallpaperData[] WallpaperList = [];
public Dictionary<int, bool> 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
{