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 "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() )
|
||||||
{
|
{
|
||||||
|
|
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/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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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() );
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue