diff --git a/AscNet.GameServer/Handlers/EquipModule.cs b/AscNet.GameServer/Handlers/EquipModule.cs index 362ff34..d1a0128 100644 --- a/AscNet.GameServer/Handlers/EquipModule.cs +++ b/AscNet.GameServer/Handlers/EquipModule.cs @@ -2,6 +2,7 @@ using AscNet.Common.Database; using AscNet.Common.MsgPack; using AscNet.Common.Util; +using AscNet.Table.V2.share.equip; using AscNet.Table.V2.share.item; using MessagePack; @@ -22,6 +23,18 @@ namespace AscNet.GameServer.Handlers public int Code; } + [MessagePackObject(true)] + public class EquipBreakthroughRequest + { + public int EquipId; + } + + [MessagePackObject(true)] + public class EquipBreakthroughResponse + { + public int Code; + } + [MessagePackObject(true)] public class EquipPutOnRequest { @@ -98,6 +111,52 @@ namespace AscNet.GameServer.Handlers session.SendResponse(rsp, packet.Id); } + [RequestPacketHandler("EquipBreakthroughRequest")] + public static void EquipBreakthroughRequestHandler(Session session, Packet.Request packet) + { + EquipBreakthroughRequest request = packet.Deserialize(); + var response = new EquipBreakthroughResponse(); + var equip = session.character.Equips.Find(x => x.Id == request.EquipId); + if (equip is null) + { + // EquipManagerGetCharEquipBySiteNotFound + response.Code = 20021012; + } + else + { + EquipBreakThroughTable? equipBreakThrough = TableReaderV2.Parse().Find(x => x.EquipId == equip.TemplateId && equip.Breakthrough == x.Times); + if (equipBreakThrough is not null && TableReaderV2.Parse().Any(x => x.EquipId == equip.TemplateId && equip.Breakthrough + 1 == x.Times)) + { + NotifyItemDataList notifyItemData = new(); + + for (int i = 0; i < Math.Min(equipBreakThrough.ItemId.Count, equipBreakThrough.ItemCount.Count); i++) + { + notifyItemData.ItemDataList.Add(session.inventory.Do(equipBreakThrough.ItemId[i], equipBreakThrough.ItemCount[i] * -1)); + } + if (equipBreakThrough.UseMoney is not null && equipBreakThrough.UseMoney > 0) + notifyItemData.ItemDataList.Add(session.inventory.Do(equipBreakThrough.UseItemId ?? 1, (equipBreakThrough.UseMoney ?? 0) * -1)); + + session.SendPush(notifyItemData); + + equip.Breakthrough += 1; + equip.Level = 1; + equip.Exp = 0; + } + else if (equipBreakThrough is not null) + { + // EquipManagerBreakthroughMaxBreakthrough + response.Code = 20021010; + } + else + { + // EquipBreakthroughTemplateNotFound + response.Code = 20021002; + } + } + + session.SendResponse(response, packet.Id); + } + [RequestPacketHandler("EquipUpdateLockRequest")] public static void EquipUpdateLockRequestHandler(Session session, Packet.Request packet) {