From ee662ba15d2e92cfafa3251a50e58c6a04ab64d4 Mon Sep 17 00:00:00 2001 From: goaaats Date: Mon, 21 Jan 2019 02:42:47 +0100 Subject: [PATCH] path things --- src/world/Actor/BNpc.cpp | 138 +++++++++++++++++--------------- src/world/Navi/NaviProvider.cpp | 25 ++++-- 2 files changed, 91 insertions(+), 72 deletions(-) diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index 2fb811a3..dca819f7 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -153,6 +153,11 @@ bool Sapphire::Entity::BNpc::moveTo( const FFXIVARR_POSITION3& pos ) // reached destination return true; + auto path = m_pCurrentZone->GetNaviProvider()->PathFindFollow( m_pos, pos ); + + //face( path[0] ); + + /* float rot = Util::calcAngFrom( getPos().x, getPos().z, pos.x, pos.z ); float newRot = PI - rot + ( PI / 2 ); @@ -171,6 +176,7 @@ bool Sapphire::Entity::BNpc::moveTo( const FFXIVARR_POSITION3& pos ) setRot( newRot ); sendPositionUpdate(); + */ return false; } @@ -306,87 +312,87 @@ void Sapphire::Entity::BNpc::update( int64_t currTime ) switch( m_state ) { - case BNpcState::Retreat: + case BNpcState::Retreat: + { + if( moveTo( m_spawnPos ) ) + m_state = BNpcState::Idle; + } + break; + + case BNpcState::Idle: + { + // passive mobs should ignore players unless aggro'd + if( m_aggressionMode == 1 ) + return; + + CharaPtr pClosestChara = getClosestChara(); + + if( pClosestChara && pClosestChara->isAlive() ) { - if( moveTo( m_spawnPos ) ) - m_state = BNpcState::Idle; + auto distance = Util::distance( getPos().x, getPos().y, getPos().z, + pClosestChara->getPos().x, + pClosestChara->getPos().y, + pClosestChara->getPos().z ); + + if( distance < aggroRange && pClosestChara->isPlayer() ) + aggro( pClosestChara ); + //if( distance < aggroRange && getbehavior() == 2 ) + // aggro( pClosestActor ); } - break; + } - case BNpcState::Idle: + case BNpcState::Combat: + { + auto pHatedActor = hateListGetHighest(); + if( !pHatedActor ) + return; + + auto distanceOrig = Util::distance( getPos().x, getPos().y, getPos().z, + m_spawnPos.x, + m_spawnPos.y, + m_spawnPos.z ); + + if( pHatedActor && !pHatedActor->isAlive() ) { - // passive mobs should ignore players unless aggro'd - if( m_aggressionMode == 1 ) - return; - - CharaPtr pClosestChara = getClosestChara(); - - if( pClosestChara && pClosestChara->isAlive() ) - { - auto distance = Util::distance( getPos().x, getPos().y, getPos().z, - pClosestChara->getPos().x, - pClosestChara->getPos().y, - pClosestChara->getPos().z ); - - if( distance < aggroRange && pClosestChara->isPlayer() ) - aggro( pClosestChara ); - //if( distance < aggroRange && getbehavior() == 2 ) - // aggro( pClosestActor ); - } + hateListRemove( pHatedActor ); + pHatedActor = hateListGetHighest(); } - case BNpcState::Combat: + if( pHatedActor ) { - auto pHatedActor = hateListGetHighest(); - if( !pHatedActor ) - return; + auto distance = Util::distance( getPos().x, getPos().y, getPos().z, + pHatedActor->getPos().x, + pHatedActor->getPos().y, + pHatedActor->getPos().z ); - auto distanceOrig = Util::distance( getPos().x, getPos().y, getPos().z, - m_spawnPos.x, - m_spawnPos.y, - m_spawnPos.z ); - - if( pHatedActor && !pHatedActor->isAlive() ) - { - hateListRemove( pHatedActor ); - pHatedActor = hateListGetHighest(); - } - - if( pHatedActor ) - { - auto distance = Util::distance( getPos().x, getPos().y, getPos().z, - pHatedActor->getPos().x, - pHatedActor->getPos().y, - pHatedActor->getPos().z ); - - if( distanceOrig > maxDistanceToOrigin ) - { - hateListClear(); - changeTarget( INVALID_GAME_OBJECT_ID ); - setStance( Stance::Passive ); - //setOwner( nullptr ); - m_state = BNpcState::Retreat; - break; - } - - if( distance > minActorDistance ) - moveTo( pHatedActor->getPos() ); - else - { - if( face( pHatedActor->getPos() ) ) - sendPositionUpdate(); - // in combat range. ATTACK! - autoAttack( pHatedActor ); - } - } - else + if( distanceOrig > maxDistanceToOrigin ) { + hateListClear(); changeTarget( INVALID_GAME_OBJECT_ID ); setStance( Stance::Passive ); //setOwner( nullptr ); m_state = BNpcState::Retreat; + break; + } + + if( distance > minActorDistance ) + moveTo( pHatedActor->getPos() ); + else + { + if( face( pHatedActor->getPos() ) ) + sendPositionUpdate(); + // in combat range. ATTACK! + autoAttack( pHatedActor ); } } + else + { + changeTarget( INVALID_GAME_OBJECT_ID ); + setStance( Stance::Passive ); + //setOwner( nullptr ); + m_state = BNpcState::Retreat; + } + } } } diff --git a/src/world/Navi/NaviProvider.cpp b/src/world/Navi/NaviProvider.cpp index 46b4c83b..9e80a007 100644 --- a/src/world/Navi/NaviProvider.cpp +++ b/src/world/Navi/NaviProvider.cpp @@ -20,9 +20,9 @@ Sapphire::NaviProvider::NaviProvider( Sapphire::ZonePtr pZone, Sapphire::Framewo m_naviMeshQuery( nullptr ) { // Set defaults - m_polyFindRange[0] = 2; - m_polyFindRange[1] = 4; - m_polyFindRange[2] = 2; + m_polyFindRange[0] = 10; + m_polyFindRange[1] = 20; + m_polyFindRange[2] = 10; } void Sapphire::NaviProvider::init() @@ -34,9 +34,11 @@ void Sapphire::NaviProvider::init() { auto baseMesh = meshFolder / std::filesystem::path( m_pZone->getInternalName() + ".nav" ); - //m_naviMesh = LoadMesh( baseMesh.string() ); + LoadMesh( baseMesh.string() ); // Load all meshes for testing + + /* for( const auto & entry : std::filesystem::directory_iterator( meshFolder ) ) { if( entry.path().extension().string() == ".nav" ) @@ -45,6 +47,7 @@ void Sapphire::NaviProvider::init() LoadMesh( entry.path().string() ); } } + */ InitQuery(); } @@ -221,10 +224,11 @@ std::vector< Sapphire::Common::FFXIVARR_POSITION3 > Sapphire::NaviProvider::Path dtPolyRef startRef, endRef = 0; float start[3] = { startPos.x, startPos.y, startPos.z }; - float end[3] = { startPos.x, startPos.y, startPos.z }; + float end[3] = { endPos.x, endPos.y, endPos.z }; dtQueryFilter filter; - filter.setAreaCost( 0, 0 ); + filter.setIncludeFlags(0xffff); + filter.setExcludeFlags(0); m_naviMeshQuery->findNearestPoly( start, m_polyFindRange, &filter, &startRef, 0 ); m_naviMeshQuery->findNearestPoly( end, m_polyFindRange, &filter, &endRef, 0 ); @@ -262,6 +266,8 @@ std::vector< Sapphire::Common::FFXIVARR_POSITION3 > Sapphire::NaviProvider::Path dtVcopy( &smoothPath[numSmoothPath * 3], iterPos ); numSmoothPath++; + auto resultCoords = std::vector< Common::FFXIVARR_POSITION3 >(); + // Move towards target a small advancement at a time until target reached or // when ran out of memory to store the path. while( npolys && numSmoothPath < MAX_SMOOTH ) @@ -365,6 +371,13 @@ std::vector< Sapphire::Common::FFXIVARR_POSITION3 > Sapphire::NaviProvider::Path numSmoothPath++; } } + + for( int i = 0; i < numSmoothPath; i += 3 ) + { + resultCoords.push_back( Common::FFXIVARR_POSITION3{ smoothPath[i], smoothPath[i + 2], smoothPath[i + 3] } ); + } + + return resultCoords; } else {