1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-02 08:57:44 +00:00

Add NaviMgr

This commit is contained in:
goaaats 2019-01-23 19:23:49 +01:00
parent 48d0836c29
commit 0c6755565d
9 changed files with 104 additions and 35 deletions

View file

@ -31,7 +31,9 @@
#include "BNpcTemplate.h" #include "BNpcTemplate.h"
#include "Manager/TerritoryMgr.h" #include "Manager/TerritoryMgr.h"
#include "Common.h" #include "Common.h"
#include "Framework.h"
#include <Logging/Logger.h> #include <Logging/Logger.h>
#include <Manager/NaviMgr.h>
using namespace Sapphire::Common; using namespace Sapphire::Common;
using namespace Sapphire::Network::Packets; using namespace Sapphire::Network::Packets;
@ -203,7 +205,16 @@ bool Sapphire::Entity::BNpc::moveTo( const FFXIVARR_POSITION3& pos )
// Check if we have to recalculate // Check if we have to recalculate
if( Util::getTimeMs() - m_naviLastUpdate > 500 ) 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() ) if( !path.empty() )
{ {

View file

@ -0,0 +1,29 @@
#include "NaviMgr.h"
#include <Logging/Logger.h>
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;
}

View file

@ -0,0 +1,31 @@
#ifndef SAPPHIRE_NAVIMGR_H
#define SAPPHIRE_NAVIMGR_H
#include "Forwards.h"
#include "BaseManager.h"
#include <array>
#include <Navi/NaviProvider.h>
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<std::string, NaviProvider*> m_naviProviderTerritoryMap;
};
}
#endif // SAPPHIRE_NAVIMGR_H

View file

@ -16,6 +16,7 @@
#include "Territory/Land.h" #include "Territory/Land.h"
#include "Territory/House.h" #include "Territory/House.h"
#include "Territory/Housing/HousingInteriorTerritory.h" #include "Territory/Housing/HousingInteriorTerritory.h"
#include "NaviMgr.h"
Sapphire::World::Manager::TerritoryMgr::TerritoryMgr( Sapphire::FrameworkPtr pFw ) : Sapphire::World::Manager::TerritoryMgr::TerritoryMgr( Sapphire::FrameworkPtr pFw ) :
BaseManager( pFw ), BaseManager( pFw ),
@ -163,8 +164,8 @@ bool Sapphire::World::Manager::TerritoryMgr::createDefaultTerritories()
uint32_t guid = getNextInstanceId(); uint32_t guid = getNextInstanceId();
auto pZone = make_Zone( territoryTypeId, guid, territoryInfo->name, pPlaceName->name, framework() ); auto pNaviMgr = framework()->get< Manager::NaviMgr >();
pZone->init(); bool hasNaviMesh = pNaviMgr->setupTerritory( territoryInfo->name );
Logger::info( "{0}\t{1}\t{2}\t{3:<10}\t{4}\t{5}\t{6}", Logger::info( "{0}\t{1}\t{2}\t{3:<10}\t{4}\t{5}\t{6}",
territoryTypeId, territoryTypeId,
@ -173,7 +174,10 @@ bool Sapphire::World::Manager::TerritoryMgr::createDefaultTerritories()
territoryInfo->name, territoryInfo->name,
( isPrivateTerritory( territoryTypeId ) ? "PRIVATE" : "PUBLIC" ), ( isPrivateTerritory( territoryTypeId ) ? "PRIVATE" : "PUBLIC" ),
pPlaceName->name, pPlaceName->name,
pZone->getNaviProvider()->hasNaviMesh() ? "NAVI" : ""); hasNaviMesh ? "NAVI" : "");
auto pZone = make_Zone( territoryTypeId, guid, territoryInfo->name, pPlaceName->name, framework() );
pZone->init();
InstanceIdToZonePtrMap instanceMap; InstanceIdToZonePtrMap instanceMap;
instanceMap[ guid ] = pZone; instanceMap[ guid ] = pZone;

View file

@ -13,11 +13,10 @@
#include <DetourCommon.h> #include <DetourCommon.h>
#include <recastnavigation/Recast/Include/Recast.h> #include <recastnavigation/Recast/Include/Recast.h>
Sapphire::NaviProvider::NaviProvider( Sapphire::ZonePtr pZone, Sapphire::FrameworkPtr pFw ) : Sapphire::NaviProvider::NaviProvider( std::string internalName ) :
m_pFw( pFw ),
m_pZone( pZone ),
m_naviMesh( nullptr ), m_naviMesh( nullptr ),
m_naviMeshQuery( nullptr ) m_naviMeshQuery( nullptr ),
m_internalName( internalName )
{ {
// Set defaults // Set defaults
m_polyFindRange[0] = 10; m_polyFindRange[0] = 10;
@ -25,14 +24,14 @@ Sapphire::NaviProvider::NaviProvider( Sapphire::ZonePtr pZone, Sapphire::Framewo
m_polyFindRange[2] = 10; m_polyFindRange[2] = 10;
} }
void Sapphire::NaviProvider::init() bool Sapphire::NaviProvider::init()
{ {
auto meshesFolder = std::filesystem::path( "navi" ); 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 ) ) 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() ); loadMesh( baseMesh.string() );
@ -50,7 +49,11 @@ void Sapphire::NaviProvider::init()
*/ */
initQuery(); initQuery();
return true;
} }
return false;
} }
bool Sapphire::NaviProvider::hasNaviMesh() const bool Sapphire::NaviProvider::hasNaviMesh() const

View file

@ -33,9 +33,9 @@ namespace Sapphire
static const int MAX_SMOOTH = 2048; static const int MAX_SMOOTH = 2048;
public: public:
NaviProvider( const ZonePtr pZone, Sapphire::FrameworkPtr pFw ); NaviProvider( const std::string internalName );
void init(); bool init();
void loadMesh( std::string path ); void loadMesh( std::string path );
void initQuery(); void initQuery();
@ -47,8 +47,7 @@ namespace Sapphire
bool hasNaviMesh() const; bool hasNaviMesh() const;
protected: protected:
FrameworkPtr m_pFw; std::string m_internalName;
ZonePtr m_pZone;
dtNavMesh* m_naviMesh; dtNavMesh* m_naviMesh;
dtNavMeshQuery* m_naviMeshQuery; dtNavMeshQuery* m_naviMeshQuery;

View file

@ -41,6 +41,7 @@
#include "Manager/ItemMgr.h" #include "Manager/ItemMgr.h"
#include "Manager/MarketMgr.h" #include "Manager/MarketMgr.h"
#include "Manager/RNGMgr.h" #include "Manager/RNGMgr.h"
#include "Manager/NaviMgr.h"
using namespace Sapphire::World::Manager; using namespace Sapphire::World::Manager;
@ -166,6 +167,9 @@ void Sapphire::World::ServerMgr::run( int32_t argc, char* argv[] )
loadBNpcTemplates(); loadBNpcTemplates();
auto pNaviMgr = std::make_shared< Manager::NaviMgr >( framework() );
framework()->set< Manager::NaviMgr >( pNaviMgr );
Logger::info( "TerritoryMgr: Setting up zones" ); Logger::info( "TerritoryMgr: Setting up zones" );
auto pTeriMgr = std::make_shared< Manager::TerritoryMgr >( framework() ); auto pTeriMgr = std::make_shared< Manager::TerritoryMgr >( framework() );
auto pHousingMgr = std::make_shared< Manager::HousingMgr >( 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 ); Logger::info( "[{0}] Creating new session", session_id_str );
std::shared_ptr< Session > newSession( new Session( sessionId, framework() ) ); std::shared_ptr< Session > newSession( new Session( sessionId, framework() ) );
m_sessionMapById[ sessionId ] = newSession; m_sessionMapById[sessionId] = newSession;
if( !newSession->loadPlayer() ) if( !newSession->loadPlayer() )
{ {
@ -351,7 +355,7 @@ bool Sapphire::World::ServerMgr::createSession( uint32_t sessionId )
return false; return false;
} }
m_sessionMapByName[ newSession->getPlayer()->getName() ] = newSession; m_sessionMapByName[newSession->getPlayer()->getName()] = newSession;
return true; 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 ) 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() void Sapphire::World::ServerMgr::loadBNpcTemplates()
@ -452,12 +456,12 @@ void Sapphire::World::ServerMgr::loadBNpcTemplates()
auto models = res->getBlobVector( 13 ); auto models = res->getBlobVector( 13 );
auto bnpcTemplate = std::make_shared< Entity::BNpcTemplate >( auto bnpcTemplate = std::make_shared< Entity::BNpcTemplate >(
id, bNPCBaseId, bNPCNameId, mainWeaponModel, secWeaponModel, id, bNPCBaseId, bNPCNameId, mainWeaponModel, secWeaponModel,
aggressionMode, enemyType, 0, pose, modelChara, displayFlags, aggressionMode, enemyType, 0, pose, modelChara, displayFlags,
reinterpret_cast< uint32_t* >( &models[ 0 ] ), reinterpret_cast<uint32_t*>( &models[0] ),
reinterpret_cast< uint8_t* >( &look[ 0 ] ) ); reinterpret_cast<uint8_t*>( &look[0] ) );
m_bNpcTemplateMap[ name ] = bnpcTemplate; m_bNpcTemplateMap[name] = bnpcTemplate;
} }
Logger::debug( "BNpc Templates loaded: {0}", m_bNpcTemplateMap.size() ); Logger::debug( "BNpc Templates loaded: {0}", m_bNpcTemplateMap.size() );

View file

@ -124,9 +124,6 @@ bool Sapphire::Zone::init()
// all good // all good
} }
m_naviProvider = new NaviProvider( shared_from_this(), m_pFw );
m_naviProvider->init();
return true; return true;
} }
@ -852,8 +849,3 @@ void Sapphire::Zone::updateSpawnPoints()
} }
Sapphire::NaviProvider* Sapphire::Zone::getNaviProvider() const
{
return m_naviProvider;
}

View file

@ -63,8 +63,6 @@ namespace Sapphire
std::vector< Entity::SpawnGroup > m_spawnGroups; std::vector< Entity::SpawnGroup > m_spawnGroups;
NaviProvider* m_naviProvider;
public: public:
Zone(); Zone();
@ -161,8 +159,6 @@ namespace Sapphire
InstanceContentPtr getAsInstanceContent(); InstanceContentPtr getAsInstanceContent();
void updateSpawnPoints(); void updateSpawnPoints();
NaviProvider* getNaviProvider() const;
}; };
} }