using AscNet.Common; 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; namespace AscNet.GameServer.Handlers { #region MsgPackScheme #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. [MessagePackObject(true)] public class EquipUpdateLockRequest { public int EquipId; public bool IsLock; } [MessagePackObject(true)] public class EquipUpdateLockResponse { public int Code; } [MessagePackObject(true)] public class EquipBreakthroughRequest { public int EquipId; } [MessagePackObject(true)] public class EquipBreakthroughResponse { public int Code; } [MessagePackObject(true)] public class EquipPutOnRequest { public int CharacterId; public int EquipId; public int Site; } [MessagePackObject(true)] public class EquipPutOnResponse { public int Code; } [MessagePackObject(true)] public class EquipTakeOffRequest { public List EquipIds; } [MessagePackObject(true)] public class EquipTakeOffResponse { public int Code; } [MessagePackObject(true)] public class EquipLevelUpRequest { public int EquipId; public Dictionary UseItems; public List UseEquipIdList; } [MessagePackObject(true)] public class EquipLevelUpResponse { public int Code; public int Level; public int Exp; } #pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. #endregion internal class EquipModule { [RequestPacketHandler("EquipLevelUpRequest")] public static void EquipLevelUpRequestHandler(Session session, Packet.Request packet) { EquipLevelUpRequest request = packet.Deserialize(); NotifyItemDataList notifyItemData = new(); int totalExp = 0; int totalCost = 0; foreach (var item in request.UseItems) { ItemTable? itemTable = TableReaderV2.Parse().FirstOrDefault(x => x.Id == item.Key); if (itemTable is not null) { var upgradeInfo = itemTable.GetEquipUpgradeInfo() * item.Value; totalExp += upgradeInfo.Exp; totalCost += upgradeInfo.Cost; notifyItemData.ItemDataList.Add(session.inventory.Do(item.Key, item.Value * -1)); } } notifyItemData.ItemDataList.Add(session.inventory.Do(Inventory.Coin, totalCost * -1)); session.SendPush(notifyItemData); EquipLevelUpResponse rsp = new() { Code = 0 }; var upEquip = session.character.AddEquipExp(request.EquipId, totalExp); if (upEquip != null) { rsp.Level = upEquip.Level; rsp.Exp = upEquip.Exp; NotifyEquipDataList notifyEquipDataList = new(); notifyEquipDataList.EquipDataList.Add(upEquip); session.SendPush(notifyEquipDataList); } 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) { EquipUpdateLockRequest request = packet.Deserialize(); var response = new EquipUpdateLockResponse(); var equip = session.character.Equips.Find(x => x.Id == request.EquipId); if (equip is null) { // EquipManagerGetCharEquipBySiteNotFound response.Code = 20021012; } else { equip.IsLock = request.IsLock; } session.SendResponse(response, packet.Id); } [RequestPacketHandler("EquipPutOnRequest")] public static void EquipPutOnRequestHandler(Session session, Packet.Request packet) { EquipPutOnRequest request = packet.Deserialize(); var prevEquip = session.character.Equips.Find(x => x.CharacterId == request.CharacterId && TableReaderV2.Parse().Find(t => t.Id == x.TemplateId)?.Site == request.Site); var toEquip = session.character.Equips.Find(x => x.Id == request.EquipId); if (prevEquip is not null && toEquip is not null) { prevEquip.CharacterId = 0; } if (toEquip is not null) { toEquip.CharacterId = request.CharacterId; } else { // EquipManagerGetCharEquipBySiteNotFound session.SendResponse(new EquipPutOnResponse() { Code = 20021012 }, packet.Id); return; } NotifyEquipDataList notifyEquipData = new(); notifyEquipData.EquipDataList.Add(toEquip); if (prevEquip is not null) notifyEquipData.EquipDataList.Add(prevEquip); session.SendPush(notifyEquipData); session.SendResponse(new EquipPutOnResponse(), packet.Id); } [RequestPacketHandler("EquipTakeOffRequest")] public static void EquipTakeOffRequestHandler(Session session, Packet.Request packet) { EquipTakeOffRequest request = packet.Deserialize(); foreach (var equipId in request.EquipIds) { var equip = session.character.Equips.Find(x => x.Id == equipId); if (equip is not null) equip.CharacterId = 0; } session.SendResponse(new EquipTakeOffResponse(), packet.Id); } } }