From f9bf8342f04dc9c25bd5d56513f1ab0d61271534 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 31 Mar 2023 15:34:39 +0800 Subject: [PATCH] 1 --- server/gameserver/creature.cc | 9 +++++++++ server/gameserver/glmhelper.cc | 2 +- server/gameserver/hero_agent.cc | 22 ++++++++++++++++++-- server/gameserver/lispenv.cc | 36 ++++++++++++++++++++++++++++++++- 4 files changed, 65 insertions(+), 4 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 84c87824..d82183c6 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -70,6 +70,15 @@ Creature::Creature():MoveableEntity() Creature::~Creature() { + for (auto itr = slave_heros_.begin(); itr != slave_heros_.end(); ++itr) { + while (!list_empty(&itr->second)) { + Hero* hero = list_first_entry(&itr->second, + Hero, + entry); + list_del_init(&hero->entry); + } + } + slave_heros_.clear(); xtimer_attacher.ClearTimerList(); ClearBuffList(); skill_hash_.clear(); diff --git a/server/gameserver/glmhelper.cc b/server/gameserver/glmhelper.cc index fefb5b64..e13adf07 100644 --- a/server/gameserver/glmhelper.cc +++ b/server/gameserver/glmhelper.cc @@ -74,5 +74,5 @@ void GlmHelper::FillVert(const glm::vec3& v, float* vert) bool GlmHelper::IsEqual2D(const glm::vec3& v1, const glm::vec3& v2) { - return std::abs(v1.x - v2.x) > 0.00001f || std::abs(v1.z - v2.z) > 0.00001f; + return std::abs(v1.x - v2.x) < 0.00001f && std::abs(v1.z - v2.z) < 0.00001f; } diff --git a/server/gameserver/hero_agent.cc b/server/gameserver/hero_agent.cc index cee941a1..fe0a37d9 100644 --- a/server/gameserver/hero_agent.cc +++ b/server/gameserver/hero_agent.cc @@ -208,6 +208,10 @@ behaviac::EBTStatus HeroAgent::DoAttack() if (!enemy) { return behaviac::BT_FAILURE; } + if (GlmHelper::IsEqual2D(GetOwner()->GetPos().ToGlmVec3(), enemy->GetPos().ToGlmVec3())) { + return behaviac::BT_FAILURE; + } + enemy = ((Hero*)GetOwner())->master.Get(); glm::vec3 dir = GetOwner()->GetPos().CalcDir(enemy->GetPos()); GlmHelper::Normalize(dir); @@ -217,17 +221,31 @@ behaviac::EBTStatus HeroAgent::DoAttack() glm::vec3 shot_dir = dir; GetOwner()->Shot(shot_dir, shot_ok, 0, 0); + #if 0 + CreatureWeakPtr target = enemy->GetWeakPtrRef(); + #endif long long last_frameno = GetOwner()->room->GetFrameNo(); return StartCoroutine ( - [this, last_frameno] () + [this, last_frameno, target] () mutable { if (GetOwner()->room->GetFrameNo() - last_frameno > SERVER_FRAME_RATE * 3) { status_ = behaviac::BT_SUCCESS; return behaviac::BT_SUCCESS; } else { + if (!target.Get()) { + return behaviac::BT_SUCCESS; + } + if (target.Get()->dead) { + return behaviac::BT_SUCCESS; + } + if (GlmHelper::IsEqual2D(GetOwner()->GetPos().ToGlmVec3(), + target.Get()->GetPos().ToGlmVec3())) { + return behaviac::BT_FAILURE; + } bool shot_ok = false; - glm::vec3 shot_dir = GetOwner()->GetAttackDir(); + glm::vec3 shot_dir = GetOwner()->GetPos().CalcDir(target.Get()->GetPos());; + GetOwner()->SetAttackDir(shot_dir); GetOwner()->Shot(shot_dir, shot_ok, 0, 0); return behaviac::BT_RUNNING; diff --git a/server/gameserver/lispenv.cc b/server/gameserver/lispenv.cc index c34230a9..5aa6d2a4 100644 --- a/server/gameserver/lispenv.cc +++ b/server/gameserver/lispenv.cc @@ -140,7 +140,7 @@ public: { double result = 0.0f; if (context_.buff->GetCaster().Get()) { - result = context_.buff->GetCaster().Get()->GetSkillRaycastDistance(); + result = context_.buff->GetCaster().Get()->GetSkillRaycastDistance(); } return std::make_shared(a8::lisp::Atom(result)); }); @@ -177,6 +177,40 @@ public: } return std::make_shared(a8::lisp::Atom(result)); }); + + RegisterCProc + ( + "caster.get_skill_target_pos_x", + [this] (const a8::lisp::List& params) -> std::shared_ptr + { + double result = 0.0f; + if (context_.buff->GetCaster().Get()) { + result = context_.buff->GetCaster().Get()->context_pos.GetX(); + } + return std::make_shared(a8::lisp::Atom(result)); + }); + RegisterCProc + ( + "caster.get_skill_target_pos_y", + [this] (const a8::lisp::List& params) -> std::shared_ptr + { + double result = 0.0f; + if (context_.buff->GetCaster().Get()) { + result = context_.buff->GetCaster().Get()->context_pos.GetY(); + } + return std::make_shared(a8::lisp::Atom(result)); + }); + RegisterCProc + ( + "caster.get_skill_target_pos_z", + [this] (const a8::lisp::List& params) -> std::shared_ptr + { + double result = 0.0f; + if (context_.buff->GetCaster().Get()) { + result = context_.buff->GetCaster().Get()->context_pos.GetZ(); + } + return std::make_shared(a8::lisp::Atom(result)); + }); } float Eval(std::shared_ptr expr,