1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-27 14:57:44 +00:00
sapphire/src/world/Session.cpp

237 lines
5.4 KiB
C++
Raw Normal View History

#include <filesystem>
2017-08-08 13:53:47 +02:00
#include <time.h>
2018-03-06 22:22:19 +01:00
#include <Util/Util.h>
#include <Network/PacketContainer.h>
#include <Logging/Logger.h>
#include "Network/GameConnection.h"
#include "Actor/Player.h"
#include "Service.h"
#include "Manager/PartyMgr.h"
2017-08-08 13:53:47 +02:00
#include "Session.h"
namespace fs = std::filesystem;
2017-08-08 13:53:47 +02:00
2020-03-01 01:00:57 +11:00
Sapphire::World::Session::Session( uint32_t sessionId ) :
m_sessionId( sessionId ),
m_lastDataTime( Common::Util::getTimeSeconds() ),
m_lastSqlTime( Common::Util::getTimeSeconds() ),
2018-12-25 01:57:50 +01:00
m_isValid( false ),
m_isReplaying( false )
2017-08-08 13:53:47 +02:00
{
}
void Sapphire::World::Session::setZoneConnection( Network::GameConnectionPtr pZoneCon )
2017-08-08 13:53:47 +02:00
{
pZoneCon->m_conType = Network::ConnectionType::Zone;
m_pZoneConnection = pZoneCon;
2017-08-08 13:53:47 +02:00
}
void Sapphire::World::Session::setChatConnection( Network::GameConnectionPtr pChatCon )
{
pChatCon->m_conType = Network::ConnectionType::Chat;
m_pChatConnection = pChatCon;
}
Sapphire::Network::GameConnectionPtr Sapphire::World::Session::getZoneConnection() const
2017-08-08 13:53:47 +02:00
{
return m_pZoneConnection;
2017-08-08 13:53:47 +02:00
}
Sapphire::Network::GameConnectionPtr Sapphire::World::Session::getChatConnection() const
{
return m_pChatConnection;
}
bool Sapphire::World::Session::loadPlayer()
2017-08-08 13:53:47 +02:00
{
2020-03-01 01:00:57 +11:00
m_pPlayer = Entity::make_Player();
2017-08-08 13:53:47 +02:00
if( !m_pPlayer->load( m_sessionId, shared_from_this() ) )
{
m_isValid = false;
return false;
}
2017-08-08 13:53:47 +02:00
m_isValid = true;
return true;
2017-08-08 13:53:47 +02:00
}
void Sapphire::World::Session::close()
2017-08-08 13:53:47 +02:00
{
if( m_pZoneConnection )
m_pZoneConnection->disconnect();
2017-08-08 13:53:47 +02:00
if( m_pChatConnection )
m_pChatConnection->disconnect();
2017-10-06 00:13:29 +02:00
// remove the session from the player
if( m_pPlayer )
2018-11-01 13:05:10 +01:00
{
2020-05-12 03:06:04 +09:00
m_pPlayer->clearBuyBackMap();
if( m_pPlayer->getPartyId() != 0 )
{
// offline player is removed from party for now;
auto& partyMgr = Common::Service< World::Manager::PartyMgr >::ref();
partyMgr.onLeave( *m_pPlayer );
}
2018-11-01 13:05:10 +01:00
// do one last update to db
m_pPlayer->updateSql();
// reset the zone, so the zone handler knows to remove the actor
m_pPlayer->setCurrentZone( nullptr );
2018-11-01 13:05:10 +01:00
}
2017-08-08 13:53:47 +02:00
}
uint32_t Sapphire::World::Session::getId() const
2017-08-08 13:53:47 +02:00
{
return m_sessionId;
2017-08-08 13:53:47 +02:00
}
int64_t Sapphire::World::Session::getLastDataTime() const
2017-08-08 13:53:47 +02:00
{
return m_lastDataTime;
2017-08-08 13:53:47 +02:00
}
int64_t Sapphire::World::Session::getLastSqlTime() const
{
return m_lastSqlTime;
}
bool Sapphire::World::Session::isValid() const
{
return m_isValid;
}
void Sapphire::World::Session::updateLastDataTime()
2017-08-08 13:53:47 +02:00
{
m_lastDataTime = Common::Util::getTimeSeconds();
}
void Sapphire::World::Session::updateLastSqlTime()
{
m_lastSqlTime = Common::Util::getTimeSeconds();
2017-08-08 13:53:47 +02:00
}
void Sapphire::World::Session::startReplay( const std::string& path )
2018-01-08 21:42:44 +01:00
{
if( !fs::exists( path ) )
{
getPlayer()->sendDebug( "Couldn't find folder." );
return;
}
2018-01-08 21:42:44 +01:00
m_replayCache.clear();
2018-01-08 21:42:44 +01:00
std::vector< std::tuple< uint64_t, std::string > > loadedSets;
2018-01-08 21:42:44 +01:00
for( auto it = fs::directory_iterator( fs::path( path ) );
it != fs::directory_iterator(); ++it )
{
// Get the filename of the current element
auto fileName = it->path().filename().string();
auto unixTime = std::stoull( fileName.substr( 0, 14 ).c_str() );
2018-01-08 21:42:44 +01:00
if( unixTime > 1000000000 )
{
loadedSets.push_back( std::tuple< uint64_t, std::string >( unixTime, it->path().string() ) );
}
}
2018-01-08 21:42:44 +01:00
sort( loadedSets.begin(), loadedSets.end(),
[]( const std::tuple< uint64_t, std::string >& left, const std::tuple< uint64_t, std::string >& right )
{
return std::get< 0 >( left ) < std::get< 0 >( right );
} );
2018-01-08 21:42:44 +01:00
uint64_t startTime = std::get< 0 >( loadedSets.at( 0 ) );
2018-01-08 21:42:44 +01:00
for( auto set : loadedSets )
{
m_replayCache.push_back( std::tuple< uint64_t, std::string >(
Common::Util::getTimeMs() + ( std::get< 0 >( set ) - startTime ), std::get< 1 >( set ) ) );
2018-01-08 23:38:27 +01:00
2019-01-04 12:34:19 +01:00
Logger::info( "Registering {0} for {1}", std::get< 1 >( set ), std::get< 0 >( set ) - startTime );
}
2018-01-08 21:42:44 +01:00
2019-01-05 12:32:10 +01:00
getPlayer()->sendDebug( "Registered {0} sets for replay" ), m_replayCache.size();
m_isReplaying = true;
2018-01-08 21:42:44 +01:00
}
void Sapphire::World::Session::stopReplay()
2018-01-08 21:42:44 +01:00
{
m_isReplaying = false;
m_replayCache.clear();
2018-01-08 21:42:44 +01:00
}
void Sapphire::World::Session::processReplay()
2017-08-08 13:53:47 +02:00
{
int at = 0;
for( const auto& set : m_replayCache )
{
if( std::get< 0 >( set ) <= Common::Util::getTimeMs() )
{
m_pZoneConnection->injectPacket( std::get< 1 >( set ), *getPlayer().get() );
m_replayCache.erase( m_replayCache.begin() + at );
//g_framework.getLogger().info( "Sent for " + std::to_string( std::get< 0 >( set ) ) + ", left: " + std::to_string( m_replayCache.size() ) );
}
at++;
}
2018-01-09 18:54:09 +01:00
if( m_replayCache.size() == 0 )
m_isReplaying = false;
2018-01-09 18:54:09 +01:00
}
void Sapphire::World::Session::sendReplayInfo()
2018-01-09 18:54:09 +01:00
{
std::string message = std::to_string( m_replayCache.size() ) + " Sets left in cache, ";
2018-01-09 18:54:09 +01:00
if( m_isReplaying )
message += " is active";
else
message += " is idle";
2018-01-09 18:54:09 +01:00
getPlayer()->sendDebug( message );
2018-01-08 23:38:27 +01:00
}
void Sapphire::World::Session::update()
2018-01-08 23:38:27 +01:00
{
if( m_isReplaying )
processReplay();
if( m_pZoneConnection )
{
m_pZoneConnection->processInQueue();
2018-01-08 21:42:44 +01:00
// SESSION LOGIC
m_pPlayer->update( Common::Util::getTimeMs() );
2017-08-08 13:53:47 +02:00
if( Common::Util::getTimeSeconds() - static_cast< uint32_t >( getLastSqlTime() ) > 10 )
{
updateLastSqlTime();
m_pPlayer->updateSql();
}
2017-08-08 13:53:47 +02:00
m_pZoneConnection->processOutQueue();
}
2017-08-08 13:53:47 +02:00
if( m_pChatConnection )
{
m_pChatConnection->processInQueue();
m_pChatConnection->processOutQueue();
}
2017-08-08 13:53:47 +02:00
}
Sapphire::Entity::PlayerPtr Sapphire::World::Session::getPlayer() const
2017-08-08 13:53:47 +02:00
{
return m_pPlayer;
2017-08-08 13:53:47 +02:00
}