From 9b2ebd5d3ee35ab2213d96182137e72aeaaa7de7 Mon Sep 17 00:00:00 2001 From: Kooper Date: Sat, 19 Jul 2025 18:47:02 +0200 Subject: [PATCH] Fixed deaggro function to now remove entities from aggro list (without crashing the server) --- src/world/AI/Fsm/StateCombat.cpp | 5 +++++ src/world/Actor/BNpc.cpp | 32 +++++++++++++++++++------------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/world/AI/Fsm/StateCombat.cpp b/src/world/AI/Fsm/StateCombat.cpp index 5bcefd58..4fd020a0 100644 --- a/src/world/AI/Fsm/StateCombat.cpp +++ b/src/world/AI/Fsm/StateCombat.cpp @@ -48,6 +48,11 @@ void AI::Fsm::StateCombat::onUpdate( Entity::BNpc& bnpc, uint64_t tickCount ) bnpc.moveTo( *pHatedActor ); } + if (bnpc.hasFlag(Entity::Immobile) && distance > 30.0f ) + { + bnpc.deaggro( pHatedActor ); + } + if( pNaviProvider->syncPosToChara( bnpc ) ) bnpc.sendPositionUpdate(); diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index ca796d7f..481c52b5 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -447,7 +447,10 @@ void BNpc::hateListClear() for( auto& listEntry : m_hateList ) { if( isInRangeSet( listEntry->m_pChara ) ) - deaggro( listEntry->m_pChara ); + { + if( listEntry->m_pChara->isPlayer() ) + notifyPlayerDeaggro( listEntry->m_pChara ) + } } m_hateList.clear(); } @@ -623,22 +626,25 @@ void BNpc::aggro( const Sapphire::Entity::CharaPtr& pChara ) void BNpc::deaggro( const CharaPtr& pChara ) { - if( !hateListHasActor( pChara ) ) + if( hateListHasActor( pChara ) ) hateListRemove( pChara ); if( pChara->isPlayer() ) - { - PlayerPtr tmpPlayer = pChara->getAsPlayer(); - Network::Util::Packet::sendActorControl( getInRangePlayerIds(), getId(), ToggleWeapon, 0, 1, 1 ); - Network::Util::Packet::sendActorControl( getInRangePlayerIds(), getId(), SetBattle ); - tmpPlayer->onMobDeaggro( *this ); + notifyPlayerDeaggro(pChara) +} - if( getTriggerOwnerId() == pChara->getId() ) - { - auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); - auto bnpc = *getAsBNpc(); - scriptMgr.onTriggerOwnerDeaggro( *tmpPlayer, bnpc ); - } +void BNpc::notifyPlayerDeaggro(const CharaPtr& pChara) +{ + PlayerPtr tmpPlayer = pChara->getAsPlayer(); + Network::Util::Packet::sendActorControl( getInRangePlayerIds(), getId(), ToggleWeapon, 0, 1, 1 ); + Network::Util::Packet::sendActorControl( getInRangePlayerIds(), getId(), SetBattle ); + tmpPlayer->onMobDeaggro( *this ); + + if( getTriggerOwnerId() == pChara->getId() ) + { + auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); + auto bnpc = *getAsBNpc(); + scriptMgr.onTriggerOwnerDeaggro( *tmpPlayer, bnpc ); } }