From f4692a771d4eada6e649751bfad6052aedcb708e Mon Sep 17 00:00:00 2001 From: Naruse <71993948+DevilProMT@users.noreply.github.com> Date: Sun, 26 Apr 2026 10:48:29 +0800 Subject: [PATCH] some changes - girl favorite - immediately read new item - save database on request login --- Common/Database/Character/CharacterData.cs | 7 ++-- Common/Database/Inventory/InventoryData.cs | 11 +++-- Common/Enums/Item/ItemFlagEnum.cs | 13 ++++++ GameServer/Game/Character/CharacterManager.cs | 1 + GameServer/Game/Inventory/InventoryManager.cs | 2 + GameServer/Game/Player/PlayerInstance.cs | 20 +--------- .../CallGS/Handlers/Daily/Daily_EnterLevel.cs | 15 +++++++ .../Handlers/Girl/GirlCard_SetRoleLikeFlag.cs | 40 +++++++++++++++++++ .../CallGS/Handlers/Girl/GirlSkin_Change.cs | 2 +- .../Handlers/Girl/GirlSkin_ChangeSkinType.cs | 30 ++++++++++++++ .../Packet/Recv/Login/HandlerReqLogin.cs | 1 + 11 files changed, 116 insertions(+), 26 deletions(-) create mode 100644 Common/Enums/Item/ItemFlagEnum.cs create mode 100644 GameServer/Server/CallGS/Handlers/Daily/Daily_EnterLevel.cs create mode 100644 GameServer/Server/CallGS/Handlers/Girl/GirlCard_SetRoleLikeFlag.cs create mode 100644 GameServer/Server/CallGS/Handlers/Girl/GirlSkin_ChangeSkinType.cs diff --git a/Common/Database/Character/CharacterData.cs b/Common/Database/Character/CharacterData.cs index 7aebf72..caa4914 100644 --- a/Common/Database/Character/CharacterData.cs +++ b/Common/Database/Character/CharacterData.cs @@ -1,4 +1,5 @@ -using MikuSB.Proto; +using MikuSB.Enums.Item; +using MikuSB.Proto; using SqlSugar; namespace MikuSB.Database.Character; @@ -21,7 +22,7 @@ public class CharacterInfo public int Trust { get; set; } public uint WeaponUniqueId { get; set; } public uint SkinId { get; set; } - public uint Flag { get; set; } + public ItemFlagEnum Flag { get; set; } public uint Expiration { get; set; } [SugarColumn(IsJson = true)] public List UnlockedSkin { get; set; } = []; [SugarColumn(IsJson = true)] public List Spines { get; set; } = []; @@ -36,7 +37,7 @@ public class CharacterInfo Id = Guid, Template = TemplateId, Count = Count, - Flag = Flag, + Flag = (uint)Flag, Expiration = Expiration, Enhance = new Enhance { diff --git a/Common/Database/Inventory/InventoryData.cs b/Common/Database/Inventory/InventoryData.cs index a3f847d..029f25c 100644 --- a/Common/Database/Inventory/InventoryData.cs +++ b/Common/Database/Inventory/InventoryData.cs @@ -1,4 +1,5 @@ -using MikuSB.Proto; +using MikuSB.Enums.Item; +using MikuSB.Proto; using SqlSugar; namespace MikuSB.Database.Inventory; @@ -23,6 +24,7 @@ public abstract class BaseGameItemInfo public uint UniqueId { get; set; } public ulong TemplateId { get; set; } public uint ItemCount { get; set; } + public ItemFlagEnum Flag { get; set; } public virtual Item ToProto() { @@ -30,7 +32,8 @@ public abstract class BaseGameItemInfo { Id = UniqueId, Template = TemplateId, - Count = ItemCount + Count = ItemCount, + Flag = (uint)Flag }; } } @@ -53,6 +56,7 @@ public class GameWeaponInfo : GrowableItemInfo Id = UniqueId, Template = TemplateId, Count = ItemCount, + Flag = (uint)Flag, Enhance = new Enhance { Level = Level, @@ -71,7 +75,8 @@ public class GameWeaponInfo : GrowableItemInfo { Id = UniqueId, Template = TemplateId, - Count = ItemCount + Count = ItemCount, + Flag = (uint)Flag, }; return proto; } diff --git a/Common/Enums/Item/ItemFlagEnum.cs b/Common/Enums/Item/ItemFlagEnum.cs new file mode 100644 index 0000000..8686b8d --- /dev/null +++ b/Common/Enums/Item/ItemFlagEnum.cs @@ -0,0 +1,13 @@ +namespace MikuSB.Enums.Item; + +public enum ItemFlagEnum +{ + FLAG_USE = 1,// 使用中 + FLAG_LOCK = 2,// 锁定中 + FLAG_READED = 4,// 道具已查看 + FLAG_LEAVE = 8,// 角色大招后离场 + FLAG_WEAPON_DEFAULT = 16,// 武器显示原始样式 + FLAG_WEAPON_AUDIO = 32,// 武器消音器音效 + FLAG_ROLE_LIKE = 64,// 心选角色 +} + diff --git a/GameServer/Game/Character/CharacterManager.cs b/GameServer/Game/Character/CharacterManager.cs index f1677fa..7e332b0 100644 --- a/GameServer/Game/Character/CharacterManager.cs +++ b/GameServer/Game/Character/CharacterManager.cs @@ -25,6 +25,7 @@ public class CharacterManager(PlayerInstance player) : BasePlayerManager(player) Level = level, Break = CharacterExcel.InitBreak, Timestamp = Extensions.GetUnixSec(), + Flag = ItemFlagEnum.FLAG_READED }; var weaponInfo = await Player.InventoryManager!.AddWeaponItem((ItemTypeEnum)CharacterExcel.DefaultWeaponGPDL[0], CharacterExcel.DefaultWeaponGPDL[1], CharacterExcel.DefaultWeaponGPDL[2], (uint)CharacterExcel.DefaultWeaponGPDL[3]); diff --git a/GameServer/Game/Inventory/InventoryManager.cs b/GameServer/Game/Inventory/InventoryManager.cs index ebb8c1b..9717d1a 100644 --- a/GameServer/Game/Inventory/InventoryManager.cs +++ b/GameServer/Game/Inventory/InventoryManager.cs @@ -23,6 +23,7 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player) UniqueId = InventoryData.NextUniqueUid++, Level = level, Break = weaponData.InitBreak, + Flag = ItemFlagEnum.FLAG_READED, ItemCount = 1 }; InventoryData.Weapons[weaponInfo.UniqueId] = weaponInfo; @@ -58,6 +59,7 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player) TemplateId = templateId, UniqueId = InventoryData.NextUniqueUid++, Level = level, + Flag = ItemFlagEnum.FLAG_READED, ItemCount = 1 }; InventoryData.Skins[skinInfo.UniqueId] = skinInfo; diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index e644130..3448bdc 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -246,25 +246,7 @@ public class PlayerInstance(PlayerGameData data) // Launch.GPASSID = 22 stores pass counts. ChapterLevel.GID = 21 stores star flags. // Completing the prologue/early chapter range prevents function conditions from // treating the account as a fresh tutorial player. - for (uint levelId = 10_000; levelId <= 10_160; levelId++) - { - yield return (21, levelId, 7); - yield return (22, levelId, 1); - } - - for (uint levelId = 12_001; levelId <= 12_075; levelId++) - { - yield return (21, levelId, 7); - yield return (22, levelId, 1); - } - - for (uint levelId = 13_002; levelId <= 13_081; levelId++) - { - yield return (21, levelId, 7); - yield return (22, levelId, 1); - } - - foreach (var levelId in new uint[] { 11_315, 11_311, 11_313, 11_322, 11_331, 11_333, 10_123, 50_000, 50_151 }) + for (uint levelId = 10_000; levelId <= 10_700; levelId++) { yield return (21, levelId, 7); yield return (22, levelId, 1); diff --git a/GameServer/Server/CallGS/Handlers/Daily/Daily_EnterLevel.cs b/GameServer/Server/CallGS/Handlers/Daily/Daily_EnterLevel.cs new file mode 100644 index 0000000..b788bb7 --- /dev/null +++ b/GameServer/Server/CallGS/Handlers/Daily/Daily_EnterLevel.cs @@ -0,0 +1,15 @@ +namespace MikuSB.GameServer.Server.CallGS.Handlers.Daily; + +// Success response shape expected by Lua: +// { nSeed = random_number } +[CallGSApi("Daily_EnterLevel")] +public class Daily_EnterLevel : ICallGSHandler +{ + private static readonly Random Random = new(); + + public async Task Handle(Connection connection, string param, ushort seqNo) + { + var rsp = $"{{\"nSeed\":{Random.Next(1, 1000000000)}}}"; + await CallGSRouter.SendScript(connection, "Daily_EnterLevel", rsp); + } +} diff --git a/GameServer/Server/CallGS/Handlers/Girl/GirlCard_SetRoleLikeFlag.cs b/GameServer/Server/CallGS/Handlers/Girl/GirlCard_SetRoleLikeFlag.cs new file mode 100644 index 0000000..f0ddc16 --- /dev/null +++ b/GameServer/Server/CallGS/Handlers/Girl/GirlCard_SetRoleLikeFlag.cs @@ -0,0 +1,40 @@ +using MikuSB.Enums.Item; +using MikuSB.Proto; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace MikuSB.GameServer.Server.CallGS.Handlers.Girl; + +[CallGSApi("GirlCard_SetRoleLikeFlag")] +public class GirlCard_SetRoleLikeFlag : ICallGSHandler +{ + public async Task Handle(Connection connection, string param, ushort seqNo) + { + var player = connection.Player!; + var girlData = JsonSerializer.Deserialize(param); + if (girlData == null) return; + + var cardData = player.CharacterManager.GetCharacterByGUID(girlData.CardId); + if (cardData == null) return; + + cardData.Flag = girlData.Flag == 1 + ? ItemFlagEnum.FLAG_ROLE_LIKE + : ItemFlagEnum.FLAG_READED; + + var sync = new NtfSyncPlayer + { + Items = { cardData.ToProto() } + }; + + await CallGSRouter.SendScript(connection, "GirlCard_SetRoleLikeFlag", "{}", sync); + } +} + +internal sealed class SetRoleLikeFlagParam +{ + [JsonPropertyName("nFlag")] + public int Flag { get; set; } + + [JsonPropertyName("nCardID")] + public uint CardId { get; set; } +} \ No newline at end of file diff --git a/GameServer/Server/CallGS/Handlers/Girl/GirlSkin_Change.cs b/GameServer/Server/CallGS/Handlers/Girl/GirlSkin_Change.cs index 7232efe..d4fe576 100644 --- a/GameServer/Server/CallGS/Handlers/Girl/GirlSkin_Change.cs +++ b/GameServer/Server/CallGS/Handlers/Girl/GirlSkin_Change.cs @@ -1,7 +1,7 @@ using MikuSB.Proto; using System.Text.Json; -namespace MikuSB.GameServer.Server.CallGS.Handlers.Daily; +namespace MikuSB.GameServer.Server.CallGS.Handlers.Girl; [CallGSApi("GirlSkin_Change")] public class GirlSkin_Change : ICallGSHandler diff --git a/GameServer/Server/CallGS/Handlers/Girl/GirlSkin_ChangeSkinType.cs b/GameServer/Server/CallGS/Handlers/Girl/GirlSkin_ChangeSkinType.cs new file mode 100644 index 0000000..2343f5d --- /dev/null +++ b/GameServer/Server/CallGS/Handlers/Girl/GirlSkin_ChangeSkinType.cs @@ -0,0 +1,30 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using System.Text.Json.Serialization; + +namespace MikuSB.GameServer.Server.CallGS.Handlers.Girl; + +[CallGSApi("GirlSkin_ChangeSkinType")] +public class GirlSkin_ChangeSkinType : ICallGSHandler +{ + public async Task Handle(Connection connection, string param, ushort seqNo) + { + var req = JsonSerializer.Deserialize(param); + var response = new JsonObject + { + ["nType"] = req?.Type ?? 1, + ["nSkinId"] = req?.SkinId + }; + // TODO change type in proto Item ?? + await CallGSRouter.SendScript(connection, "GirlSkin_ChangeSkinType", response.ToJsonString()); + } +} + +internal sealed class ChangeSkinTypeParam +{ + [JsonPropertyName("nType")] + public int? Type { get; set; } + + [JsonPropertyName("nSkinId")] + public uint? SkinId { get; set; } +} diff --git a/GameServer/Server/Packet/Recv/Login/HandlerReqLogin.cs b/GameServer/Server/Packet/Recv/Login/HandlerReqLogin.cs index 723d75e..eb0bc37 100644 --- a/GameServer/Server/Packet/Recv/Login/HandlerReqLogin.cs +++ b/GameServer/Server/Packet/Recv/Login/HandlerReqLogin.cs @@ -46,5 +46,6 @@ public class HandlerReqLogin : Handler await connection.Player.OnEnterGame(); connection.Player.Connection = connection; await connection.SendPacket(new PacketRspLogin(connection.Player!)); + await connection.Player.OnHeartBeat(); } }