From ad4d8049e030cdc7bbfdff309824f4668e5a53d0 Mon Sep 17 00:00:00 2001 From: Mordred Date: Mon, 22 Apr 2019 23:30:43 +0200 Subject: [PATCH] Movement speed of BNpcs will double when in combat or retreat mode --- src/world/Actor/BNpc.cpp | 4 +++- src/world/Navi/NaviProvider.cpp | 17 +++++++++++++++++ src/world/Navi/NaviProvider.h | 2 ++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index 56ab6ead..4454af44 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -247,7 +247,6 @@ bool Sapphire::Entity::BNpc::moveTo( const Entity::Chara& targetChara ) return false; } - void Sapphire::Entity::BNpc::sendPositionUpdate() { uint8_t unk1 = 0x3a; @@ -478,6 +477,8 @@ void Sapphire::Entity::BNpc::update( uint64_t tickCount ) if( !pHatedActor ) return; + pNaviProvider->updateAgentParameters( *this ); + auto distanceOrig = Util::distance( getPos().x, getPos().y, getPos().z, m_spawnPos.x, m_spawnPos.y, m_spawnPos.z ); @@ -531,6 +532,7 @@ void Sapphire::Entity::BNpc::update( uint64_t tickCount ) setStance( Stance::Passive ); //setOwner( nullptr ); m_state = BNpcState::Retreat; + pNaviProvider->updateAgentParameters( *this ); } } } diff --git a/src/world/Navi/NaviProvider.cpp b/src/world/Navi/NaviProvider.cpp index 99cb7079..aaee0ba7 100644 --- a/src/world/Navi/NaviProvider.cpp +++ b/src/world/Navi/NaviProvider.cpp @@ -6,6 +6,7 @@ #include "Actor/Actor.h" #include "Actor/Chara.h" +#include "Actor/BNpc.h" #include @@ -582,6 +583,22 @@ int32_t Sapphire::World::Navi::NaviProvider::addAgent( Entity::Chara& chara ) return m_pCrowd->addAgent( position, ¶ms ); } +void Sapphire::World::Navi::NaviProvider::updateAgentParameters( Entity::BNpc& bnpc ) +{ + dtCrowdAgentParams params; + std::memset( ¶ms, 0, sizeof( params ) ); + params.height = 3.f; + params.maxAcceleration = 25.f; + params.maxSpeed = std::pow( 2, bnpc.getRadius() * 0.35f ) + 1.f; + if( bnpc.getState() == Entity::BNpcState::Combat || bnpc.getState() == Entity::BNpcState::Retreat ) + params.maxSpeed *= 2; + params.radius = ( bnpc.getRadius() ) * 0.75f; + params.collisionQueryRange = params.radius * 12.0f; + params.pathOptimizationRange = params.radius * 20.0f; + params.updateFlags = 0; + m_pCrowd->updateAgentParameters( bnpc.getAgentId(), ¶ms ); +} + void Sapphire::World::Navi::NaviProvider::updateCrowd( float timeInSeconds ) { dtCrowdAgentDebugInfo info; diff --git a/src/world/Navi/NaviProvider.h b/src/world/Navi/NaviProvider.h index d402cda0..047abf17 100644 --- a/src/world/Navi/NaviProvider.h +++ b/src/world/Navi/NaviProvider.h @@ -72,6 +72,8 @@ namespace Sapphire::World::Navi void addAgentUpdateFlag( Entity::Chara& chara, uint8_t flags ); void removeAgentUpdateFlag( Entity::Chara& chara, uint8_t flags ); + void updateAgentParameters( Entity::BNpc& bnpc ); + protected: std::string m_internalName;