diff --git a/Common/Database/Inventory/InventoryData.cs b/Common/Database/Inventory/InventoryData.cs index 6ef1959..1cdb01d 100644 --- a/Common/Database/Inventory/InventoryData.cs +++ b/Common/Database/Inventory/InventoryData.cs @@ -60,11 +60,7 @@ public class GameSkinInfo : BaseGameItemInfo { Id = UniqueId, Template = TemplateId, - Count = ItemCount, - Enhance = new Enhance - { - Level = Level - } + Count = ItemCount }; return proto; } diff --git a/GameServer/Game/Character/CharacterManager.cs b/GameServer/Game/Character/CharacterManager.cs index a253b55..2edd9f6 100644 --- a/GameServer/Game/Character/CharacterManager.cs +++ b/GameServer/Game/Character/CharacterManager.cs @@ -30,7 +30,8 @@ public class CharacterManager(PlayerInstance player) : BasePlayerManager(player) var weaponInfo = await Player.InventoryManager!.AddWeaponItem((ItemTypeEnum)CharacterExcel.DefaultWeaponGPDL[0], CharacterExcel.DefaultWeaponGPDL[1], CharacterExcel.DefaultWeaponGPDL[2], (uint)CharacterExcel.DefaultWeaponGPDL[3]); if (weaponInfo != null) character.WeaponUniqueId = weaponInfo.UniqueId; - var skinInfo = await Player.InventoryManager!.AddSkinItem(ItemTypeEnum.TYPE_CARD_SKIN,detail,particular,level); + //var skinInfo = await Player.InventoryManager!.AddSkinItem(ItemTypeEnum.TYPE_CARD_SKIN, detail, particular, level); + var skinInfo = Player.InventoryManager!.GetSkinItemGDPL(ItemTypeEnum.TYPE_CARD_SKIN, detail, particular, level); if (skinInfo != null) { character.SkinId = skinInfo.UniqueId; @@ -46,6 +47,11 @@ public class CharacterManager(PlayerInstance player) : BasePlayerManager(player) return CharacterData.Characters.Find(Character => Character.TemplateId == TemplateId); } + public CharacterInfo? GetCharacterByGUID(uint guid) + { + return CharacterData.Characters.Find(Character => Character.Guid == guid); + } + public CharacterInfo? GetCharacterGDPL(ItemTypeEnum genre, int detail, int particular) { var templateId = GameResourceTemplateId.FromGdpl((uint)genre,(uint)detail,(uint)particular,1); diff --git a/GameServer/Game/Inventory/InventoryManager.cs b/GameServer/Game/Inventory/InventoryManager.cs index 6d42cc8..0d66a6e 100644 --- a/GameServer/Game/Inventory/InventoryManager.cs +++ b/GameServer/Game/Inventory/InventoryManager.cs @@ -39,9 +39,9 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player) return InventoryData.Weapons.Values.FirstOrDefault(x => x.TemplateId == templateId); } - public GameWeaponInfo? GetWeaponItemGDPL(ItemTypeEnum genre, int detail, int particular) + public GameWeaponInfo? GetWeaponItemGDPL(ItemTypeEnum genre, uint detail, uint particular, uint level) { - var templateId = GameResourceTemplateId.FromGdpl((uint)genre, (uint)detail, (uint)particular, 1); + var templateId = GameResourceTemplateId.FromGdpl((uint)genre,detail,particular, level); return InventoryData.Weapons.Values.FirstOrDefault(x => x.TemplateId == templateId); } @@ -74,9 +74,9 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player) return InventoryData.Skins.Values.FirstOrDefault(x => x.TemplateId == templateId); } - public GameSkinInfo? GetSkinItemGDPL(ItemTypeEnum genre, int detail, int particular) + public GameSkinInfo? GetSkinItemGDPL(ItemTypeEnum genre, uint detail, uint particular, uint level) { - var templateId = GameResourceTemplateId.FromGdpl((uint)genre, (uint)detail, (uint)particular, 1); + var templateId = GameResourceTemplateId.FromGdpl((uint)genre,detail,particular,level); return InventoryData.Skins.Values.FirstOrDefault(x => x.TemplateId == templateId); } } \ No newline at end of file diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index 9dc2c85..21e7975 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -44,7 +44,18 @@ public class PlayerInstance(PlayerGameData data) var t = Task.Run(async () => { await InitialPlayerManager(); - foreach (var card in GameData.CardData.Values) await CharacterManager.AddCharacter((ItemTypeEnum)card.Genre, card.Detail, card.Particular, card.Level); + foreach (var skinCard in GameData.CardSkinData.Values) + { + await InventoryManager.AddSkinItem((ItemTypeEnum)skinCard.Genre, skinCard.Detail, skinCard.Particular, skinCard.Level); + } + foreach (var weapon in GameData.WeaponData.Values) + { + await InventoryManager.AddWeaponItem((ItemTypeEnum)weapon.Genre, weapon.Detail, weapon.Particular, weapon.Level); + } + foreach (var card in GameData.CardData.Values) + { + await CharacterManager.AddCharacter((ItemTypeEnum)card.Genre, card.Detail, card.Particular, card.Level); + } var bootstrapAttrs = BuildLobbyBootstrapAttrs(); var existingAttrs = Data.Attrs @@ -156,8 +167,8 @@ public class PlayerInstance(PlayerGameData data) }, }; - //foreach(var weapon in InventoryManager.InventoryData.Weapons.Values) proto.Items.Add(weapon.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 skin in InventoryManager.InventoryData.Skins.Values) proto.Items.Add(skin.ToProto()); foreach (var chara in CharacterManager.CharacterData.Characters) proto.Items.Add(chara.ToProto()); foreach (var x in Data.Attrs) @@ -229,7 +240,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 <= 11_007; levelId++) + for (uint levelId = 10_000; levelId <= 10_160; levelId++) { yield return (21, levelId, 7); yield return (22, levelId, 1); diff --git a/GameServer/Server/CallGS/CallGSRouter.cs b/GameServer/Server/CallGS/CallGSRouter.cs index 6873fdc..fa7df11 100644 --- a/GameServer/Server/CallGS/CallGSRouter.cs +++ b/GameServer/Server/CallGS/CallGSRouter.cs @@ -38,9 +38,10 @@ public static class CallGSRouter Logger.Error($"No handler for CallGS API: {req.Api}"); } - public static async Task SendScript(Connection connection, string api, string arg, ushort seqNo = 0) + public static async Task SendScript(Connection connection, string api, string arg, NtfSyncPlayer extra = null!) { - var rsp = new NtfCallScript { Api = api, Arg = arg }; - await connection.SendPacket(CmdIds.RspCallGS, rsp, seqNo); + var rsp = new NtfCallScript { Api = api, Arg = arg, ExtraSync = extra }; + await connection.SendPacket(CmdIds.NtfScript, rsp); + await connection.SendPacket(CmdIds.RspCallGS); } } diff --git a/GameServer/Server/CallGS/Handlers/Achievement/Achievement_GetReward.cs b/GameServer/Server/CallGS/Handlers/Achievement/Achievement_GetReward.cs index 6933bfc..fab5d0a 100644 --- a/GameServer/Server/CallGS/Handlers/Achievement/Achievement_GetReward.cs +++ b/GameServer/Server/CallGS/Handlers/Achievement/Achievement_GetReward.cs @@ -9,6 +9,6 @@ public class Achievement_GetReward : ICallGSHandler public async Task Handle(Connection connection, string param, ushort seqNo) { // TODO: validate achievement completion and grant reward items - await CallGSRouter.SendScript(connection, "Achievement_GetReward", "{}", seqNo); + await CallGSRouter.SendScript(connection, "Achievement_GetReward", "{}"); } } diff --git a/GameServer/Server/CallGS/Handlers/Activity/ActivityFace_Update.cs b/GameServer/Server/CallGS/Handlers/Activity/ActivityFace_Update.cs index 326e849..7da47a7 100644 --- a/GameServer/Server/CallGS/Handlers/Activity/ActivityFace_Update.cs +++ b/GameServer/Server/CallGS/Handlers/Activity/ActivityFace_Update.cs @@ -9,6 +9,6 @@ public class ActivityFace_Update : ICallGSHandler public async Task Handle(Connection connection, string param, ushort seqNo) { // TODO: process face equip/unequip state and return the next face to display - await CallGSRouter.SendScript(connection, "ActivityFace_Update", "{\"nFaceId\":0,\"nId\":0,\"nType\":0}", seqNo); + await CallGSRouter.SendScript(connection, "ActivityFace_Update", "{\"nFaceId\":0,\"nId\":0,\"nType\":0}"); } } diff --git a/GameServer/Server/CallGS/Handlers/Daily/Daily_GetActivityInfo.cs b/GameServer/Server/CallGS/Handlers/Daily/Daily_GetActivityInfo.cs index e751165..e4e7834 100644 --- a/GameServer/Server/CallGS/Handlers/Daily/Daily_GetActivityInfo.cs +++ b/GameServer/Server/CallGS/Handlers/Daily/Daily_GetActivityInfo.cs @@ -8,6 +8,6 @@ public class Daily_GetActivityInfo : ICallGSHandler public async Task Handle(Connection connection, string param, ushort seqNo) { // TODO: return actual daily activity data - await CallGSRouter.SendScript(connection, "Daily_GetActivityInfo", "{}", seqNo); + await CallGSRouter.SendScript(connection, "Daily_GetActivityInfo", "{}"); } } diff --git a/GameServer/Server/CallGS/Handlers/Girl/GirlSkin_Change.cs b/GameServer/Server/CallGS/Handlers/Girl/GirlSkin_Change.cs new file mode 100644 index 0000000..7232efe --- /dev/null +++ b/GameServer/Server/CallGS/Handlers/Girl/GirlSkin_Change.cs @@ -0,0 +1,24 @@ +using MikuSB.Proto; +using System.Text.Json; + +namespace MikuSB.GameServer.Server.CallGS.Handlers.Daily; + +[CallGSApi("GirlSkin_Change")] +public class GirlSkin_Change : ICallGSHandler +{ + public async Task Handle(Connection connection, string param, ushort seqNo) + { + var player = connection.Player!; + var girlSkinData = JsonSerializer.Deserialize(param); + var cardData = player.CharacterManager.GetCharacterByGUID((uint)girlSkinData!.CardId); + if (cardData == null) return; + + cardData.SkinId = (uint)girlSkinData.Id; + + var sync = new NtfSyncPlayer + { + Items = { cardData.ToProto() } + }; + await CallGSRouter.SendScript(connection, "GirlSkin_Change", "{}", sync); + } +} diff --git a/GameServer/Server/CallGS/Handlers/Lineup/Lineup_Update.cs b/GameServer/Server/CallGS/Handlers/Lineup/Lineup_Update.cs index a765c5d..beff313 100644 --- a/GameServer/Server/CallGS/Handlers/Lineup/Lineup_Update.cs +++ b/GameServer/Server/CallGS/Handlers/Lineup/Lineup_Update.cs @@ -5,6 +5,6 @@ public class Lineup_Update : ICallGSHandler { public async Task Handle(Connection connection, string param, ushort seqNo) { - await CallGSRouter.SendScript(connection, "UpdateLineup", "{}", seqNo); + await CallGSRouter.SendScript(connection, "UpdateLineup", "{}"); } } diff --git a/GameServer/Server/CallGS/Handlers/Misc/ZoneTime_ReqTime.cs b/GameServer/Server/CallGS/Handlers/Misc/ZoneTime_ReqTime.cs index 53af913..c7680fc 100644 --- a/GameServer/Server/CallGS/Handlers/Misc/ZoneTime_ReqTime.cs +++ b/GameServer/Server/CallGS/Handlers/Misc/ZoneTime_ReqTime.cs @@ -11,6 +11,6 @@ public class ZoneTime_ReqTime : ICallGSHandler { var now = Extensions.GetUnixSec(); var arg = $"{{\"nTime1\":{now},\"nTime2\":{now}}}"; - await CallGSRouter.SendScript(connection, "ZoneTime_ChangeTime", arg, seqNo); + await CallGSRouter.SendScript(connection, "ZoneTime_ChangeTime", arg); } } diff --git a/GameServer/Server/CallGS/Handlers/Preview/ReqEntranceGreenLevel.cs b/GameServer/Server/CallGS/Handlers/Preview/ReqEntranceGreenLevel.cs index 23d0dd0..f97629f 100644 --- a/GameServer/Server/CallGS/Handlers/Preview/ReqEntranceGreenLevel.cs +++ b/GameServer/Server/CallGS/Handlers/Preview/ReqEntranceGreenLevel.cs @@ -8,6 +8,6 @@ public class ReqEntranceGreenLevel : ICallGSHandler public async Task Handle(Connection connection, string param, ushort seqNo) { // TODO: return actual skin green levels from player data - await CallGSRouter.SendScript(connection, "ReqEntranceGreenLevel", "[]", seqNo); + await CallGSRouter.SendScript(connection, "ReqEntranceGreenLevel", "[]"); } } diff --git a/GameServer/Server/CallGS/Handlers/Role/Role_EnterLevel.cs b/GameServer/Server/CallGS/Handlers/Role/Role_EnterLevel.cs index 25a7f91..ac7840f 100644 --- a/GameServer/Server/CallGS/Handlers/Role/Role_EnterLevel.cs +++ b/GameServer/Server/CallGS/Handlers/Role/Role_EnterLevel.cs @@ -9,6 +9,6 @@ public class Role_EnterLevel : ICallGSHandler public async Task Handle(Connection connection, string param, ushort seqNo) { string rsp = $"{{\"tbRet\":{{\"nSeed\":{_random.Next(1, 1000000000)}}}}}"; - await CallGSRouter.SendScript(connection, "Role_EnterLevel", rsp, seqNo); + await CallGSRouter.SendScript(connection, "Role_EnterLevel", rsp); } } \ No newline at end of file diff --git a/GameServer/Server/CallGS/Handlers/Shop/ShopLogic_GetOpenTime.cs b/GameServer/Server/CallGS/Handlers/Shop/ShopLogic_GetOpenTime.cs index f85f7d1..fb0640c 100644 --- a/GameServer/Server/CallGS/Handlers/Shop/ShopLogic_GetOpenTime.cs +++ b/GameServer/Server/CallGS/Handlers/Shop/ShopLogic_GetOpenTime.cs @@ -8,6 +8,6 @@ public class ShopLogic_GetOpenTime : ICallGSHandler public async Task Handle(Connection connection, string param, ushort seqNo) { // TODO: return actual shop open times from config - await CallGSRouter.SendScript(connection, "ShopLogic_GetOpenTime", "{}", seqNo); + await CallGSRouter.SendScript(connection, "ShopLogic_GetOpenTime", "{}"); } } diff --git a/GameServer/Server/CallGS/Models/Girl/GirlSkin_Change.cs b/GameServer/Server/CallGS/Models/Girl/GirlSkin_Change.cs new file mode 100644 index 0000000..3bea3a0 --- /dev/null +++ b/GameServer/Server/CallGS/Models/Girl/GirlSkin_Change.cs @@ -0,0 +1,5 @@ +public class ChangeSkinParam +{ + public int Id { get; set; } + public int CardId { get; set; } +} \ No newline at end of file