From 41d9992efc92181d0a3a357267ad8a4fb89e1b4b Mon Sep 17 00:00:00 2001 From: Naruse <71993948+DevilProMT@users.noreply.github.com> Date: Mon, 20 Apr 2026 16:18:43 +0800 Subject: [PATCH] can enter 1st story quest --- Common/Database/Player/PlayerGameData.cs | 57 ++++++++++++++++++- .../Packet/Recv/Player/HandlerNtfSetAttr.cs | 27 +++++++++ .../Packet/Recv/Player/HandlerReqRename.cs | 12 ++++ .../Packet/Send/Login/PacketRspLogin.cs | 8 +-- Proto/CmdIds.cs | 4 +- 5 files changed, 96 insertions(+), 12 deletions(-) create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerNtfSetAttr.cs create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerReqRename.cs diff --git a/Common/Database/Player/PlayerGameData.cs b/Common/Database/Player/PlayerGameData.cs index c3c39e9..7decd6d 100644 --- a/Common/Database/Player/PlayerGameData.cs +++ b/Common/Database/Player/PlayerGameData.cs @@ -1,6 +1,4 @@ -using MikuSB.Common.Util; -using MikuSB.Proto; -using MikuSB.Util.Extensions; +using MikuSB.Util.Extensions; using SqlSugar; namespace MikuSB.Database.Player; @@ -14,10 +12,63 @@ public class PlayerGameData : BaseDatabaseDataHelper public int Exp { get; set; } = 0; public long RegisterTime { get; set; } = Extensions.GetUnixSec(); public long LastActiveTime { get; set; } + [SugarColumn(IsJson = true)] public List Attrs { get; set; } = []; public static PlayerGameData? GetPlayerByUid(long uid) { var result = DatabaseHelper.GetInstance((int)uid); return result; } + + public Proto.Player ToProto() + { + var proto = new Proto.Player + { + Pid = (ulong)Uid, + Account = Name, + Name = Name, + Level = Level, + }; + + foreach (var x in Attrs) + { + uint gid = x.Gid; + uint sid = x.Sid; + uint val = x.Val; + + if (gid == 0) + { + proto.Attrs[sid] = val; + continue; + } + + proto.Attrs[ToPackedAttrKey(gid, sid)] = val; + proto.Attrs[ToShiftedAttrKey(gid, sid)] = val; + } + + return proto; + } + + private static uint ToPackedAttrKey(uint gid, uint sid) + { + if (gid == 0) + return sid; + + return (gid * 10000) + sid; + } + + private static uint ToShiftedAttrKey(uint gid, uint sid) + { + if (gid == 0) + return sid; + + return (gid << 16) | sid; + } +} + +public class PlayerAttrs +{ + public uint Gid { get; set; } + public uint Sid { get; set; } + public uint Val { get; set; } } \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Player/HandlerNtfSetAttr.cs b/GameServer/Server/Packet/Recv/Player/HandlerNtfSetAttr.cs new file mode 100644 index 0000000..dbda7ac --- /dev/null +++ b/GameServer/Server/Packet/Recv/Player/HandlerNtfSetAttr.cs @@ -0,0 +1,27 @@ +using MikuSB.Database.Player; +using MikuSB.Proto; + +namespace MikuSB.GameServer.Server.Packet.Recv.Login; + +[Opcode(CmdIds.NtfSetAttr)] +public class HandlerNtfSetAttr : Handler +{ + public override async Task OnHandle(Connection connection, byte[] data, ushort seqNo) + { + var req = NtfSetAttr.Parser.ParseFrom(data); + var player = connection.Player!; + var attr = player.Data.Attrs + .FirstOrDefault(x => x.Gid == req.Gid && x.Sid == req.Sid); + if (attr != null) attr.Val = req.Val; + else + { + player.Data.Attrs.Add(new PlayerAttrs + { + Gid = req.Gid, + Sid = req.Sid, + Val = req.Val + }); + } + await player.OnHeartBeat(); + } +} diff --git a/GameServer/Server/Packet/Recv/Player/HandlerReqRename.cs b/GameServer/Server/Packet/Recv/Player/HandlerReqRename.cs new file mode 100644 index 0000000..8bb2440 --- /dev/null +++ b/GameServer/Server/Packet/Recv/Player/HandlerReqRename.cs @@ -0,0 +1,12 @@ +using MikuSB.Proto; + +namespace MikuSB.GameServer.Server.Packet.Recv.Login; + +[Opcode(CmdIds.ReqRename)] +public class HandlerReqRename : Handler +{ + public override async Task OnHandle(Connection connection, byte[] data, ushort seqNo) + { + await connection.SendPacket(CmdIds.RspRename); + } +} diff --git a/GameServer/Server/Packet/Send/Login/PacketRspLogin.cs b/GameServer/Server/Packet/Send/Login/PacketRspLogin.cs index 4524bba..b683285 100644 --- a/GameServer/Server/Packet/Send/Login/PacketRspLogin.cs +++ b/GameServer/Server/Packet/Send/Login/PacketRspLogin.cs @@ -14,13 +14,7 @@ public class PacketRspLogin : BasePacket Timestamp = (uint)Extensions.GetUnixSec(), WorldChannel = 1, AreaId = 1, - Data = new Player - { - Pid = (ulong)player.Data.Uid, - Account = player.Data.Name, - Name = player.Data.Name, - Level = 80 - }, + Data = player.Data.ToProto(), NeedRename = false }; diff --git a/Proto/CmdIds.cs b/Proto/CmdIds.cs index c613a23..3c31a3e 100644 --- a/Proto/CmdIds.cs +++ b/Proto/CmdIds.cs @@ -9,8 +9,8 @@ public class CmdIds public const int RspReconnect = 4; public const int ReqRename = 5; public const int RspRename = 6; - public const int ReqCallGs = 7; - public const int RspCallGs = 8; + public const int ReqCallGS = 7; + public const int RspCallGS = 8; public const int ReqUseItem = 9; public const int RspUseItem = 10; public const int ReqReadMail = 11;