From abb6b51deac34ffb7f5bbeadbb35723ba4c2f97c Mon Sep 17 00:00:00 2001 From: Kei-Luna Date: Sun, 26 Apr 2026 14:33:41 +0900 Subject: [PATCH] The character displayed on the lobby screen can now be changed. PlayerSetting_ChangeShowCard --- Common/Database/Player/PlayerGameData.cs | 1 + GameServer/Game/Player/PlayerInstance.cs | 13 ++++++ .../Misc/PlayerSetting_ChangeShowCard.cs | 41 +++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 GameServer/Server/CallGS/Handlers/Misc/PlayerSetting_ChangeShowCard.cs diff --git a/Common/Database/Player/PlayerGameData.cs b/Common/Database/Player/PlayerGameData.cs index 8ee097d..2566f9d 100644 --- a/Common/Database/Player/PlayerGameData.cs +++ b/Common/Database/Player/PlayerGameData.cs @@ -15,6 +15,7 @@ public class PlayerGameData : BaseDatabaseDataHelper public long LastActiveTime { get; set; } public Sex Gender { get; set; } = Sex.Female; [SugarColumn(IsJson = true)] public List Attrs { get; set; } = []; + [SugarColumn(IsJson = true)] public List ShowItems { get; set; } = []; public static PlayerGameData? GetPlayerByUid(long uid) { diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index d63c58b..893fbd0 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -188,9 +188,22 @@ public class PlayerInstance(PlayerGameData data) proto.Attrs[ToShiftedAttrKey(gid, sid)] = val; } + proto.ShowItems.AddRange(Data.ShowItems); + return proto; } + public void SetShowItem(int index, ulong itemId) + { + if (index <= 0) + return; + + while (Data.ShowItems.Count < index) + Data.ShowItems.Add(0); + + Data.ShowItems[index - 1] = itemId; + } + private static uint ToPackedAttrKey(uint gid, uint sid) { if (gid == 0) diff --git a/GameServer/Server/CallGS/Handlers/Misc/PlayerSetting_ChangeShowCard.cs b/GameServer/Server/CallGS/Handlers/Misc/PlayerSetting_ChangeShowCard.cs new file mode 100644 index 0000000..1c2957f --- /dev/null +++ b/GameServer/Server/CallGS/Handlers/Misc/PlayerSetting_ChangeShowCard.cs @@ -0,0 +1,41 @@ +using MikuSB.Database; +using MikuSB.Proto; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace MikuSB.GameServer.Server.CallGS.Handlers.Misc; + +[CallGSApi("PlayerSetting_ChangeShowCard")] +public class PlayerSetting_ChangeShowCard : ICallGSHandler +{ + private const int ShowItemGirlIndex = 4; + + public async Task Handle(Connection connection, string param, ushort seqNo) + { + var player = connection.Player!; + var req = JsonSerializer.Deserialize(param); + if (req == null) + return; + + var card = player.CharacterManager.GetCharacterByGUID(req.Id); + if (card == null) + { + await CallGSRouter.SendScript(connection, "PlayerSetting_ChangeShowCard", "{}"); + return; + } + + player.SetShowItem(ShowItemGirlIndex, card.Guid); + DatabaseHelper.SaveDatabaseType(player.Data); + + var sync = new NtfSyncPlayer(); + sync.ShowItems.AddRange(player.Data.ShowItems); + + await CallGSRouter.SendScript(connection, "PlayerSetting_ChangeShowCard", "{}", sync); + } +} + +internal sealed class ChangeShowCardParam +{ + [JsonPropertyName("nID")] + public uint Id { get; set; } +}