From 87a8e7dbb68723b33504f6471bdfc0dcdef89adf Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 28 Jun 2023 17:28:39 +0800 Subject: [PATCH] 1 --- server/gameserver/base_agent.cc | 77 ++++++++++++++++++++++++++------- server/gameserver/base_agent.h | 1 + server/gameserver/creature.cc | 3 ++ server/gameserver/room.cc | 5 +++ server/gameserver/room.h | 1 + 5 files changed, 72 insertions(+), 15 deletions(-) diff --git a/server/gameserver/base_agent.cc b/server/gameserver/base_agent.cc index 0fa48a7d..d32378e0 100644 --- a/server/gameserver/base_agent.cc +++ b/server/gameserver/base_agent.cc @@ -280,75 +280,122 @@ void BaseAgent::Sleep(int time) bool BaseAgent::CurrentTargetMoveCanReach() { - + if (!current_target_.Get()) { + return false; + } + return GetOwner()->room->MoveCanReach(GetOwner()->GetPos().ToGlmVec3(), + current_target_.Get()->GetPos().ToGlmVec3()); } behaviac::EBTStatus BaseAgent::DoSkill(int skill_id) { - + if (!current_target_.Get()) { + return behaviac::BT_FAILURE; + } + int wait_time = 0; + if (InternalUseSkill(skill_id, current_target_, wait_time)) { + return behaviac::BT_SUCCESS; + } + return behaviac::BT_FAILURE; } glm::vec3 BaseAgent::GetPos() { - + return GetOwner()->GetPos().ToGlmVec3(); } bool BaseAgent::MoveCanReach(const glm::vec3& pos) { - + return GetOwner()->room->MoveCanReach(GetOwner()->GetPos().ToGlmVec3(), + pos); } behaviac::EBTStatus BaseAgent::SelectUseableSkill(const behaviac::vector skill_ids) { - + selected_skill_id = 0; + if (!current_target_.Get()) { + return behaviac::BT_FAILURE; + } + for (int skill_id : skill_ids) { + Skill* skill = GetOwner()->GetSkill(skill_id); + if (skill && GetOwner()->CanUseSkill(skill->GetSkillId())) { + if (!skill->GetMinorType()) { + if (current_target_.Get()->GetPos().Distance2D2(GetOwner()->GetPos()) > + skill->meta->skill_distance()) { + continue; + } + selected_skill_id = skill->GetSkillId(); + return behaviac::BT_SUCCESS; + } + } + } + return behaviac::BT_FAILURE; } behaviac::EBTStatus BaseAgent::CoFindPathToCurrentTarget(float distance) { - + if (!current_target_.Get()) { + return behaviac::BT_FAILURE; + } + return behaviac::BT_SUCCESS; } behaviac::EBTStatus BaseAgent::CoMoveToCurrentTarget(float distance) { - + if (!current_target_.Get()) { + return behaviac::BT_FAILURE; + } + return behaviac::BT_SUCCESS; } bool BaseAgent::CurrentTargetIsValid() { - + return current_target_.Get() && !current_target_.Get()->dead; } behaviac::EBTStatus BaseAgent::FindEnemy(float range) { - + Creature* enemy = GetOwner()->room->FindEnemy(GetOwner(), range); + find_enemy_target_uniid = enemy ? enemy->GetUniId() : 0; + return enemy ? behaviac::BT_SUCCESS : behaviac::BT_FAILURE; } float BaseAgent::GetCurrentTargetDistance() { - + if (current_target_.Get()) { + return current_target_.Get()->GetPos().Distance2D2(GetOwner()->GetPos()); + } + return 0; } float BaseAgent::GetFindEnemyResultTargetDistance() { - + abort(); + return 0; } glm::vec3 BaseAgent::GetFindEnemyResultTargetPos() { - + abort(); + return glm::vec3(0.0f, 0.0f, 0.0f); } void BaseAgent::SetCurrentTarget(int target_uniid) { - + current_target_.Reset(); + Creature* c = GetOwner()->room->GetCreatureByUniId(target_uniid); + if (c) { + current_target_ = c->GetWeakPtrRef(); + } } int BaseAgent::GetFindEnemyResultTargetUniId() { - + return find_enemy_target_uniid; } bool BaseAgent::ShotCanReach(const glm::vec3& target_pos) { - + abort(); + return false; } diff --git a/server/gameserver/base_agent.h b/server/gameserver/base_agent.h index 80810699..349c7bd6 100644 --- a/server/gameserver/base_agent.h +++ b/server/gameserver/base_agent.h @@ -84,6 +84,7 @@ protected: void Sleep(int time); protected: + CreatureWeakPtr current_target_; bool bullet_trace_mode_ = false; #ifdef DEBUG behaviac::EBTStatus last_status_ = behaviac::BT_INVALID; diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index c38aaeb9..f9a24a06 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -832,6 +832,9 @@ bool Creature::CanUseSkill(int skill_id) if (!skill) { return false; } + if (skill->GetCurrTimes() <= 0) { + return false; + } if (room->GetGasData().GetGasMode() == GasInactive) { return false; } diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 18fa6d37..12f166d8 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -3513,3 +3513,8 @@ bool Room::BulletCanReach(const glm::vec3& start, const glm::vec3& end) } return false; } + +bool Room::MoveCanReach(const glm::vec3& start, const glm::vec3& end) +{ + return BulletCanReach(start, end); +} diff --git a/server/gameserver/room.h b/server/gameserver/room.h index d1b20a49..2461ae62 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -261,6 +261,7 @@ public: std::shared_ptr GetBatchSync() { return batch_sync_; } void GMFastForward(); bool BulletCanReach(const glm::vec3& start, const glm::vec3& end); + bool MoveCanReach(const glm::vec3& start, const glm::vec3& end); private: void ShuaAndroid();