feat: lock & discard & destroy

This commit is contained in:
losunet
2025-02-24 11:40:27 +08:00
parent 4c5ee73acd
commit 256f0e3f69
8 changed files with 186 additions and 2 deletions

View File

@@ -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<bool> LockItems(RepeatedField<uint> ids, bool isLocked, ItemMainTypeEnum itemType = ItemMainTypeEnum.Unknown)
{
List<ItemData> 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<ItemData>();
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<bool> DiscardItems(RepeatedField<uint> ids, bool discarded, ItemMainTypeEnum itemType = ItemMainTypeEnum.Unknown)
{
List<ItemData> 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<ItemData>();
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
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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