summaryrefslogtreecommitdiff
path: root/src/network/network_client.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/network_client.cpp')
-rw-r--r--src/network/network_client.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp
index 016529889..abc61ff46 100644
--- a/src/network/network_client.cpp
+++ b/src/network/network_client.cpp
@@ -78,6 +78,18 @@ DEF_CLIENT_SEND_COMMAND(PACKET_CLIENT_JOIN)
NetworkSend_Packet(p, MY_CLIENT);
}
+DEF_CLIENT_SEND_COMMAND(PACKET_CLIENT_NEWGRFS_CHECKED)
+{
+ //
+ // Packet: CLIENT_NEWGRFS_CHECKED
+ // Function: Tell the server that we have the required GRFs
+ // Data:
+ //
+
+ Packet *p = NetworkSend_Init(PACKET_CLIENT_NEWGRFS_CHECKED);
+ NetworkSend_Packet(p, MY_CLIENT);
+}
+
DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_PASSWORD)(NetworkPasswordType type, const char *password)
{
//
@@ -408,6 +420,37 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_ERROR)
return NETWORK_RECV_STATUS_SERVER_ERROR;
}
+DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_CHECK_NEWGRFS)
+{
+ uint grf_count = NetworkRecv_uint8(MY_CLIENT, p);
+ NetworkRecvStatus ret = NETWORK_RECV_STATUS_OKAY;
+
+ /* Check all GRFs */
+ for (; grf_count > 0; grf_count--) {
+ GRFConfig c;
+ MY_CLIENT->Recv_GRFIdentifier(p, &c);
+
+ /* Check whether we know this GRF */
+ const GRFConfig *f = FindGRFConfig(c.grfid, c.md5sum);
+ if (f == NULL) {
+ /* We do not know this GRF, bail out of initialization */
+ char buf[sizeof(c.md5sum) * 2 + 1];
+ md5sumToString(buf, lastof(buf), c.md5sum);
+ DEBUG(grf, 0, "NewGRF %08X not found; checksum %s", BSWAP32(c.grfid), buf);
+ ret = NETWORK_RECV_STATUS_NEWGRF_MISMATCH;
+ }
+ }
+
+ if (ret == NETWORK_RECV_STATUS_OKAY) {
+ /* Start receiving the map */
+ SEND_COMMAND(PACKET_CLIENT_NEWGRFS_CHECKED)();
+ } else {
+ /* NewGRF mismatch, bail out */
+ _switch_mode_errorstr = STR_NETWORK_ERR_NEWGRF_MISMATCH;
+ }
+ return ret;
+}
+
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_NEED_PASSWORD)
{
NetworkPasswordType type = (NetworkPasswordType)NetworkRecv_uint8(MY_CLIENT, p);
@@ -788,6 +831,8 @@ static NetworkClientPacket* const _network_client_packet[] = {
RECEIVE_COMMAND(PACKET_SERVER_NEWGAME),
RECEIVE_COMMAND(PACKET_SERVER_RCON),
NULL, /*PACKET_CLIENT_RCON,*/
+ RECEIVE_COMMAND(PACKET_SERVER_CHECK_NEWGRFS),
+ NULL, /*PACKET_CLIENT_NEWGRFS_CHECKED,*/
};
// If this fails, check the array above with network_data.h