From 63495aa5e756651393ee3b82ded97c6b5f5ee5ca Mon Sep 17 00:00:00 2001 From: Mikhail Tyukin Date: Wed, 25 Jun 2025 17:30:48 +0400 Subject: [PATCH] fix lost sector perfect reward --- .../LobbyServer/LobbyUser/EnterLobbyServer.cs | 2 ++ .../Lostsector/GetLostSectorData.cs | 33 ++++++++++--------- .../Lostsector/GetPerfectReward.cs | 32 ++++++++++++++++++ EpinelPS/LobbyServer/Lostsector/ObtainItem.cs | 1 + EpinelPS/LobbyServer/Lostsector/Open.cs | 11 +++++-- EpinelPS/LobbyServer/Lostsector/Play.cs | 7 +++- EpinelPS/Utils/RewardUtils.cs | 11 ++++--- 7 files changed, 74 insertions(+), 23 deletions(-) create mode 100644 EpinelPS/LobbyServer/Lostsector/GetPerfectReward.cs diff --git a/EpinelPS/LobbyServer/LobbyUser/EnterLobbyServer.cs b/EpinelPS/LobbyServer/LobbyUser/EnterLobbyServer.cs index 7d1702c..c2dab2b 100644 --- a/EpinelPS/LobbyServer/LobbyUser/EnterLobbyServer.cs +++ b/EpinelPS/LobbyServer/LobbyUser/EnterLobbyServer.cs @@ -76,6 +76,8 @@ namespace EpinelPS.LobbyServer.LobbyUser response.OwnedLobbyDecoBackgroundIdList.AddRange(user.LobbyDecoBackgroundList); + response.ClearLessons.AddRange(user.CompletedTacticAcademyLessons); + await WriteDataAsync(response); } } diff --git a/EpinelPS/LobbyServer/Lostsector/GetLostSectorData.cs b/EpinelPS/LobbyServer/Lostsector/GetLostSectorData.cs index 317e125..b418130 100644 --- a/EpinelPS/LobbyServer/Lostsector/GetLostSectorData.cs +++ b/EpinelPS/LobbyServer/Lostsector/GetLostSectorData.cs @@ -13,28 +13,29 @@ namespace EpinelPS.LobbyServer.Lostsector var response = new ResGetLostSectorData(); - foreach (var item in user.LostSectorData) - { - var val = item.Value; - response.LostSector.Add(new NetUserLostSectorData() - { - IsOpen = val.IsOpen, - SectorId= item.Key, - IsPlaying=val.IsPlaying, - CurrentClearStageCount = val.ClearedStages.Count, - RewardCount = val.ObtainedRewards, - IsFinalReward=val.RecievedFinalReward, - IsPerfectReward = val.CompletedPerfectly, - MaxClearStageCount = 0, // TODO - }); - } - foreach (var item in GameData.Instance.LostSector) { if (item.Value.open_condition_type == ContentOpenType.Stage && user.IsStageCompleted(item.Value.open_condition_value, true)) { response.ClearStages.Add(new NetFieldStageData() { StageId = item.Value.open_condition_value }); } + + if (user.LostSectorData.ContainsKey(item.Key)) + { + var map = GameData.Instance.MapData[item.Value.field_id]; + var val = user.LostSectorData[item.Key]; + response.LostSector.Add(new NetUserLostSectorData() + { + IsOpen = val.IsOpen, + SectorId = item.Key, + IsPlaying = val.IsPlaying, + CurrentClearStageCount = val.ClearedStages.Count, + RewardCount = val.ObtainedRewards, + IsFinalReward = val.RecievedFinalReward, + IsPerfectReward = val.CompletedPerfectly, + MaxClearStageCount = map.StageSpawner.Count + }); + } } await WriteDataAsync(response); diff --git a/EpinelPS/LobbyServer/Lostsector/GetPerfectReward.cs b/EpinelPS/LobbyServer/Lostsector/GetPerfectReward.cs new file mode 100644 index 0000000..bcfb5bd --- /dev/null +++ b/EpinelPS/LobbyServer/Lostsector/GetPerfectReward.cs @@ -0,0 +1,32 @@ +using EpinelPS.Data; +using EpinelPS.Database; +using EpinelPS.Utils; + +namespace EpinelPS.LobbyServer.Lostsector +{ + [PacketPath("/lostsector/perfectreward")] + public class GetPerfectReward : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var user = GetUser(); + + var response = new ResLostSectorPerfectReward(); + + if (user.LostSectorData.ContainsKey(req.SectorId)) + { + var lostSectorData = user.LostSectorData[req.SectorId]; + lostSectorData.CompletedPerfectly = true; + + var sectorInfo = GameData.Instance.LostSector[req.SectorId]; + + response.Reward = RewardUtils.RegisterRewardsForUser(user, sectorInfo.exploration_reward); + } + + JsonDb.Save(); + await WriteDataAsync(response); + } + } +} + diff --git a/EpinelPS/LobbyServer/Lostsector/ObtainItem.cs b/EpinelPS/LobbyServer/Lostsector/ObtainItem.cs index 927dc79..f71c697 100644 --- a/EpinelPS/LobbyServer/Lostsector/ObtainItem.cs +++ b/EpinelPS/LobbyServer/Lostsector/ObtainItem.cs @@ -31,6 +31,7 @@ namespace EpinelPS.LobbyServer.Lostsector var positionReward = GameData.Instance.FieldItems[rewardEntry.itemId]; response.Reward = RewardUtils.RegisterRewardsForUser(user, positionReward.type_value); + response.BoxCount = lostSectorUser.ObtainedRewards; if (positionReward.is_final_reward) { diff --git a/EpinelPS/LobbyServer/Lostsector/Open.cs b/EpinelPS/LobbyServer/Lostsector/Open.cs index 53d334a..8fadde0 100644 --- a/EpinelPS/LobbyServer/Lostsector/Open.cs +++ b/EpinelPS/LobbyServer/Lostsector/Open.cs @@ -14,15 +14,22 @@ namespace EpinelPS.LobbyServer.Lostsector var response = new ResOpenLostSector(); if (!user.LostSectorData.ContainsKey(req.SectorId)) - user.LostSectorData.Add(req.SectorId, new Database.LostSectorData() + user.LostSectorData.Add(req.SectorId, new LostSectorData() { IsOpen = true }); + var val = user.LostSectorData[req.SectorId]; response.Lostsector = new NetUserLostSectorData() { - IsOpen = true, + IsOpen = val.IsOpen, SectorId = req.SectorId, + IsPlaying = val.IsPlaying, + CurrentClearStageCount = val.ClearedStages.Count, + RewardCount = val.ObtainedRewards, + IsFinalReward = val.RecievedFinalReward, + IsPerfectReward = val.CompletedPerfectly, + MaxClearStageCount = 0, // TODO }; JsonDb.Save(); diff --git a/EpinelPS/LobbyServer/Lostsector/Play.cs b/EpinelPS/LobbyServer/Lostsector/Play.cs index a8c8266..86e67d2 100644 --- a/EpinelPS/LobbyServer/Lostsector/Play.cs +++ b/EpinelPS/LobbyServer/Lostsector/Play.cs @@ -26,7 +26,12 @@ namespace EpinelPS.LobbyServer.Lostsector { IsOpen = lostSectorData.IsOpen, SectorId = req.SectorId, - IsPlaying = lostSectorData.IsPlaying + IsPlaying = lostSectorData.IsPlaying, + CurrentClearStageCount = lostSectorData.ClearedStages.Count, + RewardCount = lostSectorData.ObtainedRewards, + IsFinalReward = lostSectorData.RecievedFinalReward, + IsPerfectReward = lostSectorData.CompletedPerfectly, + MaxClearStageCount = 0, // TODO }; JsonDb.Save(); diff --git a/EpinelPS/Utils/RewardUtils.cs b/EpinelPS/Utils/RewardUtils.cs index d2473e2..6db2a11 100644 --- a/EpinelPS/Utils/RewardUtils.cs +++ b/EpinelPS/Utils/RewardUtils.cs @@ -71,12 +71,15 @@ namespace EpinelPS.Utils foreach (var item in rewardData.rewards) { - if (item.reward_percent != 1000000) + if (!string.IsNullOrEmpty(item.reward_type)) { - Logging.WriteLine("WARNING: ignoring percent: " + item.reward_percent / 10000 + ", item will be added anyways", LogType.Warning); - } + if (item.reward_percent != 1000000) + { + Logging.WriteLine("WARNING: ignoring percent: " + item.reward_percent / 10000.0 + ", item will be added anyways", LogType.Warning); + } - AddSingleObject(user, ref ret, item.reward_id, item.reward_type, item.reward_value); + AddSingleObject(user, ref ret, item.reward_id, item.reward_type, item.reward_value); + } } return ret;