From 6dacb8c50009af1b224ebf21794b26b36e955420 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sun, 14 May 2023 16:45:12 +0800 Subject: [PATCH 01/14] 1 --- server/gameserver/creature.cc | 6 ++++++ server/gameserver/mapinstance.cc | 5 +++++ server/gameserver/mapinstance.h | 1 + 3 files changed, 12 insertions(+) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index d8c68bb5..5967fd02 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -2567,12 +2567,18 @@ void Creature::OnLand() room->map_instance->Scale(center); glm::vec3 point; bool ok = false; + #if 1 + center = GetPos().ToGlmVec3(); + room->map_instance->Scale(center); + ok = room->map_instance->FindOnLandPoint(center, point); + #else for (int i = 0; i < 10; ++i) { ok = room->map_instance->FindNearestPoint(center, 1.0f + 10 * i, point); if (ok) { break; } } + #endif #if 1 if (point.y < 1.2) { point.y = 3.0f; diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 824fdabf..f02ee2b2 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -1110,3 +1110,8 @@ bool MapInstance::GetNearestGrass(const glm::vec3& center, glm::vec3& out_pt) } return false; } + +bool MapInstance::FindOnLandPoint(const glm::vec3& center, glm::vec3& nearest_pt) +{ + +} diff --git a/server/gameserver/mapinstance.h b/server/gameserver/mapinstance.h index 9c83e468..a2f8c759 100644 --- a/server/gameserver/mapinstance.h +++ b/server/gameserver/mapinstance.h @@ -48,6 +48,7 @@ class MapInstance : public std::enable_shared_from_this int& same_polys_flags, std::vector& spec_polys, unsigned short exclude_flags); bool FindNearestPoint(const glm::vec3& center, float radius, glm::vec3& nearestPt); + bool FindOnLandPoint(const glm::vec3& center, glm::vec3& nearest_pt); bool GetPosHeight(const Position& pos, float& out_height); dtPoly* GetPoly(glm::vec3 pos, int& poly_idx); void Scale(glm::vec3& v); From 162c98190d8629d9717dd0297109d5c1226befd4 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sun, 14 May 2023 17:19:12 +0800 Subject: [PATCH 02/14] 1 --- server/gameserver/creature.cc | 6 ------ server/gameserver/mapinstance.cc | 2 +- server/gameserver/mapinstance.h | 2 +- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 5967fd02..d8c68bb5 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -2567,18 +2567,12 @@ void Creature::OnLand() room->map_instance->Scale(center); glm::vec3 point; bool ok = false; - #if 1 - center = GetPos().ToGlmVec3(); - room->map_instance->Scale(center); - ok = room->map_instance->FindOnLandPoint(center, point); - #else for (int i = 0; i < 10; ++i) { ok = room->map_instance->FindNearestPoint(center, 1.0f + 10 * i, point); if (ok) { break; } } - #endif #if 1 if (point.y < 1.2) { point.y = 3.0f; diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index f02ee2b2..6f15512d 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -1111,7 +1111,7 @@ bool MapInstance::GetNearestGrass(const glm::vec3& center, glm::vec3& out_pt) return false; } -bool MapInstance::FindOnLandPoint(const glm::vec3& center, glm::vec3& nearest_pt) +void MapInstance::AdjustOnLandPoint(glm::vec3& point) { } diff --git a/server/gameserver/mapinstance.h b/server/gameserver/mapinstance.h index a2f8c759..79940482 100644 --- a/server/gameserver/mapinstance.h +++ b/server/gameserver/mapinstance.h @@ -48,7 +48,6 @@ class MapInstance : public std::enable_shared_from_this int& same_polys_flags, std::vector& spec_polys, unsigned short exclude_flags); bool FindNearestPoint(const glm::vec3& center, float radius, glm::vec3& nearestPt); - bool FindOnLandPoint(const glm::vec3& center, glm::vec3& nearest_pt); bool GetPosHeight(const Position& pos, float& out_height); dtPoly* GetPoly(glm::vec3 pos, int& poly_idx); void Scale(glm::vec3& v); @@ -60,6 +59,7 @@ class MapInstance : public std::enable_shared_from_this bool SceneRaycast(const glm::vec3& orig, const glm::vec3& dir, float max_distance, glm::vec3& hit_pos, float& ray_length); bool GetNearestGrass(const glm::vec3& center, glm::vec3& out_pt); + void AdjustOnLandPoint(glm::vec3& point); private: void LoadHouse(); From f200dd913db6c3ed55280ab8b326ddac950ad9f4 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 15 May 2023 10:58:29 +0800 Subject: [PATCH 03/14] 1 --- server/gameserver/mapinstance.cc | 38 ++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 6f15512d..43c1b5f6 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -1113,5 +1113,43 @@ bool MapInstance::GetNearestGrass(const glm::vec3& center, glm::vec3& out_pt) void MapInstance::AdjustOnLandPoint(glm::vec3& point) { + float center[3]; + center[0] = point.x; + center[1] = point.y; + center[2] = point.z; + const float extents[3] = {4.0f/10.0f, 100.0f, 4.0f/10.0f}; + + dtQueryFilter filter; + filter.setIncludeFlags(0xffff); + filter.setExcludeFlags(0); + + int poly_count = 0; + dtStatus status = navmesh_query_->queryPolygons(center, + extents, + &filter, + polys_, + &poly_count, + MAX_POLYS); + if (dtStatusFailed(status) || poly_count <= 0) { + return; + } + for (int i = 0; i < poly_count; ++i) { + unsigned int slat = 0; + unsigned int it = 0; + unsigned int ip = 0; + navmesh_->decodePolyId(polys_[i], slat, it, ip); + + const dtMeshTile* tile = navmesh_->getTileByRef(polys_[i]); + if (!tile) { + abort(); + } + if (ip >= tile->header->polyCount) { + abort(); + } + const dtPoly* poly = &tile->polys[ip]; + for (int ii = 0; ii < poly->vertCount; ++ii) { + const float* vc = &tile->verts[poly->verts[ii]*3]; + } + } } From 8e4ace732d113bfe3983e5db3e907e675dd24a3e Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 15 May 2023 11:08:51 +0800 Subject: [PATCH 04/14] 1 --- server/gameserver/mapinstance.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 43c1b5f6..077b9dca 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -1148,7 +1148,9 @@ void MapInstance::AdjustOnLandPoint(glm::vec3& point) abort(); } const dtPoly* poly = &tile->polys[ip]; - for (int ii = 0; ii < poly->vertCount; ++ii) { + for (int ii = 2; ii < poly->vertCount; ++ii) { + const float* va = &tile->verts[poly->verts[0]*3]; + const float* vb = &tile->verts[poly->verts[ii-1]*3]; const float* vc = &tile->verts[poly->verts[ii]*3]; } } From 38e444124ae148969b3bdc41f3524a6ded36b24f Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 15 May 2023 11:15:17 +0800 Subject: [PATCH 05/14] 1 --- server/gameserver/mapinstance.cc | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 077b9dca..e7b7b9fc 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -1134,6 +1134,12 @@ void MapInstance::AdjustOnLandPoint(glm::vec3& point) if (dtStatusFailed(status) || poly_count <= 0) { return; } + + glm::vec3 orig; + glm::vec3 dir; + glm::vec2 bary_position; + float distance; + for (int i = 0; i < poly_count; ++i) { unsigned int slat = 0; unsigned int it = 0; @@ -1152,6 +1158,20 @@ void MapInstance::AdjustOnLandPoint(glm::vec3& point) const float* va = &tile->verts[poly->verts[0]*3]; const float* vb = &tile->verts[poly->verts[ii-1]*3]; const float* vc = &tile->verts[poly->verts[ii]*3]; + + glm::vec3 v0 = glm::vec3(va[0], va[1], va[2]); + glm::vec3 v1 = glm::vec3(vb[0], vb[1], vb[2]); + glm::vec3 v2 = glm::vec3(vc[0], vc[1], vc[2]); + bool hit = glm::intersectRayTriangle + (orig, + dir, + v0, + v1, + v2, + bary_position, + distance + ); + } } } From 0a9b10725a8be343f8ec413f783b2d420bbeafd5 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 15 May 2023 11:30:42 +0800 Subject: [PATCH 06/14] 1 --- server/gameserver/mapinstance.cc | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index e7b7b9fc..3dac2f6c 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -1137,8 +1137,8 @@ void MapInstance::AdjustOnLandPoint(glm::vec3& point) glm::vec3 orig; glm::vec3 dir; - glm::vec2 bary_position; - float distance; + const dtPoly* nearest_poly = nullptr; + float nearest_distance = 0.0f; for (int i = 0; i < poly_count; ++i) { unsigned int slat = 0; @@ -1162,6 +1162,10 @@ void MapInstance::AdjustOnLandPoint(glm::vec3& point) glm::vec3 v0 = glm::vec3(va[0], va[1], va[2]); glm::vec3 v1 = glm::vec3(vb[0], vb[1], vb[2]); glm::vec3 v2 = glm::vec3(vc[0], vc[1], vc[2]); + + glm::vec2 bary_position; + float distance; + bool hit = glm::intersectRayTriangle (orig, dir, @@ -1171,7 +1175,21 @@ void MapInstance::AdjustOnLandPoint(glm::vec3& point) bary_position, distance ); - - } + if (hit && distance > 0.00001f) { + if (nearest_poly) { + if (distance < nearest_distance) { + nearest_poly = poly; + nearest_distance = distance; + } + } else { + nearest_poly = poly; + nearest_distance = distance; + } + } + }//end for ii + }//end for i; + if (!nearest_poly) { + return; } + glm::vec3 nearest_pt = orig + dir * nearest_distance; } From e73f4389e13b236990f0ac6d80b343bc4e4e8610 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 15 May 2023 11:33:05 +0800 Subject: [PATCH 07/14] 1 --- server/gameserver/mapinstance.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 3dac2f6c..d23dd777 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -1135,8 +1135,8 @@ void MapInstance::AdjustOnLandPoint(glm::vec3& point) return; } - glm::vec3 orig; - glm::vec3 dir; + glm::vec3 orig = glm::vec3(point.x, 100.0f, point.z);; + glm::vec3 dir = glm::vec3(0.0f, 1.0f, 0.0f); const dtPoly* nearest_poly = nullptr; float nearest_distance = 0.0f; From fd14c02ac67f56e3017a0ad28c44319b7d16d0cd Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 15 May 2023 14:41:21 +0800 Subject: [PATCH 08/14] 1 --- server/gameserver/creature.cc | 5 +++++ server/gameserver/mapinstance.cc | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index d8c68bb5..eae1a60c 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -2563,7 +2563,9 @@ void Creature::OnLand() } { glm::vec3 center = GetPos().ToGlmVec3(); + #if 0 room->map_instance->PtInHouse(GetPos().ToGlmVec3(), center); + #endif room->map_instance->Scale(center); glm::vec3 point; bool ok = false; @@ -2587,6 +2589,7 @@ void Creature::OnLand() abort(); #endif } else { + room->map_instance->AdjustOnLandPoint(point); room->map_instance->UnScale(point); } Global::Instance()->verify_set_pos = 1; @@ -2595,6 +2598,7 @@ void Creature::OnLand() GetMovement()->ClearPath(); room->grid_service->MoveCreature(this); #ifdef DEBUG + if (IsPlayer()) { a8::XPrintf("OnLoad ok:%d pos:%f,%f,%f\n", { ok ? 1 : 0, @@ -2602,6 +2606,7 @@ void Creature::OnLand() point.y, point.z }); + } #endif } if (IsAndroid()) { diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index d23dd777..b3c71efb 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -1136,7 +1136,7 @@ void MapInstance::AdjustOnLandPoint(glm::vec3& point) } glm::vec3 orig = glm::vec3(point.x, 100.0f, point.z);; - glm::vec3 dir = glm::vec3(0.0f, 1.0f, 0.0f); + glm::vec3 dir = glm::vec3(0.0f, -1.0f, 0.0f); const dtPoly* nearest_poly = nullptr; float nearest_distance = 0.0f; @@ -1192,4 +1192,5 @@ void MapInstance::AdjustOnLandPoint(glm::vec3& point) return; } glm::vec3 nearest_pt = orig + dir * nearest_distance; + point.y = nearest_pt.y; } From bf9f59807a423f5debb0f13b41ee8d2acab590a3 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 15 May 2023 16:49:00 +0800 Subject: [PATCH 09/14] 1 --- server/gameserver/mapinstance.cc | 29 ++++++++++++++++++++++++++++- server/gameserver/mapinstance.h | 2 ++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index b3c71efb..f2cde327 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -178,6 +178,7 @@ void MapInstance::Init() navmesh_query_ = new dtNavMeshQuery(); navmesh_query_->init(navmesh_, 1024); MarkMapAreaPolys(); + MarkConnectablePolys(); LoadHouse(); } @@ -1156,7 +1157,7 @@ void MapInstance::AdjustOnLandPoint(glm::vec3& point) const dtPoly* poly = &tile->polys[ip]; for (int ii = 2; ii < poly->vertCount; ++ii) { const float* va = &tile->verts[poly->verts[0]*3]; - const float* vb = &tile->verts[poly->verts[ii-1]*3]; + const float* vb = &tile->verts[poly->verts[ii-1]*3]; const float* vc = &tile->verts[poly->verts[ii]*3]; glm::vec3 v0 = glm::vec3(va[0], va[1], va[2]); @@ -1194,3 +1195,29 @@ void MapInstance::AdjustOnLandPoint(glm::vec3& point) glm::vec3 nearest_pt = orig + dir * nearest_distance; point.y = nearest_pt.y; } + +void MapInstance::MarkConnectablePolys() +{ + std::list queue; + while (!queue.empty()) { + dtPolyRef poly_ref = queue.front(); + queue.pop_front(); + + const dtPoly* poly = nullptr; + const dtMeshTile* tile = 0; + navmesh_->getTileAndPolyByRefUnsafe(poly_ref, &tile, &poly); + for (unsigned int i = poly->firstLink; i != DT_NULL_LINK; i = tile->links[i].next) { + dtPolyRef neighbour_ref = tile->links[i].ref; + if (!neighbour_ref) { + continue; + } + if (connectable_polys_.find(neighbour_ref) != + connectable_polys_.end()) { + continue; + } + queue.push_back(neighbour_ref); + connectable_polys_.insert(neighbour_ref); + } + } + +} diff --git a/server/gameserver/mapinstance.h b/server/gameserver/mapinstance.h index 79940482..8188e0ef 100644 --- a/server/gameserver/mapinstance.h +++ b/server/gameserver/mapinstance.h @@ -64,6 +64,7 @@ class MapInstance : public std::enable_shared_from_this private: void LoadHouse(); void MarkMapAreaPolys(); + void MarkConnectablePolys(); private: dtNavMesh* navmesh_ = nullptr; @@ -79,6 +80,7 @@ class MapInstance : public std::enable_shared_from_this std::list houses_; std::vector things_; + std::set connectable_polys_; std::string map_tpl_name_; const mt::Map* map_meta_ = nullptr; From 634b90302139e59744e9f0522646ae8a36250a6e Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 15 May 2023 17:02:36 +0800 Subject: [PATCH 10/14] 1 --- server/gameserver/mapinstance.cc | 36 ++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index f2cde327..cdf6d971 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -1198,7 +1198,43 @@ void MapInstance::AdjustOnLandPoint(glm::vec3& point) void MapInstance::MarkConnectablePolys() { + dtPolyRef startRef = INVALID_NAVMESH_POLYREF; + { + #if 0 + dtQueryFilter filter; + filter.setIncludeFlags(0xffff); + filter.setExcludeFlags(0); + + const float extents[3] = {2.f, 4.f, 2.f}; + float nearestPt[3]; + + Scale(pos); + + float pos1[3]; + pos1[0] = pos.x; + pos1[1] = pos.y; + pos1[2] = pos.z; + + const dtMeshTile* tile = navmesh_->getTileAt(0, 0, 0); + assert(tile); + navmesh_query_->findNearestPoly(pos1, extents, &filter, &startRef, nearestPt); + if (startRef) { + unsigned int slat = 0; + unsigned int it = 0; + unsigned int ip = 0; + navmesh_->decodePolyId(startRef, slat, it, ip); + poly_idx = ip; + return &tile->polys[ip]; + } + #endif + } + if (!startRef) { + abort(); + } + std::list queue; + queue.push_back(startRef); + connectable_polys_.insert(startRef); while (!queue.empty()) { dtPolyRef poly_ref = queue.front(); queue.pop_front(); From 09ae47a86a712954a70171e6de9c74f8818b0b80 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 15 May 2023 17:05:22 +0800 Subject: [PATCH 11/14] 1 --- server/gameserver/mapinstance.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index cdf6d971..8746fc4c 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -1200,7 +1200,8 @@ void MapInstance::MarkConnectablePolys() { dtPolyRef startRef = INVALID_NAVMESH_POLYREF; { - #if 0 + glm::vec3 pos; + dtQueryFilter filter; filter.setIncludeFlags(0xffff); filter.setExcludeFlags(0); @@ -1223,10 +1224,7 @@ void MapInstance::MarkConnectablePolys() unsigned int it = 0; unsigned int ip = 0; navmesh_->decodePolyId(startRef, slat, it, ip); - poly_idx = ip; - return &tile->polys[ip]; } - #endif } if (!startRef) { abort(); From dd92b0e4bbcc3f3b872b0c8f2f34b88218543de2 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 15 May 2023 17:11:24 +0800 Subject: [PATCH 12/14] 1 --- server/gameserver/mapinstance.cc | 8 -------- 1 file changed, 8 deletions(-) diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 8746fc4c..dd9c1951 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -1216,15 +1216,7 @@ void MapInstance::MarkConnectablePolys() pos1[1] = pos.y; pos1[2] = pos.z; - const dtMeshTile* tile = navmesh_->getTileAt(0, 0, 0); - assert(tile); navmesh_query_->findNearestPoly(pos1, extents, &filter, &startRef, nearestPt); - if (startRef) { - unsigned int slat = 0; - unsigned int it = 0; - unsigned int ip = 0; - navmesh_->decodePolyId(startRef, slat, it, ip); - } } if (!startRef) { abort(); From e0e13696e27bd4a2bf62505a1f59f99a169fdadb Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 15 May 2023 17:18:31 +0800 Subject: [PATCH 13/14] 1 --- server/gameserver/mapinstance.cc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index dd9c1951..21fe9e29 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -92,11 +92,6 @@ void MapInstance::Init() map_service_->Init(map_meta_->map_width() / MAP_GRID_WIDTH, map_meta_->map_height() / MAP_GRID_WIDTH, MAP_GRID_WIDTH); - f8::UdpLog::Instance()->Info - ("map_id:%d", - { - map_id - }); { navmesh_ = dtAllocNavMesh(); FILE *fp = fopen((mt::MetaMgr::Instance()->GetResDir() + "map4.bin").c_str(), "rb"); @@ -180,6 +175,12 @@ void MapInstance::Init() MarkMapAreaPolys(); MarkConnectablePolys(); LoadHouse(); + f8::UdpLog::Instance()->Info + ("map_id:%d connectable_polys:%d", + { + map_id, + connectable_polys_.size() + }); } void MapInstance::UnInit() @@ -1200,7 +1201,7 @@ void MapInstance::MarkConnectablePolys() { dtPolyRef startRef = INVALID_NAVMESH_POLYREF; { - glm::vec3 pos; + glm::vec3 pos = glm::vec3(5120.000000000000f, 6.250846862793f, 5120.000000000000f); dtQueryFilter filter; filter.setIncludeFlags(0xffff); @@ -1245,5 +1246,4 @@ void MapInstance::MarkConnectablePolys() connectable_polys_.insert(neighbour_ref); } } - } From 8ebdcdb9032502e7667660696154c18d0e8124fa Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 15 May 2023 18:09:55 +0800 Subject: [PATCH 14/14] 1 --- server/gameserver/creature.cc | 2 +- server/gameserver/mapinstance.cc | 50 +++++++++++++++++++++++++++++++- server/gameserver/mapinstance.h | 2 ++ 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index eae1a60c..1a080470 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -2570,7 +2570,7 @@ void Creature::OnLand() glm::vec3 point; bool ok = false; for (int i = 0; i < 10; ++i) { - ok = room->map_instance->FindNearestPoint(center, 1.0f + 10 * i, point); + ok = room->map_instance->FindConnectableNearestPoint(center, 1.0f + 10 * i, point); if (ok) { break; } diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 21fe9e29..a12faaa8 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -72,6 +72,20 @@ static void TraverseMapColliderNode(mc::ColliderNode* node, std::functionIsConnectablePoly(ref); + } + +}; + void MapInstance::Init() { map_meta_ = mt::Map::GetById(map_id); @@ -435,6 +449,34 @@ bool MapInstance::FindNearestPoint(const glm::vec3& center, float radius, glm::v return true; } +bool MapInstance::FindConnectableNearestPoint(const glm::vec3& center, float radius, glm::vec3& nearest_pt) +{ + dtPolyRef startRef = INVALID_NAVMESH_POLYREF; + + ConnectableQueryFilter filter; + filter.map_instance = this; + filter.setIncludeFlags(0xffff); + filter.setExcludeFlags(0); + + const float extents[3] = {radius, 10.0f, radius}; + float nearestPt[3]; + + float pos[3]; + pos[0] = center.x; + pos[1] = center.y; + pos[2] = center.z; + + navmesh_query_->findNearestPoly(pos, extents, &filter, &startRef, nearestPt); + if (!startRef) { + return false; + } + + nearest_pt.x = nearestPt[0]; + nearest_pt.y = nearestPt[1]; + nearest_pt.z = nearestPt[2]; + return true; +} + bool MapInstance::GetPosHeight(const Position& pos, float& out_height) { dtPolyRef startRef = INVALID_NAVMESH_POLYREF; @@ -1122,7 +1164,8 @@ void MapInstance::AdjustOnLandPoint(glm::vec3& point) const float extents[3] = {4.0f/10.0f, 100.0f, 4.0f/10.0f}; - dtQueryFilter filter; + ConnectableQueryFilter filter; + filter.map_instance = this; filter.setIncludeFlags(0xffff); filter.setExcludeFlags(0); @@ -1247,3 +1290,8 @@ void MapInstance::MarkConnectablePolys() } } } + +bool MapInstance::IsConnectablePoly(dtPolyRef poly_ref) +{ + return connectable_polys_.find(poly_ref) != connectable_polys_.end(); +} diff --git a/server/gameserver/mapinstance.h b/server/gameserver/mapinstance.h index 8188e0ef..02ec160f 100644 --- a/server/gameserver/mapinstance.h +++ b/server/gameserver/mapinstance.h @@ -48,6 +48,7 @@ class MapInstance : public std::enable_shared_from_this int& same_polys_flags, std::vector& spec_polys, unsigned short exclude_flags); bool FindNearestPoint(const glm::vec3& center, float radius, glm::vec3& nearestPt); + bool FindConnectableNearestPoint(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); void Scale(glm::vec3& v); @@ -60,6 +61,7 @@ class MapInstance : public std::enable_shared_from_this glm::vec3& hit_pos, float& ray_length); bool GetNearestGrass(const glm::vec3& center, glm::vec3& out_pt); void AdjustOnLandPoint(glm::vec3& point); + bool IsConnectablePoly(dtPolyRef poly_ref); private: void LoadHouse();