feat: implement friend system

This commit is contained in:
letheriver2007
2025-05-09 08:45:58 +08:00
parent b5e599a4f0
commit e002350ad4
32 changed files with 562 additions and 131 deletions

View File

@@ -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<ServerAssistInfo> 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

View File

@@ -5,7 +5,9 @@ namespace EggLink.DanhengServer.Database.Friend;
[SugarTable("Friend")]
public class FriendData : BaseDatabaseDataHelper
{
[SugarColumn(IsJson = true)] public List<int> FriendList { get; set; } = [];
[SugarColumn(IsJson = true, ColumnDataType = "TEXT")]
public Dictionary<int, FriendDetailData> FriendList { get; set; } = [];
[SugarColumn(IsJson = true)] public List<int> BlackList { get; set; } = [];
@@ -17,6 +19,12 @@ public class FriendData : BaseDatabaseDataHelper
public Dictionary<int, FriendChatHistory> ChatHistory { get; set; } = []; // key: friend uid
}
public class FriendDetailData
{
public bool IsMark { get; set; }
public string RemarkName { get; set; } = "";
}
public class FriendChatHistory
{
public List<FriendChatData> MessageList { get; set; } = [];

View File

@@ -93,8 +93,6 @@ public class PlayerData : BaseDatabaseDataHelper
if (!GameData.ChatBubbleConfigData.ContainsKey(ChatBubble)) // to avoid npe
ChatBubble = 220000;
var instance = DatabaseHelper.Instance!.GetInstance<AvatarData>(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<AvatarData>(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<AvatarData>(Uid);
var inventoryInfo = DatabaseHelper.Instance!.GetInstance<InventoryData>(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;
}

View File

@@ -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<FriendData>(player.Uid);
public async ValueTask AddFriend(int targetUid)
public async ValueTask<Retcode> 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<FriendData>(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<PlayerData?> ConfirmAddFriend(int targetUid)
{
var target = DatabaseHelper.Instance!.GetInstance<FriendData>(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<FriendData>(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<FriendData>(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<PlayerData?> AddBlackList(int targetUid)
{
var blackInfo = GetFriendPlayerData([targetUid]).First();
var target = DatabaseHelper.Instance!.GetInstance<FriendData>(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<FriendData>(targetUid);
if (target == null) return;
FriendData.BlackList.Remove(targetUid);
}
public async ValueTask<int?> RemoveFriend(int targetUid)
{
var target = DatabaseHelper.Instance!.GetInstance<FriendData>(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<ChatMessageData> 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<PlayerData> GetFriendList()
public List<PlayerData> GetFriendPlayerData(List<int>? uids = null)
{
List<PlayerData> list = [];
var list = new List<PlayerData>();
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<PlayerData> GetRandomFriend()
{
var list = new List<PlayerData>();
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
});
}

View File

@@ -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));
}
}

View File

@@ -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());
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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()));
}
}

View File

@@ -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));

View File

@@ -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);
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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));

View File

@@ -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));

View File

@@ -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<int, FriendChatHistory> 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);
}
}

View File

@@ -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);
}
}

View File

@@ -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
};

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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<int> friends) : base(CmdIds.GetFriendLoginInfoScRsp)
{
var proto = new GetFriendLoginInfoScRsp
{
FriendUidList = { friends.Select(x => (uint)x) }
};
SetData(proto);
}
}

View File

@@ -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<PlayerData> friends)
: base(CmdIds.GetFriendRecommendListInfoScRsp)
{
var proto = new GetFriendRecommendListInfoScRsp
{
PlayerInfoList = { friends.Select(x => new FriendRecommendInfo
{
PlayerInfo = x.ToSimpleProto(FriendOnlineStatus.Online)
})}
};
SetData(proto);
}
}

View File

@@ -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);

View File

@@ -28,8 +28,6 @@ public class PacketHandleFriendScRsp : BasePacket
IsAccept = isAccept,
FriendInfo = new FriendSimpleInfo
{
IsMarked = false,
RemarkName = "",
PlayerInfo = playerData.ToSimpleProto(status)
}
};

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -18,8 +18,6 @@ public class PacketSyncHandleFriendScNotify : BasePacket
IsAccept = isAccept,
FriendInfo = new FriendSimpleInfo
{
IsMarked = false,
RemarkName = "",
PlayerInfo = playerData.ToSimpleProto(status)
}
};