diff --git a/Common/Data/Excel/AvatarConfigExcel.cs b/Common/Data/Excel/AvatarConfigExcel.cs index 409cf11f..1e2a8604 100644 --- a/Common/Data/Excel/AvatarConfigExcel.cs +++ b/Common/Data/Excel/AvatarConfigExcel.cs @@ -13,6 +13,8 @@ namespace EggLink.DanhengServer.Data.Excel public int AvatarID { get; set; } = 0; public HashName AvatarName { get; set; } = new(); public int ExpGroup { get; set; } = 0; + public int MaxPromotion { get; set; } = 0; + public int MaxRank { get; set; } = 0; public List RankIDList { get; set; } = []; public string? JsonPath { get; set; } = ""; diff --git a/Common/Data/Excel/AvatarPromotionConfigExcel.cs b/Common/Data/Excel/AvatarPromotionConfigExcel.cs index e5d972bf..f33c45ac 100644 --- a/Common/Data/Excel/AvatarPromotionConfigExcel.cs +++ b/Common/Data/Excel/AvatarPromotionConfigExcel.cs @@ -12,6 +12,9 @@ namespace EggLink.DanhengServer.Data.Excel public int AvatarID { get; set; } public int Promotion { get; set; } public int MaxLevel { get; set; } + public int PlayerLevelRequire { get; set; } + public int WorldLevelRequire { get; set; } + public List PromotionCostList { get; set; } = []; public override int GetId() { @@ -22,5 +25,11 @@ namespace EggLink.DanhengServer.Data.Excel { GameData.AvatarPromotionConfigData.Add(GetId(), this); } + + public class ItemParam + { + public int ItemID; + public int ItemNum; + } } } diff --git a/GameServer/Game/Inventory/InventoryManager.cs b/GameServer/Game/Inventory/InventoryManager.cs index ef3b7520..8d817b57 100644 --- a/GameServer/Game/Inventory/InventoryManager.cs +++ b/GameServer/Game/Inventory/InventoryManager.cs @@ -1,5 +1,6 @@ using EggLink.DanhengServer.Data; using EggLink.DanhengServer.Database; +using EggLink.DanhengServer.Database.Avatar; using EggLink.DanhengServer.Database.Inventory; using EggLink.DanhengServer.Enums.Item; using EggLink.DanhengServer.Game.Player; @@ -758,6 +759,32 @@ namespace EggLink.DanhengServer.Game.Inventory return list; } + public Boolean promoteAvatar(int avatarId) { + // Get avatar + AvatarInfo avatarData = Player.AvatarManager!.GetAvatar(avatarId)!; + if (avatarData == null || avatarData.Excel == null || avatarData.Promotion >= avatarData.Excel.MaxPromotion) return false; + + // Get promotion data + Data.Excel.AvatarPromotionConfigExcel promotion = GameData.AvatarPromotionConfigData.Values.FirstOrDefault(x => x.AvatarID == avatarId && x.Promotion == avatarData.Promotion + 1)!; + + // Sanity check + if ((promotion == null) || avatarData.Level < promotion.MaxLevel || Player.Data.Level < promotion.PlayerLevelRequire || Player.Data.WorldLevel < promotion.WorldLevelRequire) { + return false; + } + + // Pay items + foreach (var cost in promotion.PromotionCostList) { + Player.InventoryManager!.RemoveItem(cost.ItemID, cost.ItemNum); + } + + // Promote + avatarData.Promotion = avatarData.Promotion + 1; + + // Send packets + Player.SendPacket(new PacketPlayerSyncScNotify(avatarData)); + return true; + } + public List LevelUpRelic(int uniqueId, ItemCostData costData) { var relicItem = Data.RelicItems.Find(x => x.UniqueId == uniqueId); diff --git a/GameServer/Server/Packet/Recv/Avatar/HandlerPromoteAvatarCsReq.cs b/GameServer/Server/Packet/Recv/Avatar/HandlerPromoteAvatarCsReq.cs new file mode 100644 index 00000000..eeffb00b --- /dev/null +++ b/GameServer/Server/Packet/Recv/Avatar/HandlerPromoteAvatarCsReq.cs @@ -0,0 +1,22 @@ +using EggLink.DanhengServer.Proto; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Server.Packet.Recv.Avatar +{ + [Opcode(CmdIds.PromoteAvatarCsReq)] + public class HandlerPromoteAvatarCsReq : Handler + { + public override void OnHandle(Connection connection, byte[] header, byte[] data) + { + var req = PromoteAvatarCsReq.Parser.ParseFrom(data); + + connection.Player!.InventoryManager!.promoteAvatar((int)req.BaseAvatarId); + + connection.SendPacket(CmdIds.PromoteAvatarScRsp); + } + } +}