mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-05-02 08:57:44 +00:00
Add NaviMgr
This commit is contained in:
parent
48d0836c29
commit
0c6755565d
9 changed files with 104 additions and 35 deletions
|
@ -31,7 +31,9 @@
|
|||
#include "BNpcTemplate.h"
|
||||
#include "Manager/TerritoryMgr.h"
|
||||
#include "Common.h"
|
||||
#include "Framework.h"
|
||||
#include <Logging/Logger.h>
|
||||
#include <Manager/NaviMgr.h>
|
||||
|
||||
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() )
|
||||
{
|
||||
|
|
29
src/world/Manager/NaviMgr.cpp
Normal file
29
src/world/Manager/NaviMgr.cpp
Normal 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;
|
||||
}
|
31
src/world/Manager/NaviMgr.h
Normal file
31
src/world/Manager/NaviMgr.h
Normal 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
|
|
@ -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;
|
||||
|
|
|
@ -13,11 +13,10 @@
|
|||
#include <DetourCommon.h>
|
||||
#include <recastnavigation/Recast/Include/Recast.h>
|
||||
|
||||
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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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<uint32_t*>( &models[0] ),
|
||||
reinterpret_cast<uint8_t*>( &look[0] ) );
|
||||
|
||||
m_bNpcTemplateMap[ name ] = bnpcTemplate;
|
||||
m_bNpcTemplateMap[name] = bnpcTemplate;
|
||||
}
|
||||
|
||||
Logger::debug( "BNpc Templates loaded: {0}", m_bNpcTemplateMap.size() );
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue