mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-05-01 00:27:44 +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 );
|
||||
}
|
||||
|
||||
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 );
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -71,7 +71,7 @@ namespace Sapphire::Entity
|
|||
|
||||
uint8_t getAggressionMode() const;
|
||||
|
||||
float getScale() const;
|
||||
|
||||
float getNaviTargetReachedDistance() const;
|
||||
|
||||
// return true if it reached the position
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue