From 28f6473bb9afc8e236929e23385e7bf4a8202ede Mon Sep 17 00:00:00 2001 From: Mikhail Thompson Date: Fri, 28 Jun 2024 13:48:43 +0300 Subject: [PATCH] basic reward system working --- .../PartyMatch/ListPartyMatchInvitations.cs | 18 +++++++ nksrv/LobbyServer/Msgs/Stage/ClearStage.cs | 47 ++++++++++++++++++- nksrv/LobbyServer/Msgs/Team/GetTeamData.cs | 29 ++++++++++-- .../LobbyServer/Msgs/User/EnterLobbyServer.cs | 2 + nksrv/LobbyServer/Msgs/User/GetUser.cs | 8 ++++ .../Msgs/User/Tutorial/SetTutorial.cs | 1 + nksrv/Protos/allmsgs.proto | 18 +++++++ nksrv/StaticInfo/StageCompletionReward.cs | 31 ++++++++++++ nksrv/Utils/JsonDb.cs | 4 +- 9 files changed, 148 insertions(+), 10 deletions(-) create mode 100644 nksrv/LobbyServer/Msgs/PartyMatch/ListPartyMatchInvitations.cs create mode 100644 nksrv/StaticInfo/StageCompletionReward.cs diff --git a/nksrv/LobbyServer/Msgs/PartyMatch/ListPartyMatchInvitations.cs b/nksrv/LobbyServer/Msgs/PartyMatch/ListPartyMatchInvitations.cs new file mode 100644 index 0000000..cb87df8 --- /dev/null +++ b/nksrv/LobbyServer/Msgs/PartyMatch/ListPartyMatchInvitations.cs @@ -0,0 +1,18 @@ +using nksrv.Utils; + +namespace nksrv.LobbyServer.Msgs.PartyMatch +{ + [PacketPath("/partymatch/listinvitation")] + public class ListPartyMatchInvitations : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var user = GetUser(); + + var response = new ResListInvitation(); + // TODO + WriteData(response); + } + } +} diff --git a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs index 193529f..1741b0c 100644 --- a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs +++ b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs @@ -1,4 +1,5 @@ -using nksrv.Utils; +using nksrv.StaticInfo; +using nksrv.Utils; using Swan.Logging; using System; using System.Collections.Generic; @@ -48,12 +49,54 @@ namespace nksrv.LobbyServer.Msgs.Stage 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 = 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)) + { + var reward = StageCompletionReward.RewardData[req.StageId]; + + Dictionary current = new Dictionary(); + + // add all currencies that users has to current dictionary + foreach (var currentReward in user.Currency) + { + if (!current.ContainsKey(currentReward.Key)) + current.Add(currentReward.Key, 0); + + current[currentReward.Key] = (int)currentReward.Value; + } + + + // add currency reward to response + response.StageClearReward = new NetRewardData(); + foreach (var item in reward.Currency) + { + if (!current.ContainsKey((CurrencyType)item.Type)) + current.Add((CurrencyType)item.Type, 0); + var val = current[(CurrencyType)item.Type]; + response.StageClearReward.Currency.Add(new NetCurrencyData() { Type = item.Type, Value = item.Value, FinalValue = val + item.Value }); + } + + // add currency reward to user info + foreach (var item in reward.Currency) + { + if (!user.Currency.ContainsKey((CurrencyType)item.Type)) + user.Currency.Add((CurrencyType)item.Type, item.Value); + else + user.Currency[(CurrencyType)item.Type] += item.Value; + } + JsonDb.Save(); + } + else + { + Logger.Warn("TODO - Reward for stage ID " + req.StageId); + } } WriteData(response); diff --git a/nksrv/LobbyServer/Msgs/Team/GetTeamData.cs b/nksrv/LobbyServer/Msgs/Team/GetTeamData.cs index 8d437fb..5018fa6 100644 --- a/nksrv/LobbyServer/Msgs/Team/GetTeamData.cs +++ b/nksrv/LobbyServer/Msgs/Team/GetTeamData.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using static Google.Rpc.Context.AttributeContext.Types; namespace nksrv.LobbyServer.Msgs.Team { @@ -13,13 +14,31 @@ namespace nksrv.LobbyServer.Msgs.Team protected override async Task HandleAsync() { var req = await ReadData(); + var user = GetUser(); + var response = new ResGetTeamData(); - // TODO: assume that team data did not change - var resp = new ResGetTeamData(); - // resp.TypeTeams.Add(new NetUserTeamData() { }) - //resp.TypeTeams - WriteData(resp); + // NOTE: Keep this in sync with EnterLobbyServer code + if (user.Characters.Count > 0) + { + var team1 = new NetUserTeamData(); + team1.Type = 1; + team1.LastContentsTeamNumber = 1; + + var team1Sub = new NetTeamData(); + team1Sub.TeamNumber = 1; + + // TODO: Save this properly. Right now return first 5 characters as a squad. + for (int i = 1; i < 6; i++) + { + var character = user.Characters[i - 1]; + team1Sub.Slots.Add(new NetTeamSlot() { Slot = i, Value = character.Csn }); + } + team1.Teams.Add(team1Sub); + + response.TypeTeams.Add(team1); + } + WriteData(response); } } } diff --git a/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs b/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs index d1f6711..b2858ec 100644 --- a/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs +++ b/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs @@ -15,6 +15,8 @@ namespace nksrv.LobbyServer.Msgs.User var req = await ReadData(); var user = GetUser(); + // NOTE: Keep this in sync with GetUser code + var response = new ResEnterLobbyServer(); response.User = new NetUserData(); response.User.Lv = 1; diff --git a/nksrv/LobbyServer/Msgs/User/GetUser.cs b/nksrv/LobbyServer/Msgs/User/GetUser.cs index 72cf06a..19667bc 100644 --- a/nksrv/LobbyServer/Msgs/User/GetUser.cs +++ b/nksrv/LobbyServer/Msgs/User/GetUser.cs @@ -34,9 +34,17 @@ namespace nksrv.LobbyServer.Msgs.User { response.Currency.Add(new NetUserCurrencyData() { Type = (int)item.Key, Value = item.Value }); } + response.RepresentationTeam = user.TeamData; response.LastClearedNormalMainStageId = user.LastStageCleared; + // Restore completed tutorials. GroupID is the first 4 digits of the Table ID. + foreach (var item in user.ClearedTutorials) + { + var groupId = int.Parse(item.ToString().Substring(0, 4)); + int tutorialVersion = item == 1020101 ? 1 : 0; // TODO + response.User.Tutorials.Add(new NetTutorialData() { GroupId = groupId, LastClearedTid = item, LastClearedVersion = tutorialVersion }); + } WriteData(response); } } diff --git a/nksrv/LobbyServer/Msgs/User/Tutorial/SetTutorial.cs b/nksrv/LobbyServer/Msgs/User/Tutorial/SetTutorial.cs index b529eb2..44dfa6c 100644 --- a/nksrv/LobbyServer/Msgs/User/Tutorial/SetTutorial.cs +++ b/nksrv/LobbyServer/Msgs/User/Tutorial/SetTutorial.cs @@ -16,6 +16,7 @@ namespace nksrv.LobbyServer.Msgs.User.Tutorial var user = GetUser(); if (!user.ClearedTutorials.Contains(req.LastClearedTid)) user.ClearedTutorials.Add(req.LastClearedTid); + JsonDb.Save(); var response = new ResSetTutorial(); WriteData(response); diff --git a/nksrv/Protos/allmsgs.proto b/nksrv/Protos/allmsgs.proto index 1403b47..0df832d 100644 --- a/nksrv/Protos/allmsgs.proto +++ b/nksrv/Protos/allmsgs.proto @@ -1534,4 +1534,22 @@ message ReqSetWallpaper { } message ResSetWallpaper { +} + +message NetInvitation { + NetWholeUserData fromUser = 1; + int64 inviteTime = 2; + string partyId = 3; + int32 eventId = 4; +} + +enum ListInvitationError { + LIST_INVITATION_ERROR_SUCCESS = 0; + LIST_INVITATION_ERROR_NOT_PERIOD_EVENT = 1; +} + +message ReqListInvitation {} +message ResListInvitation { + ListInvitationError error = 1; + repeated NetInvitation invitationList = 2; } \ No newline at end of file diff --git a/nksrv/StaticInfo/StageCompletionReward.cs b/nksrv/StaticInfo/StageCompletionReward.cs new file mode 100644 index 0000000..785a8b5 --- /dev/null +++ b/nksrv/StaticInfo/StageCompletionReward.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace nksrv.StaticInfo +{ + public static class StageCompletionReward + { + // + public static readonly Dictionary RewardData = + new() { + { 6000001, new NetRewardData() { Currency = { + new NetCurrencyData() { Type = (int)CurrencyType.Gold, Value = 500 }, + new NetCurrencyData() { Type = (int)CurrencyType.CharacterExp , Value = 600 } + } } + }, + { 6000002, new NetRewardData() { Currency = { + new NetCurrencyData() { Type = (int)CurrencyType.Gold, Value = 500 }, + new NetCurrencyData() { Type = (int)CurrencyType.CharacterExp , Value = 600 } + } } + }, + { 6000003, new NetRewardData() { Currency = { + new NetCurrencyData() { Type = (int)CurrencyType.Gold, Value = 500 }, + new NetCurrencyData() { Type = (int)CurrencyType.CharacterExp , Value = 600 } + } } + }, + }; + } +} diff --git a/nksrv/Utils/JsonDb.cs b/nksrv/Utils/JsonDb.cs index c1eb028..9ad9f64 100644 --- a/nksrv/Utils/JsonDb.cs +++ b/nksrv/Utils/JsonDb.cs @@ -54,9 +54,7 @@ namespace nksrv.Utils public Dictionary MapJson = new(); public Dictionary Currency = new Dictionary() { { CurrencyType.ContentStamina, 2 }, - - { CurrencyType.Gold, 1 }, - { CurrencyType.CharPremiumTicket, 23422 } + { CurrencyType.CharPremiumTicket, 23422 } }; public List Characters = new();