Updated all events to use sockets instead of user ptr.

This commit is contained in:
HikikoMarmy
2025-06-15 00:16:02 +01:00
parent 2c260b7cf9
commit f82fc49594
56 changed files with 820 additions and 235 deletions

View File

@@ -1,23 +1,19 @@
#include "../../global_define.h"
#include "NotifyClientDiscovered.h" #include "NotifyClientDiscovered.h"
NotifyClientDiscovered::NotifyClientDiscovered( std::string clientIp, int32_t clientPort, RealmClientType clientType ) : GenericMessage( 0x40 ) #include "../../Common/Constant.h"
NotifyClientDiscovered::NotifyClientDiscovered( std::string clientIp, int32_t clientPort ) : GenericMessage( 0x40 )
{ {
this->m_clientIp = std::move( clientIp ); this->m_clientIp = std::move( clientIp );
this->m_clientPort = clientPort; this->m_clientPort = clientPort;
this->m_clientType = clientType;
} }
ByteStream &NotifyClientDiscovered::Serialize() ByteBuffer &NotifyClientDiscovered::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( 0 ); m_stream.write_u32( 0 );
if( m_clientType == RealmClientType::RETURN_TO_ARMS ) m_stream.write_sz_utf8( m_clientIp );
m_stream.write_utf8( m_clientIp );
else
m_stream.write_sz_utf8( m_clientIp );
m_stream.write_u32( m_clientPort ); m_stream.write_u32( m_clientPort );
return m_stream; return m_stream;

View File

@@ -1,12 +1,16 @@
#pragma once #pragma once
#include <string>
#include "../GenericNetMessage.h"
#include "../../Common/Constant.h"
class NotifyClientDiscovered : public GenericMessage { class NotifyClientDiscovered : public GenericMessage {
private: private:
std::string m_clientIp; std::string m_clientIp;
int32_t m_clientPort; int32_t m_clientPort;
RealmClientType m_clientType;
public: public:
NotifyClientDiscovered( std::string clientIp, int32_t clientPort, RealmClientType clientType ); NotifyClientDiscovered( std::string clientIp, int32_t clientPort );
ByteStream &Serialize() override; ByteBuffer &Serialize() override;
}; };

View File

@@ -1,5 +1,4 @@
#include "../../global_define.h" #include "NotifyClientRequestConnect.h"
#include "NotifyClientReqConnect.h"
NotifyClientRequestConnect::NotifyClientRequestConnect( std::string clientIp, int32_t clientPort ) : GenericMessage( 0x3F ) NotifyClientRequestConnect::NotifyClientRequestConnect( std::string clientIp, int32_t clientPort ) : GenericMessage( 0x3F )
{ {
@@ -7,7 +6,7 @@ NotifyClientRequestConnect::NotifyClientRequestConnect( std::string clientIp, in
this->m_clientPort = clientPort; this->m_clientPort = clientPort;
} }
ByteStream &NotifyClientRequestConnect::Serialize() ByteBuffer &NotifyClientRequestConnect::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( 0 ); m_stream.write_u32( 0 );

View File

@@ -1,5 +1,9 @@
#pragma once #pragma once
#include <string>
#include "../GenericNetMessage.h"
class NotifyClientRequestConnect : public GenericMessage class NotifyClientRequestConnect : public GenericMessage
{ {
private: private:
@@ -8,5 +12,5 @@ private:
public: public:
NotifyClientRequestConnect( std::string clientIp, int32_t clientPort ); NotifyClientRequestConnect( std::string clientIp, int32_t clientPort );
ByteStream &Serialize() override; ByteBuffer &Serialize() override;
}; };

View File

@@ -1,14 +1,15 @@
#include "../../global_define.h"
#include "NotifyForcedLogout.h" #include "NotifyForcedLogout.h"
NotifyForcedLogout::NotifyForcedLogout() : GenericMessage( 0x41 ) NotifyForcedLogout::NotifyForcedLogout() : GenericMessage( 0x41 )
{ {
} }
ByteStream &NotifyForcedLogout::Serialize() ByteBuffer &NotifyForcedLogout::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( 0 ); m_stream.write_u32( 0 );
m_stream.write_u32( 0 );
return m_stream; return m_stream;
} }

View File

@@ -1,9 +1,11 @@
#pragma once #pragma once
#include "../GenericNetMessage.h"
class NotifyForcedLogout : public GenericMessage { class NotifyForcedLogout : public GenericMessage {
private: private:
public: public:
NotifyForcedLogout(); NotifyForcedLogout();
ByteStream &Serialize() override; ByteBuffer &Serialize() override;
}; };

View File

@@ -1,19 +1,18 @@
#include "../../global_define.h"
#include "NotifyGameDiscovered.h" #include "NotifyGameDiscovered.h"
NotifyGameDiscovered::NotifyGameDiscovered( std::string clientIp, int32_t clientPort, RealmClientType clientType ) : GenericMessage( 0x3E ) NotifyGameDiscovered::NotifyGameDiscovered( std::string clientIp, int32_t clientPort, RealmGameType clientType ) : GenericMessage( 0x3E )
{ {
this->m_clientIp = std::move( clientIp ); this->m_clientIp = std::move( clientIp );
this->m_clientPort = clientPort; this->m_clientPort = clientPort;
this->m_clientType = clientType; this->m_clientType = clientType;
} }
ByteStream &NotifyGameDiscovered::Serialize() ByteBuffer &NotifyGameDiscovered::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( 0 ); m_stream.write_u32( 0 );
if( m_clientType == RealmClientType::RETURN_TO_ARMS ) if( m_clientType == RealmGameType::RETURN_TO_ARMS )
m_stream.write_utf8( m_clientIp ); m_stream.write_utf8( m_clientIp );
else else
m_stream.write_sz_utf8( m_clientIp ); m_stream.write_sz_utf8( m_clientIp );

View File

@@ -1,12 +1,18 @@
#pragma once #pragma once
#include <memory>
#include <string>
#include "../GenericNetMessage.h"
#include "../../Common/Constant.h"
class NotifyGameDiscovered : public GenericMessage { class NotifyGameDiscovered : public GenericMessage {
private: private:
std::string m_clientIp; std::string m_clientIp;
int32_t m_clientPort; int32_t m_clientPort;
RealmClientType m_clientType; RealmGameType m_clientType;
public: public:
NotifyGameDiscovered( std::string clientIp, int32_t clientPort, RealmClientType clientType ); NotifyGameDiscovered( std::string clientIp, int32_t clientPort, RealmGameType clientType );
ByteStream &Serialize() override; ByteBuffer &Serialize() override;
}; };

View File

@@ -1,11 +1,10 @@
#include "../../global_define.h"
#include "Notify_4C.h" #include "Notify_4C.h"
Notify_4C::Notify_4C() : GenericMessage( 0x4C ) Notify_4C::Notify_4C() : GenericMessage( 0x4C )
{ {
} }
ByteStream &Notify_4C::Serialize() ByteBuffer &Notify_4C::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( 0 ); m_stream.write_u32( 0 );

View File

@@ -1,9 +1,11 @@
#pragma once #pragma once
#include "../GenericNetMessage.h"
class Notify_4C : public GenericMessage { class Notify_4C : public GenericMessage {
private: private:
public: public:
Notify_4C(); Notify_4C();
ByteStream &Serialize() override; ByteBuffer &Serialize() override;
}; };

View File

@@ -1,6 +1,9 @@
#include "../../global_define.h"
#include "RequestCancelGame.h" #include "RequestCancelGame.h"
#include "../../Game/RealmUserManager.h"
#include "../../Game/GameSessionManager.h"
#include "../../logging.h"
void RequestCancelGame::Deserialize( sptr_byte_stream stream ) void RequestCancelGame::Deserialize( sptr_byte_stream stream )
{ {
DeserializeHeader( stream ); DeserializeHeader( stream );
@@ -8,17 +11,32 @@ void RequestCancelGame::Deserialize( sptr_byte_stream stream )
m_sessionId = stream->read_encrypted_utf16(); m_sessionId = stream->read_encrypted_utf16();
} }
sptr_generic_response RequestCancelGame::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestCancelGame::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
auto user = RealmUserManager::Get().FindUserBySocket( socket );
if( user == nullptr ) if( user == nullptr )
{ {
Log::Error( "User not found! [%S]", m_sessionId.c_str() ); Log::Error( "User not found! [%S]", m_sessionId.c_str() );
return std::make_shared< ResultCancelGame >( this ); return std::make_shared< ResultCancelGame >( this );
} }
GameSessionManager::Get().RequestCancel( user ); if (user->m_isHost)
{
auto result = GameSessionManager::Get().RequestCancel(user);
if( false == result )
{
Log::Error( "Failed to cancel game session for user [%S]", user->m_sessionId.c_str() );
}
}
else
{
user->m_isHost = false;
user->m_gameId = -1;
}
return std::make_shared< ResultCancelGame >( this ); return std::make_shared< ResultCancelGame >( this );
} }
@@ -28,10 +46,10 @@ ResultCancelGame::ResultCancelGame( GenericRequest *request ) : GenericResponse(
} }
ByteStream &ResultCancelGame::Serialize() ByteBuffer &ResultCancelGame::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( 0 ); m_stream.write_u32( 0 );
return m_stream; return m_stream;

View File

@@ -1,5 +1,11 @@
#pragma once #pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class RequestCancelGame : public GenericRequest class RequestCancelGame : public GenericRequest
{ {
private: private:
@@ -11,12 +17,12 @@ public:
return std::make_unique< RequestCancelGame >(); return std::make_unique< RequestCancelGame >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
class ResultCancelGame : public GenericResponse { class ResultCancelGame : public GenericResponse {
public: public:
ResultCancelGame( GenericRequest *request ); ResultCancelGame( GenericRequest *request );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -1,28 +1,74 @@
#include "../../global_define.h"
#include "RequestCreateAccount.h" #include "RequestCreateAccount.h"
#include "../../Game/RealmUserManager.h"
#include "../../Crypto/PasswordHash.h"
#include "../../Common/Constant.h"
#include "../../Game/RealmUser.h"
#include "../../Database/Database.h"
#include "../../logging.h"
void RequestCreateAccount::Deserialize( sptr_byte_stream stream ) void RequestCreateAccount::Deserialize( sptr_byte_stream stream )
{ {
DeserializeHeader( stream ); DeserializeHeader( stream );
auto username = stream->read_encrypted_utf16(); m_username = Util::WideToUTF8( stream->read_encrypted_utf16() );
auto password = stream->read_encrypted_utf16(); m_password = Util::WideToUTF8( stream->read_encrypted_utf16() );
auto emailAddress = stream->read_encrypted_utf16(); m_emailAddress = Util::WideToUTF8( stream->read_encrypted_utf16() );
auto dateOfBirth = stream->read_encrypted_utf16(); m_dateOfBirth = Util::WideToUTF8( stream->read_encrypted_utf16() );
auto chatHandle = stream->read_encrypted_utf16(); m_chatHandle = Util::WideToUTF8( stream->read_encrypted_utf16() );
int dbg = 0;
} }
sptr_generic_response RequestCreateAccount::ProcessRequest( sptr_user user, sptr_byte_stream stream ) bool RequestCreateAccount::VerifyUserData()
{
if( m_username.empty() || m_password.empty() || m_emailAddress.empty() || m_dateOfBirth.empty() || m_chatHandle.empty() )
{
Log::Error( "RequestCreateAccount::VerifyUserData() - Missing required fields for account creation." );
return false;
}
if( m_username.length() < 3 || m_username.length() > 20 )
{
Log::Error( "RequestCreateAccount::VerifyUserData() - Username must be between 3 and 20 characters." );
return false;
}
if( m_password.length() < 6 || m_password.length() > 32 )
{
Log::Error( "RequestCreateAccount::VerifyUserData() - Password must be between 6 and 32 characters." );
return false;
}
return true;
}
sptr_generic_response RequestCreateAccount::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
Log::Debug( "Account creation isn't supported. Random SessionID generated." ); auto user = RealmUserManager::Get().FindUserBySocket( socket );
if( nullptr == user || user->m_gameType != RealmGameType::RETURN_TO_ARMS )
if( nullptr == user )
{ {
Log::Error( "RequestCreateAccount::ProcessRequest() - User not found!" ); return std::make_shared< ResultCreateAccount >( this, CREATE_ACCOUNT_REPLY::ERROR_FATAL, L"" );
}
if( m_username.empty() || m_password.empty() || m_emailAddress.empty() || m_dateOfBirth.empty() || m_chatHandle.empty() )
{
Log::Error( "RequestCreateAccount::ProcessRequest() - Missing required fields for account creation." );
return std::make_shared< ResultCreateAccount >( this, CREATE_ACCOUNT_REPLY::ERROR_FATAL, L"" );
}
auto result = Database::Get().CreateNewAccount
(
m_username,
m_password,
m_emailAddress,
m_dateOfBirth,
m_chatHandle
);
if( !result )
{
Log::Error( "RequestCreateAccount::ProcessRequest() - Failed to create account for user: %s", m_username.c_str() );
return std::make_shared< ResultCreateAccount >( this, CREATE_ACCOUNT_REPLY::ERROR_FATAL, L"" ); return std::make_shared< ResultCreateAccount >( this, CREATE_ACCOUNT_REPLY::ERROR_FATAL, L"" );
} }
@@ -35,14 +81,13 @@ ResultCreateAccount::ResultCreateAccount( GenericRequest *request, int32_t reply
m_sessionId = sessionId; m_sessionId = sessionId;
} }
ByteStream &ResultCreateAccount::Serialize() ByteBuffer &ResultCreateAccount::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( m_reply ); m_stream.write_u32( m_reply );
m_stream.write_u32( 0 ); m_stream.write_encrypted_utf16( m_sessionId );
//m_stream.write_encrypted_utf16( m_sessionId );
return m_stream; return m_stream;
} }

View File

@@ -1,8 +1,10 @@
#pragma once #pragma once
// Account Creation is used in the Network Beta for CoN #include <memory>
// but it isn't used or supported here because retail #include <string>
// uses "foo" and "bar" to login without user data.
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class RequestCreateAccount : public GenericRequest class RequestCreateAccount : public GenericRequest
{ {
@@ -11,6 +13,15 @@ class RequestCreateAccount : public GenericRequest
ERROR_FATAL, ERROR_FATAL,
ERROR_NOT_EXIST ERROR_NOT_EXIST
}; };
std::string m_username;
std::string m_password;
std::string m_emailAddress;
std::string m_dateOfBirth;
std::string m_chatHandle;
bool VerifyUserData();
public: public:
static std::unique_ptr< RequestCreateAccount > Create() static std::unique_ptr< RequestCreateAccount > Create()
{ {
@@ -19,7 +30,7 @@ public:
CREATE_ACCOUNT_REPLY m_reply; CREATE_ACCOUNT_REPLY m_reply;
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
@@ -30,5 +41,5 @@ private:
public: public:
ResultCreateAccount( GenericRequest *request, int32_t reply, std::wstring sessionId ); ResultCreateAccount( GenericRequest *request, int32_t reply, std::wstring sessionId );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -1,7 +1,10 @@
#include "../../global_define.h"
#include "RequestCreatePrivateGame.h" #include "RequestCreatePrivateGame.h"
#include "../../Game/RealmUserManager.h"
#include "../../Game/GameSessionManager.h"
#include "../../configuration.h"
#include "../../logging.h"
void RequestCreatePrivateGame::Deserialize( sptr_byte_stream stream ) void RequestCreatePrivateGame::Deserialize( sptr_byte_stream stream )
{ {
DeserializeHeader( stream ); DeserializeHeader( stream );
@@ -10,11 +13,18 @@ void RequestCreatePrivateGame::Deserialize( sptr_byte_stream stream )
m_gameInfo = stream->read_utf16(); m_gameInfo = stream->read_utf16();
} }
sptr_generic_response RequestCreatePrivateGame::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestCreatePrivateGame::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
auto result = GameSessionManager::Get().CreatePrivateGameSession( user, m_gameInfo, user->m_clientType ); auto user = RealmUserManager::Get().FindUserBySocket( socket );
if( user == nullptr )
{
Log::Error( "User not found! [%S]", m_sessionId.c_str() );
return std::make_shared< ResultCreatePrivateGame >( this, CREATE_REPLY::FATAL_ERROR, "", 0 );
}
auto result = GameSessionManager::Get().CreatePrivateGameSession( user, m_gameInfo, user->m_gameType );
if( !result ) if( !result )
{ {
@@ -34,10 +44,10 @@ ResultCreatePrivateGame::ResultCreatePrivateGame( GenericRequest *request, int32
m_discoveryPort = discoveryPort; m_discoveryPort = discoveryPort;
} }
ByteStream &ResultCreatePrivateGame::Serialize() ByteBuffer &ResultCreatePrivateGame::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( m_reply ); m_stream.write_u32( m_reply );
m_stream.write_sz_utf8( m_discoveryIp ); m_stream.write_sz_utf8( m_discoveryIp );

View File

@@ -1,5 +1,11 @@
#pragma once #pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class RequestCreatePrivateGame : public GenericRequest class RequestCreatePrivateGame : public GenericRequest
{ {
private: private:
@@ -20,7 +26,7 @@ public:
return std::make_unique< RequestCreatePrivateGame >(); return std::make_unique< RequestCreatePrivateGame >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
@@ -32,5 +38,5 @@ private:
public: public:
ResultCreatePrivateGame( GenericRequest *request, int32_t reply, std::string discoveryIp = "", int32_t discoveryPort = 0 ); ResultCreatePrivateGame( GenericRequest *request, int32_t reply, std::string discoveryIp = "", int32_t discoveryPort = 0 );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -1,15 +1,24 @@
#include "../../global_define.h"
#include "RequestCreatePrivateRoom.h" #include "RequestCreatePrivateRoom.h"
#include "../../Game/RealmUserManager.h"
#include "../../Game/ChatRoomManager.h"
#include "../../logging.h"
void RequestCreatePrivateRoom::Deserialize( sptr_byte_stream stream ) void RequestCreatePrivateRoom::Deserialize( sptr_byte_stream stream )
{ {
DeserializeHeader( stream ); DeserializeHeader( stream );
} }
sptr_generic_response RequestCreatePrivateRoom::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestCreatePrivateRoom::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
auto user = RealmUserManager::Get().FindUserBySocket( socket );
if( user == nullptr )
{
return std::make_shared< ResultCreatePrivateRoom >( this );
}
auto sessionId = stream->read_encrypted_utf16(); auto sessionId = stream->read_encrypted_utf16();
auto roomName = stream->read_utf16(); auto roomName = stream->read_utf16();
@@ -28,10 +37,10 @@ ResultCreatePrivateRoom::ResultCreatePrivateRoom( GenericRequest *request ) : Ge
{ {
} }
ByteStream&ResultCreatePrivateRoom::Serialize() ByteBuffer&ResultCreatePrivateRoom::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( 0 ); m_stream.write_u32( 0 );
return m_stream; return m_stream;

View File

@@ -1,5 +1,11 @@
#pragma once #pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class RequestCreatePrivateRoom : public GenericRequest class RequestCreatePrivateRoom : public GenericRequest
{ {
public: public:
@@ -8,12 +14,12 @@ public:
return std::make_unique< RequestCreatePrivateRoom >(); return std::make_unique< RequestCreatePrivateRoom >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
class ResultCreatePrivateRoom : public GenericResponse { class ResultCreatePrivateRoom : public GenericResponse {
public: public:
ResultCreatePrivateRoom( GenericRequest *request ); ResultCreatePrivateRoom( GenericRequest *request );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -1,7 +1,10 @@
#include "../../global_define.h"
#include "RequestCreatePublicGame.h" #include "RequestCreatePublicGame.h"
#include "../../Game/RealmUserManager.h"
#include "../../Game/GameSessionManager.h"
#include "../../configuration.h"
#include "../../logging.h"
// Request // Request
void RequestCreatePublicGame::Deserialize( sptr_byte_stream stream ) void RequestCreatePublicGame::Deserialize( sptr_byte_stream stream )
{ {
@@ -18,11 +21,18 @@ void RequestCreatePublicGame::Deserialize( sptr_byte_stream stream )
m_gameInfo = stream->read_utf16(); m_gameInfo = stream->read_utf16();
} }
sptr_generic_response RequestCreatePublicGame::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestCreatePublicGame::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
auto result = GameSessionManager::Get().CreatePublicGameSession( user, m_gameInfo, user->m_clientType ); auto user = RealmUserManager::Get().FindUserBySocket( socket );
if( user == nullptr )
{
Log::Error( "User not found! [%S]", m_sessionId.c_str() );
return std::make_shared< ResultCreatePublicGame >( this, CREATE_REPLY::FATAL_ERROR, "", 0 );
}
auto result = GameSessionManager::Get().CreatePublicGameSession( user, m_gameInfo, user->m_gameType );
if( !result ) if( !result )
{ {
@@ -43,10 +53,10 @@ ResultCreatePublicGame::ResultCreatePublicGame( GenericRequest *request, int32_t
m_discoveryPort = discoveryPort; m_discoveryPort = discoveryPort;
} }
ByteStream &ResultCreatePublicGame::Serialize() ByteBuffer &ResultCreatePublicGame::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( m_reply ); m_stream.write_u32( m_reply );
m_stream.write_sz_utf8( m_discoveryIp ); m_stream.write_sz_utf8( m_discoveryIp );

View File

@@ -1,5 +1,11 @@
#pragma once #pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class RequestCreatePublicGame : public GenericRequest class RequestCreatePublicGame : public GenericRequest
{ {
private: private:
@@ -21,7 +27,7 @@ public:
{ {
return std::make_unique< RequestCreatePublicGame >(); return std::make_unique< RequestCreatePublicGame >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
@@ -33,5 +39,5 @@ private:
public: public:
ResultCreatePublicGame( GenericRequest *request, int32_t reply, std::string discoveryIp = "", int32_t discoveryPort = 0 ); ResultCreatePublicGame( GenericRequest *request, int32_t reply, std::string discoveryIp = "", int32_t discoveryPort = 0 );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -1,6 +1,9 @@
#include "../../global_define.h"
#include "RequestDoClientDiscovery.h" #include "RequestDoClientDiscovery.h"
#include "../../Game/RealmUserManager.h"
#include "../../Game/GameSessionManager.h"
#include "../../configuration.h"
void RequestDoClientDiscovery::Deserialize( sptr_byte_stream stream ) void RequestDoClientDiscovery::Deserialize( sptr_byte_stream stream )
{ {
DeserializeHeader( stream ); DeserializeHeader( stream );
@@ -9,11 +12,17 @@ void RequestDoClientDiscovery::Deserialize( sptr_byte_stream stream )
m_gameId = stream->read_u32(); m_gameId = stream->read_u32();
} }
sptr_generic_response RequestDoClientDiscovery::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestDoClientDiscovery::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
auto session = GameSessionManager::Get().FindGame( m_gameId ); auto user = RealmUserManager::Get().FindUserBySocket( socket );
if( user == nullptr )
{
return std::make_shared< ResultDoClientDiscovery >( this, DISCOVERY_REPLY::FATAL_ERROR, "", 0 );
}
auto session = GameSessionManager::Get().FindGame( m_gameId, user->m_gameType );
if( session == nullptr ) if( session == nullptr )
{ {
return std::make_shared< ResultDoClientDiscovery >( this, DISCOVERY_REPLY::FATAL_ERROR, "", 0 ); return std::make_shared< ResultDoClientDiscovery >( this, DISCOVERY_REPLY::FATAL_ERROR, "", 0 );
@@ -37,10 +46,10 @@ ResultDoClientDiscovery::ResultDoClientDiscovery( GenericRequest *request, int32
m_discoveryPort = port; m_discoveryPort = port;
} }
ByteStream &ResultDoClientDiscovery::Serialize() ByteBuffer &ResultDoClientDiscovery::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( m_reply ); m_stream.write_u32( m_reply );
m_stream.write_sz_utf8( m_discoveryIP ); m_stream.write_sz_utf8( m_discoveryIP );

View File

@@ -1,5 +1,11 @@
#pragma once #pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class RequestDoClientDiscovery : public GenericRequest class RequestDoClientDiscovery : public GenericRequest
{ {
private: private:
@@ -18,7 +24,7 @@ public:
return std::make_unique< RequestDoClientDiscovery >(); return std::make_unique< RequestDoClientDiscovery >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
@@ -30,5 +36,5 @@ private:
public: public:
ResultDoClientDiscovery( GenericRequest *request, int32_t reply, std::string ip = "", int32_t port = 0); ResultDoClientDiscovery( GenericRequest *request, int32_t reply, std::string ip = "", int32_t port = 0);
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -1,4 +1,3 @@
#include "../../global_define.h"
#include "RequestEnterRoom.h" #include "RequestEnterRoom.h"
void RequestEnterRoom::Deserialize( sptr_byte_stream stream ) void RequestEnterRoom::Deserialize( sptr_byte_stream stream )
@@ -6,7 +5,7 @@ void RequestEnterRoom::Deserialize( sptr_byte_stream stream )
DeserializeHeader( stream ); DeserializeHeader( stream );
} }
sptr_generic_response RequestEnterRoom::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestEnterRoom::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
@@ -20,10 +19,10 @@ ResultEnterRoom::ResultEnterRoom( GenericRequest *request ) : GenericResponse( *
{ {
} }
ByteStream& ResultEnterRoom::Serialize() ByteBuffer& ResultEnterRoom::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( 0 ); m_stream.write_u32( 0 );
m_stream.write_utf16( L"Room Name" ); m_stream.write_utf16( L"Room Name" );

View File

@@ -1,5 +1,11 @@
#pragma once #pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class RequestEnterRoom : public GenericRequest class RequestEnterRoom : public GenericRequest
{ {
public: public:
@@ -8,12 +14,12 @@ public:
return std::make_unique< RequestEnterRoom >(); return std::make_unique< RequestEnterRoom >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
class ResultEnterRoom : public GenericResponse { class ResultEnterRoom : public GenericResponse {
public: public:
ResultEnterRoom( GenericRequest *request ); ResultEnterRoom( GenericRequest *request );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -1,4 +1,3 @@
#include "../../global_define.h"
#include "RequestGetEncryptionKey.h" #include "RequestGetEncryptionKey.h"
void RequestGetEncryptionKey::Deserialize( sptr_byte_stream stream ) void RequestGetEncryptionKey::Deserialize( sptr_byte_stream stream )
@@ -6,7 +5,7 @@ void RequestGetEncryptionKey::Deserialize( sptr_byte_stream stream )
DeserializeHeader( stream ); DeserializeHeader( stream );
} }
sptr_generic_response RequestGetEncryptionKey::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestGetEncryptionKey::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
@@ -21,10 +20,10 @@ ResultGetEncryptionKey::ResultGetEncryptionKey( GenericRequest *request ) : Gene
m_symKey = RealmCrypt::getSymmetricKey(); m_symKey = RealmCrypt::getSymmetricKey();
} }
ByteStream& ResultGetEncryptionKey::Serialize() ByteBuffer& ResultGetEncryptionKey::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( 0 ); m_stream.write_u32( 0 );
auto encrypted = RealmCrypt::encryptSymmetric( m_symKey ); auto encrypted = RealmCrypt::encryptSymmetric( m_symKey );

View File

@@ -1,5 +1,11 @@
#pragma once #pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class RequestGetEncryptionKey : public GenericRequest class RequestGetEncryptionKey : public GenericRequest
{ {
public: public:
@@ -8,7 +14,7 @@ public:
return std::make_unique< RequestGetEncryptionKey >(); return std::make_unique< RequestGetEncryptionKey >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
@@ -17,5 +23,5 @@ public:
std::vector< uint8_t > m_symKey; std::vector< uint8_t > m_symKey;
ResultGetEncryptionKey( GenericRequest *request ); ResultGetEncryptionKey( GenericRequest *request );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -1,6 +1,10 @@
#include "../../global_define.h"
#include "RequestGetGame.h" #include "RequestGetGame.h"
#include "../../Game/RealmUserManager.h"
#include "../../Game/GameSessionManager.h"
#include "../../Game/RealmUser.h"
#include "../../logging.h"
void RequestGetGame::Deserialize( sptr_byte_stream stream ) void RequestGetGame::Deserialize( sptr_byte_stream stream )
{ {
DeserializeHeader( stream ); DeserializeHeader( stream );
@@ -9,17 +13,18 @@ void RequestGetGame::Deserialize( sptr_byte_stream stream )
m_gameName = stream->read_utf16(); m_gameName = stream->read_utf16();
} }
sptr_generic_response RequestGetGame::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestGetGame::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
auto user = RealmUserManager::Get().FindUserBySocket( socket );
if( user == nullptr ) if( user == nullptr )
{ {
Log::Error( "User not found! [%S]", m_sessionId.c_str() ); Log::Error( "User not found! [%S]", m_sessionId.c_str() );
return std::make_shared< ResultGetGame >( this, TIMEOUT ); return std::make_shared< ResultGetGame >( this, TIMEOUT );
} }
auto session = GameSessionManager::Get().FindGame( m_gameName ); auto session = GameSessionManager::Get().FindGame( m_gameName, user->m_gameType );
if( session == nullptr ) if( session == nullptr )
{ {
@@ -53,10 +58,10 @@ ResultGetGame::ResultGetGame( GenericRequest *request, int32_t reply, int32_t ga
m_gameId = gameId; m_gameId = gameId;
} }
ByteStream &ResultGetGame::Serialize() ByteBuffer &ResultGetGame::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( m_reply ); m_stream.write_u32( m_reply );
// TODO: These may come in from the UpdateGameData event // TODO: These may come in from the UpdateGameData event

View File

@@ -1,5 +1,11 @@
#pragma once #pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class RequestGetGame : public GenericRequest { class RequestGetGame : public GenericRequest {
private: private:
std::wstring m_sessionId; std::wstring m_sessionId;
@@ -16,7 +22,7 @@ public:
{ {
return std::make_unique< RequestGetGame >(); return std::make_unique< RequestGetGame >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
@@ -27,5 +33,5 @@ private:
public: public:
ResultGetGame( GenericRequest *request, int32_t reply, int32_t gameId = 0 ); ResultGetGame( GenericRequest *request, int32_t reply, int32_t gameId = 0 );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -1,4 +1,3 @@
#include "../../global_define.h"
#include "RequestGetPublicRooms.h" #include "RequestGetPublicRooms.h"
void RequestGetPublicRooms::Deserialize( sptr_byte_stream stream ) void RequestGetPublicRooms::Deserialize( sptr_byte_stream stream )
@@ -6,7 +5,7 @@ void RequestGetPublicRooms::Deserialize( sptr_byte_stream stream )
DeserializeHeader( stream ); DeserializeHeader( stream );
} }
sptr_generic_response RequestGetPublicRooms::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestGetPublicRooms::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
@@ -19,10 +18,10 @@ ResultGetPublicRooms::ResultGetPublicRooms( GenericRequest *request ) : GenericR
{ {
} }
ByteStream& ResultGetPublicRooms::Serialize() ByteBuffer& ResultGetPublicRooms::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( 0 ); m_stream.write_u32( 0 );
m_stream.write_u32( 0); m_stream.write_u32( 0);

View File

@@ -1,5 +1,11 @@
#pragma once #pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class RequestGetPublicRooms : public GenericRequest class RequestGetPublicRooms : public GenericRequest
{ {
public: public:
@@ -8,12 +14,12 @@ public:
return std::make_unique< RequestGetPublicRooms >(); return std::make_unique< RequestGetPublicRooms >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
class ResultGetPublicRooms : public GenericResponse { class ResultGetPublicRooms : public GenericResponse {
public: public:
ResultGetPublicRooms( GenericRequest *request ); ResultGetPublicRooms( GenericRequest *request );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -1,12 +1,13 @@
#include "../../global_define.h"
#include "RequestGetRealmStats.h" #include "RequestGetRealmStats.h"
#include "../../Game/RealmUserManager.h"
void RequestGetRealmStats::Deserialize( sptr_byte_stream stream ) void RequestGetRealmStats::Deserialize( sptr_byte_stream stream )
{ {
DeserializeHeader( stream ); DeserializeHeader( stream );
} }
sptr_generic_response RequestGetRealmStats::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestGetRealmStats::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
@@ -18,10 +19,10 @@ ResultGetRealmStats::ResultGetRealmStats( GenericRequest *request ) : GenericRes
} }
ByteStream &ResultGetRealmStats::Serialize() ByteBuffer &ResultGetRealmStats::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( 0 ); m_stream.write_u32( 0 );
// Player count on the game page. // Player count on the game page.

View File

@@ -1,5 +1,11 @@
#pragma once #pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class RequestGetRealmStats : public GenericRequest class RequestGetRealmStats : public GenericRequest
{ {
public: public:
@@ -7,12 +13,12 @@ public:
{ {
return std::make_unique< RequestGetRealmStats >(); return std::make_unique< RequestGetRealmStats >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
class ResultGetRealmStats : public GenericResponse { class ResultGetRealmStats : public GenericResponse {
public: public:
ResultGetRealmStats( GenericRequest *request ); ResultGetRealmStats( GenericRequest *request );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -1,4 +1,3 @@
#include "../../global_define.h"
#include "RequestGetRoom.h" #include "RequestGetRoom.h"
void RequestGetRoom::Deserialize( sptr_byte_stream stream ) void RequestGetRoom::Deserialize( sptr_byte_stream stream )
@@ -8,7 +7,7 @@ void RequestGetRoom::Deserialize( sptr_byte_stream stream )
auto sessionId = stream->read_encrypted_utf16(); auto sessionId = stream->read_encrypted_utf16();
} }
sptr_generic_response RequestGetRoom::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestGetRoom::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
@@ -19,10 +18,10 @@ ResultGetRoom::ResultGetRoom( GenericRequest *request ) : GenericResponse( *requ
{ {
} }
ByteStream &ResultGetRoom::Serialize() ByteBuffer &ResultGetRoom::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( 0 ); m_stream.write_u32( 0 );
m_stream.write_utf16( L"Room Name" ); m_stream.write_utf16( L"Room Name" );

View File

@@ -1,5 +1,11 @@
#pragma once #pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class RequestGetRoom : public GenericRequest { class RequestGetRoom : public GenericRequest {
public: public:
static std::unique_ptr< RequestGetRoom > Create() static std::unique_ptr< RequestGetRoom > Create()
@@ -7,12 +13,12 @@ public:
return std::make_unique< RequestGetRoom >(); return std::make_unique< RequestGetRoom >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
class ResultGetRoom : public GenericResponse { class ResultGetRoom : public GenericResponse {
public: public:
ResultGetRoom( GenericRequest *request ); ResultGetRoom( GenericRequest *request );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -1,6 +1,10 @@
#include "../../global_define.h"
#include "RequestGetRules.h" #include "RequestGetRules.h"
#include "../../Game/RealmUserManager.h"
#include "../../Game/RealmUser.h"
#include "../../Common/Constant.h"
#include "../../logging.h"
void RequestGetRules::Deserialize( sptr_byte_stream stream ) void RequestGetRules::Deserialize( sptr_byte_stream stream )
{ {
DeserializeHeader( stream ); DeserializeHeader( stream );
@@ -8,15 +12,35 @@ void RequestGetRules::Deserialize( sptr_byte_stream stream )
m_language = stream->read_sz_utf8(); m_language = stream->read_sz_utf8();
} }
sptr_generic_response RequestGetRules::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestGetRules::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
auto user = RealmUserManager::Get().FindUserBySocket( socket );
if( user == nullptr )
{
return std::make_shared< ResultGetRules >( this, L"" );
}
// TODO: Get rules/eula based on language // TODO: Get rules/eula based on language
std::wstring rules = // and move it info a MOTD file.
L"Welcome to the Norrath Emulated Server!\n\n" std::wstring rules;
L"This server is currently in development\n"
L"and may not be fully functional.\n\n"; if (user->m_gameType == RealmGameType::RETURN_TO_ARMS)
{
rules = L"Welcome to the Norrath Emulated Server!\n\n"
L"RETURN TO ARMS network support is currently a\n"
L"work in progress and can not guarantee stability.\n\n"
L"[IMPORTANT]:\n"
L"Please note that ONLINE character data will not be saved.\n"
L"You must import an offline save file for now.\n";
}
else
{
rules = L"Welcome to the Norrath Emulated Server!\n\n"
L"This server is currently in development\n"
L"and may not be fully functional.\n\n";
}
return std::make_shared< ResultGetRules >( this, rules ); return std::make_shared< ResultGetRules >( this, rules );
} }
@@ -26,10 +50,10 @@ ResultGetRules::ResultGetRules( GenericRequest *request, std::wstring rules ) :
m_rules = rules; m_rules = rules;
} }
ByteStream &ResultGetRules::Serialize() ByteBuffer &ResultGetRules::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( 0 ); m_stream.write_u32( 0 );
m_stream.write_utf16( m_rules ); m_stream.write_utf16( m_rules );

View File

@@ -1,5 +1,11 @@
#pragma once #pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class RequestGetRules : public GenericRequest class RequestGetRules : public GenericRequest
{ {
private: private:
@@ -11,7 +17,7 @@ public:
return std::make_unique< RequestGetRules >(); return std::make_unique< RequestGetRules >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
@@ -21,5 +27,5 @@ private:
public: public:
ResultGetRules( GenericRequest *request, std::wstring rules ); ResultGetRules( GenericRequest *request, std::wstring rules );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -1,32 +1,50 @@
#include "../../global_define.h"
#include "RequestGetServerAddress.h" #include "RequestGetServerAddress.h"
#include "../../Game/RealmUserManager.h"
#include "../../Game/RealmUser.h"
#include "../../Common/Constant.h"
#include "../../configuration.h"
#include "../../logging.h"
void RequestGetServerAddress::Deserialize( sptr_byte_stream stream ) void RequestGetServerAddress::Deserialize( sptr_byte_stream stream )
{ {
DeserializeHeader( stream ); DeserializeHeader( stream );
} }
sptr_generic_response RequestGetServerAddress::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestGetServerAddress::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
return std::make_shared< ResultGetServerAddress >( this, Config::service_ip, Config::lobby_port, user->m_clientType ); auto user = RealmUserManager::Get().FindUserBySocket( socket );
if( user == nullptr )
{
return std::make_shared< ResultGetServerAddress >( this, "", 0, RealmGameType::RETURN_TO_ARMS );
}
if (user->m_gameType == RealmGameType::RETURN_TO_ARMS)
{
return std::make_shared< ResultGetServerAddress >(this, Config::service_ip, Config::rta_lobby_port, user->m_gameType);
}
else
{
return std::make_shared< ResultGetServerAddress >(this, Config::service_ip, Config::con_lobby_port, user->m_gameType);
}
} }
ResultGetServerAddress::ResultGetServerAddress( GenericRequest *request, std::string ip, int32_t port, RealmClientType clientType ) : GenericResponse( *request ) ResultGetServerAddress::ResultGetServerAddress( GenericRequest *request, std::string ip, int32_t port, RealmGameType clientType ) : GenericResponse( *request )
{ {
m_ip = ip; m_ip = ip;
m_port = port; m_port = port;
m_clientType = clientType; m_clientType = clientType;
} }
ByteStream &ResultGetServerAddress::Serialize() ByteBuffer &ResultGetServerAddress::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( 0 ); m_stream.write_u32( 0 );
if( m_clientType == RealmClientType::RETURN_TO_ARMS ) if( m_clientType == RealmGameType::RETURN_TO_ARMS )
m_stream.write_utf8( m_ip ); m_stream.write_utf8( m_ip );
else else
m_stream.write_sz_utf8( m_ip ); m_stream.write_sz_utf8( m_ip );

View File

@@ -1,5 +1,12 @@
#pragma once #pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
#include "../../Common/Constant.h"
class RequestGetServerAddress : public GenericRequest { class RequestGetServerAddress : public GenericRequest {
public: public:
static std::unique_ptr< RequestGetServerAddress > Create() static std::unique_ptr< RequestGetServerAddress > Create()
@@ -7,7 +14,7 @@ public:
return std::make_unique< RequestGetServerAddress >(); return std::make_unique< RequestGetServerAddress >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
@@ -15,8 +22,8 @@ class ResultGetServerAddress : public GenericResponse {
public: public:
std::string m_ip; std::string m_ip;
int32_t m_port; int32_t m_port;
RealmClientType m_clientType; RealmGameType m_clientType;
ResultGetServerAddress( GenericRequest *request, std::string ip, int32_t port, RealmClientType clientType ); ResultGetServerAddress( GenericRequest *request, std::string ip, int32_t port, RealmGameType clientType );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -1,49 +1,87 @@
#include "../../global_define.h"
#include "RequestLogin.h" #include "RequestLogin.h"
#include "../../Database/Database.h"
#include "../../Game/RealmUserManager.h"
#include "../../Game/RealmUser.h"
#include "../../Common/Constant.h"
#include "../../logging.h"
void RequestLogin::Deserialize( sptr_byte_stream stream ) void RequestLogin::Deserialize( sptr_byte_stream stream )
{ {
DeserializeHeader( stream ); DeserializeHeader( stream );
m_username = stream->read_encrypted_utf16(); m_username = Util::WideToUTF8( stream->read_encrypted_utf16() );
m_password = stream->read_encrypted_utf16(); m_password = Util::WideToUTF8( stream->read_encrypted_utf16() );
} }
sptr_generic_response RequestLogin::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestLogin::ProcessLoginCON(sptr_user user)
{
if (m_username != "foo" && m_password != "bar")
{
// Network Beta CoN uses login information, but it's invalid because of version 2.0
// which used "foo" and "bar" as the login credentials.
Log::Debug("RequestLogin : Champions of Norrath v1.0");
// TODO: Either block this, or add support for the network beta.
return std::make_shared< ResultLogin >(this, LOGIN_REPLY::ACCOUNT_INVALID, L"");
}
user->m_accountId = -1;
user->m_sessionId = RealmUserManager::Get().GenerateSessionId();
return std::make_shared< ResultLogin >(this, SUCCESS, user->m_sessionId);
}
sptr_generic_response RequestLogin::ProcessLoginRTA(sptr_user user)
{
// Return to Arms uses login information.
Log::Debug("RequestLogin : Return to Arms");
// Verify the account exists
auto accountId = Database::Get().VerifyAccount(m_username, m_password);
if (accountId < 0)
{
Log::Error("RequestLogin::ProcessRequest() - Invalid account ID: " + std::to_string(accountId));
return std::make_shared< ResultLogin >(this, ACCOUNT_INVALID, L"");
}
user->m_accountId = accountId;
user->m_sessionId = RealmUserManager::Get().GenerateSessionId();
Database::Get().CreateSession(
user->m_accountId,
user->m_sessionId,
user->sock->remote_ip);
return std::make_shared< ResultLogin >(this, SUCCESS, user->m_sessionId);
}
sptr_generic_response RequestLogin::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
Log::Packet( stream->data, stream->data.size(), false ); auto user = RealmUserManager::Get().FindUserBySocket( socket );
if( user == nullptr )
{
Log::Error( "RequestLogin::ProcessRequest() - User not found" );
return std::make_shared< ResultLogin >( this, ACCOUNT_INVALID, L"" );
}
if( m_username.empty() || m_password.empty() ) if( m_username.empty() || m_password.empty() )
{ {
Log::Error( "RequestLogin::ProcessRequest() - Username or password is empty" ); Log::Error( "RequestLogin::ProcessRequest() - Username or password is empty" );
return std::make_shared< ResultLogin >( this, LOGIN_REPLY::NOT_EXIST, L"" ); return std::make_shared< ResultLogin >( this, ACCOUNT_INVALID, L"" );
} }
if( user->m_clientType == RealmClientType::CHAMPIONS_OF_NORRATH ) if( user->m_gameType == RealmGameType::CHAMPIONS_OF_NORRATH )
{ {
if( m_username == L"foo" && m_password == L"bar" ) return ProcessLoginCON( user );
{
// Retail CoN does not use any login information.
Log::Debug( "RequestLogin : Champions of Norrath v2.0" );
}
else
{
// Network Beta CoN uses login information, but it's invalid because of version 2.0.
Log::Debug( "RequestLogin : Champions of Norrath v1.0" );
// TODO: Either block this, or add support for the network beta.
return std::make_shared< ResultLogin >( this, LOGIN_REPLY::NOT_EXIST, L"" );
}
} }
else else
{ {
// Return to Arms uses login information. return ProcessLoginRTA( user );
Log::Debug( "RequestLogin : Return to Arms" );
} }
return std::make_shared< ResultLogin >( this, LOGIN_REPLY::SUCCESS, user->m_sessionId );
} }
ResultLogin::ResultLogin( GenericRequest *request, int32_t reply, std::wstring sessionId ) : GenericResponse( *request ) ResultLogin::ResultLogin( GenericRequest *request, int32_t reply, std::wstring sessionId ) : GenericResponse( *request )
@@ -52,10 +90,10 @@ ResultLogin::ResultLogin( GenericRequest *request, int32_t reply, std::wstring s
m_sessionId = sessionId; m_sessionId = sessionId;
} }
ByteStream &ResultLogin::Serialize() ByteBuffer &ResultLogin::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( m_reply ); m_stream.write_u32( m_reply );
m_stream.write_encrypted_utf16( m_sessionId ); m_stream.write_encrypted_utf16( m_sessionId );

View File

@@ -1,10 +1,10 @@
#pragma once #pragma once
// Account Login is used in the Network Beta for CoN. #include <memory>
// In the retail version, the game simply logs in with #include <string>
// "foo" and "bar" as the username and password.
// #include "../GenericNetRequest.h"
// A unique Session ID is generated and assigned to the player. #include "../GenericNetResponse.h"
class RequestLogin : public GenericRequest class RequestLogin : public GenericRequest
{ {
@@ -12,11 +12,11 @@ private:
enum LOGIN_REPLY { enum LOGIN_REPLY {
SUCCESS = 0, SUCCESS = 0,
FATAL_ERROR, FATAL_ERROR,
NOT_EXIST, ACCOUNT_INVALID = 4,
}; };
std::wstring m_username; std::string m_username;
std::wstring m_password; std::string m_password;
std::wstring m_sessionId; std::wstring m_sessionId;
public: public:
@@ -25,8 +25,11 @@ public:
return std::make_unique< RequestLogin >(); return std::make_unique< RequestLogin >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
sptr_generic_response ProcessLoginCON( sptr_user user );
sptr_generic_response ProcessLoginRTA( sptr_user user );
}; };
class ResultLogin : public GenericResponse { class ResultLogin : public GenericResponse {
@@ -36,5 +39,5 @@ private:
public: public:
ResultLogin( GenericRequest *request, int32_t reply, std::wstring sessionId ); ResultLogin( GenericRequest *request, int32_t reply, std::wstring sessionId );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -1,16 +1,20 @@
#include "../../global_define.h"
#include "RequestLogout.h" #include "RequestLogout.h"
#include "../../Game/RealmUserManager.h"
#include "../../logging.h"
void RequestLogout::Deserialize( sptr_byte_stream stream ) void RequestLogout::Deserialize( sptr_byte_stream stream )
{ {
DeserializeHeader( stream ); DeserializeHeader( stream );
m_sessionId = stream->read_encrypted_utf16(); m_sessionId = stream->read_encrypted_utf16();
} }
sptr_generic_response RequestLogout::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestLogout::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
RealmUserManager::Get().RemoveUser( socket );
Log::Debug( "[%S] Logout", m_sessionId.c_str() ); Log::Debug( "[%S] Logout", m_sessionId.c_str() );
return std::make_shared< ResultLogout >( this, 0 ); return std::make_shared< ResultLogout >( this, 0 );
@@ -21,10 +25,10 @@ ResultLogout::ResultLogout( GenericRequest *request, int32_t reply ) : GenericRe
m_reply = reply; m_reply = reply;
} }
ByteStream &ResultLogout::Serialize() ByteBuffer &ResultLogout::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( m_reply ); m_stream.write_u32( m_reply );
return m_stream; return m_stream;

View File

@@ -1,5 +1,11 @@
#pragma once #pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class RequestLogout : public GenericRequest class RequestLogout : public GenericRequest
{ {
private: private:
@@ -10,7 +16,7 @@ public:
{ {
return std::make_unique< RequestLogout >(); return std::make_unique< RequestLogout >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
@@ -19,5 +25,5 @@ private:
int32_t m_reply; int32_t m_reply;
public: public:
ResultLogout( GenericRequest *request, int32_t reply ); ResultLogout( GenericRequest *request, int32_t reply );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -1,6 +1,12 @@
#include "../../global_define.h"
#include "RequestMatchGame.h" #include "RequestMatchGame.h"
#include <format>
#include "../../Common/Constant.h"
#include "../../Game/RealmUserManager.h"
#include "../../Game/GameSessionManager.h"
#include "../../Game/RealmUser.h"
void RequestMatchGame::Deserialize( sptr_byte_stream stream ) void RequestMatchGame::Deserialize( sptr_byte_stream stream )
{ {
DeserializeHeader( stream ); DeserializeHeader( stream );
@@ -33,54 +39,59 @@ void RequestMatchGame::Deserialize( sptr_byte_stream stream )
auto unknown_h = stream->read_u32(); auto unknown_h = stream->read_u32();
} }
sptr_generic_response RequestMatchGame::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestMatchGame::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
return std::make_shared< ResultMatchGame >( this ); return std::make_shared< ResultMatchGame >( this, socket->remote_ip );
} }
ResultMatchGame::ResultMatchGame( GenericRequest *request ) : GenericResponse( *request ) ResultMatchGame::ResultMatchGame( GenericRequest *request, std::string userIp ) : GenericResponse( *request )
{ {
m_userIp = userIp;
} }
ByteStream &ResultMatchGame::Serialize() ByteBuffer &ResultMatchGame::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( 0 ); m_stream.write_u32( 0 );
auto publicGameList = GameSessionManager::Get().GetAvailableGameSessionList( RealmClientType::CHAMPIONS_OF_NORRATH ); const auto publicGameList = GameSessionManager::Get().GetAvailableGameSessionList( RealmGameType::CHAMPIONS_OF_NORRATH );
auto publicGameCount = static_cast< uint32_t >( publicGameList.size() ); const auto publicGameCount = static_cast< uint32_t >( publicGameList.size() );
m_stream.write_u32( publicGameCount ); m_stream.write_u32( publicGameCount );
{ {
for( auto &game : publicGameList ) for( const auto &game : publicGameList )
m_stream.write_utf16( std::format( L"{}:{}", game->m_hostExternalAddr, game->m_hostPort ) ); {
if( m_userIp == game->m_hostExternalAddr )
m_stream.write_utf16( std::format( L"{}:{}", Util::UTF8ToWide( game->m_hostLocalAddr ), game->m_hostPort ) );
else
m_stream.write_utf16( std::format( L"{}:{}", Util::UTF8ToWide( game->m_hostExternalAddr ), game->m_hostPort ) );
}
} }
m_stream.write_u32( publicGameCount ); m_stream.write_u32( publicGameCount );
{ {
for( auto &game : publicGameList ) for( const auto &game : publicGameList )
m_stream.write_utf16( game->m_gameName ); m_stream.write_utf16( game->m_gameName );
} }
m_stream.write_u32( publicGameCount ); m_stream.write_u32( publicGameCount );
{ {
for( auto &game : publicGameList ) for( const auto &game : publicGameList )
m_stream.write_utf16( game->m_ownerName ); m_stream.write_utf16( game->m_ownerName );
} }
m_stream.write_u32( publicGameCount ); m_stream.write_u32( publicGameCount );
{ {
for( auto &game : publicGameList ) for( const auto &game : publicGameList )
m_stream.write_u32( game->m_gameIndex ); m_stream.write_u32( game->m_gameIndex );
} }
m_stream.write_u32( publicGameCount ); m_stream.write_u32( publicGameCount );
{ {
for( auto &game : publicGameList ) for( const auto &game : publicGameList )
m_stream.write_utf8( game->m_gameData ); m_stream.write_utf8( game->m_gameData );
} }

View File

@@ -1,5 +1,8 @@
#pragma once #pragma once
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class RequestMatchGame : public GenericRequest class RequestMatchGame : public GenericRequest
{ {
private: private:
@@ -10,12 +13,16 @@ public:
{ {
return std::make_unique< RequestMatchGame >(); return std::make_unique< RequestMatchGame >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override;
sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
class ResultMatchGame : public GenericResponse { class ResultMatchGame : public GenericResponse {
private:
std::string m_userIp;
public: public:
ResultMatchGame( GenericRequest *request ); ResultMatchGame( GenericRequest *request, std::string userIp );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -0,0 +1,49 @@
#include "RequestStartGame.h"
#include "../../Game/RealmUserManager.h"
#include "../../Game/GameSessionManager.h"
#include "../../Game/RealmUser.h"
#include "../../logging.h"
void RequestStartGame::Deserialize( sptr_byte_stream stream )
{
DeserializeHeader( stream );
auto sessionId = stream->read_encrypted_utf16();
}
sptr_generic_response RequestStartGame::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{
Deserialize( stream );
auto user = RealmUserManager::Get().FindUserBySocket( socket );
if( user == nullptr )
{
return std::make_shared< ResultStartGame >( this, FATAL_ERROR );
}
auto session = GameSessionManager::Get().FindGame( user->m_gameId, user->m_gameType );
if( session == nullptr )
{
Log::Error( "Game session not found! [%d]", user->m_gameId );
return std::make_shared< ResultStartGame >( this, FATAL_ERROR );
}
GameSessionManager::Get().RequestStart(user);
return std::make_shared< ResultStartGame >( this, SUCCESS );
}
ResultStartGame::ResultStartGame( GenericRequest *request, int32_t reply ) : GenericResponse( *request )
{
m_reply = reply;
}
ByteBuffer& ResultStartGame::Serialize()
{
m_stream.write_u16( m_packetId );
m_stream.write_u32( m_trackId );
m_stream.write_u32( m_reply );
return m_stream;
}

View File

@@ -0,0 +1,36 @@
#pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class RequestStartGame : public GenericRequest
{
private:
std::vector< uint8_t > m_data;
enum CREATE_REPLY {
SUCCESS = 0,
FATAL_ERROR,
GENERAL_ERROR,
};
public:
static std::unique_ptr< RequestStartGame > Create()
{
return std::make_unique< RequestStartGame >();
}
sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override;
};
class ResultStartGame : public GenericResponse {
private:
int32_t m_reply;
public:
ResultStartGame( GenericRequest *request, int32_t reply );
ByteBuffer &Serialize();
};

View File

@@ -1,6 +1,8 @@
#include "../../global_define.h"
#include "RequestTouchSession.h" #include "RequestTouchSession.h"
#include "../../Game/RealmUserManager.h"
#include "../../logging.h"
void RequestTouchSession::Deserialize( sptr_byte_stream stream ) void RequestTouchSession::Deserialize( sptr_byte_stream stream )
{ {
DeserializeHeader( stream ); DeserializeHeader( stream );
@@ -8,10 +10,18 @@ void RequestTouchSession::Deserialize( sptr_byte_stream stream )
m_sessionId = stream->read_encrypted_utf16(); m_sessionId = stream->read_encrypted_utf16();
} }
sptr_generic_response RequestTouchSession::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestTouchSession::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
auto user = RealmUserManager::Get().FindUserBySocket( socket );
if( user == nullptr )
{
Log::Error( "User not found! [%S]", m_sessionId.c_str() );
return std::make_shared< ResultTouchSession >( this );
}
return std::make_shared< ResultTouchSession >( this ); return std::make_shared< ResultTouchSession >( this );
} }
@@ -20,10 +30,10 @@ ResultTouchSession::ResultTouchSession( GenericRequest *request ) : GenericRespo
} }
ByteStream &ResultTouchSession::Serialize() ByteBuffer &ResultTouchSession::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( 0 ); m_stream.write_u32( 0 );
return m_stream; return m_stream;

View File

@@ -1,5 +1,11 @@
#pragma once #pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class RequestTouchSession : public GenericRequest class RequestTouchSession : public GenericRequest
{ {
private: private:
@@ -10,12 +16,12 @@ public:
{ {
return std::make_unique< RequestTouchSession >(); return std::make_unique< RequestTouchSession >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
class ResultTouchSession : public GenericResponse { class ResultTouchSession : public GenericResponse {
public: public:
ResultTouchSession( GenericRequest *request ); ResultTouchSession( GenericRequest *request );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -1,6 +1,10 @@
#include "../../global_define.h"
#include "RequestUpdateGameData.h" #include "RequestUpdateGameData.h"
#include "../../Game/RealmUserManager.h"
#include "../../Game/GameSessionManager.h"
#include "../../Game/RealmUser.h"
#include "../../logging.h"
void RequestUpdateGameData::Deserialize( sptr_byte_stream stream ) void RequestUpdateGameData::Deserialize( sptr_byte_stream stream )
{ {
DeserializeHeader( stream ); DeserializeHeader( stream );
@@ -9,11 +13,19 @@ void RequestUpdateGameData::Deserialize( sptr_byte_stream stream )
m_gameData = stream->read_utf8(); m_gameData = stream->read_utf8();
} }
sptr_generic_response RequestUpdateGameData::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response RequestUpdateGameData::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
auto gameSession = GameSessionManager::Get().FindGame( user->m_gameId ); auto user = RealmUserManager::Get().FindUserBySocket( socket );
if( user == nullptr )
{
Log::Error( "User not found! [%S]", m_sessionId.c_str() );
return std::make_shared< ResultUpdateGameData >( this );
}
auto gameSession = GameSessionManager::Get().FindGame( user->m_gameId, user->m_gameType );
if( gameSession == nullptr ) if( gameSession == nullptr )
{ {
@@ -58,10 +70,10 @@ ResultUpdateGameData::ResultUpdateGameData( GenericRequest *request ) : GenericR
} }
ByteStream &ResultUpdateGameData::Serialize() ByteBuffer &ResultUpdateGameData::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( 0 ); m_stream.write_u32( 0 );
return m_stream; return m_stream;

View File

@@ -1,5 +1,11 @@
#pragma once #pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class RequestUpdateGameData : public GenericRequest class RequestUpdateGameData : public GenericRequest
{ {
private: private:
@@ -11,12 +17,12 @@ public:
{ {
return std::make_unique< RequestUpdateGameData >(); return std::make_unique< RequestUpdateGameData >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
class ResultUpdateGameData : public GenericResponse { class ResultUpdateGameData : public GenericResponse {
public: public:
ResultUpdateGameData( GenericRequest *request ); ResultUpdateGameData( GenericRequest *request );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -1,27 +1,67 @@
#include "../../global_define.h"
#include "Request_5D.h" #include "Request_5D.h"
#include "../../Game/RealmUserManager.h"
#include "../../Game/RealmUser.h"
#include "../../Database/Database.h"
#include "../../logging.h"
#include "../../Common/RLEZ.hpp"
void Request_5D::Deserialize( sptr_byte_stream stream ) void Request_5D::Deserialize( sptr_byte_stream stream )
{ {
DeserializeHeader( stream ); DeserializeHeader( stream );
auto sessionId = stream->read_encrypted_utf16();
auto length = stream->read_u32();
m_data = stream->read_bytes( length );
auto unknown = stream->read_u32();
} }
sptr_generic_response Request_5D::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response Request_5D::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
return std::make_shared< Result_5D >( this ); auto user = RealmUserManager::Get().FindUserBySocket( socket );
if( user == nullptr )
{
return std::make_shared< Result_5D >( this, FATAL_ERROR );
}
//auto unpacked = RLEZ::Decompress( m_data );
//Log::PacketToFile( "5D_data_comp", m_data, m_data.size());
//Log::PacketToFile( "5D_data_decomp", unpacked, unpacked.size());
//auto &myCharacter = user->m_character;
//if( nullptr == myCharacter )
//{
// return std::make_shared< Result_5D >( this, FATAL_ERROR );
//}
//myCharacter->SetInventoryData( m_data );
//auto result = Database::Get().SaveInventory( user->m_accountId, user->m_characterId, m_data );
//if( !result )
//{
// Log::Error( "Failed to save inventory for account ID: " + std::to_string( user->m_accountId ) + ", character ID: " + std::to_string( user->m_characterId ) );
// return std::make_shared< Result_5D >( this, FATAL_ERROR );
//}
return std::make_shared< Result_5D >( this, SUCCESS );
} }
Result_5D::Result_5D( GenericRequest *request ) : GenericResponse( *request ) Result_5D::Result_5D( GenericRequest *request, int32_t reply ) : GenericResponse( *request )
{ {
m_reply = reply;
} }
ByteStream&Result_5D::Serialize() ByteBuffer& Result_5D::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( 0 ); m_stream.write_u32( m_reply );
return m_stream; return m_stream;
} }

View File

@@ -1,19 +1,36 @@
#pragma once #pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class Request_5D : public GenericRequest class Request_5D : public GenericRequest
{ {
private:
std::vector< uint8_t > m_data;
enum CREATE_REPLY {
SUCCESS = 0,
FATAL_ERROR,
GENERAL_ERROR,
};
public: public:
static std::unique_ptr< Request_5D > Create() static std::unique_ptr< Request_5D > Create()
{ {
return std::make_unique< Request_5D >(); return std::make_unique< Request_5D >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
class Result_5D : public GenericResponse { class Result_5D : public GenericResponse {
private:
int32_t m_reply;
public: public:
Result_5D( GenericRequest *request ); Result_5D( GenericRequest *request, int32_t reply );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };

View File

@@ -0,0 +1,43 @@
#include "Request_5F.h"
#include "../../Game/RealmUserManager.h"
#include "../../Game/RealmUser.h"
#include "../../Database/Database.h"
#include "../../logging.h"
void Request_5F::Deserialize( sptr_byte_stream stream )
{
DeserializeHeader( stream );
auto sessionId_a = stream->read_encrypted_utf16();
auto sessionId_b = stream->read_encrypted_utf16();
}
sptr_generic_response Request_5F::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{
Deserialize( stream );
auto user = RealmUserManager::Get().FindUserBySocket( socket );
if( user == nullptr )
{
return std::make_shared< Result_5F >( this, FATAL_ERROR );
}
Log::Debug( "Request_5F From user ID : %d", user->m_accountId );
return std::make_shared< Result_5F >( this, SUCCESS );
}
Result_5F::Result_5F( GenericRequest *request, int32_t reply ) : GenericResponse( *request )
{
m_reply = reply;
}
ByteBuffer& Result_5F::Serialize()
{
m_stream.write_u16( m_packetId );
m_stream.write_u32( m_trackId );
m_stream.write_u32( m_reply );
return m_stream;
}

View File

@@ -0,0 +1,36 @@
#pragma once
#include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class Request_5F : public GenericRequest
{
private:
std::vector< uint8_t > m_data;
enum CREATE_REPLY {
SUCCESS = 0,
FATAL_ERROR,
GENERAL_ERROR,
};
public:
static std::unique_ptr< Request_5F > Create()
{
return std::make_unique< Request_5F >();
}
sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override;
};
class Result_5F : public GenericResponse {
private:
int32_t m_reply;
public:
Result_5F( GenericRequest *request, int32_t reply );
ByteBuffer &Serialize();
};

View File

@@ -1,4 +1,3 @@
#include "../../global_define.h"
#include "Request_61.h" #include "Request_61.h"
void Request_61::Deserialize( sptr_byte_stream stream ) void Request_61::Deserialize( sptr_byte_stream stream )
@@ -6,7 +5,7 @@ void Request_61::Deserialize( sptr_byte_stream stream )
DeserializeHeader( stream ); DeserializeHeader( stream );
} }
sptr_generic_response Request_61::ProcessRequest( sptr_user user, sptr_byte_stream stream ) sptr_generic_response Request_61::ProcessRequest( sptr_socket socket, sptr_byte_stream stream )
{ {
Deserialize( stream ); Deserialize( stream );
@@ -20,11 +19,22 @@ Result_61::Result_61( GenericRequest *request ) : GenericResponse( *request )
{ {
} }
ByteStream&Result_61::Serialize() ByteBuffer&Result_61::Serialize()
{ {
m_stream.write_u16( m_packetId ); m_stream.write_u16( m_packetId );
m_stream.write_u32( m_requestId ); m_stream.write_u32( m_trackId );
m_stream.write_u32( 0 ); m_stream.write_u32( 0 );
// Friends
m_stream.write_u32(1);
m_stream.write_utf16(L"String_1");
m_stream.write_u32(1);
m_stream.write_utf16(L"String_2");
// Ignore
m_stream.write_u32(1);
m_stream.write_utf16(L"String_3");
return m_stream; return m_stream;
} }

View File

@@ -1,6 +1,10 @@
#pragma once #pragma once
// Potentially character data. #include <memory>
#include <string>
#include "../GenericNetRequest.h"
#include "../GenericNetResponse.h"
class Request_61 : public GenericRequest class Request_61 : public GenericRequest
{ {
@@ -10,12 +14,12 @@ public:
return std::make_unique< Request_61 >(); return std::make_unique< Request_61 >();
} }
sptr_generic_response ProcessRequest( sptr_user user, sptr_byte_stream stream ) override; sptr_generic_response ProcessRequest( sptr_socket socket, sptr_byte_stream stream ) override;
void Deserialize( sptr_byte_stream stream ) override; void Deserialize( sptr_byte_stream stream ) override;
}; };
class Result_61 : public GenericResponse { class Result_61 : public GenericResponse {
public: public:
Result_61( GenericRequest *request ); Result_61( GenericRequest *request );
ByteStream &Serialize(); ByteBuffer &Serialize();
}; };