From c22e493451e1d65d1a3689d6fe580679e4d650f2 Mon Sep 17 00:00:00 2001 From: StopWuyu Date: Sat, 14 Dec 2024 20:53:28 +0800 Subject: [PATCH] fix: opening marked chest wont remove mark --- GameServer/Game/Player/PlayerInstance.cs | 16 ++++++++++++ .../MarkChest/HandlerUpdateMarkChestCsReq.cs | 10 +++----- .../PacketMarkChestChangedScNotify.cs | 25 +++++++++++++++++++ 3 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 GameServer/Server/Packet/Send/MarkChest/PacketMarkChestChangedScNotify.cs diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index e7619aca..096c3f4a 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -33,6 +33,7 @@ using EggLink.DanhengServer.GameServer.Game.Task; using EggLink.DanhengServer.GameServer.Game.TrainParty; using EggLink.DanhengServer.GameServer.Server; using EggLink.DanhengServer.GameServer.Server.Packet.Send.Lineup; +using EggLink.DanhengServer.GameServer.Server.Packet.Send.MarkChest; using EggLink.DanhengServer.GameServer.Server.Packet.Send.Player; using EggLink.DanhengServer.GameServer.Server.Packet.Send.PlayerSync; using EggLink.DanhengServer.GameServer.Server.Packet.Send.Scene; @@ -457,6 +458,21 @@ public class PlayerInstance(PlayerData data) var items = DropService.CalculateDropsFromProp(prop.PropInfo.ChestID); await InventoryManager!.AddItems(items); await SendPacket(new PacketOpenChestScNotify(prop.PropInfo.ChestID)); + + var notifyMark = false; + foreach (var markedChest in SceneData!.MarkedChestData.Values) + { + var chest = markedChest.Find(x => + x.FloorId == SceneInstance.FloorId && x.GroupId == prop.GroupID && + x.ConfigId == prop.PropInfo.ID); + + if (chest == null) continue; + markedChest.Remove(chest); + notifyMark = true; + } + + if (notifyMark) + await SendPacket(new PacketMarkChestChangedScNotify(this)); } break; diff --git a/GameServer/Server/Packet/Recv/MarkChest/HandlerUpdateMarkChestCsReq.cs b/GameServer/Server/Packet/Recv/MarkChest/HandlerUpdateMarkChestCsReq.cs index 44e8dabb..9901f26d 100644 --- a/GameServer/Server/Packet/Recv/MarkChest/HandlerUpdateMarkChestCsReq.cs +++ b/GameServer/Server/Packet/Recv/MarkChest/HandlerUpdateMarkChestCsReq.cs @@ -13,13 +13,7 @@ public class HandlerUpdateMarkChestCsReq : Handler var req = UpdateMarkChestCsReq.Parser.ParseFrom(data); var player = connection.Player!; - if (!player.SceneData!.MarkedChestData.TryGetValue((int)req.FuncId, out var markedChestData)) - { - markedChestData = []; - player.SceneData!.MarkedChestData[(int)req.FuncId] = markedChestData; - } - - markedChestData.Clear(); // update instead of appending + List markedChestData = []; foreach (var markChestInfo in req.MarkChestInfoList) { @@ -32,6 +26,8 @@ public class HandlerUpdateMarkChestCsReq : Handler }); } + player.SceneData!.MarkedChestData[(int)req.FuncId] = markedChestData; + await connection.SendPacket(new PacketUpdateMarkChestScRsp(req.FuncId, player)); } } \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/MarkChest/PacketMarkChestChangedScNotify.cs b/GameServer/Server/Packet/Send/MarkChest/PacketMarkChestChangedScNotify.cs new file mode 100644 index 00000000..3a8373c2 --- /dev/null +++ b/GameServer/Server/Packet/Send/MarkChest/PacketMarkChestChangedScNotify.cs @@ -0,0 +1,25 @@ +using EggLink.DanhengServer.GameServer.Game.Player; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.MarkChest; + +public class PacketMarkChestChangedScNotify : BasePacket +{ + public PacketMarkChestChangedScNotify(PlayerInstance player) : base(CmdIds.MarkChestChangedScNotify) + { + var proto = new MarkChestChangedScNotify + { + MarkChestFuncInfo = + { + player.SceneData!.MarkedChestData.Select(x => new MarkChestFuncInfo + { + FuncId = (uint)x.Key, + MarkChestInfoList = { x.Value.Select(y => y.ToProto()) } + }) + } + }; + + SetData(proto); + } +} \ No newline at end of file