From 170c5c836528d80bdeb863d54b5f8e33e14a80d5 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sat, 1 Apr 2023 20:38:51 +0800 Subject: [PATCH] 1 --- server/gameserver/mapinstance.cc | 23 ++++++++++++++++++++++- server/gameserver/mapinstance.h | 1 + 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index cee4e74b..62dcb2be 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -577,7 +577,10 @@ void MapInstance::MarkMapAreaPolys() for (int ii = 0; ii < poly->vertCount; ++ii) { const float* vc = &tile->verts[poly->verts[ii]*3]; grass_pos_hash_.push_back - (glm::vec3(vc[0], vc[1], vc[2])); + (glm::vec3(vc[0] / GetMapMeta()->scale(), + vc[1], + vc[2] / GetMapMeta()->scale() + )); } } poly_ext_datas_.push_back(ext_flag); @@ -1085,3 +1088,21 @@ bool MapInstance::SceneRaycast(const glm::vec3& orig, } return result; } + +bool MapInstance::GetNearestGrass(const glm::vec3& center, glm::vec3& out_pt) +{ + float nearest_distance = FLT_MAX; + glm::vec3* nearest_pt = nullptr; + for (auto& pt : grass_pos_hash_) { + float distance = std::fabs(pt.x - center.x) + std::fabs(pt.z - center.z); + if (distance < nearest_distance) { + nearest_distance = distance; + nearest_pt = & pt; + } + } + if (nearest_pt) { + out_pt = *nearest_pt; + return true; + } + return false; +} diff --git a/server/gameserver/mapinstance.h b/server/gameserver/mapinstance.h index 55162a8f..f8581fd4 100644 --- a/server/gameserver/mapinstance.h +++ b/server/gameserver/mapinstance.h @@ -57,6 +57,7 @@ class MapInstance : public std::enable_shared_from_this bool PtInHouse(const glm::vec3& pt, glm::vec3& nearest_pt); 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); private: void LoadHouse();