diff --git a/Common/Database/Player/ServerPrefsData.cs b/Common/Database/Player/ServerPrefsData.cs new file mode 100644 index 00000000..ecc9b6e0 --- /dev/null +++ b/Common/Database/Player/ServerPrefsData.cs @@ -0,0 +1,33 @@ +using EggLink.DanhengServer.Proto; +using Google.Protobuf; +using SqlSugar; + +namespace EggLink.DanhengServer.Database.Player; + +[SugarTable("server_prefs_data")] +public class ServerPrefsData : BaseDatabaseDataHelper +{ + [SugarColumn(IsJson = true)] + public Dictionary ServerPrefsDict { get; set; } = []; + + public void SetData(int prefsId, string b64Data) + { + ServerPrefsDict[prefsId] = new ServerPrefsInfo() + { + ServerPrefsId = prefsId, + Data = b64Data + }; + } +} + +public class ServerPrefsInfo +{ + public int ServerPrefsId { get; set; } + public string Data { get; set; } = ""; + + public ServerPrefs ToProto() => new() + { + Data = ByteString.FromBase64(Data), + ServerPrefsId = (uint)ServerPrefsId + }; +} \ No newline at end of file diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index 95e7ccca..04661c81 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -76,6 +76,7 @@ public class PlayerInstance(PlayerData data) public HeartDialData? HeartDialData { get; private set; } public TutorialData? TutorialData { get; private set; } public TutorialGuideData? TutorialGuideData { get; private set; } + public ServerPrefsData? ServerPrefsData { get; private set; } public SceneInstance? SceneInstance { get; private set; } public int Uid { get; set; } public Connection? Connection { get; set; } @@ -148,6 +149,8 @@ public class PlayerInstance(PlayerData data) HeartDialData = InitializeDatabase(); TutorialData = InitializeDatabase(); TutorialGuideData = InitializeDatabase(); + ServerPrefsData = InitializeDatabase(); + Data.LastActiveTime = Extensions.GetUnixSec(); diff --git a/GameServer/Server/Packet/Recv/ServerPrefs/HandlerGetAllServerPrefsDataCsReq.cs b/GameServer/Server/Packet/Recv/ServerPrefs/HandlerGetAllServerPrefsDataCsReq.cs new file mode 100644 index 00000000..c6e223e5 --- /dev/null +++ b/GameServer/Server/Packet/Recv/ServerPrefs/HandlerGetAllServerPrefsDataCsReq.cs @@ -0,0 +1,14 @@ +using EggLink.DanhengServer.GameServer.Server.Packet.Send.ServerPrefs; +using EggLink.DanhengServer.Kcp; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.ServerPrefs; + +[Opcode(CmdIds.GetAllServerPrefsDataCsReq)] +public class HandlerGetAllServerPrefsDataCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var infos = connection.Player?.ServerPrefsData?.ServerPrefsDict.Values.ToList() ?? []; + await connection.SendPacket(new PacketGetAllServerPrefsDataScRsp(infos)); + } +} diff --git a/GameServer/Server/Packet/Recv/ServerPrefs/HandlerGetServerPrefsDataCsReq.cs b/GameServer/Server/Packet/Recv/ServerPrefs/HandlerGetServerPrefsDataCsReq.cs new file mode 100644 index 00000000..a4e5172b --- /dev/null +++ b/GameServer/Server/Packet/Recv/ServerPrefs/HandlerGetServerPrefsDataCsReq.cs @@ -0,0 +1,18 @@ +using EggLink.DanhengServer.GameServer.Server.Packet.Send.ServerPrefs; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.ServerPrefs; + +[Opcode(CmdIds.GetServerPrefsDataCsReq)] +public class HandlerGetServerPrefsDataCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var req = GetServerPrefsDataCsReq.Parser.ParseFrom(data); + + var info = connection.Player!.ServerPrefsData?.ServerPrefsDict.GetValueOrDefault((int)req.ServerPrefsId); + + await connection.SendPacket(new PacketGetServerPrefsDataScRsp(info, req.ServerPrefsId)); + } +} diff --git a/GameServer/Server/Packet/Recv/ServerPrefs/HandlerUpdateServerPrefsDataCsReq.cs b/GameServer/Server/Packet/Recv/ServerPrefs/HandlerUpdateServerPrefsDataCsReq.cs new file mode 100644 index 00000000..28e7b0cc --- /dev/null +++ b/GameServer/Server/Packet/Recv/ServerPrefs/HandlerUpdateServerPrefsDataCsReq.cs @@ -0,0 +1,17 @@ +using EggLink.DanhengServer.GameServer.Server.Packet.Send.ServerPrefs; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.ServerPrefs; + +[Opcode(CmdIds.UpdateServerPrefsDataCsReq)] +public class HandlerUpdateServerPrefsDataCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var req = UpdateServerPrefsDataCsReq.Parser.ParseFrom(data); + + connection.Player?.ServerPrefsData?.SetData((int)req.ServerPrefs.ServerPrefsId, req.ServerPrefs.Data.ToBase64()); + await connection.SendPacket(new PacketUpdateServerPrefsDataScRsp(req.ServerPrefs.ServerPrefsId)); + } +} diff --git a/GameServer/Server/Packet/Send/ServerPrefs/PacketGetAllServerPrefsDataScRsp.cs b/GameServer/Server/Packet/Send/ServerPrefs/PacketGetAllServerPrefsDataScRsp.cs new file mode 100644 index 00000000..9c70fa64 --- /dev/null +++ b/GameServer/Server/Packet/Send/ServerPrefs/PacketGetAllServerPrefsDataScRsp.cs @@ -0,0 +1,20 @@ +using EggLink.DanhengServer.Database.Player; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.ServerPrefs; + +public class PacketGetAllServerPrefsDataScRsp : BasePacket +{ + public PacketGetAllServerPrefsDataScRsp(List infos) : base(CmdIds.GetAllServerPrefsDataScRsp) + { + var proto = new GetAllServerPrefsDataScRsp(); + + foreach (var info in infos) + { + proto.CFHMFEBMJIK.Add(info.ToProto()); + } + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/ServerPrefs/PacketGetServerPrefsDataScRsp.cs b/GameServer/Server/Packet/Send/ServerPrefs/PacketGetServerPrefsDataScRsp.cs new file mode 100644 index 00000000..379d007b --- /dev/null +++ b/GameServer/Server/Packet/Send/ServerPrefs/PacketGetServerPrefsDataScRsp.cs @@ -0,0 +1,23 @@ +using EggLink.DanhengServer.Database.Player; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; +using Google.Protobuf; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.ServerPrefs; + +public class PacketGetServerPrefsDataScRsp : BasePacket +{ + public PacketGetServerPrefsDataScRsp(ServerPrefsInfo? info, uint id) : base(CmdIds.GetServerPrefsDataScRsp) + { + var proto = new GetServerPrefsDataScRsp + { + ServerPrefs = info?.ToProto() ?? new Proto.ServerPrefs() + { + Data = ByteString.Empty, + ServerPrefsId = id + } + }; + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/ServerPrefs/PacketUpdateServerPrefsDataScRsp.cs b/GameServer/Server/Packet/Send/ServerPrefs/PacketUpdateServerPrefsDataScRsp.cs new file mode 100644 index 00000000..3f92b6c0 --- /dev/null +++ b/GameServer/Server/Packet/Send/ServerPrefs/PacketUpdateServerPrefsDataScRsp.cs @@ -0,0 +1,17 @@ +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.ServerPrefs; + +public class PacketUpdateServerPrefsDataScRsp : BasePacket +{ + public PacketUpdateServerPrefsDataScRsp(uint prefsId) : base(CmdIds.UpdateServerPrefsDataScRsp) + { + var proto = new UpdateServerPrefsDataScRsp + { + ServerPrefsId = prefsId + }; + + SetData(proto); + } +} \ No newline at end of file