diff --git a/src/glue/CGlueMgr.cpp b/src/glue/CGlueMgr.cpp index fdacbab..a80fec1 100644 --- a/src/glue/CGlueMgr.cpp +++ b/src/glue/CGlueMgr.cpp @@ -617,16 +617,21 @@ void CGlueMgr::PollEnterWorld() { CGlueMgr::m_showedDisconnect = 0; // TODO SI Logic - // TODO ClientConnection::CharacterLogin() + + // TODO TLS shenanigans with guid + ClientServices::Connection()->CharacterLogin(CGlueMgr::m_characterInfo->info.guid, 0); return; } - // TODO Get map ID and position from character info - uint32_t mapId = 0; - C3Vector position = { 0.0f, 0.0f, 0.0f }; + uint32_t mapId = CGlueMgr::m_characterInfo->info.mapID; + C3Vector position = CGlueMgr::m_characterInfo->info.position; + + // TODO TLS shenanigans with guid + // TODO first login logic (play intro M2?) CGlueMgr::Suspend(); + ClientInitializeGame(mapId, position); } diff --git a/src/net/connection/ClientConnection.cpp b/src/net/connection/ClientConnection.cpp index 6656bcf..7cdb286 100644 --- a/src/net/connection/ClientConnection.cpp +++ b/src/net/connection/ClientConnection.cpp @@ -23,6 +23,16 @@ void ClientConnection::Cancel(int32_t errorCode) { this->Complete(0, errorCode); } +void ClientConnection::CharacterLogin(uint64_t guid, int32_t a2) { + this->Initiate(COP_LOGIN_CHARACTER, 76, nullptr); + + if (this->m_connected) { + this->RequestCharacterLogin(guid, a2); + } else { + this->Cancel(4); + } +} + void ClientConnection::Cleanup() { if (this->m_cleanup) { this->m_cleanup(); diff --git a/src/net/connection/ClientConnection.hpp b/src/net/connection/ClientConnection.hpp index 4b49b9b..445db0e 100644 --- a/src/net/connection/ClientConnection.hpp +++ b/src/net/connection/ClientConnection.hpp @@ -30,6 +30,7 @@ class ClientConnection : public RealmConnection { void AccountLogin_Finish(int32_t authResult); void AccountLogin_Queued(); void Cancel(int32_t errorCode); + void CharacterLogin(uint64_t guid, int32_t a2); void Cleanup(); void Complete(int32_t result, int32_t errorCode); void Connect(); diff --git a/src/net/connection/RealmConnection.cpp b/src/net/connection/RealmConnection.cpp index ab6295d..5f64666 100644 --- a/src/net/connection/RealmConnection.cpp +++ b/src/net/connection/RealmConnection.cpp @@ -294,6 +294,17 @@ void RealmConnection::RequestCharacterEnum() { this->Send(&msg); } +void RealmConnection::RequestCharacterLogin(uint64_t guid, int32_t a2) { + CDataStore msg; + + msg.Put(static_cast(CMSG_PLAYER_LOGIN)); + msg.Put(guid); + + msg.Finalize(); + + this->Send(&msg); +} + void RealmConnection::SetSelectedRealm(uint32_t a2, uint32_t a3, uint32_t a4) { // TODO } diff --git a/src/net/connection/RealmConnection.hpp b/src/net/connection/RealmConnection.hpp index 2b817ea..b4eaa10 100644 --- a/src/net/connection/RealmConnection.hpp +++ b/src/net/connection/RealmConnection.hpp @@ -52,6 +52,7 @@ class RealmConnection : public NetClient { int32_t HandleAuthResponse(uint32_t msgId, uint32_t time, CDataStore* msg); int32_t HandleCharEnum(uint32_t msgId, uint32_t time, CDataStore* msg); void RequestCharacterEnum(); + void RequestCharacterLogin(uint64_t guid, int32_t a2); void SetSelectedRealm(uint32_t a2, uint32_t a3, uint32_t a4); };