Fixed an issue where adding too many support cards could prevent users from logging in.

This commit is contained in:
Kei-Luna
2026-05-19 16:32:25 +09:00
parent 5a8e45a44c
commit 132355d76b
3 changed files with 51 additions and 5 deletions

View File

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

View File

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