From 27d1fada8d1e9f8b981d7ba35e75e69335f97320 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 28 Jun 2023 18:34:03 +0800 Subject: [PATCH] 1 --- server/gameserver/base_agent.cc | 64 +++++++++++++++++++++++++++++++-- server/gameserver/creature.cc | 12 +++---- 2 files changed, 66 insertions(+), 10 deletions(-) diff --git a/server/gameserver/base_agent.cc b/server/gameserver/base_agent.cc index d32378e0..f1213f7e 100644 --- a/server/gameserver/base_agent.cc +++ b/server/gameserver/base_agent.cc @@ -334,18 +334,78 @@ behaviac::EBTStatus BaseAgent::SelectUseableSkill(const behaviac::vector sk behaviac::EBTStatus BaseAgent::CoFindPathToCurrentTarget(float distance) { + if (status_ == behaviac::BT_RUNNING) { + return DoRunningCb(); + } if (!current_target_.Get()) { return behaviac::BT_FAILURE; } - return behaviac::BT_SUCCESS; + bool ret = GetOwner()->GetMovement()->FindPath(current_target_.Get()->GetPos().ToGlmVec3(), distance); + if (!ret) { + return behaviac::BT_FAILURE; + } + auto context = MAKE_BTCONTEXT + ( + ); + +#ifdef DEBUG + a8::XPrintf("CoFindPathToCurrentTarget %d\n", {current_target_.Get()->GetUniId()}); +#endif + auto co = std::make_shared(context, "CoFindPathToCurrentTarget"); + co->runing_cb = + [this, context] () + { + if (GetOwner()->dead) { + return behaviac::BT_FAILURE; + } + if (GetOwner()->GetMovement()->GetPathSize() <= 0) { + return behaviac::BT_SUCCESS; + } + return behaviac::BT_RUNNING; + }; + return StartCoroutine(co); } behaviac::EBTStatus BaseAgent::CoMoveToCurrentTarget(float distance) { + if (status_ == behaviac::BT_RUNNING) { + return DoRunningCb(); + } if (!current_target_.Get()) { return behaviac::BT_FAILURE; } - return behaviac::BT_SUCCESS; + if (GlmHelper::IsEqual2D(GetOwner()->GetPos().ToGlmVec3(), + current_target_.Get()->GetPos().ToGlmVec3())) { + return behaviac::BT_SUCCESS; + } + auto context = MAKE_BTCONTEXT + ( + CreatureWeakPtr target; + ); + + context->target = current_target_; + glm::vec3 dir = GetOwner()->GetPos().CalcDir(context->target.Get()->GetPos()); + GlmHelper::Normalize(dir); + GetOwner()->SetMoveDir(dir); + GetOwner()->SetAttackDir(dir); + GetOwner()->GetMovement()->CalcTargetPos(60); + +#ifdef DEBUG + a8::XPrintf("CoMoveToCurrentTarget %d\n", {current_target_.Get()->GetUniId()}); +#endif + auto co = std::make_shared(context, "CoMoveToCurrentTarget"); + co->runing_cb = + [this, context] () + { + if (GetOwner()->dead) { + return behaviac::BT_FAILURE; + } + if (GetOwner()->GetMovement()->GetPathSize() <= 0) { + return behaviac::BT_SUCCESS; + } + return behaviac::BT_RUNNING; + }; + return StartCoroutine(co); } bool BaseAgent::CurrentTargetIsValid() diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index f9a24a06..999f425d 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -2352,19 +2352,15 @@ void Creature::UpdateMove() if (room->GetGasData().GetGasMode() == GasInactive && room->IsSandTableRoom()) { } else { - GetMovement()->CalcTargetPos(mt::Param::s().move_step_len); - if (!GetMovement()->UpdatePosition()) { -#if 1 - { -#else - if (IsPlayer()) { -#endif + if (IsPlayer() || HasBuffEffect(kBET_Sprint)) { + GetMovement()->CalcTargetPos(mt::Param::s().move_step_len); + if (!GetMovement()->UpdatePosition()) { if (HasBuffEffect(kBET_Sprint)) { SprintBuff* buff = (SprintBuff*)GetBuffByEffectId(kBET_Sprint); if (buff) { buff->SprintEnd(); } - } else { + } else if (IsPlayer()) { ShortFindPath(); } }