From c2356b9057277983778747b03f42d7f33085daf6 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 27 Jan 2019 23:26:34 +1100 Subject: [PATCH 1/2] cap poly length for generated nav paths --- src/world/Actor/BNpc.cpp | 46 +++++++++++++++++------------------ src/world/Navi/NaviProvider.h | 2 +- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index b56f6e88..04a59af9 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -198,34 +198,32 @@ bool Sapphire::Entity::BNpc::moveTo( const FFXIVARR_POSITION3& pos ) return true; } - // Check if we have to recalculate - if( Util::getTimeMs() - m_naviLastUpdate > 500 ) + auto pNaviMgr = m_pFw->get< World::Manager::NaviMgr >(); + auto pNaviProvider = pNaviMgr->getNaviProvider( m_pCurrentZone->getBgPath() ); + + if( !pNaviProvider ) { - auto pNaviMgr = m_pFw->get< World::Manager::NaviMgr >(); - auto pNaviProvider = pNaviMgr->getNaviProvider( m_pCurrentZone->getBgPath() ); + Logger::error( "No NaviProvider for zone#{0} - {1}", + m_pCurrentZone->getGuId(), + m_pCurrentZone->getInternalName() ); + return false; + } - if( !pNaviProvider ) - { - Logger::error( "No NaviProvider for zone#{0} - {1}", - m_pCurrentZone->getGuId(), - m_pCurrentZone->getInternalName() ); - return false; - } + auto path = pNaviProvider->findFollowPath( m_pos, pos ); - auto path = pNaviProvider->findFollowPath( m_pos, pos ); + if( !path.empty() ) + { + m_naviLastPath = path; + m_naviTarget = pos; + m_naviPathStep = 0; + m_naviLastUpdate = Util::getTimeMs(); + } + else + { + Logger::debug( "No path found from x{0} y{1} z{2} to x{3} y{4} z{5} in {6}", + getPos().x, getPos().y, getPos().z, pos.x, pos.y, pos.z, m_pCurrentZone->getInternalName() ); - if( !path.empty() ) - { - m_naviLastPath = path; - m_naviTarget = pos; - m_naviPathStep = 0; - m_naviLastUpdate = Util::getTimeMs(); - } - else - { - Logger::debug( "No path found from x{0} y{1} z{2} to x{3} y{4} z{5} in {6}", - getPos().x, getPos().y, getPos().z, pos.x, pos.y, pos.z, m_pCurrentZone->getInternalName() ); - } + hateListClear(); } diff --git a/src/world/Navi/NaviProvider.h b/src/world/Navi/NaviProvider.h index e69b6671..c11896ec 100644 --- a/src/world/Navi/NaviProvider.h +++ b/src/world/Navi/NaviProvider.h @@ -8,7 +8,7 @@ namespace Sapphire::World::Navi { - const int32_t MAX_POLYS = 256; + const int32_t MAX_POLYS = 8; const int32_t MAX_SMOOTH = 2048; const int32_t NAVMESHSET_MAGIC = 'M' << 24 | 'S' << 16 | 'E' << 8 | 'T'; //'MSET' From 2011c8ca912f80ffa2328c22992303c6e9c8c29c Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 27 Jan 2019 23:47:36 +1100 Subject: [PATCH 2/2] probably fix stepping past the next step destination --- src/world/Actor/BNpc.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index 04a59af9..4049bf97 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -162,9 +162,13 @@ void Sapphire::Entity::BNpc::step() return; auto stepPos = m_naviLastPath[ m_naviPathStep ]; + auto distanceToStep = Util::distance( getPos().x, getPos().y, getPos().z, + stepPos.x, stepPos.y, stepPos.z ); - if( Util::distance( getPos().x, getPos().y, getPos().z, stepPos.x, stepPos.y, stepPos.z ) <= 4 && - m_naviPathStep < m_naviLastPath.size() - 1 ) + auto distanceToDest = Util::distance( getPos().x, getPos().y, getPos().z, + m_naviTarget.x, m_naviTarget.y, m_naviTarget.z ); + + if( distanceToStep <= 4 && m_naviPathStep < m_naviLastPath.size() - 1 ) { // Reached step in path m_naviPathStep++; @@ -179,10 +183,16 @@ void Sapphire::Entity::BNpc::step() if( m_state == BNpcState::Roaming ) speed *= 0.5f; + if( distanceToDest <= distanceToStep + speed ) + { + speed = distanceToDest; + } + auto x = ( cosf( angle ) * speed ); auto y = stepPos.y; auto z = ( sinf( angle ) * speed ); + face( stepPos ); setPos( { getPos().x + x, y, getPos().z + z } ); sendPositionUpdate();