Clean up ClientReady packet handling

fixes #12073
This commit is contained in:
sfan5 2022-02-14 21:01:42 +01:00
parent 5d0b18a0d0
commit c31b301722
3 changed files with 38 additions and 47 deletions

@ -380,56 +380,48 @@ void Server::handleCommand_ClientReady(NetworkPacket* pkt)
{ {
session_t peer_id = pkt->getPeerId(); session_t peer_id = pkt->getPeerId();
PlayerSAO* playersao = StageTwoClientInit(peer_id); // decode all information first
u8 major_ver, minor_ver, patch_ver, reserved;
u16 formspec_ver = 1; // v1 for clients older than 5.1.0-dev
std::string full_ver;
if (playersao == NULL) { *pkt >> major_ver >> minor_ver >> patch_ver >> reserved >> full_ver;
errorstream << "TOSERVER_CLIENT_READY stage 2 client init failed " if (pkt->getRemainingBytes() >= 2)
*pkt >> formspec_ver;
m_clients.setClientVersion(peer_id, major_ver, minor_ver, patch_ver,
full_ver);
// Emerge player
PlayerSAO* playersao = StageTwoClientInit(peer_id);
if (!playersao) {
errorstream << "Server: stage 2 client init failed "
"peer_id=" << peer_id << std::endl; "peer_id=" << peer_id << std::endl;
DisconnectPeer(peer_id); DisconnectPeer(peer_id);
return; return;
} }
playersao->getPlayer()->formspec_version = formspec_ver;
m_clients.event(peer_id, CSE_SetClientReady);
if (pkt->getSize() < 8) { // Send player list to this client
errorstream << "TOSERVER_CLIENT_READY client sent inconsistent data, " {
"disconnecting peer_id: " << peer_id << std::endl;
DisconnectPeer(peer_id);
return;
}
u8 major_ver, minor_ver, patch_ver, reserved;
std::string full_ver;
*pkt >> major_ver >> minor_ver >> patch_ver >> reserved >> full_ver;
m_clients.setClientVersion(peer_id, major_ver, minor_ver, patch_ver,
full_ver);
if (pkt->getRemainingBytes() >= 2)
*pkt >> playersao->getPlayer()->formspec_version;
const std::vector<std::string> &players = m_clients.getPlayerNames(); const std::vector<std::string> &players = m_clients.getPlayerNames();
NetworkPacket list_pkt(TOCLIENT_UPDATE_PLAYER_LIST, 0, peer_id); NetworkPacket list_pkt(TOCLIENT_UPDATE_PLAYER_LIST, 0, peer_id);
list_pkt << (u8) PLAYER_LIST_INIT << (u16) players.size(); list_pkt << (u8) PLAYER_LIST_INIT << (u16) players.size();
for (const std::string &player: players) { for (const auto &player : players)
list_pkt << player; list_pkt << player;
Send(peer_id, &list_pkt);
} }
m_clients.send(peer_id, 0, &list_pkt, true);
NetworkPacket notice_pkt(TOCLIENT_UPDATE_PLAYER_LIST, 0, PEER_ID_INEXISTENT);
// (u16) 1 + std::string represents a pseudo vector serialization representation
notice_pkt << (u8) PLAYER_LIST_ADD << (u16) 1 << std::string(playersao->getPlayer()->getName());
m_clients.sendToAll(&notice_pkt);
m_clients.event(peer_id, CSE_SetClientReady);
s64 last_login; s64 last_login;
m_script->getAuth(playersao->getPlayer()->getName(), nullptr, nullptr, &last_login); m_script->getAuth(playersao->getPlayer()->getName(), nullptr, nullptr, &last_login);
m_script->on_joinplayer(playersao, last_login); m_script->on_joinplayer(playersao, last_login);
// Send shutdown timer if shutdown has been scheduled // Send shutdown timer if shutdown has been scheduled
if (m_shutdown_state.isTimerRunning()) { if (m_shutdown_state.isTimerRunning())
SendChatMessage(peer_id, m_shutdown_state.getShutdownTimerMessage()); SendChatMessage(peer_id, m_shutdown_state.getShutdownTimerMessage());
} }
}
void Server::handleCommand_GotBlocks(NetworkPacket* pkt) void Server::handleCommand_GotBlocks(NetworkPacket* pkt)
{ {

@ -128,9 +128,7 @@ public:
void setDirty(bool dirty) { m_dirty = true; } void setDirty(bool dirty) { m_dirty = true; }
u16 protocol_version = 0; u16 protocol_version = 0;
u16 formspec_version = 0;
// v1 for clients older than 5.1.0-dev
u16 formspec_version = 1;
session_t getPeerId() const { return m_peer_id; } session_t getPeerId() const { return m_peer_id; }

@ -1104,19 +1104,20 @@ PlayerSAO* Server::StageTwoClientInit(session_t peer_id)
SendPlayerBreath(playersao); SendPlayerBreath(playersao);
/* /*
Print out action Update player list and print action
*/ */
{ {
Address addr = getPeerAddress(player->getPeerId()); NetworkPacket notice_pkt(TOCLIENT_UPDATE_PLAYER_LIST, 0, PEER_ID_INEXISTENT);
std::string ip_str = addr.serializeString(); notice_pkt << (u8) PLAYER_LIST_ADD << (u16) 1 << std::string(player->getName());
const std::vector<std::string> &names = m_clients.getPlayerNames(); m_clients.sendToAll(&notice_pkt);
}
{
std::string ip_str = getPeerAddress(player->getPeerId()).serializeString();
const auto &names = m_clients.getPlayerNames();
actionstream << player->getName() << " [" << ip_str << "] joins game. List of players: "; actionstream << player->getName() << " [" << ip_str << "] joins game. List of players: ";
for (const std::string &name : names)
for (const std::string &name : names) {
actionstream << name << " "; actionstream << name << " ";
}
actionstream << player->getName() << std::endl; actionstream << player->getName() << std::endl;
} }
return playersao; return playersao;