diff --git a/src/scripts/instances/questbattles/ChasingShadows.cpp b/src/scripts/instances/questbattles/ChasingShadows.cpp index bdead85d..f2e08715 100644 --- a/src/scripts/instances/questbattles/ChasingShadows.cpp +++ b/src/scripts/instances/questbattles/ChasingShadows.cpp @@ -63,6 +63,8 @@ public: instance.getDirectorId(), Common::BNpcType::Enemy ); auto a3 = instance.createBNpcFromLevelEntry( INIT_POP_ENEMY_B_04, 10, 0, 1440, 938, instance.getDirectorId(), Common::BNpcType::Enemy ); + a2->setFlag( Entity::NoDeaggro ); + a3->setFlag( Entity::NoDeaggro ); auto pPlayer = instance.getPlayerPtr(); a2->hateListAdd( pPlayer, 1 ); @@ -102,6 +104,11 @@ public: instance.getDirectorId(), Common::BNpcType::Friendly ); auto a5 = instance.createBNpcFromLevelEntry( INIT_P_POP_PAPARIMO, 50, 0, 27780, 1376, instance.getDirectorId(), Common::BNpcType::Friendly ); + a1->setFlag( Entity::NoDeaggro ); + a2->setFlag( Entity::NoDeaggro ); + a3->setFlag( Entity::NoDeaggro ); + a4->setFlag( Entity::NoDeaggro ); + a5->setFlag( Entity::NoDeaggro ); a1->hateListAdd( a4, 10000 ); a1->hateListAdd( a5, 10000 ); diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index fbb8003b..b970927d 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -483,7 +483,7 @@ void Sapphire::Entity::BNpc::update( uint64_t tickCount ) if( pHatedActor ) aggro( pHatedActor ); - if( Util::getTimeSeconds() - m_lastRoamTargetReached > roamTick ) + if( !hasFlag( Immobile ) && ( Util::getTimeSeconds() - m_lastRoamTargetReached > roamTick ) ) { auto pNaviMgr = m_pFw->get< World::Manager::NaviMgr >(); auto pNaviProvider = pNaviMgr->getNaviProvider( m_pCurrentZone->getBgPath() ); @@ -525,7 +525,7 @@ void Sapphire::Entity::BNpc::update( uint64_t tickCount ) pHatedActor->getPos().y, pHatedActor->getPos().z ); - if( distanceOrig > maxDistanceToOrigin ) + if( !hasFlag( NoDeaggro ) && ( distanceOrig > maxDistanceToOrigin ) ) { hateListClear(); changeTarget( INVALID_GAME_OBJECT_ID64 ); @@ -535,7 +535,7 @@ void Sapphire::Entity::BNpc::update( uint64_t tickCount ) break; } - if( distance > minActorDistance ) + if( !hasFlag( Immobile ) && ( distance > minActorDistance ) ) { //auto pTeriMgr = m_pFw->get< World::Manager::TerritoryMgr >(); //if ( ( currTime - m_lastAttack ) > 600 && pTeriMgr->isDefaultTerritory( getCurrentZone()->getTerritoryTypeId() ) ) @@ -543,7 +543,7 @@ void Sapphire::Entity::BNpc::update( uint64_t tickCount ) } else { - if( face( pHatedActor->getPos() ) ) + if( !hasFlag( TurningDisabled ) && face( pHatedActor->getPos() ) ) sendPositionUpdate(); // in combat range. ATTACK! autoAttack( pHatedActor ); @@ -711,3 +711,13 @@ uint32_t Sapphire::Entity::BNpc::getLevelId() const { return m_levelId; } + +bool Sapphire::Entity::BNpc::hasFlag( uint32_t flag ) const +{ + return m_flags & flag; +} + +void Sapphire::Entity::BNpc::setFlag( uint32_t flag ) +{ + m_flags |= flag; +} diff --git a/src/world/Actor/BNpc.h b/src/world/Actor/BNpc.h index f756a2cc..d688dfdc 100644 --- a/src/world/Actor/BNpc.h +++ b/src/world/Actor/BNpc.h @@ -29,6 +29,17 @@ namespace Sapphire::Entity Dead, }; + enum BNpcFlag + { + None = 0, + Immobile = 1, + TurningDisabled = 2, + Invincible = 4, + InvincibleRefill = 8, + NoDeaggro = 16, + Untargetable = 32, + }; + /*! \class BNpc \brief Base class for all BNpcs @@ -105,6 +116,9 @@ namespace Sapphire::Entity void setLevelId( uint32_t levelId ); uint32_t getLevelId() const; + bool hasFlag( uint32_t flag ) const; + void setFlag( uint32_t flags ); + private: uint32_t m_bNpcBaseId; uint32_t m_bNpcNameId; @@ -119,6 +133,8 @@ namespace Sapphire::Entity uint8_t m_level; uint32_t m_levelId; + uint32_t m_flags; + float m_scale; float m_naviTargetReachedDistance;