From ee6bf761245376b535b477788b11c3d4fa07c2e2 Mon Sep 17 00:00:00 2001 From: Mordred Date: Tue, 21 Feb 2023 22:27:11 +0100 Subject: [PATCH] Cleanup of event system. --- .../Event/EventDefinitions/EventDefinitions.h | 13 ++++++++++ src/world/Manager/FreeCompanyMgr.cpp | 26 +++++++------------ src/world/Manager/FreeCompanyMgr.h | 12 +++++---- src/world/Manager/PlayerMgr.cpp | 24 ++++++----------- src/world/Manager/PlayerMgr.h | 13 +++++----- src/world/Network/Handlers/PacketHandlers.cpp | 1 - src/world/Session.cpp | 3 --- src/world/WorldServer.cpp | 14 +++++++--- 8 files changed, 56 insertions(+), 50 deletions(-) diff --git a/src/world/Event/EventDefinitions/EventDefinitions.h b/src/world/Event/EventDefinitions/EventDefinitions.h index 614d5793..a242151f 100644 --- a/src/world/Event/EventDefinitions/EventDefinitions.h +++ b/src/world/Event/EventDefinitions/EventDefinitions.h @@ -15,6 +15,19 @@ namespace Sapphire::Common::EventSystem virtual ~LoginEvent() = default; + uint64_t characterId; + }; + + class LogoutEvent : public Event + { + public: + static constexpr DescriptorType descriptor = "LogoutEvent"; + virtual DescriptorType type() const { return descriptor; } + + LogoutEvent( uint64_t charId ) : characterId( charId ) {}; + virtual ~LogoutEvent() = default; + + uint64_t characterId; }; diff --git a/src/world/Manager/FreeCompanyMgr.cpp b/src/world/Manager/FreeCompanyMgr.cpp index df732426..d00b0cbe 100644 --- a/src/world/Manager/FreeCompanyMgr.cpp +++ b/src/world/Manager/FreeCompanyMgr.cpp @@ -29,16 +29,6 @@ using namespace Sapphire::Network::Packets; using namespace Sapphire::Network::Packets::WorldPackets::Server; using namespace Sapphire::World::Manager; -void FreeCompanyMgr::handleEvent( const Common::EventSystem::Event& e ) -{ - if( e.type() == Common::EventSystem::LoginEvent::descriptor ) - { - const Common::EventSystem::LoginEvent& loginEvent = static_cast< const Common::EventSystem::LoginEvent& >( e ); - onFcLogin( loginEvent.characterId ); - } - -} - bool FreeCompanyMgr::loadFreeCompanies() { auto& chatChannelMgr = Common::Service< Manager::ChatChannelMgr >::ref(); @@ -249,10 +239,13 @@ void FreeCompanyMgr::sendFcStatus( Entity::Player& player ) server.queueForPlayer( player.getCharacterId(), fcResultPacket ); } -void FreeCompanyMgr::onFcLogin( uint64_t characterId ) +void FreeCompanyMgr::onFcLogin( const Common::EventSystem::Event& e ) { + Logger::debug( "{}", __FUNCTION__ ); + const auto& loginEvent = static_cast< const Common::EventSystem::LoginEvent& >( e ); + auto& server = Common::Service< World::WorldServer >::ref(); - auto player = server.getPlayer( characterId ); + auto player = server.getPlayer( loginEvent.characterId ); if( !player ) return; @@ -273,13 +266,14 @@ void FreeCompanyMgr::onFcLogin( uint64_t characterId ) 0, FreeCompanyResultPacket::UpdateStatus::Member, fc->getName(), player->getName() ); - server.queueForFreeCompany( fc->getId(), fcResultOthers, { characterId } ); + server.queueForFreeCompany( fc->getId(), fcResultOthers, { loginEvent.characterId } ); } -void FreeCompanyMgr::onFcLogout( uint64_t characterId ) +void FreeCompanyMgr::onFcLogout( const Common::EventSystem::Event& e ) { + const auto& logoutEvent = static_cast< const Common::EventSystem::LogoutEvent& >( e ); auto& server = Common::Service< World::WorldServer >::ref(); - auto player = server.getPlayer( characterId ); + auto player = server.getPlayer( logoutEvent.characterId ); if( !player ) return; @@ -293,7 +287,7 @@ void FreeCompanyMgr::onFcLogout( uint64_t characterId ) 0, FreeCompanyResultPacket::UpdateStatus::Member, fc->getName(), player->getName() ); - server.queueForFreeCompany( fc->getId(), fcResultOthers, { characterId } ); + server.queueForFreeCompany( fc->getId(), fcResultOthers, { logoutEvent.characterId } ); } void FreeCompanyMgr::onSignPetition( Entity::Player& source, Entity::Player& target ) diff --git a/src/world/Manager/FreeCompanyMgr.h b/src/world/Manager/FreeCompanyMgr.h index 58410b8b..2b499978 100644 --- a/src/world/Manager/FreeCompanyMgr.h +++ b/src/world/Manager/FreeCompanyMgr.h @@ -6,11 +6,12 @@ #include "ForwardsZone.h" #include "FreeCompany/FreeCompany.h" #include +#include namespace Sapphire::World::Manager { - class FreeCompanyMgr : public Common::EventSystem::EventObserver + class FreeCompanyMgr { private: std::unordered_map< uint64_t, FreeCompanyPtr > m_fcIdMap; @@ -26,8 +27,6 @@ namespace Sapphire::World::Manager FreeCompanyMgr() = default; - void handleEvent( const Common::EventSystem::Event& e ); - // initialize all fcs from db to memory bool loadFreeCompanies(); void writeFreeCompany( uint64_t fcId ); @@ -69,8 +68,11 @@ namespace Sapphire::World::Manager // void leaveLinkshell( uint64_t lsId, uint64_t characterId ); // void joinLinkshell( uint64_t lsId, uint64_t characterId ); - void onFcLogin( uint64_t characterId ); - void onFcLogout( uint64_t characterId ); + /// Events + void onFcLogin( const Common::EventSystem::Event& e ); + void onFcLogout( const Common::EventSystem::Event& e ); + /// + void onSignPetition( Entity::Player& source, Entity::Player& target ); }; diff --git a/src/world/Manager/PlayerMgr.cpp b/src/world/Manager/PlayerMgr.cpp index c8b7e33a..4f9e8378 100644 --- a/src/world/Manager/PlayerMgr.cpp +++ b/src/world/Manager/PlayerMgr.cpp @@ -49,17 +49,6 @@ using namespace Sapphire::Network::Packets; using namespace Sapphire::Network::Packets::WorldPackets::Server; using namespace Sapphire::Network::ActorControl; -void PlayerMgr::handleEvent( const Common::EventSystem::Event& e ) -{ - if( e.type() == Common::EventSystem::LoginEvent::descriptor ) - { - const Common::EventSystem::LoginEvent& loginEvent = static_cast< const Common::EventSystem::LoginEvent& >( e ); - auto player = server().getPlayer( loginEvent.characterId ); - onLogin( *player ); - } - -} - void PlayerMgr::onOnlineStatusChanged( Entity::Player& player, bool updateProfile ) { auto statusPacket = makeZonePacket< FFXIVIpcSetOnlineStatus >( player.getId() ); @@ -349,8 +338,11 @@ void PlayerMgr::onClassChanged( Entity::Player& player ) onPlayerHpMpTpChanged( player ); } -void PlayerMgr::onLogin( Entity::Player& player ) +void PlayerMgr::onLogin( const Common::EventSystem::Event& e ) { + Logger::debug( "{}", __FUNCTION__ ); + const auto& loginEvent = dynamic_cast< const Common::EventSystem::LoginEvent& >( e ); + auto player = *server().getPlayer( loginEvent.characterId ); auto motd = server().getConfig().motd; std::istringstream ss( motd ); @@ -361,15 +353,15 @@ void PlayerMgr::onLogin( Entity::Player& player ) } } -void PlayerMgr::onLogout( Entity::Player &player ) +void PlayerMgr::onLogout( const Common::EventSystem::Event& e ) { + const auto& logoutEvent = dynamic_cast< const Common::EventSystem::LogoutEvent& >( e ); + auto player = *server().getPlayer( logoutEvent.characterId ); + auto& partyMgr = Common::Service< World::Manager::PartyMgr >::ref(); - auto& fcMgr = Common::Service< World::Manager::FreeCompanyMgr >::ref(); // send updates to mgrs if( player.getPartyId() != 0 ) partyMgr.onMemberDisconnect( player ); - - fcMgr.onFcLogout( player.getCharacterId() ); } void PlayerMgr::onDeath( Entity::Player& player ) diff --git a/src/world/Manager/PlayerMgr.h b/src/world/Manager/PlayerMgr.h index d97c9bc9..666b8340 100644 --- a/src/world/Manager/PlayerMgr.h +++ b/src/world/Manager/PlayerMgr.h @@ -3,17 +3,15 @@ #include "ForwardsZone.h" #include #include "MgrUtil.h" -#include +#include namespace Sapphire::World::Manager { - class PlayerMgr : public Common::EventSystem::EventObserver + class PlayerMgr { public: PlayerMgr() = default; - void handleEvent( const Common::EventSystem::Event& e ); - void onOnlineStatusChanged( Sapphire::Entity::Player& player, bool updateProfile = true ); void onEquipDisplayFlagsChanged( Sapphire::Entity::Player& player ); @@ -42,8 +40,11 @@ namespace Sapphire::World::Manager void onHateListChanged( Sapphire::Entity::Player& player ); - void onLogin( Sapphire::Entity::Player& player ); - void onLogout( Sapphire::Entity::Player& player ); + /// Events + void onLogin( const Common::EventSystem::Event& e ); + void onLogout( const Common::EventSystem::Event& e ); + /// + void onDeath( Sapphire::Entity::Player& player ); void onMoveZone( Sapphire::Entity::Player& player ); diff --git a/src/world/Network/Handlers/PacketHandlers.cpp b/src/world/Network/Handlers/PacketHandlers.cpp index b0765d4c..a41bdad9 100644 --- a/src/world/Network/Handlers/PacketHandlers.cpp +++ b/src/world/Network/Handlers/PacketHandlers.cpp @@ -353,7 +353,6 @@ void Sapphire::Network::GameConnection::loginHandler( const Packets::FFXIVARR_PA player.setIsLogin( true ); player.setConnected( true ); teriMgr.joinWorld( player ); - fcMgr.onFcLogin( player.getCharacterId() ); } void Sapphire::Network::GameConnection::syncHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) diff --git a/src/world/Session.cpp b/src/world/Session.cpp index f4d9c947..973563ee 100644 --- a/src/world/Session.cpp +++ b/src/world/Session.cpp @@ -77,9 +77,6 @@ void Sapphire::World::Session::close() // remove the session from the player if( m_pPlayer ) { - auto& playerMgr = Common::Service< World::Manager::PlayerMgr >::ref(); - playerMgr.onLogout( *m_pPlayer ); - m_pPlayer->unload(); } } diff --git a/src/world/WorldServer.cpp b/src/world/WorldServer.cpp index 9c148e3b..d0bc761c 100644 --- a/src/world/WorldServer.cpp +++ b/src/world/WorldServer.cpp @@ -312,8 +312,15 @@ void WorldServer::run( int32_t argc, char* argv[] ) Common::Service< ContentFinder >::set( contentFinder ); Common::Service< Manager::TaskMgr >::set( taskMgr ); - dispatcher->subscribe( Common::EventSystem::LoginEvent::descriptor, std::bind( &Manager::PlayerMgr::handleEvent, pPlayerMgr, std::placeholders::_1 ) ); - dispatcher->subscribe( Common::EventSystem::LoginEvent::descriptor, std::bind( &Manager::FreeCompanyMgr::handleEvent, pFcMgr, std::placeholders::_1 ) ); + using namespace Common; + using namespace Manager; + using namespace std::placeholders; + + dispatcher->subscribe( EventSystem::LoginEvent::descriptor, std::bind( &PlayerMgr::onLogin, pPlayerMgr, _1 ) ); + dispatcher->subscribe( EventSystem::LoginEvent::descriptor, std::bind( &FreeCompanyMgr::onFcLogin, pFcMgr, _1 ) ); + + dispatcher->subscribe( EventSystem::LogoutEvent::descriptor, std::bind( &PlayerMgr::onLogout, pPlayerMgr, _1 ) ); + dispatcher->subscribe( EventSystem::LogoutEvent::descriptor, std::bind( &FreeCompanyMgr::onFcLogout, pFcMgr, _1 ) ); Logger::info( "World server running on {0}:{1}", m_ip, m_port ); @@ -411,6 +418,8 @@ void WorldServer::updateSessions( uint32_t currTime ) player.removeOnlineStatus( Common::OnlineStatus::Online ); player.addOnlineStatus( Common::OnlineStatus::Offline ); + auto dispatcher = Common::Service< Common::EventSystem::EventDispatcher >::ref(); + dispatcher.emit( Common::EventSystem::LogoutEvent( player.getCharacterId() ) ); Logger::info( "[{0}] Session removal", session->getId() ); session->close(); sessionRemovalQueue.push( session->getId() ); @@ -545,7 +554,6 @@ Sapphire::Entity::PlayerPtr WorldServer::getPlayer( uint32_t entityId ) Sapphire::Entity::PlayerPtr WorldServer::getPlayer( uint64_t characterId ) { - //std::lock_guard lock( m_sessionMutex ); auto it = m_playerMapByCharacterId.find( characterId ); if( it != m_playerMapByCharacterId.end() )