diff --git a/source/src/clientgame.cpp b/source/src/clientgame.cpp index ebad8c07..52f965f3 100644 --- a/source/src/clientgame.cpp +++ b/source/src/clientgame.cpp @@ -575,38 +575,49 @@ void flagmsg(int flag, int action) { flaginfo &f = flaginfos[flag]; if(!f.actor || !f.ack) return; - bool own = flag == team_int(player1->team); + bool own = flag == team_int(player1->team), firstperson = false; + const char *teamstr; + if(demoplayback && !localdemoplayer1st()) + teamstr = flag ? "the RVSF" : "the CLA"; + else + { + teamstr = flag == team_int(player1->team) ? "your" : "the enemy"; + firstperson = f.actor == player1; + } + switch(action) { case SV_FLAGPICKUP: { playsound(S_FLAGPICKUP); - if(f.actor==player1) conoutf("\f2you got the enemy flag"); - else conoutf("\f2%s got %s flag", colorname(f.actor), (own ? "your": "the enemy")); + if(firstperson) conoutf("\f2you got the enemy flag"); + else conoutf("\f2%s got %s flag", colorname(f.actor), teamstr); break; } case SV_FLAGDROP: { playsound(S_FLAGDROP); - if(f.actor==player1) conoutf("\f2you lost the flag"); - else conoutf("\f2%s lost %s flag", colorname(f.actor), (own ? "your" : "the enemy")); + if(firstperson) conoutf("\f2you lost the flag"); + else conoutf("\f2%s lost %s flag", colorname(f.actor), teamstr); break; } case SV_FLAGRETURN: { playsound(S_FLAGRETURN); - if(f.actor==player1) conoutf("\f2you returned your flag"); - else conoutf("\f2%s returned %s flag", colorname(f.actor), (own ? "your" : "the enemy")); + if(firstperson) conoutf("\f2you returned your flag"); + else conoutf("\f2%s returned %s flag", colorname(f.actor), teamstr); break; } case SV_FLAGSCORE: { playsound(S_FLAGSCORE); - if(f.actor==player1) + if(firstperson) { conoutf("\f2you scored"); addmsg(SV_FLAGS, "ri", ++player1->flagscore); } + else if(demoplayback) + conoutf("\f2%s scored for team %s", colorname(f.actor), f.actor->team); else conoutf("\f2%s scored for %s team", colorname(f.actor), (own ? "the enemy" : "your")); break; } diff --git a/source/src/clients2c.cpp b/source/src/clients2c.cpp index d8b5e630..681dc72e 100644 --- a/source/src/clients2c.cpp +++ b/source/src/clients2c.cpp @@ -262,7 +262,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) int target = getint(p); int damage = getint(p); int ls = getint(p); - if(target==getclientnum()) { if(ls==player1->lifesequence) dodamage(damage, cn, d, gib); } + if(!demoplayback && target==getclientnum()) { if(ls==player1->lifesequence) dodamage(damage, cn, d, gib); } else { playerent *victim = getclient(target); @@ -290,7 +290,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) conoutf("\f2%s suicided", colorname(d)); act = d; } - else if(actor==getclientnum() /*|| (demoplayback && actor==democlientnum)*/) // player-neutral gameplay messages? + else if(actor==getclientnum() && (!demoplayback || localdemoplayer1st())) { act = player1; int frags; @@ -409,8 +409,11 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) } case SV_PONG: - addmsg(SV_CLIENTPING, "i", player1->ping = (player1->ping*5+lastmillis-getint(p))/6); + { + int millis = getint(p); + if(!demoplayback) addmsg(SV_CLIENTPING, "i", player1->ping = (player1->ping*5+lastmillis-millis)/6); break; + } case SV_CLIENTPING: if(!d) return; @@ -594,9 +597,9 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) if(demoplayback) // filter demo messages { int size = msgsizelookup(type); - if(size) + if(size>0) { - loopi(size) getint(p); + loopi(size-1) getint(p); break; } } diff --git a/source/src/savegamedemo.cpp b/source/src/savegamedemo.cpp index 9c18cb83..d0ae4293 100644 --- a/source/src/savegamedemo.cpp +++ b/source/src/savegamedemo.cpp @@ -144,8 +144,6 @@ int playbacktime = 0; int ddamage, bdamage; vec dorig; -int demomillis() { return lastmillis-starttime; } - void record(char *name) { int cn = getclientnum(); @@ -325,13 +323,17 @@ void demoplaybackstep() int chan = gzget(); uchar buf[MAXTRANS]; gzread(f, buf, len); - localservertoclient(chan, buf, len); // update game state + int extras = gzget(); + bool updatehistory = (!extras && playerhistory.length()); + if(updatehistory) memcpy(player1, playerhistory.last(), sizeof(playerent)); + localservertoclient(chan, buf, len); // update game state + if(updatehistory) memcpy(playerhistory.last(), player1, sizeof(playerent)); + playerent *target = (playerent *)players[democlientnum]; ASSERT(target); - int extras; - if((extras = gzget())) // read additional client side state not present in normal network stream + if(extras) // read additional client side state not present in normal network stream { target->gunselect = gzget(); target->lastattackgun = gzget(); @@ -427,6 +429,7 @@ void demoplaybackstep() void stopn() { if(demoplayback) stopreset(); else stop(); conoutf("demo stopped"); } +int demomillis() { return ((lastmillis-starttime)*demoplaybackspeed)/100; } COMMAND(record, ARG_1STR); COMMAND(demo, ARG_1STR);