diff --git a/Common/Data/Excel/ElfAstraMateDataExcel.cs b/Common/Data/Excel/ElfAstraMateDataExcel.cs index 99484dd..bb88ad7 100644 --- a/Common/Data/Excel/ElfAstraMateDataExcel.cs +++ b/Common/Data/Excel/ElfAstraMateDataExcel.cs @@ -5,26 +5,25 @@ namespace KianaBH.Data.Excel; [ResourceEntity("Elf_AstraMate_Data.json")] public class ElfAstraMateDataExcel : ExcelResource { - public uint ElfID { get; set; } - public uint MaxLevel { get; set; } - public uint MaxRarity { get; set; } + public int ElfID { get; set; } + public int MaxLevel { get; set; } + public int MaxRarity { get; set; } [JsonIgnore] public List SkillList = []; public override int GetId() { - return (int)ElfID; + return ElfID; } public override void Loaded() { - GameData.ElfAstraMateData.Add(GetId(), this); + GameData.ElfAstraMateData.Add(ElfID, this); } public override void AfterAllDone() { - GameData.ElfSkillData.TryGetValue(GetId(), out var Skills); - if (Skills == null || !Skills.ElfIds.Contains(ElfID)) return; - SkillList.Add(Skills); + SkillList.AddRange(GameData.ElfSkillData.Values + .Where(skill => skill.ElfIDList.Contains(ElfID))); } } \ No newline at end of file diff --git a/Common/Data/Excel/ElfSkillDataExcel.cs b/Common/Data/Excel/ElfSkillDataExcel.cs index 4170876..fe1697e 100644 --- a/Common/Data/Excel/ElfSkillDataExcel.cs +++ b/Common/Data/Excel/ElfSkillDataExcel.cs @@ -3,12 +3,12 @@ [ResourceEntity("ElfSkillData.json")] public class ElfSkillDataExcel : ExcelResource { - public uint ElfSkillID { get; set; } - public uint MaxLv { get; set; } - public List ElfIds { get; set; } = []; + public int ElfSkillID { get; set; } + public int MaxLv { get; set; } + public List ElfIDList { get; set; } = []; public override int GetId() { - return (int)ElfSkillID; + return ElfSkillID; } public override void Loaded() diff --git a/Common/Database/Elfs/ElfData.cs b/Common/Database/Elfs/ElfData.cs new file mode 100644 index 0000000..eb3b62b --- /dev/null +++ b/Common/Database/Elfs/ElfData.cs @@ -0,0 +1,61 @@ +using KianaBH.Data; +using KianaBH.Proto; +using SqlSugar; + +namespace KianaBH.Database.Elfs; + +[SugarTable("ElfsData")] +public class ElfsData : BaseDatabaseDataHelper +{ + [SugarColumn(IsJson = true)] public List Elfs { get; set; } = []; + [SugarColumn(IsJson = true)] public List ElfsFragment { get; set; } = []; +} + +public class ElfData +{ + public int ElfId { get; set; } + public int Level { get; set; } + public int Star { get; set; } + public int Exp { get; set; } + public List EquipTalentIdList { get; set; } = []; + public List SkillList { get; set; } = []; + public int CompensateLevel { get; set; } + public int TotalCompensateExp { get; set; } + public long Timestamp { get; set; } + + public Elf ToProto() + { + return new Elf + { + ElfId = (uint)ElfId, + Star = (uint)Star, + Level = (uint)Level, + Exp = (uint)Exp, + EquipTalentIdList = { EquipTalentIdList.Select(id => (uint)id) }, + CompensateLevel = (uint)CompensateLevel, + TotalCompensateExp = (uint)TotalCompensateExp, + SkillList = + { + SkillList.Select(x => new ElfSkill + { + SkillId = (uint)x.SkillId, + SkillLevel = (uint)x.SkillLevel, + }) + } + }; + } + + +} + +public class ElfFragment +{ + public int ElfId { get; set; } + public int FragmentNum { get; set; } +} + +public class Skill +{ + public int SkillId { get; set; } + public int SkillLevel { get; set; } +} diff --git a/Common/Internationalization/Message/LanguageEN.cs b/Common/Internationalization/Message/LanguageEN.cs index ac1e8d2..9dd1556 100644 --- a/Common/Internationalization/Message/LanguageEN.cs +++ b/Common/Internationalization/Message/LanguageEN.cs @@ -42,6 +42,7 @@ public class WordTextEN public string Weapon => "Weapon"; public string Banner => "Gacha"; public string Activity => "Activity"; + public string Elf => "Elf"; // server info public string Config => "Config File"; @@ -78,6 +79,7 @@ public class CommandTextEN public HelpTextEN Help { get; } = new(); public ValkTextEN Valk { get; } = new(); public GiveAllTextEN GiveAll { get; } = new(); + public ElfTextEN Elf { get; } = new(); } #endregion @@ -211,6 +213,26 @@ public class GiveAllTextEN public string GiveAllItems => "Granted all {0}"; } +/// +/// path: Game.Command.Elf +/// +public class ElfTextEN +{ + public string Desc => "Set attributes for owned elfs\n" + + "Note: -1 means all owned elfs\n"; + + public string Usage => + "Usage: /elf add [ElfID/-1] l s\n\n"; + + public string ElfNotFound => "Elf does not exist!"; + public string ElfAddedAll => "Granted all Elfs to player!"; + public string ElfAdded => "Granted Elf {0} to player!"; + public string ElfSetLevelAll => "Set all Elfs to level {0}!"; + public string ElfSetLevel => "Set Elf {0} to level {1}!"; + public string ElfSetStarAll => "Set all Elf's Resonance to {0}!"; + public string ElfSetStar => "Set Elf {0}'s Resonance to {1}!"; +} + #endregion #endregion \ No newline at end of file diff --git a/GameServer/Command/Commands/CommandElf.cs b/GameServer/Command/Commands/CommandElf.cs new file mode 100644 index 0000000..c8fb590 --- /dev/null +++ b/GameServer/Command/Commands/CommandElf.cs @@ -0,0 +1,41 @@ +using KianaBH.Data; +using KianaBH.Enums.Player; +using KianaBH.Internationalization; + +namespace KianaBH.GameServer.Command.Commands; + +[CommandInfo("elf", "Game.Command.Elf.Desc", "Game.Command.Elf.Usage", ["e"], [PermEnum.Admin, PermEnum.Support])] +public class CommandElf : ICommands +{ + [CommandMethod("add")] + public async ValueTask GetElf(CommandArg arg) + { + if (!await arg.CheckOnlineTarget()) return; + + var elfId = arg.GetInt(0); + if (await arg.GetOption('l') is not int level) return; + if (await arg.GetOption('s') is not int star) return; + + level = Math.Clamp(level, 1, 80); + star = Math.Clamp(star, 1, 7); + + if (elfId == -1) + { + // add all + foreach (var config in GameData.ElfAstraMateData.Values) + await arg.Target!.Player!.ElfManager!.AddElf(config.ElfID, level, config.MaxRarity, sync:false); + await arg.SendMsg(I18NManager.Translate("Game.Command.Elf.ElfAddedAll")); + await arg.Target!.Player!.SyncElf(); + } + else + { + var elf = await arg.Target!.Player!.ElfManager!.AddElf(elfId, level, star); + if (elf == null) + { + await arg.SendMsg(I18NManager.Translate("Game.Command.Elf.ElfNotFound")); + return; + } + await arg.SendMsg(I18NManager.Translate("Game.Command.Elf.ElfAdded",elfId.ToString())); + } + } +} \ No newline at end of file diff --git a/GameServer/Game/Elf/ElfManager.cs b/GameServer/Game/Elf/ElfManager.cs new file mode 100644 index 0000000..e5aaa48 --- /dev/null +++ b/GameServer/Game/Elf/ElfManager.cs @@ -0,0 +1,49 @@ +using KianaBH.Data.Excel; +using KianaBH.Data; +using KianaBH.Database; +using KianaBH.Database.Avatar; +using KianaBH.Database.Elfs; +using KianaBH.Enums.Item; +using KianaBH.GameServer.Game.Player; +using KianaBH.GameServer.Server.Packet.Send.Avatar; +using KianaBH.Util.Extensions; +using KianaBH.Proto; +using KianaBH.GameServer.Server.Packet.Send.Elf; + +namespace KianaBH.GameServer.Game.Elf; + +public class ElfManager(PlayerInstance player) : BasePlayerManager(player) +{ + public ElfsData ElfData = DatabaseHelper.GetInstanceOrCreateNew(player.Uid); + + public async ValueTask AddElf(int elfId, int level = 1, int star = 0, bool sync = true) + { + if (ElfData.Elfs.Any(a => a.ElfId == elfId)) return null; + GameData.ElfAstraMateData.TryGetValue(elfId, out var elfExcel); + if (elfExcel == null) return null; + + var elf = new ElfData + { + ElfId = elfId, + Level = level, + Timestamp = Extensions.GetUnixSec(), + Star = elfExcel.MaxRarity <= star ? elfExcel.MaxRarity : star, + }; + + foreach (var skill in elfExcel.SkillList) + { + elf.SkillList.Add(new Skill + { + SkillId = skill.ElfSkillID, + SkillLevel = skill.MaxLv, + }); + }; + + ElfData.Elfs.Add(elf); + + if (sync) await Player.SendPacket(new PacketGetElfDataRsp(Player)); + + return elfExcel; + } + +} \ No newline at end of file diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index 4487346..6edd917 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -5,9 +5,11 @@ using KianaBH.Database.Client; using KianaBH.Database.Player; using KianaBH.GameServer.Game.Avatar; using KianaBH.GameServer.Game.Battle; +using KianaBH.GameServer.Game.Elf; using KianaBH.GameServer.Game.Inventory; using KianaBH.GameServer.Server; using KianaBH.GameServer.Server.Packet.Send.Avatar; +using KianaBH.GameServer.Server.Packet.Send.Elf; using KianaBH.GameServer.Server.Packet.Send.Item; using KianaBH.KcpSharp; using KianaBH.Util.Extensions; @@ -18,6 +20,7 @@ public class PlayerInstance(PlayerData data) { public AvatarManager? AvatarManager { get; private set; } public InventoryManager? InventoryManager { get; private set; } + public ElfManager? ElfManager { get; private set; } public static readonly List _playerInstances = []; public PlayerData Data { get; set; } = data; @@ -55,6 +58,7 @@ public class PlayerInstance(PlayerData data) Uid = Data.Uid; AvatarManager = new AvatarManager(this); InventoryManager = new InventoryManager(this); + ElfManager = new ElfManager(this); ClientData = InitializeDatabase(); GuideData = InitializeDatabase(); WorldChatManager = new WorldChatManager(this); @@ -111,6 +115,11 @@ public class PlayerInstance(PlayerData data) return Data.ToProto(); } + public async ValueTask SyncElf() + { + await SendPacket(new PacketGetElfDataRsp(this)); + } + public async ValueTask SyncInventory() { await SendPacket(new PacketGetEquipmentDataRsp(this)); diff --git a/GameServer/Server/Packet/Recv/Elf/HandlerGetElfDataReq.cs b/GameServer/Server/Packet/Recv/Elf/HandlerGetElfDataReq.cs index 7ccf87f..1b59b71 100644 --- a/GameServer/Server/Packet/Recv/Elf/HandlerGetElfDataReq.cs +++ b/GameServer/Server/Packet/Recv/Elf/HandlerGetElfDataReq.cs @@ -8,6 +8,6 @@ public class HandlerGetElfDataReq : Handler { public override async Task OnHandle(Connection connection, byte[] header, byte[] data) { - await connection.SendPacket(new PacketGetElfDataRsp()); + await connection.SendPacket(new PacketGetElfDataRsp(connection.Player!)); } } diff --git a/GameServer/Server/Packet/Send/Elf/PacketGetElfDataRsp.cs b/GameServer/Server/Packet/Send/Elf/PacketGetElfDataRsp.cs index 739d70d..d17ebf5 100644 --- a/GameServer/Server/Packet/Send/Elf/PacketGetElfDataRsp.cs +++ b/GameServer/Server/Packet/Send/Elf/PacketGetElfDataRsp.cs @@ -1,3 +1,4 @@ +using KianaBH.GameServer.Game.Player; using KianaBH.KcpSharp; using KianaBH.Proto; @@ -5,713 +6,11 @@ namespace KianaBH.GameServer.Server.Packet.Send.Elf; public class PacketGetElfDataRsp : BasePacket { - public PacketGetElfDataRsp() : base(CmdIds.GetElfDataRsp) + public PacketGetElfDataRsp(PlayerInstance player) : base(CmdIds.GetElfDataRsp) { - var proto = new GetElfDataRsp // TODO: GET FROM DB + var proto = new GetElfDataRsp { - ElfList = - { - new Proto.Elf - { - ElfId = 101, - Exp = 1, - Level = 80, - SkillList = - { - new ElfSkill - { - SkillId = 10101, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10102, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10103, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10105, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10106, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10107, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 101011, - SkillLevel = 6 - }, - new ElfSkill - { - SkillId = 101021, - SkillLevel = 3 - }, - new ElfSkill - { - SkillId = 101032, - SkillLevel = 4 - }, - new ElfSkill - { - SkillId = 101033, - SkillLevel = 4 - }, - new ElfSkill - { - SkillId = 101034, - SkillLevel = 4 - }, - new ElfSkill - { - SkillId = 101035, - SkillLevel = 4 - } - }, - Star = 7 - }, - new Proto.Elf - { - ElfId = 102, - Exp = 1, - Level = 80, - SkillList = - { - new ElfSkill - { - SkillId = 10201, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10202, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10203, - SkillLevel = 4 - }, - new ElfSkill - { - SkillId = 10205, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10206, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10207, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 102011, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 102031, - SkillLevel = 6 - }, - new ElfSkill - { - SkillId = 102032, - SkillLevel = 6 - }, - new ElfSkill - { - SkillId = 102033, - SkillLevel = 6 - }, - new ElfSkill - { - SkillId = 102034, - SkillLevel = 6 - } - }, - Star = 7 - }, - new Proto.Elf - { - ElfId = 106, - Exp = 1, - Level = 80, - SkillList = - { - new ElfSkill - { - SkillId = 10601, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10602, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10603, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10604, - SkillLevel = 4 - }, - new ElfSkill - { - SkillId = 10605, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10606, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10607, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 106011, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 106012, - SkillLevel = 3 - }, - new ElfSkill - { - SkillId = 106013, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 106021, - SkillLevel = 3 - }, - new ElfSkill - { - SkillId = 106022, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 106031, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 106032, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 106041, - SkillLevel = 3 - }, - new ElfSkill - { - SkillId = 106042, - SkillLevel = 4 - } - }, - Star = 4 - }, - new Proto.Elf - { - ElfId = 108, - Exp = 1, - Level = 80, - SkillList = { - new ElfSkill - { - SkillId = 10801, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10802, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10803, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10804, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10805, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10806, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 10807, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 108011, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 108012, - SkillLevel = 3 - }, - new ElfSkill - { - SkillId = 108013, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 108021, - SkillLevel = 3 - }, - new ElfSkill - { - SkillId = 108022, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 108023, - SkillLevel = 3 - }, - new ElfSkill - { - SkillId = 108031, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 108032, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 108041, - SkillLevel = 3 - }, - new ElfSkill - { - SkillId = 108042, - SkillLevel = 5 - } - }, - Star = 7 - }, - new Proto.Elf - { - ElfId = 110, - Exp = 1, - Level = 80, - SkillList = - { - new ElfSkill - { - SkillId = 11001, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 11002, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 11003, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 11004, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 11005, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 11006, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 11007, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 110011, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 110021, - SkillLevel = 3 - }, - new ElfSkill - { - SkillId = 110031, - SkillLevel = 3 - }, - new ElfSkill - { - SkillId = 110041, - SkillLevel = 4 - }, - new ElfSkill - { - SkillId = 110051, - SkillLevel = 3 - }, - new ElfSkill - { - SkillId = 110071, - SkillLevel = 5 - } - }, - Star = 2 - }, - new Proto.Elf - { - ElfId = 111, - Exp = 1, - Level = 80, - SkillList = - { - new ElfSkill - { - SkillId = 12001, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 12002, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 12003, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 12004, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 12005, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 12006, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 12007, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 120011, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 120021, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 120031, - SkillLevel = 6 - }, - new ElfSkill - { - SkillId = 120041, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 120042, - SkillLevel = 4 - } - }, - Star = 2 - }, - new Proto.Elf - { - ElfId = 112, - Exp = 1, - Level = 80, - SkillList = - { - new ElfSkill - { - SkillId = 13001, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 13002, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 13003, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 13004, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 13005, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 13006, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 13007, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 130011, - SkillLevel = 4 - }, - new ElfSkill - { - SkillId = 130012, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 130013, - SkillLevel = 3 - }, - new ElfSkill - { - SkillId = 130021, - SkillLevel = 3 - }, - new ElfSkill - { - SkillId = 130022, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 130023, - SkillLevel = 4 - }, - new ElfSkill - { - SkillId = 130031, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 130032, - SkillLevel = 4 - }, - new ElfSkill - { - SkillId = 130033, - SkillLevel = 4 - }, - new ElfSkill - { - SkillId = 130041, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 130042, - SkillLevel = 3 - }, - new ElfSkill - { - SkillId = 130043, - SkillLevel = 3 - } - }, - Star = 7 - }, - new Proto.Elf - { - ElfId = 113, - Exp = 1, - Level = 80, - SkillList = - { - new ElfSkill - { - SkillId = 14001, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 14002, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 14003, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 14004, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 14005, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 14006, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 14007, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 140011, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 140021, - SkillLevel = 5 - }, - new ElfSkill - { - SkillId = 140031, - SkillLevel = 5 - } - }, - Star = 2 - }, - new Proto.Elf - { - ElfId = 120, - Exp = 1, - Level = 80, - SkillList = - { - new ElfSkill - { - SkillId = 20005, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 20006, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 20007, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 200051, - SkillLevel = 3 - }, - new ElfSkill - { - SkillId = 200071, - SkillLevel = 2 - } - }, - Star = 1 - }, - new Proto.Elf - { - ElfId = 130, - Exp = 1, - Level = 80, - SkillList = - { - new ElfSkill - { - SkillId = 20005, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 20006, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 20007, - SkillLevel = 1 - }, - new ElfSkill - { - SkillId = 200051, - SkillLevel = 3 - }, - new ElfSkill - { - SkillId = 200071, - SkillLevel = 2 - } - }, - Star = 1 - } - } - + ElfList = { player.ElfManager!.ElfData.Elfs.Select(x => x.ToProto()) } }; SetData(proto);