From 256f0e3f695a009be780a150b0678e38c077191c Mon Sep 17 00:00:00 2001 From: losunet Date: Mon, 24 Feb 2025 11:40:27 +0800 Subject: [PATCH] feat: lock & discard & destroy --- GameServer/Game/Inventory/InventoryManager.cs | 80 ++++++++++++++++++- .../Recv/Item/HandlerDestroyItemCsReq.cs | 2 +- .../Recv/Item/HandlerDiscardRelicCsReq.cs | 19 +++++ .../Recv/Item/HandlerLockEquipmentCsReq.cs | 19 +++++ .../Packet/Recv/Item/HandlerLockRelicCsReq.cs | 19 +++++ .../Send/Item/PacketDiscardRecliScRsp.cs | 17 ++++ .../Send/Item/PacketLockEquipmentScRsp.cs | 16 ++++ .../Packet/Send/Item/PacketLockRecliScRsp.cs | 16 ++++ 8 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 GameServer/Server/Packet/Recv/Item/HandlerDiscardRelicCsReq.cs create mode 100644 GameServer/Server/Packet/Recv/Item/HandlerLockEquipmentCsReq.cs create mode 100644 GameServer/Server/Packet/Recv/Item/HandlerLockRelicCsReq.cs create mode 100644 GameServer/Server/Packet/Send/Item/PacketDiscardRecliScRsp.cs create mode 100644 GameServer/Server/Packet/Send/Item/PacketLockEquipmentScRsp.cs create mode 100644 GameServer/Server/Packet/Send/Item/PacketLockRecliScRsp.cs diff --git a/GameServer/Game/Inventory/InventoryManager.cs b/GameServer/Game/Inventory/InventoryManager.cs index 247ab738..0326c312 100644 --- a/GameServer/Game/Inventory/InventoryManager.cs +++ b/GameServer/Game/Inventory/InventoryManager.cs @@ -1,4 +1,5 @@ -using EggLink.DanhengServer.Data; +using System.Collections.Frozen; +using EggLink.DanhengServer.Data; using EggLink.DanhengServer.Database; using EggLink.DanhengServer.Database.Inventory; using EggLink.DanhengServer.Enums.Item; @@ -11,6 +12,7 @@ using EggLink.DanhengServer.GameServer.Server.Packet.Send.PlayerSync; using EggLink.DanhengServer.GameServer.Server.Packet.Send.Scene; using EggLink.DanhengServer.Proto; using EggLink.DanhengServer.Util; +using Google.Protobuf.Collections; namespace EggLink.DanhengServer.GameServer.Game.Inventory; @@ -1293,4 +1295,80 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player) } #endregion + + #region Mark + public async ValueTask LockItems(RepeatedField ids, bool isLocked, ItemMainTypeEnum itemType = ItemMainTypeEnum.Unknown) + { + List targetItems; + switch (itemType) + { + case ItemMainTypeEnum.Equipment: + targetItems = Data.EquipmentItems; + break; + case ItemMainTypeEnum.Relic: + targetItems = Data.RelicItems; + break; + case ItemMainTypeEnum.Unknown: + case ItemMainTypeEnum.Virtual: + case ItemMainTypeEnum.AvatarCard: + case ItemMainTypeEnum.Usable: + case ItemMainTypeEnum.Material: + case ItemMainTypeEnum.Mission: + case ItemMainTypeEnum.Display: + case ItemMainTypeEnum.Pet: + default: + return false; + } + if (targetItems.Count == 0) return false; + var idPool = ids.ToList().ConvertAll(x => (int)x).ToFrozenSet(); + var items = new List(); + foreach (var x in targetItems) + { + if (x.Discarded || !idPool.Contains(x.UniqueId)) continue; + x.Locked = isLocked; + items.Add(x); + } + + if (items.Count <= 0) return false; + await player.SendPacket(new PacketPlayerSyncScNotify(items)); + return true; + } + + public async ValueTask DiscardItems(RepeatedField ids, bool discarded, ItemMainTypeEnum itemType = ItemMainTypeEnum.Unknown) + { + List targetItems; + switch (itemType) + { + case ItemMainTypeEnum.Equipment: + targetItems = Data.EquipmentItems; + break; + case ItemMainTypeEnum.Relic: + targetItems = Data.RelicItems; + break; + case ItemMainTypeEnum.Unknown: + case ItemMainTypeEnum.Virtual: + case ItemMainTypeEnum.AvatarCard: + case ItemMainTypeEnum.Usable: + case ItemMainTypeEnum.Material: + case ItemMainTypeEnum.Mission: + case ItemMainTypeEnum.Display: + case ItemMainTypeEnum.Pet: + default: + return false; + } + if (targetItems.Count == 0) return false; + var idPool = ids.ToList().ConvertAll(x => (int)x).ToFrozenSet(); + var items = new List(); + foreach (var x in targetItems) + { + if (x.Locked || !idPool.Contains(x.UniqueId)) continue; + x.Discarded = discarded; + items.Add(x); + } + + if (items.Count <= 0) return false; + await player.SendPacket(new PacketPlayerSyncScNotify(items)); + return true; + } + #endregion } \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Item/HandlerDestroyItemCsReq.cs b/GameServer/Server/Packet/Recv/Item/HandlerDestroyItemCsReq.cs index d4bb0249..b01ed3ca 100644 --- a/GameServer/Server/Packet/Recv/Item/HandlerDestroyItemCsReq.cs +++ b/GameServer/Server/Packet/Recv/Item/HandlerDestroyItemCsReq.cs @@ -10,7 +10,7 @@ public class HandlerDestroyItemCsReq : Handler { var req = DestroyItemCsReq.Parser.ParseFrom(data); - await connection.Player!.InventoryManager!.RemoveItem((int)req.ItemCount, (int)req.ItemCount); + await connection.Player!.InventoryManager!.RemoveItem((int)req.ItemId, (int)req.ItemCount); await connection.SendPacket(CmdIds.DestroyItemScRsp); } } \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Item/HandlerDiscardRelicCsReq.cs b/GameServer/Server/Packet/Recv/Item/HandlerDiscardRelicCsReq.cs new file mode 100644 index 00000000..69dc5c6c --- /dev/null +++ b/GameServer/Server/Packet/Recv/Item/HandlerDiscardRelicCsReq.cs @@ -0,0 +1,19 @@ +using EggLink.DanhengServer.Enums.Item; +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Item; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Item; + +[Opcode(CmdIds.DiscardRelicCsReq)] +public class HandlerDiscardRelicCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var req = DiscardRelicCsReq.Parser.ParseFrom(data); + var result = + await connection.Player!.InventoryManager!.DiscardItems(req.RelicUniqueIdList, req.IsDiscard, + ItemMainTypeEnum.Relic); + await connection.SendPacket(new PacketDiscardRelicScRsp(result, req.IsDiscard)); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Item/HandlerLockEquipmentCsReq.cs b/GameServer/Server/Packet/Recv/Item/HandlerLockEquipmentCsReq.cs new file mode 100644 index 00000000..c9d9cc14 --- /dev/null +++ b/GameServer/Server/Packet/Recv/Item/HandlerLockEquipmentCsReq.cs @@ -0,0 +1,19 @@ +using EggLink.DanhengServer.Enums.Item; +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Item; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Item; + +[Opcode(CmdIds.LockEquipmentCsReq)] +public class HandlerLockEquipmentCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var req = LockEquipmentCsReq.Parser.ParseFrom(data); + var result = + await connection.Player!.InventoryManager!.LockItems(req.EquipmentIdList, req.IsProtected, + ItemMainTypeEnum.Equipment); + await connection.SendPacket(new PacketLockEquipmentScRsp(result)); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Item/HandlerLockRelicCsReq.cs b/GameServer/Server/Packet/Recv/Item/HandlerLockRelicCsReq.cs new file mode 100644 index 00000000..4d735d52 --- /dev/null +++ b/GameServer/Server/Packet/Recv/Item/HandlerLockRelicCsReq.cs @@ -0,0 +1,19 @@ +using EggLink.DanhengServer.Enums.Item; +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Item; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Item; + +[Opcode(CmdIds.LockRelicCsReq)] +public class HandlerLockRelicCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var req = LockRelicCsReq.Parser.ParseFrom(data); + var result = + await connection.Player!.InventoryManager!.LockItems(req.RelicUniqueIdList, req.IsProtected, + ItemMainTypeEnum.Relic); + await connection.SendPacket(new PacketLockRelicScRsp(result)); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Item/PacketDiscardRecliScRsp.cs b/GameServer/Server/Packet/Send/Item/PacketDiscardRecliScRsp.cs new file mode 100644 index 00000000..c9d41043 --- /dev/null +++ b/GameServer/Server/Packet/Send/Item/PacketDiscardRecliScRsp.cs @@ -0,0 +1,17 @@ +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Item; + +public class PacketDiscardRelicScRsp : BasePacket +{ + public PacketDiscardRelicScRsp(bool success, bool isDiscard) : base(CmdIds.DiscardRelicScRsp) + { + DiscardRelicScRsp proto = new(); + + if (success) proto.IsDiscard = isDiscard; + else proto.Retcode = (uint)Retcode.RetFail; + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Item/PacketLockEquipmentScRsp.cs b/GameServer/Server/Packet/Send/Item/PacketLockEquipmentScRsp.cs new file mode 100644 index 00000000..c9e4fe5c --- /dev/null +++ b/GameServer/Server/Packet/Send/Item/PacketLockEquipmentScRsp.cs @@ -0,0 +1,16 @@ +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Item; + +public class PacketLockEquipmentScRsp : BasePacket +{ + public PacketLockEquipmentScRsp(bool success) : base(CmdIds.LockEquipmentScRsp) + { + LockEquipmentScRsp proto = new(); + + if (!success) proto.Retcode = (uint)Retcode.RetFail; + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Item/PacketLockRecliScRsp.cs b/GameServer/Server/Packet/Send/Item/PacketLockRecliScRsp.cs new file mode 100644 index 00000000..fd9004df --- /dev/null +++ b/GameServer/Server/Packet/Send/Item/PacketLockRecliScRsp.cs @@ -0,0 +1,16 @@ +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Item; + +public class PacketLockRelicScRsp : BasePacket +{ + public PacketLockRelicScRsp(bool success) : base(CmdIds.LockRelicScRsp) + { + LockRelicScRsp proto = new(); + + if (!success) proto.Retcode = (uint)Retcode.RetFail; + + SetData(proto); + } +} \ No newline at end of file