From ca23b8612e4667b6898b8959265912550db7e05a Mon Sep 17 00:00:00 2001 From: KimLS Date: Mon, 30 Mar 2026 21:54:15 -0700 Subject: [PATCH] WIP world select packets --- loginserver/client.cpp | 61 +++++++++++++++------- loginserver/world_server.cpp | 99 +++++++++++++++++++++++++----------- 2 files changed, 112 insertions(+), 48 deletions(-) diff --git a/loginserver/client.cpp b/loginserver/client.cpp index 3afa3211d..178c17c1c 100644 --- a/loginserver/client.cpp +++ b/loginserver/client.cpp @@ -345,28 +345,55 @@ void Client::SendFailedLogin() m_stored_username.clear(); m_stored_password.clear(); - // unencrypted - LoginBaseMessage h{}; - h.sequence = m_login_base_message.sequence; // login (3) - h.encrypt_type = m_login_base_message.encrypt_type; + if (m_client_version == cv_steam_latest) { + // unencrypted + LoginBaseMessage h{}; + h.sequence = m_login_base_message.sequence; // login (3) + h.encrypt_type = m_login_base_message.encrypt_type; - // encrypted - PlayerLoginReply r{}; - r.base_reply.success = false; - r.base_reply.error_str_id = 105; // Error - The username and/or password were not valid + // encrypted + PlayerLoginReplySteamLatest r{}; + r.base_reply.success = false; + r.base_reply.error_str_id = 105; // Error - The username and/or password were not valid - char encrypted_buffer[80] = {0}; - auto rc = eqcrypt_block((const char *) &r, sizeof(r), encrypted_buffer, 1); - if (rc == nullptr) { - LogDebug("Failed to encrypt eqcrypt block for failed login"); + char encrypted_buffer[80] = { 0 }; + auto rc = eqcrypt_block((const char*)&r, sizeof(r), encrypted_buffer, 1); + if (rc == nullptr) { + LogDebug("Failed to encrypt eqcrypt block for failed login"); + } + + constexpr int outsize = sizeof(LoginBaseMessage) + sizeof(encrypted_buffer); + EQApplicationPacket outapp(OP_LoginAccepted, outsize); + outapp.WriteData(&h, sizeof(h)); + outapp.WriteData(&encrypted_buffer, sizeof(encrypted_buffer)); + + m_connection->QueuePacket(&outapp); } + else { + // unencrypted + LoginBaseMessage h{}; + h.sequence = m_login_base_message.sequence; // login (3) + h.encrypt_type = m_login_base_message.encrypt_type; - constexpr int outsize = sizeof(LoginBaseMessage) + sizeof(encrypted_buffer); - EQApplicationPacket outapp(OP_LoginAccepted, outsize); - outapp.WriteData(&h, sizeof(h)); - outapp.WriteData(&encrypted_buffer, sizeof(encrypted_buffer)); + // encrypted + PlayerLoginReply r{}; + r.base_reply.success = false; + r.base_reply.error_str_id = 105; // Error - The username and/or password were not valid - m_connection->QueuePacket(&outapp); + char encrypted_buffer[80] = { 0 }; + auto rc = eqcrypt_block((const char*)&r, sizeof(r), encrypted_buffer, 1); + if (rc == nullptr) { + LogDebug("Failed to encrypt eqcrypt block for failed login"); + } + + constexpr int outsize = sizeof(LoginBaseMessage) + sizeof(encrypted_buffer); + EQApplicationPacket outapp(OP_LoginAccepted, outsize); + outapp.WriteData(&h, sizeof(h)); + outapp.WriteData(&encrypted_buffer, sizeof(encrypted_buffer)); + + m_connection->QueuePacket(&outapp); + } + m_client_status = cs_failed_to_login; } diff --git a/loginserver/world_server.cpp b/loginserver/world_server.cpp index 90c5346ce..5ce591139 100644 --- a/loginserver/world_server.cpp +++ b/loginserver/world_server.cpp @@ -689,19 +689,17 @@ bool WorldServer::ValidateWorldServerAdminLogin( void WorldServer::SerializeForClientServerList(SerializeBuffer &out, bool use_local_ip, LSClientVersion version) const { - // see LoginClientServerData_Struct - if (use_local_ip) { - out.WriteString(GetLocalIP()); - } - else { - out.WriteString(m_remote_ip_address); - } - if (version == cv_steam_latest) { - out.WriteUInt32(9000); - } + if (use_local_ip) { + out.WriteString(GetLocalIP()); + } + else { + out.WriteString(m_remote_ip_address); + } - switch (GetServerListID()) { + out.WriteInt32(9000); // port, not currently settable in eqemu but needed for compat + + switch (GetServerListID()) { case LS::ServerType::Legends: out.WriteInt32(LS::ServerTypeFlags::Legends); break; @@ -711,35 +709,74 @@ void WorldServer::SerializeForClientServerList(SerializeBuffer &out, bool use_lo default: out.WriteInt32(LS::ServerTypeFlags::Standard); break; - } - if (version == cv_steam_latest) { - auto server_id = m_server_id; - //if this is 0, the client will not show the server in the list - out.WriteUInt32(1); - out.WriteUInt32(server_id); - } - else { + } + + out.WriteInt32(289); //unsure what this is yet out.WriteUInt32(m_server_id); - } - out.WriteString(m_server_long_name); - out.WriteString("us"); // country code - out.WriteString("en"); // language code + out.WriteString(m_server_long_name); + out.WriteString("US"); // country code + out.WriteString("EN"); // language code + out.WriteString("Standard"); + out.WriteString("This server has no description set currently."); - // 0 = Up, 1 = Down, 2 = Up, 3 = down, 4 = locked, 5 = locked(down) - if (GetStatus() < 0) { - if (GetZonesBooted() == 0) { - out.WriteInt32(LS::ServerStatusFlags::Down); + if (GetStatus() < 0) { + if (GetZonesBooted() == 0) { + out.WriteInt32(LS::ServerStatusFlags::Down); + } + else { + out.WriteInt32(LS::ServerStatusFlags::Locked); + } } else { - out.WriteInt32(LS::ServerStatusFlags::Locked); + out.WriteInt32(LS::ServerStatusFlags::Up); } + + out.WriteUInt32(GetPlayersOnline()); + out.WriteInt32(31); //expansions + out.WriteInt32(0); //truebox } else { - out.WriteInt32(LS::ServerStatusFlags::Up); - } + // see LoginClientServerData_Struct + if (use_local_ip) { + out.WriteString(GetLocalIP()); + } + else { + out.WriteString(m_remote_ip_address); + } + + switch (GetServerListID()) { + case LS::ServerType::Legends: + out.WriteInt32(LS::ServerTypeFlags::Legends); + break; + case LS::ServerType::Preferred: + out.WriteInt32(LS::ServerTypeFlags::Preferred); + break; + default: + out.WriteInt32(LS::ServerTypeFlags::Standard); + break; + } - out.WriteUInt32(GetPlayersOnline()); + out.WriteUInt32(m_server_id); + out.WriteString(m_server_long_name); + out.WriteString("us"); // country code + out.WriteString("en"); // language code + + // 0 = Up, 1 = Down, 2 = Up, 3 = down, 4 = locked, 5 = locked(down) + if (GetStatus() < 0) { + if (GetZonesBooted() == 0) { + out.WriteInt32(LS::ServerStatusFlags::Down); + } + else { + out.WriteInt32(LS::ServerStatusFlags::Locked); + } + } + else { + out.WriteInt32(LS::ServerStatusFlags::Up); + } + + out.WriteUInt32(GetPlayersOnline()); + } } void WorldServer::FormatWorldServerName(char *name, int8 server_list_type)