From ecf27dc2719f74b07fbc27316331b7a83b057b77 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 4 Apr 2023 11:10:44 +0800 Subject: [PATCH] 1 --- .../internal/behaviac_agent_member_visitor.h | 12 ++--- .../types/internal/behaviac_agent_meta.cpp | 8 +-- .../types/internal/behaviac_agent_meta.h | 4 +- server/bin/exported/meta/game2006.meta.xml | 2 +- server/gameserver/hero_agent.cc | 49 ++++++++++++++++++- server/gameserver/hero_agent.h | 4 +- 6 files changed, 62 insertions(+), 17 deletions(-) diff --git a/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_member_visitor.h b/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_member_visitor.h index f08a22a6..699f3719 100644 --- a/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_member_visitor.h +++ b/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_member_visitor.h @@ -48,16 +48,16 @@ template<> inline behaviac::EBTStatus HeroAgent::_Execute_Method_HeroAgent::DoAttack(); } -struct METHOD_TYPE_HeroAgent_FlyToMasterAround { }; -template<> inline behaviac::EBTStatus HeroAgent::_Execute_Method_() +struct METHOD_TYPE_HeroAgent_DoFlyToMasterAround { }; +template<> inline behaviac::EBTStatus HeroAgent::_Execute_Method_() { - return this->HeroAgent::FlyToMasterAround(); + return this->HeroAgent::DoFlyToMasterAround(); } -struct METHOD_TYPE_HeroAgent_FollowMaster { }; -template<> inline behaviac::EBTStatus HeroAgent::_Execute_Method_() +struct METHOD_TYPE_HeroAgent_DoFollowMaster { }; +template<> inline behaviac::EBTStatus HeroAgent::_Execute_Method_() { - return this->HeroAgent::FollowMaster(); + return this->HeroAgent::DoFollowMaster(); } diff --git a/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_meta.cpp b/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_meta.cpp index c8ae11c6..122a87e5 100644 --- a/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_meta.cpp +++ b/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_meta.cpp @@ -237,7 +237,7 @@ namespace behaviac virtual bool load() { - AgentMeta::SetTotalSignature(1153590554u); + AgentMeta::SetTotalSignature(1068415381u); AgentMeta* meta = NULL; BEHAVIAC_UNUSED_VAR(meta); @@ -293,17 +293,17 @@ namespace behaviac meta->RegisterMethod(502968959u, BEHAVIAC_NEW CMethod_behaviac_Agent_VectorRemove()); // HeroAgent - meta = BEHAVIAC_NEW AgentMeta(3034510267u); + meta = BEHAVIAC_NEW AgentMeta(3134647706u); AgentMeta::GetAgentMetas()[2270112014u] = meta; meta->RegisterMethod(623091365u, BEHAVIAC_NEW CAgentMethod_1< behaviac::EBTStatus, int >(FunctionPointer_HeroAgent_CoAttackTarget)); meta->RegisterMethod(2886181657u, BEHAVIAC_NEW CAgentMethod< behaviac::EBTStatus >(FunctionPointer_HeroAgent_DoAttack)); + meta->RegisterMethod(542584570u, BEHAVIAC_NEW CAgentMethod< behaviac::EBTStatus >(FunctionPointer_HeroAgent_DoFlyToMasterAround)); + meta->RegisterMethod(1239418881u, BEHAVIAC_NEW CAgentMethod< behaviac::EBTStatus >(FunctionPointer_HeroAgent_DoFollowMaster)); meta->RegisterMethod(2719091146u, BEHAVIAC_NEW CAgentMethod_1< behaviac::EBTStatus, int >(FunctionPointer_HeroAgent_DoHelpAttack)); meta->RegisterMethod(2062982811u, BEHAVIAC_NEW CAgentMethod_2< EBTStatus, int, int >(FunctionPointer_HeroAgent_DoIdle)); meta->RegisterMethod(846782702u, BEHAVIAC_NEW CAgentMethod< behaviac::EBTStatus >(FunctionPointer_HeroAgent_DoPursuit)); meta->RegisterMethod(1079343198u, BEHAVIAC_NEW CAgentMethod< behaviac::EBTStatus >(FunctionPointer_HeroAgent_DoRandomShot)); meta->RegisterMethod(130097619u, BEHAVIAC_NEW CAgentMethod< behaviac::EBTStatus >(FunctionPointer_HeroAgent_DoRandomWalk)); - meta->RegisterMethod(4119944363u, BEHAVIAC_NEW CAgentMethod< behaviac::EBTStatus >(FunctionPointer_HeroAgent_FlyToMasterAround)); - meta->RegisterMethod(3850832265u, BEHAVIAC_NEW CAgentMethod< behaviac::EBTStatus >(FunctionPointer_HeroAgent_FollowMaster)); meta->RegisterMethod(32551668u, BEHAVIAC_NEW CAgentMethod< float >(FunctionPointer_HeroAgent_GetAttackRange)); meta->RegisterMethod(3721974980u, BEHAVIAC_NEW CAgentMethod< float >(FunctionPointer_HeroAgent_GetMasterDistance)); meta->RegisterMethod(3603629747u, BEHAVIAC_NEW CAgentMethod_1< bool, int >(FunctionPointer_HeroAgent_HasBuffEffect)); diff --git a/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_meta.h b/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_meta.h index 2cb492f4..7bade195 100644 --- a/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_meta.h +++ b/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_meta.h @@ -40,13 +40,13 @@ namespace behaviac inline void FunctionPointer_AndroidAgent_SetBulletTraceMode(Agent* self, bool mode) { ((BaseAgent*)self)->_Execute_Method_(mode); } inline behaviac::EBTStatus FunctionPointer_HeroAgent_CoAttackTarget(Agent* self, int target_id) { return ((HeroAgent*)self)->CoAttackTarget(target_id); } inline behaviac::EBTStatus FunctionPointer_HeroAgent_DoAttack(Agent* self) { return (behaviac::EBTStatus)((HeroAgent*)self)->_Execute_Method_(); } + inline behaviac::EBTStatus FunctionPointer_HeroAgent_DoFlyToMasterAround(Agent* self) { return (behaviac::EBTStatus)((HeroAgent*)self)->_Execute_Method_(); } + inline behaviac::EBTStatus FunctionPointer_HeroAgent_DoFollowMaster(Agent* self) { return (behaviac::EBTStatus)((HeroAgent*)self)->_Execute_Method_(); } inline behaviac::EBTStatus FunctionPointer_HeroAgent_DoHelpAttack(Agent* self, int target_uniid) { return ((HeroAgent*)self)->DoHelpAttack(target_uniid); } inline EBTStatus FunctionPointer_HeroAgent_DoIdle(Agent* self, int min_time, int max_time) { return ((HeroAgent*)self)->DoIdle(min_time, max_time); } inline behaviac::EBTStatus FunctionPointer_HeroAgent_DoPursuit(Agent* self) { return ((HeroAgent*)self)->DoPursuit(); } inline behaviac::EBTStatus FunctionPointer_HeroAgent_DoRandomShot(Agent* self) { return ((HeroAgent*)self)->DoRandomShot(); } inline behaviac::EBTStatus FunctionPointer_HeroAgent_DoRandomWalk(Agent* self) { return ((HeroAgent*)self)->DoRandomWalk(); } - inline behaviac::EBTStatus FunctionPointer_HeroAgent_FlyToMasterAround(Agent* self) { return (behaviac::EBTStatus)((HeroAgent*)self)->_Execute_Method_(); } - inline behaviac::EBTStatus FunctionPointer_HeroAgent_FollowMaster(Agent* self) { return (behaviac::EBTStatus)((HeroAgent*)self)->_Execute_Method_(); } inline float FunctionPointer_HeroAgent_GetAttackRange(Agent* self) { return ((HeroAgent*)self)->GetAttackRange(); } inline float FunctionPointer_HeroAgent_GetMasterDistance(Agent* self) { return ((HeroAgent*)self)->GetMasterDistance(); } inline bool FunctionPointer_HeroAgent_HasBuffEffect(Agent* self, int buff_effect) { return (bool)((BaseAgent*)self)->_Execute_Method_(buff_effect); } diff --git a/server/bin/exported/meta/game2006.meta.xml b/server/bin/exported/meta/game2006.meta.xml index 33a32f46..61a125b7 100644 --- a/server/bin/exported/meta/game2006.meta.xml +++ b/server/bin/exported/meta/game2006.meta.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/server/gameserver/hero_agent.cc b/server/gameserver/hero_agent.cc index ecec9939..93105882 100644 --- a/server/gameserver/hero_agent.cc +++ b/server/gameserver/hero_agent.cc @@ -376,6 +376,9 @@ behaviac::EBTStatus HeroAgent::DoPursuit() behaviac::EBTStatus HeroAgent::DoHelpAttack(int target_uniid) { + if (status_ == behaviac::BT_RUNNING) { + return DoRunningCb(); + } Creature* enemy = GetOwner()->room->GetCreatureByUniId(target_uniid); if (!enemy) { return behaviac::BT_FAILURE; @@ -447,7 +450,7 @@ behaviac::EBTStatus HeroAgent::DoHelpAttack(int target_uniid) ); } -behaviac::EBTStatus HeroAgent::FlyToMasterAround() +behaviac::EBTStatus HeroAgent::DoFlyToMasterAround() { if (!GetOwner()->AsHero()->master.Get()) { return behaviac::BT_FAILURE; @@ -467,12 +470,54 @@ behaviac::EBTStatus HeroAgent::FlyToMasterAround() GetOwner()->GetMutablePos().FromGlmVec3(point); Global::Instance()->verify_set_pos = 0; GetOwner()->room->grid_service->MoveCreature(GetOwner()); + GetOwner()->SetAttackDir(GetOwner()->AsHero()->master.Get()->GetAttackDir()); return behaviac::BT_SUCCESS; } -behaviac::EBTStatus HeroAgent::FollowMaster() +behaviac::EBTStatus HeroAgent::DoFollowMaster() { + if (status_ == behaviac::BT_RUNNING) { + return DoRunningCb(); + } + if (GetOwner()->AsHero()->master.Get()->dead) { + return behaviac::BT_FAILURE; + } + long long last_frameno = GetOwner()->room->GetFrameNo(); + long long last_follow_frameno = GetOwner()->room->GetFrameNo(); + return StartCoroutine + ( + [this, last_frameno, last_follow_frameno] () mutable + { + if (GetOwner()->room->GetFrameNo() - last_frameno > SERVER_FRAME_RATE * 10 || + !GetOwner()->AsHero()->master.Get() || GetOwner()->AsHero()->master.Get()->dead) { + status_ = behaviac::BT_SUCCESS; + return behaviac::BT_SUCCESS; + } else { + if (GlmHelper::IsEqual2D(GetOwner()->GetPos().ToGlmVec3(), + GetOwner()->AsHero()->master.Get()->GetPos().ToGlmVec3())) { + return behaviac::BT_SUCCESS; + } + glm::vec3 dir = GetOwner()->AsHero()->master.Get()->GetPos().CalcDir(GetOwner()->GetPos()); + if (GlmHelper::Norm(dir) < 60) { + return behaviac::BT_SUCCESS; + } + if (GlmHelper::Norm(dir) > 60) { + GlmHelper::Normalize(dir); + GetOwner()->SetMoveDir(dir); + GetOwner()->SetAttackDir(dir); + GetOwner()->GetMovement()->CalcTargetPos(60); + last_follow_frameno = GetOwner()->room->GetFrameNo(); + } + return behaviac::BT_RUNNING; + } + }, + [this] (bool is_test, bool& has_event) + { + + }, + "CoFollowMaster" + ); } float HeroAgent::GetMasterDistance() diff --git a/server/gameserver/hero_agent.h b/server/gameserver/hero_agent.h index 81ad53f6..06e904a7 100644 --- a/server/gameserver/hero_agent.h +++ b/server/gameserver/hero_agent.h @@ -20,8 +20,8 @@ public: behaviac::EBTStatus DoAttack(); behaviac::EBTStatus DoPursuit(); behaviac::EBTStatus DoHelpAttack(int target_uniid); - behaviac::EBTStatus FlyToMasterAround(); - behaviac::EBTStatus FollowMaster(); + behaviac::EBTStatus DoFlyToMasterAround(); + behaviac::EBTStatus DoFollowMaster(); float GetMasterDistance(); };