diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index a370eba5..5b2d4362 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -18,6 +18,7 @@ #include "mt/MetaMgr.h" #include "mt/Param.h" #include "mt/Map.h" +#include "mt/MapArea.h" #include "roommgr.h" @@ -608,4 +609,25 @@ void MapInstance::MarkMapAreaPolys() if (!tile) { abort(); } + for (int i = 0; i < tile->header->polyCount; ++i) { + dtPoly* poly = &tile->polys[i]; + const mt::MapArea* last_area_meta = nullptr; + if ((poly->flags & SAMPLE_POLYFLAGS_SWIM) == SAMPLE_POLYFLAGS_SWIM) { + for (int ii = 0; ii < poly->vertCount; ++ii) { + const float* vc = &tile->verts[poly->verts[ii]*3]; + const mt::MapArea* area_meta = mt::MapArea::GetAreaByPoint + (map_meta_->map_id(), + vc[0] * GetMapMeta()->scale(), + vc[1], + vc[2] * GetMapMeta()->scale()); + if (!area_meta) { + abort(); + } + if (last_area_meta && last_area_meta != area_meta) { + abort(); + } + last_area_meta = area_meta; + } + } + } } diff --git a/server/gameserver/mt/MapArea.cc b/server/gameserver/mt/MapArea.cc index f74b834b..bc8d7e6e 100644 --- a/server/gameserver/mt/MapArea.cc +++ b/server/gameserver/mt/MapArea.cc @@ -18,13 +18,34 @@ namespace mt { std::vector strings; a8::Split(area_center(), strings, ':'); + if (strings.size() != 2) { + abort(); + } + center_ = glm::vec2(a8::XValue(strings[0]).GetDouble(), a8::XValue(strings[1]).GetDouble()); } } - std::vector* MapArea::GetAreas(int map_id) + const mt::MapArea* MapArea::GetAreaByPoint(int map_id, float x, float y, float z) { auto itr = map_areas.find(map_id); - return itr != map_areas.end() ? &itr->second : nullptr; + if (itr != map_areas.end()) { + for (auto area_meta : itr->second) { + if (x < area_meta->center_.x - area_meta->area_width() / 2) { + break; + } + if (x > area_meta->center_.x + area_meta->area_width() / 2) { + break; + } + if (y < area_meta->center_.y - area_meta->area_height() / 2) { + break; + } + if (y > area_meta->center_.y + area_meta->area_height() / 2) { + break; + } + return area_meta; + } + } + return nullptr; } } diff --git a/server/gameserver/mt/MapArea.h b/server/gameserver/mt/MapArea.h index 61a87ca3..33be7b50 100644 --- a/server/gameserver/mt/MapArea.h +++ b/server/gameserver/mt/MapArea.h @@ -12,9 +12,8 @@ namespace mt public: void Init1(); - const glm::vec2 GetCenter() { return center_; }; - static std::vector* GetAreas(int map_id); + static const mt::MapArea* GetAreaByPoint(int map_id, float x, float y, float z); private: glm::vec2 center_ = glm::vec2(0.0f, 0.0f);