diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 1a0448e1..777f06e5 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -2334,7 +2334,7 @@ void Creature::SpecDirMove(glm::vec3 dir, float distance) std::vector spec_polys; bool hit_result = false; - bool ret = room->map_instance->RaycastEx(start, end, hit_point, hit_result, same_polys_flags, spec_polys); + bool ret = room->map_instance->RaycastEx(start, end, hit_point, hit_result, same_polys_flags, spec_polys, 0); if (ret) { room->map_instance->UnScale(hit_point); GetMutablePos().FromGlmVec3(hit_point); diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 62dcb2be..71a8f63a 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -589,7 +589,8 @@ void MapInstance::MarkMapAreaPolys() bool MapInstance::RaycastEx(const glm::vec3& start, const glm::vec3& end, glm::vec3& hit_point, bool& hit_result, - int& same_polys_flags, std::vector& spec_polys) + int& same_polys_flags, std::vector& spec_polys, + unsigned short exclude_flags) { same_polys_flags = 0; @@ -606,7 +607,7 @@ bool MapInstance::RaycastEx(const glm::vec3& start, const glm::vec3& end, dtStatus status = 0; dtQueryFilter filter; filter.setIncludeFlags(0xffff); - filter.setExcludeFlags(0); + filter.setExcludeFlags(exclude_flags); dtPolyRef startRef = INVALID_NAVMESH_POLYREF; { diff --git a/server/gameserver/mapinstance.h b/server/gameserver/mapinstance.h index f8581fd4..9c83e468 100644 --- a/server/gameserver/mapinstance.h +++ b/server/gameserver/mapinstance.h @@ -45,7 +45,8 @@ class MapInstance : public std::enable_shared_from_this glm::vec3& hit_point, bool& hit_result); bool RaycastEx(const glm::vec3& start, const glm::vec3& end, glm::vec3& hit_point, bool& hit_result, - int& same_polys_flags, std::vector& spec_polys); + int& same_polys_flags, std::vector& spec_polys, + unsigned short exclude_flags); bool FindNearestPoint(const glm::vec3& center, float radius, glm::vec3& nearestPt); bool GetPosHeight(const Position& pos, float& out_height); dtPoly* GetPoly(glm::vec3 pos, int& poly_idx); diff --git a/server/gameserver/movement.cc b/server/gameserver/movement.cc index 357fdda0..28a017f1 100644 --- a/server/gameserver/movement.cc +++ b/server/gameserver/movement.cc @@ -86,11 +86,15 @@ void Movement::CalcTargetPos(float distance) point.tar_pos.SetZ(10); } } else { + unsigned short exclude_flags = 0; + if (owner_->GetCar()) { + exclude_flags = SAMPLE_POLYFLAGS_DOOR; + } glm::vec3 hit_point; owner_->room->map_instance->Scale(start); owner_->room->map_instance->Scale(end); bool ret = owner_->room->map_instance->RaycastEx(start, end, hit_point, hit_result, - point.same_polys_flags, point.spec_polys); + point.same_polys_flags, point.spec_polys, exclude_flags); if (ret) { owner_->room->map_instance->UnScale(hit_point); point.tar_pos.FromGlmVec3(hit_point);