From c42d4416a4b02036cfc75571e08c548147822566 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 20 Apr 2019 15:13:46 +1000 Subject: [PATCH 1/3] correctly calculate deltatime, set agent flags on dormant bnpcs --- src/world/Actor/BNpc.cpp | 21 +++++++++-------- src/world/Actor/BNpc.h | 1 - src/world/Navi/NaviProvider.cpp | 30 ++++++++++++++++++++----- src/world/Navi/NaviProvider.h | 3 +++ src/world/Territory/InstanceContent.cpp | 2 ++ src/world/Territory/QuestBattle.cpp | 2 ++ src/world/Territory/Zone.cpp | 10 +++++---- 7 files changed, 50 insertions(+), 19 deletions(-) diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index 5ec37921..1196341e 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -228,7 +228,6 @@ void Sapphire::Entity::BNpc::step() bool Sapphire::Entity::BNpc::moveTo( const FFXIVARR_POSITION3& pos ) { - auto pNaviMgr = m_pFw->get< World::Manager::NaviMgr >(); auto pNaviProvider = m_pCurrentZone->getNaviProvider(); if( !pNaviProvider ) @@ -239,21 +238,24 @@ bool Sapphire::Entity::BNpc::moveTo( const FFXIVARR_POSITION3& pos ) return false; } + pNaviProvider->addAgentUpdateFlag( *this, DT_CROWD_OBSTACLE_AVOIDANCE ); + auto pos1 = pNaviProvider->getMovePos( *this ); - if( Util::distance( pos1, pos ) < ( getScale() / 2 ) ) + if( Util::distance( pos1, pos ) < getScale() ) { // Reached destination - face( pos1 ); + face( pos ); setPos( pos1 ); sendPositionUpdate(); //pNaviProvider->resetMoveTarget( *this ); pNaviProvider->updateAgentPosition( *this ); + pNaviProvider->removeAgentUpdateFlag( *this, DT_CROWD_OBSTACLE_AVOIDANCE ); return true; } m_pCurrentZone->updateActorPosition( *this ); - face( pos1 ); + face( pos ); setPos( pos1 ); sendPositionUpdate(); return false; @@ -262,7 +264,6 @@ bool Sapphire::Entity::BNpc::moveTo( const FFXIVARR_POSITION3& pos ) bool Sapphire::Entity::BNpc::moveTo( const Entity::Chara& targetChara ) { - auto pNaviMgr = m_pFw->get< World::Manager::NaviMgr >(); auto pNaviProvider = m_pCurrentZone->getNaviProvider(); if( !pNaviProvider ) @@ -273,21 +274,24 @@ bool Sapphire::Entity::BNpc::moveTo( const Entity::Chara& targetChara ) return false; } + pNaviProvider->addAgentUpdateFlag( *this, DT_CROWD_OBSTACLE_AVOIDANCE ); + auto pos1 = pNaviProvider->getMovePos( *this ); - if( Util::distance( pos1, targetChara.getPos() ) <= ( ( getScale() / 2 + targetChara.getScale() / 2 ) ) ) + if( Util::distance( pos1, targetChara.getPos() ) <= ( getScale() + targetChara.getScale() ) ) { // Reached destination - face( pos1 ); + face( targetChara.getPos() ); setPos( pos1 ); sendPositionUpdate(); //pNaviProvider->resetMoveTarget( *this ); pNaviProvider->updateAgentPosition( *this ); + pNaviProvider->removeAgentUpdateFlag( *this, DT_CROWD_OBSTACLE_AVOIDANCE ); return true; } m_pCurrentZone->updateActorPosition( *this ); - face( pos1 ); + face( targetChara.getPos() ); setPos( pos1 ); sendPositionUpdate(); return false; @@ -446,7 +450,6 @@ void Sapphire::Entity::BNpc::update( uint64_t tickCount ) const uint8_t maxDistanceToOrigin = 40; const uint32_t roamTick = 20; - auto pNaviMgr = m_pFw->get< World::Manager::NaviMgr >(); auto pNaviProvider = m_pCurrentZone->getNaviProvider(); switch( m_state ) diff --git a/src/world/Actor/BNpc.h b/src/world/Actor/BNpc.h index cb8156bc..5042118c 100644 --- a/src/world/Actor/BNpc.h +++ b/src/world/Actor/BNpc.h @@ -137,7 +137,6 @@ namespace Sapphire::Entity uint32_t m_flags; - float m_scale; float m_naviTargetReachedDistance; uint32_t m_timeOfDeath; diff --git a/src/world/Navi/NaviProvider.cpp b/src/world/Navi/NaviProvider.cpp index 3feff0ed..49383f59 100644 --- a/src/world/Navi/NaviProvider.cpp +++ b/src/world/Navi/NaviProvider.cpp @@ -570,12 +570,12 @@ int32_t Sapphire::World::Navi::NaviProvider::addAgent( Entity::Chara& chara ) { dtCrowdAgentParams params; std::memset( ¶ms, 0, sizeof( params ) ); - params.height = 7.f; - params.maxAcceleration = 126.f; - params.maxSpeed = 13.5f; + params.height = 3.f; + params.maxAcceleration = 25.f; + params.maxSpeed = std::pow( 2, chara.getScale() * 0.35f ) + 1.f; params.radius = chara.getScale() / 2; - params.collisionQueryRange = params.radius * 20.0f; - params.pathOptimizationRange = params.radius * 10.0f; + params.collisionQueryRange = params.radius * 12.0f; + params.pathOptimizationRange = params.radius * 20.0f; params.updateFlags = 0; //params.updateFlags |= DT_CROWD_OBSTACLE_AVOIDANCE; float position[] = { chara.getPos().x, chara.getPos().y, chara.getPos().z }; @@ -664,4 +664,24 @@ bool Sapphire::World::Navi::NaviProvider::syncPosToChara( Entity::Chara& chara ) chara.setPos( pos ); return true; +} + +void Sapphire::World::Navi::NaviProvider::addAgentUpdateFlag( Sapphire::Entity::Chara& chara, uint8_t flags ) +{ + auto ag = m_pCrowd->getEditableAgent( chara.getAgentId() ); + + if( !ag ) + return; + + ag->params.updateFlags |= flags; +} + +void Sapphire::World::Navi::NaviProvider::removeAgentUpdateFlag( Sapphire::Entity::Chara& chara, uint8_t flags ) +{ + auto ag = m_pCrowd->getEditableAgent( chara.getAgentId() ); + + if( !ag ) + return; + + ag->params.updateFlags ^= flags; } \ No newline at end of file diff --git a/src/world/Navi/NaviProvider.h b/src/world/Navi/NaviProvider.h index 80cba51d..d402cda0 100644 --- a/src/world/Navi/NaviProvider.h +++ b/src/world/Navi/NaviProvider.h @@ -69,6 +69,9 @@ namespace Sapphire::World::Navi bool syncPosToChara( Entity::Chara& chara ); + void addAgentUpdateFlag( Entity::Chara& chara, uint8_t flags ); + void removeAgentUpdateFlag( Entity::Chara& chara, uint8_t flags ); + protected: std::string m_internalName; diff --git a/src/world/Territory/InstanceContent.cpp b/src/world/Territory/InstanceContent.cpp index 688b90a7..81b9f868 100644 --- a/src/world/Territory/InstanceContent.cpp +++ b/src/world/Territory/InstanceContent.cpp @@ -159,6 +159,8 @@ void Sapphire::InstanceContent::onUpdate( uint64_t tickCount ) auto pScriptMgr = m_pFw->get< Scripting::ScriptMgr >(); pScriptMgr->onInstanceUpdate( getAsInstanceContent(), tickCount ); + + m_lastUpdate = tickCount; } void Sapphire::InstanceContent::onFinishLoading( Entity::Player& player ) diff --git a/src/world/Territory/QuestBattle.cpp b/src/world/Territory/QuestBattle.cpp index df3b71e8..39d0f821 100644 --- a/src/world/Territory/QuestBattle.cpp +++ b/src/world/Territory/QuestBattle.cpp @@ -159,6 +159,8 @@ void Sapphire::QuestBattle::onUpdate( uint64_t tickCount ) auto pScriptMgr = m_pFw->get< Scripting::ScriptMgr >(); pScriptMgr->onInstanceUpdate( getAsQuestBattle(), tickCount ); + + m_lastUpdate = tickCount; } void Sapphire::QuestBattle::onFinishLoading( Entity::Player& player ) diff --git a/src/world/Territory/Zone.cpp b/src/world/Territory/Zone.cpp index ee52d012..7245323f 100644 --- a/src/world/Territory/Zone.cpp +++ b/src/world/Territory/Zone.cpp @@ -473,17 +473,21 @@ bool Sapphire::Zone::update( uint64_t tickCount ) //TODO: this should be moved to a updateWeather call and pulled out of updateSessions bool changedWeather = checkWeather(); + auto dt = std::difftime( tickCount, m_lastUpdate ) / 1000.f; + if( m_pNaviProvider ) - m_pNaviProvider->updateCrowd( 0.02f ); + m_pNaviProvider->updateCrowd( dt ); updateSessions( tickCount, changedWeather ); onUpdate( tickCount ); updateSpawnPoints(); - if( m_playerMap.size() > 0 ) + if( !m_playerMap.empty() ) m_lastActivityTime = tickCount; + m_lastUpdate = tickCount; + return true; } @@ -508,8 +512,6 @@ void Sapphire::Zone::updateSessions( uint64_t tickCount, bool changedWeather ) return; } - m_lastUpdate = tickCount; - if( changedWeather ) { auto weatherChangePacket = makeZonePacket< FFXIVIpcWeatherChange >( pPlayer->getId() ); From 439e58bf375f26e6fb1b1bce6a0e4edbcee0e4ce Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 20 Apr 2019 19:40:44 +1000 Subject: [PATCH 2/3] fix build, not sure how that happened --- src/world/Territory/Zone.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/Territory/Zone.cpp b/src/world/Territory/Zone.cpp index 7245323f..c9c2402b 100644 --- a/src/world/Territory/Zone.cpp +++ b/src/world/Territory/Zone.cpp @@ -19,7 +19,7 @@ #include "InstanceContent.h" #include "QuestBattle.h" #include "Manager/TerritoryMgr.h" -#include "Navi/Naviprovider.h" +#include "Navi/NaviProvider.h" #include "Session.h" #include "Actor/Chara.h" From d1016b32da43f7f1d27c597f9bd57d76908c7eef Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 20 Apr 2019 22:50:05 +1000 Subject: [PATCH 3/3] fix dumb mistake --- src/world/Navi/NaviProvider.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/Navi/NaviProvider.cpp b/src/world/Navi/NaviProvider.cpp index 49383f59..2390e818 100644 --- a/src/world/Navi/NaviProvider.cpp +++ b/src/world/Navi/NaviProvider.cpp @@ -683,5 +683,5 @@ void Sapphire::World::Navi::NaviProvider::removeAgentUpdateFlag( Sapphire::Entit if( !ag ) return; - ag->params.updateFlags ^= flags; + ag->params.updateFlags &= ~flags; } \ No newline at end of file