From 9bb4cf37f48ed4b1243b11b3b16834be4ec9375a Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sun, 18 Feb 2024 14:08:06 +0800 Subject: [PATCH] 1 --- server/gameserver/mapinstance.cc | 33 +++++++++++++++++++++++++------- server/gameserver/mapinstance.h | 2 +- server/gameserver/movement.cc | 15 +++++++++++++++ server/gameserver/movement.h | 14 -------------- server/gameserver/pbutils.cc | 2 +- server/gameserver/types.h | 16 ++++++++++++++++ 6 files changed, 59 insertions(+), 23 deletions(-) diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 0f3605e6..66563ecc 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -229,7 +229,7 @@ void MapInstance::AttachRoom(Room* room, RoomInitInfo& init_info) int MapInstance::FindStraightPath( const glm::vec3& start, const glm::vec3& end, - std::vector& paths) + std::vector& paths) { float spos[3]; spos[0] = start.x; @@ -264,7 +264,6 @@ int MapInstance::FindStraightPath( unsigned char straightPathFlags[MAX_POLYS]; dtPolyRef straightPathPolys[MAX_POLYS]; int nstraightPath; - int pos = 0; navmesh_query_->findPath (startRef, @@ -295,17 +294,37 @@ int MapInstance::FindStraightPath( straightPathPolys, &nstraightPath, MAX_POLYS); + glm::vec3 last_pos = start; + UnScale(last_pos); for(int i = 0; i < nstraightPath * 3; ) { - glm::vec3 currpos; - currpos.x = straightPath[i++]; - currpos.y = straightPath[i++]; - currpos.z = straightPath[i++]; + glm::vec3 pos; + pos.x = straightPath[i++]; + pos.y = straightPath[i++]; + pos.z = straightPath[i++]; + UnScale(pos); + if (!GlmHelper::IsEqual2D(pos, last_pos)) { + glm::vec3 dir = pos - last_pos; + GlmHelper::Normalize(dir); + MovePathPoint point; + point.src_pos.FromGlmVec3(last_pos); + point.curr_pos.FromGlmVec3(last_pos); + point.dir.x = dir.x; + point.dir.y = dir.y; + point.dir.z = dir.z; + point.distance = GlmHelper::Norm2D(pos - last_pos); + point.tar_pos.FromGlmVec3(pos); + paths.push_back(point); + + last_pos = pos; + } +#if 0 paths.push_back(currpos); pos++; +#endif } } - return pos; + return paths.size(); } bool MapInstance::RandPoint(const glm::vec3& center, float range, glm::vec3& out_point) diff --git a/server/gameserver/mapinstance.h b/server/gameserver/mapinstance.h index d1ca853f..8edd9ec6 100644 --- a/server/gameserver/mapinstance.h +++ b/server/gameserver/mapinstance.h @@ -37,7 +37,7 @@ class MapInstance : public std::enable_shared_from_this dtNavMeshQuery* GetNavMeshQuery() { return navmesh_query_.get(); }; int FindStraightPath(const glm::vec3& start, const glm::vec3& end, - std::vector& paths); + std::vector& paths); bool FindRandomPointAroundCircle(const glm::vec3& center_pos, float max_radius, glm::vec3& random_pt); diff --git a/server/gameserver/movement.cc b/server/gameserver/movement.cc index fdb89d25..01642407 100644 --- a/server/gameserver/movement.cc +++ b/server/gameserver/movement.cc @@ -210,11 +210,25 @@ bool Movement::FindPath(const glm::vec3& target_pos, float distance) glm::vec3 start = owner_->GetPos().ToGlmVec3(); glm::vec3 end = target_pos; +#if 1 + owner_->room->map_instance->Scale(start); + owner_->room->map_instance->Scale(end); + owner_->room->map_instance->FindStraightPath(start, end, paths_); + if (!paths_.empty()) { + is_find_path_ = true; + if (!paths_.empty()) { + owner_->SetMoveDir(paths_.at(0).dir); + owner_->SetAttackDir(paths_.at(0).dir); + } + } +#else std::vector paths; owner_->room->map_instance->Scale(start); owner_->room->map_instance->Scale(end); + #if 0 owner_->room->map_instance->FindStraightPath(start, end, paths); + #endif if (paths.size() > 0) { glm::vec3 last_pos = owner_->GetPos().ToGlmVec3(); for (const glm::vec3& pos1 : paths) { @@ -256,6 +270,7 @@ bool Movement::FindPath(const glm::vec3& target_pos, float distance) owner_->SetAttackDir(paths_.at(0).dir); } } +#endif AdjustLastPath(distance); return !paths_.empty(); } diff --git a/server/gameserver/movement.h b/server/gameserver/movement.h index f2eadee4..92c7da89 100644 --- a/server/gameserver/movement.h +++ b/server/gameserver/movement.h @@ -2,20 +2,6 @@ #include "DetourNavMeshQuery.h" -struct MovePathPoint -{ -private: - Position src_pos; - Position tar_pos; - Position curr_pos; - glm::vec3 dir; - float distance = 0.0f; - int same_polys_flags = 0; - std::vector spec_polys; - - friend class Movement; -}; - class Creature; class Movement { diff --git a/server/gameserver/pbutils.cc b/server/gameserver/pbutils.cc index e67fd617..11f6e6f9 100644 --- a/server/gameserver/pbutils.cc +++ b/server/gameserver/pbutils.cc @@ -1767,7 +1767,7 @@ void Human::SendUIUpdate() [this, ¬ifymsg] (Human* ele_hum, bool& stop) { if (ele_hum == this || ele_hum->IsOb()) { -#ifdef MYDEBUG +#ifdef MYDEBUG1 a8::XPrintf("SendUIUpdate self_team_id:%d is_ob:%d data:%s\n", { ele_hum->GetTeam()->GetTeamId(), diff --git a/server/gameserver/types.h b/server/gameserver/types.h index 29bf57eb..ac37eb99 100644 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -1,6 +1,7 @@ #pragma once #include "weakptr.h" +#include "DetourNavMesh.h" namespace MetaData { @@ -104,3 +105,18 @@ namespace a8 { bool GtOrEqZero(float val); } + +struct MovePathPoint +{ +private: + Position src_pos; + Position tar_pos; + Position curr_pos; + glm::vec3 dir; + float distance = 0.0f; + int same_polys_flags = 0; + std::vector spec_polys; + + friend class Movement; + friend class MapInstance; +};