diff --git a/src/common/Exd/ExdDataGenerated.cpp b/src/common/Exd/ExdDataGenerated.cpp index da9df8b1..c7485692 100644 --- a/src/common/Exd/ExdDataGenerated.cpp +++ b/src/common/Exd/ExdDataGenerated.cpp @@ -3906,6 +3906,12 @@ Sapphire::Data::ModelChara::ModelChara( uint32_t row_id, Sapphire::Data::ExdData variant = exdData->getField< uint8_t >( row, 3 ); } +Sapphire::Data::ModelSkeleton::ModelSkeleton( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_ModelSkeletonDat.get_row( row_id ); + scaleFactor = exdData->getField< float >( row, 0 ); +} + Sapphire::Data::ModelState::ModelState( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ModelStateDat.get_row( row_id ); @@ -6935,6 +6941,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_MobHuntOrderTypeDat = setupDatAccess( "MobHuntOrderType", xiv::exd::Language::none ); m_MobHuntTargetDat = setupDatAccess( "MobHuntTarget", xiv::exd::Language::none ); m_ModelCharaDat = setupDatAccess( "ModelChara", xiv::exd::Language::none ); + m_ModelSkeletonDat = setupDatAccess( "ModelSkeleton", xiv::exd::Language::none ); m_ModelStateDat = setupDatAccess( "ModelState", xiv::exd::Language::none ); m_MonsterNoteDat = setupDatAccess( "MonsterNote", xiv::exd::Language::en ); m_MonsterNoteTargetDat = setupDatAccess( "MonsterNoteTarget", xiv::exd::Language::none ); diff --git a/src/common/Exd/ExdDataGenerated.h b/src/common/Exd/ExdDataGenerated.h index 525c3bd3..97c6122b 100644 --- a/src/common/Exd/ExdDataGenerated.h +++ b/src/common/Exd/ExdDataGenerated.h @@ -342,6 +342,7 @@ struct MinionSkillType; struct MobHuntOrderType; struct MobHuntTarget; struct ModelChara; +struct ModelSkeleton; struct ModelState; struct MonsterNote; struct MonsterNoteTarget; @@ -3934,6 +3935,13 @@ struct ModelChara ModelChara( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct ModelSkeleton +{ + float scaleFactor; + + ModelSkeleton( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct ModelState { uint16_t start; @@ -5802,6 +5810,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_MobHuntOrderTypeDat; xiv::exd::Exd m_MobHuntTargetDat; xiv::exd::Exd m_ModelCharaDat; + xiv::exd::Exd m_ModelSkeletonDat; xiv::exd::Exd m_ModelStateDat; xiv::exd::Exd m_MonsterNoteDat; xiv::exd::Exd m_MonsterNoteTargetDat; @@ -6274,6 +6283,7 @@ struct ZoneSharedGroup using MobHuntOrderTypePtr = std::shared_ptr< MobHuntOrderType >; using MobHuntTargetPtr = std::shared_ptr< MobHuntTarget >; using ModelCharaPtr = std::shared_ptr< ModelChara >; + using ModelSkeletonPtr = std::shared_ptr< ModelSkeleton >; using ModelStatePtr = std::shared_ptr< ModelState >; using MonsterNotePtr = std::shared_ptr< MonsterNote >; using MonsterNoteTargetPtr = std::shared_ptr< MonsterNoteTarget >; @@ -6777,6 +6787,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_MobHuntOrderTypeIdList; std::set< uint32_t > m_MobHuntTargetIdList; std::set< uint32_t > m_ModelCharaIdList; + std::set< uint32_t > m_ModelSkeletonIdList; std::set< uint32_t > m_ModelStateIdList; std::set< uint32_t > m_MonsterNoteIdList; std::set< uint32_t > m_MonsterNoteTargetIdList; @@ -8869,6 +8880,12 @@ const std::set< uint32_t >& getModelCharaIdList() loadIdList( m_ModelCharaDat, m_ModelCharaIdList ); return m_ModelCharaIdList; } +const std::set< uint32_t >& getModelSkeletonIdList() +{ + if( m_ModelSkeletonIdList.size() == 0 ) + loadIdList( m_ModelSkeletonDat, m_ModelSkeletonIdList ); + return m_ModelSkeletonIdList; +} const std::set< uint32_t >& getModelStateIdList() { if( m_ModelStateIdList.size() == 0 ) diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index 586341ba..a9e8be94 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -100,6 +100,14 @@ Sapphire::Entity::BNpc::BNpc( uint32_t id, BNpcTemplatePtr pTemplate, float posX m_scale = bNpcBaseData->scale; + auto modelChara = exdData->get< Data::ModelChara >( bNpcBaseData->modelChara ); + if( modelChara ) + { + auto modelSkeleton = exdData->get< Data::ModelSkeleton >( modelChara->model ); + if( modelSkeleton ) + m_scale *= modelSkeleton->scaleFactor; + } + // todo: is this actually good? //m_naviTargetReachedDistance = m_scale * 2.f; m_naviTargetReachedDistance = 4.f; @@ -117,11 +125,6 @@ float Sapphire::Entity::BNpc::getNaviTargetReachedDistance() const return m_naviTargetReachedDistance; } -float Sapphire::Entity::BNpc::getScale() const -{ - return m_scale; -} - uint8_t Sapphire::Entity::BNpc::getEnemyType() const { return m_enemyType; diff --git a/src/world/Actor/BNpc.h b/src/world/Actor/BNpc.h index 453c178d..8ed859b9 100644 --- a/src/world/Actor/BNpc.h +++ b/src/world/Actor/BNpc.h @@ -71,7 +71,7 @@ namespace Sapphire::Entity uint8_t getAggressionMode() const; - float getScale() const; + float getNaviTargetReachedDistance() const; // return true if it reached the position diff --git a/src/world/Actor/Chara.cpp b/src/world/Actor/Chara.cpp index 3af406f6..6eba77f9 100644 --- a/src/world/Actor/Chara.cpp +++ b/src/world/Actor/Chara.cpp @@ -38,7 +38,8 @@ Sapphire::Entity::Chara::Chara( ObjKind type, FrameworkPtr pFw ) : m_pose( 0 ), m_targetId( INVALID_GAME_OBJECT_ID64 ), m_pFw( std::move( std::move( pFw ) ) ), - m_directorId( 0 ) + m_directorId( 0 ), + m_scale( 2.f ) { m_lastTickTime = 0; @@ -712,3 +713,9 @@ void Sapphire::Entity::Chara::setAgentId( uint32_t agentId ) { m_agentId = agentId; } + + +float Sapphire::Entity::Chara::getScale() const +{ + return m_scale; +} \ No newline at end of file diff --git a/src/world/Actor/Chara.h b/src/world/Actor/Chara.h index a6a95776..56638255 100644 --- a/src/world/Actor/Chara.h +++ b/src/world/Actor/Chara.h @@ -131,6 +131,9 @@ namespace Sapphire::Entity /*! Detour Crowd AgentId */ uint32_t m_agentId; + /*! Detour Crowd actor scale */ + float m_scale; + public: Chara( Common::ObjKind type, FrameworkPtr pFw ); @@ -275,6 +278,8 @@ namespace Sapphire::Entity uint32_t getAgentId() const; void setAgentId( uint32_t agentId ); + float getScale() const; + }; } diff --git a/src/world/Navi/NaviProvider.cpp b/src/world/Navi/NaviProvider.cpp index da0338c6..2db4bdcb 100644 --- a/src/world/Navi/NaviProvider.cpp +++ b/src/world/Navi/NaviProvider.cpp @@ -573,7 +573,7 @@ int32_t Sapphire::World::Navi::NaviProvider::addAgent( Entity::Chara& chara ) params.height = 7.f; params.maxAcceleration = 26.f; params.maxSpeed = 13.5f; - params.radius = 2.f; + params.radius = chara.getScale() / 2; params.collisionQueryRange = params.radius * 12.0f; params.pathOptimizationRange = params.radius * 30.0f; params.updateFlags = 0; @@ -584,7 +584,6 @@ int32_t Sapphire::World::Navi::NaviProvider::addAgent( Entity::Chara& chara ) void Sapphire::World::Navi::NaviProvider::updateCrowd( float timeInSeconds ) { - dtCrowdAgentDebugInfo info; info.idx = -1; info.vod = m_vod;