mirror of https://github.com/OpenTTD/OpenTTD.git
Change: no longer use UDP when entering the lobby of a server
The lobby of a server requested some parts via UDP and some via TCP. This is strictly seen fine, but for future extensions it is a lot easier if just one protocol is used.
This commit is contained in:
parent
b57d845e55
commit
31f1db2d3a
|
@ -598,7 +598,7 @@ public:
|
||||||
{
|
{
|
||||||
_networking = true;
|
_networking = true;
|
||||||
new ClientNetworkGameSocketHandler(s);
|
new ClientNetworkGameSocketHandler(s);
|
||||||
MyClient::SendCompanyInformationQuery();
|
MyClient::SendInformationQuery();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
#include "network_base.h"
|
#include "network_base.h"
|
||||||
#include "network_client.h"
|
#include "network_client.h"
|
||||||
|
#include "network_gamelist.h"
|
||||||
#include "../core/backup_type.hpp"
|
#include "../core/backup_type.hpp"
|
||||||
#include "../thread.h"
|
#include "../thread.h"
|
||||||
|
|
||||||
|
@ -341,15 +342,18 @@ static_assert(NETWORK_SERVER_ID_LENGTH == 16 * 2 + 1);
|
||||||
* DEF_CLIENT_SEND_COMMAND has no parameters
|
* DEF_CLIENT_SEND_COMMAND has no parameters
|
||||||
************/
|
************/
|
||||||
|
|
||||||
/** Query the server for company information. */
|
/**
|
||||||
NetworkRecvStatus ClientNetworkGameSocketHandler::SendCompanyInformationQuery()
|
* Query the server for server information.
|
||||||
|
*/
|
||||||
|
NetworkRecvStatus ClientNetworkGameSocketHandler::SendInformationQuery()
|
||||||
{
|
{
|
||||||
my_client->status = STATUS_COMPANY_INFO;
|
my_client->status = STATUS_COMPANY_INFO;
|
||||||
_network_join_status = NETWORK_JOIN_STATUS_GETTING_COMPANY_INFO;
|
_network_join_status = NETWORK_JOIN_STATUS_GETTING_COMPANY_INFO;
|
||||||
SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN);
|
SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN);
|
||||||
|
|
||||||
Packet *p = new Packet(PACKET_CLIENT_COMPANY_INFO);
|
my_client->SendPacket(new Packet(PACKET_CLIENT_GAME_INFO));
|
||||||
my_client->SendPacket(p);
|
my_client->SendPacket(new Packet(PACKET_CLIENT_COMPANY_INFO));
|
||||||
|
|
||||||
return NETWORK_RECV_STATUS_OKAY;
|
return NETWORK_RECV_STATUS_OKAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -571,6 +575,28 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *
|
||||||
return NETWORK_RECV_STATUS_SERVER_BANNED;
|
return NETWORK_RECV_STATUS_SERVER_BANNED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet *p)
|
||||||
|
{
|
||||||
|
if (this->status != STATUS_COMPANY_INFO && this->status != STATUS_INACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
|
||||||
|
|
||||||
|
NetworkGameList *item = GetLobbyGameInfo();
|
||||||
|
|
||||||
|
/* Clear any existing GRFConfig chain. */
|
||||||
|
ClearGRFConfigList(&item->info.grfconfig);
|
||||||
|
/* Retrieve the NetworkGameInfo from the packet. */
|
||||||
|
DeserializeNetworkGameInfo(p, &item->info);
|
||||||
|
/* Check for compatability with the client. */
|
||||||
|
CheckGameCompatibility(item->info);
|
||||||
|
/* Ensure we consider the server online. */
|
||||||
|
item->online = true;
|
||||||
|
|
||||||
|
SetWindowDirty(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_LOBBY);
|
||||||
|
|
||||||
|
/* We will receive company info next, so keep connection open. */
|
||||||
|
if (this->status == STATUS_COMPANY_INFO) return NETWORK_RECV_STATUS_OKAY;
|
||||||
|
return NETWORK_RECV_STATUS_CLOSE_QUERY;
|
||||||
|
}
|
||||||
|
|
||||||
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMPANY_INFO(Packet *p)
|
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMPANY_INFO(Packet *p)
|
||||||
{
|
{
|
||||||
if (this->status != STATUS_COMPANY_INFO) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
|
if (this->status != STATUS_COMPANY_INFO) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
|
||||||
|
|
|
@ -43,6 +43,7 @@ protected:
|
||||||
NetworkRecvStatus Receive_SERVER_FULL(Packet *p) override;
|
NetworkRecvStatus Receive_SERVER_FULL(Packet *p) override;
|
||||||
NetworkRecvStatus Receive_SERVER_BANNED(Packet *p) override;
|
NetworkRecvStatus Receive_SERVER_BANNED(Packet *p) override;
|
||||||
NetworkRecvStatus Receive_SERVER_ERROR(Packet *p) override;
|
NetworkRecvStatus Receive_SERVER_ERROR(Packet *p) override;
|
||||||
|
NetworkRecvStatus Receive_SERVER_GAME_INFO(Packet *p) override;
|
||||||
NetworkRecvStatus Receive_SERVER_COMPANY_INFO(Packet *p) override;
|
NetworkRecvStatus Receive_SERVER_COMPANY_INFO(Packet *p) override;
|
||||||
NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet *p) override;
|
NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet *p) override;
|
||||||
NetworkRecvStatus Receive_SERVER_NEED_GAME_PASSWORD(Packet *p) override;
|
NetworkRecvStatus Receive_SERVER_NEED_GAME_PASSWORD(Packet *p) override;
|
||||||
|
@ -79,7 +80,7 @@ public:
|
||||||
NetworkRecvStatus CloseConnection(NetworkRecvStatus status) override;
|
NetworkRecvStatus CloseConnection(NetworkRecvStatus status) override;
|
||||||
void ClientError(NetworkRecvStatus res);
|
void ClientError(NetworkRecvStatus res);
|
||||||
|
|
||||||
static NetworkRecvStatus SendCompanyInformationQuery();
|
static NetworkRecvStatus SendInformationQuery();
|
||||||
|
|
||||||
static NetworkRecvStatus SendJoin();
|
static NetworkRecvStatus SendJoin();
|
||||||
static NetworkRecvStatus SendCommand(const CommandPacket *cp);
|
static NetworkRecvStatus SendCommand(const CommandPacket *cp);
|
||||||
|
|
|
@ -1482,10 +1482,10 @@ struct NetworkLobbyWindow : public Window {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WID_NL_REFRESH: // Refresh
|
case WID_NL_REFRESH: // Refresh
|
||||||
NetworkTCPQueryServer(NetworkAddress(_settings_client.network.last_host, _settings_client.network.last_port)); // company info
|
|
||||||
NetworkUDPQueryServer(NetworkAddress(_settings_client.network.last_host, _settings_client.network.last_port)); // general data
|
|
||||||
/* Clear the information so removed companies don't remain */
|
/* Clear the information so removed companies don't remain */
|
||||||
for (auto &company : this->company_info) company = {};
|
for (auto &company : this->company_info) company = {};
|
||||||
|
|
||||||
|
NetworkTCPQueryServer(NetworkAddress(_settings_client.network.last_host, _settings_client.network.last_port));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1553,8 +1553,7 @@ static void ShowNetworkLobbyWindow(NetworkGameList *ngl)
|
||||||
DeleteWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_START);
|
DeleteWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_START);
|
||||||
DeleteWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_GAME);
|
DeleteWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_GAME);
|
||||||
|
|
||||||
NetworkTCPQueryServer(NetworkAddress(_settings_client.network.last_host, _settings_client.network.last_port)); // company info
|
NetworkTCPQueryServer(NetworkAddress(_settings_client.network.last_host, _settings_client.network.last_port));
|
||||||
NetworkUDPQueryServer(NetworkAddress(_settings_client.network.last_host, _settings_client.network.last_port)); // general data
|
|
||||||
|
|
||||||
new NetworkLobbyWindow(&_network_lobby_window_desc, ngl);
|
new NetworkLobbyWindow(&_network_lobby_window_desc, ngl);
|
||||||
}
|
}
|
||||||
|
@ -1570,6 +1569,16 @@ NetworkCompanyInfo *GetLobbyCompanyInfo(CompanyID company)
|
||||||
return (lobby != nullptr && company < MAX_COMPANIES) ? &lobby->company_info[company] : nullptr;
|
return (lobby != nullptr && company < MAX_COMPANIES) ? &lobby->company_info[company] : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the game information for the lobby.
|
||||||
|
* @return the game info struct to write the (downloaded) data to.
|
||||||
|
*/
|
||||||
|
NetworkGameList *GetLobbyGameInfo()
|
||||||
|
{
|
||||||
|
NetworkLobbyWindow *lobby = dynamic_cast<NetworkLobbyWindow *>(FindWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_LOBBY));
|
||||||
|
return lobby != nullptr ? lobby->server : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
/* The window below gives information about the connected clients
|
/* The window below gives information about the connected clients
|
||||||
* and also makes able to kick them (if server) and stuff like that. */
|
* and also makes able to kick them (if server) and stuff like that. */
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include "../economy_type.h"
|
#include "../economy_type.h"
|
||||||
#include "../window_type.h"
|
#include "../window_type.h"
|
||||||
#include "network_type.h"
|
#include "network_type.h"
|
||||||
|
#include "network_gamelist.h"
|
||||||
|
|
||||||
void ShowNetworkNeedPassword(NetworkPasswordType npt);
|
void ShowNetworkNeedPassword(NetworkPasswordType npt);
|
||||||
void ShowNetworkChatQueryWindow(DestType type, int dest);
|
void ShowNetworkChatQueryWindow(DestType type, int dest);
|
||||||
|
@ -37,5 +38,6 @@ struct NetworkCompanyInfo : NetworkCompanyStats {
|
||||||
};
|
};
|
||||||
|
|
||||||
NetworkCompanyInfo *GetLobbyCompanyInfo(CompanyID company);
|
NetworkCompanyInfo *GetLobbyCompanyInfo(CompanyID company);
|
||||||
|
NetworkGameList *GetLobbyGameInfo();
|
||||||
|
|
||||||
#endif /* NETWORK_GUI_H */
|
#endif /* NETWORK_GUI_H */
|
||||||
|
|
Loading…
Reference in New Issue