diff --git a/ProtobufViewUtil/Program.cs b/ProtobufViewUtil/Program.cs new file mode 100644 index 0000000..2fa5574 --- /dev/null +++ b/ProtobufViewUtil/Program.cs @@ -0,0 +1,30 @@ +using Google.Protobuf; +using nksrv; +using System.Diagnostics; + +namespace ProtobufViewUtil +{ + internal class Program + { + static void Main(string[] args) + { + Console.WriteLine("Hello, World!"); + + ResGetScenarioList s = new ResGetScenarioList(); + var inn = File.ReadAllBytes(@"C:\NIKKE\NIKKE\game\ses1\output-49"); + s.MergeFrom(inn); + Console.WriteLine(s.ToString()); + var outt = s.ToByteArray(); + + if (inn.SequenceEqual(outt)) + { + Console.WriteLine("Check OK"); + } + else + { + Console.WriteLine("Check FAIL"); + } + Debugger.Break(); + } + } +} diff --git a/ProtobufViewUtil/ProtobufViewUtil.csproj b/ProtobufViewUtil/ProtobufViewUtil.csproj new file mode 100644 index 0000000..653c21b --- /dev/null +++ b/ProtobufViewUtil/ProtobufViewUtil.csproj @@ -0,0 +1,22 @@ + + + + Exe + net8.0 + enable + enable + + + + + + + + + + + + + + + diff --git a/ProtobufViewUtil/doimport.proto b/ProtobufViewUtil/doimport.proto new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/ProtobufViewUtil/doimport.proto @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/nksrv.sln b/nksrv.sln index 97b13f6..62226a8 100644 --- a/nksrv.sln +++ b/nksrv.sln @@ -7,6 +7,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "nksrv", "nksrv\nksrv.csproj EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataFixupUtil", "DataFixupUtil\DataFixupUtil.csproj", "{13124DFB-448B-4F4F-A479-537EE067D836}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtobufViewUtil", "ProtobufViewUtil\ProtobufViewUtil.csproj", "{FDEDD0D6-9C02-4E58-8110-04E8D5639881}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -41,6 +43,18 @@ Global {13124DFB-448B-4F4F-A479-537EE067D836}.Release|x64.Build.0 = Release|Any CPU {13124DFB-448B-4F4F-A479-537EE067D836}.Release|x86.ActiveCfg = Release|Any CPU {13124DFB-448B-4F4F-A479-537EE067D836}.Release|x86.Build.0 = Release|Any CPU + {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Debug|x64.ActiveCfg = Debug|Any CPU + {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Debug|x64.Build.0 = Debug|Any CPU + {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Debug|x86.ActiveCfg = Debug|Any CPU + {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Debug|x86.Build.0 = Debug|Any CPU + {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Release|Any CPU.Build.0 = Release|Any CPU + {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Release|x64.ActiveCfg = Release|Any CPU + {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Release|x64.Build.0 = Release|Any CPU + {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Release|x86.ActiveCfg = Release|Any CPU + {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/nksrv/LobbyServer/Msgs/Campaign/GetCampaignField.cs b/nksrv/LobbyServer/Msgs/Campaign/GetCampaignField.cs index 4c4deee..ae1c8f1 100644 --- a/nksrv/LobbyServer/Msgs/Campaign/GetCampaignField.cs +++ b/nksrv/LobbyServer/Msgs/Campaign/GetCampaignField.cs @@ -12,9 +12,29 @@ namespace nksrv.LobbyServer.Msgs.Campaign { protected override async Task HandleAsync() { - var req = ReadData(); + var req = await ReadData(); + var user = GetUser(); + + Console.WriteLine("Map ID: " + req.MapId); var response = new ResGetCampaignFieldData(); + response.Field = new NetFieldObjectData(); + + // todo save this data + response.Team = new NetUserTeamData() { LastContentsTeamNumber = 1, Type = 1 }; + + string resultingJson; + if (!user.MapJson.ContainsKey(req.MapId)) + { + resultingJson = "{\"_mapID\":\"" + req.MapId + "\",\"_triggerDataList\":[],\"_interactionActionTriggerDataList\":[],\"_interactionObjectDataList\":[],\"_questObjectDataList\":[],\"_togglePortalDataList\":[],\"_squadDataList\":[{\"UniqueKey\":\"a365d3ab-2961-4eb8-940b-f68629957b48\",\"IsValid\":true,\"TeamType\":1,\"Number\":1,\"Position\":{\"x\":-14.899999618530274,\"y\":0.08333173394203186,\"z\":-3.2200000286102297}}]}"; + user.MapJson.Add(req.MapId, resultingJson); + } + else + { + resultingJson = user.MapJson[req.MapId]; + } + + WriteData(response); } } diff --git a/nksrv/LobbyServer/Msgs/Campaign/SaveField.cs b/nksrv/LobbyServer/Msgs/Campaign/SaveField.cs new file mode 100644 index 0000000..c3f018e --- /dev/null +++ b/nksrv/LobbyServer/Msgs/Campaign/SaveField.cs @@ -0,0 +1,33 @@ +using nksrv.Utils; + +namespace nksrv.LobbyServer.Msgs.Campaign +{ + [PacketPath("/campaign/savefield")] + public class SaveField : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var user = GetUser(); + + Console.WriteLine("Map ID: " + req.MapId); + + var response = new ResGetFieldTalkList(); + + Console.WriteLine($"todo save {req.MapId} with {req.Json}"); + + if (!user.MapJson.ContainsKey(req.MapId)) + { + user.MapJson.Add(req.MapId, req.Json); + } + else + { + user.MapJson[req.MapId] = req.Json; + } + + + + WriteData(response); + } + } +} diff --git a/nksrv/LobbyServer/Msgs/Stage/CheckCleared.cs b/nksrv/LobbyServer/Msgs/Stage/CheckCleared.cs new file mode 100644 index 0000000..bbf1b81 --- /dev/null +++ b/nksrv/LobbyServer/Msgs/Stage/CheckCleared.cs @@ -0,0 +1,39 @@ +using nksrv.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace nksrv.LobbyServer.Msgs.Stage +{ + [PacketPath("/stage/checkclear")] + public class CheckCleared : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + + var response = new ResCheckStageClear(); + var user = GetUser(); + + foreach (var stageIds in req.StageIds) + { + foreach (var fields in user.FieldInfo) + { + foreach (var stages in fields.Value.CompletedStages) + { + if (stages.StageId == stageIds) + { + response.ClearedStageIds.Add(stages.StageId); + } + } + } + } + + + WriteData(response); + } + } + +} diff --git a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs index 3cd4727..babec63 100644 --- a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs +++ b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs @@ -15,13 +15,22 @@ namespace nksrv.LobbyServer.Msgs.Stage var req = await ReadData(); var response = new ResClearStage(); + var user = GetUser(); // TOOD: save to user info Console.WriteLine($"Stage " + req.StageId + " completed, result is " + req.BattleResult); if (req.BattleResult == 1) { - GetUser().LastStageCleared = req.StageId; + user.LastStageCleared = req.StageId; + + if (user.FieldInfo.Count == 0) + { + user.FieldInfo.Add(0, new FieldInfo() { }); + } + + // TODO: figure out how stageid corresponds to chapter + user.FieldInfo[0].CompletedStages.Add(new NetFieldStageData() { StageId = req.StageId }); JsonDb.Save(); } diff --git a/nksrv/LobbyServer/Msgs/Stage/GetStage.cs b/nksrv/LobbyServer/Msgs/Stage/GetStage.cs index a2acb3d..09d83aa 100644 --- a/nksrv/LobbyServer/Msgs/Stage/GetStage.cs +++ b/nksrv/LobbyServer/Msgs/Stage/GetStage.cs @@ -12,9 +12,41 @@ namespace nksrv.LobbyServer.Msgs.Stage { protected override async Task HandleAsync() { - var req = ReadData(); + var req = await ReadData(); + var user = GetUser(); var response = new ResGetStageData(); + response.Field = new NetFieldObjectData(); + + // locate chapter + bool found = false; + + retry: + foreach (var item in user.FieldInfo) + { + if (item.Key == req.Chapter) + { + found = true; + foreach (var stage in item.Value.CompletedStages) + { + response.Field.Stages.Add(stage); + } + response.HasChapterBossEntered = item.Value.BossEntered; + break; + } + } + + if (!found) + { + Console.WriteLine("chapter not found: " + req.Chapter); + + user.FieldInfo.Add(req.Chapter, new FieldInfo()); + goto retry; + } + + + response.SquadData = ""; + WriteData(response); } diff --git a/nksrv/LobbyServer/Msgs/System/CheckClientVersion.cs b/nksrv/LobbyServer/Msgs/System/CheckClientVersion.cs index 4a77f30..4ec5393 100644 --- a/nksrv/LobbyServer/Msgs/System/CheckClientVersion.cs +++ b/nksrv/LobbyServer/Msgs/System/CheckClientVersion.cs @@ -8,10 +8,10 @@ namespace nksrv.LobbyServer.Msgs.System protected override async Task HandleAsync() { var req = await ReadData(); - var r = new CheckVersionResponse(); - r.Availability = 0; // None = 0, Available = 1, Mandatory = 2 + var response = new CheckVersionResponse(); + response.Availability = 0; // None = 0, Available = 1, Mandatory = 2 - WriteData(r); + WriteData(response); } } } diff --git a/nksrv/LobbyServer/Msgs/Team/GetTeamData.cs b/nksrv/LobbyServer/Msgs/Team/GetTeamData.cs index 9ee4517..d624931 100644 --- a/nksrv/LobbyServer/Msgs/Team/GetTeamData.cs +++ b/nksrv/LobbyServer/Msgs/Team/GetTeamData.cs @@ -18,7 +18,7 @@ namespace nksrv.LobbyServer.Msgs.Team // TODO: assume that team data did not change var resp = new ResGetTeamData(); //resp.TypeTeams - WriteData(req); + WriteData(resp); } } } diff --git a/nksrv/LobbyServer/Msgs/User/GetFieldTalkList.cs b/nksrv/LobbyServer/Msgs/User/GetFieldTalkList.cs new file mode 100644 index 0000000..d8220a6 --- /dev/null +++ b/nksrv/LobbyServer/Msgs/User/GetFieldTalkList.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/getfieldtalklist")] + public class GetFieldTalkList : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var user = GetUser(); + + var response = new ResGetFieldTalkList(); + // TODO + + WriteData(response); + } + } +} diff --git a/nksrv/LobbyServer/Msgs/User/GetScenarioList.cs b/nksrv/LobbyServer/Msgs/User/GetScenarioList.cs new file mode 100644 index 0000000..5f582a7 --- /dev/null +++ b/nksrv/LobbyServer/Msgs/User/GetScenarioList.cs @@ -0,0 +1,30 @@ +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/GetScenarioList")] + public class GetScenarioList : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var user = GetUser(); + + // todo what are bookmark scenarios? + + // this returns a list of scenarios that user has completed + var response = new ResGetScenarioList(); + foreach (var item in user.CompletedScenarios) + { + response.ScenarioList.Add(item); + } + + WriteData(response); + } + } +} diff --git a/nksrv/Protos/allmsgs.proto b/nksrv/Protos/allmsgs.proto index 142f67a..8c46f5e 100644 --- a/nksrv/Protos/allmsgs.proto +++ b/nksrv/Protos/allmsgs.proto @@ -753,7 +753,7 @@ message ReqGetCampaignFieldData { message ResGetCampaignFieldData { NetFieldObjectData field = 2; NetUserTeamData team = 3; - NetCampaignTeamPosition teamPositions = 4; + repeated NetCampaignTeamPosition teamPositions = 4; string json = 5; } @@ -965,4 +965,33 @@ message NetSubQuestData { message ResGetSubQuestList { repeated NetSubQuestData subquestList = 2; +} + +message ReqCheckStageClear { + repeated int32 stageIds = 1; +} +message ResCheckStageClear { + repeated int32 clearedStageIds = 2; +} + +message ReqGetScenarioList { + +} +message ResGetScenarioList { + repeated string scenarioList = 2; + repeated string bookmarkScenarioList = 3; +} + +message ReqSaveCampaignField{ + string mapId = 2; + string json = 3; +} + +message ResSaveCampaignField{ + +} + +message ReqGetFieldTalkList {} +message ResGetFieldTalkList { + repeated string fieldTalkList = 2; } \ No newline at end of file diff --git a/nksrv/Utils/JsonDb.cs b/nksrv/Utils/JsonDb.cs index d04c156..26506ef 100644 --- a/nksrv/Utils/JsonDb.cs +++ b/nksrv/Utils/JsonDb.cs @@ -16,6 +16,18 @@ namespace nksrv.Utils public long ExpirationTime; public ulong UserID; } + public class NetworkPosition + { + public float x; + public float y; + public float z; + } + public class FieldInfo + { + public List CompletedStages = new(); + public bool BossEntered = false; + public NetworkPosition teamPosition = new(); + } public class User { // User info @@ -28,7 +40,9 @@ namespace nksrv.Utils // Game data - public List CompletedScenarios = new List(); + public List CompletedScenarios = new(); + public Dictionary FieldInfo = new(); + public Dictionary MapJson = new(); } public class CoreInfo {