From b3f3c317b5a1d574e5b0b7714ffdf37eee4e7327 Mon Sep 17 00:00:00 2001 From: Mordred Date: Tue, 14 Nov 2017 23:55:38 +0100 Subject: [PATCH] Logout will now remove a playersession almost instantly --- .../Network/PacketDef/Zone/ServerZoneDef.h | 6 +++--- src/servers/Server_Zone/Actor/Player.cpp | 15 +++++++++++++-- src/servers/Server_Zone/Actor/Player.h | 5 +++++ src/servers/Server_Zone/Actor/PlayerSql.cpp | 2 ++ .../Network/Handlers/PacketHandlers.cpp | 2 ++ src/servers/Server_Zone/ServerZone.cpp | 12 ++++++++++++ 6 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h b/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h index d5cb7675..a73346d2 100644 --- a/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h @@ -731,16 +731,16 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket uint8_t preNamePadding; char name[32]; uint8_t unknown_54[16]; - uint8_t unknown55; + uint8_t unknown55[4]; uint16_t levels[25]; uint32_t exp[25]; uint8_t unlockBitmask[64]; uint8_t aetheryte[16]; uint8_t discovery[420]; uint8_t howto[33]; - uint8_t minions[33]; + uint8_t minions[35]; uint8_t chocoboTaxiMask[8]; - uint8_t contentClearMask[104]; + uint8_t contentClearMask[105]; uint8_t companionBardingMask[8]; uint8_t companionEquippedHead; uint8_t companionEquippedBody; diff --git a/src/servers/Server_Zone/Actor/Player.cpp b/src/servers/Server_Zone/Actor/Player.cpp index 2c5528af..ba865229 100644 --- a/src/servers/Server_Zone/Actor/Player.cpp +++ b/src/servers/Server_Zone/Actor/Player.cpp @@ -70,7 +70,8 @@ Core::Entity::Player::Player() : m_bLoadingComplete( false ), m_bMarkedForZoning( false ), m_zoningType( Common::ZoneingType::None ), - m_bAutoattack( false ) + m_bAutoattack( false ), + m_markedForRemoval( false ) { m_id = 0; m_type = ActorType::Player; @@ -90,7 +91,7 @@ Core::Entity::Player::Player() : Core::Entity::Player::~Player() { - + g_log.debug( "PlayerObj destroyed" ); } // TODO: add a proper calculation based on race / job / level / gear @@ -134,6 +135,16 @@ uint8_t Core::Entity::Player::getStartTown() const return m_startTown; } +void Core::Entity::Player::setMarkedForRemoval() +{ + m_markedForRemoval = true; +} + +bool Core::Entity::Player::isMarkedForRemoval() const +{ + return m_markedForRemoval; +} + Core::Common::OnlineStatus Core::Entity::Player::getOnlineStatus() { uint64_t newMask = uint64_t( 1 ) << static_cast< uint32_t >( OnlineStatus::NewAdventurer ); diff --git a/src/servers/Server_Zone/Actor/Player.h b/src/servers/Server_Zone/Actor/Player.h index ff5563f7..bc38df16 100644 --- a/src/servers/Server_Zone/Actor/Player.h +++ b/src/servers/Server_Zone/Actor/Player.h @@ -530,6 +530,9 @@ public: void updateDbSearchInfo() const; void updateDbClass() const; + void setMarkedForRemoval(); + bool isMarkedForRemoval() const; + private: uint32_t m_lastWrite; uint32_t m_lastPing; @@ -540,6 +543,8 @@ private: uint8_t m_mode; + bool m_markedForRemoval; + private: uint8_t m_voice; diff --git a/src/servers/Server_Zone/Actor/PlayerSql.cpp b/src/servers/Server_Zone/Actor/PlayerSql.cpp index 35b509d2..5a185fe0 100644 --- a/src/servers/Server_Zone/Actor/PlayerSql.cpp +++ b/src/servers/Server_Zone/Actor/PlayerSql.cpp @@ -414,6 +414,8 @@ void Core::Entity::Player::updateSql() ////// Class updateDbClass(); + memset( m_orchestrion, 0, sizeof( m_orchestrion ) ); + } void Core::Entity::Player::updateDbClass() const diff --git a/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp b/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp index 1942df5b..afb6ea5e 100644 --- a/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp @@ -540,6 +540,8 @@ void Core::Network::GameConnection::logoutHandler( const Packets::GamePacket& in logoutPacket.data().flags1 = 0x02; logoutPacket.data().flags2 = 0x2000; queueOutPacket( logoutPacket ); + + pPlayer->setMarkedForRemoval(); } diff --git a/src/servers/Server_Zone/ServerZone.cpp b/src/servers/Server_Zone/ServerZone.cpp index 95d54629..883fa3a6 100644 --- a/src/servers/Server_Zone/ServerZone.cpp +++ b/src/servers/Server_Zone/ServerZone.cpp @@ -263,10 +263,12 @@ void Core::ServerZone::mainLoop() auto session = sessionIt.second; if( session && session->getPlayer() ) { + // if the player is in a zone, let the zone handler take care of his updates // else do it here. if( !session->getPlayer()->getCurrentZone() ) session->update(); + } } @@ -278,6 +280,16 @@ void Core::ServerZone::mainLoop() auto pPlayer = it->second->getPlayer(); + if( pPlayer->isMarkedForRemoval() && diff > 1 ) + { + it->second->close(); + // if( it->second.unique() ) + { + it = this->m_sessionMap.erase( it ); + continue; + } + } + if( diff > 20 ) { g_log.info("[" + std::to_string(it->second->getId() ) + "] Session time out" );