add chat command

This commit is contained in:
Naruse
2026-04-27 00:40:08 +08:00
parent 9c67e36ca3
commit 4ee9fd6908
7 changed files with 121 additions and 4 deletions

View File

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

View File

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

View File

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

View File

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

View File

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