diff --git a/Common/Database/CustomSerializeService.cs b/Common/Database/CustomSerializeService.cs index 9e0aefca..ca16a4bf 100644 --- a/Common/Database/CustomSerializeService.cs +++ b/Common/Database/CustomSerializeService.cs @@ -1,4 +1,5 @@ -using Newtonsoft.Json; +using EggLink.DanhengServer.Util; +using Newtonsoft.Json; using SqlSugar; namespace EggLink.DanhengServer.Database; @@ -11,7 +12,8 @@ public class CustomSerializeService : ISerializeService { _jsonSettings = new JsonSerializerSettings { - DefaultValueHandling = DefaultValueHandling.Ignore // ignore default values + DefaultValueHandling = DefaultValueHandling.Ignore, // ignore default values + ObjectCreationHandling = ObjectCreationHandling.Replace }; } @@ -22,7 +24,25 @@ public class CustomSerializeService : ISerializeService public T DeserializeObject(string value) { - return JsonConvert.DeserializeObject(value)!; + try + { + var clazz = JsonConvert.DeserializeObject(value)!; + return clazz; + } + catch + { + // try to create empty instance + try + { + Logger.GetByClassName().Warn("Error occured when load database, resetting the mistake value"); + var inst = Activator.CreateInstance(); + return inst; + } + catch + { + return default!; + } + } } public string SugarSerializeObject(object value) diff --git a/Common/Database/Friend/FriendData.cs b/Common/Database/Friend/FriendData.cs index 7bf60697..993f6ae0 100644 --- a/Common/Database/Friend/FriendData.cs +++ b/Common/Database/Friend/FriendData.cs @@ -7,7 +7,11 @@ public class FriendData : BaseDatabaseDataHelper { [SugarColumn(IsJson = true, ColumnDataType = "TEXT")] - public Dictionary FriendList { get; set; } = []; + public Dictionary FriendDetailList { get; set; } = []; + + + [SugarColumn(IsJson = true, ColumnDataType = "TEXT")] + public List FriendList { get; set; } = []; // leave for compatibility [SugarColumn(IsJson = true)] public List BlackList { get; set; } = []; diff --git a/Common/Database/Lineup/LineupData.cs b/Common/Database/Lineup/LineupData.cs index 05d8926c..48fa792c 100644 --- a/Common/Database/Lineup/LineupData.cs +++ b/Common/Database/Lineup/LineupData.cs @@ -1,4 +1,5 @@ -using EggLink.DanhengServer.Data; +using System.ComponentModel; +using EggLink.DanhengServer.Data; using EggLink.DanhengServer.Database.Avatar; using EggLink.DanhengServer.Database.Quests; using EggLink.DanhengServer.Proto; @@ -27,7 +28,7 @@ public class LineupInfo public int LineupType { get; set; } public int LeaderAvatarId { get; set; } public List? BaseAvatars { get; set; } - public int Mp { get; set; } = 5; + [DefaultValue(5)] public int Mp { get; set; } = 5; [JsonIgnore] public LineupData? LineupData { get; set; } diff --git a/Common/Util/ConfigManager.cs b/Common/Util/ConfigManager.cs index f4976205..2bb51dd3 100644 --- a/Common/Util/ConfigManager.cs +++ b/Common/Util/ConfigManager.cs @@ -44,7 +44,10 @@ public static class ConfigManager using (var reader = new StreamReader(stream)) { var json = reader.ReadToEnd(); - Config = JsonConvert.DeserializeObject(json)!; + Config = JsonConvert.DeserializeObject(json, new JsonSerializerSettings + { + ObjectCreationHandling = ObjectCreationHandling.Replace + })!; } SaveData(Config, ConfigFilePath); diff --git a/GameServer/Game/Friend/FriendManager.cs b/GameServer/Game/Friend/FriendManager.cs index 863395d8..fe08d316 100644 --- a/GameServer/Game/Friend/FriendManager.cs +++ b/GameServer/Game/Friend/FriendManager.cs @@ -20,7 +20,7 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player) public async ValueTask AddFriend(int targetUid) { if (targetUid == Player.Uid) return Retcode.RetSucc; // Cannot add self - if (FriendData.FriendList.ContainsKey(targetUid)) return Retcode.RetFriendAlreadyIsFriend; + if (FriendData.FriendDetailList.ContainsKey(targetUid)) return Retcode.RetFriendAlreadyIsFriend; if (FriendData.BlackList.Contains(targetUid)) return Retcode.RetFriendInBlacklist; if (FriendData.SendApplyList.Contains(targetUid)) return Retcode.RetSucc; // Already send apply @@ -43,19 +43,19 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player) public async ValueTask ConfirmAddFriend(int targetUid) { if (targetUid == Player.Uid) return null; // Cannot add self - if (FriendData.FriendList.ContainsKey(targetUid)) return null; + if (FriendData.FriendDetailList.ContainsKey(targetUid)) return null; if (FriendData.BlackList.Contains(targetUid)) return null; var target = DatabaseHelper.Instance!.GetInstance(targetUid); var targetData = PlayerData.GetPlayerByUid(targetUid); if (target == null || targetData == null) return null; - if (target.FriendList.ContainsKey(Player.Uid)) return null; + if (target.FriendDetailList.ContainsKey(Player.Uid)) return null; if (target.BlackList.Contains(Player.Uid)) return null; FriendData.ReceiveApplyList.Remove(targetUid); - FriendData.FriendList.Add(targetUid, new()); + FriendData.FriendDetailList.Add(targetUid, new()); target.SendApplyList.Remove(Player.Uid); - target.FriendList.Add(Player.Uid, new()); + target.FriendDetailList.Add(Player.Uid, new()); var targetPlayer = Listener.GetActiveConnection(targetUid); if (targetPlayer != null) @@ -86,8 +86,8 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player) var target = DatabaseHelper.Instance!.GetInstance(targetUid); if (blackInfo == null || target == null) return null; - FriendData.FriendList.Remove(targetUid); - target.FriendList.Remove(Player.Uid); + FriendData.FriendDetailList.Remove(targetUid); + target.FriendDetailList.Remove(Player.Uid); if (!FriendData.BlackList.Contains(targetUid)) FriendData.BlackList.Add(targetUid); @@ -111,8 +111,8 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player) var target = DatabaseHelper.Instance!.GetInstance(targetUid); if (target == null) return null; - FriendData.FriendList.Remove(targetUid); - target.FriendList.Remove(Player.Uid); + FriendData.FriendDetailList.Remove(targetUid); + target.FriendDetailList.Remove(Player.Uid); var targetPlayer = Listener.GetActiveConnection(targetUid); if (targetPlayer != null) @@ -232,7 +232,7 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player) if (uid == ConfigManager.Config.ServerOption.ServerProfile.Uid) return new FriendDetailData { IsMark = true }; - if (!FriendData.FriendList.TryGetValue(uid, out var friend)) return null; + if (!FriendData.FriendDetailList.TryGetValue(uid, out var friend)) return null; return friend; } @@ -261,7 +261,7 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player) public List GetFriendPlayerData(List? uids = null) { var list = new List(); - uids ??= [.. FriendData.FriendList.Keys]; + uids ??= [.. FriendData.FriendDetailList.Keys]; foreach (var friend in uids) { @@ -346,13 +346,13 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player) public void RemarkFriendName(int uid, string remarkName) { - if (!FriendData.FriendList.TryGetValue(uid, out var friend)) return; + if (!FriendData.FriendDetailList.TryGetValue(uid, out var friend)) return; friend.RemarkName = remarkName; } public void MarkFriend(int uid, bool isMark) { - if (!FriendData.FriendList.TryGetValue(uid, out var friend)) return; + if (!FriendData.FriendDetailList.TryGetValue(uid, out var friend)) return; friend.IsMark = isMark; }