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

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