mirror of
https://github.com/ddnet/ddnet.git
synced 2024-09-20 09:34:19 +00:00
fixed map crc checking
This commit is contained in:
parent
a4d69fa35a
commit
00f5817db0
|
@ -18,6 +18,7 @@
|
||||||
#include <engine/config.h>
|
#include <engine/config.h>
|
||||||
#include <engine/packer.h>
|
#include <engine/packer.h>
|
||||||
#include <engine/memheap.h>
|
#include <engine/memheap.h>
|
||||||
|
#include <engine/datafile.h>
|
||||||
|
|
||||||
#include <mastersrv/mastersrv.h>
|
#include <mastersrv/mastersrv.h>
|
||||||
|
|
||||||
|
@ -295,15 +296,6 @@ static void client_send_ready()
|
||||||
client_send_msg();
|
client_send_msg();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void client_send_error(const char *error)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
packet p(NETMSG_CLIENT_ERROR);
|
|
||||||
p.write_str(error);
|
|
||||||
send_packet(&p);
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
void client_rcon(const char *cmd)
|
void client_rcon(const char *cmd)
|
||||||
{
|
{
|
||||||
msg_pack_start_system(NETMSG_CMD, MSGFLAG_VITAL);
|
msg_pack_start_system(NETMSG_CMD, MSGFLAG_VITAL);
|
||||||
|
@ -434,10 +426,16 @@ void client_connect(const char *server_address_str)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void client_disconnect_with_reason(const char *reason)
|
||||||
|
{
|
||||||
|
netclient_disconnect(net, reason);
|
||||||
|
client_set_state(CLIENTSTATE_OFFLINE);
|
||||||
|
map_unload();
|
||||||
|
}
|
||||||
|
|
||||||
void client_disconnect()
|
void client_disconnect()
|
||||||
{
|
{
|
||||||
client_send_error("disconnected");
|
netclient_disconnect(net, 0);
|
||||||
netclient_disconnect(net, "disconnected");
|
|
||||||
client_set_state(CLIENTSTATE_OFFLINE);
|
client_set_state(CLIENTSTATE_OFFLINE);
|
||||||
map_unload();
|
map_unload();
|
||||||
}
|
}
|
||||||
|
@ -524,11 +522,35 @@ static void client_render()
|
||||||
client_debug_render();
|
client_debug_render();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void client_error(const char *msg)
|
static const char *client_load_map(const char *mapname, int wanted_crc)
|
||||||
{
|
{
|
||||||
dbg_msg("client", "error: %s", msg);
|
static char errormsg[128];
|
||||||
client_send_error(msg);
|
DATAFILE *df;
|
||||||
client_set_state(CLIENTSTATE_OFFLINE);
|
char buf[512];
|
||||||
|
int crc;
|
||||||
|
|
||||||
|
dbg_msg("client", "loading map, map=%s wanted crc=%08x", mapname, wanted_crc);
|
||||||
|
client_set_state(CLIENTSTATE_LOADING);
|
||||||
|
|
||||||
|
sprintf(buf, "data/maps/%s.map", mapname);
|
||||||
|
df = datafile_load(buf);
|
||||||
|
if(!df)
|
||||||
|
{
|
||||||
|
sprintf(errormsg, "map '%s' not found", mapname);
|
||||||
|
return errormsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get the crc of the map */
|
||||||
|
crc = datafile_crc(buf);
|
||||||
|
if(crc != wanted_crc)
|
||||||
|
{
|
||||||
|
datafile_unload(df);
|
||||||
|
sprintf(errormsg, "map differs from the server. %08x != %08x", crc, wanted_crc);
|
||||||
|
return errormsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
map_set(df);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void client_process_packet(NETPACKET *packet)
|
static void client_process_packet(NETPACKET *packet)
|
||||||
|
@ -609,10 +631,10 @@ static void client_process_packet(NETPACKET *packet)
|
||||||
if(msg == NETMSG_MAP)
|
if(msg == NETMSG_MAP)
|
||||||
{
|
{
|
||||||
const char *map = msg_unpack_string();
|
const char *map = msg_unpack_string();
|
||||||
dbg_msg("client/network", "connection accepted, map=%s", map);
|
int map_crc = msg_unpack_int();
|
||||||
client_set_state(CLIENTSTATE_LOADING);
|
const char *error = client_load_map(map, map_crc);
|
||||||
|
|
||||||
if(map_load(map))
|
if(!error)
|
||||||
{
|
{
|
||||||
dbg_msg("client/network", "loading done");
|
dbg_msg("client/network", "loading done");
|
||||||
client_send_ready();
|
client_send_ready();
|
||||||
|
@ -620,7 +642,7 @@ static void client_process_packet(NETPACKET *packet)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
client_error("failure to load map");
|
client_disconnect_with_reason(error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(msg == NETMSG_SNAP || msg == NETMSG_SNAPEMPTY)
|
else if(msg == NETMSG_SNAP || msg == NETMSG_SNAPEMPTY)
|
||||||
|
|
|
@ -602,3 +602,29 @@ int datafile_finish(DATAFILE_OUT *df)
|
||||||
dbg_msg("datafile", "done");
|
dbg_msg("datafile", "done");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define BUFFER_SIZE 64*1024
|
||||||
|
|
||||||
|
int datafile_crc(const char *filename)
|
||||||
|
{
|
||||||
|
unsigned char buffer[BUFFER_SIZE];
|
||||||
|
IOHANDLE file;
|
||||||
|
int crc = 0;
|
||||||
|
unsigned bytes = 0;
|
||||||
|
|
||||||
|
file = io_open(filename, IOFLAG_READ);
|
||||||
|
if(!file)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
bytes = io_read(file, buffer, BUFFER_SIZE);
|
||||||
|
if(bytes <= 0)
|
||||||
|
break;
|
||||||
|
crc = crc32(crc, buffer, bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
io_close(file);
|
||||||
|
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
|
|
@ -17,6 +17,8 @@ int datafile_num_items(DATAFILE *df);
|
||||||
int datafile_num_data(DATAFILE *df);
|
int datafile_num_data(DATAFILE *df);
|
||||||
void datafile_unload(DATAFILE *df);
|
void datafile_unload(DATAFILE *df);
|
||||||
|
|
||||||
|
int datafile_crc(const char *filename);
|
||||||
|
|
||||||
/* write access */
|
/* write access */
|
||||||
typedef struct DATAFILE_OUT_t DATAFILE_OUT;
|
typedef struct DATAFILE_OUT_t DATAFILE_OUT;
|
||||||
DATAFILE_OUT *datafile_create(const char *filename);
|
DATAFILE_OUT *datafile_create(const char *filename);
|
||||||
|
|
|
@ -334,6 +334,10 @@ static void conn_disconnect(NETCONNECTION *conn, const char *reason)
|
||||||
else
|
else
|
||||||
conn_send(conn, NETWORK_PACKETFLAG_CLOSE, 0, 0);
|
conn_send(conn, NETWORK_PACKETFLAG_CLOSE, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
conn->error_string[0] = 0;
|
||||||
|
if(reason)
|
||||||
|
strcpy(conn->error_string, reason);
|
||||||
conn_reset(conn);
|
conn_reset(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ static int64 lastheartbeat;
|
||||||
static NETADDR4 master_server;
|
static NETADDR4 master_server;
|
||||||
|
|
||||||
static char current_map[64];
|
static char current_map[64];
|
||||||
|
static int current_map_crc;
|
||||||
|
|
||||||
void *snap_new_item(int type, int id, int size)
|
void *snap_new_item(int type, int id, int size)
|
||||||
{
|
{
|
||||||
|
@ -401,6 +402,7 @@ static void server_send_map(int cid)
|
||||||
{
|
{
|
||||||
msg_pack_start_system(NETMSG_MAP, MSGFLAG_VITAL);
|
msg_pack_start_system(NETMSG_MAP, MSGFLAG_VITAL);
|
||||||
msg_pack_string(config.sv_map, 0);
|
msg_pack_string(config.sv_map, 0);
|
||||||
|
msg_pack_int(current_map_crc);
|
||||||
msg_pack_end();
|
msg_pack_end();
|
||||||
server_send_msg(cid);
|
server_send_msg(cid);
|
||||||
}
|
}
|
||||||
|
@ -640,6 +642,10 @@ static int server_load_map(const char *mapname)
|
||||||
df = datafile_load(buf);
|
df = datafile_load(buf);
|
||||||
if(!df)
|
if(!df)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
/* get the crc of the map */
|
||||||
|
current_map_crc = datafile_crc(buf);
|
||||||
|
dbg_msg("server", "%s crc is %08x", buf, current_map_crc);
|
||||||
|
|
||||||
strcpy(current_map, mapname);
|
strcpy(current_map, mapname);
|
||||||
map_set(df);
|
map_set(df);
|
||||||
|
@ -651,7 +657,7 @@ static int server_run()
|
||||||
{
|
{
|
||||||
NETADDR4 bindaddr;
|
NETADDR4 bindaddr;
|
||||||
|
|
||||||
net_init(); /* For Windows compatibility. */
|
net_init();
|
||||||
|
|
||||||
snap_init_id();
|
snap_init_id();
|
||||||
|
|
||||||
|
|
|
@ -1450,6 +1450,7 @@ static int popup = POPUP_NONE;
|
||||||
|
|
||||||
void menu_do_disconnected()
|
void menu_do_disconnected()
|
||||||
{
|
{
|
||||||
|
popup = POPUP_NONE;
|
||||||
if(strlen(client_error_string()))
|
if(strlen(client_error_string()))
|
||||||
popup = POPUP_DISCONNECTED;
|
popup = POPUP_DISCONNECTED;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue