From 4ee9fd6908d572c7f2832e05402078c48694d0b5 Mon Sep 17 00:00:00 2001 From: Naruse <71993948+DevilProMT@users.noreply.github.com> Date: Mon, 27 Apr 2026 00:40:08 +0800 Subject: [PATCH] add chat command --- Common/Configuration/ConfigContainer.cs | 7 ++- Common/Database/Player/PlayerGameData.cs | 14 +++++ GameServer/Command/CommandSender.cs | 13 ++++- GameServer/Game/Player/PlayerInstance.cs | 52 ++++++++++++++++++- .../Recv/Friend/HandlerReqFriendChat.cs | 19 +++++++ .../Packet/Recv/Login/HandlerReqLogin.cs | 2 + .../Send/Friend/PacketNtfUpdateFriend.cs | 18 +++++++ 7 files changed, 121 insertions(+), 4 deletions(-) create mode 100644 GameServer/Server/Packet/Recv/Friend/HandlerReqFriendChat.cs create mode 100644 GameServer/Server/Packet/Send/Friend/PacketNtfUpdateFriend.cs diff --git a/Common/Configuration/ConfigContainer.cs b/Common/Configuration/ConfigContainer.cs index 7746237..f2fc369 100644 --- a/Common/Configuration/ConfigContainer.cs +++ b/Common/Configuration/ConfigContainer.cs @@ -1,4 +1,6 @@ -namespace MikuSB.Configuration; +using MikuSB.Proto; + +namespace MikuSB.Configuration; public class ConfigContainer { @@ -74,7 +76,10 @@ public class ServerOption public class ServerProfile { public string Name { get; set; } = "Miku-chan"; + public string Signature { get; set; } = "SnowBreak Private Server"; public int Uid { get; set; } = 80; + public int Level { get; set; } = 100; + public Sex Gender { get; set; } = Sex.Female; } public class ProxyOptions diff --git a/Common/Database/Player/PlayerGameData.cs b/Common/Database/Player/PlayerGameData.cs index 86bb7fc..b8f3f56 100644 --- a/Common/Database/Player/PlayerGameData.cs +++ b/Common/Database/Player/PlayerGameData.cs @@ -23,6 +23,20 @@ public class PlayerGameData : BaseDatabaseDataHelper var result = DatabaseHelper.GetInstance((int)uid); return result; } + + public PlayerProfile ToProfileProto() + { + var proto = new PlayerProfile + { + Pid = (uint)Uid, + Account = Name, + Name = Name, + Level = Level, + Sex = Gender, + Sign = Signature, + }; + return proto; + } } diff --git a/GameServer/Command/CommandSender.cs b/GameServer/Command/CommandSender.cs index eba40ac..0486421 100644 --- a/GameServer/Command/CommandSender.cs +++ b/GameServer/Command/CommandSender.cs @@ -1,6 +1,8 @@ using MikuSB.Enums.Player; using MikuSB.GameServer.Game.Player; +using MikuSB.Proto; using MikuSB.Util; +using MikuSB.Util.Extensions; namespace MikuSB.GameServer.Command; @@ -31,7 +33,16 @@ public class PlayerCommandSender(PlayerInstance player) : ICommandSender public async ValueTask SendMsg(string msg) { - // TODO + var data = new ChatMsg + { + Type = ChatType.Friend, + Sender = (uint)ConfigManager.Config.ServerOption.ServerProfile.Uid, + Recver = (uint)Player.Uid, + Text = msg, + Profile = Player.ToServerFriendProto(), + TimeStamp = (uint)Extensions.GetUnixMs() + }; + await Player.SendPacket(CmdIds.NtfFriendChat, data); } public int GetSender() diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index 62c89cd..7048af9 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -1,13 +1,17 @@ -using MikuSB.Data; +using Google.Protobuf; +using MikuSB.Data; using MikuSB.Database; using MikuSB.Database.Account; using MikuSB.Database.Player; using MikuSB.Enums.Item; +using MikuSB.GameServer.Command; using MikuSB.GameServer.Game.Character; using MikuSB.GameServer.Game.Inventory; -using MikuSB.GameServer.Server; using MikuSB.GameServer.Game.Lineup; +using MikuSB.GameServer.Server; +using MikuSB.Proto; using MikuSB.TcpSharp; +using MikuSB.Util; using MikuSB.Util.Extensions; namespace MikuSB.GameServer.Game.Player; @@ -148,6 +152,10 @@ public class PlayerInstance(PlayerGameData data) { if (Connection?.IsOnline == true) await Connection.SendPacket(packet); } + public async ValueTask SendPacket(int cmdId, IMessage msg) + { + if (Connection?.IsOnline == true) await Connection.SendPacket(cmdId,msg); + } #endregion @@ -158,10 +166,50 @@ public class PlayerInstance(PlayerGameData data) await Task.CompletedTask; } + public async ValueTask ReceiveMessage(uint sendUid, uint recvUid, string? message = null, uint? emojiId = null) + { + var data = new ChatMsg + { + Type = ChatType.Friend, + Sender = sendUid, + Recver = recvUid, + Emoji = emojiId ?? 0, + Text = message ?? "", + Profile = Data.ToProfileProto(), + TimeStamp = (uint)Extensions.GetUnixMs() + }; + + await SendPacket(CmdIds.NtfFriendChat, data); + + if (recvUid == ConfigManager.Config.ServerOption.ServerProfile.Uid) + { + if (message != null) + { + if (message.StartsWith("/")) message = message[1..].Trim(); + CommandExecutor.ExecuteCommand(new PlayerCommandSender(this), message); + } + } + } + #endregion #region Serialization + public PlayerProfile ToServerFriendProto() + { + var server = ConfigManager.Config.ServerOption.ServerProfile; + var proto = new PlayerProfile + { + Pid = (uint)server.Uid, + Account = server.Name, + Name = server.Name, + Sex = server.Gender, + Level = (uint)server.Level, + Sign = server.Signature + }; + return proto; + } + public Proto.Player ToPlayerProto() { var proto = new Proto.Player diff --git a/GameServer/Server/Packet/Recv/Friend/HandlerReqFriendChat.cs b/GameServer/Server/Packet/Recv/Friend/HandlerReqFriendChat.cs new file mode 100644 index 0000000..5e21093 --- /dev/null +++ b/GameServer/Server/Packet/Recv/Friend/HandlerReqFriendChat.cs @@ -0,0 +1,19 @@ +using Google.Protobuf; +using MikuSB.Proto; +using MikuSB.Util; + +namespace MikuSB.GameServer.Server.Packet.Recv.Friend; + +[Opcode(CmdIds.ReqFriendChat)] +public class HandlerReqFriendChat : Handler +{ + public override async Task OnHandle(Connection connection, byte[] data, ushort seqNo) + { + var req = ChatMsg.Parser.ParseFrom(data); + var json = JsonFormatter.Default.Format(req); + Logger.GetByClassName().Debug($"{json}"); + + await connection.Player!.ReceiveMessage((uint)connection.Player!.Uid, (uint)req.Recver, req.Text, (uint)req.Emoji); + await connection.SendPacket(CmdIds.RspFriendChat); + } +} diff --git a/GameServer/Server/Packet/Recv/Login/HandlerReqLogin.cs b/GameServer/Server/Packet/Recv/Login/HandlerReqLogin.cs index eb0bc37..6b27288 100644 --- a/GameServer/Server/Packet/Recv/Login/HandlerReqLogin.cs +++ b/GameServer/Server/Packet/Recv/Login/HandlerReqLogin.cs @@ -3,6 +3,7 @@ using MikuSB.Database; using MikuSB.Database.Account; using MikuSB.Database.Player; using MikuSB.GameServer.Game.Player; +using MikuSB.GameServer.Server.Packet.Send.Friend; using MikuSB.GameServer.Server.Packet.Send.Login; using MikuSB.Proto; using MikuSB.TcpSharp; @@ -47,5 +48,6 @@ public class HandlerReqLogin : Handler connection.Player.Connection = connection; await connection.SendPacket(new PacketRspLogin(connection.Player!)); await connection.Player.OnHeartBeat(); + await connection.SendPacket(new PacketNtfUpdateFriend(connection.Player!)); } } diff --git a/GameServer/Server/Packet/Send/Friend/PacketNtfUpdateFriend.cs b/GameServer/Server/Packet/Send/Friend/PacketNtfUpdateFriend.cs new file mode 100644 index 0000000..304e319 --- /dev/null +++ b/GameServer/Server/Packet/Send/Friend/PacketNtfUpdateFriend.cs @@ -0,0 +1,18 @@ +using MikuSB.GameServer.Game.Player; +using MikuSB.TcpSharp; +using MikuSB.Proto; + +namespace MikuSB.GameServer.Server.Packet.Send.Friend; + +public class PacketNtfUpdateFriend : BasePacket +{ + public PacketNtfUpdateFriend(PlayerInstance player) : base(CmdIds.NtfUpdateFriend) + { + var proto = new PlayerProfileArray + { + List = { player.ToServerFriendProto() } + }; + + SetData(proto); + } +}