From 097a00b91331bda7e2896a36c735c4cd029e6630 Mon Sep 17 00:00:00 2001 From: Mordred Date: Thu, 20 Jan 2022 22:42:26 +0100 Subject: [PATCH] Task for dead bnpc removal --- src/world/Actor/BNpc.cpp | 5 ++++ src/world/Task/RemoveBNpcTask.cpp | 42 +++++++++++++++++++++++++++++++ src/world/Task/RemoveBNpcTask.h | 23 +++++++++++++++++ src/world/Territory/Territory.cpp | 15 ----------- 4 files changed, 70 insertions(+), 15 deletions(-) create mode 100644 src/world/Task/RemoveBNpcTask.cpp create mode 100644 src/world/Task/RemoveBNpcTask.h diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index b5210dfb..024fbfc7 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -41,6 +41,8 @@ #include #include #include +#include +#include #include using namespace Sapphire::Common; @@ -774,6 +776,9 @@ void Sapphire::Entity::BNpc::onDeath() m_timeOfDeath = Util::getTimeSeconds(); setOwner( nullptr ); + auto& taskMgr = Common::Service< World::Manager::TaskMgr >::ref(); + auto removeTask = std::make_shared< Sapphire::World::RemoveBNpcTask >( 10000, getAsBNpc() ); + taskMgr.queueTask( removeTask ); auto& exdData = Common::Service< Data::ExdData >::ref(); auto paramGrowthInfo = exdData.getRow< Component::Excel::ParamGrow >( m_level ); diff --git a/src/world/Task/RemoveBNpcTask.cpp b/src/world/Task/RemoveBNpcTask.cpp new file mode 100644 index 00000000..29c95eab --- /dev/null +++ b/src/world/Task/RemoveBNpcTask.cpp @@ -0,0 +1,42 @@ +#include "RemoveBNpcTask.h" + +#include +#include +#include +#include + +#include +#include + +using namespace Sapphire::World; + +RemoveBNpcTask::RemoveBNpcTask( uint64_t delayTime, Entity::BNpcPtr bnpc ) : + Task( delayTime ), + m_pBNpc( std::move( bnpc ) ) +{ +} + +void RemoveBNpcTask::onQueue() +{ + Logger::debug( { __FUNCTION__ } ); +} + +void RemoveBNpcTask::execute() +{ + Logger::info( toString() ); + + auto teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref(); + auto pZone = teriMgr.getTerritoryByGuId( m_pBNpc->getTerritoryId() ); + + if( !pZone ) + return; + + pZone->removeActor( m_pBNpc ); +} + +std::string RemoveBNpcTask::toString() +{ + return fmt::format( "RemoveBNpcTask: BNpc#{}, TerritoryId#{}, ElapsedTimeMs: {}", m_pBNpc->getId(), m_pBNpc->getTerritoryId(), getDelayTimeMs() ); +} + + diff --git a/src/world/Task/RemoveBNpcTask.h b/src/world/Task/RemoveBNpcTask.h new file mode 100644 index 00000000..77b33461 --- /dev/null +++ b/src/world/Task/RemoveBNpcTask.h @@ -0,0 +1,23 @@ +#pragma once + +#include +#include +#include +#include "Task.h" + +namespace Sapphire::World +{ + +class RemoveBNpcTask : public Task +{ +public: + RemoveBNpcTask( uint64_t delayTime, Entity::BNpcPtr bnpc ); + + void onQueue() override; + void execute() override; + std::string toString() override; +private: + Entity::BNpcPtr m_pBNpc; +}; + +} diff --git a/src/world/Territory/Territory.cpp b/src/world/Territory/Territory.cpp index 632d62fc..87c16c8a 100644 --- a/src/world/Territory/Territory.cpp +++ b/src/world/Territory/Territory.cpp @@ -417,21 +417,6 @@ void Sapphire::Territory::updateBNpcs( uint64_t tickCount ) m_lastMobUpdate = tickCount; uint64_t currTime = Common::Util::getTimeSeconds(); - for( const auto& entry : m_bNpcMap ) - { - Entity::BNpcPtr pBNpc = entry.second; - - if( !pBNpc ) - continue; - - if( !pBNpc->isAlive() ) - if( currTime - pBNpc->getTimeOfDeath() > 10 ) - { - removeActor( pBNpc ); - break; - } - } - // Update loop may move actors from cell to cell, breaking iterator validity std::vector< Entity::BNpcPtr > activeBNpc;