diff --git a/src/world/AI/Fsm/StateCombat.cpp b/src/world/AI/Fsm/StateCombat.cpp index 5bcefd58..211f645c 100644 --- a/src/world/AI/Fsm/StateCombat.cpp +++ b/src/world/AI/Fsm/StateCombat.cpp @@ -35,9 +35,13 @@ void AI::Fsm::StateCombat::onUpdate( Entity::BNpc& bnpc, uint64_t tickCount ) auto distance = Common::Util::distance( bnpc.getPos(), pHatedActor->getPos() ); + // All possibilities to automatically lose aggro go here if( !bnpc.hasFlag( Entity::NoDeaggro ) ) { - + if( bnpc.hasFlag( Entity::Immobile ) && distance > 40.0f ) + { + bnpc.deaggro( pHatedActor ); + } } if( !bnpc.hasFlag( Entity::Immobile ) && distance > ( bnpc.getNaviTargetReachedDistance() + pHatedActor->getRadius() ) ) diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index ca796d7f..8e2bd54d 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 ); } } diff --git a/src/world/Actor/BNpc.h b/src/world/Actor/BNpc.h index 7076ae6e..f07062fc 100644 --- a/src/world/Actor/BNpc.h +++ b/src/world/Actor/BNpc.h @@ -115,6 +115,7 @@ namespace Sapphire::Entity void aggro( const CharaPtr& pChara ); void deaggro( const CharaPtr& pChara ); + void notifyPlayerDeaggro( const CharaPtr& pChara ); void update( uint64_t tickCount ) override; void onTick() override;