[NOT TESTED] handle avatar promotion (#21)

This commit is contained in:
EggLink
2024-06-09 22:54:37 +08:00
committed by GitHub
4 changed files with 60 additions and 0 deletions

View File

@@ -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<int> RankIDList { get; set; } = [];
public string? JsonPath { get; set; } = "";

View File

@@ -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<ItemParam> 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;
}
}
}

View File

@@ -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<ItemData> LevelUpRelic(int uniqueId, ItemCostData costData)
{
var relicItem = Data.RelicItems.Find(x => x.UniqueId == uniqueId);

View File

@@ -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);
}
}
}