mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 10:08:18 +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/packer.h>
|
||||
#include <engine/memheap.h>
|
||||
#include <engine/datafile.h>
|
||||
|
||||
#include <mastersrv/mastersrv.h>
|
||||
|
||||
|
@ -295,15 +296,6 @@ static void client_send_ready()
|
|||
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)
|
||||
{
|
||||
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()
|
||||
{
|
||||
client_send_error("disconnected");
|
||||
netclient_disconnect(net, "disconnected");
|
||||
netclient_disconnect(net, 0);
|
||||
client_set_state(CLIENTSTATE_OFFLINE);
|
||||
map_unload();
|
||||
}
|
||||
|
@ -524,11 +522,35 @@ static void client_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);
|
||||
client_send_error(msg);
|
||||
client_set_state(CLIENTSTATE_OFFLINE);
|
||||
static char errormsg[128];
|
||||
DATAFILE *df;
|
||||
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)
|
||||
|
@ -609,10 +631,10 @@ static void client_process_packet(NETPACKET *packet)
|
|||
if(msg == NETMSG_MAP)
|
||||
{
|
||||
const char *map = msg_unpack_string();
|
||||
dbg_msg("client/network", "connection accepted, map=%s", map);
|
||||
client_set_state(CLIENTSTATE_LOADING);
|
||||
|
||||
if(map_load(map))
|
||||
int map_crc = msg_unpack_int();
|
||||
const char *error = client_load_map(map, map_crc);
|
||||
|
||||
if(!error)
|
||||
{
|
||||
dbg_msg("client/network", "loading done");
|
||||
client_send_ready();
|
||||
|
@ -620,7 +642,7 @@ static void client_process_packet(NETPACKET *packet)
|
|||
}
|
||||
else
|
||||
{
|
||||
client_error("failure to load map");
|
||||
client_disconnect_with_reason(error);
|
||||
}
|
||||
}
|
||||
else if(msg == NETMSG_SNAP || msg == NETMSG_SNAPEMPTY)
|
||||
|
|
|
@ -602,3 +602,29 @@ int datafile_finish(DATAFILE_OUT *df)
|
|||
dbg_msg("datafile", "done");
|
||||
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);
|
||||
void datafile_unload(DATAFILE *df);
|
||||
|
||||
int datafile_crc(const char *filename);
|
||||
|
||||
/* write access */
|
||||
typedef struct DATAFILE_OUT_t DATAFILE_OUT;
|
||||
DATAFILE_OUT *datafile_create(const char *filename);
|
||||
|
|
|
@ -334,6 +334,10 @@ static void conn_disconnect(NETCONNECTION *conn, const char *reason)
|
|||
else
|
||||
conn_send(conn, NETWORK_PACKETFLAG_CLOSE, 0, 0);
|
||||
}
|
||||
|
||||
conn->error_string[0] = 0;
|
||||
if(reason)
|
||||
strcpy(conn->error_string, reason);
|
||||
conn_reset(conn);
|
||||
}
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@ static int64 lastheartbeat;
|
|||
static NETADDR4 master_server;
|
||||
|
||||
static char current_map[64];
|
||||
static int current_map_crc;
|
||||
|
||||
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_string(config.sv_map, 0);
|
||||
msg_pack_int(current_map_crc);
|
||||
msg_pack_end();
|
||||
server_send_msg(cid);
|
||||
}
|
||||
|
@ -640,6 +642,10 @@ static int server_load_map(const char *mapname)
|
|||
df = datafile_load(buf);
|
||||
if(!df)
|
||||
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);
|
||||
map_set(df);
|
||||
|
@ -651,7 +657,7 @@ static int server_run()
|
|||
{
|
||||
NETADDR4 bindaddr;
|
||||
|
||||
net_init(); /* For Windows compatibility. */
|
||||
net_init();
|
||||
|
||||
snap_init_id();
|
||||
|
||||
|
|
|
@ -1450,6 +1450,7 @@ static int popup = POPUP_NONE;
|
|||
|
||||
void menu_do_disconnected()
|
||||
{
|
||||
popup = POPUP_NONE;
|
||||
if(strlen(client_error_string()))
|
||||
popup = POPUP_DISCONNECTED;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue