1
Fork 0
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:
Mordred 2019-04-19 15:07:09 +02:00 committed by GitHub
commit b6e9e87a88
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 47 additions and 9 deletions

View file

@ -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 );

View file

@ -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 )

View file

@ -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;

View file

@ -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

View file

@ -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;
}

View file

@ -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;
}; };
} }

View file

@ -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;