mirror of
https://github.com/EggLinks/DanhengServer-OpenSource.git
synced 2026-01-02 20:26:03 +08:00
feat: lock & discard & destroy
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
19
GameServer/Server/Packet/Recv/Item/HandlerLockRelicCsReq.cs
Normal file
19
GameServer/Server/Packet/Recv/Item/HandlerLockRelicCsReq.cs
Normal 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));
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
16
GameServer/Server/Packet/Send/Item/PacketLockRecliScRsp.cs
Normal file
16
GameServer/Server/Packet/Send/Item/PacketLockRecliScRsp.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user