WIP world select packets

This commit is contained in:
KimLS
2026-03-30 21:54:15 -07:00
parent 485ae4809d
commit ca23b8612e
2 changed files with 112 additions and 48 deletions
+45 -18
View File
@@ -345,28 +345,55 @@ void Client::SendFailedLogin()
m_stored_username.clear(); m_stored_username.clear();
m_stored_password.clear(); m_stored_password.clear();
// unencrypted if (m_client_version == cv_steam_latest) {
LoginBaseMessage h{}; // unencrypted
h.sequence = m_login_base_message.sequence; // login (3) LoginBaseMessage h{};
h.encrypt_type = m_login_base_message.encrypt_type; h.sequence = m_login_base_message.sequence; // login (3)
h.encrypt_type = m_login_base_message.encrypt_type;
// encrypted // encrypted
PlayerLoginReply r{}; PlayerLoginReplySteamLatest r{};
r.base_reply.success = false; r.base_reply.success = false;
r.base_reply.error_str_id = 105; // Error - The username and/or password were not valid r.base_reply.error_str_id = 105; // Error - The username and/or password were not valid
char encrypted_buffer[80] = {0}; char encrypted_buffer[80] = { 0 };
auto rc = eqcrypt_block((const char *) &r, sizeof(r), encrypted_buffer, 1); auto rc = eqcrypt_block((const char*)&r, sizeof(r), encrypted_buffer, 1);
if (rc == nullptr) { if (rc == nullptr) {
LogDebug("Failed to encrypt eqcrypt block for failed login"); 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;
// encrypted
PlayerLoginReply 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");
}
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);
} }
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; m_client_status = cs_failed_to_login;
} }
+68 -31
View File
@@ -689,19 +689,17 @@ bool WorldServer::ValidateWorldServerAdminLogin(
void WorldServer::SerializeForClientServerList(SerializeBuffer &out, bool use_local_ip, LSClientVersion version) const 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) { 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: case LS::ServerType::Legends:
out.WriteInt32(LS::ServerTypeFlags::Legends); out.WriteInt32(LS::ServerTypeFlags::Legends);
break; break;
@@ -711,35 +709,74 @@ void WorldServer::SerializeForClientServerList(SerializeBuffer &out, bool use_lo
default: default:
out.WriteInt32(LS::ServerTypeFlags::Standard); out.WriteInt32(LS::ServerTypeFlags::Standard);
break; break;
} }
if (version == cv_steam_latest) {
auto server_id = m_server_id; out.WriteInt32(289); //unsure what this is yet
//if this is 0, the client will not show the server in the list
out.WriteUInt32(1);
out.WriteUInt32(server_id);
}
else {
out.WriteUInt32(m_server_id); out.WriteUInt32(m_server_id);
}
out.WriteString(m_server_long_name); out.WriteString(m_server_long_name);
out.WriteString("us"); // country code out.WriteString("US"); // country code
out.WriteString("en"); // language 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 (GetStatus() < 0) { if (GetZonesBooted() == 0) {
if (GetZonesBooted() == 0) { out.WriteInt32(LS::ServerStatusFlags::Down);
out.WriteInt32(LS::ServerStatusFlags::Down); }
else {
out.WriteInt32(LS::ServerStatusFlags::Locked);
}
} }
else { else {
out.WriteInt32(LS::ServerStatusFlags::Locked); out.WriteInt32(LS::ServerStatusFlags::Up);
} }
out.WriteUInt32(GetPlayersOnline());
out.WriteInt32(31); //expansions
out.WriteInt32(0); //truebox
} }
else { else {
out.WriteInt32(LS::ServerStatusFlags::Up); // see LoginClientServerData_Struct
} if (use_local_ip) {
out.WriteString(GetLocalIP());
}
else {
out.WriteString(m_remote_ip_address);
}
out.WriteUInt32(GetPlayersOnline()); 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(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) void WorldServer::FormatWorldServerName(char *name, int8 server_list_type)