From 5f0de1a9f030ebc4ed8f0f09dded102811c0f7d2 Mon Sep 17 00:00:00 2001 From: Naruse <71993948+DevilProMT@users.noreply.github.com> Date: Tue, 28 Apr 2026 23:08:23 +0800 Subject: [PATCH] add support card giveall command NOTE: need to delete old database because im moving support card to different column --- Common/Database/Inventory/InventoryData.cs | 29 +++++++++++++- .../Message/LanguageCHS.cs | 13 +++--- .../Message/LanguageCHT.cs | 13 +++--- .../Message/LanguageEN.cs | 9 +++-- GameServer/Command/Commands/CommandGiveAll.cs | 40 ++++++++++++++++++- GameServer/Game/Inventory/InventoryManager.cs | 30 +++++++++++--- GameServer/Game/Player/PlayerInstance.cs | 4 -- .../Packet/Send/Misc/PacketNtfCallScript.cs | 16 ++++++++ 8 files changed, 127 insertions(+), 27 deletions(-) diff --git a/Common/Database/Inventory/InventoryData.cs b/Common/Database/Inventory/InventoryData.cs index 495e18d..b1ef489 100644 --- a/Common/Database/Inventory/InventoryData.cs +++ b/Common/Database/Inventory/InventoryData.cs @@ -17,6 +17,9 @@ public class InventoryData : BaseDatabaseDataHelper [SugarColumn(IsJson = true)] public Dictionary Skins { get; set; } = []; // Key: UniqueId + + [SugarColumn(IsJson = true)] + public Dictionary SupportCards { get; set; } = []; // Key: UniqueId } public class BaseGameItemInfo @@ -72,7 +75,8 @@ public class GameWeaponInfo : GrowableItemInfo }; return proto; } -}public class GameSkinInfo : BaseGameItemInfo +} +public class GameSkinInfo : BaseGameItemInfo { public uint SkinType { get; set; } public override Item ToProto() @@ -87,4 +91,27 @@ public class GameWeaponInfo : GrowableItemInfo proto.Slots[11] = SkinType; return proto; } +} + + +public class GameSupportCardInfo : BaseGameItemInfo +{ + public uint AffixId { get; set; } + public override Item ToProto() + { + var proto = new Item + { + Id = UniqueId, + Template = TemplateId, + Count = ItemCount, + Flag = (uint)Flag, + Enhance = new Enhance + { + Level = Level, + Exp = Exp + } + }; + proto.Slots[1] = AffixId; + return proto; + } } \ No newline at end of file diff --git a/Common/Internationalization/Message/LanguageCHS.cs b/Common/Internationalization/Message/LanguageCHS.cs index 1827e27..24e601d 100644 --- a/Common/Internationalization/Message/LanguageCHS.cs +++ b/Common/Internationalization/Message/LanguageCHS.cs @@ -35,6 +35,8 @@ public class ServerTextCHS /// public class WordTextCHS { + public string SupportCard => "支援卡"; + public string Weapon => "武器"; public string Rank => "星魂"; public string Avatar => "角色"; public string Material => "材料"; @@ -232,11 +234,12 @@ public class GirlTextCHS /// public class GiveAllTextCHS { - public string Desc => "给玩家所有物品\n" + - "备注: -1 代表全部"; - public string Usage => "用法: /giveall weapon -p -l"; - public string WeaponNotFound => "找不到武器!"; - public string WeaponAdded => "已添加 {0} 把武器给玩家!"; + public string Desc => "给予玩家所有物品\n" + + "注意:-1 表示全部"; + public string Usage => "用法:/giveall weapon -p<特定> -l<等级>\n" + + "用法:/giveall card -p<特定> -l<等级>"; + public string NotFound => "未找到 {0}!"; + public string GiveAllItems => "已向玩家添加 {0} 个 {1}!"; } #endregion diff --git a/Common/Internationalization/Message/LanguageCHT.cs b/Common/Internationalization/Message/LanguageCHT.cs index 9900eb5..deadf27 100644 --- a/Common/Internationalization/Message/LanguageCHT.cs +++ b/Common/Internationalization/Message/LanguageCHT.cs @@ -35,6 +35,8 @@ public class ServerTextCHT /// public class WordTextCHT { + public string SupportCard => "支援卡"; + public string Weapon => "武器"; public string Rank => "星魂"; public string Avatar => "角色"; public string Material => "材料"; @@ -232,11 +234,12 @@ public class GirlTextCHT /// public class GiveAllTextCHT { - public string Desc => "給玩家所有物品\n" + - "備註: -1 代表全部"; - public string Usage => "用法: /giveall weapon -p -l"; - public string WeaponNotFound => "找不到武器!"; - public string WeaponAdded => "已添加 {0} 把武器給玩家!"; + public string Desc => "給予玩家所有物品\n" + + "注意:-1 表示全部"; + public string Usage => "用法:/giveall weapon -p<特定> -l<等級>\n" + + "用法:/giveall card -p<特定> -l<等級>"; + public string NotFound => "未找到 {0}!"; + public string GiveAllItems => "已向玩家添加 {0} 個 {1}!"; } #endregion diff --git a/Common/Internationalization/Message/LanguageEN.cs b/Common/Internationalization/Message/LanguageEN.cs index c6af2a9..cc81189 100644 --- a/Common/Internationalization/Message/LanguageEN.cs +++ b/Common/Internationalization/Message/LanguageEN.cs @@ -38,7 +38,7 @@ public class WordTextEN public string Star => "Star"; public string Valk => "Valkyrie"; public string Material => "Material"; - public string Stigmata => "Stigmata"; + public string SupportCard => "Support Card"; public string Weapon => "Weapon"; public string Banner => "Gacha"; public string Activity => "Activity"; @@ -203,9 +203,10 @@ public class GiveAllTextEN { public string Desc => "Give all items to player\n"+ "Note: -1 means all"; - public string Usage => "Usage: /giveall weapon -p -l"; - public string WeaponNotFound => "Weapon not found!"; - public string WeaponAdded => "Added {0} weapon(s) to player!"; + public string Usage => "Usage: /giveall weapon -p -l\n" + + "Usage: /giveall card -p -l"; + public string NotFound => "{0} not found!"; + public string GiveAllItems => "Added {0} {1} to player!"; } #endregion diff --git a/GameServer/Command/Commands/CommandGiveAll.cs b/GameServer/Command/Commands/CommandGiveAll.cs index 50cb0fd..72864fc 100644 --- a/GameServer/Command/Commands/CommandGiveAll.cs +++ b/GameServer/Command/Commands/CommandGiveAll.cs @@ -36,12 +36,48 @@ public class CommandGiveAll : ICommands var weapon = await player.InventoryManager!.AddWeaponItem(ItemTypeEnum.TYPE_WEAPON, (uint)detail,(uint)particular,1,(uint)level,false); if (weapon == null) { - await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.WeaponNotFound")); + await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.NotFound", I18NManager.Translate("Word.Weapon"))); return; } weapons.Add(weapon); } if (weapons.Count > 0) await player.SendPacket(new PacketNtfCallScript(weapons)); - await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.WeaponAdded", weapons.Count.ToString())); + await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems", + I18NManager.Translate("Word.Weapon"), weapons.Count.ToString())); + } + + [CommandMethod("card")] + public async ValueTask GiveAllSupportCard(CommandArg arg) + { + if (!await arg.CheckOnlineTarget()) return; + if (await arg.GetOption('p') is not int particular) return; + if (await arg.GetOption('l') is not int level) return; + + var detail = arg.GetInt(0); + var player = arg.Target!.Player!; + List supportCards = []; + if (detail == -1) + { + // add all + foreach (var config in GameData.SupportCardData) + { + var supportCard = await player.InventoryManager! + .AddSupportCardItem(config.Detail, config.Particular, config.Level, (uint)level, false); + if (supportCard != null) supportCards.Add(supportCard); + } + } + else + { + var supportCard = await player.InventoryManager!.AddSupportCardItem((uint)detail, (uint)particular, 1, (uint)level, false); + if (supportCard == null) + { + await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.NotFound", I18NManager.Translate("Word.SupportCard"))); + return; + } + supportCards.Add(supportCard); + } + if (supportCards.Count > 0) await player.SendPacket(new PacketNtfCallScript(supportCards)); + await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems", + I18NManager.Translate("Word.SupportCard"), supportCards.Count.ToString())); } } \ No newline at end of file diff --git a/GameServer/Game/Inventory/InventoryManager.cs b/GameServer/Game/Inventory/InventoryManager.cs index 28d21c2..f1c8a7e 100644 --- a/GameServer/Game/Inventory/InventoryManager.cs +++ b/GameServer/Game/Inventory/InventoryManager.cs @@ -110,26 +110,44 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player) return arInfo; } - public async ValueTask AddSupportCardItem(uint detail, uint particular, uint level = 1, bool sendPacket = true) + public async ValueTask AddSupportCardItem(uint detail, uint particular, uint level = 1, uint cardLevel = 1, bool sendPacket = true) { const ItemTypeEnum genre = ItemTypeEnum.TYPE_SUPPORT; + var spCard = GameData.SupportCardData.FirstOrDefault(x => x.Genre == (int)genre && x.Detail == detail && x.Particular == particular && x.Level == level); + if (spCard == null) return null; var templateId = GameResourceTemplateId.FromGdpl((uint)genre, detail, particular, level); - if (InventoryData.Items.Values.Any(x => x.TemplateId == templateId)) return null; - - var info = new BaseGameItemInfo + cardLevel = Math.Clamp(cardLevel, 1, spCard.MaxLevel); + var info = new GameSupportCardInfo { TemplateId = templateId, UniqueId = InventoryData.NextUniqueUid++, ItemType = genre, - ItemCount = 1 + ItemCount = 1, + Level = cardLevel, }; - InventoryData.Items[info.UniqueId] = info; + InventoryData.SupportCards[info.UniqueId] = info; if (sendPacket) await Player.SendPacket(new PacketNtfCallScript([info])); return info; } + public GameSupportCardInfo? GetSupportCardItem(uint uniqueId) + { + return InventoryData.SupportCards.GetValueOrDefault(uniqueId); + } + + public GameSupportCardInfo? GetSupportCardByTemplateId(ulong templateId) + { + return InventoryData.SupportCards.Values.FirstOrDefault(x => x.TemplateId == templateId); + } + + public GameSupportCardInfo? GetSupportCardItemGDPL(ItemTypeEnum genre, uint detail, uint particular, uint level) + { + var templateId = GameResourceTemplateId.FromGdpl((uint)genre, detail, particular, level); + return InventoryData.SupportCards.Values.FirstOrDefault(x => x.TemplateId == templateId); + } + public async ValueTask AddManifestationItem(ItemTypeEnum genre, uint detail, uint particular, uint level = 1, bool sendPacket = true) { if (genre != ItemTypeEnum.TYPE_MANIFESTATION) return null; diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index 04995c8..e8f9a72 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -66,10 +66,6 @@ public class PlayerInstance(PlayerGameData data) { await CharacterManager.AddCharacter((ItemTypeEnum)card.Genre, card.Detail, card.Particular, card.Level, sendPacket:false); } - foreach (var sc in GameData.SupportCardData) - { - await InventoryManager.AddSupportCardItem(sc.Detail, sc.Particular, sc.Level, sendPacket: false); - } foreach (var supplies in GameData.AllSuppliesData) { await InventoryManager.AddSuppliesItem(supplies, 90000, false); diff --git a/GameServer/Server/Packet/Send/Misc/PacketNtfCallScript.cs b/GameServer/Server/Packet/Send/Misc/PacketNtfCallScript.cs index 3bc08f4..7486522 100644 --- a/GameServer/Server/Packet/Send/Misc/PacketNtfCallScript.cs +++ b/GameServer/Server/Packet/Send/Misc/PacketNtfCallScript.cs @@ -53,6 +53,21 @@ public class PacketNtfCallScript : BasePacket SetData(proto); } + public PacketNtfCallScript(List cards) : base(CmdIds.NtfScript) + { + var proto = new NtfCallScript + { + Api = "", + Arg = "{}", + ExtraSync = new NtfSyncPlayer + { + Items = { cards.Select(x => x.ToProto()) } + } + }; + + SetData(proto); + } + public PacketNtfCallScript(InventoryData inventory) : base(CmdIds.NtfScript) { var proto = new NtfCallScript @@ -65,6 +80,7 @@ public class PacketNtfCallScript : BasePacket 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()); + foreach (var supportCard in inventory.SupportCards.Values) extraSync.Items.Add(supportCard.ToProto()); proto.ExtraSync = extraSync; SetData(proto); }