mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-05-01 08:27:46 +00:00
Merge pull request #550 from NotAdam/crowd
more accurate bnpc scale calculation
This commit is contained in:
commit
b6e9e87a88
7 changed files with 47 additions and 9 deletions
|
@ -3906,6 +3906,12 @@ Sapphire::Data::ModelChara::ModelChara( uint32_t row_id, Sapphire::Data::ExdData
|
||||||
variant = exdData->getField< uint8_t >( row, 3 );
|
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 )
|
Sapphire::Data::ModelState::ModelState( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData )
|
||||||
{
|
{
|
||||||
auto row = exdData->m_ModelStateDat.get_row( row_id );
|
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_MobHuntOrderTypeDat = setupDatAccess( "MobHuntOrderType", xiv::exd::Language::none );
|
||||||
m_MobHuntTargetDat = setupDatAccess( "MobHuntTarget", xiv::exd::Language::none );
|
m_MobHuntTargetDat = setupDatAccess( "MobHuntTarget", xiv::exd::Language::none );
|
||||||
m_ModelCharaDat = setupDatAccess( "ModelChara", 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_ModelStateDat = setupDatAccess( "ModelState", xiv::exd::Language::none );
|
||||||
m_MonsterNoteDat = setupDatAccess( "MonsterNote", xiv::exd::Language::en );
|
m_MonsterNoteDat = setupDatAccess( "MonsterNote", xiv::exd::Language::en );
|
||||||
m_MonsterNoteTargetDat = setupDatAccess( "MonsterNoteTarget", xiv::exd::Language::none );
|
m_MonsterNoteTargetDat = setupDatAccess( "MonsterNoteTarget", xiv::exd::Language::none );
|
||||||
|
|
|
@ -342,6 +342,7 @@ struct MinionSkillType;
|
||||||
struct MobHuntOrderType;
|
struct MobHuntOrderType;
|
||||||
struct MobHuntTarget;
|
struct MobHuntTarget;
|
||||||
struct ModelChara;
|
struct ModelChara;
|
||||||
|
struct ModelSkeleton;
|
||||||
struct ModelState;
|
struct ModelState;
|
||||||
struct MonsterNote;
|
struct MonsterNote;
|
||||||
struct MonsterNoteTarget;
|
struct MonsterNoteTarget;
|
||||||
|
@ -3934,6 +3935,13 @@ struct ModelChara
|
||||||
ModelChara( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData );
|
ModelChara( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ModelSkeleton
|
||||||
|
{
|
||||||
|
float scaleFactor;
|
||||||
|
|
||||||
|
ModelSkeleton( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData );
|
||||||
|
};
|
||||||
|
|
||||||
struct ModelState
|
struct ModelState
|
||||||
{
|
{
|
||||||
uint16_t start;
|
uint16_t start;
|
||||||
|
@ -5802,6 +5810,7 @@ struct ZoneSharedGroup
|
||||||
xiv::exd::Exd m_MobHuntOrderTypeDat;
|
xiv::exd::Exd m_MobHuntOrderTypeDat;
|
||||||
xiv::exd::Exd m_MobHuntTargetDat;
|
xiv::exd::Exd m_MobHuntTargetDat;
|
||||||
xiv::exd::Exd m_ModelCharaDat;
|
xiv::exd::Exd m_ModelCharaDat;
|
||||||
|
xiv::exd::Exd m_ModelSkeletonDat;
|
||||||
xiv::exd::Exd m_ModelStateDat;
|
xiv::exd::Exd m_ModelStateDat;
|
||||||
xiv::exd::Exd m_MonsterNoteDat;
|
xiv::exd::Exd m_MonsterNoteDat;
|
||||||
xiv::exd::Exd m_MonsterNoteTargetDat;
|
xiv::exd::Exd m_MonsterNoteTargetDat;
|
||||||
|
@ -6274,6 +6283,7 @@ struct ZoneSharedGroup
|
||||||
using MobHuntOrderTypePtr = std::shared_ptr< MobHuntOrderType >;
|
using MobHuntOrderTypePtr = std::shared_ptr< MobHuntOrderType >;
|
||||||
using MobHuntTargetPtr = std::shared_ptr< MobHuntTarget >;
|
using MobHuntTargetPtr = std::shared_ptr< MobHuntTarget >;
|
||||||
using ModelCharaPtr = std::shared_ptr< ModelChara >;
|
using ModelCharaPtr = std::shared_ptr< ModelChara >;
|
||||||
|
using ModelSkeletonPtr = std::shared_ptr< ModelSkeleton >;
|
||||||
using ModelStatePtr = std::shared_ptr< ModelState >;
|
using ModelStatePtr = std::shared_ptr< ModelState >;
|
||||||
using MonsterNotePtr = std::shared_ptr< MonsterNote >;
|
using MonsterNotePtr = std::shared_ptr< MonsterNote >;
|
||||||
using MonsterNoteTargetPtr = std::shared_ptr< MonsterNoteTarget >;
|
using MonsterNoteTargetPtr = std::shared_ptr< MonsterNoteTarget >;
|
||||||
|
@ -6777,6 +6787,7 @@ struct ZoneSharedGroup
|
||||||
std::set< uint32_t > m_MobHuntOrderTypeIdList;
|
std::set< uint32_t > m_MobHuntOrderTypeIdList;
|
||||||
std::set< uint32_t > m_MobHuntTargetIdList;
|
std::set< uint32_t > m_MobHuntTargetIdList;
|
||||||
std::set< uint32_t > m_ModelCharaIdList;
|
std::set< uint32_t > m_ModelCharaIdList;
|
||||||
|
std::set< uint32_t > m_ModelSkeletonIdList;
|
||||||
std::set< uint32_t > m_ModelStateIdList;
|
std::set< uint32_t > m_ModelStateIdList;
|
||||||
std::set< uint32_t > m_MonsterNoteIdList;
|
std::set< uint32_t > m_MonsterNoteIdList;
|
||||||
std::set< uint32_t > m_MonsterNoteTargetIdList;
|
std::set< uint32_t > m_MonsterNoteTargetIdList;
|
||||||
|
@ -8869,6 +8880,12 @@ const std::set< uint32_t >& getModelCharaIdList()
|
||||||
loadIdList( m_ModelCharaDat, m_ModelCharaIdList );
|
loadIdList( m_ModelCharaDat, m_ModelCharaIdList );
|
||||||
return 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()
|
const std::set< uint32_t >& getModelStateIdList()
|
||||||
{
|
{
|
||||||
if( m_ModelStateIdList.size() == 0 )
|
if( m_ModelStateIdList.size() == 0 )
|
||||||
|
|
|
@ -100,6 +100,14 @@ Sapphire::Entity::BNpc::BNpc( uint32_t id, BNpcTemplatePtr pTemplate, float posX
|
||||||
|
|
||||||
m_scale = bNpcBaseData->scale;
|
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?
|
// todo: is this actually good?
|
||||||
//m_naviTargetReachedDistance = m_scale * 2.f;
|
//m_naviTargetReachedDistance = m_scale * 2.f;
|
||||||
m_naviTargetReachedDistance = 4.f;
|
m_naviTargetReachedDistance = 4.f;
|
||||||
|
@ -117,11 +125,6 @@ float Sapphire::Entity::BNpc::getNaviTargetReachedDistance() const
|
||||||
return m_naviTargetReachedDistance;
|
return m_naviTargetReachedDistance;
|
||||||
}
|
}
|
||||||
|
|
||||||
float Sapphire::Entity::BNpc::getScale() const
|
|
||||||
{
|
|
||||||
return m_scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t Sapphire::Entity::BNpc::getEnemyType() const
|
uint8_t Sapphire::Entity::BNpc::getEnemyType() const
|
||||||
{
|
{
|
||||||
return m_enemyType;
|
return m_enemyType;
|
||||||
|
|
|
@ -71,7 +71,7 @@ namespace Sapphire::Entity
|
||||||
|
|
||||||
uint8_t getAggressionMode() const;
|
uint8_t getAggressionMode() const;
|
||||||
|
|
||||||
float getScale() const;
|
|
||||||
float getNaviTargetReachedDistance() const;
|
float getNaviTargetReachedDistance() const;
|
||||||
|
|
||||||
// return true if it reached the position
|
// return true if it reached the position
|
||||||
|
|
|
@ -38,7 +38,8 @@ Sapphire::Entity::Chara::Chara( ObjKind type, FrameworkPtr pFw ) :
|
||||||
m_pose( 0 ),
|
m_pose( 0 ),
|
||||||
m_targetId( INVALID_GAME_OBJECT_ID64 ),
|
m_targetId( INVALID_GAME_OBJECT_ID64 ),
|
||||||
m_pFw( std::move( std::move( pFw ) ) ),
|
m_pFw( std::move( std::move( pFw ) ) ),
|
||||||
m_directorId( 0 )
|
m_directorId( 0 ),
|
||||||
|
m_scale( 2.f )
|
||||||
{
|
{
|
||||||
|
|
||||||
m_lastTickTime = 0;
|
m_lastTickTime = 0;
|
||||||
|
@ -712,3 +713,9 @@ void Sapphire::Entity::Chara::setAgentId( uint32_t agentId )
|
||||||
{
|
{
|
||||||
m_agentId = agentId;
|
m_agentId = agentId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float Sapphire::Entity::Chara::getScale() const
|
||||||
|
{
|
||||||
|
return m_scale;
|
||||||
|
}
|
|
@ -131,6 +131,9 @@ namespace Sapphire::Entity
|
||||||
/*! Detour Crowd AgentId */
|
/*! Detour Crowd AgentId */
|
||||||
uint32_t m_agentId;
|
uint32_t m_agentId;
|
||||||
|
|
||||||
|
/*! Detour Crowd actor scale */
|
||||||
|
float m_scale;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Chara( Common::ObjKind type, FrameworkPtr pFw );
|
Chara( Common::ObjKind type, FrameworkPtr pFw );
|
||||||
|
|
||||||
|
@ -275,6 +278,8 @@ namespace Sapphire::Entity
|
||||||
uint32_t getAgentId() const;
|
uint32_t getAgentId() const;
|
||||||
void setAgentId( uint32_t agentId );
|
void setAgentId( uint32_t agentId );
|
||||||
|
|
||||||
|
float getScale() const;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -573,7 +573,7 @@ int32_t Sapphire::World::Navi::NaviProvider::addAgent( Entity::Chara& chara )
|
||||||
params.height = 7.f;
|
params.height = 7.f;
|
||||||
params.maxAcceleration = 26.f;
|
params.maxAcceleration = 26.f;
|
||||||
params.maxSpeed = 13.5f;
|
params.maxSpeed = 13.5f;
|
||||||
params.radius = 2.f;
|
params.radius = chara.getScale() / 2;
|
||||||
params.collisionQueryRange = params.radius * 12.0f;
|
params.collisionQueryRange = params.radius * 12.0f;
|
||||||
params.pathOptimizationRange = params.radius * 30.0f;
|
params.pathOptimizationRange = params.radius * 30.0f;
|
||||||
params.updateFlags = 0;
|
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 )
|
void Sapphire::World::Navi::NaviProvider::updateCrowd( float timeInSeconds )
|
||||||
{
|
{
|
||||||
|
|
||||||
dtCrowdAgentDebugInfo info;
|
dtCrowdAgentDebugInfo info;
|
||||||
info.idx = -1;
|
info.idx = -1;
|
||||||
info.vod = m_vod;
|
info.vod = m_vod;
|
||||||
|
|
Loading…
Add table
Reference in a new issue