From 5f92f2c1163c2488e45ed889caacf76d0a8e3380 Mon Sep 17 00:00:00 2001 From: Naruse <71993948+DevilProMT@users.noreply.github.com> Date: Mon, 27 Apr 2026 23:18:08 +0800 Subject: [PATCH] add girl skin type change note: need to delete old database because im moving skin to different item type database located in Config/Database/Miku.db --- Common/Configuration/ConfigContainer.cs | 2 +- Common/Database/Inventory/InventoryData.cs | 3 +- GameServer/Game/Character/CharacterManager.cs | 2 +- GameServer/Game/Inventory/InventoryManager.cs | 22 ++++++++++++-- .../Handlers/Girl/GirlSkin_ChangeSkinType.cs | 30 +++++++++++++++---- .../Packet/Send/Misc/PacketNtfCallScript.cs | 1 + 6 files changed, 49 insertions(+), 11 deletions(-) diff --git a/Common/Configuration/ConfigContainer.cs b/Common/Configuration/ConfigContainer.cs index 528ed78..4b4dc03 100644 --- a/Common/Configuration/ConfigContainer.cs +++ b/Common/Configuration/ConfigContainer.cs @@ -16,7 +16,7 @@ public class HttpServerConfig public string BindAddress { get; set; } = "0.0.0.0"; public string PublicAddress { get; set; } = "127.0.0.1"; public int Port { get; set; } = 21500; - public bool EnableLog { get; set; } = true; + public bool EnableLog { get; set; } = false; public string GetDisplayAddress() { diff --git a/Common/Database/Inventory/InventoryData.cs b/Common/Database/Inventory/InventoryData.cs index 5d81d0e..c1ab3d1 100644 --- a/Common/Database/Inventory/InventoryData.cs +++ b/Common/Database/Inventory/InventoryData.cs @@ -69,7 +69,7 @@ public class GameWeaponInfo : GrowableItemInfo } }public class GameSkinInfo : BaseGameItemInfo { - public uint Level { get; set; } + public uint SkinType { get; set; } public override Item ToProto() { var proto = new Item @@ -79,6 +79,7 @@ public class GameWeaponInfo : GrowableItemInfo Count = ItemCount, Flag = (uint)Flag, }; + proto.Slots[11] = SkinType; return proto; } } \ No newline at end of file diff --git a/GameServer/Game/Character/CharacterManager.cs b/GameServer/Game/Character/CharacterManager.cs index 03e3760..98444fd 100644 --- a/GameServer/Game/Character/CharacterManager.cs +++ b/GameServer/Game/Character/CharacterManager.cs @@ -30,7 +30,7 @@ public class CharacterManager(PlayerInstance player) : BasePlayerManager(player) var weaponInfo = await Player.InventoryManager!.AddWeaponItem((ItemTypeEnum)CharacterExcel.DefaultWeaponGPDL[0], CharacterExcel.DefaultWeaponGPDL[1], CharacterExcel.DefaultWeaponGPDL[2], CharacterExcel.DefaultWeaponGPDL[3],sendPacket:false); if (weaponInfo != null) character.WeaponUniqueId = weaponInfo.UniqueId; - var skinInfo = Player.InventoryManager!.GetNormalItemGDPL(ItemTypeEnum.TYPE_CARD_SKIN, detail, particular, level) + var skinInfo = Player.InventoryManager!.GetSkinItemGDPL(ItemTypeEnum.TYPE_CARD_SKIN, detail, particular, level) ?? await Player.InventoryManager!.AddSkinItem(ItemTypeEnum.TYPE_CARD_SKIN, detail, particular, level, false); if (skinInfo != null) character.SkinId = skinInfo.UniqueId; diff --git a/GameServer/Game/Inventory/InventoryManager.cs b/GameServer/Game/Inventory/InventoryManager.cs index f6ba086..aac8d72 100644 --- a/GameServer/Game/Inventory/InventoryManager.cs +++ b/GameServer/Game/Inventory/InventoryManager.cs @@ -51,27 +51,43 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player) return InventoryData.Weapons.Values.FirstOrDefault(x => x.TemplateId == templateId); } - public async ValueTask AddSkinItem(ItemTypeEnum genre, uint detail, uint particular, uint level = 1, bool sendPacket = true) + public async ValueTask AddSkinItem(ItemTypeEnum genre, uint detail, uint particular, uint level = 1, bool sendPacket = true) { if (genre != ItemTypeEnum.TYPE_CARD_SKIN) return null; var skinData = GameData.CardSkinData.Values.FirstOrDefault(x => x.Genre == (int)genre && x.Detail == detail && x.Particular == particular && x.Level == level); if (skinData == null) return null; var templateId = GameResourceTemplateId.FromGdpl((uint)genre,detail,particular,level); - var skinInfo = new BaseGameItemInfo + var skinInfo = new GameSkinInfo { TemplateId = templateId, UniqueId = InventoryData.NextUniqueUid++, ItemType = ItemTypeEnum.TYPE_CARD_SKIN, ItemCount = 1 }; - InventoryData.Items[skinInfo.UniqueId] = skinInfo; + InventoryData.Skins[skinInfo.UniqueId] = skinInfo; if (sendPacket) await Player.SendPacket(new PacketNtfCallScript([skinInfo])); return skinInfo; } + public GameSkinInfo? GetSkinItem(uint uniqueId) + { + return InventoryData.Skins.GetValueOrDefault(uniqueId); + } + + public GameSkinInfo? GetSkinItemByTemplateId(ulong templateId) + { + return InventoryData.Skins.Values.FirstOrDefault(x => x.TemplateId == templateId); + } + + public GameSkinInfo? GetSkinItemGDPL(ItemTypeEnum genre, uint detail, uint particular, uint level) + { + var templateId = GameResourceTemplateId.FromGdpl((uint)genre, detail, particular, level); + return InventoryData.Skins.Values.FirstOrDefault(x => x.TemplateId == templateId); + } + public async ValueTask AddArItem(ItemTypeEnum genre, uint detail, uint particular, uint level = 1, bool sendPacket = true) { if (genre != ItemTypeEnum.TYPE_AR) return null; diff --git a/GameServer/Server/CallGS/Handlers/Girl/GirlSkin_ChangeSkinType.cs b/GameServer/Server/CallGS/Handlers/Girl/GirlSkin_ChangeSkinType.cs index 2343f5d..268f890 100644 --- a/GameServer/Server/CallGS/Handlers/Girl/GirlSkin_ChangeSkinType.cs +++ b/GameServer/Server/CallGS/Handlers/Girl/GirlSkin_ChangeSkinType.cs @@ -1,4 +1,5 @@ -using System.Text.Json; +using MikuSB.Proto; +using System.Text.Json; using System.Text.Json.Nodes; using System.Text.Json.Serialization; @@ -15,16 +16,35 @@ public class GirlSkin_ChangeSkinType : ICallGSHandler ["nType"] = req?.Type ?? 1, ["nSkinId"] = req?.SkinId }; - // TODO change type in proto Item ?? - await CallGSRouter.SendScript(connection, "GirlSkin_ChangeSkinType", response.ToJsonString()); + if (req == null) + { + await CallGSRouter.SendScript(connection, "GirlSkin_ChangeSkinType", response.ToJsonString()); + return; + } + + var player = connection.Player!; + var skinData = player.InventoryManager.GetSkinItem(req.SkinId); + if (skinData == null) + { + await CallGSRouter.SendScript(connection, "GirlSkin_ChangeSkinType", response.ToJsonString()); + return; + } + + skinData.SkinType = req.Type; + var sync = new NtfSyncPlayer + { + Items = { skinData.ToProto() } + }; + + await CallGSRouter.SendScript(connection, "GirlSkin_ChangeSkinType", response.ToJsonString(), sync); } } internal sealed class ChangeSkinTypeParam { [JsonPropertyName("nType")] - public int? Type { get; set; } + public uint Type { get; set; } [JsonPropertyName("nSkinId")] - public uint? SkinId { get; set; } + public uint SkinId { get; set; } } diff --git a/GameServer/Server/Packet/Send/Misc/PacketNtfCallScript.cs b/GameServer/Server/Packet/Send/Misc/PacketNtfCallScript.cs index 62da213..3bc08f4 100644 --- a/GameServer/Server/Packet/Send/Misc/PacketNtfCallScript.cs +++ b/GameServer/Server/Packet/Send/Misc/PacketNtfCallScript.cs @@ -63,6 +63,7 @@ public class PacketNtfCallScript : BasePacket var extraSync = new NtfSyncPlayer(); foreach (var item in inventory.Items.Values) extraSync.Items.Add(item.ToProto()); + foreach (var skin in inventory.Skins.Values) extraSync.Items.Add(skin.ToProto()); foreach (var weapon in inventory.Weapons.Values) extraSync.Items.Add(weapon.ToProto()); proto.ExtraSync = extraSync; SetData(proto);