From a735498b8e05af471d5cf85b191d6b53886dad06 Mon Sep 17 00:00:00 2001 From: Lee Salzman Date: Tue, 3 Apr 2007 17:58:49 +0000 Subject: [PATCH] *** empty log message *** git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@902 e016b1c5-ed68-44aa-a2f7-31cac88cffde --- source/src/Makefile | 6 +- source/src/client.cpp | 48 +++++ source/src/clientextras.cpp | 207 -------------------- source/src/{serverutil.cpp => protocol.cpp} | 64 ------ source/src/protos.h | 2 - source/src/rendermodel.cpp | 60 ++++++ source/src/scoreboard.cpp | 98 +++++++++ source/src/server.cpp | 67 ++++++- 8 files changed, 274 insertions(+), 278 deletions(-) delete mode 100644 source/src/clientextras.cpp rename source/src/{serverutil.cpp => protocol.cpp} (63%) create mode 100644 source/src/scoreboard.cpp diff --git a/source/src/Makefile b/source/src/Makefile index d695d428..2c402e27 100644 --- a/source/src/Makefile +++ b/source/src/Makefile @@ -6,7 +6,6 @@ PLATFORM_PREFIX=native CLIENT_LIBS=-L../enet -lenet `sdl-config --libs` -lSDL_image -lSDL_mixer -lz -lGL -lGLU CLIENT_OBJS= \ client.o \ - clientextras.o \ clientgame.o \ clients2c.o \ command.o \ @@ -17,6 +16,7 @@ CLIENT_OBJS= \ main.o \ menus.o \ physics.o \ + protocol.o \ rendercubes.o \ renderextras.o \ rendergl.o \ @@ -25,10 +25,10 @@ CLIENT_OBJS= \ rendertext.o \ rndmap.o \ savegamedemo.o \ + scoreboard.o \ server.o \ serverbrowser.o \ serverms.o \ - serverutil.o \ sound.o \ tools.o \ weapon.o \ @@ -50,7 +50,7 @@ SERVER_LIBS=-L../enet -lenet SERVER_FILES= \ serverms.cpp \ server.cpp \ - serverutil.cpp \ + protocol.cpp \ tools.cpp default: all diff --git a/source/src/client.cpp b/source/src/client.cpp index ce09fa44..4cceacb8 100644 --- a/source/src/client.cpp +++ b/source/src/client.cpp @@ -445,3 +445,51 @@ void gets2c() // get updates from the server break; } } + +// sendmap/getmap commands, should be replaced by more intuitive map downloading + +void sendmap(char *mapname) +{ + if(*mapname) + { + save_world(mapname); + changemap(mapname); + } + mapname = getclientmap(); + int mapsize; + uchar *mapdata = readmap(mapname, &mapsize); + if(!mapdata) return; + ENetPacket *packet = enet_packet_create(NULL, MAXTRANS + mapsize, ENET_PACKET_FLAG_RELIABLE); + ucharbuf p(packet->data, packet->dataLength); + putint(p, SV_SENDMAP); + sendstring(mapname, p); + putint(p, mapsize); + if(65535 - p.length() < mapsize) + { + conoutf("map %s is too large to send", mapname); + delete[] mapdata; + enet_packet_destroy(packet); + return; + } + p.put(mapdata, mapsize); + delete[] mapdata; + enet_packet_resize(packet, p.length()); + sendpackettoserv(2, packet); + conoutf("sending map %s to server...", mapname); + s_sprintfd(msg)("[map %s uploaded to server, \"getmap\" to receive it]", mapname); + toserver(msg); +} + +void getmap() +{ + ENetPacket *packet = enet_packet_create(NULL, MAXTRANS, ENET_PACKET_FLAG_RELIABLE); + ucharbuf p(packet->data, packet->dataLength); + putint(p, SV_RECVMAP); + enet_packet_resize(packet, p.length()); + sendpackettoserv(2, packet); + conoutf("requesting map from server..."); +} + +COMMAND(sendmap, ARG_1STR); +COMMAND(getmap, ARG_NONE); + diff --git a/source/src/clientextras.cpp b/source/src/clientextras.cpp deleted file mode 100644 index 9695b1b6..00000000 --- a/source/src/clientextras.cpp +++ /dev/null @@ -1,207 +0,0 @@ -// clientextras.cpp: stuff that didn't fit in client.cpp or clientgame.cpp :) - -#include "cube.h" - -void renderclient(playerent *d, char *mdlname, char *vwepname, int tex) -{ - int varseed = (int)(size_t)d; - int anim = ANIM_IDLE|ANIM_LOOP; - float speed = 100.0f; - float mz = d->o.z-d->eyeheight; - int basetime = -((int)(size_t)d&0xFFF); - if(d->state==CS_DEAD) - { - loopv(bounceents) if(bounceents[i]->bouncestate==GIB && bounceents[i]->owner==d) return; - d->pitch = 0.1f; - int r = 6; - anim = ANIM_DEATH; - varseed += d->lastaction; - basetime = d->lastaction; - int t = lastmillis-d->lastaction; - if(t<0 || t>20000) return; - if(t>(r-1)*100-50) - { - anim = ANIM_LYING_DEAD|ANIM_NOINTERP|ANIM_LOOP; - if(t>(r+10)*100) - { - t -= (r+10)*100; - mz -= t*t/10000000000.0f*t; - } - } - //if(mz<-1000) return; - } - else if(d->state==CS_EDITING) { anim = ANIM_JUMP|ANIM_END; } - else if(d->state==CS_LAGGED) { anim = ANIM_SALUTE|ANIM_LOOP; } - else if(lastmillis-d->lastpain<300) { anim = ANIM_PAIN; speed = 300.0f/4; varseed += d->lastpain; basetime = d->lastpain; } - else if(!d->onfloor && d->timeinair>50) { anim = ANIM_JUMP|ANIM_END; } - else if(d->gunselect==d->lastattackgun && lastmillis-d->lastaction<300) - { anim = ANIM_ATTACK; speed = 300.0f/8; basetime = d->lastaction; } - else if(!d->move && !d->strafe) { anim = ANIM_IDLE|ANIM_LOOP; } - else { anim = ANIM_RUN|ANIM_LOOP; speed = 1860/d->maxspeed; } - rendermodel(mdlname, anim, tex, 1.5f, d->o.x, mz, d->o.y, d->yaw+90, d->pitch/4, speed, basetime, d, vwepname); -} - -extern int democlientnum; - -void renderplayer(playerent *d) -{ - if(!d) return; - - int team = team_int(d->team); - s_sprintfd(skin)("packages/models/playermodels/%s/0%i.jpg", team_string(team), 1 + max(0, min(d->skin, (team==TEAM_CLA ? 3 : 5)))); - string vwep; - if(d->gunselect>=0 && d->gunselectgunselect]); - else vwep[0] = 0; - renderclient(d, "playermodels", vwep[0] ? vwep : NULL, -textureload(skin)->id); -} - -void renderclients() -{ - playerent *d; - loopv(players) if((d = players[i]) && (!demoplayback || i!=democlientnum)) renderplayer(d); - if(player1->state==CS_DEAD) renderplayer(player1); -} - -// creation of scoreboard pseudo-menu - -void *scoremenu = NULL, *teammenu = NULL, *ctfmenu = NULL; - -void showscores(bool on) -{ - menuset(on ? (m_ctf ? ctfmenu : (m_teammode ? teammenu : scoremenu)) : NULL); -} - -struct sline { string s; }; -vector scorelines; - -void renderscore(void *menu, playerent *d, int cn) -{ - const char *status = ""; - if(d->ismaster) status = "\f0"; - if(d->state==CS_DEAD) status = "\f4"; - s_sprintfd(lag)("%d", d->plag); - 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 -{ - char *team; - int score, flagscore; - teamscore() {} - teamscore(char *s, int n, int f = 0) : team(s), score(n), flagscore(f) {} -}; - -static int teamscorecmp(const teamscore *x, const teamscore *y) -{ - if(x->flagscore > y->flagscore) return -1; - if(x->flagscore < y->flagscore) return 1; - if(x->score > y->score) return -1; - if(x->score < y->score) return 1; - 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) -{ - if(!d || !d->team[0]) return; - loopv(teamscores) if(!strcmp(teamscores[i].team, d->team)) - { - teamscores[i].score += d->frags; - if(m_ctf) teamscores[i].flagscore += d->flagscore; - return; - } - teamscores.add(teamscore(d->team, d->frags, m_ctf ? d->flagscore : 0)); -} - -void renderscores() -{ - void *menu = m_ctf ? ctfmenu : (m_teammode ? teammenu : scoremenu); - scorelines.setsize(0); - - 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(), ""); - teamscores.setsize(0); - loopv(players) addteamscore(players[i]); - if(!demoplayback) addteamscore(player1); - teamscores.sort(teamscorecmp); - string &teamline = scorelines.add().s; - teamline[0] = 0; - loopv(teamscores) - { - string s; - if(m_ctf) s_sprintf(s)("[ %s: %d flags %d frags ]", teamscores[i].team, teamscores[i].flagscore, teamscores[i].score); - else s_sprintf(s)("[ %s: %d ]", teamscores[i].team, teamscores[i].score); - s_strcat(teamline, s); - } - menumanual(menu, scorelines.length(), teamline); - } -} - -// sendmap/getmap commands, should be replaced by more intuitive map downloading - -void sendmap(char *mapname) -{ - if(*mapname) - { - save_world(mapname); - changemap(mapname); - } - mapname = getclientmap(); - int mapsize; - uchar *mapdata = readmap(mapname, &mapsize); - if(!mapdata) return; - ENetPacket *packet = enet_packet_create(NULL, MAXTRANS + mapsize, ENET_PACKET_FLAG_RELIABLE); - ucharbuf p(packet->data, packet->dataLength); - putint(p, SV_SENDMAP); - sendstring(mapname, p); - putint(p, mapsize); - if(65535 - p.length() < mapsize) - { - conoutf("map %s is too large to send", mapname); - delete[] mapdata; - enet_packet_destroy(packet); - return; - } - p.put(mapdata, mapsize); - delete[] mapdata; - enet_packet_resize(packet, p.length()); - sendpackettoserv(2, packet); - conoutf("sending map %s to server...", mapname); - s_sprintfd(msg)("[map %s uploaded to server, \"getmap\" to receive it]", mapname); - toserver(msg); -} - -void getmap() -{ - ENetPacket *packet = enet_packet_create(NULL, MAXTRANS, ENET_PACKET_FLAG_RELIABLE); - ucharbuf p(packet->data, packet->dataLength); - putint(p, SV_RECVMAP); - enet_packet_resize(packet, p.length()); - sendpackettoserv(2, packet); - conoutf("requesting map from server..."); -} - -COMMAND(sendmap, ARG_1STR); -COMMAND(getmap, ARG_NONE); - diff --git a/source/src/serverutil.cpp b/source/src/protocol.cpp similarity index 63% rename from source/src/serverutil.cpp rename to source/src/protocol.cpp index 5b5cb998..8f658d5c 100644 --- a/source/src/serverutil.cpp +++ b/source/src/protocol.cpp @@ -107,67 +107,3 @@ char msgsizelookup(int msg) return -1; } -// sending of maps between clients - -string copyname; -int copysize; -uchar *copydata = NULL; - -void sendmaps(int n, string mapname, int mapsize, uchar *mapdata) -{ - if(mapsize <= 0 || mapsize > 256*256) return; - s_strcpy(copyname, mapname); - copysize = mapsize; - DELETEA(copydata); - copydata = new uchar[mapsize]; - memcpy(copydata, mapdata, mapsize); -} - -ENetPacket *recvmap(int n) -{ - if(!copydata) return NULL; - ENetPacket *packet = enet_packet_create(NULL, MAXTRANS + copysize, ENET_PACKET_FLAG_RELIABLE); - ucharbuf p(packet->data, packet->dataLength); - putint(p, SV_RECVMAP); - sendstring(copyname, p); - putint(p, copysize); - p.put(copydata, copysize); - enet_packet_resize(packet, p.length()); - return packet; -} - -#ifdef STANDALONE - -void localservertoclient(int chan, uchar *buf, int len) {} -void fatal(char *s, char *o) { cleanupserver(); printf("fatal: %s\n", s); exit(EXIT_FAILURE); } - -int main(int argc, char **argv) // EDIT: AH -{ - int uprate = 0, maxcl = DEFAULTCLIENTS; - char *sdesc = "", *ip = "", *master = NULL, *passwd = "", *maprot = "", *masterpwd = NULL; - - for(int i = 1; io.z-d->eyeheight; + int basetime = -((int)(size_t)d&0xFFF); + if(d->state==CS_DEAD) + { + loopv(bounceents) if(bounceents[i]->bouncestate==GIB && bounceents[i]->owner==d) return; + d->pitch = 0.1f; + int r = 6; + anim = ANIM_DEATH; + varseed += d->lastaction; + basetime = d->lastaction; + int t = lastmillis-d->lastaction; + if(t<0 || t>20000) return; + if(t>(r-1)*100-50) + { + anim = ANIM_LYING_DEAD|ANIM_NOINTERP|ANIM_LOOP; + if(t>(r+10)*100) + { + t -= (r+10)*100; + mz -= t*t/10000000000.0f*t; + } + } + //if(mz<-1000) return; + } + else if(d->state==CS_EDITING) { anim = ANIM_JUMP|ANIM_END; } + else if(d->state==CS_LAGGED) { anim = ANIM_SALUTE|ANIM_LOOP; } + else if(lastmillis-d->lastpain<300) { anim = ANIM_PAIN; speed = 300.0f/4; varseed += d->lastpain; basetime = d->lastpain; } + else if(!d->onfloor && d->timeinair>50) { anim = ANIM_JUMP|ANIM_END; } + else if(d->gunselect==d->lastattackgun && lastmillis-d->lastaction<300) + { anim = ANIM_ATTACK; speed = 300.0f/8; basetime = d->lastaction; } + else if(!d->move && !d->strafe) { anim = ANIM_IDLE|ANIM_LOOP; } + else { anim = ANIM_RUN|ANIM_LOOP; speed = 1860/d->maxspeed; } + rendermodel(mdlname, anim, tex, 1.5f, d->o.x, mz, d->o.y, d->yaw+90, d->pitch/4, speed, basetime, d, vwepname); +} + +extern int democlientnum; + +void renderplayer(playerent *d) +{ + if(!d) return; + + int team = team_int(d->team); + s_sprintfd(skin)("packages/models/playermodels/%s/0%i.jpg", team_string(team), 1 + max(0, min(d->skin, (team==TEAM_CLA ? 3 : 5)))); + string vwep; + if(d->gunselect>=0 && d->gunselectgunselect]); + else vwep[0] = 0; + renderclient(d, "playermodels", vwep[0] ? vwep : NULL, -textureload(skin)->id); +} + +void renderclients() +{ + playerent *d; + loopv(players) if((d = players[i]) && (!demoplayback || i!=democlientnum)) renderplayer(d); + if(player1->state==CS_DEAD) renderplayer(player1); +} + diff --git a/source/src/scoreboard.cpp b/source/src/scoreboard.cpp new file mode 100644 index 00000000..c600b6bb --- /dev/null +++ b/source/src/scoreboard.cpp @@ -0,0 +1,98 @@ +#include "cube.h" + +// creation of scoreboard pseudo-menu + +void *scoremenu = NULL, *teammenu = NULL, *ctfmenu = NULL; + +void showscores(bool on) +{ + menuset(on ? (m_ctf ? ctfmenu : (m_teammode ? teammenu : scoremenu)) : NULL); +} + +struct sline { string s; }; +vector scorelines; + +void renderscore(void *menu, playerent *d, int cn) +{ + const char *status = ""; + if(d->ismaster) status = "\f0"; + if(d->state==CS_DEAD) status = "\f4"; + s_sprintfd(lag)("%d", d->plag); + 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 +{ + char *team; + int score, flagscore; + teamscore() {} + teamscore(char *s, int n, int f = 0) : team(s), score(n), flagscore(f) {} +}; + +static int teamscorecmp(const teamscore *x, const teamscore *y) +{ + if(x->flagscore > y->flagscore) return -1; + if(x->flagscore < y->flagscore) return 1; + if(x->score > y->score) return -1; + if(x->score < y->score) return 1; + 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) +{ + if(!d || !d->team[0]) return; + loopv(teamscores) if(!strcmp(teamscores[i].team, d->team)) + { + teamscores[i].score += d->frags; + if(m_ctf) teamscores[i].flagscore += d->flagscore; + return; + } + teamscores.add(teamscore(d->team, d->frags, m_ctf ? d->flagscore : 0)); +} + +void renderscores() +{ + void *menu = m_ctf ? ctfmenu : (m_teammode ? teammenu : scoremenu); + scorelines.setsize(0); + + 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(), ""); + teamscores.setsize(0); + loopv(players) addteamscore(players[i]); + if(!demoplayback) addteamscore(player1); + teamscores.sort(teamscorecmp); + string &teamline = scorelines.add().s; + teamline[0] = 0; + loopv(teamscores) + { + string s; + if(m_ctf) s_sprintf(s)("[ %s: %d flags %d frags ]", teamscores[i].team, teamscores[i].flagscore, teamscores[i].score); + else s_sprintf(s)("[ %s: %d ]", teamscores[i].team, teamscores[i].score); + s_strcat(teamline, s); + } + menumanual(menu, scorelines.length(), teamline); + } +} + diff --git a/source/src/server.cpp b/source/src/server.cpp index a144768f..d52a50e0 100644 --- a/source/src/server.cpp +++ b/source/src/server.cpp @@ -642,6 +642,35 @@ void mastercmd(int sender, int cmd, int a) sendf(-1, 1, "riii", SV_MASTERCMD, cmd, a); } +// sending of maps between clients + +string copyname; +int copysize; +uchar *copydata = NULL; + +void sendmapserv(int n, string mapname, int mapsize, uchar *mapdata) +{ + if(mapsize <= 0 || mapsize > 256*256) return; + s_strcpy(copyname, mapname); + copysize = mapsize; + DELETEA(copydata); + copydata = new uchar[mapsize]; + memcpy(copydata, mapdata, mapsize); +} + +ENetPacket *getmapserv(int n) +{ + if(!copydata) return NULL; + ENetPacket *packet = enet_packet_create(NULL, MAXTRANS + copysize, ENET_PACKET_FLAG_RELIABLE); + ucharbuf p(packet->data, packet->dataLength); + putint(p, SV_RECVMAP); + sendstring(copyname, p); + putint(p, copysize); + p.put(copydata, copysize); + enet_packet_resize(packet, p.length()); + return packet; +} + int checktype(int type, client *cl) { if(cl && cl->type==ST_LOCAL) return type; @@ -789,14 +818,14 @@ void process(ENetPacket *packet, int sender, int chan) // sender may be -1 p.forceoverread(); break; } - sendmaps(sender, text, mapsize, &p.buf[p.len]); + sendmapserv(sender, text, mapsize, &p.buf[p.len]); p.len += mapsize; break; } case SV_RECVMAP: { - ENetPacket *mappacket = recvmap(sender); + ENetPacket *mappacket = getmapserv(sender); if(mappacket) sendpacket(sender, 2, mappacket); else sendservmsg("no map to get", sender); break; @@ -1122,3 +1151,37 @@ void initserver(bool dedicated, int uprate, char *sdesc, char *ip, char *master, for(;;) serverslice(/*enet_time_get_sec()*/time(NULL), 5); } } + +#ifdef STANDALONE + +void localservertoclient(int chan, uchar *buf, int len) {} +void fatal(char *s, char *o) { cleanupserver(); printf("fatal: %s\n", s); exit(EXIT_FAILURE); } + +int main(int argc, char **argv) // EDIT: AH +{ + int uprate = 0, maxcl = DEFAULTCLIENTS; + char *sdesc = "", *ip = "", *master = NULL, *passwd = "", *maprot = "", *masterpwd = NULL; + + for(int i = 1; i