diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index 46d951ff..53a88d50 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -63,7 +63,7 @@ namespace Sapphire::Network::ActorControl SpawnEffect = 0x25, ToggleInvisible = 0x26, - + DeadFadeOut = 0x27, SetSystemActionUnlocked = 0x29, UpdateUiExp = 0x2B, diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index 024fbfc7..e26fac31 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include using namespace Sapphire::Common; @@ -777,7 +778,9 @@ void Sapphire::Entity::BNpc::onDeath() setOwner( nullptr ); auto& taskMgr = Common::Service< World::Manager::TaskMgr >::ref(); - auto removeTask = std::make_shared< Sapphire::World::RemoveBNpcTask >( 10000, getAsBNpc() ); + auto fadeTask = std::make_shared< Sapphire::World::FadeBNpcTask >( 10000, getAsBNpc() ); + auto removeTask = std::make_shared< Sapphire::World::RemoveBNpcTask >( 12000, getAsBNpc() ); + taskMgr.queueTask( fadeTask ); taskMgr.queueTask( removeTask ); auto& exdData = Common::Service< Data::ExdData >::ref(); diff --git a/src/world/Task/FadeBNpcTask.cpp b/src/world/Task/FadeBNpcTask.cpp new file mode 100644 index 00000000..98149317 --- /dev/null +++ b/src/world/Task/FadeBNpcTask.cpp @@ -0,0 +1,47 @@ +#include "FadeBNpcTask.h" + +#include +#include +#include +#include + +#include +#include + +#include +#include + +using namespace Sapphire::World; +using namespace Sapphire::Network::ActorControl; +using namespace Sapphire::Network::Packets::WorldPackets::Server; + +FadeBNpcTask::FadeBNpcTask( uint64_t delayTime, Entity::BNpcPtr bnpc ) : + Task( delayTime ), + m_pBNpc( std::move( bnpc ) ) +{ +} + +void FadeBNpcTask::onQueue() +{ + Logger::debug( { __FUNCTION__ } ); +} + +void FadeBNpcTask::execute() +{ + + auto teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref(); + auto pZone = teriMgr.getTerritoryByGuId( m_pBNpc->getTerritoryId() ); + + if( !pZone ) + return; + + m_pBNpc->sendToInRangeSet( makeActorControl( m_pBNpc->getId(), ActorControlType::DeadFadeOut, 0, 0, 0 ) ); + +} + +std::string FadeBNpcTask::toString() +{ + return fmt::format( "FadeBNpcTask: BNpc#{}, TerritoryId#{}, ElapsedTimeMs: {}", m_pBNpc->getId(), m_pBNpc->getTerritoryId(), getDelayTimeMs() ); +} + + diff --git a/src/world/Task/FadeBNpcTask.h b/src/world/Task/FadeBNpcTask.h new file mode 100644 index 00000000..9d3daf1a --- /dev/null +++ b/src/world/Task/FadeBNpcTask.h @@ -0,0 +1,23 @@ +#pragma once + +#include +#include +#include +#include "Task.h" + +namespace Sapphire::World +{ + +class FadeBNpcTask : public Task +{ +public: + FadeBNpcTask( uint64_t delayTime, Entity::BNpcPtr bnpc ); + + void onQueue() override; + void execute() override; + std::string toString() override; +private: + Entity::BNpcPtr m_pBNpc; +}; + +}