From 1644f59e2a4510f70734df64cf71eeaa069a43f7 Mon Sep 17 00:00:00 2001 From: Ryan Yappert Date: Sun, 1 Sep 2024 22:15:26 -0700 Subject: [PATCH] Review comments; use a Task.Delay to properly space out the training reset. --- .../InstanceTraningRoomGetEnemyListHandler.cs | 12 +- .../InstanceTraningRoomSetEnemyHandler.cs | 202 ++++++++++-------- 2 files changed, 109 insertions(+), 105 deletions(-) diff --git a/Arrowgene.Ddon.GameServer/Handler/InstanceTraningRoomGetEnemyListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/InstanceTraningRoomGetEnemyListHandler.cs index 0a92e5e95..f47ed85df 100644 --- a/Arrowgene.Ddon.GameServer/Handler/InstanceTraningRoomGetEnemyListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/InstanceTraningRoomGetEnemyListHandler.cs @@ -10,22 +10,14 @@ public class InstanceTraningRoomGetEnemyListHandler : GameRequestPacketHandler(typeof(QuestGetQuestCompletedListHandler)); - public static readonly CDataStageLayoutId TrainingRoomLayout = new CDataStageLayoutId(349, 0, 1); public InstanceTraningRoomGetEnemyListHandler(DdonGameServer server) : base(server) { } public override S2CInstanceTraningRoomGetEnemyListRes Handle(GameClient client, C2SInstanceTraningRoomGetEnemyListReq request) - { - // TODO: Figure out a better way to do this. - // If the reset notice is too soon before the repop notice (in InstanceTraningRoomSetEnemyHandler), - // the repop sometimes fails to happen. - client.Party.SendToAll(new S2CInstanceEnemyGroupResetNtc() - { - LayoutId = TrainingRoomLayout - }); - + { + // These OptionIds are intepreted in InstanceTraningRoomSetEnemyHandler. return new S2CInstanceTraningRoomGetEnemyListRes() { MaxLv = 100, diff --git a/Arrowgene.Ddon.GameServer/Handler/InstanceTraningRoomSetEnemyHandler.cs b/Arrowgene.Ddon.GameServer/Handler/InstanceTraningRoomSetEnemyHandler.cs index 0af5a30f2..d7c38a848 100644 --- a/Arrowgene.Ddon.GameServer/Handler/InstanceTraningRoomSetEnemyHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/InstanceTraningRoomSetEnemyHandler.cs @@ -1,126 +1,138 @@ using Arrowgene.Ddon.Shared.Entity.PacketStructure; using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Network; +using System.Threading.Tasks; namespace Arrowgene.Ddon.GameServer.Handler { - public class InstanceTraningRoomSetEnemyHandler : GameRequestPacketHandler + public class InstanceTraningRoomSetEnemyHandler : GameStructurePacketHandler { public InstanceTraningRoomSetEnemyHandler(DdonGameServer server) : base(server) { } - public override S2CInstanceTraningRoomSetEnemyRes Handle(GameClient client, C2SInstanceTraningRoomSetEnemyReq request) + private static readonly CDataStageLayoutId TrainingRoomLayout = new CDataStageLayoutId(349, 0, 1); + private static readonly int RepopDelay = 2000; // ms + + public override void Handle(GameClient client, StructurePacket packet) { // TODO: Enemies that share the same positionIndex sometimes spawn with the wrong HP. // To avoid this in the meantime, each enemy must have its own unique positionIndex. // But the training room layout only has 6 (0-5) indices, so you can only have six different spawns. - var layoutId = InstanceTraningRoomGetEnemyListHandler.TrainingRoomLayout; + client.Send(new S2CInstanceTraningRoomSetEnemyRes()); - switch (request.OptionId) + client.Party.SendToAll(new S2CInstanceEnemyGroupResetNtc() { - case 1: // Two orc soldiers - client.Party.SendToAll(new S2CInstanceEnemyRepopNtc() - { - LayoutId = layoutId, - EnemyData = new CDataLayoutEnemyData() + LayoutId = TrainingRoomLayout + }); + + ushort level = (ushort)packet.Structure.Lv; + + Task.Delay(RepopDelay).ContinueWith(_ => { + switch (packet.Structure.OptionId) + { + case 1: // Two orc soldiers + client.Party.SendToAll(new S2CInstanceEnemyRepopNtc() { - PositionIndex = 0, - EnemyInfo = new CDataStageLayoutEnemyPresetEnemyInfoClient() + LayoutId = TrainingRoomLayout, + EnemyData = new CDataLayoutEnemyData() { - EnemyId = 0x15800, - NamedEnemyParamsId = 47, // Training - Lv = (ushort)request.Lv, - RepopCount = 10, - Scale = 100, - IsBossGauge = true, - } - }, - WaitSecond = 1, - }); - client.Party.SendToAll(new S2CInstanceEnemyRepopNtc() - { - LayoutId = layoutId, - EnemyData = new CDataLayoutEnemyData() + PositionIndex = 0, + EnemyInfo = new CDataStageLayoutEnemyPresetEnemyInfoClient() + { + EnemyId = 0x15800, + NamedEnemyParamsId = 47, // Training + Lv = level, + RepopCount = 10, + Scale = 100, + IsBossGauge = true, + } + }, + WaitSecond = 0, + }); + client.Party.SendToAll(new S2CInstanceEnemyRepopNtc() { - PositionIndex = 1, - EnemyInfo = new CDataStageLayoutEnemyPresetEnemyInfoClient() + LayoutId = TrainingRoomLayout, + EnemyData = new CDataLayoutEnemyData() { - EnemyId = 0x15800, - NamedEnemyParamsId = 47, // Training - Lv = (ushort)request.Lv, - RepopCount = 10, - Scale = 100, - IsBossGauge = true, - } - }, - WaitSecond = 1, - }); - break; - case 2: // Cyclops - client.Party.SendToAll(new S2CInstanceEnemyRepopNtc() - { - LayoutId = layoutId, - EnemyData = new CDataLayoutEnemyData() + PositionIndex = 1, + EnemyInfo = new CDataStageLayoutEnemyPresetEnemyInfoClient() + { + EnemyId = 0x15800, + NamedEnemyParamsId = 47, // Training + Lv = level, + RepopCount = 10, + Scale = 100, + IsBossGauge = true, + } + }, + WaitSecond = 0, + }); + break; + case 2: // Cyclops + client.Party.SendToAll(new S2CInstanceEnemyRepopNtc() { - PositionIndex = 2, - EnemyInfo = new CDataStageLayoutEnemyPresetEnemyInfoClient() + LayoutId = TrainingRoomLayout, + EnemyData = new CDataLayoutEnemyData() { - EnemyId = 0x15000, - NamedEnemyParamsId = 47, // Training - Lv = (ushort)request.Lv, - RepopCount = 10, - Scale = 100, - IsBossGauge = true, - } - }, - WaitSecond = 1, - }); - break; - case 3: //Ogre - client.Party.SendToAll(new S2CInstanceEnemyRepopNtc() - { - LayoutId = layoutId, - EnemyData = new CDataLayoutEnemyData() + PositionIndex = 2, + EnemyInfo = new CDataStageLayoutEnemyPresetEnemyInfoClient() + { + EnemyId = 0x15000, + NamedEnemyParamsId = 47, // Training + Lv = level, + RepopCount = 10, + Scale = 100, + IsBossGauge = true, + } + }, + WaitSecond = 0, + }); + break; + case 3: //Ogre + client.Party.SendToAll(new S2CInstanceEnemyRepopNtc() { - PositionIndex = 3, - EnemyInfo = new CDataStageLayoutEnemyPresetEnemyInfoClient() + LayoutId = TrainingRoomLayout, + EnemyData = new CDataLayoutEnemyData() { - EnemyId = 0x15500, - NamedEnemyParamsId = 47, // Training - Lv = (ushort)request.Lv, - RepopCount = 10, - Scale = 100, - IsBossGauge = true, - } - }, - WaitSecond = 1, - }); - break; - case 4: //Passive Zuhl - client.Party.SendToAll(new S2CInstanceEnemyRepopNtc() - { - LayoutId = layoutId, - EnemyData = new CDataLayoutEnemyData() + PositionIndex = 3, + EnemyInfo = new CDataStageLayoutEnemyPresetEnemyInfoClient() + { + EnemyId = 0x15500, + NamedEnemyParamsId = 47, // Training + Lv = level, + RepopCount = 10, + Scale = 100, + IsBossGauge = true, + } + }, + WaitSecond = 0, + }); + break; + case 4: //Passive Zuhl + client.Party.SendToAll(new S2CInstanceEnemyRepopNtc() { - PositionIndex = 4, - EnemyInfo = new CDataStageLayoutEnemyPresetEnemyInfoClient() + LayoutId = TrainingRoomLayout, + EnemyData = new CDataLayoutEnemyData() { - EnemyId = 0x100101, - NamedEnemyParamsId = 722, // Practice , has extra HP. - Lv = (ushort)request.Lv, - RepopCount = 10, - Scale = 75, - IsBossGauge = true, - } - }, - WaitSecond = 1, - }); - break; - } - - return new S2CInstanceTraningRoomSetEnemyRes(); + PositionIndex = 4, + EnemyInfo = new CDataStageLayoutEnemyPresetEnemyInfoClient() + { + EnemyId = 0x100101, + NamedEnemyParamsId = 722, // Practice , has extra HP. + Lv = level, + RepopCount = 10, + Scale = 75, + IsBossGauge = true, + } + }, + WaitSecond = 0, + }); + break; + } + }); } } }