diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index 92d020bd..1f1f7ee7 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -31,7 +31,9 @@ #include "BNpcTemplate.h" #include "Manager/TerritoryMgr.h" #include "Common.h" +#include "Framework.h" #include +#include using namespace Sapphire::Common; using namespace Sapphire::Network::Packets; @@ -203,7 +205,16 @@ bool Sapphire::Entity::BNpc::moveTo( const FFXIVARR_POSITION3& pos ) // Check if we have to recalculate if( Util::getTimeMs() - m_naviLastUpdate > 500 ) { - auto path = m_pCurrentZone->getNaviProvider()->findFollowPath( m_pos, pos ); + auto pNaviMgr = m_pFw->get< World::Manager::NaviMgr >(); + auto pNaviProvider = pNaviMgr->getNaviProvider( m_pCurrentZone->getInternalName() ); + + 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 ); if( !path.empty() ) { diff --git a/src/world/Manager/NaviMgr.cpp b/src/world/Manager/NaviMgr.cpp new file mode 100644 index 00000000..9b6f161c --- /dev/null +++ b/src/world/Manager/NaviMgr.cpp @@ -0,0 +1,29 @@ +#include "NaviMgr.h" +#include + +Sapphire::World::Manager::NaviMgr::NaviMgr( FrameworkPtr pFw ) : + BaseManager( pFw ), + m_pFw( pFw ) +{ +} + +bool Sapphire::World::Manager::NaviMgr::setupTerritory( std::string internalName ) +{ + auto provider = new NaviProvider( internalName ); + + if( provider->init() ) + { + m_naviProviderTerritoryMap.insert( std::make_pair( internalName, provider ) ); + return true; + } + + return false; +} + +Sapphire::NaviProvider* Sapphire::World::Manager::NaviMgr::getNaviProvider( std::string internalName ) +{ + if( m_naviProviderTerritoryMap.find( internalName ) != m_naviProviderTerritoryMap.end() ) + return m_naviProviderTerritoryMap[internalName]; + + return nullptr; +} diff --git a/src/world/Manager/NaviMgr.h b/src/world/Manager/NaviMgr.h new file mode 100644 index 00000000..5dee0c87 --- /dev/null +++ b/src/world/Manager/NaviMgr.h @@ -0,0 +1,31 @@ +#ifndef SAPPHIRE_NAVIMGR_H +#define SAPPHIRE_NAVIMGR_H + +#include "Forwards.h" +#include "BaseManager.h" + +#include +#include + +namespace Sapphire::World::Manager +{ + class NaviMgr : public BaseManager + { + + public: + + NaviMgr( FrameworkPtr pFw ); + virtual ~NaviMgr() = default; + + bool setupTerritory( std::string internalName ); + NaviProvider* getNaviProvider( std::string internalName ); + + private: + FrameworkPtr m_pFw; + + std::unordered_map m_naviProviderTerritoryMap; + }; + +} + +#endif // SAPPHIRE_NAVIMGR_H diff --git a/src/world/Manager/TerritoryMgr.cpp b/src/world/Manager/TerritoryMgr.cpp index 09885244..fcbb4223 100644 --- a/src/world/Manager/TerritoryMgr.cpp +++ b/src/world/Manager/TerritoryMgr.cpp @@ -16,6 +16,7 @@ #include "Territory/Land.h" #include "Territory/House.h" #include "Territory/Housing/HousingInteriorTerritory.h" +#include "NaviMgr.h" Sapphire::World::Manager::TerritoryMgr::TerritoryMgr( Sapphire::FrameworkPtr pFw ) : BaseManager( pFw ), @@ -163,8 +164,8 @@ bool Sapphire::World::Manager::TerritoryMgr::createDefaultTerritories() uint32_t guid = getNextInstanceId(); - auto pZone = make_Zone( territoryTypeId, guid, territoryInfo->name, pPlaceName->name, framework() ); - pZone->init(); + auto pNaviMgr = framework()->get< Manager::NaviMgr >(); + bool hasNaviMesh = pNaviMgr->setupTerritory( territoryInfo->name ); Logger::info( "{0}\t{1}\t{2}\t{3:<10}\t{4}\t{5}\t{6}", territoryTypeId, @@ -173,7 +174,10 @@ bool Sapphire::World::Manager::TerritoryMgr::createDefaultTerritories() territoryInfo->name, ( isPrivateTerritory( territoryTypeId ) ? "PRIVATE" : "PUBLIC" ), pPlaceName->name, - pZone->getNaviProvider()->hasNaviMesh() ? "NAVI" : ""); + hasNaviMesh ? "NAVI" : ""); + + auto pZone = make_Zone( territoryTypeId, guid, territoryInfo->name, pPlaceName->name, framework() ); + pZone->init(); InstanceIdToZonePtrMap instanceMap; instanceMap[ guid ] = pZone; diff --git a/src/world/Navi/NaviProvider.cpp b/src/world/Navi/NaviProvider.cpp index 064095dc..e50660c3 100644 --- a/src/world/Navi/NaviProvider.cpp +++ b/src/world/Navi/NaviProvider.cpp @@ -13,11 +13,10 @@ #include #include -Sapphire::NaviProvider::NaviProvider( Sapphire::ZonePtr pZone, Sapphire::FrameworkPtr pFw ) : - m_pFw( pFw ), - m_pZone( pZone ), +Sapphire::NaviProvider::NaviProvider( std::string internalName ) : m_naviMesh( nullptr ), - m_naviMeshQuery( nullptr ) + m_naviMeshQuery( nullptr ), + m_internalName( internalName ) { // Set defaults m_polyFindRange[0] = 10; @@ -25,14 +24,14 @@ Sapphire::NaviProvider::NaviProvider( Sapphire::ZonePtr pZone, Sapphire::Framewo m_polyFindRange[2] = 10; } -void Sapphire::NaviProvider::init() +bool Sapphire::NaviProvider::init() { auto meshesFolder = std::filesystem::path( "navi" ); - auto meshFolder = meshesFolder / std::filesystem::path( m_pZone->getInternalName() ); + auto meshFolder = meshesFolder / std::filesystem::path( m_internalName ); if( std::filesystem::exists( meshFolder ) ) { - auto baseMesh = meshFolder / std::filesystem::path( m_pZone->getInternalName() + ".nav" ); + auto baseMesh = meshFolder / std::filesystem::path( m_internalName + ".nav" ); loadMesh( baseMesh.string() ); @@ -50,7 +49,11 @@ void Sapphire::NaviProvider::init() */ initQuery(); + + return true; } + + return false; } bool Sapphire::NaviProvider::hasNaviMesh() const diff --git a/src/world/Navi/NaviProvider.h b/src/world/Navi/NaviProvider.h index 5b9592da..3b0424db 100644 --- a/src/world/Navi/NaviProvider.h +++ b/src/world/Navi/NaviProvider.h @@ -33,9 +33,9 @@ namespace Sapphire static const int MAX_SMOOTH = 2048; public: - NaviProvider( const ZonePtr pZone, Sapphire::FrameworkPtr pFw ); + NaviProvider( const std::string internalName ); - void init(); + bool init(); void loadMesh( std::string path ); void initQuery(); @@ -47,8 +47,7 @@ namespace Sapphire bool hasNaviMesh() const; protected: - FrameworkPtr m_pFw; - ZonePtr m_pZone; + std::string m_internalName; dtNavMesh* m_naviMesh; dtNavMeshQuery* m_naviMeshQuery; diff --git a/src/world/ServerMgr.cpp b/src/world/ServerMgr.cpp index 3de61f73..24624678 100644 --- a/src/world/ServerMgr.cpp +++ b/src/world/ServerMgr.cpp @@ -41,6 +41,7 @@ #include "Manager/ItemMgr.h" #include "Manager/MarketMgr.h" #include "Manager/RNGMgr.h" +#include "Manager/NaviMgr.h" using namespace Sapphire::World::Manager; @@ -166,6 +167,9 @@ void Sapphire::World::ServerMgr::run( int32_t argc, char* argv[] ) loadBNpcTemplates(); + auto pNaviMgr = std::make_shared< Manager::NaviMgr >( framework() ); + framework()->set< Manager::NaviMgr >( pNaviMgr ); + Logger::info( "TerritoryMgr: Setting up zones" ); auto pTeriMgr = std::make_shared< Manager::TerritoryMgr >( framework() ); auto pHousingMgr = std::make_shared< Manager::HousingMgr >( framework() ); @@ -343,7 +347,7 @@ bool Sapphire::World::ServerMgr::createSession( uint32_t sessionId ) Logger::info( "[{0}] Creating new session", session_id_str ); std::shared_ptr< Session > newSession( new Session( sessionId, framework() ) ); - m_sessionMapById[ sessionId ] = newSession; + m_sessionMapById[sessionId] = newSession; if( !newSession->loadPlayer() ) { @@ -351,7 +355,7 @@ bool Sapphire::World::ServerMgr::createSession( uint32_t sessionId ) return false; } - m_sessionMapByName[ newSession->getPlayer()->getName() ] = newSession; + m_sessionMapByName[newSession->getPlayer()->getName()] = newSession; return true; @@ -420,7 +424,7 @@ std::string Sapphire::World::ServerMgr::getPlayerNameFromDb( uint32_t playerId, void Sapphire::World::ServerMgr::updatePlayerName( uint32_t playerId, const std::string & playerNewName ) { - m_playerNameMapById[ playerId ] = playerNewName; + m_playerNameMapById[playerId] = playerNewName; } void Sapphire::World::ServerMgr::loadBNpcTemplates() @@ -452,12 +456,12 @@ void Sapphire::World::ServerMgr::loadBNpcTemplates() auto models = res->getBlobVector( 13 ); auto bnpcTemplate = std::make_shared< Entity::BNpcTemplate >( - id, bNPCBaseId, bNPCNameId, mainWeaponModel, secWeaponModel, - aggressionMode, enemyType, 0, pose, modelChara, displayFlags, - reinterpret_cast< uint32_t* >( &models[ 0 ] ), - reinterpret_cast< uint8_t* >( &look[ 0 ] ) ); + id, bNPCBaseId, bNPCNameId, mainWeaponModel, secWeaponModel, + aggressionMode, enemyType, 0, pose, modelChara, displayFlags, + reinterpret_cast( &models[0] ), + reinterpret_cast( &look[0] ) ); - m_bNpcTemplateMap[ name ] = bnpcTemplate; + m_bNpcTemplateMap[name] = bnpcTemplate; } Logger::debug( "BNpc Templates loaded: {0}", m_bNpcTemplateMap.size() ); diff --git a/src/world/Territory/Zone.cpp b/src/world/Territory/Zone.cpp index 5e53b5eb..6dcad395 100644 --- a/src/world/Territory/Zone.cpp +++ b/src/world/Territory/Zone.cpp @@ -124,9 +124,6 @@ bool Sapphire::Zone::init() // all good } - m_naviProvider = new NaviProvider( shared_from_this(), m_pFw ); - m_naviProvider->init(); - return true; } @@ -852,8 +849,3 @@ void Sapphire::Zone::updateSpawnPoints() } -Sapphire::NaviProvider* Sapphire::Zone::getNaviProvider() const -{ - return m_naviProvider; -} - diff --git a/src/world/Territory/Zone.h b/src/world/Territory/Zone.h index b556bff4..ac436be7 100644 --- a/src/world/Territory/Zone.h +++ b/src/world/Territory/Zone.h @@ -63,8 +63,6 @@ namespace Sapphire std::vector< Entity::SpawnGroup > m_spawnGroups; - NaviProvider* m_naviProvider; - public: Zone(); @@ -161,8 +159,6 @@ namespace Sapphire InstanceContentPtr getAsInstanceContent(); void updateSpawnPoints(); - - NaviProvider* getNaviProvider() const; }; }