From bf0c5abcc2876c364751bcee930788e805b83819 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 20 Apr 2023 14:09:13 +0800 Subject: [PATCH] 1 --- server/gameserver/guide.cc | 61 +++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 8 deletions(-) diff --git a/server/gameserver/guide.cc b/server/gameserver/guide.cc index c718a39b..f5878bc0 100644 --- a/server/gameserver/guide.cc +++ b/server/gameserver/guide.cc @@ -92,14 +92,60 @@ void Guide::ProcMoveTargetAndPickup() NextStep(); return; } - for (auto& tuple : curr_step_meta_->_params) { - owner_->room->CreateLoot( - std::get<2>(tuple), - std::get<1>(tuple), - 1, - 1 - ); + auto context = A8_MAKE_ANON_STRUCT_SHARED + ( + std::vector loots; + ); + + { + int i = 0; + for (auto& tuple : curr_step_meta_->_params) { + int time = std::get<0>(tuple); + glm::vec3 pos = std::get<1>(tuple); + int equip_id = std::get<2>(tuple); + context->loots.push_back(-1); + owner_->room->xtimer.SetTimeoutEx + ( + time / FRAME_RATE_MS, + [this, equip_id, pos, context, i ] (int event, const a8::Args* args) + { + if (a8::TIMER_EXEC_EVENT == event) { + context->loots[i] = owner_->room->CreateLoot + ( + equip_id, + pos, + 1, + 1 + ); + } + }, + &owner_->xtimer_attacher); + } } + + owner_->room->xtimer.SetTimeoutEx + (1, + [this, context] (int event, const a8::Args* args) + { + if (a8::TIMER_EXEC_EVENT == event) { + bool done = true; + for (int loot_uniid : context->loots) { + if (loot_uniid == -1) { + done = false; + break; + } + if (owner_->room->GetEntityByUniId(loot_uniid)) { + done = false; + break; + } + } + if (done) { + NextStep(); + } + } + }, + &owner_->xtimer_attacher); + } void Guide::ProcKillEnemy() @@ -117,7 +163,6 @@ void Guide::ProcUseSkill() } - void Guide::NextStep() { ++curr_step_idx_;