From b4ca1cc60e5083ca8b63276ff13afa080cd99055 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 8 Feb 2023 15:19:23 +0800 Subject: [PATCH] 1 --- server/gameserver/creature.cc | 3 ++- server/gameserver/mapinstance.cc | 39 ++++++++++++++++++-------------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 61ea970d..253c6e5c 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -2599,9 +2599,10 @@ void Creature::OnLand() } { glm::vec3 center = GetPos().ToGlmVec3(); + room->map_instance->PtInHouse(GetPos().ToGlmVec3(), center); room->map_instance->Scale(center); glm::vec3 point; - bool ok = room->map_instance->FindNearestPoint(center, 200, point); + bool ok = room->map_instance->FindNearestPoint(center, 10, point); if (!ok) { abort(); } diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index cf326e45..338e093f 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -738,25 +738,30 @@ bool MapInstance::PtInHouse(const glm::vec3& pt, glm::vec3& nearest_pt) float edged[DT_VERTS_PER_POLYGON]; float edget[DT_VERTS_PER_POLYGON]; for (auto& house : houses_) { - float* verts = &house.verts[0]; - if (!house.verts.empty() && dtPointInPolygon(fpt, &house.verts[0], house.verts.size())) { - if (dtDistancePtPolyEdgesSqr(fpt, &house.verts[0], house.verts.size(), edged, edget)) { - float dmin = edged[0]; - int imin = 0; - for (size_t i = 1; i < house.verts.size(); ++i) { - if (edged[i] < dmin) { - dmin = edged[i]; - imin = i; - } + if (house.verts.empty()) { + continue; + } + float* verts = &(house.verts[0]); + int nv = house.verts.size() / 3; + if (!dtPointInPolygon(fpt, verts, nv)) { + continue; + } + if (dtDistancePtPolyEdgesSqr(fpt, verts, nv, edged, edget)) { + float dmin = edged[0]; + int imin = 0; + for (size_t i = 1; i < nv; ++i) { + if (edged[i] < dmin) { + dmin = edged[i]; + imin = i; } - const float* va = &verts[imin*3]; - const float* vb = &verts[((imin+1)%house.verts.size())*3]; - dtVlerp(closest, va, vb, edget[imin]); - nearest_pt.x = closest[0]; - nearest_pt.y = closest[1]; - nearest_pt.z = closest[2]; - return true; } + const float* va = &verts[imin*3]; + const float* vb = &verts[((imin+1)%nv)*3]; + dtVlerp(closest, va, vb, edget[imin]); + nearest_pt.x = closest[0]; + nearest_pt.y = closest[1]; + nearest_pt.z = closest[2]; + return true; } } return false;