From a22c9814c98b4db7c4cd8f1321c47300e1c1264e Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 6 Mar 2023 22:32:17 +0800 Subject: [PATCH] 1 --- server/gameserver/creature.cc | 61 ++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 8 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index e13ca6ce..a7ef8d4a 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -2910,18 +2910,63 @@ void Creature::ShotFindPath() if (std::abs(GetMoveDir().x) > FLT_EPSILON || std::abs(GetMoveDir().z) > FLT_EPSILON ) { + auto try_move = + [this] (glm::vec3& new_move_dir, bool& block, glm::vec3& new_point, float& distance) + { + glm::vec3 start = GetPos().ToGlmVec3() - GetMoveDir() * -1.0f * 2.0f; + glm::vec3 end = start + new_move_dir * 2.0f; + glm::vec3 hit_point; + bool hit_result = false; + + room->map_instance->Scale(start); + room->map_instance->Scale(end); + + bool ret = room->map_instance->Raycast(start, end, hit_point, hit_result); + if (ret) { + start = GetPos().ToGlmVec3() - GetMoveDir(); + end = start + new_move_dir * 100.0f; + room->map_instance->Scale(start); + room->map_instance->Scale(end); + + glm::vec3 pre_point = hit_point; + ret = room->map_instance->Raycast(start, end, hit_point, hit_result); + if (ret) { + new_point = hit_point; + room->map_instance->Scale(new_point); + room->map_instance->Scale(pre_point); + distance = GlmHelper::Norm(pre_point - new_point); + } else { + block = true; + } + } else { + block = true; + } + }; glm::vec3 new_move_dir = GetMoveDir(); GlmHelper::RotateY(new_move_dir, 90 / 180.0f); - { - glm::vec3 start = GetPos().ToGlmVec3() - GetMoveDir() * -1.0f * 2.0f; - glm::vec3 end = start + new_move_dir * 1.0f; - glm::vec3 hit_point; - bool hit_result; + bool right_block = false; + glm::vec3 right_new_point = glm::vec3(0.0f, 0.0f, 0.0f); + float right_distance = 0.0f; + try_move(new_move_dir, right_block, right_new_point, right_distance); - room->map_instance->Scale(start); - room->map_instance->Scale(end); + new_move_dir = GetMoveDir(); + GlmHelper::RotateY(new_move_dir, -90 / 180.0f); - room->map_instance->Raycast(start, end, hit_point, hit_result); + bool left_block = false; + glm::vec3 left_new_point = glm::vec3(0.0f, 0.0f, 0.0f); + float left_distance = 0.0f; + try_move(new_move_dir, left_block, left_new_point, left_distance); + + if (right_block && !left_block) { + GetMutablePos().FromGlmVec3(right_new_point); + } else if (!right_block && left_block) { + GetMutablePos().FromGlmVec3(left_new_point); + } else if (right_block && left_block){ + if (right_distance > left_distance) { + GetMutablePos().FromGlmVec3(right_new_point); + } else { + GetMutablePos().FromGlmVec3(left_new_point); + } } } }