diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index 6a66e54..7fc72f0 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -196,7 +196,7 @@ public class PlayerInstance(PlayerGameData data) return proto; } - public Proto.Player ToPlayerProto() + public Proto.Player ToPlayerProto(bool includeSupportCards = true) { BuildPlayerAttr(); var displayName = PlayerGameData.NormalizeDisplayName(Data.Name); @@ -217,7 +217,10 @@ public class PlayerInstance(PlayerGameData data) foreach (var item in InventoryManager.InventoryData.Items.Values) proto.Items.Add(item.ToProto()); foreach (var skin in InventoryManager.InventoryData.Skins.Values) proto.Items.Add(skin.ToProto()); foreach (var weapon in InventoryManager.InventoryData.Weapons.Values) proto.Items.Add(weapon.ToProto()); - foreach (var card in InventoryManager.InventoryData.SupportCards.Values) proto.Items.Add(card.ToProto()); + if (includeSupportCards) + { + foreach (var card in InventoryManager.InventoryData.SupportCards.Values) proto.Items.Add(card.ToProto()); + } foreach (var x in Data.Attrs) { uint gid = x.Gid; diff --git a/GameServer/Server/Packet/Recv/Login/HandlerReqLogin.cs b/GameServer/Server/Packet/Recv/Login/HandlerReqLogin.cs index 5f719ce..c889609 100644 --- a/GameServer/Server/Packet/Recv/Login/HandlerReqLogin.cs +++ b/GameServer/Server/Packet/Recv/Login/HandlerReqLogin.cs @@ -21,6 +21,7 @@ namespace MikuSB.GameServer.Server.Packet.Recv.Login; public class HandlerReqLogin : Handler { private static readonly Logger Logger = new("ReqLogin"); + private const int SupportCardLoginSplitThreshold = 2000; private static string? ExtractSdkAuthToken(string? token) { @@ -80,7 +81,10 @@ public class HandlerReqLogin : Handler $"Debug-{DateTime.Now:yyyy-MM-dd HH-mm-ss}.log"); await connection.Player.OnEnterGame(); connection.Player.Connection = connection; - await connection.SendPacket(new PacketRspLogin(connection.Player!)); + var splitSupportCards = connection.Player.InventoryManager.InventoryData.SupportCards.Count > SupportCardLoginSplitThreshold; + await connection.SendPacket(new PacketRspLogin(connection.Player!, !splitSupportCards)); + if (splitSupportCards) + await SendSupportCardsOnLogin(connection); await connection.SendPacket(new PacketNtfCallScript(connection.Player!)); await SendDebugLoginState(connection); @@ -90,6 +94,22 @@ public class HandlerReqLogin : Handler await SendGirlSkinTypeOnLogin(connection); } + private static async Task SendSupportCardsOnLogin(Connection connection) + { + var player = connection.Player; + if (player == null) + return; + + var supportCards = player.InventoryManager.InventoryData.SupportCards.Values.ToList(); + Logger.Info($"Split support card sync on login: total={supportCards.Count}, chunkSize={SupportCardLoginSplitThreshold}"); + + foreach (var chunk in supportCards.Chunk(SupportCardLoginSplitThreshold)) + { + var packet = new PacketNtfCallScript(chunk.ToList()); + await connection.SendPacket(packet); + } + } + private static void ApplySavedGirlSkinTypes(PlayerInstance player) { var inventoryData = player.InventoryManager.InventoryData; diff --git a/GameServer/Server/Packet/Send/Login/PacketRspLogin.cs b/GameServer/Server/Packet/Send/Login/PacketRspLogin.cs index c3bec83..45805bc 100644 --- a/GameServer/Server/Packet/Send/Login/PacketRspLogin.cs +++ b/GameServer/Server/Packet/Send/Login/PacketRspLogin.cs @@ -10,18 +10,41 @@ public class PacketRspLogin : BasePacket { private static readonly Logger Logger = new("RspLogin"); - public PacketRspLogin(PlayerInstance player) : base(CmdIds.RspLogin) + public PacketRspLogin(PlayerInstance player, bool includeSupportCards = true) : base(CmdIds.RspLogin) { + var characterCount = player.CharacterManager.CharacterData.Characters.Count; + var itemCount = player.InventoryManager.InventoryData.Items.Count; + var skinCount = player.InventoryManager.InventoryData.Skins.Count; + var weaponCount = player.InventoryManager.InventoryData.Weapons.Count; + var supportCardCount = player.InventoryManager.InventoryData.SupportCards.Count; + var attrCount = player.Data.Attrs.Count; + var strAttrCount = player.Data.StrAttrs.Count; + var showItemCount = player.Data.ShowItems.Count; + var proto = new RspLogin { Timestamp = (uint)Extensions.GetUnixSec(), WorldChannel = 1, AreaId = 1, - Data = player.ToPlayerProto(), + Data = player.ToPlayerProto(includeSupportCards), NeedRename = false }; var bytes = Google.Protobuf.MessageExtensions.ToByteArray(proto); + Logger.Info( + "RspLogin content: " + + $"characters={characterCount}, " + + $"items={itemCount}, " + + $"skins={skinCount}, " + + $"weapons={weaponCount}, " + + $"supportCards={supportCardCount}, " + + $"supportCardsInRspLogin={(includeSupportCards ? supportCardCount : 0)}, " + + $"attrs={attrCount}, " + + $"strAttrs={strAttrCount}, " + + $"showItems={showItemCount}, " + + $"protoItems={proto.Data.Items.Count}, " + + $"protoAttrs={proto.Data.Attrs.Count}, " + + $"protoStrAttrs={proto.Data.StrAttrs.Count}"); Logger.Info($"RspLogin proto size: {bytes.Length} bytes"); SetData(bytes);