From 8cda3b5890af4254588de059f0a3756941d0c5fc Mon Sep 17 00:00:00 2001 From: MayaTheShy Date: Sun, 9 Nov 2025 23:28:41 -0500 Subject: [PATCH] feat: update domain handshake process and system info format to match official client --- src/OverteClient.cpp | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/OverteClient.cpp b/src/OverteClient.cpp index a914717..fa806bf 100644 --- a/src/OverteClient.cpp +++ b/src/OverteClient.cpp @@ -259,11 +259,11 @@ bool OverteClient::connect() { return false; } - // Send domain connect request to initiate handshake - // Start with domain list request - simpler packet + // Send domain handshake - official client sends DomainListRequest FIRST + // This is a simpler packet that doesn't require full credentials std::cout << "[OverteClient] Initiating domain handshake..." << std::endl; - sendDomainConnectRequest(); sendDomainListRequest(); + sendDomainConnectRequest(); m_useSimulation = (std::getenv("STARWORLD_SIMULATE") != nullptr); if (m_useSimulation) { @@ -1206,7 +1206,8 @@ void OverteClient::sendDomainConnectRequest() { qs.writeQUuidFromString(m_sessionUUID); // 5. Compressed system info (QByteArray) - std::string sysJson = "{\"computer\":{\"OS\":\"Linux\"},\"cpus\":[{\"model\":\"Stardust\"}],\"memory\":4096,\"nics\":[],\"gpus\":[],\"displays\":[]}"; + // Match official client format to avoid any filtering + std::string sysJson = "{\"computer\":{\"OS\":\"Linux\",\"vendor\":\"PC\"},\"cpus\":[{\"model\":\"Intel Core\"}],\"memory\":8192,\"nics\":[],\"gpus\":[],\"displays\":[]}"; std::vector sysBytes(sysJson.begin(), sysJson.end()); auto sysCompressed = qCompressLike(sysBytes, Z_BEST_SPEED); qs.writeQByteArray(sysCompressed); @@ -1223,10 +1224,8 @@ void OverteClient::sendDomainConnectRequest() { qs.writeUInt64BE(static_cast(nowUs)); // 9. Node type / owner type (NodeType_t) - // Use Unassigned (1) for regular clients, NOT 'I' (Agent)! - // NodeType::Agent = 'I' is for server-side bots/scripts - // NodeType::Unassigned = 1 is for regular Interface clients - qs.writeUInt8(1); // Unassigned = regular client + // Interface clients use NodeType::Agent = 'I' (confirmed from Application_Setup.cpp:338) + qs.writeUInt8(static_cast('I')); // Agent (yes, Interface uses Agent type!) // Determine local UDP socket address/port (bind address if needed) uint32_t localIPv4 = 0x7F000001; // 127.0.0.1 fallback @@ -1694,8 +1693,8 @@ void OverteClient::sendAvatarIdentity() { // 1. Identity sequence number writeU16BE(m_avatarIdentitySequence++); - // 2. Display name - std::string displayName = m_username.empty() ? "StarworldClient" : m_username; + // 2. Display name (use empty to match typical client behavior - server assigns default) + std::string displayName = m_username.empty() ? "" : m_username; writeQString(displayName); // 3. Avatar URL (empty for now - uses default avatar) @@ -1716,6 +1715,11 @@ void OverteClient::sendAvatarIdentity() { if (s > 0) { m_identitySent = true; std::cout << "[OverteClient] Sent AvatarIdentity (" << s << " bytes, name=" << displayName << ")" << std::endl; + std::cout << "[OverteClient] AvatarIdentity hex (first 64 bytes): "; + for (size_t i = 0; i < std::min(size_t(64), data.size()); ++i) { + printf("%02x ", data[i]); + } + std::cout << std::endl; } else { std::cerr << "[OverteClient] Failed to send AvatarIdentity: " << strerror(errno) << std::endl; }