diff --git a/source/src/clients2c.cpp b/source/src/clients2c.cpp index 18841388..51958c14 100644 --- a/source/src/clients2c.cpp +++ b/source/src/clients2c.cpp @@ -817,6 +817,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) void receivefile(uchar *data, int len) { + static char text[MAXTRANS]; ucharbuf p(data, len); int type = getint(p); data += p.length(); @@ -826,7 +827,15 @@ void receivefile(uchar *data, int len) case SV_SENDDEMO: { systemtime(); - s_sprintfd(fname)("demos/%d.dmo", now_utc); + getstring(text, p); + s_sprintfd(fname)("demos/%s.dmo", text); + data += strlen(text); + int demosize = getint(p); + if(p.remaining() < demosize) + { + p.forceoverread(); + break; + } path(fname); FILE *demo = openfile(fname, "wb"); if(!demo) @@ -835,14 +844,13 @@ void receivefile(uchar *data, int len) return; } conoutf("received demo \"%s\"", fname); - fwrite(data, 1, len, demo); + fwrite(&p.buf[p.len], 1, demosize, demo); // data fclose(demo); break; } case SV_RECVMAP: { - static char text[MAXTRANS]; getstring(text, p); conoutf("received map \"%s\" from server, reloading..", text); int mapsize = getint(p); diff --git a/source/src/protocol.h b/source/src/protocol.h index 9423f6cd..68ad7238 100644 --- a/source/src/protocol.h +++ b/source/src/protocol.h @@ -5,7 +5,7 @@ #define CUBE_SERVINFO_PORT_LAN 28762 #define CUBE_SERVINFO_PORT(serverport) (serverport+1) #define CUBE_SERVINFO_TO_SERV_PORT(servinfoport) (servinfoport-1) -#define PROTOCOL_VERSION 1128 // bump when protocol changes +#define PROTOCOL_VERSION 1129 // bump when protocol changes #define DEMO_VERSION 1 // bump when demo format changes #define DEMO_MAGIC "ASSAULTCUBE_DEMO" #define MAXMAPSENDSIZE 65536 @@ -51,7 +51,7 @@ const static char *messagenames[] = "SV_TIMEUP", "SV_EDITENT", "SV_MAPRELOAD", "SV_NEXTMAP", "SV_ITEMACC", "SV_MAPCHANGE", "SV_ITEMSPAWN", "SV_ITEMPICKUP", "SV_PING", "SV_PONG", "SV_CLIENTPING", "SV_GAMEMODE", - "SV_EDITMODE", "SV_EDITH", "SV_EDITT", "SV_EDITS", "SV_EDITD", "SV_EDITE", "SV_NEWMAP", + "SV_EDITMODE", "SV_EDITH", "SV_EDITT", "SV_EDITS", "SV_EDITD", "SV_EDITE", "SV_NEWMAP", "SV_SENDMAP", "SV_RECVMAP", "SV_SERVMSG", "SV_ITEMLIST", "SV_WEAPCHANGE", "SV_PRIMARYWEAP", "SV_MODELSKIN", "SV_FLAGACTION", "SV_FLAGINFO", "SV_FLAGMSG", "SV_FLAGCNT", diff --git a/source/src/server.cpp b/source/src/server.cpp index 50d0cf22..ec4b7276 100644 --- a/source/src/server.cpp +++ b/source/src/server.cpp @@ -599,6 +599,7 @@ void sendspawn(client *c) struct demofile { string info; + string file; uchar *data; int len; }; @@ -636,6 +637,16 @@ char *asctime() return timestr; } +char fmttimestr[15]; // flowtron assumes "%b" is always 3 chars (true at least for DE and EN) +char *strftime() +{ + time_t t = time(NULL); + struct tm * timeinfo; + timeinfo = localtime (&t); + strftime(fmttimestr, 15, "%Y%b%d_%H%M", timeinfo); // 14 + "\0" + return fmttimestr; +} + void enddemorecord() { if(!demorecord) return; @@ -659,6 +670,7 @@ void enddemorecord() } demofile &d = demos.add(); s_sprintf(d.info)("%s: %s, %s, %.2f%s", asctime(), modestr(gamemode), smapname, len > 1024*1024 ? len/(1024*1024.f) : len/1024.0f, len > 1024*1024 ? "MB" : "kB"); + s_sprintf(d.file)("%s_%s_%s", modestr(gamemode, true), behindpath(smapname), strftime()); s_sprintfd(msg)("Demo \"%s\" recorded\nPress F10 to download it from the server..", d.info); sendservmsg(msg); logger->writeline(log::info, "Demo \"%s\" recorded.", d.info); @@ -800,7 +812,16 @@ void senddemo(int cn, int num) return; } demofile &d = demos[num-1]; - sendf(cn, 2, "rim", SV_SENDDEMO, d.len, d.data); + //sendf(cn, 2, "rim", SV_SENDDEMO, d.len, d.data); + ENetPacket *packet = enet_packet_create(NULL, MAXTRANS + d.len, ENET_PACKET_FLAG_RELIABLE); + ucharbuf p(packet->data, packet->dataLength); + putint(p, SV_SENDDEMO); + sendstring(d.file, p); + putint(p, d.len); + p.put(d.data, d.len); + enet_packet_resize(packet, p.length()); + sendpacket(cn, 2, packet); + if(!packet->referenceCount) enet_packet_destroy(packet); } void enddemoplayback()