From 0d380ca7e7f702350cdb09ef18495f3d30afe0b6 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 5 Apr 2023 11:17:29 +0800 Subject: [PATCH] 1 --- server/gameserver/hero_agent.cc | 57 +++++++++++++++++---------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/server/gameserver/hero_agent.cc b/server/gameserver/hero_agent.cc index 5a1d0fce..96621f46 100644 --- a/server/gameserver/hero_agent.cc +++ b/server/gameserver/hero_agent.cc @@ -23,9 +23,6 @@ HeroAgent::~HeroAgent() State_e HeroAgent::GetState() { -#ifdef DEBUG1 - a8::XPrintf("GetState\n", {}); -#endif return kPreBattle; } @@ -35,53 +32,57 @@ behaviac::EBTStatus HeroAgent::DoIdle(int min_time, int max_time) return DoRunningCb(); } - int idle_time = a8::RandEx(min_time, max_time); - a8::XTimerWp timer_ptr = GetOwner()->room->xtimer.SetTimeoutWpEx + auto context = A8_MAKE_ANON_STRUCT_SHARED ( - idle_time / FRAME_RATE_MS, + a8::XTimerWp timer_ptr; + CreatureWeakPtr last_attacker; + long long last_attacked_frameno = 0; + std::weak_ptr handler; + ); + context->timer_ptr = GetOwner()->room->xtimer.SetTimeoutWpEx + ( + a8::RandEx(min_time, max_time) / FRAME_RATE_MS, [] (int event, const a8::Args* args) { }, &GetOwner()->xtimer_attacher); - - std::shared_ptr last_attacker = std::make_shared(); - std::shared_ptr last_attacked_frameno = std::make_shared(0); - std::weak_ptr handler = GetOwner()->GetTrigger()->AddListener + context->handler = GetOwner()->GetTrigger()->AddListener ( kAttacked, - [this, last_attacker, last_attacked_frameno] (const a8::Args& args) + [this, context] (const a8::Args& args) { Creature* c = args.Get(0); - *last_attacker = c->GetWeakPtrRef(); - *last_attacked_frameno = c->room->GetFrameNo(); + context->last_attacker = c->GetWeakPtrRef(); + context->last_attacked_frameno = c->room->GetFrameNo(); + }); + auto holder = std::make_shared + ( + [context] (const a8::Args& args) + { + /* + if (!handler.expired()) { + GetOwner()->GetTrigger()->RemoveEventHandler(handler); + }*/ }); return StartCoroutine ( - [this, timer_ptr, handler] () + [this, context, holder] () { - if (!timer_ptr.expired()) { + if (!context->timer_ptr.expired()) { return behaviac::BT_RUNNING; } else { - if (!handler.expired()) { - GetOwner()->GetTrigger()->RemoveEventHandler(handler); - } return behaviac::BT_SUCCESS; } }, - [this, timer_ptr, handler, last_attacker, last_attacked_frameno] + [this, context, holder] (bool is_test, bool& has_event) mutable { - has_event = last_attacker->Get() && !last_attacker->Get()->dead ? true : false; + has_event = context->last_attacker.Get() && !context->last_attacker.Get()->dead ? true : false; if (!is_test && has_event) { - if (!timer_ptr.expired()) { - GetOwner()->room->xtimer.Delete(timer_ptr); - } - if (!handler.expired()) { - GetOwner()->GetTrigger()->RemoveEventHandler(handler); - - } - FireEvent("OnAttacked", last_attacker->Get()->GetUniId(), *last_attacked_frameno); + FireEvent("OnAttacked", + context->last_attacker.Get()->GetUniId(), + context->last_attacked_frameno); } }, "CoIdle"