1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-07 03:07:45 +00:00

Flags added to control BNpc behaviour in fights

This commit is contained in:
mordred 2019-04-17 12:37:24 +02:00
parent f0390f394c
commit 813e74555b
3 changed files with 37 additions and 4 deletions

View file

@ -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 );

View file

@ -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;
}

View file

@ -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;