diff --git a/server/gameserver/android_agent.cc b/server/gameserver/android_agent.cc index 400be199..b0e67dd6 100644 --- a/server/gameserver/android_agent.cc +++ b/server/gameserver/android_agent.cc @@ -62,10 +62,17 @@ behaviac::EBTStatus AndroidAgent::DoIdle(int min_time, int max_time) return behaviac::BT_SUCCESS; } }, - [this, last_attacker, last_attacked_frameno] (bool is_test, bool& has_event) + [this, timer_ptr, handler, last_attacker, last_attacked_frameno] + (bool is_test, bool& has_event) mutable { - has_event = last_attacker->Get() ? true : false; + has_event = last_attacker->Get() && !last_attacker->Get()->dead ? true : false; if (!is_test && has_event) { + if (!timer_ptr.expired()) { + GetOwner()->room->xtimer.DeleteTimer(timer_ptr); + } + if (!handler.expired()) { + GetOwner()->GetTrigger()->RemoveEventHandler(handler); + } FireEvent("OnAttacked", last_attacker->Get()->GetUniId(), *last_attacked_frameno); } }, @@ -89,13 +96,16 @@ behaviac::EBTStatus AndroidAgent::DoRandomWalk() return behaviac::BT_FAILURE; } + 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 ( kAttacked, - [this] (const std::vector& args) + [this, last_attacker, last_attacked_frameno] (const std::vector& args) { Creature* c = std::any_cast(args.at(0)); - FireEvent("OnAttacked", c->GetUniId(), c->room->GetFrameNo()); + *last_attacker = c->GetWeakPtrRef(); + *last_attacked_frameno = c->room->GetFrameNo(); }); return StartCoroutine @@ -111,9 +121,16 @@ behaviac::EBTStatus AndroidAgent::DoRandomWalk() return behaviac::BT_RUNNING; } }, - [this] (bool is_test, bool& has_event) + [this, handler, last_attacker, last_attacked_frameno] + (bool is_test, bool& has_event) mutable { - + has_event = last_attacker->Get() && !last_attacker->Get()->dead ? true : false; + if (!is_test && has_event) { + if (!handler.expired()) { + GetOwner()->GetTrigger()->RemoveEventHandler(handler); + } + FireEvent("OnAttacked", last_attacker->Get()->GetUniId(), *last_attacked_frameno); + } }, "CoRandomWalk" ); @@ -134,13 +151,16 @@ behaviac::EBTStatus AndroidAgent::DoRandomShot() a8::Vec2 shot_dir = dir; GetOwner()->Shot(shot_dir, shot_ok, 0, 0); + 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 ( kAttacked, - [this] (const std::vector& args) + [this, last_attacker, last_attacked_frameno] (const std::vector& args) { Creature* c = std::any_cast(args.at(0)); - FireEvent("OnAttacked", c->GetUniId(), c->room->GetFrameNo()); + *last_attacker = c->GetWeakPtrRef(); + *last_attacked_frameno = c->room->GetFrameNo(); }); long long last_frameno = GetOwner()->room->GetFrameNo(); @@ -161,11 +181,18 @@ behaviac::EBTStatus AndroidAgent::DoRandomShot() return behaviac::BT_RUNNING; } }, - [this] (bool is_test, bool& has_event) + [this, handler, last_attacker, last_attacked_frameno] + (bool is_test, bool& has_event) mutable { - + has_event = last_attacker->Get() && !last_attacker->Get()->dead ? true : false; + if (!is_test && has_event) { + if (!handler.expired()) { + GetOwner()->GetTrigger()->RemoveEventHandler(handler); + } + FireEvent("OnAttacked", last_attacker->Get()->GetUniId(), *last_attacked_frameno); + } }, - "CoRandomShot" + "CoRandomShot" ); }