From b9bfdd4371fe2a90ad9ec2e8a29a40683e79b0a1 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 8 Dec 2022 11:31:51 +0800 Subject: [PATCH] 1 --- server/gameserver/base_agent.cc | 36 ++++++++++++++++++++++++++------- server/gameserver/base_agent.h | 1 + 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/server/gameserver/base_agent.cc b/server/gameserver/base_agent.cc index 8b876130..bc77e9bd 100644 --- a/server/gameserver/base_agent.cc +++ b/server/gameserver/base_agent.cc @@ -37,17 +37,39 @@ behaviac::EBTStatus BaseAgent::DoRunningCb() return status_; } +behaviac::EBTStatus BaseAgent::StartCoroutine(std::function cb) +{ + status_runing_cb_ = std::move(cb); + status_ = behaviac::BT_RUNNING; + return status_; +} behaviac::EBTStatus BaseAgent::CoAttackTarget(int target_id) { if (status_ == behaviac::BT_RUNNING) { return DoRunningCb(); } - status_runing_cb_ = - [this] () mutable - { - return status_; - }; - status_ = behaviac::BT_RUNNING; - return status_; + Entity* entity = GetOwner()->room->GetEntityByUniId(target_id); + if (!entity || !entity->IsCreature(GetOwner()->room)) { + return behaviac::BT_FAILURE; + } + CreatureWeakPtr target = ((Creature*)entity)->GetWeakPtrRef(); + if (target.Get()->dead) { + return behaviac::BT_FAILURE; + } + + long long frameno = GetOwner()->room->GetFrameNo(); + long long last_pursuit_frameno = GetOwner()->room->GetFrameNo(); + return StartCoroutine + ( + [this, target, frameno, last_pursuit_frameno] () mutable + { + if (GetOwner()->room->GetFrameNo() - frameno > SERVER_FRAME_RATE * 10 || + !target.Get() || target.Get()->dead) { + return behaviac::BT_SUCCESS; + } else { + } + return behaviac::BT_RUNNING; + } + ); } diff --git a/server/gameserver/base_agent.h b/server/gameserver/base_agent.h index 29c696ef..31d77359 100644 --- a/server/gameserver/base_agent.h +++ b/server/gameserver/base_agent.h @@ -24,6 +24,7 @@ public: protected: behaviac::EBTStatus DoRunningCb(); + behaviac::EBTStatus StartCoroutine(std::function cb); protected: behaviac::EBTStatus status_= behaviac::BT_SUCCESS;