From c5c8199bd2d8005ebe853f6596831d54ac4eccad Mon Sep 17 00:00:00 2001 From: Mordred Date: Wed, 12 Jan 2022 22:28:39 +0100 Subject: [PATCH] More cleanup and a session removal bug fixed --- deps/datReader/Exd/Structs.h | 6 +- src/world/Network/Handlers/PacketHandlers.cpp | 111 +++++++----------- src/world/WorldServer.cpp | 15 +-- 3 files changed, 52 insertions(+), 80 deletions(-) diff --git a/deps/datReader/Exd/Structs.h b/deps/datReader/Exd/Structs.h index cd50144c..a3396546 100644 --- a/deps/datReader/Exd/Structs.h +++ b/deps/datReader/Exd/Structs.h @@ -344,6 +344,7 @@ namespace Component::Excel int8_t SelectRange; int8_t SelectCorpse; int8_t AttackType; + uint8_t SelectMyPet : 1; uint8_t SelectGround : 1; uint8_t SelectENpc : 1; @@ -352,6 +353,7 @@ namespace Component::Excel uint8_t SelectAlliance : 1; uint8_t SelectParty : 1; uint8_t SelectMyself : 1; + uint8_t PvPOnly : 1; uint8_t InvalidMove : 1; uint8_t Silence : 1; @@ -360,6 +362,7 @@ namespace Component::Excel uint8_t CheckDir : 1; uint8_t Lay : 1; uint8_t SelectPartyPet : 1; + uint8_t IsTargetLine : 1; uint8_t HideCastBar : 1; uint8_t ForceVFX : 1; @@ -368,7 +371,8 @@ namespace Component::Excel uint8_t LogCast : 1; uint8_t IsMove : 1; uint8_t IsAvoid : 1; - int8_t padding0[1]; + + int8_t padding0; }; /* 75653 */ diff --git a/src/world/Network/Handlers/PacketHandlers.cpp b/src/world/Network/Handlers/PacketHandlers.cpp index e98255c4..4d208b0c 100644 --- a/src/world/Network/Handlers/PacketHandlers.cpp +++ b/src/world/Network/Handlers/PacketHandlers.cpp @@ -66,8 +66,7 @@ using namespace Sapphire::Network::Packets::WorldPackets; using namespace Sapphire::Network::ActorControl; using namespace Sapphire::World::Manager; -void Sapphire::Network::GameConnection::setProfileHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, - Entity::Player& player ) +void Sapphire::Network::GameConnection::setProfileHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { const auto packet = ZoneChannelPacket< Client::FFXIVIpcSetSearchInfo >( inPacket ); @@ -100,8 +99,7 @@ void Sapphire::Network::GameConnection::setProfileHandler( const Packets::FFXIVA static_cast< uint8_t >( player.getOnlineStatus() ) ), true ); } -void Sapphire::Network::GameConnection::getProfileHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, - Entity::Player& player ) +void Sapphire::Network::GameConnection::getProfileHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { auto searchInfoPacket = makeZonePacket< FFXIVIpcGetProfileResult >( player.getId() ); searchInfoPacket->data().OnlineStatus = player.getOnlineStatusMask() | player.getOnlineStatusCustomMask(); @@ -110,62 +108,51 @@ void Sapphire::Network::GameConnection::getProfileHandler( const Packets::FFXIVA queueOutPacket( searchInfoPacket ); } -void Sapphire::Network::GameConnection::getSearchCommentHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, - Entity::Player& player ) +void Sapphire::Network::GameConnection::getSearchCommentHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { auto targetId = *reinterpret_cast< const uint32_t* >( &inPacket.data[ 0x10 ] ); auto& server = Common::Service< World::WorldServer >::ref(); - auto pSession = server.getSession( targetId ); + auto pPlayer = server.getPlayer( targetId ); Logger::debug( "getSearchCommentHandler: {0}", targetId ); - if( pSession ) + if( pPlayer ) { - auto pPlayer = pSession->getPlayer(); + if( pPlayer->isActingAsGm() || pPlayer->getTerritoryTypeId() != player.getTerritoryTypeId() ) + return; - if( pPlayer ) - { - if( pPlayer->isActingAsGm() || pPlayer->getTerritoryTypeId() != player.getTerritoryTypeId() ) - return; - - // retail sends the requester's id as both (isForSelf) - auto searchInfoPacket = makeZonePacket< FFXIVIpcExamineSearchComment >( player.getId() ); - searchInfoPacket->data().charId = targetId; - strcpy( searchInfoPacket->data().searchComment, pPlayer->getSearchMessage() ); - server.queueForPlayer( player.getCharacterId(), searchInfoPacket ); - } + // retail sends the requester's id as both (isForSelf) + auto searchInfoPacket = makeZonePacket< FFXIVIpcExamineSearchComment >( player.getId() ); + searchInfoPacket->data().charId = targetId; + strcpy( searchInfoPacket->data().searchComment, pPlayer->getSearchMessage() ); + server.queueForPlayer( player.getCharacterId(), searchInfoPacket ); } } -void Sapphire::Network::GameConnection::reqExamineFcInfo( const Packets::FFXIVARR_PACKET_RAW& inPacket, - Entity::Player& player ) +void Sapphire::Network::GameConnection::reqExamineFcInfo( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { auto targetId = *reinterpret_cast< const uint32_t* >( &inPacket.data[ 0x18 ] ); auto& server = Common::Service< World::WorldServer >::ref(); - auto pSession = server.getSession( targetId ); + auto pPlayer = server.getPlayer( targetId ); Logger::debug( "reqExamineFcInfo: {0}", targetId ); - if( pSession ) + if( pPlayer ) { - auto pPlayer = pSession->getPlayer(); + if( pPlayer->isActingAsGm() || pPlayer->getTerritoryTypeId() != player.getTerritoryTypeId() ) + return; - if( pPlayer ) - { - if( pPlayer->isActingAsGm() || pPlayer->getTerritoryTypeId() != player.getTerritoryTypeId() ) - return; + // retail sends the requester's id as both (isForSelf) + auto examineFcInfoPacket = makeZonePacket< FFXIVIpcExamineFreeCompanyInfo >( player.getId() ); + examineFcInfoPacket->data().charId = targetId; + // todo: populate with fc info - // retail sends the requester's id as both (isForSelf) - auto examineFcInfoPacket = makeZonePacket< FFXIVIpcExamineFreeCompanyInfo >( player.getId() ); - examineFcInfoPacket->data().charId = targetId; - // todo: populate with fc info - - server.queueForPlayer( player.getCharacterId(), examineFcInfoPacket ); - } + server.queueForPlayer( player.getCharacterId(), examineFcInfoPacket ); } + } void Sapphire::Network::GameConnection::joinChatChannelHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) @@ -209,8 +196,7 @@ void Sapphire::Network::GameConnection::joinChatChannelHandler( const Packets::F } -void Sapphire::Network::GameConnection::moveHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, - Entity::Player& player ) +void Sapphire::Network::GameConnection::moveHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { // if the player is marked for zoning we no longer want to update his pos if( player.isMarkedForZoning() ) @@ -229,7 +215,7 @@ void Sapphire::Network::GameConnection::moveHandler( const Packets::FFXIVARR_PAC player.setRot( data.dir ); player.setPos( { data.pos.x, data.pos.y, data.pos.z } ); - if( ( player.getCurrentAction() != nullptr ) && bPosChanged ) + if( player.getCurrentAction() && bPosChanged ) player.getCurrentAction()->setInterrupted( Common::ActionInterruptType::RegularInterrupt ); auto clientAnimationType = data.flag; @@ -300,8 +286,7 @@ void Sapphire::Network::GameConnection::moveHandler( const Packets::FFXIVARR_PAC player.sendToInRangeSet( movePacket ); } -void -Sapphire::Network::GameConnection::configHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) +void Sapphire::Network::GameConnection::configHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { const auto packet = ZoneChannelPacket< Client::FFXIVIpcConfig >( inPacket ); @@ -326,7 +311,7 @@ void Sapphire::Network::GameConnection::zoneJumpHandler( const Packets::FFXIVARR Common::FFXIVARR_POSITION3 targetPos{}; Common::FFXIVARR_POSITION3 targetRot{}; - uint32_t targetZone; + uint32_t targetZone{128}; float rotation = 0.0f; if( pExitRange ) @@ -378,8 +363,7 @@ void Sapphire::Network::GameConnection::zoneJumpHandler( const Packets::FFXIVARR } -void Sapphire::Network::GameConnection::newDiscoveryHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, - Entity::Player& player ) +void Sapphire::Network::GameConnection::newDiscoveryHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { auto& server = Common::Service< World::WorldServer >::ref(); auto& teriMgr = Common::Service< TerritoryMgr >::ref(); @@ -413,8 +397,7 @@ void Sapphire::Network::GameConnection::loginHandler( const Packets::FFXIVARR_PA teriMgr.joinWorld( player ); } -void Sapphire::Network::GameConnection::syncHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, - Entity::Player& player ) +void Sapphire::Network::GameConnection::syncHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { auto& server = Common::Service< World::WorldServer >::ref(); const auto packet = ZoneChannelPacket< Client::FFXIVIpcPingHandler >( inPacket ); @@ -429,8 +412,7 @@ void Sapphire::Network::GameConnection::syncHandler( const Packets::FFXIVARR_PAC pSession->setLastPing( Common::Util::getTimeSeconds() ); } -void Sapphire::Network::GameConnection::setLanguageHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, - Entity::Player& player ) +void Sapphire::Network::GameConnection::setLanguageHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { if( player.isLogin() ) { @@ -470,8 +452,7 @@ void Sapphire::Network::GameConnection::setLanguageHandler( const Packets::FFXIV pCurrentZone->updateActorPosition( player ); } -void Sapphire::Network::GameConnection::pcSearchHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, - Entity::Player& player ) +void Sapphire::Network::GameConnection::pcSearchHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { const auto packet = ZoneChannelPacket< Client::FFXIVIpcPcSearch >( inPacket ); auto& data = packet.data(); @@ -492,7 +473,7 @@ void Sapphire::Network::GameConnection::pcSearchHandler( const Packets::FFXIVARR // store result in player - we don't map out query keys to data yet std::vector< uint32_t > entityIdVec; - for( const auto pSession : queryPlayers ) + for( const auto& pSession : queryPlayers ) { if( !pSession ) continue; @@ -571,8 +552,7 @@ void Sapphire::Network::GameConnection::chatHandler( const Packets::FFXIVARR_PAC // currently we wait for the session to just time out after logout, this can be a problem is the user tries to // log right back in. // Also the packet needs to be converted to an ipc structure -void Sapphire::Network::GameConnection::logoutHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, - Entity::Player& player ) +void Sapphire::Network::GameConnection::logoutHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { auto logoutPacket = makeZonePacket< FFXIVIpcEnableLogout >( player.getId() ); logoutPacket->data().content = 0x02; @@ -583,8 +563,7 @@ void Sapphire::Network::GameConnection::logoutHandler( const Packets::FFXIVARR_P } -void Sapphire::Network::GameConnection::tellHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, - Entity::Player& player ) +void Sapphire::Network::GameConnection::tellHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { const auto packet = ZoneChannelPacket< Client::FFXIVIpcChatTo >( inPacket ); auto& data = packet.data(); @@ -647,8 +626,7 @@ void Sapphire::Network::GameConnection::tellHandler( const Packets::FFXIVARR_PAC pSession->getChatConnection()->queueOutPacket( tellPacket ); } -void Sapphire::Network::GameConnection::chatToChannelHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, - Entity::Player& player ) +void Sapphire::Network::GameConnection::chatToChannelHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { const auto packet = ChatChannelPacket< Client::FFXIVIpcChatToChannel >( inPacket ); auto& data = packet.data(); @@ -660,8 +638,7 @@ void Sapphire::Network::GameConnection::chatToChannelHandler( const Packets::FFX chatChannelMgr.sendMessageToChannel( data.channelID, player, message ); } -void Sapphire::Network::GameConnection::catalogSearch( const Packets::FFXIVARR_PACKET_RAW& inPacket, - Entity::Player& player ) +void Sapphire::Network::GameConnection::catalogSearch( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { auto& marketMgr = Common::Service< MarketMgr >::ref(); @@ -679,8 +656,7 @@ void Sapphire::Network::GameConnection::catalogSearch( const Packets::FFXIVARR_P ); } -void Sapphire::Network::GameConnection::marketBoardRequestItemInfo( const Packets::FFXIVARR_PACKET_RAW& inPacket, - Entity::Player& player ) +void Sapphire::Network::GameConnection::marketBoardRequestItemInfo( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { const auto packet = ZoneChannelPacket< Client::FFXIVIpcMarketBoardRequestItemListingInfo >( inPacket ); @@ -689,8 +665,7 @@ void Sapphire::Network::GameConnection::marketBoardRequestItemInfo( const Packet marketMgr.requestItemListingInfo( player, packet.data().catalogId, packet.data().requestId ); } -void Sapphire::Network::GameConnection::marketBoardRequestItemListings( const Packets::FFXIVARR_PACKET_RAW& inPacket, - Entity::Player& player ) +void Sapphire::Network::GameConnection::marketBoardRequestItemListings( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { const auto packet = ZoneChannelPacket< Client::FFXIVIpcMarketBoardRequestItemListings >( inPacket ); @@ -699,14 +674,12 @@ void Sapphire::Network::GameConnection::marketBoardRequestItemListings( const Pa marketMgr.requestItemListings( player, packet.data().itemCatalogId ); } -void Sapphire::Network::GameConnection::getFcStatus( const Packets::FFXIVARR_PACKET_RAW& inPacket, - Entity::Player& player ) +void Sapphire::Network::GameConnection::getFcStatus( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { } -void Sapphire::Network::GameConnection::getFcProfile( const Sapphire::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, - Entity::Player& player ) +void Sapphire::Network::GameConnection::getFcProfile( const Sapphire::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { const auto packet = ZoneChannelPacket< Client::FFXIVIpcGetFcProfile >( inPacket ); @@ -742,9 +715,7 @@ void Sapphire::Network::GameConnection::getFcProfile( const Sapphire::Network::P } -void Sapphire::Network::GameConnection::getRequestItemListHandler( - const Sapphire::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, - Entity::Player& player ) +void Sapphire::Network::GameConnection::getRequestItemListHandler( const Sapphire::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { } diff --git a/src/world/WorldServer.cpp b/src/world/WorldServer.cpp index cef95e30..fa84b466 100644 --- a/src/world/WorldServer.cpp +++ b/src/world/WorldServer.cpp @@ -148,9 +148,6 @@ void Sapphire::World::WorldServer::run( int32_t argc, char* argv[] ) } Common::Service< Data::ExdData >::set( pExdData ); -// auto aetherInfo = pExdData->getRow< Component::Excel::ClassJob >( 2 ); -// auto aetherInfo1 = pExdData->getRow< Component::Excel::ClassJob >( 3 ); - auto pDb = std::make_shared< Db::DbWorkerPool< Db::ZoneDbConnection > >(); Sapphire::Db::DbLoader loader; loader.addDb( *pDb, m_config.global.database ); @@ -341,7 +338,7 @@ void Sapphire::World::WorldServer::updateSessions( uint32_t currTime ) auto diff = difftime( currTime, session->getLastDataTime() ); auto& player = *session->getPlayer(); - // remove session of players marked for removel ( logoff / kick ) + // remove session of players marked for removal ( logoff / kick ) if( ( player.isMarkedForRemoval() && diff > 5 ) || diff > 20 ) { Logger::info( "[{0}] Session removal", session->getId() ); @@ -354,12 +351,8 @@ void Sapphire::World::WorldServer::updateSessions( uint32_t currTime ) { auto removalId = sessionRemovalQueue.front(); sessionRemovalQueue.pop(); - auto session = getSession( removalId ); - if( session ) - { - m_sessionMapById.erase( removalId ); + if( auto session = getSession( removalId ) ) removeSession( *session->getPlayer() ); - } } } @@ -441,6 +434,10 @@ Sapphire::World::SessionPtr Sapphire::World::WorldServer::getSession( const std: void Sapphire::World::WorldServer::removeSession( const Entity::Player& player ) { + auto session = getSession( player.getCharacterId() ); + if( session ) + m_sessionMapById.erase( session->getId() ); + m_sessionMapByName.erase( player.getName() ); m_sessionMapByCharacterId.erase( player.getCharacterId() ); }