diff --git a/EpinelPS/Database/DatabaseConnection.cs b/EpinelPS/Database/DatabaseConnection.cs new file mode 100644 index 0000000..93942e4 --- /dev/null +++ b/EpinelPS/Database/DatabaseConnection.cs @@ -0,0 +1,6 @@ +namespace EpinelPS.Database; + +public class DatabaseConnection +{ + +} \ No newline at end of file diff --git a/EpinelPS/Database/JsonDb.cs b/EpinelPS/Database/JsonDb.cs index 1a356b7..dfe02af 100644 --- a/EpinelPS/Database/JsonDb.cs +++ b/EpinelPS/Database/JsonDb.cs @@ -9,643 +9,6 @@ using Paseto.Builder; namespace EpinelPS.Database { - public class AccessToken - { - public string Token = ""; - public long ExpirationTime; - public ulong UserID; - } - public class FieldInfo - { - public List CompletedStages = []; - public List CompletedObjects = []; - } - - public class FieldInfoNew - { - public List CompletedStages = []; - public List CompletedObjects = []; - public bool BossEntered = false; - } - - public class Character - { - public int Csn = 0; - public int Tid = 0; - public int CostumeId = 0; - public int Level = 1; - public int UltimateLevel = 1; - public int Skill1Lvl = 1; - public int Skill2Lvl = 1; - public int Grade = 0; - } - public class MainQuestData - { - public int TableId = 0; - public bool IsReceieved = false; - } - - public class UserPointData - { - public int UserLevel = 1; - public int ExperiencePoint = 0; - } - - public class ItemData - { - public int ItemType; - public long Csn; - public int Count; - public int Level; - public int Exp; - public int Position; - public int Corp; - public long Isn; - } - public class EventData - { - public List CompletedScenarios = []; - public int Diff = 0; // Default value for Diff - public int LastStage = 0; // Default value for LastStage - } - - public class SynchroSlot - { - /// - /// Index of slot, 1 based - /// - public int Slot; - /// - /// Character CSN - /// - public long CharacterSerialNumber; - /// - /// Time when slot cooldown expires - /// - public long AvailableAt; - } - public class RecycleRoomResearchProgress - { - public int Level = 1; - public int Exp; - public int Attack; - public int Defense; - public int Hp; - } - public class SimroomData - { - public int CurrentDifficulty; - public int CurrentChapter; - public bool Entered = false; - } - public class ResetableData - { - public int WipeoutCount = 0; - public bool ClearedSimulationRoom = false; - public int InterceptionTickets = 3; - public List CompletedDailyMissions = []; - public int DailyMissionPoints; - public SimroomData SimRoomData = new(); - } - public class WeeklyResetableData - { - public List CompletedWeeklyMissions = []; - public int WeeklyMissionPoints; - } - public class OutpostBuffs - { - public List CreditPercentages = []; - public List CoreDustPercentages = []; - public List BattleDataPercentages = []; - public List UserExpPercentages = []; - - public List GetPercentages(CurrencyType currency) - { - if (currency == CurrencyType.Gold) - return CreditPercentages; - else if (currency == CurrencyType.UserExp) - return UserExpPercentages; - else if (currency == CurrencyType.CharacterExp) - return BattleDataPercentages; - else if (currency == CurrencyType.CharacterExp2) - return CoreDustPercentages; - - throw new InvalidOperationException(); - } - public int GetTotalPercentages(CurrencyType currency) - { - int result = 0; - var numbs = GetPercentages(currency); - foreach (var item in numbs) - { - result += item; - } - - return result; - } - } - - public class JukeBoxSetting - { - public NetJukeboxLocation Location; - public NetJukeboxBgmType Type; - public int TableId; - } - - public class UnlockData - { - public bool ButtonAnimationPlayed = false; - public bool PopupAnimationPlayed = false; - - public UnlockData() { } - public UnlockData(bool button, bool popup) - { - ButtonAnimationPlayed = button; - PopupAnimationPlayed = popup; - } - } - - public class MogMinigameInfo - { - public List CompletedScenarios = []; - } - public class Badge - { - public string Location = ""; - public long Seq; - public BadgeContents BadgeContent; - public string BadgeGuid = ""; - - public Badge() { } - public Badge(NetBadge badge) - { - Location = badge.Location; - Seq = badge.Seq; - BadgeContent = badge.BadgeContent; - BadgeGuid = new Guid([.. badge.BadgeGuid]).ToString(); - } - - public NetBadge ToNet() - { - return new NetBadge() - { - BadgeContent = BadgeContent, - BadgeGuid = ByteString.CopyFrom(new Guid(BadgeGuid).ToByteArray()), - Location = Location, - Seq = Seq - }; - } - } - - public class Trigger - { - public TriggerType Type; - public long Id; - public long CreatedAt; - public int ConditionId; - public int Value; - - public NetTrigger ToNet() - { - return new() - { - ConditionId = ConditionId, - CreatedAt = CreatedAt, - Seq = Id, - Trigger = (int)Type, - UserValue = Value - }; - } - } - public class ConversationChoice - { - - } - public class ConversationMessage - { - public string ConversationId { get; set; } = ""; - public long CreatedAt { get; set; } - public ulong Seq { get; set; } - public string Id { get; set; } = ""; - public int State { get; set; } - } - public class LostSectorData - { - public bool IsOpen { get; set; } - public bool IsPlaying { get; set; } - public string Json { get; set; } = ""; - public Dictionary Objects { get; set; } = []; - public Dictionary ClearedStages { get; set; } = []; - public List TeamPositions { get; set; } = []; - public int ObtainedRewards { get; set; } = 0; - public bool RecievedFinalReward { get; set; } - public bool CompletedPerfectly { get; set; } - } - public class User - { - // User info - public string? Username; - public string? Password; - public string? PlayerName; - public ulong ID; - public long RegisterTime; - public int LastNormalStageCleared; - public int LastHardStageCleared; - public string? Nickname; - public int ProfileIconId = 39900; - public bool ProfileIconIsPrism = false; - public int ProfileFrame = 25; - public bool IsAdmin = false; - public bool sickpulls = false; - public bool IsBanned = false; - public int TitleId = 1; - public DateTime BanStart; - public DateTime BanEnd; - public int BanId = 0; - public DateTime LastReset = DateTime.MinValue; - - // Game data - public List CompletedScenarios = []; - public Dictionary FieldInfo = []; // here for backwards compatibility - - public Dictionary FieldInfoNew = []; - public Dictionary MapJson = []; - public Dictionary Currency = new() { - { CurrencyType.ContentStamina, 2 } - }; - public List SynchroSlots = []; - public bool SynchroDeviceUpgraded = false; - public int SynchroDeviceLevel = 200; - public Dictionary ResearchProgress = []; - - public ResetableData ResetableData = new(); - public WeeklyResetableData WeeklyResetableData = new(); - public List Items = []; - public List Characters = []; - public long[] RepresentationTeamDataNew = []; - public Dictionary ClearedTutorialData = []; - - public NetWallpaperData[] WallpaperList = []; - public NetWallpaperBackground[] WallpaperBackground = []; - public NetWallpaperJukeboxFavorite[] WallpaperFavoriteList = []; - public NetWallpaperPlaylist[] WallpaperPlaylistList = []; - public NetWallpaperJukebox[] WallpaperJukeboxList = []; - public List LobbyDecoBackgroundList = []; - - - public Dictionary UserTeams = []; - public Dictionary MainQuestData = []; - public Dictionary SubQuestData = []; - public int InfraCoreExp = 0; - public int InfraCoreLvl = 1; - public UserPointData userPointData = new(); - public DateTime LastLogin = DateTime.UtcNow; - public DateTime BattleTime = DateTime.UtcNow; - - public NetOutpostBattleLevel OutpostBattleLevel = new() { Level = 1 }; - public int GachaTutorialPlayCount = 0; - public List CompletedTacticAcademyLessons = []; - public List CompletedSideStoryStages = []; - - public List Memorial = []; - public List JukeboxBgm = []; - - public Dictionary TowerProgress = []; - - public JukeBoxSetting LobbyMusic = new() { Location = NetJukeboxLocation.Lobby, TableId = 2, Type = NetJukeboxBgmType.JukeboxTableId }; - public JukeBoxSetting CommanderMusic = new() { Location = NetJukeboxLocation.CommanderRoom, TableId = 5, Type = NetJukeboxBgmType.JukeboxTableId }; - public OutpostBuffs OutpostBuffs = new(); - public Dictionary ContentsOpenUnlocked = []; - - public List StageClearHistorys = []; - - public List Badges = []; - - public List BondInfo = []; - public List Triggers = []; - public int LastTriggerId = 1; - public List CompletedAchievements = []; - public List MessengerData = []; - public ulong LastMessageId = 1; - public long LastBadgeSeq = 1; - public Dictionary LostSectorData = []; - - // Event data - public Dictionary EventInfo = []; - public MogMinigameInfo MogInfo = new(); - - public Trigger AddTrigger(TriggerType type, int value, int conditionId = 0) - { - Trigger t = new() - { - Id = LastTriggerId++, - Type = type, - ConditionId = conditionId, - CreatedAt = DateTime.UtcNow.AddHours(9).Ticks, - Value = value - }; - - Triggers.Add(t); - - return t; - } - - public Badge AddBadge(BadgeContents type, string location) - { - // generate unique badge SEQ - - var badge = new Badge() - { - BadgeContent = type, - Location = location, - BadgeGuid = Guid.NewGuid().ToString(), - Seq = LastBadgeSeq++ - }; - - Badges.Add(badge); - - return badge; - } - - - public void SetQuest(int tid, bool recievedReward) - { - if (!MainQuestData.TryAdd(tid, recievedReward)) - { - MainQuestData[tid] = recievedReward; - return; - } - } - - public void SetSubQuest(int tid, bool recievedReward) - { - if (!SubQuestData.TryAdd(tid, recievedReward)) - { - SubQuestData[tid] = recievedReward; - return; - } - } - - public int GenerateUniqueItemId() - { - var num = Rng.RandomId(); - - while (Items.Any(x => x.Isn == num)) - { - num = Rng.RandomId(); - } - - 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) - { - foreach (var item in FieldInfoNew) - { - if (item.Value.CompletedStages.Contains(id)) - { - return true; - } - } - - return false; - } - - public long GetCurrencyVal(CurrencyType type) - { - if (Currency.TryGetValue(type, out long value)) - return value; - else - { - Currency.Add(type, 0); - return 0; - } - } - public void AddCurrency(CurrencyType type, long val) - { - if (!Currency.TryAdd(type, val)) Currency[type] += val; - } - public bool SubtractCurrency(CurrencyType type, long val) - { - if (Currency.ContainsKey(type)) Currency[type] -= val; - else return false; - - if (Currency[type] < 0) - { - Currency[type] += val; - return false; - } - return true; - } - public bool CanSubtractCurrency(CurrencyType type, long val) - { - if (Currency.ContainsKey(type)) - { - if (Currency[type] >= val) return true; - else return false; - } - else - { - if (val == 0) return true; - else return false; - } - } - - public bool HasCharacter(int c) - { - // Step 1: Get the 'name_code' of the input character with Tid 'c' - if (GameData.Instance.CharacterTable.TryGetValue(c, out var inputCharacterRecord)) - { - int targetNameCode = inputCharacterRecord.name_code; - // Step 2: Find all character IDs in 'characterTable' that have the same 'name_code' - var matchingCharacterIds = GameData.Instance.CharacterTable.Where(kvp => kvp.Value.name_code == targetNameCode).Select(kvp => kvp.Key).ToHashSet(); - - // Step 3: Check if any of your owned characters have a 'Tid' in the set of matching IDs - return Characters.Any(ownedCharacter => matchingCharacterIds.Contains(ownedCharacter.Tid)); - - } - else - { // The character with Tid 'c' does not exist in 'characterTable' - return false; - } - } - - public Character? GetCharacter(int c) - { - // Step 1: Get the 'name_code' of the input character with Tid 'c' - if (GameData.Instance.CharacterTable.TryGetValue(c, out var inputCharacterRecord)) - { - int targetNameCode = inputCharacterRecord.name_code; - // Step 2: Find all character IDs in 'characterTable' that have the same 'name_code' - var matchingCharacterIds = GameData.Instance.CharacterTable.Where(kvp => kvp.Value.name_code == targetNameCode).Select(kvp => kvp.Key).ToHashSet(); - - // Step 3: Check if any of your owned characters have a 'Tid' in the set of matching IDs - return Characters.Where(ownedCharacter => matchingCharacterIds.Contains(ownedCharacter.Tid)).FirstOrDefault(); - - } - else - { // The character with Tid 'c' does not exist in 'characterTable' - return null; - } - } - - public Character? GetCharacterBySerialNumber(long value) - { - if (value == 0) return null; - return Characters.Where(x => x.Csn == value).FirstOrDefault(); - } - - internal bool GetSynchro(long csn) - { - return SynchroSlots.Where(x => x.CharacterSerialNumber == csn).Any(); - } - internal int GetCharacterLevel(int csn) - { - var c = GetCharacterBySerialNumber(csn) ?? throw new Exception("failed to lookup character"); - return GetCharacterLevel(csn, c.Level); - } - internal int GetCharacterLevel(int csn, int characterLevel) - { - foreach (var item in SynchroSlots) - { - if (item.CharacterSerialNumber == csn) - { - return GetSynchroLevel(); - } - } - return characterLevel; - } - internal int GetSynchroLevel() - { - if (SynchroDeviceUpgraded) - return SynchroDeviceLevel; - var highestLevelCharacters = Characters.OrderByDescending(x => x.Level).Take(5).ToList(); - - - if (highestLevelCharacters.Count > 0) - { - return highestLevelCharacters.Last().Level; - } - else - { - return 1; - } - } - - /// - /// Removes the specified amount of items by their ID. Returns the amount of items removed. - /// - /// - /// - /// - public int RemoveItemBySerialNumber(long isn, int count) - { - int removed = 0; - foreach (var item in Items.ToList()) - { - if (count == 0) - break; - - if (item.Isn == isn) - { - removed++; - item.Count -= count; - - if (item.Count < 0) - { - item.Count = 0; - } - } - } - - return removed; - } - - public NetMessage CreateMessage(MessengerDialogRecord r, int state = 0) - { - var msg = new NetMessage() - { - ConversationId = r.conversation_id, - CreatedAt = DateTime.UtcNow.Ticks, - MessageId = r.id, - Seq = (long)LastMessageId++, - State = state - }; - MessengerData.Add(msg); - return msg; - } - - public NetMessage CreateMessage(string conversationId, string messageId, int state = 0) - { - var msg = new NetMessage() - { - ConversationId = conversationId, - CreatedAt = DateTime.UtcNow.Ticks, - MessageId = messageId, - Seq = (long)LastMessageId++, - State = state - }; - MessengerData.Add(msg); - return msg; - } - - private bool ShouldResetUser() - { - var nowLocal = DateTime.UtcNow; - - // Compute the last reset threshold (most recent 2 PM before or at nowLocal) - DateTime todayResetTime = new( - nowLocal.Year, - nowLocal.Month, - nowLocal.Day, - JsonDb.Instance.ResetHourUtcTime, 0, 0 - ); - - if (nowLocal < todayResetTime) - { - todayResetTime = todayResetTime.AddDays(-1); - } - - // If user's last reset was before the last scheduled 2 PM, they need reset - return LastReset < todayResetTime; - } - - public void ResetDataIfNeeded() - { - if (!ShouldResetUser()) return; - - Logging.WriteLine("Resetting user...", LogType.Warning); - - LastReset = DateTime.UtcNow; - ResetableData = new(); - JsonDb.Save(); - } - } - public class CoreInfo - { - public int DbVersion = 3; - public List Users = []; - - public List LauncherAccessTokens = []; - public Dictionary AdminAuthTokens = []; - - public byte[] LauncherTokenKey = []; - public byte[] EncryptionTokenKey = []; - public LogType LogLevel = LogType.Debug; - - public int MaxInterceptionCount = 3; - public int ResetHourUtcTime = 20; - } internal class JsonDb { public static CoreInfo Instance { get; internal set; } @@ -669,110 +32,12 @@ namespace EpinelPS.Database if (j != null) { Instance = j; - - if (Instance.DbVersion == 0) + + if (Instance.DbVersion != 5) { - Instance.DbVersion = 1; - // In older versions, field info key used chapter number, but now difficultly is appened. - Console.WriteLine("Starting database update..."); - - foreach (var user in Instance.Users) - { - foreach (var f in user.FieldInfoNew.ToList()) - { - var isNumeric = int.TryParse(f.Key, out int n); - if (isNumeric) - { - var val = f.Value; - user.FieldInfoNew.Remove(f.Key); - user.FieldInfoNew.Add(n + "_Normal", val); - } - } - } - Console.WriteLine("Database update completed"); - } - if (Instance.DbVersion == 1) - { - Console.WriteLine("Starting database update..."); - // there was a bug where equipment position was not saved, so remove all items from each characters - Instance.DbVersion = 2; - foreach (var user in Instance.Users) - { - foreach (var f in user.Items.ToList()) - { - f.Csn = 0; - } - } - Console.WriteLine("Database update completed"); - } - if (Instance.DbVersion == 2) - { - Console.WriteLine("Starting database update..."); - // I used to use a class for FieldInfo cleared stages, but now int list is used - Instance.DbVersion = 3; - foreach (var user in Instance.Users) - { - foreach (var f in user.FieldInfo) - { - var newField = new FieldInfoNew(); - foreach (var stage in f.Value.CompletedStages) - { - newField.CompletedStages.Add(stage.StageId); - } - user.FieldInfoNew.Add(f.Key, newField); - } - user.FieldInfo.Clear(); - } - Console.WriteLine("Database update completed"); - } - if (Instance.DbVersion == 3) - { - Console.WriteLine("Starting database update..."); - Instance.DbVersion = 4; - foreach (var user in Instance.Users) - { - user.RepresentationTeamDataNew = new long[5]; - } - Console.WriteLine("Database update completed"); - } - if (Instance.DbVersion == 4) - { - Console.WriteLine("Starting database update..."); - Instance.DbVersion = 5; - // FieldInfoNew uses MapId instead of ChapterNum_ChapterDifficulty format - foreach (var user in Instance.Users) - { - Dictionary info = []; - foreach (var item in user.FieldInfoNew) - { - if (item.Key.EndsWith("_Normal") || item.Key.EndsWith("_Hard")) - { - var newKey = GameData.Instance.GetMapIdFromDBFieldName(item.Key); - if (newKey != null) - { - if (!info.ContainsKey(newKey)) - { - info.Add(newKey, item.Value); - } - else - { - // overwrite old data - info[newKey] = item.Value; - } - } - else - Console.WriteLine("Unknown chapter/difficulty: " + item.Value + ", discarding"); - } - else - { - if (!info.ContainsKey(item.Key)) - info.Add(item.Key, item.Value); - } - } - - user.FieldInfoNew = info; - } - Console.WriteLine("Database update completed"); + Logging.Warn("!!!WARNING!!!"); + Logging.Warn("Database version is extremely out of date."); + Logging.Warn("It is recommended to delete db.json to avoid issues."); } if (Instance.LauncherTokenKey.Length == 0) @@ -888,6 +153,5 @@ namespace EpinelPS.Database throw new Exception($"User not found"); } } - } } diff --git a/EpinelPS/EpinelPS.csproj b/EpinelPS/EpinelPS.csproj index 34227d2..19a890f 100644 --- a/EpinelPS/EpinelPS.csproj +++ b/EpinelPS/EpinelPS.csproj @@ -13,7 +13,7 @@ 0.135.4.3 false true - + enable @@ -26,7 +26,6 @@ - diff --git a/EpinelPS/Global.cs b/EpinelPS/Global.cs new file mode 100644 index 0000000..9e890e0 --- /dev/null +++ b/EpinelPS/Global.cs @@ -0,0 +1 @@ +global using EpinelPS.Models; \ No newline at end of file diff --git a/EpinelPS/LobbyServer/Archive/CompleteArchiveScenario.cs b/EpinelPS/LobbyServer/Archive/CompleteArchiveScenario.cs index f094bab..9dbc17d 100644 --- a/EpinelPS/LobbyServer/Archive/CompleteArchiveScenario.cs +++ b/EpinelPS/LobbyServer/Archive/CompleteArchiveScenario.cs @@ -1,6 +1,5 @@ using EpinelPS.Utils; using EpinelPS.Database; -using EpinelPS.Data; // Ensure this namespace is included namespace EpinelPS.LobbyServer.Archive { diff --git a/EpinelPS/LobbyServer/Arena/GetArena.cs b/EpinelPS/LobbyServer/Arena/GetArena.cs index e23f0a9..973fbcf 100644 --- a/EpinelPS/LobbyServer/Arena/GetArena.cs +++ b/EpinelPS/LobbyServer/Arena/GetArena.cs @@ -9,7 +9,7 @@ namespace EpinelPS.LobbyServer.Arena protected override async Task HandleAsync() { ReqGetArena req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetArena response = new() { diff --git a/EpinelPS/LobbyServer/Arena/GetSpecialArena.cs b/EpinelPS/LobbyServer/Arena/GetSpecialArena.cs index f92275c..fa014b9 100644 --- a/EpinelPS/LobbyServer/Arena/GetSpecialArena.cs +++ b/EpinelPS/LobbyServer/Arena/GetSpecialArena.cs @@ -9,7 +9,7 @@ namespace EpinelPS.LobbyServer.Arena protected override async Task HandleAsync() { ReqGetSpecialArena req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetSpecialArena response = new() { diff --git a/EpinelPS/LobbyServer/Badge/SyncBadge.cs b/EpinelPS/LobbyServer/Badge/SyncBadge.cs index 989cdc6..f81f707 100644 --- a/EpinelPS/LobbyServer/Badge/SyncBadge.cs +++ b/EpinelPS/LobbyServer/Badge/SyncBadge.cs @@ -9,11 +9,11 @@ namespace EpinelPS.LobbyServer.Badge protected override async Task HandleAsync() { ReqSyncBadge req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResSyncBadge response = new(); - foreach (Database.Badge item in user.Badges) + foreach (BadgeModel item in user.Badges) { response.BadgeList.Add(item.ToNet()); } diff --git a/EpinelPS/LobbyServer/Campaign/GetCampaignField.cs b/EpinelPS/LobbyServer/Campaign/GetCampaignField.cs index ba8231e..041177a 100644 --- a/EpinelPS/LobbyServer/Campaign/GetCampaignField.cs +++ b/EpinelPS/LobbyServer/Campaign/GetCampaignField.cs @@ -10,7 +10,7 @@ namespace EpinelPS.LobbyServer.Campaign protected override async Task HandleAsync() { ReqGetCampaignFieldData req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); Console.WriteLine("Map ID: " + req.MapId); diff --git a/EpinelPS/LobbyServer/Campaign/SaveField.cs b/EpinelPS/LobbyServer/Campaign/SaveField.cs index 1371485..6870534 100644 --- a/EpinelPS/LobbyServer/Campaign/SaveField.cs +++ b/EpinelPS/LobbyServer/Campaign/SaveField.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Campaign protected override async Task HandleAsync() { ReqSaveCampaignField req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResSaveCampaignField response = new(); diff --git a/EpinelPS/LobbyServer/Character/ChangeSynchroDevice.cs b/EpinelPS/LobbyServer/Character/ChangeSynchroDevice.cs index 3bca448..56df637 100644 --- a/EpinelPS/LobbyServer/Character/ChangeSynchroDevice.cs +++ b/EpinelPS/LobbyServer/Character/ChangeSynchroDevice.cs @@ -18,10 +18,10 @@ namespace EpinelPS.LobbyServer.Character ResSynchroChange response = new(); - List highestLevelCharacters = [.. user.Characters.OrderByDescending(x => x.Level).Take(5)]; + List highestLevelCharacters = [.. user.Characters.OrderByDescending(x => x.Level).Take(5)]; int slot = 1; - foreach (Database.Character? item in highestLevelCharacters) + foreach (CharacterModel? item in highestLevelCharacters) { if (item.Level != 200) { diff --git a/EpinelPS/LobbyServer/Character/Counsel/Check.cs b/EpinelPS/LobbyServer/Character/Counsel/Check.cs index 536c2d9..d010309 100644 --- a/EpinelPS/LobbyServer/Character/Counsel/Check.cs +++ b/EpinelPS/LobbyServer/Character/Counsel/Check.cs @@ -8,7 +8,7 @@ public class CheckCharacterCounsel : LobbyMsgHandler protected override async Task HandleAsync() { ReqCounseledBefore req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResCounseledBefore response = new(); diff --git a/EpinelPS/LobbyServer/Character/DoLimitBreak.cs b/EpinelPS/LobbyServer/Character/DoLimitBreak.cs index 3c6982d..4cefc21 100644 --- a/EpinelPS/LobbyServer/Character/DoLimitBreak.cs +++ b/EpinelPS/LobbyServer/Character/DoLimitBreak.cs @@ -17,7 +17,7 @@ namespace EpinelPS.LobbyServer.Character // Get all character data from the game's character table List fullchardata = [.. GameData.Instance.CharacterTable.Values]; - Database.Character targetCharacter = user.GetCharacterBySerialNumber(req.Csn) ?? throw new NullReferenceException(); + CharacterModel targetCharacter = user.GetCharacterBySerialNumber(req.Csn) ?? throw new NullReferenceException(); // Find the element with the current csn from the request CharacterRecord currentCharacter = fullchardata.FirstOrDefault(c => c.id == targetCharacter.Tid) ?? throw new NullReferenceException(); diff --git a/EpinelPS/LobbyServer/Character/GetCharacterAttractiveList.cs b/EpinelPS/LobbyServer/Character/GetCharacterAttractiveList.cs index ee8a58a..7789a99 100644 --- a/EpinelPS/LobbyServer/Character/GetCharacterAttractiveList.cs +++ b/EpinelPS/LobbyServer/Character/GetCharacterAttractiveList.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Character protected override async Task HandleAsync() { ReqGetAttractiveList req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetAttractiveList response = new() { diff --git a/EpinelPS/LobbyServer/Character/GetCharacterData.cs b/EpinelPS/LobbyServer/Character/GetCharacterData.cs index 2f39dba..c2eb4e5 100644 --- a/EpinelPS/LobbyServer/Character/GetCharacterData.cs +++ b/EpinelPS/LobbyServer/Character/GetCharacterData.cs @@ -8,17 +8,17 @@ namespace EpinelPS.LobbyServer.Character protected override async Task HandleAsync() { ReqGetCharacterData req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetCharacterData response = new(); - foreach (Database.Character item in user.Characters) + foreach (CharacterModel item in user.Characters) { response.Character.Add(new NetUserCharacterData() { Default = new() { Csn = item.Csn, Skill1Lv = item.Skill1Lvl, Skill2Lv = item.Skill2Lvl, CostumeId = item.CostumeId, Lv = user.GetCharacterLevel(item.Csn, item.Level), Grade = item.Grade, Tid = item.Tid, UltiSkillLv = item.UltimateLevel }, IsSynchro = user.GetSynchro(item.Csn) }); } - List highestLevelCharacters = [.. user.Characters.OrderByDescending(x => x.Level).Take(5)]; + List highestLevelCharacters = [.. user.Characters.OrderByDescending(x => x.Level).Take(5)]; - foreach (Database.Character? c in highestLevelCharacters) + foreach (CharacterModel? c in highestLevelCharacters) { response.SynchroStandardCharacters.Add(c.Csn); } diff --git a/EpinelPS/LobbyServer/Character/GetSynchrodevice.cs b/EpinelPS/LobbyServer/Character/GetSynchrodevice.cs index df4164e..e1736c9 100644 --- a/EpinelPS/LobbyServer/Character/GetSynchrodevice.cs +++ b/EpinelPS/LobbyServer/Character/GetSynchrodevice.cs @@ -23,14 +23,14 @@ namespace EpinelPS.LobbyServer.Character ]; } - List highestLevelCharacters = [.. user.Characters.OrderByDescending(x => x.Level).Take(5)]; + List highestLevelCharacters = [.. user.Characters.OrderByDescending(x => x.Level).Take(5)]; ResGetSynchroData response = new() { Synchro = new NetUserSynchroData() }; - foreach (Database.Character? item in highestLevelCharacters) + foreach (CharacterModel? item in highestLevelCharacters) { response.Synchro.StandardCharacters.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 = user.GetSynchro(item.Csn) }); } diff --git a/EpinelPS/LobbyServer/Character/LevelUp.cs b/EpinelPS/LobbyServer/Character/LevelUp.cs index 7deecca..bd25e44 100644 --- a/EpinelPS/LobbyServer/Character/LevelUp.cs +++ b/EpinelPS/LobbyServer/Character/LevelUp.cs @@ -14,7 +14,7 @@ namespace EpinelPS.LobbyServer.Character ResCharacterLevelUp response = new(); Dictionary data = GameData.Instance.GetCharacterLevelUpData(); - foreach (Database.Character item in user.Characters.ToArray()) + foreach (CharacterModel item in user.Characters.ToArray()) { if (item.Csn == req.Csn) { @@ -55,11 +55,11 @@ namespace EpinelPS.LobbyServer.Character Grade = item.Grade, Tid = item.Tid }; - List highestLevelCharacters = [.. user.Characters.OrderByDescending(x => x.Level).Take(5)]; + List highestLevelCharacters = [.. user.Characters.OrderByDescending(x => x.Level).Take(5)]; response.SynchroLv = user.GetSynchroLevel(); - foreach (Database.Character? c in highestLevelCharacters) + foreach (CharacterModel? c in highestLevelCharacters) { response.SynchroStandardCharacters.Add(c.Csn); } diff --git a/EpinelPS/LobbyServer/Character/RegisterSynchroDevice.cs b/EpinelPS/LobbyServer/Character/RegisterSynchroDevice.cs index 19fdf58..c5d4685 100644 --- a/EpinelPS/LobbyServer/Character/RegisterSynchroDevice.cs +++ b/EpinelPS/LobbyServer/Character/RegisterSynchroDevice.cs @@ -10,7 +10,7 @@ namespace EpinelPS.LobbyServer.Character { ReqSynchroRegister req = await ReadData(); User user = GetUser(); - Database.Character? targetCharacter = user.GetCharacterBySerialNumber(req.Csn) ?? throw new Exception("target character does not exist"); + CharacterModel? targetCharacter = user.GetCharacterBySerialNumber(req.Csn) ?? throw new Exception("target character does not exist"); ResSynchroRegister response = new(); foreach (SynchroSlot item in user.SynchroSlots) { diff --git a/EpinelPS/LobbyServer/Character/ResetLevel.cs b/EpinelPS/LobbyServer/Character/ResetLevel.cs index 2d46fee..4a4eb22 100644 --- a/EpinelPS/LobbyServer/Character/ResetLevel.cs +++ b/EpinelPS/LobbyServer/Character/ResetLevel.cs @@ -14,7 +14,7 @@ namespace EpinelPS.LobbyServer.Character ResCharacterGrowReset response = new(); Dictionary data = GameData.Instance.GetCharacterLevelUpData(); - foreach (Database.Character item in user.Characters.ToArray()) + foreach (CharacterModel item in user.Characters.ToArray()) { if (item.Csn == req.Csn) { @@ -56,11 +56,11 @@ namespace EpinelPS.LobbyServer.Character Grade = item.Grade, Tid = item.Tid }; - List highestLevelCharacters = [.. user.Characters.OrderByDescending(x => x.Level).Take(5)]; + List highestLevelCharacters = [.. user.Characters.OrderByDescending(x => x.Level).Take(5)]; response.SynchroLv = highestLevelCharacters.Last().Level; - foreach (Database.Character? c in highestLevelCharacters) + foreach (CharacterModel? c in highestLevelCharacters) { response.SynchroStandardCharacters.Add(c.Csn); } diff --git a/EpinelPS/LobbyServer/Character/SetCharacterCostume.cs b/EpinelPS/LobbyServer/Character/SetCharacterCostume.cs index f0e666e..0784e9e 100644 --- a/EpinelPS/LobbyServer/Character/SetCharacterCostume.cs +++ b/EpinelPS/LobbyServer/Character/SetCharacterCostume.cs @@ -11,7 +11,7 @@ namespace EpinelPS.LobbyServer.Character ReqSetCharacterCostume req = await ReadData(); User user = GetUser(); - foreach (Database.Character item in user.Characters) + foreach (CharacterModel item in user.Characters) { if (item.Csn == req.Csn) { diff --git a/EpinelPS/LobbyServer/Character/SkillLevelUp.cs b/EpinelPS/LobbyServer/Character/SkillLevelUp.cs index 96eb8bb..59855ad 100644 --- a/EpinelPS/LobbyServer/Character/SkillLevelUp.cs +++ b/EpinelPS/LobbyServer/Character/SkillLevelUp.cs @@ -13,7 +13,7 @@ namespace EpinelPS.LobbyServer.Character User user = GetUser(); ResCharacterSkillLevelUp response = new(); - Database.Character character = user.Characters.FirstOrDefault(c => c.Csn == req.Csn) ?? throw new Exception("cannot find character"); + CharacterModel character = user.Characters.FirstOrDefault(c => c.Csn == req.Csn) ?? throw new Exception("cannot find character"); CharacterRecord charRecord = GameData.Instance.CharacterTable.Values.FirstOrDefault(c => c.id == character.Tid) ?? throw new Exception("cannot find character record"); Dictionary skillIdMap = new() diff --git a/EpinelPS/LobbyServer/Character/UnregisterSynchroDevice.cs b/EpinelPS/LobbyServer/Character/UnregisterSynchroDevice.cs index 87fbafb..e59c687 100644 --- a/EpinelPS/LobbyServer/Character/UnregisterSynchroDevice.cs +++ b/EpinelPS/LobbyServer/Character/UnregisterSynchroDevice.cs @@ -25,7 +25,7 @@ namespace EpinelPS.LobbyServer.Character { long oldCSN = item.CharacterSerialNumber; item.CharacterSerialNumber = 0; - Database.Character data = user.GetCharacterBySerialNumber(oldCSN) ?? throw new Exception("failed to lookup character"); + CharacterModel data = user.GetCharacterBySerialNumber(oldCSN) ?? throw new Exception("failed to lookup character"); response.Character = new NetUserCharacterDefaultData() { @@ -41,10 +41,10 @@ namespace EpinelPS.LobbyServer.Character response.Slot = new NetSynchroSlot() { AvailableRegisterAt = item.AvailableAt, Csn = item.CharacterSerialNumber, Slot = item.Slot }; response.IsSynchro = false; - List highestLevelCharacters = [.. user.Characters.OrderByDescending(x => x.Level).Take(5)]; + List highestLevelCharacters = [.. user.Characters.OrderByDescending(x => x.Level).Take(5)]; - foreach (Database.Character? item2 in highestLevelCharacters) + foreach (CharacterModel? item2 in highestLevelCharacters) { response.SynchroStandardCharacters.Add(item2.Csn); } diff --git a/EpinelPS/LobbyServer/Character/UpgradeCore.cs b/EpinelPS/LobbyServer/Character/UpgradeCore.cs index 2127ea0..27199b5 100644 --- a/EpinelPS/LobbyServer/Character/UpgradeCore.cs +++ b/EpinelPS/LobbyServer/Character/UpgradeCore.cs @@ -18,7 +18,7 @@ namespace EpinelPS.LobbyServer.Character // Get all character data from the game's character table List fullchardata = [.. GameData.Instance.CharacterTable.Values]; - Database.Character targetCharacter = user.GetCharacterBySerialNumber(req.Csn) ?? throw new NullReferenceException(); + CharacterModel targetCharacter = user.GetCharacterBySerialNumber(req.Csn) ?? throw new NullReferenceException(); // Find the element with the current csn from the request CharacterRecord? currentCharacter = fullchardata.FirstOrDefault(c => c.id == targetCharacter.Tid); diff --git a/EpinelPS/LobbyServer/Event/CollectSystem/ListField.cs b/EpinelPS/LobbyServer/Event/CollectSystem/ListField.cs index 48d72e5..3884bc5 100644 --- a/EpinelPS/LobbyServer/Event/CollectSystem/ListField.cs +++ b/EpinelPS/LobbyServer/Event/CollectSystem/ListField.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Event.CollectSystem protected override async Task HandleAsync() { ReqListFieldEventCollectData req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResListFieldEventCollectData response = new(); diff --git a/EpinelPS/LobbyServer/Event/Field/ListPasswordDoor.cs b/EpinelPS/LobbyServer/Event/Field/ListPasswordDoor.cs index 1ebd168..13d7bfe 100644 --- a/EpinelPS/LobbyServer/Event/Field/ListPasswordDoor.cs +++ b/EpinelPS/LobbyServer/Event/Field/ListPasswordDoor.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Event.Field protected override async Task HandleAsync() { ReqListFieldPasswordDoorData req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResListFieldPasswordDoorData response = new(); diff --git a/EpinelPS/LobbyServer/Event/GetChallengeStage.cs b/EpinelPS/LobbyServer/Event/GetChallengeStage.cs index 678c933..5f43c3e 100644 --- a/EpinelPS/LobbyServer/Event/GetChallengeStage.cs +++ b/EpinelPS/LobbyServer/Event/GetChallengeStage.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Event protected override async Task HandleAsync() { ReqChallengeEventStageData req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResChallengeEventStageData response = new() { diff --git a/EpinelPS/LobbyServer/Event/GetEventScenario.cs b/EpinelPS/LobbyServer/Event/GetEventScenario.cs index b952439..f1e9f15 100644 --- a/EpinelPS/LobbyServer/Event/GetEventScenario.cs +++ b/EpinelPS/LobbyServer/Event/GetEventScenario.cs @@ -1,5 +1,4 @@ -using EpinelPS.Database; -using EpinelPS.Utils; +using EpinelPS.Utils; using EpinelPS.Data; // For GameData access using System.Linq; using System.Threading.Tasks; diff --git a/EpinelPS/LobbyServer/Event/Minigame/CE002/GetCe002Data.cs b/EpinelPS/LobbyServer/Event/Minigame/CE002/GetCe002Data.cs index c7f8867..636011f 100644 --- a/EpinelPS/LobbyServer/Event/Minigame/CE002/GetCe002Data.cs +++ b/EpinelPS/LobbyServer/Event/Minigame/CE002/GetCe002Data.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Event.Minigame.CE002 protected override async Task HandleAsync() { ReqGetMiniGameCe002Data req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetMiniGameCe002Data response = new() { diff --git a/EpinelPS/LobbyServer/Event/Minigame/CE006/GetSBStats.cs b/EpinelPS/LobbyServer/Event/Minigame/CE006/GetSBStats.cs index 5ecf484..97b6c78 100644 --- a/EpinelPS/LobbyServer/Event/Minigame/CE006/GetSBStats.cs +++ b/EpinelPS/LobbyServer/Event/Minigame/CE006/GetSBStats.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Event.Minigame.CE006 protected override async Task HandleAsync() { ReqGetStellarBladeStatistics req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetStellarBladeStatistics response = new(); diff --git a/EpinelPS/LobbyServer/Event/Shop/ListProductList.cs b/EpinelPS/LobbyServer/Event/Shop/ListProductList.cs index 7b4f02c..9cab669 100644 --- a/EpinelPS/LobbyServer/Event/Shop/ListProductList.cs +++ b/EpinelPS/LobbyServer/Event/Shop/ListProductList.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Event.Shop protected override async Task HandleAsync() { ReqShopProductList req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResShopProductList response = new(); response.Shops.Add(new NetShopProductData() diff --git a/EpinelPS/LobbyServer/Event/StoryEvent/EnterStage.cs b/EpinelPS/LobbyServer/Event/StoryEvent/EnterStage.cs index bf7cd8e..2dd9691 100644 --- a/EpinelPS/LobbyServer/Event/StoryEvent/EnterStage.cs +++ b/EpinelPS/LobbyServer/Event/StoryEvent/EnterStage.cs @@ -1,5 +1,4 @@ using EpinelPS.Utils; -using EpinelPS.Database; namespace EpinelPS.LobbyServer.Event.StoryEvent { diff --git a/EpinelPS/LobbyServer/FavoriteItem/GetFavoriteItemLibrary.cs b/EpinelPS/LobbyServer/FavoriteItem/GetFavoriteItemLibrary.cs index c8fac52..91e0935 100644 --- a/EpinelPS/LobbyServer/FavoriteItem/GetFavoriteItemLibrary.cs +++ b/EpinelPS/LobbyServer/FavoriteItem/GetFavoriteItemLibrary.cs @@ -10,7 +10,7 @@ namespace EpinelPS.LobbyServer.FavoriteItem ReqGetFavoriteItemLibrary req = await ReadData(); ResGetFavoriteItemLibrary response = new(); - Database.User user = GetUser(); + User user = GetUser(); await WriteDataAsync(response); diff --git a/EpinelPS/LobbyServer/FavoriteItem/ListFavoriteItem.cs b/EpinelPS/LobbyServer/FavoriteItem/ListFavoriteItem.cs index b86199c..ac74cb9 100644 --- a/EpinelPS/LobbyServer/FavoriteItem/ListFavoriteItem.cs +++ b/EpinelPS/LobbyServer/FavoriteItem/ListFavoriteItem.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.FavoriteItem protected override async Task HandleAsync() { ReqListFavoriteItem req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResListFavoriteItem response = new(); diff --git a/EpinelPS/LobbyServer/FavoriteItem/ListFavoriteItemQuests.cs b/EpinelPS/LobbyServer/FavoriteItem/ListFavoriteItemQuests.cs index da7e9fd..fe201dc 100644 --- a/EpinelPS/LobbyServer/FavoriteItem/ListFavoriteItemQuests.cs +++ b/EpinelPS/LobbyServer/FavoriteItem/ListFavoriteItemQuests.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.FavoriteItem protected override async Task HandleAsync() { ReqListFavoriteItemQuest req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResListFavoriteItemQuest response = new(); diff --git a/EpinelPS/LobbyServer/Gacha/ExecGacha.cs b/EpinelPS/LobbyServer/Gacha/ExecGacha.cs index 347a930..d40d30b 100644 --- a/EpinelPS/LobbyServer/Gacha/ExecGacha.cs +++ b/EpinelPS/LobbyServer/Gacha/ExecGacha.cs @@ -83,7 +83,7 @@ namespace EpinelPS.LobbyServer.Gacha if (user.HasCharacter(characterData.id)) { - Database.Character character = user.GetCharacter(characterData.id) ?? throw new Exception("HasCharacter() returned true, however character was null"); + CharacterModel character = user.GetCharacter(characterData.id) ?? throw new Exception("HasCharacter() returned true, however character was null"); ItemData? existingItem = user.Items.FirstOrDefault(item => item.ItemType == characterData.piece_id); @@ -200,7 +200,7 @@ namespace EpinelPS.LobbyServer.Gacha UltiSkillLv = 1 }); - user.Characters.Add(new Database.Character() + user.Characters.Add(new CharacterModel() { CostumeId = 0, Csn = (int)gacha.Sn, diff --git a/EpinelPS/LobbyServer/Gacha/ExecuteEventGacha.cs b/EpinelPS/LobbyServer/Gacha/ExecuteEventGacha.cs index ed65756..6ba2d03 100644 --- a/EpinelPS/LobbyServer/Gacha/ExecuteEventGacha.cs +++ b/EpinelPS/LobbyServer/Gacha/ExecuteEventGacha.cs @@ -146,7 +146,7 @@ namespace EpinelPS.LobbyServer.Gacha UltiSkillLv = 1 }); - user.Characters.Add(new Database.Character() + user.Characters.Add(new CharacterModel() { CostumeId = 0, Csn = id, diff --git a/EpinelPS/LobbyServer/GetGacha.cs b/EpinelPS/LobbyServer/GetGacha.cs index 504bdb9..ddc476b 100644 --- a/EpinelPS/LobbyServer/GetGacha.cs +++ b/EpinelPS/LobbyServer/GetGacha.cs @@ -9,7 +9,7 @@ namespace EpinelPS.LobbyServer protected override async Task HandleAsync() { ReqGetGachaData req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetGachaData response = new(); diff --git a/EpinelPS/LobbyServer/Intercept/InterceptEnter.cs b/EpinelPS/LobbyServer/Intercept/InterceptEnter.cs index 4fbfabc..2798bbb 100644 --- a/EpinelPS/LobbyServer/Intercept/InterceptEnter.cs +++ b/EpinelPS/LobbyServer/Intercept/InterceptEnter.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Intercept protected override async Task HandleAsync() { ReqEnterIntercept req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResEnterIntercept response = new(); diff --git a/EpinelPS/LobbyServer/Inventory/GetInventoryData.cs b/EpinelPS/LobbyServer/Inventory/GetInventoryData.cs index 041816f..a174b48 100644 --- a/EpinelPS/LobbyServer/Inventory/GetInventoryData.cs +++ b/EpinelPS/LobbyServer/Inventory/GetInventoryData.cs @@ -8,10 +8,10 @@ namespace EpinelPS.LobbyServer.Inventory protected override async Task HandleAsync() { ReqGetInventoryData req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetInventoryData response = new(); - foreach (Database.ItemData item in user.Items) + foreach (ItemData item in user.Items) { response.Items.Add(new NetUserItemData() { Count = item.Count, Tid = item.ItemType, Csn = item.Csn, Lv = item.Level, Exp = item.Exp, Corporation = item.Corp, Isn = item.Isn, Position = item.Position }); } diff --git a/EpinelPS/LobbyServer/Inventory/UsePiece.cs b/EpinelPS/LobbyServer/Inventory/UsePiece.cs index 5483aae..9c97229 100644 --- a/EpinelPS/LobbyServer/Inventory/UsePiece.cs +++ b/EpinelPS/LobbyServer/Inventory/UsePiece.cs @@ -46,7 +46,7 @@ namespace EpinelPS.LobbyServer.Inventory { ItemData? spareItem = user.Items.FirstOrDefault(i => i.ItemType == character.piece_id); - if (user.GetCharacter(character.id) is Database.Character ownedCharacter) + if (user.GetCharacter(character.id) is CharacterModel ownedCharacter) { // If the character already exists, we can increase its piece count int maxLimitBroken = GetValueByRarity(character.original_rare, 0, 2, 11); @@ -104,7 +104,7 @@ namespace EpinelPS.LobbyServer.Inventory Csn = user.GenerateUniqueCharacterId(), Tid = character.id, }); - user.Characters.Add(new Database.Character + user.Characters.Add(new CharacterModel { CostumeId = 0, Csn = csn, @@ -194,7 +194,7 @@ namespace EpinelPS.LobbyServer.Inventory _ => throw new Exception($"Unknown character rarity: {rarity}") }; - private NetCharacterData GetNetCharacterData(Database.Character character, int bodyLabel = 0) + private NetCharacterData GetNetCharacterData(CharacterModel character, int bodyLabel = 0) { return new NetCharacterData { diff --git a/EpinelPS/LobbyServer/Liberate/ChooseCharacter.cs b/EpinelPS/LobbyServer/Liberate/ChooseCharacter.cs index dbc1620..9232c1a 100644 --- a/EpinelPS/LobbyServer/Liberate/ChooseCharacter.cs +++ b/EpinelPS/LobbyServer/Liberate/ChooseCharacter.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Liberate protected override async Task HandleAsync() { ReqChooseLiberateCharacter req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResChooseLiberateCharacter response = new() { diff --git a/EpinelPS/LobbyServer/Liberate/GetLiberateData.cs b/EpinelPS/LobbyServer/Liberate/GetLiberateData.cs index cd8586a..6f07831 100644 --- a/EpinelPS/LobbyServer/Liberate/GetLiberateData.cs +++ b/EpinelPS/LobbyServer/Liberate/GetLiberateData.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Liberate protected override async Task HandleAsync() { ReqGetLiberateData req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetLiberateData response = new() { }; diff --git a/EpinelPS/LobbyServer/Liberate/GetProgressList.cs b/EpinelPS/LobbyServer/Liberate/GetProgressList.cs index 25c40aa..d4252f8 100644 --- a/EpinelPS/LobbyServer/Liberate/GetProgressList.cs +++ b/EpinelPS/LobbyServer/Liberate/GetProgressList.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Liberate protected override async Task HandleAsync() { ReqGetLiberateProgressList req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetLiberateProgressList response = new(); diff --git a/EpinelPS/LobbyServer/LobbyUser/AquireUserTitle.cs b/EpinelPS/LobbyServer/LobbyUser/AquireUserTitle.cs index 0c9ea4b..73ab7ce 100644 --- a/EpinelPS/LobbyServer/LobbyUser/AquireUserTitle.cs +++ b/EpinelPS/LobbyServer/LobbyUser/AquireUserTitle.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.LobbyUser protected override async Task HandleAsync() { ReqAcquireUserTitle req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResAcquireUserTitle response = new(); diff --git a/EpinelPS/LobbyServer/LobbyUser/EnterLobbyServer.cs b/EpinelPS/LobbyServer/LobbyUser/EnterLobbyServer.cs index b36d364..8f244b5 100644 --- a/EpinelPS/LobbyServer/LobbyUser/EnterLobbyServer.cs +++ b/EpinelPS/LobbyServer/LobbyUser/EnterLobbyServer.cs @@ -36,7 +36,7 @@ namespace EpinelPS.LobbyServer.LobbyUser response.Currency.Add(new NetUserCurrencyData() { Type = (int)item.Key, Value = item.Value }); } - foreach (Database.Character item in user.Characters) + foreach (CharacterModel item in user.Characters) { response.Character.Add(new NetUserCharacterData() { Default = new() { Csn = item.Csn, Skill1Lv = item.Skill1Lvl, Skill2Lv = item.Skill2Lvl, CostumeId = item.CostumeId, Lv = user.GetCharacterLevel(item.Csn, item.Level), Grade = item.Grade, Tid = item.Tid, UltiSkillLv = item.UltimateLevel}, IsSynchro = user.GetSynchro(item.Csn) }); } @@ -49,10 +49,10 @@ namespace EpinelPS.LobbyServer.LobbyUser // Add squad data if there are characters if (user.Characters.Count > 0) { - List highestLevelCharacters = [.. user.Characters.OrderByDescending(x => x.Level).Take(5)]; + List highestLevelCharacters = [.. user.Characters.OrderByDescending(x => x.Level).Take(5)]; response.SynchroLv = user.GetSynchroLevel(); - foreach (Database.Character? item in highestLevelCharacters) + foreach (CharacterModel? item in highestLevelCharacters) { response.SynchroStandardCharacters.Add(item.Csn); } diff --git a/EpinelPS/LobbyServer/LobbyUser/GetContentsData.cs b/EpinelPS/LobbyServer/LobbyUser/GetContentsData.cs index 5dae2dc..0b98582 100644 --- a/EpinelPS/LobbyServer/LobbyUser/GetContentsData.cs +++ b/EpinelPS/LobbyServer/LobbyUser/GetContentsData.cs @@ -8,14 +8,14 @@ namespace EpinelPS.LobbyServer.LobbyUser protected override async Task HandleAsync() { ReqGetContentsOpenData req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); // this request returns a list of "special" stages that mark when something is unlocked, ex: the shop or interception List specialStages = [6003003, 6002008, 6002016, 6005003, 6003021, 6011018, 6007021, 6004018, 6005013, 6003009, 6003012, 6009017, 6016039, 6001004, 6000003, 6000001, 6002001, 6004023, 6005026, 6020050, 6006004, 6006023,6022049]; ResGetContentsOpenData response = new(); - foreach (Database.FieldInfoNew field in user.FieldInfoNew.Values) + foreach (FieldInfoNew field in user.FieldInfoNew.Values) { foreach (int stage in field.CompletedStages) { diff --git a/EpinelPS/LobbyServer/LobbyUser/GetFieldTalkList.cs b/EpinelPS/LobbyServer/LobbyUser/GetFieldTalkList.cs index 1ae22e2..e8f624c 100644 --- a/EpinelPS/LobbyServer/LobbyUser/GetFieldTalkList.cs +++ b/EpinelPS/LobbyServer/LobbyUser/GetFieldTalkList.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.LobbyUser protected override async Task HandleAsync() { ReqGetFieldTalkList req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetFieldTalkList response = new(); // TODO diff --git a/EpinelPS/LobbyServer/LobbyUser/GetScenarioList.cs b/EpinelPS/LobbyServer/LobbyUser/GetScenarioList.cs index eac152e..2dd930c 100644 --- a/EpinelPS/LobbyServer/LobbyUser/GetScenarioList.cs +++ b/EpinelPS/LobbyServer/LobbyUser/GetScenarioList.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.LobbyUser protected override async Task HandleAsync() { ReqGetScenarioList req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); // todo what are bookmark scenarios? diff --git a/EpinelPS/LobbyServer/LobbyUser/GetUserProfile.cs b/EpinelPS/LobbyServer/LobbyUser/GetUserProfile.cs index 78acff8..6e2b98b 100644 --- a/EpinelPS/LobbyServer/LobbyUser/GetUserProfile.cs +++ b/EpinelPS/LobbyServer/LobbyUser/GetUserProfile.cs @@ -8,8 +8,8 @@ namespace EpinelPS.LobbyServer.LobbyUser protected override async Task HandleAsync() { ReqGetProfileData req = await ReadData(); - Database.User callingUser = GetUser(); - Database.User? user = GetUser((ulong)req.TargetUsn); + User callingUser = GetUser(); + User? user = GetUser((ulong)req.TargetUsn); ResGetProfileData response = new(); if (user != null) @@ -28,7 +28,7 @@ namespace EpinelPS.LobbyServer.LobbyUser for (int i = 0; i < user.RepresentationTeamDataNew.Length; i++) { long csn = user.RepresentationTeamDataNew[i]; - Database.Character? c = user.GetCharacterBySerialNumber(csn); + CharacterModel? c = user.GetCharacterBySerialNumber(csn); if (c != null) { diff --git a/EpinelPS/LobbyServer/LobbyUser/GetUserScenarioExist.cs b/EpinelPS/LobbyServer/LobbyUser/GetUserScenarioExist.cs index 5f487ea..dbc9785 100644 --- a/EpinelPS/LobbyServer/LobbyUser/GetUserScenarioExist.cs +++ b/EpinelPS/LobbyServer/LobbyUser/GetUserScenarioExist.cs @@ -13,7 +13,7 @@ namespace EpinelPS.LobbyServer.LobbyUser ResExistScenario response = new(); - Database.User user = GetUser(); + User user = GetUser(); foreach (string? item in req.ScenarioGroupIds) { diff --git a/EpinelPS/LobbyServer/LobbyUser/GetWallpaper.cs b/EpinelPS/LobbyServer/LobbyUser/GetWallpaper.cs index e78638a..5a46369 100644 --- a/EpinelPS/LobbyServer/LobbyUser/GetWallpaper.cs +++ b/EpinelPS/LobbyServer/LobbyUser/GetWallpaper.cs @@ -9,7 +9,7 @@ namespace EpinelPS.LobbyServer.LobbyUser { ReqGetWallpaper req = await ReadData(); ResGetWallpaper response = new(); - Database.User user = GetUser(); + User user = GetUser(); response.WallpaperList.AddRange(user.WallpaperList); diff --git a/EpinelPS/LobbyServer/LobbyUser/MarkNoticeRead.cs b/EpinelPS/LobbyServer/LobbyUser/MarkNoticeRead.cs index b83ce5f..929f554 100644 --- a/EpinelPS/LobbyServer/LobbyUser/MarkNoticeRead.cs +++ b/EpinelPS/LobbyServer/LobbyUser/MarkNoticeRead.cs @@ -1,5 +1,4 @@ using EpinelPS.Utils; -using EpinelPS.Data; // For GameData access namespace EpinelPS.LobbyServer.LobbyUser { @@ -10,7 +9,7 @@ namespace EpinelPS.LobbyServer.LobbyUser { ReqRecordNoticeLog req = await ReadData(); ResRecordNoticeLog r = new(); - Database.User user = GetUser(); + User user = GetUser(); // TODO diff --git a/EpinelPS/LobbyServer/LobbyUser/UnmarkUsertitleBadge.cs b/EpinelPS/LobbyServer/LobbyUser/UnmarkUsertitleBadge.cs index 9b1819b..cead216 100644 --- a/EpinelPS/LobbyServer/LobbyUser/UnmarkUsertitleBadge.cs +++ b/EpinelPS/LobbyServer/LobbyUser/UnmarkUsertitleBadge.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.LobbyUser protected override async Task HandleAsync() { ReqUnMarkUserTitleBadge req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResUnMarkUserTitleBadge response = new(); diff --git a/EpinelPS/LobbyServer/Lostsector/GetField.cs b/EpinelPS/LobbyServer/Lostsector/GetField.cs index 62e4c12..1583a97 100644 --- a/EpinelPS/LobbyServer/Lostsector/GetField.cs +++ b/EpinelPS/LobbyServer/Lostsector/GetField.cs @@ -8,9 +8,9 @@ namespace EpinelPS.LobbyServer.Lostsector protected override async Task HandleAsync() { ReqGetLostSectorFieldData req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); - Database.LostSectorData f = user.LostSectorData[req.SectorId]; + LostSectorData f = user.LostSectorData[req.SectorId]; ResGetLostSectorFieldData response = new() { Field = new NetFieldObjectData(), diff --git a/EpinelPS/LobbyServer/Lostsector/GetLostSectorData.cs b/EpinelPS/LobbyServer/Lostsector/GetLostSectorData.cs index cb4fca0..4942c3f 100644 --- a/EpinelPS/LobbyServer/Lostsector/GetLostSectorData.cs +++ b/EpinelPS/LobbyServer/Lostsector/GetLostSectorData.cs @@ -9,7 +9,7 @@ namespace EpinelPS.LobbyServer.Lostsector protected override async Task HandleAsync() { ReqGetLostSectorData req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetLostSectorData response = new(); @@ -20,7 +20,7 @@ namespace EpinelPS.LobbyServer.Lostsector response.ClearStages.Add(new NetFieldStageData() { StageId = item.Value.open_condition_value }); } - if (user.LostSectorData.TryGetValue(item.Key, out Database.LostSectorData? val)) + if (user.LostSectorData.TryGetValue(item.Key, out LostSectorData? val)) { MapInfo map = GameData.Instance.MapData[item.Value.field_id]; response.LostSector.Add(new NetUserLostSectorData() diff --git a/EpinelPS/LobbyServer/Lostsector/Play.cs b/EpinelPS/LobbyServer/Lostsector/Play.cs index ec965a7..cdf7268 100644 --- a/EpinelPS/LobbyServer/Lostsector/Play.cs +++ b/EpinelPS/LobbyServer/Lostsector/Play.cs @@ -14,7 +14,7 @@ namespace EpinelPS.LobbyServer.Lostsector ResPlayLostSector response = new(); if (!user.LostSectorData.ContainsKey(req.SectorId)) - user.LostSectorData.Add(req.SectorId, new Database.LostSectorData() + user.LostSectorData.Add(req.SectorId, new LostSectorData() { IsPlaying = true }); diff --git a/EpinelPS/LobbyServer/Lostsector/SaveField.cs b/EpinelPS/LobbyServer/Lostsector/SaveField.cs index 187c35e..6181e86 100644 --- a/EpinelPS/LobbyServer/Lostsector/SaveField.cs +++ b/EpinelPS/LobbyServer/Lostsector/SaveField.cs @@ -8,12 +8,12 @@ namespace EpinelPS.LobbyServer.Lostsector protected override async Task HandleAsync() { ReqSaveLostSectorField req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResSaveLostSectorField response = new(); - if (!user.LostSectorData.TryGetValue(req.SectorId, out Database.LostSectorData? value)) - user.LostSectorData.Add(req.SectorId, new Database.LostSectorData() + if (!user.LostSectorData.TryGetValue(req.SectorId, out LostSectorData? value)) + user.LostSectorData.Add(req.SectorId, new LostSectorData() { Json = req.Json }); diff --git a/EpinelPS/LobbyServer/Lostsector/SaveFieldObject.cs b/EpinelPS/LobbyServer/Lostsector/SaveFieldObject.cs index bffcec6..f4f585e 100644 --- a/EpinelPS/LobbyServer/Lostsector/SaveFieldObject.cs +++ b/EpinelPS/LobbyServer/Lostsector/SaveFieldObject.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Lostsector protected override async Task HandleAsync() { ReqSaveLostSectorFieldObject req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResSaveLostSectorFieldObject response = new(); diff --git a/EpinelPS/LobbyServer/Messenger/GetMessages.cs b/EpinelPS/LobbyServer/Messenger/GetMessages.cs index 1d6183e..af9fedc 100644 --- a/EpinelPS/LobbyServer/Messenger/GetMessages.cs +++ b/EpinelPS/LobbyServer/Messenger/GetMessages.cs @@ -1,5 +1,4 @@ -using EpinelPS.Database; -using EpinelPS.Utils; +using EpinelPS.Utils; namespace EpinelPS.LobbyServer.Messenger { diff --git a/EpinelPS/LobbyServer/Minigame/nksv2/GetScenario.cs b/EpinelPS/LobbyServer/Minigame/nksv2/GetScenario.cs index 1eea577..601b6be 100644 --- a/EpinelPS/LobbyServer/Minigame/nksv2/GetScenario.cs +++ b/EpinelPS/LobbyServer/Minigame/nksv2/GetScenario.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Minigame.nksv2 protected override async Task HandleAsync() { ReqGetNKSV2Scenario req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetNKSV2Scenario response = new(); response.ScenarioIdList.Add(user.MogInfo.CompletedScenarios); diff --git a/EpinelPS/LobbyServer/Misc/GachaGetAllShutdownFlags.cs b/EpinelPS/LobbyServer/Misc/GachaGetAllShutdownFlags.cs index e3c4c98..f4ffe57 100644 --- a/EpinelPS/LobbyServer/Misc/GachaGetAllShutdownFlags.cs +++ b/EpinelPS/LobbyServer/Misc/GachaGetAllShutdownFlags.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Misc protected override async Task HandleAsync() { ReqGachaGetAllShutdownFlags req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGachaGetAllShutdownFlags response = new(); if (user.GachaTutorialPlayCount > 0) diff --git a/EpinelPS/LobbyServer/Misc/GetUserOnlineStateLog.cs b/EpinelPS/LobbyServer/Misc/GetUserOnlineStateLog.cs index c11cbba..e348666 100644 --- a/EpinelPS/LobbyServer/Misc/GetUserOnlineStateLog.cs +++ b/EpinelPS/LobbyServer/Misc/GetUserOnlineStateLog.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Misc protected override async Task HandleAsync() { ReqUserOnlineStateLog req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResUserOnlineStateLog response = new(); user.LastLogin = DateTime.UtcNow; diff --git a/EpinelPS/LobbyServer/Misc/Retroactive.cs b/EpinelPS/LobbyServer/Misc/Retroactive.cs index 62fc154..4b41319 100644 --- a/EpinelPS/LobbyServer/Misc/Retroactive.cs +++ b/EpinelPS/LobbyServer/Misc/Retroactive.cs @@ -13,7 +13,7 @@ namespace EpinelPS.LobbyServer.Misc protected override async Task HandleAsync() { ReqRetroactive req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResRetroactive response = new(); await WriteDataAsync(response); diff --git a/EpinelPS/LobbyServer/Mission/GetAchievementRewardedData.cs b/EpinelPS/LobbyServer/Mission/GetAchievementRewardedData.cs index 364295e..659a698 100644 --- a/EpinelPS/LobbyServer/Mission/GetAchievementRewardedData.cs +++ b/EpinelPS/LobbyServer/Mission/GetAchievementRewardedData.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Mission protected override async Task HandleAsync() { await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetAchievementRewardedData response = new(); response.Ids.AddRange(user.CompletedAchievements); diff --git a/EpinelPS/LobbyServer/Mission/GetAllRewards.cs b/EpinelPS/LobbyServer/Mission/GetAllRewards.cs index 4e40c4b..2e7e266 100644 --- a/EpinelPS/LobbyServer/Mission/GetAllRewards.cs +++ b/EpinelPS/LobbyServer/Mission/GetAllRewards.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Mission protected override async Task HandleAsync() { ReqGetRewardedData req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetRewardedData response = new(); diff --git a/EpinelPS/LobbyServer/Mission/Rewards/GetDailyRewards.cs b/EpinelPS/LobbyServer/Mission/Rewards/GetDailyRewards.cs index c9c564f..931ea4d 100644 --- a/EpinelPS/LobbyServer/Mission/Rewards/GetDailyRewards.cs +++ b/EpinelPS/LobbyServer/Mission/Rewards/GetDailyRewards.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Mission.Rewards protected override async Task HandleAsync() { await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); user.ResetDataIfNeeded(); diff --git a/EpinelPS/LobbyServer/Mission/Rewards/GetWeeklyRewards.cs b/EpinelPS/LobbyServer/Mission/Rewards/GetWeeklyRewards.cs index a90f515..74b57a6 100644 --- a/EpinelPS/LobbyServer/Mission/Rewards/GetWeeklyRewards.cs +++ b/EpinelPS/LobbyServer/Mission/Rewards/GetWeeklyRewards.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Mission.Rewards protected override async Task HandleAsync() { await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); user.ResetDataIfNeeded(); diff --git a/EpinelPS/LobbyServer/Outpost/ClearTacticAcademyLesson.cs b/EpinelPS/LobbyServer/Outpost/ClearTacticAcademyLesson.cs index 2145b16..a873ca2 100644 --- a/EpinelPS/LobbyServer/Outpost/ClearTacticAcademyLesson.cs +++ b/EpinelPS/LobbyServer/Outpost/ClearTacticAcademyLesson.cs @@ -40,7 +40,7 @@ namespace EpinelPS.LobbyServer.Outpost await WriteDataAsync(response); } - private static void ProcessLessonReward(Database.User user, TacticAcademyLessonRecord r) + private static void ProcessLessonReward(User user, TacticAcademyLessonRecord r) { if (r.lesson_reward == null) { diff --git a/EpinelPS/LobbyServer/Outpost/GetOutpostData.cs b/EpinelPS/LobbyServer/Outpost/GetOutpostData.cs index ce45e0a..08715c8 100644 --- a/EpinelPS/LobbyServer/Outpost/GetOutpostData.cs +++ b/EpinelPS/LobbyServer/Outpost/GetOutpostData.cs @@ -1,5 +1,4 @@ using EpinelPS.Utils; -using EpinelPS.Database; using EpinelPS.Data; namespace EpinelPS.LobbyServer.Outpost { diff --git a/EpinelPS/LobbyServer/Outpost/GetRecycleRoomData.cs b/EpinelPS/LobbyServer/Outpost/GetRecycleRoomData.cs index 93437c3..ce61a0d 100644 --- a/EpinelPS/LobbyServer/Outpost/GetRecycleRoomData.cs +++ b/EpinelPS/LobbyServer/Outpost/GetRecycleRoomData.cs @@ -1,5 +1,4 @@ -using EpinelPS.Database; -using EpinelPS.Utils; +using EpinelPS.Utils; namespace EpinelPS.LobbyServer.Outpost { diff --git a/EpinelPS/LobbyServer/Outpost/GetTacticAcademyData.cs b/EpinelPS/LobbyServer/Outpost/GetTacticAcademyData.cs index 39fed5f..8d2caa8 100644 --- a/EpinelPS/LobbyServer/Outpost/GetTacticAcademyData.cs +++ b/EpinelPS/LobbyServer/Outpost/GetTacticAcademyData.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Outpost protected override async Task HandleAsync() { ReqGetTacticAcademyData req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetTacticAcademyData response = new(); response.ClearLessons.AddRange(user.CompletedTacticAcademyLessons); diff --git a/EpinelPS/LobbyServer/Outpost/MemorialGetMemoryList.cs b/EpinelPS/LobbyServer/Outpost/MemorialGetMemoryList.cs index 8a27c1a..e88abe4 100644 --- a/EpinelPS/LobbyServer/Outpost/MemorialGetMemoryList.cs +++ b/EpinelPS/LobbyServer/Outpost/MemorialGetMemoryList.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Outpost protected override async Task HandleAsync() { ReqGetMemoryList req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetMemoryList response = new(); diff --git a/EpinelPS/LobbyServer/Outpost/SetBuildingDone.cs b/EpinelPS/LobbyServer/Outpost/SetBuildingDone.cs index bde42be..d650169 100644 --- a/EpinelPS/LobbyServer/Outpost/SetBuildingDone.cs +++ b/EpinelPS/LobbyServer/Outpost/SetBuildingDone.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Outpost protected override async Task HandleAsync() { ReqBuildingIsDone req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResBuildingIsDone response = new(); diff --git a/EpinelPS/LobbyServer/Outpost/ShowBattleReward.cs b/EpinelPS/LobbyServer/Outpost/ShowBattleReward.cs index 7ba58dd..4d0a5f9 100644 --- a/EpinelPS/LobbyServer/Outpost/ShowBattleReward.cs +++ b/EpinelPS/LobbyServer/Outpost/ShowBattleReward.cs @@ -1,5 +1,4 @@ -using EpinelPS.Database; -using EpinelPS.Utils; +using EpinelPS.Utils; namespace EpinelPS.LobbyServer.Outpost { diff --git a/EpinelPS/LobbyServer/PartyMatch/ListPartyMatchInvitations.cs b/EpinelPS/LobbyServer/PartyMatch/ListPartyMatchInvitations.cs index f79e974..2c945b0 100644 --- a/EpinelPS/LobbyServer/PartyMatch/ListPartyMatchInvitations.cs +++ b/EpinelPS/LobbyServer/PartyMatch/ListPartyMatchInvitations.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.PartyMatch protected override async Task HandleAsync() { ReqListInvitation req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResListInvitation response = new(); // TODO diff --git a/EpinelPS/LobbyServer/Sidestory/ClearBattle.cs b/EpinelPS/LobbyServer/Sidestory/ClearBattle.cs index c0581f8..f5fb332 100644 --- a/EpinelPS/LobbyServer/Sidestory/ClearBattle.cs +++ b/EpinelPS/LobbyServer/Sidestory/ClearBattle.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Sidestory protected override async Task HandleAsync() { ReqClearSideStoryCutForBattle req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResClearSideStoryCutForBattle response = new(); diff --git a/EpinelPS/LobbyServer/Sidestory/ClearSideStoryCut.cs b/EpinelPS/LobbyServer/Sidestory/ClearSideStoryCut.cs index 05b1817..f842fe4 100644 --- a/EpinelPS/LobbyServer/Sidestory/ClearSideStoryCut.cs +++ b/EpinelPS/LobbyServer/Sidestory/ClearSideStoryCut.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Sidestory protected override async Task HandleAsync() { ReqClearSideStoryCutForScenario req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResClearSideStoryCutForScenario response = new(); diff --git a/EpinelPS/LobbyServer/Sidestory/EnterBattle.cs b/EpinelPS/LobbyServer/Sidestory/EnterBattle.cs index dfd1cb1..2737219 100644 --- a/EpinelPS/LobbyServer/Sidestory/EnterBattle.cs +++ b/EpinelPS/LobbyServer/Sidestory/EnterBattle.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Sidestory protected override async Task HandleAsync() { ReqEnterSideStoryCutForBattle req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResEnterSideStoryCutForBattle response = new(); diff --git a/EpinelPS/LobbyServer/Sidestory/EnterSidestoryStage.cs b/EpinelPS/LobbyServer/Sidestory/EnterSidestoryStage.cs index 3a23767..8a8d511 100644 --- a/EpinelPS/LobbyServer/Sidestory/EnterSidestoryStage.cs +++ b/EpinelPS/LobbyServer/Sidestory/EnterSidestoryStage.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Sidestory protected override async Task HandleAsync() { ReqEnterSideStoryStage req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResEnterSideStoryStage response = new(); diff --git a/EpinelPS/LobbyServer/Sidestory/ListSideStory.cs b/EpinelPS/LobbyServer/Sidestory/ListSideStory.cs index d3b0030..e33a984 100644 --- a/EpinelPS/LobbyServer/Sidestory/ListSideStory.cs +++ b/EpinelPS/LobbyServer/Sidestory/ListSideStory.cs @@ -9,7 +9,7 @@ namespace EpinelPS.LobbyServer.Sidestory protected override async Task HandleAsync() { ReqListSideStory req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResListSideStory response = new(); diff --git a/EpinelPS/LobbyServer/Simroom/GetSimRoomData.cs b/EpinelPS/LobbyServer/Simroom/GetSimRoomData.cs index f53ef33..ee78c60 100644 --- a/EpinelPS/LobbyServer/Simroom/GetSimRoomData.cs +++ b/EpinelPS/LobbyServer/Simroom/GetSimRoomData.cs @@ -9,7 +9,7 @@ namespace EpinelPS.LobbyServer.Simroom protected override async Task HandleAsync() { ReqGetSimRoom req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetSimRoom response = new() { diff --git a/EpinelPS/LobbyServer/Stage/CheckCleared.cs b/EpinelPS/LobbyServer/Stage/CheckCleared.cs index d379e9c..f88749b 100644 --- a/EpinelPS/LobbyServer/Stage/CheckCleared.cs +++ b/EpinelPS/LobbyServer/Stage/CheckCleared.cs @@ -10,9 +10,9 @@ namespace EpinelPS.LobbyServer.Stage ReqCheckStageClear req = await ReadData(); ResCheckStageClear response = new(); - Database.User user = GetUser(); + User user = GetUser(); - foreach (KeyValuePair fields in user.FieldInfoNew) + foreach (KeyValuePair fields in user.FieldInfoNew) { foreach (int stages in fields.Value.CompletedStages) { diff --git a/EpinelPS/LobbyServer/Stage/ClearStage.cs b/EpinelPS/LobbyServer/Stage/ClearStage.cs index da76298..e5dc199 100644 --- a/EpinelPS/LobbyServer/Stage/ClearStage.cs +++ b/EpinelPS/LobbyServer/Stage/ClearStage.cs @@ -170,11 +170,11 @@ namespace EpinelPS.LobbyServer.Stage LastContentsTeamNumber = 1 }; - user.Characters.Add(new Database.Character() { Csn = 47263455, Tid = 201001 }); - user.Characters.Add(new Database.Character() { Csn = 47273456, Tid = 330501 }); - user.Characters.Add(new Database.Character() { Csn = 47263457, Tid = 130201 }); - user.Characters.Add(new Database.Character() { Csn = 47263458, Tid = 230101 }); - user.Characters.Add(new Database.Character() { Csn = 47263459, Tid = 301201 }); + user.Characters.Add(new CharacterModel() { Csn = 47263455, Tid = 201001 }); + user.Characters.Add(new CharacterModel() { Csn = 47273456, Tid = 330501 }); + user.Characters.Add(new CharacterModel() { Csn = 47263457, Tid = 130201 }); + user.Characters.Add(new CharacterModel() { Csn = 47263458, Tid = 230101 }); + user.Characters.Add(new CharacterModel() { Csn = 47263459, Tid = 301201 }); user.BondInfo.Add(new() { NameCode = 3001, Lv = 1 }); user.BondInfo.Add(new() { NameCode = 3005, Lv = 1 }); @@ -193,7 +193,7 @@ namespace EpinelPS.LobbyServer.Stage for (int i = 1; i < 6; i++) { - Database.Character character = user.Characters[i - 1]; + CharacterModel character = user.Characters[i - 1]; team1Sub.Slots.Add(new NetTeamSlot() { Slot = i, Value = character.Csn }); } team1.Teams.Add(team1Sub); diff --git a/EpinelPS/LobbyServer/Stage/FastClear.cs b/EpinelPS/LobbyServer/Stage/FastClear.cs index b4fd938..913ce76 100644 --- a/EpinelPS/LobbyServer/Stage/FastClear.cs +++ b/EpinelPS/LobbyServer/Stage/FastClear.cs @@ -10,7 +10,7 @@ namespace EpinelPS.LobbyServer.Stage { ReqFastClearCampaignStage req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); Console.WriteLine($"Stage " + req.CampaignStageId + " completed using quick battle"); diff --git a/EpinelPS/LobbyServer/Stage/GetStageClearInfo.cs b/EpinelPS/LobbyServer/Stage/GetStageClearInfo.cs index 7b53c82..e0d8813 100644 --- a/EpinelPS/LobbyServer/Stage/GetStageClearInfo.cs +++ b/EpinelPS/LobbyServer/Stage/GetStageClearInfo.cs @@ -9,7 +9,7 @@ namespace EpinelPS.LobbyServer.Stage { ReqGetStageClearInfo req = await ReadData(); ResGetStageClearInfo response = new(); - Database.User user = GetUser(); + User user = GetUser(); response.Historys.AddRange(user.StageClearHistorys); diff --git a/EpinelPS/LobbyServer/Subquest/ListSubquests.cs b/EpinelPS/LobbyServer/Subquest/ListSubquests.cs index 514b1ed..b5673f0 100644 --- a/EpinelPS/LobbyServer/Subquest/ListSubquests.cs +++ b/EpinelPS/LobbyServer/Subquest/ListSubquests.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Subquest protected override async Task HandleAsync() { ReqGetSubQuestList req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetSubQuestList response = new(); diff --git a/EpinelPS/LobbyServer/Team/GetTeamData.cs b/EpinelPS/LobbyServer/Team/GetTeamData.cs index b38c99c..2e5036c 100644 --- a/EpinelPS/LobbyServer/Team/GetTeamData.cs +++ b/EpinelPS/LobbyServer/Team/GetTeamData.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Team protected override async Task HandleAsync() { ReqGetTeamData req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetTeamData response = new(); diff --git a/EpinelPS/LobbyServer/Tower/GetTowerData.cs b/EpinelPS/LobbyServer/Tower/GetTowerData.cs index 326dcb1..1ce7412 100644 --- a/EpinelPS/LobbyServer/Tower/GetTowerData.cs +++ b/EpinelPS/LobbyServer/Tower/GetTowerData.cs @@ -11,7 +11,7 @@ namespace EpinelPS.LobbyServer.Tower ResGetTowerData response = new(); - Database.User user = GetUser(); + User user = GetUser(); // TODO: Load remain count for these NetTowerData t0 = new() { Type = 1, RemainCount = 3 }; diff --git a/EpinelPS/LobbyServer/Trigger/GetMainQuestData.cs b/EpinelPS/LobbyServer/Trigger/GetMainQuestData.cs index 186d638..995a5d6 100644 --- a/EpinelPS/LobbyServer/Trigger/GetMainQuestData.cs +++ b/EpinelPS/LobbyServer/Trigger/GetMainQuestData.cs @@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Trigger protected override async Task HandleAsync() { ReqGetMainQuestData req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetMainQuestData response = new(); foreach (KeyValuePair item in user.MainQuestData) diff --git a/EpinelPS/LobbyServer/Trigger/TriggerSync.cs b/EpinelPS/LobbyServer/Trigger/TriggerSync.cs index 2904c1f..f1242ad 100644 --- a/EpinelPS/LobbyServer/Trigger/TriggerSync.cs +++ b/EpinelPS/LobbyServer/Trigger/TriggerSync.cs @@ -1,5 +1,4 @@ -using EpinelPS.Database; -using EpinelPS.Utils; +using EpinelPS.Utils; namespace EpinelPS.LobbyServer.Trigger { @@ -25,11 +24,11 @@ namespace EpinelPS.LobbyServer.Trigger Console.WriteLine("needs " + req.Seq); // Look for triggers past that amount - Database.Trigger[] newTriggers = [.. user.Triggers.Where(x => x.Id > req.Seq)]; + TriggerModel[] newTriggers = [.. user.Triggers.Where(x => x.Id > req.Seq)]; // Return all triggers int triggerCount = 0; - foreach (Database.Trigger? item in newTriggers) + foreach (TriggerModel item in newTriggers) { triggerCount++; diff --git a/EpinelPS/LobbyServer/Wallet/GetWallet.cs b/EpinelPS/LobbyServer/Wallet/GetWallet.cs index 9ff2feb..540649c 100644 --- a/EpinelPS/LobbyServer/Wallet/GetWallet.cs +++ b/EpinelPS/LobbyServer/Wallet/GetWallet.cs @@ -9,7 +9,7 @@ namespace EpinelPS.LobbyServer.Wallet protected override async Task HandleAsync() { ReqGetCurrencyData req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResGetCurrencyData response = new(); diff --git a/EpinelPS/LobbyServer/Wallet/WalletRefreshCharge.cs b/EpinelPS/LobbyServer/Wallet/WalletRefreshCharge.cs index 237167f..cf64a62 100644 --- a/EpinelPS/LobbyServer/Wallet/WalletRefreshCharge.cs +++ b/EpinelPS/LobbyServer/Wallet/WalletRefreshCharge.cs @@ -9,7 +9,7 @@ namespace EpinelPS.LobbyServer.Wallet protected override async Task HandleAsync() { ReqRefreshChargeCurrencyData req = await ReadData(); - Database.User user = GetUser(); + User user = GetUser(); ResRefreshChargeCurrencyData response = new() { diff --git a/EpinelPS/Models/CoreInfoModel.cs b/EpinelPS/Models/CoreInfoModel.cs new file mode 100644 index 0000000..02948f3 --- /dev/null +++ b/EpinelPS/Models/CoreInfoModel.cs @@ -0,0 +1,18 @@ +using EpinelPS.Utils; + +namespace EpinelPS.Models; +public class CoreInfo +{ + public int DbVersion = 3; + public List Users = []; + + public List LauncherAccessTokens = []; + public Dictionary AdminAuthTokens = []; + + public byte[] LauncherTokenKey = []; + public byte[] EncryptionTokenKey = []; + public LogType LogLevel = LogType.Debug; + + public int MaxInterceptionCount = 3; + public int ResetHourUtcTime = 20; +} \ No newline at end of file diff --git a/EpinelPS/Models/DbModels.cs b/EpinelPS/Models/DbModels.cs new file mode 100644 index 0000000..81a43a6 --- /dev/null +++ b/EpinelPS/Models/DbModels.cs @@ -0,0 +1,244 @@ +using System.Globalization; +using System.Text.Json; +using System.Text.Json.Serialization; +using EpinelPS.Data; +using EpinelPS.Utils; +using Google.Protobuf; +using Paseto; +using Paseto.Builder; + +namespace EpinelPS.Models +{ + public class AccessToken + { + public string Token = ""; + public long ExpirationTime; + public ulong UserID; + } + public class FieldInfo + { + public List CompletedStages = []; + public List CompletedObjects = []; + } + + public class FieldInfoNew + { + public List CompletedStages = []; + public List CompletedObjects = []; + public bool BossEntered = false; + } + + public class CharacterModel + { + public int Csn = 0; + public int Tid = 0; + public int CostumeId = 0; + public int Level = 1; + public int UltimateLevel = 1; + public int Skill1Lvl = 1; + public int Skill2Lvl = 1; + public int Grade = 0; + } + public class MainQuestData + { + public int TableId = 0; + public bool IsReceieved = false; + } + + public class UserPointData + { + public int UserLevel = 1; + public int ExperiencePoint = 0; + } + + public class ItemData + { + public int ItemType; + public long Csn; + public int Count; + public int Level; + public int Exp; + public int Position; + public int Corp; + public long Isn; + } + public class EventData + { + public List CompletedScenarios = []; + public int Diff = 0; // Default value for Diff + public int LastStage = 0; // Default value for LastStage + } + + public class SynchroSlot + { + /// + /// Index of slot, 1 based + /// + public int Slot; + /// + /// Character CSN + /// + public long CharacterSerialNumber; + /// + /// Time when slot cooldown expires + /// + public long AvailableAt; + } + public class RecycleRoomResearchProgress + { + public int Level = 1; + public int Exp; + public int Attack; + public int Defense; + public int Hp; + } + public class SimroomData + { + public int CurrentDifficulty; + public int CurrentChapter; + public bool Entered = false; + } + public class ResetableData + { + public int WipeoutCount = 0; + public bool ClearedSimulationRoom = false; + public int InterceptionTickets = 3; + public List CompletedDailyMissions = []; + public int DailyMissionPoints; + public SimroomData SimRoomData = new(); + } + public class WeeklyResetableData + { + public List CompletedWeeklyMissions = []; + public int WeeklyMissionPoints; + } + public class OutpostBuffs + { + public List CreditPercentages = []; + public List CoreDustPercentages = []; + public List BattleDataPercentages = []; + public List UserExpPercentages = []; + + public List GetPercentages(CurrencyType currency) + { + if (currency == CurrencyType.Gold) + return CreditPercentages; + else if (currency == CurrencyType.UserExp) + return UserExpPercentages; + else if (currency == CurrencyType.CharacterExp) + return BattleDataPercentages; + else if (currency == CurrencyType.CharacterExp2) + return CoreDustPercentages; + + throw new InvalidOperationException(); + } + public int GetTotalPercentages(CurrencyType currency) + { + int result = 0; + var numbs = GetPercentages(currency); + foreach (var item in numbs) + { + result += item; + } + + return result; + } + } + + public class JukeBoxSetting + { + public NetJukeboxLocation Location; + public NetJukeboxBgmType Type; + public int TableId; + } + + public class UnlockData + { + public bool ButtonAnimationPlayed = false; + public bool PopupAnimationPlayed = false; + + public UnlockData() { } + public UnlockData(bool button, bool popup) + { + ButtonAnimationPlayed = button; + PopupAnimationPlayed = popup; + } + } + + public class MogMinigameInfo + { + public List CompletedScenarios = []; + } + public class BadgeModel + { + public string Location = ""; + public long Seq; + public BadgeContents BadgeContent; + public string BadgeGuid = ""; + + public BadgeModel() { } + public BadgeModel(NetBadge badge) + { + Location = badge.Location; + Seq = badge.Seq; + BadgeContent = badge.BadgeContent; + BadgeGuid = new Guid([.. badge.BadgeGuid]).ToString(); + } + + public NetBadge ToNet() + { + return new NetBadge() + { + BadgeContent = BadgeContent, + BadgeGuid = ByteString.CopyFrom(new Guid(BadgeGuid).ToByteArray()), + Location = Location, + Seq = Seq + }; + } + } + + public class TriggerModel + { + public TriggerType Type; + public long Id; + public long CreatedAt; + public int ConditionId; + public int Value; + + public NetTrigger ToNet() + { + return new() + { + ConditionId = ConditionId, + CreatedAt = CreatedAt, + Seq = Id, + Trigger = (int)Type, + UserValue = Value + }; + } + } + public class ConversationChoice + { + + } + public class ConversationMessage + { + public string ConversationId { get; set; } = ""; + public long CreatedAt { get; set; } + public ulong Seq { get; set; } + public string Id { get; set; } = ""; + public int State { get; set; } + } + public class LostSectorData + { + public bool IsOpen { get; set; } + public bool IsPlaying { get; set; } + public string Json { get; set; } = ""; + public Dictionary Objects { get; set; } = []; + public Dictionary ClearedStages { get; set; } = []; + public List TeamPositions { get; set; } = []; + public int ObtainedRewards { get; set; } = 0; + public bool RecievedFinalReward { get; set; } + public bool CompletedPerfectly { get; set; } + } +} \ No newline at end of file diff --git a/EpinelPS/Models/UserModel.cs b/EpinelPS/Models/UserModel.cs new file mode 100644 index 0000000..df51ad7 --- /dev/null +++ b/EpinelPS/Models/UserModel.cs @@ -0,0 +1,396 @@ +using EpinelPS.Data; +using EpinelPS.Database; +using EpinelPS.Utils; + +namespace EpinelPS.Models; + +public class User +{ + // User info + public string? Username; + public string? Password; + public string? PlayerName; + public ulong ID; + public long RegisterTime; + public int LastNormalStageCleared; + public int LastHardStageCleared; + public string? Nickname; + public int ProfileIconId = 39900; + public bool ProfileIconIsPrism = false; + public int ProfileFrame = 25; + public bool IsAdmin = false; + public bool sickpulls = false; + public bool IsBanned = false; + public int TitleId = 1; + public DateTime BanStart; + public DateTime BanEnd; + public int BanId = 0; + public DateTime LastReset = DateTime.MinValue; + + // Game data + public List CompletedScenarios = []; + public Dictionary FieldInfo = []; // here for backwards compatibility + + public Dictionary FieldInfoNew = []; + public Dictionary MapJson = []; + public Dictionary Currency = new() { + { CurrencyType.ContentStamina, 2 } + }; + public List SynchroSlots = []; + public bool SynchroDeviceUpgraded = false; + public int SynchroDeviceLevel = 200; + public Dictionary ResearchProgress = []; + + public ResetableData ResetableData = new(); + public WeeklyResetableData WeeklyResetableData = new(); + public List Items = []; + public List Characters = []; + public long[] RepresentationTeamDataNew = []; + public Dictionary ClearedTutorialData = []; + + public NetWallpaperData[] WallpaperList = []; + public NetWallpaperBackground[] WallpaperBackground = []; + public NetWallpaperJukeboxFavorite[] WallpaperFavoriteList = []; + public NetWallpaperPlaylist[] WallpaperPlaylistList = []; + public NetWallpaperJukebox[] WallpaperJukeboxList = []; + public List LobbyDecoBackgroundList = []; + + + public Dictionary UserTeams = []; + public Dictionary MainQuestData = []; + public Dictionary SubQuestData = []; + public int InfraCoreExp = 0; + public int InfraCoreLvl = 1; + public UserPointData userPointData = new(); + public DateTime LastLogin = DateTime.UtcNow; + public DateTime BattleTime = DateTime.UtcNow; + + public NetOutpostBattleLevel OutpostBattleLevel = new() { Level = 1 }; + public int GachaTutorialPlayCount = 0; + public List CompletedTacticAcademyLessons = []; + public List CompletedSideStoryStages = []; + + public List Memorial = []; + public List JukeboxBgm = []; + + public Dictionary TowerProgress = []; + + public JukeBoxSetting LobbyMusic = new() { Location = NetJukeboxLocation.Lobby, TableId = 2, Type = NetJukeboxBgmType.JukeboxTableId }; + public JukeBoxSetting CommanderMusic = new() { Location = NetJukeboxLocation.CommanderRoom, TableId = 5, Type = NetJukeboxBgmType.JukeboxTableId }; + public OutpostBuffs OutpostBuffs = new(); + public Dictionary ContentsOpenUnlocked = []; + + public List StageClearHistorys = []; + + public List Badges = []; + + public List BondInfo = []; + public List Triggers = []; + public int LastTriggerId = 1; + public List CompletedAchievements = []; + public List MessengerData = []; + public ulong LastMessageId = 1; + public long LastBadgeSeq = 1; + public Dictionary LostSectorData = []; + + // Event data + public Dictionary EventInfo = []; + public MogMinigameInfo MogInfo = new(); + + public TriggerModel AddTrigger(TriggerType type, int value, int conditionId = 0) + { + TriggerModel t = new() + { + Id = LastTriggerId++, + Type = type, + ConditionId = conditionId, + CreatedAt = DateTime.UtcNow.AddHours(9).Ticks, + Value = value + }; + + Triggers.Add(t); + + return t; + } + + public BadgeModel AddBadge(BadgeContents type, string location) + { + // generate unique badge SEQ + + var badge = new BadgeModel() + { + BadgeContent = type, + Location = location, + BadgeGuid = Guid.NewGuid().ToString(), + Seq = LastBadgeSeq++ + }; + + Badges.Add(badge); + + return badge; + } + + + public void SetQuest(int tid, bool recievedReward) + { + if (!MainQuestData.TryAdd(tid, recievedReward)) + { + MainQuestData[tid] = recievedReward; + return; + } + } + + public void SetSubQuest(int tid, bool recievedReward) + { + if (!SubQuestData.TryAdd(tid, recievedReward)) + { + SubQuestData[tid] = recievedReward; + return; + } + } + + public int GenerateUniqueItemId() + { + var num = Rng.RandomId(); + + while (Items.Any(x => x.Isn == num)) + { + num = Rng.RandomId(); + } + + 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) + { + foreach (var item in FieldInfoNew) + { + if (item.Value.CompletedStages.Contains(id)) + { + return true; + } + } + + return false; + } + + public long GetCurrencyVal(CurrencyType type) + { + if (Currency.TryGetValue(type, out long value)) + return value; + else + { + Currency.Add(type, 0); + return 0; + } + } + public void AddCurrency(CurrencyType type, long val) + { + if (!Currency.TryAdd(type, val)) Currency[type] += val; + } + public bool SubtractCurrency(CurrencyType type, long val) + { + if (Currency.ContainsKey(type)) Currency[type] -= val; + else return false; + + if (Currency[type] < 0) + { + Currency[type] += val; + return false; + } + return true; + } + public bool CanSubtractCurrency(CurrencyType type, long val) + { + if (Currency.ContainsKey(type)) + { + if (Currency[type] >= val) return true; + else return false; + } + else + { + if (val == 0) return true; + else return false; + } + } + + public bool HasCharacter(int c) + { + // Step 1: Get the 'name_code' of the input character with Tid 'c' + if (GameData.Instance.CharacterTable.TryGetValue(c, out var inputCharacterRecord)) + { + int targetNameCode = inputCharacterRecord.name_code; + // Step 2: Find all character IDs in 'characterTable' that have the same 'name_code' + var matchingCharacterIds = GameData.Instance.CharacterTable.Where(kvp => kvp.Value.name_code == targetNameCode).Select(kvp => kvp.Key).ToHashSet(); + + // Step 3: Check if any of your owned characters have a 'Tid' in the set of matching IDs + return Characters.Any(ownedCharacter => matchingCharacterIds.Contains(ownedCharacter.Tid)); + + } + else + { // The character with Tid 'c' does not exist in 'characterTable' + return false; + } + } + + public CharacterModel? GetCharacter(int c) + { + // Step 1: Get the 'name_code' of the input character with Tid 'c' + if (GameData.Instance.CharacterTable.TryGetValue(c, out var inputCharacterRecord)) + { + int targetNameCode = inputCharacterRecord.name_code; + // Step 2: Find all character IDs in 'characterTable' that have the same 'name_code' + var matchingCharacterIds = GameData.Instance.CharacterTable.Where(kvp => kvp.Value.name_code == targetNameCode).Select(kvp => kvp.Key).ToHashSet(); + + // Step 3: Check if any of your owned characters have a 'Tid' in the set of matching IDs + return Characters.Where(ownedCharacter => matchingCharacterIds.Contains(ownedCharacter.Tid)).FirstOrDefault(); + + } + else + { // The character with Tid 'c' does not exist in 'characterTable' + return null; + } + } + + public CharacterModel? GetCharacterBySerialNumber(long value) + { + if (value == 0) return null; + return Characters.Where(x => x.Csn == value).FirstOrDefault(); + } + + internal bool GetSynchro(long csn) + { + return SynchroSlots.Where(x => x.CharacterSerialNumber == csn).Any(); + } + internal int GetCharacterLevel(int csn) + { + var c = GetCharacterBySerialNumber(csn) ?? throw new Exception("failed to lookup character"); + return GetCharacterLevel(csn, c.Level); + } + internal int GetCharacterLevel(int csn, int characterLevel) + { + foreach (var item in SynchroSlots) + { + if (item.CharacterSerialNumber == csn) + { + return GetSynchroLevel(); + } + } + return characterLevel; + } + internal int GetSynchroLevel() + { + if (SynchroDeviceUpgraded) + return SynchroDeviceLevel; + var highestLevelCharacters = Characters.OrderByDescending(x => x.Level).Take(5).ToList(); + + + if (highestLevelCharacters.Count > 0) + { + return highestLevelCharacters.Last().Level; + } + else + { + return 1; + } + } + + /// + /// Removes the specified amount of items by their ID. Returns the amount of items removed. + /// + /// + /// + /// + public int RemoveItemBySerialNumber(long isn, int count) + { + int removed = 0; + foreach (var item in Items.ToList()) + { + if (count == 0) + break; + + if (item.Isn == isn) + { + removed++; + item.Count -= count; + + if (item.Count < 0) + { + item.Count = 0; + } + } + } + + return removed; + } + + public NetMessage CreateMessage(MessengerDialogRecord r, int state = 0) + { + var msg = new NetMessage() + { + ConversationId = r.conversation_id, + CreatedAt = DateTime.UtcNow.Ticks, + MessageId = r.id, + Seq = (long)LastMessageId++, + State = state + }; + MessengerData.Add(msg); + return msg; + } + + public NetMessage CreateMessage(string conversationId, string messageId, int state = 0) + { + var msg = new NetMessage() + { + ConversationId = conversationId, + CreatedAt = DateTime.UtcNow.Ticks, + MessageId = messageId, + Seq = (long)LastMessageId++, + State = state + }; + MessengerData.Add(msg); + return msg; + } + + private bool ShouldResetUser() + { + var nowLocal = DateTime.UtcNow; + + // Compute the last reset threshold (most recent 2 PM before or at nowLocal) + DateTime todayResetTime = new( + nowLocal.Year, + nowLocal.Month, + nowLocal.Day, + JsonDb.Instance.ResetHourUtcTime, 0, 0 + ); + + if (nowLocal < todayResetTime) + { + todayResetTime = todayResetTime.AddDays(-1); + } + + // If user's last reset was before the last scheduled 2 PM, they need reset + return LastReset < todayResetTime; + } + + public void ResetDataIfNeeded() + { + if (!ShouldResetUser()) return; + + Logging.WriteLine("Resetting user...", LogType.Warning); + + LastReset = DateTime.UtcNow; + ResetableData = new(); + JsonDb.Save(); + } +} \ No newline at end of file diff --git a/EpinelPS/Utils/AdminCommands.cs b/EpinelPS/Utils/AdminCommands.cs index 78e42f1..a563ef4 100644 --- a/EpinelPS/Utils/AdminCommands.cs +++ b/EpinelPS/Utils/AdminCommands.cs @@ -162,7 +162,7 @@ namespace EpinelPS.Utils { if (!user.HasCharacter(character.id)) { - user.Characters.Add(new Database.Character() + user.Characters.Add(new CharacterModel() { CostumeId = 0, Csn = user.GenerateUniqueCharacterId(), @@ -232,7 +232,7 @@ namespace EpinelPS.Utils { if (!(inputGrade >= 0 && inputGrade <= 11)) return new RunCmdResponse() { error = "core level out of range, must be between 0-12" }; - foreach (Character character in user.Characters) + foreach (CharacterModel character in user.Characters) { // Get current character's Tid int tid = character.Tid; @@ -310,7 +310,7 @@ namespace EpinelPS.Utils public static RunCmdResponse SetCharacterLevel(User user, int level) { if (level > 999 || level <= 0) return new RunCmdResponse() { error = "level must be between 1-999" }; - foreach (Character character in user.Characters) + foreach (CharacterModel character in user.Characters) { character.Level = level; } @@ -322,7 +322,7 @@ namespace EpinelPS.Utils public static RunCmdResponse SetSkillLevel(User user, int skillLevel) { if (skillLevel > 10 || skillLevel < 0) return new RunCmdResponse() { error = "level must be between 1-10" }; - foreach (Character character in user.Characters) + foreach (CharacterModel character in user.Characters) { character.UltimateLevel = skillLevel; character.Skill1Lvl = skillLevel; @@ -337,7 +337,7 @@ namespace EpinelPS.Utils { if (!user.HasCharacter(characterId)) { - user.Characters.Add(new Database.Character() + user.Characters.Add(new CharacterModel() { CostumeId = 0, Csn = user.GenerateUniqueCharacterId(), diff --git a/EpinelPS/Utils/FormulaUtils.cs b/EpinelPS/Utils/FormulaUtils.cs index 2f530d2..8b158e9 100644 --- a/EpinelPS/Utils/FormulaUtils.cs +++ b/EpinelPS/Utils/FormulaUtils.cs @@ -4,9 +4,9 @@ namespace EpinelPS.Utils { public class FormulaUtils { - public static int CalculateCP(Database.User user, long csn) + public static int CalculateCP(User user, long csn) { - Database.Character? character = user.Characters.FirstOrDefault(c => c.Csn == csn); + CharacterModel? character = user.Characters.FirstOrDefault(c => c.Csn == csn); if (character == null) return 0; CharacterRecord? charRecord = GameData.Instance.CharacterTable.Values.FirstOrDefault(c => c.id == character.Tid); diff --git a/EpinelPS/Utils/NetUtils.cs b/EpinelPS/Utils/NetUtils.cs index 0824ad5..2073599 100644 --- a/EpinelPS/Utils/NetUtils.cs +++ b/EpinelPS/Utils/NetUtils.cs @@ -336,7 +336,7 @@ namespace EpinelPS.Utils NetWholeTeamSlot result = new(); - Character? c = user.GetCharacterBySerialNumber(csn); + CharacterModel? c = user.GetCharacterBySerialNumber(csn); if (c == null) return new() { Slot = slot }; return new NetWholeTeamSlot() diff --git a/EpinelPS/Views/Users/Delete.cshtml b/EpinelPS/Views/Users/Delete.cshtml index d3f5a19..aaa0ef2 100644 --- a/EpinelPS/Views/Users/Delete.cshtml +++ b/EpinelPS/Views/Users/Delete.cshtml @@ -1,4 +1,4 @@ -@model EpinelPS.Database.User +@model EpinelPS.Models.User @{ ViewData["Title"] = "Delete user"; diff --git a/EpinelPS/Views/Users/Index.cshtml b/EpinelPS/Views/Users/Index.cshtml index e4c035a..613d8b1 100644 --- a/EpinelPS/Views/Users/Index.cshtml +++ b/EpinelPS/Views/Users/Index.cshtml @@ -1,4 +1,4 @@ -@model IEnumerable +@model IEnumerable @{ ViewData["Title"] = "用户管理"; } diff --git a/EpinelPS/Views/Users/SetPassword.cshtml b/EpinelPS/Views/Users/SetPassword.cshtml index f562203..a395fc3 100644 --- a/EpinelPS/Views/Users/SetPassword.cshtml +++ b/EpinelPS/Views/Users/SetPassword.cshtml @@ -1,4 +1,4 @@ -@model EpinelPS.Database.User +@model EpinelPS.Models.User @{ ViewData["Title"] = "修改密码";