From 8467a5fce99abebd8cd43ab1ec0e14c3c21dc8ed Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sat, 27 Jul 2024 17:06:19 -0400 Subject: [PATCH] Implement level reset, bug fixes --- nksrv/Database/JsonDb.cs | 15 ++++ .../Msgs/Character/GetCharacterData.cs | 12 ++- nksrv/LobbyServer/Msgs/Character/LevelUp.cs | 2 +- .../LobbyServer/Msgs/Character/ResetLevel.cs | 82 +++++++++++++++++++ nksrv/LobbyServer/Msgs/Gacha/ExecGacha.cs | 18 ++-- nksrv/Protos/allmsgs.proto | 12 ++- 6 files changed, 131 insertions(+), 10 deletions(-) create mode 100644 nksrv/LobbyServer/Msgs/Character/ResetLevel.cs diff --git a/nksrv/Database/JsonDb.cs b/nksrv/Database/JsonDb.cs index 95578da..5de2d63 100644 --- a/nksrv/Database/JsonDb.cs +++ b/nksrv/Database/JsonDb.cs @@ -139,7 +139,17 @@ namespace nksrv.Database return num; } + public int GenerateUniqueCharacterId() + { + var num = Rng.RandomId(); + while (Characters.Any(x => x.Csn == num)) + { + num = Rng.RandomId(); + } + + return num; + } public bool IsStageCompleted(int id, bool isNorm) { foreach (var item in FieldInfoNew) @@ -195,6 +205,11 @@ namespace nksrv.Database else return false; } } + + public bool HasCharacter(int c) + { + return Characters.Any(x => x.Tid == c); + } } public class CoreInfo { diff --git a/nksrv/LobbyServer/Msgs/Character/GetCharacterData.cs b/nksrv/LobbyServer/Msgs/Character/GetCharacterData.cs index 0e8b978..8dcdf7d 100644 --- a/nksrv/LobbyServer/Msgs/Character/GetCharacterData.cs +++ b/nksrv/LobbyServer/Msgs/Character/GetCharacterData.cs @@ -11,9 +11,17 @@ namespace nksrv.LobbyServer.Msgs.Character var user = GetUser(); var response = new ResGetCharacterData(); - foreach (var item in user.Characters) + // TODO: When Squad view opens in the game, or this request is sent, all character levels reset to 1 as well as cusume IDs + //foreach (var item in user.Characters) + //{ + // response.Character.Add(new NetUserCharacterData() { Default = new() { Csn = item.Csn, Skill1Lv = item.Skill1Lvl, Skill2Lv = item.Skill2Lvl, CostumeId = item.CostumeId, Lv = item.Level, Grade = item.Grade, Tid = item.Tid, UltiSkillLv = item.UltimateLevel }, IsSynchro = false, Artifact = 0 }); + //} + + var highestLevelCharacters = user.Characters.OrderByDescending(x => x.Level).Take(5).ToList(); + + foreach (var c in highestLevelCharacters) { - response.Character.Add(new NetUserCharacterData() { Default = new() { Csn = item.Csn, Skill1Lv = item.Skill1Lvl, Skill2Lv = item.Skill2Lvl, CostumeId = item.CostumeId, Lv = item.Level, Grade = item.Grade, Tid = item.Tid, UltiSkillLv = item.UltimateLevel } }); + response.SynchroStandardCharacters.Add(c.Csn); } await WriteDataAsync(response); diff --git a/nksrv/LobbyServer/Msgs/Character/LevelUp.cs b/nksrv/LobbyServer/Msgs/Character/LevelUp.cs index bcbeaa4..5a121b2 100644 --- a/nksrv/LobbyServer/Msgs/Character/LevelUp.cs +++ b/nksrv/LobbyServer/Msgs/Character/LevelUp.cs @@ -63,7 +63,7 @@ namespace nksrv.LobbyServer.Msgs.Character foreach (var c in highestLevelCharacters) { - response.SynchroStandardCharacters.Add(c.Tid); + response.SynchroStandardCharacters.Add(c.Csn); } foreach (var currency in user.Currency) diff --git a/nksrv/LobbyServer/Msgs/Character/ResetLevel.cs b/nksrv/LobbyServer/Msgs/Character/ResetLevel.cs new file mode 100644 index 0000000..e268bd6 --- /dev/null +++ b/nksrv/LobbyServer/Msgs/Character/ResetLevel.cs @@ -0,0 +1,82 @@ +using nksrv.Database; +using nksrv.StaticInfo; +using nksrv.Utils; +using Swan.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace nksrv.LobbyServer.Msgs.Character +{ + [PacketPath("/character/growreset")] + public class ResetLevel : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var user = GetUser(); + var response = new ResCharacterGrowReset(); + var data = StaticDataParser.Instance.GetCharacterLevelUpData(); + + foreach (var item in user.Characters.ToArray()) + { + if (item.Csn == req.Csn) + { + if (item.Level == 1) + { + Logger.Warn("Character level is already 1 - cannot reset"); + return; + } + + int requiredCredit = 0; + int requiredBattleData = 0; + int requiredCoreDust = 0; + for (int i = 1; i < item.Level; i++) + { + var levelUpData = data[i]; + requiredCredit += levelUpData.gold; + requiredBattleData += levelUpData.character_exp; + requiredCoreDust += levelUpData.character_exp2; + } + + user.AddCurrency(CurrencyType.Gold, requiredCredit); + user.AddCurrency(CurrencyType.CharacterExp, requiredBattleData); + user.AddCurrency(CurrencyType.CharacterExp2, requiredCoreDust); + item.Level = 1; + + response.Character = new() + { + CostumeId = item.CostumeId, + Csn = item.Csn, + Lv = item.Level, + Skill1Lv = item.Skill1Lvl, + Skill2Lv = item.Skill2Lvl, + UltiSkillLv = item.UltimateLevel, + Grade = item.Grade, + Tid = item.Tid + }; + var highestLevelCharacters = user.Characters.OrderByDescending(x => x.Level).Take(5).ToList(); + + response.SynchroLv = highestLevelCharacters.Last().Level; + + foreach (var c in highestLevelCharacters) + { + response.SynchroStandardCharacters.Add(c.Csn); + } + + foreach (var currency in user.Currency) + { + response.Currencies.Add(new NetUserCurrencyData() { Type = (int)currency.Key, Value = currency.Value }); + } + + break; + } + } + JsonDb.Save(); + + await WriteDataAsync(response); + } + } +} diff --git a/nksrv/LobbyServer/Msgs/Gacha/ExecGacha.cs b/nksrv/LobbyServer/Msgs/Gacha/ExecGacha.cs index 7e39b54..0357162 100644 --- a/nksrv/LobbyServer/Msgs/Gacha/ExecGacha.cs +++ b/nksrv/LobbyServer/Msgs/Gacha/ExecGacha.cs @@ -19,17 +19,23 @@ namespace nksrv.LobbyServer.Msgs.Gacha // TODO implement reward response.Reward = new NetRewardData(); - if (user.GachaTutorialPlayCount == 0) + foreach (var c in StaticDataParser.Instance.GetAllCharacterTids()) { - foreach (var c in StaticDataParser.Instance.GetAllCharacterTids()) + if (!user.HasCharacter(c)) { - response.Gacha.Add(new NetGachaEntityData() { Corporation = 1, PieceCount = 1, CurrencyValue = 5, Sn = c, Tid = c, Type = 1 }); + var id = user.GenerateUniqueCharacterId(); + response.Gacha.Add(new NetGachaEntityData() { Corporation = 1, PieceCount = 1, CurrencyValue = 5, Sn = id, Tid = c, Type = 1 }); - response.Characters.Add(new NetUserCharacterDefaultData() { CostumeId = 0, Csn = c, Grade = 0, Lv = 1, Skill1Lv = 1, Skill2Lv = 1, Tid = c, UltiSkillLv = 1 }); - user.Characters.Add(new Database.Character() { CostumeId = 0, Csn = c, Grade = 0, Level = 1, Skill1Lvl = 1, Skill2Lvl = 1, Tid = c, UltimateLevel = 1 }); + response.Characters.Add(new NetUserCharacterDefaultData() { CostumeId = 0, Csn = id, Grade = 0, Lv = 1, Skill1Lv = 1, Skill2Lv = 1, Tid = c, UltiSkillLv = 1 }); + + user.Characters.Add(new Database.Character() { CostumeId = 0, Csn = id, Grade = 0, Level = 1, Skill1Lvl = 1, Skill2Lvl = 1, Tid = c, UltimateLevel = 1 }); + } + else + { + // TODO add spare body } - user.GachaTutorialPlayCount++; } + user.GachaTutorialPlayCount++; JsonDb.Save(); diff --git a/nksrv/Protos/allmsgs.proto b/nksrv/Protos/allmsgs.proto index 86b18f1..6dbe2d9 100644 --- a/nksrv/Protos/allmsgs.proto +++ b/nksrv/Protos/allmsgs.proto @@ -230,7 +230,7 @@ message NetUserCharacterDefaultData { int32 dispatchTid = 6; int32 costumeId = 7; int32 ultiSkillLv = 8; - int32 skill1Lv = 9; + int32 skill1Lv = 9; int32 skill2Lv = 10; } @@ -2264,4 +2264,14 @@ message ReqObtainMainQuestReward { } message ResObtainMainQuestReward { NetRewardData Reward = 2; +} + +message ReqCharacterGrowReset { + int64 Csn = 2; +} +message ResCharacterGrowReset { + NetUserCharacterDefaultData Character = 2; + repeated NetUserCurrencyData Currencies = 3; + int32 SynchroLv = 4; + repeated int64 SynchroStandardCharacters = 5; } \ No newline at end of file