diff --git a/source/src/client.cpp b/source/src/client.cpp index b986cd7e..363c96fd 100644 --- a/source/src/client.cpp +++ b/source/src/client.cpp @@ -6,10 +6,9 @@ ENetHost *clienthost = NULL; ENetPeer *curpeer = NULL, *connpeer = NULL; int connmillis = 0, connattempts = 0, discmillis = 0; -int clientnum = -1; // our client id in the game bool c2sinit = false; // whether we need to tell the other clients our stats -int getclientnum() { return clientnum; } +int getclientnum() { return player1 ? player1->clientnum : -1; } bool multiplayer() { @@ -189,8 +188,8 @@ void disconnect(int onlyclean, int async) if(cleanup) { stop(); - clientnum = -1; c2sinit = false; + player1->clientnum = -1; player1->lifesequence = 0; player1->ismaster = false; if(m_botmode) BotManager.EndMap(); @@ -293,15 +292,15 @@ void c2skeepalive() extern string masterpwd; -void c2sinfo(dynent *d) // send update to the server +void c2sinfo(playerent *d) // send update to the server { - if(clientnum<0) return; // we haven't had a welcome message from the server yet + if(d->clientnum<0) return; // we haven't had a welcome message from the server yet if(lastmillis-lastupdate<40) return; // don't update faster than 25fps ENetPacket *packet = enet_packet_create(NULL, 100, 0); ucharbuf q(packet->data, packet->dataLength); putint(q, SV_POS); - putint(q, clientnum); + putint(q, d->clientnum); putuint(q, (int)(d->o.x*DMF)); // quantize coordinates to 1/16th of a cube, between 1 and 3 bytes putuint(q, (int)(d->o.y*DMF)); putuint(q, (int)(d->o.z*DMF)); diff --git a/source/src/clientextras.cpp b/source/src/clientextras.cpp index aebcd947..9695b1b6 100644 --- a/source/src/clientextras.cpp +++ b/source/src/clientextras.cpp @@ -64,11 +64,11 @@ void renderclients() // creation of scoreboard pseudo-menu -void *scoremenu = NULL, *ctfmenu = NULL; +void *scoremenu = NULL, *teammenu = NULL, *ctfmenu = NULL; void showscores(bool on) { - menuset(on ? (m_ctf ? ctfmenu : scoremenu) : NULL); + menuset(on ? (m_ctf ? ctfmenu : (m_teammode ? teammenu : scoremenu)) : NULL); } struct sline { string s; }; @@ -80,9 +80,11 @@ void renderscore(void *menu, playerent *d, int cn) if(d->ismaster) status = "\f0"; if(d->state==CS_DEAD) status = "\f4"; s_sprintfd(lag)("%d", d->plag); - if(m_ctf) s_sprintf(scorelines.add().s)("%d\t%d\t%s\t%d\t%s\t%s%s\t%d", d->flagscore, d->frags, d->state==CS_LAGGED ? "LAG" : lag, d->ping, d->team, status, d->name, cn); - else s_sprintf(scorelines.add().s)("%d\t%s\t%d\t%s\t%s%s\t%d", d->frags, d->state==CS_LAGGED ? "LAG" : lag, d->ping, m_teammode ? d->team : "", status, d->name, cn); - menumanual(menu, scorelines.length()-1, scorelines.last().s); + string &s = scorelines.add().s; + if(m_ctf) s_sprintf(s)("%d\t%d\t%s\t%d\t%s\t%s%s\t%d", d->flagscore, d->frags, d->state==CS_LAGGED ? "LAG" : lag, d->ping, d->team, status, d->name, cn); + else if(m_teammode) s_sprintf(s)("%d\t%s\t%d\t%s\t%s%s\t%d", d->frags, d->state==CS_LAGGED ? "LAG" : lag, d->ping, m_teammode ? d->team : "", status, d->name, cn); + else s_sprintf(s)("%d\t%s\t%d\t%s%s\t%d", d->frags, d->state==CS_LAGGED ? "LAG" : lag, d->ping, status, d->name, cn); + menumanual(menu, scorelines.length()-1, s); } struct teamscore @@ -102,6 +104,15 @@ static int teamscorecmp(const teamscore *x, const teamscore *y) return 0; } +static int scorecmp(const playerent **x, const playerent **y) +{ + if((*x)->flagscore > (*y)->flagscore) return -1; + if((*x)->flagscore < (*y)->flagscore) return 1; + if((*x)->frags > (*y)->frags) return -1; + if((*x)->frags < (*y)->frags) return 1; + return 0; +} + vector teamscores; void addteamscore(playerent *d) @@ -118,12 +129,15 @@ void addteamscore(playerent *d) void renderscores() { - void *menu = m_ctf ? ctfmenu : scoremenu; + void *menu = m_ctf ? ctfmenu : (m_teammode ? teammenu : scoremenu); scorelines.setsize(0); - if(!demoplayback) renderscore(menu, player1, getclientnum()); - loopv(players) if(players[i]) renderscore(menu, players[i], i); - sortmenu(menu, 0, scorelines.length()); + vector scores; + if(!demoplayback) scores.add(player1); + loopv(players) if(players[i]) scores.add(players[i]); + scores.sort(scorecmp); + loopv(scores) renderscore(menu, scores[i], scores[i]->clientnum); + if(m_teammode) { menumanual(menu, scorelines.length(), ""); diff --git a/source/src/clientgame.cpp b/source/src/clientgame.cpp index 3d377414..de8b539a 100644 --- a/source/src/clientgame.cpp +++ b/source/src/clientgame.cpp @@ -50,7 +50,6 @@ void deathstate(playerent *pl) pl->lastaction = lastmillis; pl->attacking = false; pl->state = CS_DEAD; - pl->oldpitch = pl->pitch; pl->pitch = 0; pl->roll = 60; pl->strafe = 0; @@ -532,7 +531,12 @@ playerent *newclient(int cn) // ensure valid entity return NULL; } while(cn>=players.length()) players.add(NULL); - return players[cn] ? players[cn] : (players[cn] = newplayerent()); + playerent *d = players[cn]; + if(d) return d; + d = newplayerent(); + players[cn] = d; + d->clientnum = cn; + return d; } playerent *getclient(int cn) // ensure valid entity diff --git a/source/src/clients2c.cpp b/source/src/clients2c.cpp index f059d952..189e4d2a 100644 --- a/source/src/clients2c.cpp +++ b/source/src/clients2c.cpp @@ -2,7 +2,6 @@ #include "cube.h" -extern int clientnum; extern bool c2sinit, senditemstoserver; extern string clientpassword; @@ -115,7 +114,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) disconnect(); return; } - clientnum = mycn; // we are now fully connected + player1->clientnum = mycn; // we are now fully connected joining = getint(p); if(getint(p) > 0) conoutf("INFO: this server is password protected"); if(joining<0 && getclientmap()[0]) changemap(getclientmap()); // we are the first client on this server, set map @@ -234,7 +233,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) int target = getint(p); int damage = getint(p); int ls = getint(p); - if(target==clientnum) { if(ls==player1->lifesequence) selfdamage(damage, cn, d, gib); } + if(target==getclientnum()) { if(ls==player1->lifesequence) selfdamage(damage, cn, d, gib); } else { playerent *victim = getclient(target); @@ -262,7 +261,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) conoutf("\f2%s suicided", d->name); act = d; } - else if(actor==clientnum) + else if(actor==getclientnum()) { act = player1; int frags; @@ -313,7 +312,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) case SV_RESUME: { int cn = getint(p), frags = getint(p), flags = getint(p); - playerent *d = cn==clientnum ? player1 : newclient(cn); + playerent *d = cn==getclientnum() ? player1 : newclient(cn); if(d) { d->frags = frags; diff --git a/source/src/entity.h b/source/src/entity.h index e7a93cec..1ed0e18a 100644 --- a/source/src/entity.h +++ b/source/src/entity.h @@ -144,8 +144,7 @@ struct poshist struct playerent : dynent { - float oldpitch; - int lastupdate, plag, ping; + int clientnum, lastupdate, plag, ping; int lifesequence; // sequence id for each respawn, used in damage test int frags, flagscore; int health, armour; @@ -171,7 +170,7 @@ struct playerent : dynent poshist history; // Previous stored locations of this player - playerent() : plag(0), ping(0), lifesequence(0), frags(0), flagscore(0), lastpain(0), lastteamkill(0), ismaster(false), + playerent() : clientnum(-1), plag(0), ping(0), lifesequence(0), frags(0), flagscore(0), lastpain(0), lastteamkill(0), ismaster(false), shots(0), reloading(false), primary(GUN_ASSAULT), nextprimary(GUN_ASSAULT), skin(0), nextskin(0), inhandnade(NULL) { diff --git a/source/src/main.cpp b/source/src/main.cpp index 3a2189ea..61813c31 100644 --- a/source/src/main.cpp +++ b/source/src/main.cpp @@ -300,8 +300,9 @@ int main(int argc, char **argv) initsound(); log("cfg"); - extern void *scoremenu, *servmenu, *ctfmenu, *kickmenu, *banmenu; - scoremenu = addmenu("frags\tpj\tping\tteam\tname\tcn", false, false, renderscores); + extern void *scoremenu, *teammenu, *servmenu, *ctfmenu, *kickmenu, *banmenu; + scoremenu = addmenu("frags\tpj\tping\tname\tcn", false, false, renderscores); + teammenu = addmenu("frags\tpj\tping\tteam\tname\tcn", false, false, renderscores); servmenu = addmenu("ping\tplr\tserver", true, false, refreshservers); ctfmenu = addmenu("flags\tfrags\tpj\tping\tteam\tname\tcn", false, false, renderscores); kickmenu = addmenu("kick player", true, false); diff --git a/source/src/menus.cpp b/source/src/menus.cpp index 7a3a0e22..33cd813c 100644 --- a/source/src/menus.cpp +++ b/source/src/menus.cpp @@ -41,15 +41,6 @@ void showmenu(char *name) menuset(m); } -int menucompare(mitem *a, mitem *b) -{ - int x = atoi(a->text); - int y = atoi(b->text); - if(x>y) return -1; - if(x