Files
KianaBH3/KcpSharp/BasePacket.cs
2025-06-14 11:15:32 +08:00

67 lines
1.8 KiB
C#

using KianaBH.Util.Extensions;
using Google.Protobuf;
namespace KianaBH.KcpSharp;
public class BasePacket(ushort cmdId)
{
private const uint HEADER_CONST = 0x01234567;
private const uint TAIL_CONST = 0x89ABCDEF;
private uint HeadMagic { get; set; }
private ushort PacketVersion { get; set; } = 1;
private ushort ClientVersion { get; set; }
private uint PacketId { get; set; }
public uint UserId { get; set; }
private uint UserIp { get; set; }
private uint Sign { get; set; }
private ushort SignType { get; set; }
public ushort CmdId { get; set; } = cmdId;
private ushort HeaderLength { get; set; }
private uint BodyLength { get; set; }
private byte[] Header { get; set; } = [];
public byte[] Body { get; set; } = [];
private uint TailMagic { get; set; }
public void SetData(byte[] data)
{
Body = data;
}
public void SetData(IMessage message)
{
Body = message.ToByteArray();
}
public void SetData(string base64)
{
SetData(Convert.FromBase64String(base64));
}
public byte[] BuildPacket()
{
using MemoryStream? ms = new();
using BinaryWriter? bw = new(ms);
bw.WriteUInt32BE(HEADER_CONST);
bw.WriteUInt16BE(PacketVersion);
bw.WriteUInt16BE(ClientVersion);
bw.WriteUInt32BE(PacketId);
bw.WriteUInt32BE(UserId);
bw.WriteUInt32BE(UserIp);
bw.WriteUInt32BE(Sign);
bw.WriteUInt16BE(SignType);
bw.WriteUInt16BE(CmdId);
bw.WriteUInt16BE((ushort)(Header.Length));
bw.WriteUInt32BE((uint)(Body.Length));
bw.Write(Header.ToArray());
bw.Write(Body.ToArray());
bw.WriteUInt32BE(TAIL_CONST);
var packet = ms.ToArray();
return packet;
}
}