From 73094fb85c2d1f8f514e6ae1112c023bae5f5173 Mon Sep 17 00:00:00 2001 From: Tahir <6381451+takhlaq@users.noreply.github.com> Date: Wed, 26 Jun 2024 20:44:36 +0100 Subject: [PATCH] fix incorrect radius for bnpc - pass filters to snapshot - fix replay not formatting debug message correctly --- src/common/Util/UtilMath.cpp | 12 ++++++++++-- src/world/AI/Fsm/StateCombat.cpp | 3 ++- src/world/AI/TargetHelper.cpp | 12 +++++++----- src/world/AI/TargetHelper.h | 10 ++++------ src/world/Actor/BNpc.cpp | 4 ++-- src/world/Encounter/Selector.cpp | 7 +++---- src/world/Encounter/Selector.h | 3 ++- src/world/Session.cpp | 2 +- 8 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/common/Util/UtilMath.cpp b/src/common/Util/UtilMath.cpp index 8bbb1c95..44d9aa23 100644 --- a/src/common/Util/UtilMath.cpp +++ b/src/common/Util/UtilMath.cpp @@ -39,8 +39,12 @@ float Util::distance2D( float x, float y, float x1, float y1 ) float Util::calcAngTo( float x, float y, float x1, float y1 ) { - float dx = x - x1; - float dy = y - y1; + float dx = x1 - x; + float dy = y1 - y; + + if( dx == 0.0f && dy == 0.0f ) + return 0.0f; + if( dy != 0.0f ) { return atan2( dy, dx ); @@ -55,6 +59,10 @@ float Util::calcAngFrom( float x, float y, float x1, float y1 ) { float dx = x - x1; float dy = y - y1; + + if( dx == 0.0f && dy == 0.0f ) + return 0.0f; + if( dy != 0.0f ) { return atan2( dy, dx ); diff --git a/src/world/AI/Fsm/StateCombat.cpp b/src/world/AI/Fsm/StateCombat.cpp index 612e9288..85bb4ca5 100644 --- a/src/world/AI/Fsm/StateCombat.cpp +++ b/src/world/AI/Fsm/StateCombat.cpp @@ -50,8 +50,9 @@ void AI::Fsm::StateCombat::onUpdate( Entity::BNpc& bnpc, uint64_t tickCount ) pNaviProvider->syncPosToChara( bnpc ); - if( distance < ( bnpc.getNaviTargetReachedDistance() + bnpc.getRadius() + pHatedActor->getRadius() ) ) + if( distance < ( bnpc.getNaviTargetReachedDistance() + pHatedActor->getRadius() ) ) { + // todo: dont turn if facing if( !bnpc.hasFlag( Entity::TurningDisabled ) ) bnpc.face( pHatedActor->getPos() ); diff --git a/src/world/AI/TargetHelper.cpp b/src/world/AI/TargetHelper.cpp index 4f4fbb2e..aef8433e 100644 --- a/src/world/AI/TargetHelper.cpp +++ b/src/world/AI/TargetHelper.cpp @@ -159,7 +159,9 @@ namespace Sapphire::World::AI } void Snapshot::createSnapshot( Entity::CharaPtr pSrc, const std::set< Entity::GameObjectPtr >& inRange, - int count, bool fillWithRandom, const std::vector< uint32_t >& exclude ) + uint32_t count, bool fillWithRandom, + const std::vector< TargetSelectFilterPtr >& filters, + const std::vector< uint32_t >& exclude ) { m_results.clear(); m_targetIds.clear(); @@ -179,7 +181,7 @@ namespace Sapphire::World::AI continue; bool matches = true; - for( const auto& filter : m_filters ) + for( const auto& filter : filters ) { if( !filter->isApplicable( pSrc, pChara ) ) { @@ -190,7 +192,7 @@ namespace Sapphire::World::AI if( matches ) { - CharaEntry entry; + CharaEntry entry{}; entry.m_entityId = pChara->getId(); entry.m_pos = pChara->getPos(); entry.m_rot = pChara->getRot(); @@ -226,7 +228,7 @@ namespace Sapphire::World::AI std::shuffle( remaining.begin(), remaining.end(), *RNGMgr.getRNGEngine() ); auto pChara = remaining.back(); - CharaEntry entry; + CharaEntry entry{}; entry.m_entityId = pChara->getId(); entry.m_pos = pChara->getPos(); entry.m_rot = pChara->getRot(); @@ -236,7 +238,7 @@ namespace Sapphire::World::AI } // sort by distance at the end always - auto srcPos = pSrc->getPos(); + const auto& srcPos = pSrc->getPos(); std::sort( m_results.begin(), m_results.end(), [ srcPos ]( CharaEntry l, CharaEntry r ) { diff --git a/src/world/AI/TargetHelper.h b/src/world/AI/TargetHelper.h index 21f8e8f0..772fdc38 100644 --- a/src/world/AI/TargetHelper.h +++ b/src/world/AI/TargetHelper.h @@ -227,18 +227,16 @@ namespace Sapphire::World::AI using Results = std::vector< CharaEntry >; using TargetIds = std::vector< uint32_t >; private: - std::vector< TargetSelectFilterPtr > m_filters; std::vector< CharaEntry > m_results; std::vector< uint32_t > m_targetIds; public: - Snapshot( const std::vector< TargetSelectFilterPtr >& filters ) : - m_filters( filters ) - { - } + Snapshot() {} void createSnapshot( Entity::CharaPtr pSrc, const std::set< Entity::GameObjectPtr >& inRange, - int count, bool fillWithRandom, const std::vector< uint32_t >& exclude = {} ); + uint32_t count, bool fillWithRandom, + const std::vector< TargetSelectFilterPtr >& filters, + const std::vector< uint32_t >& exclude = {} ); // returns actors sorted by distance const std::vector< CharaEntry >& getResults() const; diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index 198815e2..d09ab6cc 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -174,7 +174,7 @@ BNpc::BNpc( uint32_t id, std::shared_ptr< Common::BNPCInstanceObject > pInfo, co } // todo: is this actually good? - m_naviTargetReachedDistance = m_radius * 2; + m_naviTargetReachedDistance = m_radius; calculateStats(); @@ -274,7 +274,7 @@ BNpc::BNpc( uint32_t id, std::shared_ptr< Common::BNPCInstanceObject > pInfo, co auto modelChara = exdData.getRow< Excel::ModelChara >( bNpcBaseData->data().Model ); if( modelChara ) { - auto modelSkeleton = exdData.getRow< Excel::ModelSkeleton >( modelChara->data().ModelType ); + auto modelSkeleton = exdData.getRow< Excel::ModelSkeleton >( modelChara->data().SkeletonId ); if( modelSkeleton ) m_radius *= modelSkeleton->data().Radius; } diff --git a/src/world/Encounter/Selector.cpp b/src/world/Encounter/Selector.cpp index a20b6296..b436b937 100644 --- a/src/world/Encounter/Selector.cpp +++ b/src/world/Encounter/Selector.cpp @@ -34,7 +34,7 @@ namespace Sapphire::Encounter auto filtersJ = json.at( "filters" ).items(); for( const auto& filterJ : filtersJ ) { - auto filterV = filterJ.value(); + auto& filterV = filterJ.value(); auto name = filterV.at( "type" ).get< std::string >(); auto typeId = filterMap.find( name )->second; auto negate = filterV.at( "negate" ).get< bool >(); @@ -115,14 +115,13 @@ namespace Sapphire::Encounter default: break; } - filters.push_back( pFilter ); + m_filters.push_back( pFilter ); } - m_snapshot = World::AI::Snapshot( filters ); } void Selector::createSnapshot( Entity::CharaPtr pSrc, const std::vector< uint32_t >& exclude ) { - m_snapshot.createSnapshot( pSrc, pSrc->getInRangeActors(), m_count, m_fillWithRandom, exclude ); + m_snapshot.createSnapshot( pSrc, pSrc->getInRangeActors(), m_count, m_fillWithRandom, m_filters, exclude ); } const World::AI::Snapshot::Results& Selector::getResults() diff --git a/src/world/Encounter/Selector.h b/src/world/Encounter/Selector.h index bfebc737..d24ecf81 100644 --- a/src/world/Encounter/Selector.h +++ b/src/world/Encounter/Selector.h @@ -13,10 +13,11 @@ namespace Sapphire::Encounter std::string m_name; bool m_fillWithRandom{ true }; uint32_t m_count{ 0 }; + std::vector< World::AI::TargetSelectFilterPtr > m_filters; World::AI::Snapshot m_snapshot; public: - Selector() : m_snapshot( {} ){}; + Selector(){} void createSnapshot( Entity::CharaPtr pSrc, const std::vector< uint32_t >& exclude = {} ); const World::AI::Snapshot::Results& getResults(); const World::AI::Snapshot::TargetIds& getTargetIds(); diff --git a/src/world/Session.cpp b/src/world/Session.cpp index ecd91de6..f95967e5 100644 --- a/src/world/Session.cpp +++ b/src/world/Session.cpp @@ -160,7 +160,7 @@ void Sapphire::World::Session::startReplay( const std::string& path ) Logger::info( "Registering {0} for {1}, oldTime {2}", std::get< 1 >( set ), setTime - startTime, setTime ); } - PlayerMgr::sendDebug( *getPlayer(), "Registered {0} sets for replay" ), m_replayCache.size(); + PlayerMgr::sendDebug( *getPlayer(), "Registered {0} sets for replay" , m_replayCache.size() ); m_isReplaying = true; }