diff --git a/Common/Configuration/ConfigContainer.cs b/Common/Configuration/ConfigContainer.cs index 2d58ede5..6b7eb7aa 100644 --- a/Common/Configuration/ConfigContainer.cs +++ b/Common/Configuration/ConfigContainer.cs @@ -101,15 +101,23 @@ public class ServerAnnounce public class ServerProfile { - public string Name { get; set; } = "Server"; - public int Uid { get; set; } = 80; + public string Name { get; set; } = "StopWuyu"; + public int Uid { get; set; } = 5201314; public string Signature { get; set; } = "Type /help for a list of commands"; - public int Level { get; set; } = 1; + public int Level { get; set; } = 70; public int HeadIcon { get; set; } = 200105; public int ChatBubbleId { get; set; } = 220001; public int PersonalCardId { get; set; } = 253001; - public int DisplayAvatarId { get; set; } = 1001; - public int DisplayAvatarLevel { get; set; } = 1; + public List AssistInfo { get; set; } = [ + new() { AvatarId = 1213, Level = 80 } + ]; +} + +public class ServerAssistInfo +{ + public int AvatarId { get; set; } + public int Level { get; set; } + public int SkinId { get; set; } } public class MuipServerConfig diff --git a/Common/Database/Friend/FriendData.cs b/Common/Database/Friend/FriendData.cs index 8b48babe..7bf60697 100644 --- a/Common/Database/Friend/FriendData.cs +++ b/Common/Database/Friend/FriendData.cs @@ -5,7 +5,9 @@ namespace EggLink.DanhengServer.Database.Friend; [SugarTable("Friend")] public class FriendData : BaseDatabaseDataHelper { - [SugarColumn(IsJson = true)] public List FriendList { get; set; } = []; + + [SugarColumn(IsJson = true, ColumnDataType = "TEXT")] + public Dictionary FriendList { get; set; } = []; [SugarColumn(IsJson = true)] public List BlackList { get; set; } = []; @@ -17,6 +19,12 @@ public class FriendData : BaseDatabaseDataHelper public Dictionary ChatHistory { get; set; } = []; // key: friend uid } +public class FriendDetailData +{ + public bool IsMark { get; set; } + public string RemarkName { get; set; } = ""; +} + public class FriendChatHistory { public List MessageList { get; set; } = []; diff --git a/Common/Database/Player/PlayerData.cs b/Common/Database/Player/PlayerData.cs index 380e3b12..3666a2df 100644 --- a/Common/Database/Player/PlayerData.cs +++ b/Common/Database/Player/PlayerData.cs @@ -93,8 +93,6 @@ public class PlayerData : BaseDatabaseDataHelper if (!GameData.ChatBubbleConfigData.ContainsKey(ChatBubble)) // to avoid npe ChatBubble = 220000; - var instance = DatabaseHelper.Instance!.GetInstance(Uid)!; - var info = new PlayerSimpleInfo { Nickname = Name, @@ -110,14 +108,38 @@ public class PlayerData : BaseDatabaseDataHelper }; var pos = 0; - foreach (var avatar in instance.AssistAvatars.Select( - assist => instance.FormalAvatars.Find(x => x.AvatarId == assist)!)) - info.AssistSimpleInfoList.Add(new AssistSimpleInfo + var instance = DatabaseHelper.Instance!.GetInstance(Uid)!; + if (instance == null) + { + // Handle server profile + var serverProfile = ConfigManager.Config.ServerOption.ServerProfile; + if (Uid == serverProfile.Uid) { - AvatarId = (uint)avatar.AvatarId, - Level = (uint)avatar.Level, - Pos = (uint)pos++ - }); + info.OnlineStatus = FriendOnlineStatus.Online; + info.AssistSimpleInfoList.AddRange( + serverProfile.AssistInfo.Select((x, index) => + new AssistSimpleInfo + { + AvatarId = (uint)x.AvatarId, + Level = (uint)x.Level, + DressedSkinId = (uint)x.SkinId, + Pos = (uint)index + })); + } + + return info; + } + + foreach (var avatar in instance.AssistAvatars.Select( + assist => instance.FormalAvatars.Find(x => x.AvatarId == assist)!)) + if (avatar != null) + info.AssistSimpleInfoList.Add(new AssistSimpleInfo + { + AvatarId = (uint)avatar.AvatarId, + Level = (uint)avatar.Level, + DressedSkinId = (uint)avatar.GetCurPathInfo().Skin, + Pos = (uint)pos++ + }); return info; } @@ -135,6 +157,7 @@ public class PlayerData : BaseDatabaseDataHelper Platform = PlatformType.Pc, Uid = (uint)Uid, WorldLevel = (uint)WorldLevel, + EMOBIJBDKEI = true, // ShowDisplayAvatar RecordInfo = new PlayerRecordInfo(), PrivacySettings = new PrivacySettings() }; @@ -142,25 +165,36 @@ public class PlayerData : BaseDatabaseDataHelper var avatarInfo = DatabaseHelper.Instance!.GetInstance(Uid); var inventoryInfo = DatabaseHelper.Instance!.GetInstance(Uid); - if (avatarInfo == null || inventoryInfo == null) return info; + if (avatarInfo == null || inventoryInfo == null) + { + // Handle server profile + var serverProfile = ConfigManager.Config.ServerOption.ServerProfile; + if (Uid == serverProfile.Uid) + info.AssistAvatarList.AddRange( + serverProfile.AssistInfo.Select((x, index) => + new DisplayAvatarDetailInfo + { + AvatarId = (uint)x.AvatarId, + Level = (uint)x.Level, + DressedSkinId = (uint)x.SkinId, + Pos = (uint)index + })); + return info; + } var pos = 0; - foreach (var avatarId in avatarInfo.AssistAvatars) - { - var avatar = avatarInfo.FormalAvatars.Find(x => x.AvatarId == avatarId); + foreach (var avatar in avatarInfo.AssistAvatars.Select(assist => + avatarInfo.FormalAvatars.Find(x => x.AvatarId == assist))) if (avatar != null) info.AssistAvatarList.Add(avatar.ToDetailProto(pos++, - new PlayerDataCollection(this, inventoryInfo, new LineupInfo()))); - } + new PlayerDataCollection(this, inventoryInfo, new()))); pos = 0; foreach (var avatar in avatarInfo.DisplayAvatars.Select(display => - avatarInfo.FormalAvatars.Find(x => x.AvatarId == display))) - { + avatarInfo.FormalAvatars.Find(x => x.AvatarId == display))) if (avatar != null) info.DisplayAvatarList.Add(avatar.ToDetailProto(pos++, - new PlayerDataCollection(this, inventoryInfo, new LineupInfo()))); - } + new PlayerDataCollection(this, inventoryInfo, new()))); return info; } diff --git a/GameServer/Game/Friend/FriendManager.cs b/GameServer/Game/Friend/FriendManager.cs index 84324655..863395d8 100644 --- a/GameServer/Game/Friend/FriendManager.cs +++ b/GameServer/Game/Friend/FriendManager.cs @@ -6,6 +6,7 @@ using EggLink.DanhengServer.GameServer.Game.Player; using EggLink.DanhengServer.GameServer.Server; using EggLink.DanhengServer.GameServer.Server.Packet.Send.Chat; using EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; +using EggLink.DanhengServer.Kcp; using EggLink.DanhengServer.Proto; using EggLink.DanhengServer.Util; @@ -16,79 +17,109 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player) public FriendData FriendData { get; set; } = DatabaseHelper.Instance!.GetInstanceOrCreateNew(player.Uid); - public async ValueTask AddFriend(int targetUid) + 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.BlackList.Contains(targetUid)) return Retcode.RetFriendInBlacklist; + if (FriendData.SendApplyList.Contains(targetUid)) return Retcode.RetSucc; // Already send apply + var target = DatabaseHelper.Instance!.GetInstance(targetUid); - if (target == null) return; - - if (FriendData.FriendList.Contains(targetUid)) // already friend - return; - - if (FriendData.BlackList.Contains(targetUid)) // in black list - return; - - if (FriendData.SendApplyList.Contains(targetUid)) // already send apply - return; - - if (FriendData.ReceiveApplyList.Contains(targetUid)) // already receive apply - return; + if (target == null) return Retcode.RetFriendPlayerNotFound; + if (target.BlackList.Contains(Player.Uid)) return Retcode.RetFriendInTargetBlacklist; + if (target.ReceiveApplyList.Contains(targetUid)) return Retcode.RetSucc; // Already receive apply FriendData.SendApplyList.Add(targetUid); target.ReceiveApplyList.Add(Player.Uid); var targetPlayer = Listener.GetActiveConnection(targetUid); if (targetPlayer != null) - { await targetPlayer.SendPacket(new PacketSyncApplyFriendScNotify(Player.Data)); - targetPlayer.Player!.FriendManager!.FriendData.ReceiveApplyList.Add(Player.Uid); - } DatabaseHelper.ToSaveUidList.Add(targetUid); + return Retcode.RetSucc; } public async ValueTask ConfirmAddFriend(int targetUid) { - var target = DatabaseHelper.Instance!.GetInstance(targetUid); - if (target == null) return null; - - if (FriendData.FriendList.Contains(targetUid)) return null; - + if (targetUid == Player.Uid) return null; // Cannot add self + if (FriendData.FriendList.ContainsKey(targetUid)) return null; if (FriendData.BlackList.Contains(targetUid)) return null; - if (!FriendData.ReceiveApplyList.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.BlackList.Contains(Player.Uid)) return null; FriendData.ReceiveApplyList.Remove(targetUid); - FriendData.FriendList.Add(targetUid); - target.FriendList.Add(Player.Uid); + FriendData.FriendList.Add(targetUid, new()); target.SendApplyList.Remove(Player.Uid); + target.FriendList.Add(Player.Uid, new()); - var targetData = PlayerData.GetPlayerByUid(targetUid)!; var targetPlayer = Listener.GetActiveConnection(targetUid); if (targetPlayer != null) await targetPlayer.SendPacket(new PacketSyncHandleFriendScNotify((uint)Player.Uid, true, Player.Data)); - await Player.SendPacket(new PacketSyncHandleFriendScNotify((uint)targetData.Uid, true, targetData)); - + DatabaseHelper.ToSaveUidList.Add(targetUid); return targetData; } - public void RefuseAddFriend(int targetUid) + public async ValueTask RefuseAddFriend(int targetUid) { var target = DatabaseHelper.Instance!.GetInstance(targetUid); if (target == null) return; - if (!FriendData.ReceiveApplyList.Contains(targetUid)) return; - FriendData.ReceiveApplyList.Remove(targetUid); target.SendApplyList.Remove(Player.Uid); var targetPlayer = Listener.GetActiveConnection(targetUid); - targetPlayer?.Player!.FriendManager!.FriendData.SendApplyList.Remove(Player.Uid); + if (targetPlayer != null) + await targetPlayer.SendPacket(new PacketSyncHandleFriendScNotify((uint)Player.Uid, false, Player.Data)); + DatabaseHelper.ToSaveUidList.Add(targetUid); } - public void RemoveFriend() + public async ValueTask AddBlackList(int targetUid) { + var blackInfo = GetFriendPlayerData([targetUid]).First(); + var target = DatabaseHelper.Instance!.GetInstance(targetUid); + if (blackInfo == null || target == null) return null; + + FriendData.FriendList.Remove(targetUid); + target.FriendList.Remove(Player.Uid); + if (!FriendData.BlackList.Contains(targetUid)) + FriendData.BlackList.Add(targetUid); + + var targetPlayer = Listener.GetActiveConnection(targetUid); + if (targetPlayer != null) + await targetPlayer.SendPacket(new PacketSyncAddBlacklistScNotify(Player.Uid)); + + DatabaseHelper.ToSaveUidList.Add(targetUid); + return blackInfo; + } + + public void RemoveBlackList(int targetUid) + { + var target = DatabaseHelper.Instance!.GetInstance(targetUid); + if (target == null) return; + FriendData.BlackList.Remove(targetUid); + } + + public async ValueTask RemoveFriend(int targetUid) + { + var target = DatabaseHelper.Instance!.GetInstance(targetUid); + if (target == null) return null; + + FriendData.FriendList.Remove(targetUid); + target.FriendList.Remove(Player.Uid); + + var targetPlayer = Listener.GetActiveConnection(targetUid); + if (targetPlayer != null) + await targetPlayer.SendPacket(new PacketSyncDeleteFriendScNotify(Player.Uid)); + + DatabaseHelper.ToSaveUidList.Add(targetUid); + return targetUid; } public async ValueTask SendMessage(int sendUid, int recvUid, string? message = null, int? extraId = null) @@ -196,6 +227,16 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player) await Player.SendPacket(proto); } + public FriendDetailData? GetFriendDetailData(int uid) + { + if (uid == ConfigManager.Config.ServerOption.ServerProfile.Uid) + return new FriendDetailData { IsMark = true }; + + if (!FriendData.FriendList.TryGetValue(uid, out var friend)) return null; + + return friend; + } + public List GetHistoryInfo(int uid) { if (!FriendData.ChatHistory.TryGetValue(uid, out var history)) return []; @@ -217,17 +258,30 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player) return info; } - public List GetFriendList() + public List GetFriendPlayerData(List? uids = null) { - List list = []; + var list = new List(); + uids ??= [.. FriendData.FriendList.Keys]; - foreach (var friend in FriendData.FriendList) + foreach (var friend in uids) { var player = PlayerData.GetPlayerByUid(friend); - if (player != null) list.Add(player); } + var serverProfile = ConfigManager.Config.ServerOption.ServerProfile; + list.Add(new PlayerData + { + Uid = serverProfile.Uid, + HeadIcon = serverProfile.HeadIcon, + Signature = serverProfile.Signature, + Level = serverProfile.Level, + WorldLevel = 0, + Name = serverProfile.Name, + ChatBubble = serverProfile.ChatBubbleId, + PersonalCard = serverProfile.PersonalCardId + }); + return list; } @@ -273,41 +327,51 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player) return list; } + public List GetRandomFriend() + { + var list = new List(); + + foreach (var kcp in DanhengListener.Connections.Values) + { + if (kcp.State != SessionStateEnum.ACTIVE) continue; + if (kcp is not Connection connection) continue; + if (connection.Player?.Uid == Player.Uid) continue; + var data = connection.Player?.Data; + if (data == null) continue; + list.Add(data); + } + + return list.Take(20).ToList(); + } + + public void RemarkFriendName(int uid, string remarkName) + { + if (!FriendData.FriendList.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; + friend.IsMark = isMark; + } + public GetFriendListInfoScRsp ToProto() { var proto = new GetFriendListInfoScRsp(); - var serverProfile = ConfigManager.Config.ServerOption.ServerProfile; - - proto.FriendList.Add(new FriendSimpleInfo - { - PlayerInfo = new PlayerSimpleInfo - { - Uid = (uint)serverProfile.Uid, - HeadIcon = (uint)serverProfile.HeadIcon, - IsBanned = false, - Level = (uint)serverProfile.Level, - Nickname = serverProfile.Name, - ChatBubbleId = (uint)serverProfile.ChatBubbleId, - PersonalCard = (uint)serverProfile.PersonalCardId, - OnlineStatus = FriendOnlineStatus.Online, - Platform = PlatformType.Pc, - Signature = serverProfile.Signature - }, - IsMarked = false, - RemarkName = "" - }); - - foreach (var player in GetFriendList()) + foreach (var player in GetFriendPlayerData()) { var status = Listener.GetActiveConnection(player.Uid) == null ? FriendOnlineStatus.Offline : FriendOnlineStatus.Online; + var friend = GetFriendDetailData(player.Uid) ?? new(); + proto.FriendList.Add(new FriendSimpleInfo { PlayerInfo = player.ToSimpleProto(status), - IsMarked = false, - RemarkName = "" + IsMarked = friend.IsMark, + RemarkName = friend.RemarkName }); } diff --git a/GameServer/Server/Packet/Recv/Chat/HandlerGetChatFriendHistoryCsReq.cs b/GameServer/Server/Packet/Recv/Chat/HandlerGetChatFriendHistoryCsReq.cs index ba9e4cc3..06ab534b 100644 --- a/GameServer/Server/Packet/Recv/Chat/HandlerGetChatFriendHistoryCsReq.cs +++ b/GameServer/Server/Packet/Recv/Chat/HandlerGetChatFriendHistoryCsReq.cs @@ -1,4 +1,5 @@ -using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Chat; +using EggLink.DanhengServer.Kcp; namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Chat; @@ -7,6 +8,8 @@ public class HandlerGetChatFriendHistoryCsReq : Handler { public override async Task OnHandle(Connection connection, byte[] header, byte[] data) { - await connection.SendPacket(CmdIds.GetChatFriendHistoryScRsp); + var history = connection.Player!.FriendManager!.FriendData.ChatHistory; + + await connection.SendPacket(new PacketGetChatFriendHistoryScRsp(history)); } } \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Friend/HandlerAddBlacklistCsReq.cs b/GameServer/Server/Packet/Recv/Friend/HandlerAddBlacklistCsReq.cs new file mode 100644 index 00000000..236bf47c --- /dev/null +++ b/GameServer/Server/Packet/Recv/Friend/HandlerAddBlacklistCsReq.cs @@ -0,0 +1,21 @@ +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Friend; + +[Opcode(CmdIds.AddBlacklistCsReq)] +public class HandlerAddBlacklistCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var req = AddBlacklistCsReq.Parser.ParseFrom(data); + + var player = await connection.Player!.FriendManager!.AddBlackList((int)req.Uid); + + if (player != null) + await connection.SendPacket(new PacketAddBlacklistScRsp(player)); + else + await connection.SendPacket(new PacketAddBlacklistScRsp()); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Friend/HandlerApplyFriendCsReq.cs b/GameServer/Server/Packet/Recv/Friend/HandlerApplyFriendCsReq.cs index 48246b90..d4b72860 100644 --- a/GameServer/Server/Packet/Recv/Friend/HandlerApplyFriendCsReq.cs +++ b/GameServer/Server/Packet/Recv/Friend/HandlerApplyFriendCsReq.cs @@ -11,8 +11,8 @@ public class HandlerApplyFriendCsReq : Handler { var req = ApplyFriendCsReq.Parser.ParseFrom(data); - await connection.Player!.FriendManager!.AddFriend((int)req.Uid); + var ret = await connection.Player!.FriendManager!.AddFriend((int)req.Uid); - await connection.SendPacket(new PacketApplyFriendScRsp(req.Uid)); + await connection.SendPacket(new PacketApplyFriendScRsp(ret, req.Uid)); } } \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Friend/HandlerDeleteBlacklistCsReq.cs b/GameServer/Server/Packet/Recv/Friend/HandlerDeleteBlacklistCsReq.cs new file mode 100644 index 00000000..baad5de8 --- /dev/null +++ b/GameServer/Server/Packet/Recv/Friend/HandlerDeleteBlacklistCsReq.cs @@ -0,0 +1,18 @@ +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Friend; + +[Opcode(CmdIds.DeleteBlacklistCsReq)] +public class HandlerDeleteBlacklistCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var req = DeleteBlacklistCsReq.Parser.ParseFrom(data); + + connection.Player!.FriendManager!.RemoveBlackList((int)req.Uid); + + await connection.SendPacket(new PacketDeleteBlacklistScRsp(req.Uid)); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Friend/HandlerDeleteFriendCsReq.cs b/GameServer/Server/Packet/Recv/Friend/HandlerDeleteFriendCsReq.cs new file mode 100644 index 00000000..4b21ffdb --- /dev/null +++ b/GameServer/Server/Packet/Recv/Friend/HandlerDeleteFriendCsReq.cs @@ -0,0 +1,20 @@ +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Friend; + +[Opcode(CmdIds.DeleteFriendCsReq)] +public class HandlerDeleteFriendCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var req = DeleteFriendCsReq.Parser.ParseFrom(data); + + var uid = await connection.Player!.FriendManager!.RemoveFriend((int)req.Uid); + if (uid == null) + await connection.SendPacket(new PacketDeleteFriendScRsp()); + else + await connection.SendPacket(new PacketDeleteFriendScRsp((uint)uid)); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Friend/HandlerGetFriendLoginInfoCsReq.cs b/GameServer/Server/Packet/Recv/Friend/HandlerGetFriendLoginInfoCsReq.cs new file mode 100644 index 00000000..316a5234 --- /dev/null +++ b/GameServer/Server/Packet/Recv/Friend/HandlerGetFriendLoginInfoCsReq.cs @@ -0,0 +1,16 @@ +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; +using EggLink.DanhengServer.Kcp; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Friend; + +[Opcode(CmdIds.GetFriendLoginInfoCsReq)] +public class HandlerGetFriendLoginInfoCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var friends = connection.Player!.FriendManager! + .GetFriendPlayerData().Select(x => x.Uid).ToList(); + + await connection.SendPacket(new PacketGetFriendLoginInfoScRsp(friends)); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Friend/HandlerGetFriendRecommendListInfoCsReq.cs b/GameServer/Server/Packet/Recv/Friend/HandlerGetFriendRecommendListInfoCsReq.cs new file mode 100644 index 00000000..5f5be5ea --- /dev/null +++ b/GameServer/Server/Packet/Recv/Friend/HandlerGetFriendRecommendListInfoCsReq.cs @@ -0,0 +1,15 @@ +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; +using EggLink.DanhengServer.Kcp; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Friend; + +[Opcode(CmdIds.GetFriendRecommendListInfoCsReq)] +public class HandlerGetFriendRecommendListInfoCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var friends = connection.Player!.FriendManager!.GetRandomFriend(); + + await connection.SendPacket(new PacketGetFriendRecommendListInfoScRsp(friends)); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Friend/HandlerGetPlayerDetailInfoCsReq.cs b/GameServer/Server/Packet/Recv/Friend/HandlerGetPlayerDetailInfoCsReq.cs index 61013e36..f26a5874 100644 --- a/GameServer/Server/Packet/Recv/Friend/HandlerGetPlayerDetailInfoCsReq.cs +++ b/GameServer/Server/Packet/Recv/Friend/HandlerGetPlayerDetailInfoCsReq.cs @@ -1,8 +1,6 @@ -using EggLink.DanhengServer.Database.Player; -using EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; using EggLink.DanhengServer.Kcp; using EggLink.DanhengServer.Proto; -using EggLink.DanhengServer.Util; namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Friend; @@ -13,32 +11,13 @@ public class HandlerGetPlayerDetailInfoCsReq : Handler { var req = GetPlayerDetailInfoCsReq.Parser.ParseFrom(data); - var playerData = PlayerData.GetPlayerByUid(req.Uid); - + var playerData = connection.Player!.FriendManager!.GetFriendPlayerData([(int)req.Uid]).First(); if (playerData == null) { - var serverProfile = ConfigManager.Config.ServerOption.ServerProfile; - if (req.Uid == serverProfile.Uid) - { - playerData = new PlayerData - { - Uid = serverProfile.Uid, - HeadIcon = serverProfile.HeadIcon, - Signature = serverProfile.Signature, - Level = serverProfile.Level, - WorldLevel = 0, - Name = serverProfile.Name, - ChatBubble = serverProfile.ChatBubbleId, - PersonalCard = serverProfile.PersonalCardId - }; - } - else - { - await connection.SendPacket(new PacketGetPlayerDetailInfoScRsp()); - return; - } + await connection.SendPacket(new PacketGetPlayerDetailInfoScRsp()); + return; } - await connection.SendPacket(new PacketGetPlayerDetailInfoScRsp(playerData)); + await connection.SendPacket(new PacketGetPlayerDetailInfoScRsp(playerData.ToDetailProto())); } } \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Friend/HandlerHandleFriendCsReq.cs b/GameServer/Server/Packet/Recv/Friend/HandlerHandleFriendCsReq.cs index 5ccc8639..3f01e0ff 100644 --- a/GameServer/Server/Packet/Recv/Friend/HandlerHandleFriendCsReq.cs +++ b/GameServer/Server/Packet/Recv/Friend/HandlerHandleFriendCsReq.cs @@ -16,7 +16,7 @@ public class HandlerHandleFriendCsReq : Handler if (req.IsAccept) playerData = await connection.Player!.FriendManager!.ConfirmAddFriend((int)req.Uid); else - connection.Player!.FriendManager!.RefuseAddFriend((int)req.Uid); + await connection.Player!.FriendManager!.RefuseAddFriend((int)req.Uid); if (playerData != null) await connection.SendPacket(new PacketHandleFriendScRsp(req.Uid, req.IsAccept, playerData)); diff --git a/GameServer/Server/Packet/Recv/Friend/HandlerSearchPlayerCsReq.cs b/GameServer/Server/Packet/Recv/Friend/HandlerSearchPlayerCsReq.cs index 6b37d459..bdba0a70 100644 --- a/GameServer/Server/Packet/Recv/Friend/HandlerSearchPlayerCsReq.cs +++ b/GameServer/Server/Packet/Recv/Friend/HandlerSearchPlayerCsReq.cs @@ -15,7 +15,7 @@ public class HandlerSearchPlayerCsReq : Handler foreach (var uid in req.UidList) { - var player = PlayerData.GetPlayerByUid(uid); + var player = connection.Player!.FriendManager!.GetFriendPlayerData([(int)uid]).First(); if (player != null) playerList.Add(player); } diff --git a/GameServer/Server/Packet/Recv/Friend/HandlerSetFriendMarkCsReq.cs b/GameServer/Server/Packet/Recv/Friend/HandlerSetFriendMarkCsReq.cs new file mode 100644 index 00000000..5c6e09e8 --- /dev/null +++ b/GameServer/Server/Packet/Recv/Friend/HandlerSetFriendMarkCsReq.cs @@ -0,0 +1,18 @@ +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Friend; + +[Opcode(CmdIds.SetFriendMarkCsReq)] +public class HandlerSetFriendMarkCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var req = SetFriendMarkCsReq.Parser.ParseFrom(data); + + connection.Player!.FriendManager!.MarkFriend((int)req.Uid, req.ADJGKCOKOLN); + + await connection.SendPacket(new PacketSetFriendMarkScRsp(req.Uid, req.ADJGKCOKOLN)); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Friend/HandlerSetFriendRemarkNameCsReq.cs b/GameServer/Server/Packet/Recv/Friend/HandlerSetFriendRemarkNameCsReq.cs new file mode 100644 index 00000000..cb7917d2 --- /dev/null +++ b/GameServer/Server/Packet/Recv/Friend/HandlerSetFriendRemarkNameCsReq.cs @@ -0,0 +1,18 @@ +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Friend; + +[Opcode(CmdIds.SetFriendRemarkNameCsReq)] +public class HandlerSetFriendRemarkNameCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var req = SetFriendRemarkNameCsReq.Parser.ParseFrom(data); + + connection.Player!.FriendManager!.RemarkFriendName((int)req.Uid, req.RemarkName); + + await connection.SendPacket(new PacketSetFriendRemarkNameScRsp(req.Uid, req.RemarkName)); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/PlayerBoard/HandlerSetAssistAvatarCsReq.cs b/GameServer/Server/Packet/Recv/PlayerBoard/HandlerSetAssistAvatarCsReq.cs index 4f6fdb4b..3d05bbbe 100644 --- a/GameServer/Server/Packet/Recv/PlayerBoard/HandlerSetAssistAvatarCsReq.cs +++ b/GameServer/Server/Packet/Recv/PlayerBoard/HandlerSetAssistAvatarCsReq.cs @@ -16,7 +16,10 @@ public class HandlerSetAssistAvatarCsReq : Handler foreach (var id in req.AvatarIdList) { if (id == 0) continue; - avatars.Add((int)id); + + var avatarData = player.AvatarManager!.AvatarData.FormalAvatars.First(x => + x.BaseAvatarId == (int)id); + if (avatarData != null) avatars.Add(avatarData.AvatarId); } await connection.SendPacket(new PacketSetAssistAvatarScRsp(req.AvatarIdList)); diff --git a/GameServer/Server/Packet/Recv/PlayerBoard/HandlerSetDisplayAvatarCsReq.cs b/GameServer/Server/Packet/Recv/PlayerBoard/HandlerSetDisplayAvatarCsReq.cs index e3cce34d..8a889b30 100644 --- a/GameServer/Server/Packet/Recv/PlayerBoard/HandlerSetDisplayAvatarCsReq.cs +++ b/GameServer/Server/Packet/Recv/PlayerBoard/HandlerSetDisplayAvatarCsReq.cs @@ -13,10 +13,13 @@ public class HandlerSetDisplayAvatarCsReq : Handler var player = connection.Player!; var avatars = player.AvatarManager!.AvatarData!.DisplayAvatars; avatars.Clear(); - foreach (var id in req.DisplayAvatarList) + foreach (var avatar in req.DisplayAvatarList) { - if (id.AvatarId == 0) continue; - avatars.Add((int)id.AvatarId); + if (avatar.AvatarId == 0) continue; + + var avatarData = player.AvatarManager!.AvatarData.FormalAvatars.First(x => + x.BaseAvatarId == (int)avatar.AvatarId); + if (avatarData != null) avatars.Add(avatarData.AvatarId); } await connection.SendPacket(new PacketSetDisplayAvatarScRsp(req.DisplayAvatarList)); diff --git a/GameServer/Server/Packet/Send/Chat/PacketGetChatFriendHistoryScRsp.cs b/GameServer/Server/Packet/Send/Chat/PacketGetChatFriendHistoryScRsp.cs new file mode 100644 index 00000000..a233a397 --- /dev/null +++ b/GameServer/Server/Packet/Send/Chat/PacketGetChatFriendHistoryScRsp.cs @@ -0,0 +1,25 @@ +using EggLink.DanhengServer.Database.Friend; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Chat; + +public class PacketGetChatFriendHistoryScRsp : BasePacket +{ + public PacketGetChatFriendHistoryScRsp(Dictionary history) + : base(CmdIds.GetChatFriendHistoryScRsp) + { + var proto = new GetChatFriendHistoryScRsp(); + + foreach (var item in history) + { + proto.FriendHistoryInfo.Add(new FriendHistoryInfo + { + ContactSide = (uint)item.Key, + LastSendTime = item.Value.MessageList.Last().SendTime + }); + } + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Friend/PacketAddBlacklistScRsp.cs b/GameServer/Server/Packet/Send/Friend/PacketAddBlacklistScRsp.cs new file mode 100644 index 00000000..38d3b331 --- /dev/null +++ b/GameServer/Server/Packet/Send/Friend/PacketAddBlacklistScRsp.cs @@ -0,0 +1,29 @@ +using EggLink.DanhengServer.Database.Player; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; + +public class PacketAddBlacklistScRsp : BasePacket +{ + public PacketAddBlacklistScRsp() : base(CmdIds.AddBlacklistScRsp) + { + var proto = new AddBlacklistScRsp(); + + SetData(proto); + } + + public PacketAddBlacklistScRsp(PlayerData player) : base(CmdIds.AddBlacklistScRsp) + { + var status = Listener.GetActiveConnection(player.Uid) == null + ? FriendOnlineStatus.Offline + : FriendOnlineStatus.Online; + + var proto = new AddBlacklistScRsp + { + BlackInfo = player.ToSimpleProto(status) + }; + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Friend/PacketApplyFriendScRsp.cs b/GameServer/Server/Packet/Send/Friend/PacketApplyFriendScRsp.cs index 4303f383..0140c4ee 100644 --- a/GameServer/Server/Packet/Send/Friend/PacketApplyFriendScRsp.cs +++ b/GameServer/Server/Packet/Send/Friend/PacketApplyFriendScRsp.cs @@ -5,10 +5,11 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; public class PacketApplyFriendScRsp : BasePacket { - public PacketApplyFriendScRsp(uint uid) : base(CmdIds.ApplyFriendScRsp) + public PacketApplyFriendScRsp(Retcode ret, uint uid) : base(CmdIds.ApplyFriendScRsp) { var proto = new ApplyFriendScRsp { + Retcode = (uint)ret, Uid = uid }; diff --git a/GameServer/Server/Packet/Send/Friend/PacketDeleteBlacklistScRsp.cs b/GameServer/Server/Packet/Send/Friend/PacketDeleteBlacklistScRsp.cs new file mode 100644 index 00000000..65b867af --- /dev/null +++ b/GameServer/Server/Packet/Send/Friend/PacketDeleteBlacklistScRsp.cs @@ -0,0 +1,17 @@ +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; + +public class PacketDeleteBlacklistScRsp : BasePacket +{ + public PacketDeleteBlacklistScRsp(uint uid) : base(CmdIds.DeleteBlacklistScRsp) + { + var proto = new DeleteBlacklistScRsp + { + Uid = uid + }; + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Friend/PacketDeleteFriendScRsp.cs b/GameServer/Server/Packet/Send/Friend/PacketDeleteFriendScRsp.cs new file mode 100644 index 00000000..a22ebcf3 --- /dev/null +++ b/GameServer/Server/Packet/Send/Friend/PacketDeleteFriendScRsp.cs @@ -0,0 +1,24 @@ +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; + +public class PacketDeleteFriendScRsp : BasePacket +{ + public PacketDeleteFriendScRsp() : base(CmdIds.DeleteFriendScRsp) + { + var proto = new DeleteFriendScRsp(); + + SetData(proto); + } + + public PacketDeleteFriendScRsp(uint uid) : base(CmdIds.DeleteFriendScRsp) + { + var proto = new DeleteFriendScRsp + { + Uid = uid + }; + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Friend/PacketGetFriendLoginInfoScRsp.cs b/GameServer/Server/Packet/Send/Friend/PacketGetFriendLoginInfoScRsp.cs new file mode 100644 index 00000000..ef4a7e56 --- /dev/null +++ b/GameServer/Server/Packet/Send/Friend/PacketGetFriendLoginInfoScRsp.cs @@ -0,0 +1,17 @@ +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; + +public class PacketGetFriendLoginInfoScRsp : BasePacket +{ + public PacketGetFriendLoginInfoScRsp(List friends) : base(CmdIds.GetFriendLoginInfoScRsp) + { + var proto = new GetFriendLoginInfoScRsp + { + FriendUidList = { friends.Select(x => (uint)x) } + }; + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Friend/PacketGetFriendRecommendListInfoScRsp.cs b/GameServer/Server/Packet/Send/Friend/PacketGetFriendRecommendListInfoScRsp.cs new file mode 100644 index 00000000..822f3773 --- /dev/null +++ b/GameServer/Server/Packet/Send/Friend/PacketGetFriendRecommendListInfoScRsp.cs @@ -0,0 +1,22 @@ +using EggLink.DanhengServer.Database.Player; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; + +public class PacketGetFriendRecommendListInfoScRsp : BasePacket +{ + public PacketGetFriendRecommendListInfoScRsp(List friends) + : base(CmdIds.GetFriendRecommendListInfoScRsp) + { + var proto = new GetFriendRecommendListInfoScRsp + { + PlayerInfoList = { friends.Select(x => new FriendRecommendInfo + { + PlayerInfo = x.ToSimpleProto(FriendOnlineStatus.Online) + })} + }; + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Friend/PacketGetPlayerDetailInfoScRsp.cs b/GameServer/Server/Packet/Send/Friend/PacketGetPlayerDetailInfoScRsp.cs index 8ba00595..273a020d 100644 --- a/GameServer/Server/Packet/Send/Friend/PacketGetPlayerDetailInfoScRsp.cs +++ b/GameServer/Server/Packet/Send/Friend/PacketGetPlayerDetailInfoScRsp.cs @@ -1,16 +1,15 @@ -using EggLink.DanhengServer.Database.Player; -using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Kcp; using EggLink.DanhengServer.Proto; namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; public class PacketGetPlayerDetailInfoScRsp : BasePacket { - public PacketGetPlayerDetailInfoScRsp(PlayerData data) : base(CmdIds.GetPlayerDetailInfoScRsp) + public PacketGetPlayerDetailInfoScRsp(PlayerDetailInfo info) : base(CmdIds.GetPlayerDetailInfoScRsp) { var proto = new GetPlayerDetailInfoScRsp { - DetailInfo = data.ToDetailProto() + DetailInfo = info }; SetData(proto); diff --git a/GameServer/Server/Packet/Send/Friend/PacketHandleFriendScRsp.cs b/GameServer/Server/Packet/Send/Friend/PacketHandleFriendScRsp.cs index c5c531fa..7e47a0bd 100644 --- a/GameServer/Server/Packet/Send/Friend/PacketHandleFriendScRsp.cs +++ b/GameServer/Server/Packet/Send/Friend/PacketHandleFriendScRsp.cs @@ -28,8 +28,6 @@ public class PacketHandleFriendScRsp : BasePacket IsAccept = isAccept, FriendInfo = new FriendSimpleInfo { - IsMarked = false, - RemarkName = "", PlayerInfo = playerData.ToSimpleProto(status) } }; diff --git a/GameServer/Server/Packet/Send/Friend/PacketSetFriendMarkScRsp.cs b/GameServer/Server/Packet/Send/Friend/PacketSetFriendMarkScRsp.cs new file mode 100644 index 00000000..05b886e2 --- /dev/null +++ b/GameServer/Server/Packet/Send/Friend/PacketSetFriendMarkScRsp.cs @@ -0,0 +1,18 @@ +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; + +public class PacketSetFriendMarkScRsp : BasePacket +{ + public PacketSetFriendMarkScRsp(uint uid, bool isMark) : base(CmdIds.SetFriendMarkScRsp) + { + var proto = new SetFriendMarkScRsp + { + Uid = uid, + ADJGKCOKOLN = isMark + }; + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Friend/PacketSetFriendRemarkNameScRsp.cs b/GameServer/Server/Packet/Send/Friend/PacketSetFriendRemarkNameScRsp.cs new file mode 100644 index 00000000..1bea1e20 --- /dev/null +++ b/GameServer/Server/Packet/Send/Friend/PacketSetFriendRemarkNameScRsp.cs @@ -0,0 +1,19 @@ +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; + +public class PacketSetFriendRemarkNameScRsp : BasePacket +{ + public PacketSetFriendRemarkNameScRsp(uint uid, string remarkName) + : base(CmdIds.SetFriendRemarkNameScRsp) + { + var proto = new SetFriendRemarkNameScRsp + { + Uid = uid, + RemarkName = remarkName + }; + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Friend/PacketSyncAddBlacklistScNotify.cs b/GameServer/Server/Packet/Send/Friend/PacketSyncAddBlacklistScNotify.cs new file mode 100644 index 00000000..c8a9bfdc --- /dev/null +++ b/GameServer/Server/Packet/Send/Friend/PacketSyncAddBlacklistScNotify.cs @@ -0,0 +1,18 @@ +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; + +public class PacketSyncAddBlacklistScNotify : BasePacket +{ + public PacketSyncAddBlacklistScNotify(int uid) + : base(CmdIds.SyncAddBlacklistScNotify) + { + var proto = new SyncAddBlacklistScNotify + { + Uid = (uint)uid + }; + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Friend/PacketSyncDeleteFriendScNotify.cs b/GameServer/Server/Packet/Send/Friend/PacketSyncDeleteFriendScNotify.cs new file mode 100644 index 00000000..3e457a65 --- /dev/null +++ b/GameServer/Server/Packet/Send/Friend/PacketSyncDeleteFriendScNotify.cs @@ -0,0 +1,18 @@ +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend; + +public class PacketSyncDeleteFriendScNotify : BasePacket +{ + public PacketSyncDeleteFriendScNotify(int uid) + : base(CmdIds.SyncDeleteFriendScNotify) + { + var proto = new SyncDeleteFriendScNotify + { + Uid = (uint)uid + }; + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Friend/PacketSyncHandleFriendScNotify.cs b/GameServer/Server/Packet/Send/Friend/PacketSyncHandleFriendScNotify.cs index bbdcb803..bbb42cb4 100644 --- a/GameServer/Server/Packet/Send/Friend/PacketSyncHandleFriendScNotify.cs +++ b/GameServer/Server/Packet/Send/Friend/PacketSyncHandleFriendScNotify.cs @@ -18,8 +18,6 @@ public class PacketSyncHandleFriendScNotify : BasePacket IsAccept = isAccept, FriendInfo = new FriendSimpleInfo { - IsMarked = false, - RemarkName = "", PlayerInfo = playerData.ToSimpleProto(status) } };