diff options
| author | xolatile | 2025-08-06 22:54:55 +0200 |
|---|---|---|
| committer | xolatile | 2025-08-06 22:54:55 +0200 |
| commit | 0a1172b75f571685c264a8b9d8ee224bbf11381f (patch) | |
| tree | d041fdc68a60f0ebb48a3852bbcce6d9432f83d5 /src/fpsgame/client.cpp | |
| parent | affde05dc07a94643f1fd2751b2b441f57f73d7d (diff) | |
| download | xolatile-badassbug-0a1172b75f571685c264a8b9d8ee224bbf11381f.tar.xz xolatile-badassbug-0a1172b75f571685c264a8b9d8ee224bbf11381f.tar.zst | |
Please do not hate me, it makes sense...
Diffstat (limited to 'src/fpsgame/client.cpp')
| -rw-r--r-- | src/fpsgame/client.cpp | 874 |
1 files changed, 240 insertions, 634 deletions
diff --git a/src/fpsgame/client.cpp b/src/fpsgame/client.cpp index 7155c00..2ad6a6f 100644 --- a/src/fpsgame/client.cpp +++ b/src/fpsgame/client.cpp @@ -1,98 +1,71 @@ #include "game.h" -namespace game -{ +namespace game { bool senditemstoserver = false, sendcrc = false; // after a map change, since server doesn't have map data int lastping = 0; - bool connected = false, remote = false, demoplayback = false, gamepaused = false; int sessionid = 0, mastermode = MM_OPEN, gamespeed = 100; string servinfo = "", servauth = "", connectpass = ""; - VARP(deadpush, 1, 2, 20); - - void switchname(const char *name) - { + void switchname(const char *name) { filtertext(player1->name, name, false, false, MAXNAMELEN); if(!player1->name[0]) copystring(player1->name, "Anonymous"); addmsg(N_SWITCHNAME, "rs", player1->name); } - void printname() - { + void printname() { conoutf("your name is: %s", colorname(player1)); } - ICOMMAND(name, "sN", (char *s, int *numargs), - { + ICOMMAND(name, "sN", (char *s, int *numargs), { if(*numargs > 0) switchname(s); else if(!*numargs) printname(); else result(colorname(player1)); }); ICOMMAND(getname, "", (), result(player1->name)); - - void switchteam(const char *team) - { + void switchteam(const char *team) { if(player1->clientnum < 0) filtertext(player1->team, team, false, false, MAXTEAMLEN); else addmsg(N_SWITCHTEAM, "rs", team); } - void printteam() - { + void printteam() { conoutf("your team is: %s", player1->team); } - ICOMMAND(team, "sN", (char *s, int *numargs), - { + ICOMMAND(team, "sN", (char *s, int *numargs), { if(*numargs > 0) switchteam(s); else if(!*numargs) printteam(); else result(player1->team); }); ICOMMAND(getteam, "", (), result(player1->team)); - - struct authkey - { + struct authkey { char *name, *key, *desc; int lastauth; - authkey(const char *name, const char *key, const char *desc) : name(newstring(name)), key(newstring(key)), desc(newstring(desc)), - lastauth(0) - { + lastauth(0) { } - - ~authkey() - { + ~authkey() { DELETEA(name); DELETEA(key); DELETEA(desc); } }; vector<authkey *> authkeys; - - authkey *findauthkey(const char *desc = "") - { + authkey *findauthkey(const char *desc = "") { loopv(authkeys) if(!strcmp(authkeys[i]->desc, desc) && !strcasecmp(authkeys[i]->name, player1->name)) return authkeys[i]; loopv(authkeys) if(!strcmp(authkeys[i]->desc, desc)) return authkeys[i]; return NULL; } - VARP(autoauth, 0, 1, 1); - - void addauthkey(const char *name, const char *key, const char *desc) - { + void addauthkey(const char *name, const char *key, const char *desc) { loopvrev(authkeys) if(!strcmp(authkeys[i]->desc, desc) && !strcmp(authkeys[i]->name, name)) delete authkeys.remove(i); if(name[0] && key[0]) authkeys.add(new authkey(name, key, desc)); } ICOMMAND(authkey, "sss", (char *name, char *key, char *desc), addauthkey(name, key, desc)); - - bool hasauthkey(const char *name, const char *desc) - { + bool hasauthkey(const char *name, const char *desc) { if(!name[0] && !desc[0]) return authkeys.length() > 0; loopvrev(authkeys) if(!strcmp(authkeys[i]->desc, desc) && !strcmp(authkeys[i]->name, name)) return true; return false; } - ICOMMAND(hasauthkey, "ss", (char *name, char *desc), intret(hasauthkey(name, desc) ? 1 : 0)); - - void genauthkey(const char *secret) - { + void genauthkey(const char *secret) { if(!secret[0]) { conoutf(CON_ERROR, "you must specify a secret password"); return; } vector<char> privkey, pubkey; genprivkey(secret, privkey, pubkey); @@ -101,9 +74,7 @@ namespace game result(privkey.getbuf()); } COMMAND(genauthkey, "s"); - - void getpubkey(const char *desc) - { + void getpubkey(const char *desc) { authkey *k = findauthkey(desc); if(!k) { if(desc[0]) conoutf(CON_ERROR, "no authkey found: %s", desc); else conoutf(CON_ERROR, "no global authkey found"); return; } vector<char> pubkey; @@ -111,13 +82,10 @@ namespace game result(pubkey.getbuf()); } COMMAND(getpubkey, "s"); - - void saveauthkeys() - { + void saveauthkeys() { stream *f = openfile("auth.cfg", "w"); if(!f) { conoutf(CON_ERROR, "failed to open auth.cfg for writing"); return; } - loopv(authkeys) - { + loopv(authkeys) { authkey *a = authkeys[i]; f->printf("authkey %s %s %s\n", escapestring(a->name), escapestring(a->key), escapestring(a->desc)); } @@ -125,139 +93,104 @@ namespace game delete f; } COMMAND(saveauthkeys, ""); - - void sendmapinfo() - { + void sendmapinfo() { if(!connected) return; sendcrc = true; if(player1->state!=CS_SPECTATOR || player1->privilege || !remote) senditemstoserver = true; } - - void writeclientinfo(stream *f) - { + void writeclientinfo(stream *f) { f->printf("name %s\n", escapestring(player1->name)); } - - bool allowedittoggle() - { + bool allowedittoggle() { if(editmode) return true; - if(isconnected() && multiplayer(false) && !m_edit) - { + if(isconnected() && multiplayer(false) && !m_edit) { conoutf(CON_ERROR, "editing in multiplayer requires coop edit mode (1)"); return false; } return execidentbool("allowedittoggle", true); } - - void edittoggled(bool on) - { + void edittoggled(bool on) { addmsg(N_EDITMODE, "ri", on ? 1 : 0); if(player1->state==CS_DEAD) deathstate(player1, true); else if(player1->state==CS_EDITING && player1->editstate==CS_DEAD) showscores(false); disablezoom(); player1->suicided = player1->respawned = -2; } - - const char *getclientname(int cn) - { + const char *getclientname(int cn) { fpsent *d = getclient(cn); return d ? d->name : ""; } ICOMMAND(getclientname, "i", (int *cn), result(getclientname(*cn))); - - const char *getclientteam(int cn) - { + const char *getclientteam(int cn) { fpsent *d = getclient(cn); return d ? d->team : ""; } ICOMMAND(getclientteam, "i", (int *cn), result(getclientteam(*cn))); - - const char *getclienticon(int cn) - { + const char *getclienticon(int cn) { fpsent *d = getclient(cn); if(!d || d->state==CS_SPECTATOR) return "spectator"; const playermodelinfo &mdl = getplayermodelinfo(d); return m_teammode ? (isteam(player1->team, d->team) ? mdl.blueicon : mdl.redicon) : mdl.ffaicon; } ICOMMAND(getclienticon, "i", (int *cn), result(getclienticon(*cn))); - - bool ismaster(int cn) - { + bool ismaster(int cn) { fpsent *d = getclient(cn); return d && d->privilege >= PRIV_MASTER; } ICOMMAND(ismaster, "i", (int *cn), intret(ismaster(*cn) ? 1 : 0)); - - bool isauth(int cn) - { + bool isauth(int cn) { fpsent *d = getclient(cn); return d && d->privilege >= PRIV_AUTH; } ICOMMAND(isauth, "i", (int *cn), intret(isauth(*cn) ? 1 : 0)); - - bool isadmin(int cn) - { + bool isadmin(int cn) { fpsent *d = getclient(cn); return d && d->privilege >= PRIV_ADMIN; } ICOMMAND(isadmin, "i", (int *cn), intret(isadmin(*cn) ? 1 : 0)); - ICOMMAND(getmastermode, "", (), intret(mastermode)); ICOMMAND(mastermodename, "i", (int *mm), result(server::mastermodename(*mm, ""))); - - bool isspectator(int cn) - { + bool isspectator(int cn) { fpsent *d = getclient(cn); return d && d->state==CS_SPECTATOR; } ICOMMAND(isspectator, "i", (int *cn), intret(isspectator(*cn) ? 1 : 0)); - - bool isai(int cn, int type) - { + bool isai(int cn, int type) { fpsent *d = getclient(cn); int aitype = type > 0 && type < AI_MAX ? type : AI_BOT; return d && d->aitype==aitype; } ICOMMAND(isai, "ii", (int *cn, int *type), intret(isai(*cn, *type) ? 1 : 0)); - - int parseplayer(const char *arg) - { + int parseplayer(const char *arg) { char *end; int n = strtol(arg, &end, 10); - if(*arg && !*end) - { + if(*arg && !*end) { if(n!=player1->clientnum && !clients.inrange(n)) return -1; return n; } // try case sensitive first - loopv(players) - { + loopv(players) { fpsent *o = players[i]; if(!strcmp(arg, o->name)) return o->clientnum; } // nothing found, try case insensitive - loopv(players) - { + loopv(players) { fpsent *o = players[i]; if(!strcasecmp(arg, o->name)) return o->clientnum; } return -1; } ICOMMAND(getclientnum, "s", (char *name), intret(name[0] ? parseplayer(name) : player1->clientnum)); - - void listclients(bool local, bool bots) - { + void listclients(bool local, bool bots) { vector<char> buf; string cn; int numclients = 0; - if(local && connected) - { + if(local && connected) { formatstring(cn, "%d", player1->clientnum); buf.put(cn, strlen(cn)); numclients++; } - loopv(clients) if(clients[i] && (bots || clients[i]->aitype == AI_NONE)) - { + loopv(clients) if(clients[i] && (bots || clients[i]->aitype == AI_NONE)) { formatstring(cn, "%d", clients[i]->clientnum); if(numclients++) buf.add(' '); buf.put(cn, strlen(cn)); @@ -266,26 +199,19 @@ namespace game result(buf.getbuf()); } ICOMMAND(listclients, "bb", (int *local, int *bots), listclients(*local>0, *bots!=0)); - - void clearbans() - { + void clearbans() { addmsg(N_CLEARBANS, "r"); } COMMAND(clearbans, ""); - - void kick(const char *victim, const char *reason) - { + void kick(const char *victim, const char *reason) { int vn = parseplayer(victim); if(vn>=0 && vn!=player1->clientnum) addmsg(N_KICK, "ris", vn, reason); } COMMAND(kick, "ss"); - - void authkick(const char *desc, const char *victim, const char *reason) - { + void authkick(const char *desc, const char *victim, const char *reason) { authkey *a = findauthkey(desc); int vn = parseplayer(victim); - if(a && vn>=0 && vn!=player1->clientnum) - { + if(a && vn>=0 && vn!=player1->clientnum) { a->lastauth = lastmillis; addmsg(N_AUTHKICK, "rssis", a->desc, a->name, vn, reason); } @@ -293,60 +219,45 @@ namespace game ICOMMAND(authkick, "ss", (const char *victim, const char *reason), authkick("", victim, reason)); ICOMMAND(sauthkick, "ss", (const char *victim, const char *reason), if(servauth[0]) authkick(servauth, victim, reason)); ICOMMAND(dauthkick, "sss", (const char *desc, const char *victim, const char *reason), if(desc[0]) authkick(desc, victim, reason)); - vector<int> ignores; - - void ignore(int cn) - { + void ignore(int cn) { fpsent *d = getclient(cn); if(!d || d == player1) return; conoutf("ignoring %s", d->name); if(ignores.find(cn) < 0) ignores.add(cn); } - - void unignore(int cn) - { + void unignore(int cn) { if(ignores.find(cn) < 0) return; fpsent *d = getclient(cn); if(d) conoutf("stopped ignoring %s", d->name); ignores.removeobj(cn); } - bool isignored(int cn) { return ignores.find(cn) >= 0; } - ICOMMAND(ignore, "s", (char *arg), ignore(parseplayer(arg))); ICOMMAND(unignore, "s", (char *arg), unignore(parseplayer(arg))); ICOMMAND(isignored, "s", (char *arg), intret(isignored(parseplayer(arg)) ? 1 : 0)); - - void setteam(const char *arg1, const char *arg2) - { + void setteam(const char *arg1, const char *arg2) { int i = parseplayer(arg1); if(i>=0) addmsg(N_SETTEAM, "ris", i, arg2); } COMMAND(setteam, "ss"); - - void hashpwd(const char *pwd) - { + void hashpwd(const char *pwd) { if(player1->clientnum<0) return; string hash; server::hashpassword(player1->clientnum, sessionid, pwd, hash); result(hash); } COMMAND(hashpwd, "s"); - - void setmaster(const char *arg, const char *who) - { + void setmaster(const char *arg, const char *who) { if(!arg[0]) return; int val = 1, cn = player1->clientnum; - if(who[0]) - { + if(who[0]) { cn = parseplayer(who); if(cn < 0) return; } string hash = ""; if(!arg[1] && isdigit(arg[0])) val = parseint(arg); - else - { + else { if(cn != player1->clientnum) return; server::hashpassword(player1->clientnum, sessionid, arg, hash); } @@ -354,9 +265,7 @@ namespace game } COMMAND(setmaster, "ss"); ICOMMAND(mastermode, "i", (int *val), addmsg(N_MASTERMODE, "ri", *val)); - - bool tryauth(const char *desc) - { + bool tryauth(const char *desc) { authkey *a = findauthkey(desc); if(!a) return false; a->lastauth = lastmillis; @@ -366,45 +275,32 @@ namespace game ICOMMAND(auth, "s", (char *desc), tryauth(desc)); ICOMMAND(sauth, "", (), if(servauth[0]) tryauth(servauth)); ICOMMAND(dauth, "s", (char *desc), if(desc[0]) tryauth(desc)); - ICOMMAND(getservauth, "", (), result(servauth)); - - void togglespectator(int val, const char *who) - { + void togglespectator(int val, const char *who) { int i = who[0] ? parseplayer(who) : player1->clientnum; if(i>=0) addmsg(N_SPECTATOR, "rii", i, val); } ICOMMAND(spectator, "is", (int *val, char *who), togglespectator(*val, who)); - ICOMMAND(checkmaps, "", (), addmsg(N_CHECKMAPS, "r")); - int gamemode = INT_MAX, nextmode = INT_MAX; string clientmap = ""; - - void changemapserv(const char *name, int mode) // forced map change from the server - { - if(multiplayer(false) && !m_mp(mode)) - { + void changemapserv(const char *name, int mode) { // forced map change from the server { + if(multiplayer(false) && !m_mp(mode)) { conoutf(CON_ERROR, "mode %s (%d) not supported in multiplayer", server::modename(gamemode), gamemode); loopi(NUMGAMEMODES) if(m_mp(STARTGAMEMODE + i)) { mode = STARTGAMEMODE + i; break; } } - gamemode = mode; nextmode = mode; if(editmode) toggleedit(); if(m_demo) { entities::resetspawns(); return; } - if((m_edit && !name[0]) || !load_world(name)) - { + if((m_edit && !name[0]) || !load_world(name)) { emptymap(0, true, name); senditemstoserver = false; } startgame(); } - - void setmode(int mode) - { - if(multiplayer(false) && !m_mp(mode)) - { + void setmode(int mode) { + if(multiplayer(false) && !m_mp(mode)) { conoutf(CON_ERROR, "mode %s (%d) not supported in multiplayer", server::modename(mode), mode); intret(0); return; @@ -414,11 +310,9 @@ namespace game } ICOMMAND(mode, "i", (int *val), setmode(*val)); ICOMMAND(getmode, "", (), intret(gamemode)); - ICOMMAND(timeremaining, "i", (int *formatted), - { + ICOMMAND(timeremaining, "i", (int *formatted), { int val = max(maplimit - lastmillis + 999, 0)/1000; - if(*formatted) - { + if(*formatted) { defformatstring(str, "%d:%02d", val/60, val%60); result(str); } @@ -432,46 +326,32 @@ namespace game ICOMMANDS("m_demo", "i", (int *mode), { int gamemode = *mode; intret(m_demo); }); ICOMMANDS("m_edit", "i", (int *mode), { int gamemode = *mode; intret(m_edit); }); ICOMMANDS("m_lobby", "i", (int *mode), { int gamemode = *mode; intret(m_lobby); }); - - void changemap(const char *name, int mode) // request map change, server may ignore - { - if(!remote) - { + void changemap(const char *name, int mode) { // request map change, server may ignore { + if(!remote) { server::forcemap(name, mode); if(!isconnected()) localconnect(); } else if(player1->state!=CS_SPECTATOR || player1->privilege) addmsg(N_MAPVOTE, "rsi", name, mode); } - void changemap(const char *name) - { + void changemap(const char *name) { changemap(name, m_valid(nextmode) ? nextmode : (remote ? 0 : 1)); } ICOMMAND(map, "s", (char *name), changemap(name)); - - void forceintermission() - { + void forceintermission() { if(!remote && !hasnonlocalclients()) server::startintermission(); else addmsg(N_FORCEINTERMISSION, "r"); } - - void forceedit(const char *name) - { + void forceedit(const char *name) { changemap(name, 1); } - - void newmap(int size) - { + void newmap(int size) { addmsg(N_NEWMAP, "ri", size); } - int needclipboard = -1; - - void sendclipboard() - { + void sendclipboard() { uchar *outbuf = NULL; int inlen = 0, outlen = 0; - if(!packeditinfo(localedit, inlen, outbuf, outlen)) - { + if(!packeditinfo(localedit, inlen, outbuf, outlen)) { outbuf = NULL; inlen = outlen = 0; } @@ -483,22 +363,16 @@ namespace game sendclientpacket(p.finalize(), 1); needclipboard = -1; } - - void edittrigger(const selinfo &sel, int op, int arg1, int arg2, int arg3, const VSlot *vs) - { - if(m_edit) switch(op) - { + void edittrigger(const selinfo &sel, int op, int arg1, int arg2, int arg3, const VSlot *vs) { + if(m_edit) switch(op) { case EDIT_FLIP: case EDIT_COPY: case EDIT_PASTE: - case EDIT_DELCUBE: - { - switch(op) - { + case EDIT_DELCUBE: { + switch(op) { case EDIT_COPY: needclipboard = 0; break; case EDIT_PASTE: - if(needclipboard > 0) - { + if(needclipboard > 0) { c2sinfo(true); sendclipboard(); } @@ -509,8 +383,7 @@ namespace game sel.cx, sel.cxs, sel.cy, sel.cys, sel.corner); break; } - case EDIT_ROTATE: - { + case EDIT_ROTATE: { addmsg(N_EDITF + op, "ri9i5", sel.o.x, sel.o.y, sel.o.z, sel.s.x, sel.s.y, sel.s.z, sel.grid, sel.orient, sel.cx, sel.cxs, sel.cy, sel.cys, sel.corner, @@ -518,22 +391,19 @@ namespace game break; } case EDIT_MAT: - case EDIT_FACE: - { + case EDIT_FACE: { addmsg(N_EDITF + op, "ri9i6", sel.o.x, sel.o.y, sel.o.z, sel.s.x, sel.s.y, sel.s.z, sel.grid, sel.orient, sel.cx, sel.cxs, sel.cy, sel.cys, sel.corner, arg1, arg2); break; } - case EDIT_TEX: - { + case EDIT_TEX: { int tex1 = shouldpacktex(arg1); if(addmsg(N_EDITF + op, "ri9i6", sel.o.x, sel.o.y, sel.o.z, sel.s.x, sel.s.y, sel.s.z, sel.grid, sel.orient, sel.cx, sel.cxs, sel.cy, sel.cys, sel.corner, - tex1 ? tex1 : arg1, arg2)) - { + tex1 ? tex1 : arg1, arg2)) { messages.pad(2); int offset = messages.length(); if(tex1) packvslot(messages, arg1); @@ -541,14 +411,12 @@ namespace game } break; } - case EDIT_REPLACE: - { + case EDIT_REPLACE: { int tex1 = shouldpacktex(arg1), tex2 = shouldpacktex(arg2); if(addmsg(N_EDITF + op, "ri9i7", sel.o.x, sel.o.y, sel.o.z, sel.s.x, sel.s.y, sel.s.z, sel.grid, sel.orient, sel.cx, sel.cxs, sel.cy, sel.cys, sel.corner, - tex1 ? tex1 : arg1, tex2 ? tex2 : arg2, arg3)) - { + tex1 ? tex1 : arg1, tex2 ? tex2 : arg2, arg3)) { messages.pad(2); int offset = messages.length(); if(tex1) packvslot(messages, arg1); @@ -557,18 +425,15 @@ namespace game } break; } - case EDIT_REMIP: - { + case EDIT_REMIP: { addmsg(N_EDITF + op, "r"); break; } - case EDIT_VSLOT: - { + case EDIT_VSLOT: { if(addmsg(N_EDITF + op, "ri9i6", sel.o.x, sel.o.y, sel.o.z, sel.s.x, sel.s.y, sel.s.z, sel.grid, sel.orient, sel.cx, sel.cxs, sel.cy, sel.cys, sel.corner, - arg1, arg2)) - { + arg1, arg2)) { messages.pad(2); int offset = messages.length(); packvslot(messages, vs); @@ -577,12 +442,10 @@ namespace game break; } case EDIT_UNDO: - case EDIT_REDO: - { + case EDIT_REDO: { uchar *outbuf = NULL; int inlen = 0, outlen = 0; - if(packundo(op, inlen, outbuf, outlen)) - { + if(packundo(op, inlen, outbuf, outlen)) { if(addmsg(N_EDITF + op, "ri2", inlen, outlen)) messages.put(outbuf, outlen); delete[] outbuf; } @@ -590,13 +453,9 @@ namespace game } } } - - void printvar(fpsent *d, ident *id) - { - if(id) switch(id->type) - { - case ID_VAR: - { + void printvar(fpsent *d, ident *id) { + if(id) switch(id->type) { + case ID_VAR: { int val = *id->storage.i; string str; if(val < 0) @@ -616,20 +475,15 @@ namespace game break; } } - - void vartrigger(ident *id) - { + void vartrigger(ident *id) { if(!m_edit) return; - switch(id->type) - { + switch(id->type) { case ID_VAR: addmsg(N_EDITVAR, "risi", ID_VAR, id->name, *id->storage.i); break; - case ID_FVAR: addmsg(N_EDITVAR, "risf", ID_FVAR, id->name, *id->storage.f); break; - case ID_SVAR: addmsg(N_EDITVAR, "riss", ID_SVAR, id->name, *id->storage.s); break; @@ -637,83 +491,64 @@ namespace game } printvar(player1, id); } - - void pausegame(bool val) - { + void pausegame(bool val) { if(!connected) return; if(!remote) server::forcepaused(val); else addmsg(N_PAUSEGAME, "ri", val ? 1 : 0); } ICOMMAND(pausegame, "i", (int *val), pausegame(*val > 0)); - ICOMMAND(paused, "iN$", (int *val, int *numargs, ident *id), - { + ICOMMAND(paused, "iN$", (int *val, int *numargs, ident *id), { if(*numargs > 0) pausegame(clampvar(id, *val, 0, 1) > 0); else if(*numargs < 0) intret(gamepaused ? 1 : 0); else printvar(id, gamepaused ? 1 : 0); }); - bool ispaused() { return gamepaused; } - bool allowmouselook() { return !gamepaused || !remote || m_edit; } - - void changegamespeed(int val) - { + void changegamespeed(int val) { if(!connected) return; if(!remote) server::forcegamespeed(val); else addmsg(N_GAMESPEED, "ri", val); } - ICOMMAND(gamespeed, "iN$", (int *val, int *numargs, ident *id), - { + ICOMMAND(gamespeed, "iN$", (int *val, int *numargs, ident *id), { if(*numargs > 0) changegamespeed(clampvar(id, *val, 10, 1000)); else if(*numargs < 0) intret(gamespeed); else printvar(id, gamespeed); }); - int scaletime(int t) { return t*gamespeed; } - // collect c2s messages conveniently vector<uchar> messages; int messagecn = -1, messagereliable = false; - - bool addmsg(int type, const char *fmt, ...) - { + bool addmsg(int type, const char *fmt, ...) { if(!connected) return false; static uchar buf[MAXTRANS]; ucharbuf p(buf, sizeof(buf)); putint(p, type); int numi = 1, numf = 0, nums = 0, mcn = -1; bool reliable = false; - if(fmt) - { + if(fmt) { va_list args; va_start(args, fmt); - while(*fmt) switch(*fmt++) - { + while(*fmt) switch(*fmt++) { case 'r': reliable = true; break; - case 'c': - { + case 'c': { fpsent *d = va_arg(args, fpsent *); mcn = !d || d == player1 ? -1 : d->clientnum; break; } - case 'v': - { + case 'v': { int n = va_arg(args, int); int *v = va_arg(args, int *); loopi(n) putint(p, v[i]); numi += n; break; } - - case 'i': - { + case 'i': { int n = isdigit(*fmt) ? *fmt++-'0' : 1; loopi(n) putint(p, va_arg(args, int)); numi += n; break; } - case 'f': - { + case 'f': { int n = isdigit(*fmt) ? *fmt++-'0' : 1; loopi(n) putfloat(p, (float)va_arg(args, double)); numf += n; @@ -726,8 +561,7 @@ namespace game int num = nums || numf ? 0 : numi, msgsize = server::msgsizelookup(type); if(msgsize && num!=msgsize) { fatal("inconsistent msg size for %d (%d != %d)", type, num, msgsize); } if(reliable) messagereliable = true; - if(mcn != messagecn) - { + if(mcn != messagecn) { static uchar mbuf[16]; ucharbuf m(mbuf, sizeof(mbuf)); putint(m, N_FROMAI); @@ -738,25 +572,17 @@ namespace game messages.put(buf, p.length()); return true; } - - void connectattempt(const char *name, const char *password, const ENetAddress &address) - { + void connectattempt(const char *name, const char *password, const ENetAddress &address) { copystring(connectpass, password); } - - void connectfail() - { + void connectfail() { memset(connectpass, 0, sizeof(connectpass)); } - - void gameconnect(bool _remote) - { + void gameconnect(bool _remote) { remote = _remote; if(editmode) toggleedit(); } - - void gamedisconnect(bool cleanup) - { + void gamedisconnect(bool cleanup) { if(remote) stopfollowing(); ignores.setsize(0); connected = remote = false; @@ -775,26 +601,19 @@ namespace game gamepaused = false; gamespeed = 100; clearclients(false); - if(cleanup) - { + if(cleanup) { nextmode = gamemode = INT_MAX; clientmap[0] = '\0'; } } - VARP(teamcolorchat, 0, 1, 1); const char *chatcolorname(fpsent *d) { return teamcolorchat ? teamcolorname(d, NULL) : colorname(d); } - void toserver(char *text) { conoutf(CON_CHAT, "%s:\f0 %s", chatcolorname(player1), text); addmsg(N_TEXT, "rcs", player1, text); } COMMANDN(say, toserver, "C"); - void sayteam(char *text) { conoutf(CON_TEAMCHAT, "\fs\f8[team]\fr %s: \f8%s", chatcolorname(player1), text); addmsg(N_SAYTEAM, "rcs", player1, text); } COMMAND(sayteam, "C"); - ICOMMAND(servcmd, "C", (char *cmd), addmsg(N_SERVCMD, "rs", cmd)); - - static void sendposition(fpsent *d, packetbuf &q) - { + static void sendposition(fpsent *d, packetbuf &q) { putint(q, N_POS); putuint(q, d->clientnum); // 3 bits phys state, 1 bit life sequence, 2 bits move, 2 bits strafe @@ -808,16 +627,14 @@ namespace game if(o.y < 0 || o.y > 0xFFFF) flags |= 1<<1; if(o.z < 0 || o.z > 0xFFFF) flags |= 1<<2; if(vel > 0xFF) flags |= 1<<3; - if(fall > 0) - { + if(fall > 0) { flags |= 1<<4; if(fall > 0xFF) flags |= 1<<5; if(d->falling.x || d->falling.y || d->falling.z > 0) flags |= 1<<6; } if((lookupmaterial(d->feetpos())&MATF_CLIP) == MAT_GAMECLIP) flags |= 1<<7; putuint(q, flags); - loopk(3) - { + loopk(3) { q.put(o[k]&0xFF); q.put((o[k]>>8)&0xFF); if(o[k] < 0 || o[k] > 0xFFFF) q.put((o[k]>>16)&0xFF); @@ -833,12 +650,10 @@ namespace game uint veldir = (velyaw < 0 ? 360 + int(velyaw)%360 : int(velyaw)%360) + clamp(int(velpitch+90), 0, 180)*360; q.put(veldir&0xFF); q.put((veldir>>8)&0xFF); - if(fall > 0) - { + if(fall > 0) { q.put(fall&0xFF); if(fall > 0xFF) q.put((fall>>8)&0xFF); - if(d->falling.x || d->falling.y || d->falling.z > 0) - { + if(d->falling.x || d->falling.y || d->falling.z > 0) { float fallyaw, fallpitch; vectoyawpitch(d->falling, fallyaw, fallpitch); uint falldir = (fallyaw < 0 ? 360 + int(fallyaw)%360 : int(fallyaw)%360) + clamp(int(fallpitch+90), 0, 180)*360; @@ -847,26 +662,19 @@ namespace game } } } - - void sendposition(fpsent *d, bool reliable) - { + void sendposition(fpsent *d, bool reliable) { if(d->state != CS_ALIVE && d->state != CS_EDITING) return; packetbuf q(100, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); sendposition(d, q); sendclientpacket(q.finalize(), 0); } - - void sendpositions() - { - loopv(players) - { + void sendpositions() { + loopv(players) { fpsent *d = players[i]; - if((d == player1 || d->ai) && (d->state == CS_ALIVE || d->state == CS_EDITING)) - { + if((d == player1 || d->ai) && (d->state == CS_ALIVE || d->state == CS_EDITING)) { packetbuf q(100); sendposition(d, q); - for(int j = i+1; j < players.length(); j++) - { + for(int j = i+1; j < players.length(); j++) { fpsent *d = players[j]; if((d == player1 || d->ai) && (d->state == CS_ALIVE || d->state == CS_EDITING)) sendposition(d, q); @@ -876,12 +684,9 @@ namespace game } } } - - void sendmessages() - { + void sendmessages() { packetbuf p(MAXTRANS); - if(sendcrc) - { + if(sendcrc) { p.reliable(); sendcrc = false; const char *mname = getclientmap(); @@ -889,31 +694,26 @@ namespace game sendstring(mname, p); putint(p, mname[0] ? getmapcrc() : 0); } - if(senditemstoserver) - { + if(senditemstoserver) { if(!m_noitems) p.reliable(); if(!m_noitems) entities::putitems(p); senditemstoserver = false; } - if(messages.length()) - { + if(messages.length()) { p.put(messages.getbuf(), messages.length()); messages.setsize(0); if(messagereliable) p.reliable(); messagereliable = false; messagecn = -1; } - if(totalmillis-lastping>250) - { + if(totalmillis-lastping>250) { putint(p, N_PING); putint(p, totalmillis); lastping = totalmillis; } sendclientpacket(p.finalize(), 1); } - - void c2sinfo(bool force) // send update to the server - { + void c2sinfo(bool force) { // send update to the server { static int lastupdate = -1000; if(totalmillis - lastupdate < 33 && !force) return; // don't update faster than 30fps lastupdate = totalmillis; @@ -921,73 +721,58 @@ namespace game sendmessages(); flushclient(); } - - void sendintro() - { + void sendintro() { packetbuf p(MAXTRANS, ENET_PACKET_FLAG_RELIABLE); putint(p, N_CONNECT); sendstring(player1->name, p); putint(p, player1->playermodel); string hash = ""; - if(connectpass[0]) - { + if(connectpass[0]) { server::hashpassword(player1->clientnum, sessionid, connectpass, hash); memset(connectpass, 0, sizeof(connectpass)); } sendstring(hash, p); authkey *a = servauth[0] && autoauth ? findauthkey(servauth) : NULL; - if(a) - { + if(a) { a->lastauth = lastmillis; sendstring(a->desc, p); sendstring(a->name, p); } - else - { + else { sendstring("", p); sendstring("", p); } sendclientpacket(p.finalize(), 1); } - - void updatepos(fpsent *d) - { + void updatepos(fpsent *d) { // update the position of other clients in the game in our world // don't care if he's in the scenery or other players, // just don't overlap with our client - const float r = player1->radius+d->radius; const float dx = player1->o.x-d->o.x; const float dy = player1->o.y-d->o.y; const float dz = player1->o.z-d->o.z; const float rz = player1->aboveeye+d->eyeheight; const float fx = (float)fabs(dx), fy = (float)fabs(dy), fz = (float)fabs(dz); - if(fx<r && fy<r && fz<rz && player1->state!=CS_SPECTATOR && d->state!=CS_DEAD) - { + if(fx<r && fy<r && fz<rz && player1->state!=CS_SPECTATOR && d->state!=CS_DEAD) { if(fx<fy) d->o.y += dy<0 ? r-fy : -(r-fy); // push aside else d->o.x += dx<0 ? r-fx : -(r-fx); } int lagtime = totalmillis-d->lastupdate; - if(lagtime) - { + if(lagtime) { if(d->state!=CS_SPAWNING && d->lastupdate) d->plag = (d->plag*5+lagtime)/6; d->lastupdate = totalmillis; } } - - void parsepositions(ucharbuf &p) - { + void parsepositions(ucharbuf &p) { int type; - while(p.remaining()) switch(type = getint(p)) - { + while(p.remaining()) switch(type = getint(p)) { case N_DEMOPACKET: break; - case N_POS: // position of another client - { + case N_POS: { // position of another client { int cn = getuint(p), physstate = p.get(), flags = getuint(p); vec o, vel, falling; float yaw, pitch, roll; - loopk(3) - { + loopk(3) { int n = p.get(); n |= p.get()<<8; if(flags&(1<<k)) { n |= p.get()<<16; if(n&0x800000) n |= ~0U<<24; } o[k] = n/DMF; } @@ -999,11 +784,9 @@ namespace game dir = p.get(); dir |= p.get()<<8; vecfromyawpitch(dir%360, clamp(dir/360, 0, 180)-90, 1, 0, vel); vel.mul(mag/DVELF); - if(flags&(1<<4)) - { + if(flags&(1<<4)) { mag = p.get(); if(flags&(1<<5)) mag |= p.get()<<8; - if(flags&(1<<6)) - { + if(flags&(1<<6)) { dir = p.get(); dir |= p.get()<<8; vecfromyawpitch(dir%360, clamp(dir/360, 0, 180)-90, 1, 0, falling); } @@ -1028,8 +811,7 @@ namespace game d->physstate = physstate&7; updatephysstate(d); updatepos(d); - if(smoothmove && d->smoothmillis>=0 && oldpos.dist(d->o) < smoothdist) - { + if(smoothmove && d->smoothmillis>=0 && oldpos.dist(d->o) < smoothdist) { d->newpos = d->o; d->newyaw = d->yaw; d->newpitch = d->pitch; @@ -1050,36 +832,28 @@ namespace game if(d->state==CS_LAGGED || d->state==CS_SPAWNING) d->state = CS_ALIVE; break; } - - case N_TELEPORT: - { + case N_TELEPORT: { int cn = getint(p), tp = getint(p), td = getint(p); fpsent *d = getclient(cn); if(!d || d->lifesequence < 0 || d->state==CS_DEAD) continue; entities::teleporteffects(d, tp, td, false); break; } - - case N_JUMPPAD: - { + case N_JUMPPAD: { int cn = getint(p), jp = getint(p); fpsent *d = getclient(cn); if(!d || d->lifesequence < 0 || d->state==CS_DEAD) continue; entities::jumppadeffects(d, jp, false); break; } - default: neterr("type"); return; } } - - void parsestate(fpsent *d, ucharbuf &p, bool resume = false) - { + void parsestate(fpsent *d, ucharbuf &p, bool resume = false) { if(!d) { static fpsent dummy; d = &dummy; } - if(resume) - { + if(resume) { if(d==player1) getint(p); else d->state = getint(p); d->frags = getint(p); @@ -1094,36 +868,26 @@ namespace game d->armour = getint(p); d->maxarmour = getint(p); d->armourtype = getint(p); - if(resume && d==player1) - { + if(resume && d==player1) { getint(p); loopi(GUN_PISTOL-GUN_SG+1) getint(p); } - else - { + else { int gun = getint(p); d->gunselect = clamp(gun, int(GUN_FIST), int(GUN_PISTOL)); loopi(GUN_PISTOL-GUN_SG+1) d->ammo[GUN_SG+i] = getint(p); } } - extern int deathscore; - - void parsemessages(int cn, fpsent *d, ucharbuf &p) - { + void parsemessages(int cn, fpsent *d, ucharbuf &p) { static char text[MAXTRANS]; int type; bool mapchanged = false, demopacket = false; - - while(p.remaining()) switch(type = getint(p)) - { + while(p.remaining()) switch(type = getint(p)) { case N_DEMOPACKET: demopacket = true; break; - - case N_SERVINFO: // welcome messsage from the server - { + case N_SERVINFO: { // welcome messsage from the server { int mycn = getint(p), prot = getint(p); - if(prot!=PROTOCOL_VERSION) - { + if(prot!=PROTOCOL_VERSION) { conoutf(CON_ERROR, "you are using a different game protocol (you: %d, server: %d)", PROTOCOL_VERSION, prot); disconnect(); return; @@ -1136,21 +900,16 @@ namespace game sendintro(); break; } - - case N_WELCOME: - { + case N_WELCOME: { connected = true; notifywelcome(); break; } - - case N_PAUSEGAME: - { + case N_PAUSEGAME: { bool val = getint(p) > 0; int cn = getint(p); fpsent *a = cn >= 0 ? getclient(cn) : NULL; - if(!demopacket) - { + if(!demopacket) { gamepaused = val; player1->attacking = false; } @@ -1158,9 +917,7 @@ namespace game else conoutf("game is %s", val ? "paused" : "resumed"); break; } - - case N_GAMESPEED: - { + case N_GAMESPEED: { int val = clamp(getint(p), 10, 1000), cn = getint(p); fpsent *a = cn >= 0 ? getclient(cn) : NULL; if(!demopacket) gamespeed = val; @@ -1168,22 +925,17 @@ namespace game else conoutf("gamespeed is %d", val); break; } - - case N_CLIENT: - { + case N_CLIENT: { int cn = getint(p), len = getuint(p); ucharbuf q = p.subbuf(len); parsemessages(cn, getclient(cn), q); break; } - case N_SOUND: if(!d) return; playsound(getint(p), &d->o); break; - - case N_TEXT: - { + case N_TEXT: { if(!d) return; getstring(text, p); filtertext(text, text, true, true); @@ -1193,9 +945,7 @@ namespace game conoutf(CON_CHAT, "%s:\f0 %s", chatcolorname(d), text); break; } - - case N_SAYTEAM: - { + case N_SAYTEAM: { int tcn = getint(p); fpsent *t = getclient(tcn); getstring(text, p); @@ -1206,7 +956,6 @@ namespace game conoutf(CON_TEAMCHAT, "\fs\f8[team]\fr %s: \f8%s", chatcolorname(t), text); break; } - case N_MAPCHANGE: getstring(text, p); filtertext(text, text, false); @@ -1216,14 +965,11 @@ namespace game if(getint(p)) entities::spawnitems(); else senditemstoserver = false; break; - - case N_FORCEDEATH: - { + case N_FORCEDEATH: { int cn = getint(p); fpsent *d = cn==player1->clientnum ? player1 : newclient(cn); if(!d) break; - if(d==player1) - { + if(d==player1) { if(editmode) toggleedit(); stopfollowing(); if(deathscore) showscores(true); @@ -1232,24 +978,18 @@ namespace game d->state = CS_DEAD; break; } - - case N_ITEMLIST: - { + case N_ITEMLIST: { int n; - while((n = getint(p))>=0 && !p.overread()) - { + while((n = getint(p))>=0 && !p.overread()) { if(mapchanged) entities::setspawn(n, true); getint(p); // type } break; } - - case N_INITCLIENT: // another client either connected or changed name/team - { + case N_INITCLIENT: { // another client either connected or changed name/team { int cn = getint(p); fpsent *d = newclient(cn); - if(!d) - { + if(!d) { getstring(text, p); getstring(text, p); getint(p); @@ -1258,13 +998,11 @@ namespace game getstring(text, p); filtertext(text, text, false, false, MAXNAMELEN); if(!text[0]) copystring(text, "Anonymous"); - if(d->name[0]) // already connected - { + if(d->name[0]) { // already connected { if(strcmp(d->name, text) && !isignored(d->clientnum)) conoutf("%s is now known as %s", colorname(d), colorname(d, text)); } - else // new client - { + else { // new client { conoutf("\f0join:\f7 %s", colorname(d, text)); if(needclipboard >= 0) needclipboard++; } @@ -1275,32 +1013,24 @@ namespace game d->playermodel = 0; break; } - case N_SWITCHNAME: getstring(text, p); - if(d) - { + if(d) { filtertext(text, text, false, false, MAXNAMELEN); if(!text[0]) copystring(text, "Anonymous"); - if(strcmp(text, d->name)) - { + if(strcmp(text, d->name)) { if(!isignored(d->clientnum)) conoutf("%s is now known as %s", colorname(d), colorname(d, text)); copystring(d->name, text, MAXNAMELEN+1); } } break; - case N_SWITCHMODEL: break; - case N_CDIS: clientdisconnected(getint(p)); break; - - case N_SPAWN: - { - if(d) - { + case N_SPAWN: { + if(d) { if(d->state==CS_DEAD && d->lastpain) saveragdoll(d); d->respawn(); } @@ -1311,15 +1041,12 @@ namespace game lasthit = 0; break; } - - case N_SPAWNSTATE: - { + case N_SPAWNSTATE: { int scn = getint(p); fpsent *s = getclient(scn); if(!s) { parsestate(NULL, p); break; } if(s->state==CS_DEAD && s->lastpain) saveragdoll(s); - if(s==player1) - { + if(s==player1) { if(editmode) toggleedit(); stopfollowing(); } @@ -1327,8 +1054,7 @@ namespace game parsestate(s, p); s->state = CS_ALIVE; pickgamespawn(s); - if(s == player1) - { + if(s == player1) { showscores(false); lasthit = 0; } @@ -1336,9 +1062,7 @@ namespace game addmsg(N_SPAWN, "rcii", s, s->lifesequence, s->gunselect); break; } - - case N_SHOTFX: - { + case N_SHOTFX: { int scn = getint(p), gun = getint(p), id = getint(p); vec from, to; loopk(3) from[k] = getint(p)/DMF; @@ -1354,17 +1078,14 @@ namespace game shoteffects(s->gunselect, from, to, s, false, id, prevaction); break; } - - case N_EXPLODEFX: - { + case N_EXPLODEFX: { int ecn = getint(p), gun = getint(p), id = getint(p); fpsent *e = getclient(ecn); if(!e) break; explodeeffects(gun, e, false, id); break; } - case N_DAMAGE: - { + case N_DAMAGE: { int tcn = getint(p), acn = getint(p), damage = getint(p), @@ -1379,9 +1100,7 @@ namespace game damaged(damage, target, actor, false); break; } - - case N_HITPUSH: - { + case N_HITPUSH: { int tcn = getint(p), gun = getint(p), damage = getint(p); fpsent *target = getclient(tcn); vec dir; @@ -1389,9 +1108,7 @@ namespace game if(target) target->hitpush(damage * (target->health<=0 ? deadpush : 1), dir, NULL, gun); break; } - - case N_DIED: - { + case N_DIED: { int vcn = getint(p), acn = getint(p), frags = getint(p), tfrags = getint(p); fpsent *victim = getclient(vcn), *actor = getclient(acn); @@ -1399,8 +1116,7 @@ namespace game actor->frags = frags; if(m_teammode) setteaminfo(actor->team, tfrags); extern int hidefrags; - if(actor!=player1 && (!hidefrags)) - { + if(actor!=player1 && (!hidefrags)) { defformatstring(ds, "%d", actor->frags); particle_textcopy(actor->abovehead(), ds, PART_TEXT, 2000, 0x32FF64, 4.0f, -8); } @@ -1408,10 +1124,8 @@ namespace game killed(victim, actor); break; } - case N_TEAMINFO: - for(;;) - { + for(;;) { getstring(text, p); if(p.overread() || !text[0]) break; int frags = getint(p); @@ -1419,27 +1133,20 @@ namespace game if(m_teammode) setteaminfo(text, frags); } break; - - case N_GUNSELECT: - { + case N_GUNSELECT: { if(!d) return; int gun = getint(p); d->gunselect = clamp(gun, int(GUN_FIST), int(GUN_PISTOL)); playsound(S_WEAPLOAD, &d->o); break; } - - case N_TAUNT: - { + case N_TAUNT: { if(!d) return; d->lasttaunt = lastmillis; break; } - - case N_RESUME: - { - for(;;) - { + case N_RESUME: { + for(;;) { int cn = getint(p); if(p.overread() || cn<0) break; fpsent *d = (cn == player1->clientnum ? player1 : newclient(cn)); @@ -1447,9 +1154,7 @@ namespace game } break; } - - case N_ITEMSPAWN: - { + case N_ITEMSPAWN: { int i = getint(p); if(!entities::ents.inrange(i)) break; entities::setspawn(i, true); @@ -1463,21 +1168,16 @@ namespace game if(icon >= 0) particle_icon(vec(0.0f, 0.0f, 4.0f).add(entities::ents[i]->o), icon%4, icon/4, PART_HUD_ICON, 2000, 0xFFFFFF, 2.0f, -8); break; } - - case N_ITEMACC: // server acknowledges that I picked up this item - { + case N_ITEMACC: { // server acknowledges that I picked up this item { int i = getint(p), cn = getint(p); - if(cn >= 0) - { + if(cn >= 0) { fpsent *d = getclient(cn); entities::pickupeffects(i, d); } else entities::setspawn(i, true); break; } - - case N_CLIPBOARD: - { + case N_CLIPBOARD: { int cn = getint(p), unpacklen = getint(p), packlen = getint(p); fpsent *d = getclient(cn); ucharbuf q = p.subbuf(max(packlen, 0)); @@ -1485,15 +1185,13 @@ namespace game break; } case N_UNDO: - case N_REDO: - { + case N_REDO: { int cn = getint(p), unpacklen = getint(p), packlen = getint(p); fpsent *d = getclient(cn); ucharbuf q = p.subbuf(max(packlen, 0)); if(d) unpackundo(q.buf, q.maxlen, unpacklen); break; } - case N_EDITF: // coop editing messages case N_EDITT: case N_EDITM: @@ -1503,8 +1201,7 @@ namespace game case N_ROTATE: case N_REPLACE: case N_DELCUBE: - case N_EDITVSLOT: - { + case N_EDITVSLOT: { if(!d) return; selinfo sel; sel.o.x = getint(p); sel.o.y = getint(p); sel.o.z = getint(p); @@ -1512,11 +1209,9 @@ namespace game sel.grid = getint(p); sel.orient = getint(p); sel.cx = getint(p); sel.cxs = getint(p); sel.cy = getint(p), sel.cys = getint(p); sel.corner = getint(p); - switch(type) - { + switch(type) { case N_EDITF: { int dir = getint(p), mode = getint(p); if(sel.validate()) mpeditface(dir, mode, sel, false); break; } - case N_EDITT: - { + case N_EDITT: { int tex = getint(p), allfaces = getint(p); if(p.remaining() < 2) return; @@ -1531,8 +1226,7 @@ namespace game case N_COPY: if(d && sel.validate()) mpcopy(d->edit, sel, false); break; case N_PASTE: if(d && sel.validate()) mppaste(d->edit, sel, false); break; case N_ROTATE: { int dir = getint(p); if(sel.validate()) mprotate(dir, sel, false); break; } - case N_REPLACE: - { + case N_REPLACE: { int oldtex = getint(p), newtex = getint(p), insel = getint(p); @@ -1544,8 +1238,7 @@ namespace game break; } case N_DELCUBE: if(sel.validate()) mpdelcube(sel, false); break; - case N_EDITVSLOT: - { + case N_EDITVSLOT: { int delta = getint(p), allfaces = getint(p); if(p.remaining() < 2) return; @@ -1558,48 +1251,40 @@ namespace game } break; } - case N_REMIP: - { + case N_REMIP: { if(!d) return; conoutf("%s remipped", colorname(d)); mpremip(false); break; } - case N_EDITENT: // coop edit of ent - { + case N_EDITENT: { // coop edit of ent { if(!d) return; int i = getint(p); float x = getint(p)/DMF, y = getint(p)/DMF, z = getint(p)/DMF; int type = getint(p); int attr1 = getint(p), attr2 = getint(p), attr3 = getint(p), attr4 = getint(p), attr5 = getint(p); - mpeditent(i, vec(x, y, z), type, attr1, attr2, attr3, attr4, attr5, false); break; } - case N_EDITVAR: - { + case N_EDITVAR: { if(!d) return; int type = getint(p); getstring(text, p); string name; filtertext(name, text, false); ident *id = getident(name); - switch(type) - { - case ID_VAR: - { + switch(type) { + case ID_VAR: { int val = getint(p); if(id && id->flags&IDF_OVERRIDE && !(id->flags&IDF_READONLY)) setvar(name, val); break; } - case ID_FVAR: - { + case ID_FVAR: { float val = getfloat(p); if(id && id->flags&IDF_OVERRIDE && !(id->flags&IDF_READONLY)) setfvar(name, val); break; } - case ID_SVAR: - { + case ID_SVAR: { getstring(text, p); if(id && id->flags&IDF_OVERRIDE && !(id->flags&IDF_READONLY)) setsvar(name, text); break; @@ -1608,40 +1293,31 @@ namespace game printvar(d, id); break; } - case N_PONG: addmsg(N_CLIENTPING, "i", player1->ping = (player1->ping*5+totalmillis-getint(p))/6); break; - case N_CLIENTPING: if(!d) return; d->ping = getint(p); break; - case N_TIMEUP: timeupdate(getint(p)); break; - case N_SERVMSG: getstring(text, p); conoutf("%s", text); break; - - case N_SENDDEMOLIST: - { + case N_SENDDEMOLIST: { int demos = getint(p); if(demos <= 0) conoutf("no demos available"); - else loopi(demos) - { + else loopi(demos) { getstring(text, p); if(p.overread()) break; conoutf("%d. %s", i+1, text); } break; } - - case N_DEMOPLAYBACK: - { + case N_DEMOPLAYBACK: { int on = getint(p); if(on) player1->state = CS_SPECTATOR; else clearclients(); @@ -1651,80 +1327,62 @@ namespace game execident(on ? "demostart" : "demoend"); break; } - - case N_CURRENTMASTER: - { + case N_CURRENTMASTER: { int mm = getint(p), mn; loopv(players) players[i]->privilege = PRIV_NONE; - while((mn = getint(p))>=0 && !p.overread()) - { + while((mn = getint(p))>=0 && !p.overread()) { fpsent *m = mn==player1->clientnum ? player1 : newclient(mn); int priv = getint(p); if(m) m->privilege = priv; } - if(mm != mastermode) - { + if(mm != mastermode) { mastermode = mm; conoutf("mastermode is %s (%d)", server::mastermodename(mastermode), mastermode); } break; } - - case N_MASTERMODE: - { + case N_MASTERMODE: { mastermode = getint(p); conoutf("mastermode is %s (%d)", server::mastermodename(mastermode), mastermode); break; } - - case N_EDITMODE: - { + case N_EDITMODE: { int val = getint(p); if(!d) break; - if(val) - { + if(val) { d->editstate = d->state; d->state = CS_EDITING; } - else - { + else { d->state = d->editstate; if(d->state==CS_DEAD) deathstate(d, true); } break; } - - case N_SPECTATOR: - { + case N_SPECTATOR: { int sn = getint(p), val = getint(p); fpsent *s; - if(sn==player1->clientnum) - { + if(sn==player1->clientnum) { s = player1; if(val && remote && !player1->privilege) senditemstoserver = false; } else s = newclient(sn); if(!s) return; - if(val) - { - if(s==player1) - { + if(val) { + if(s==player1) { if(editmode) toggleedit(); if(s->state==CS_DEAD) showscores(false); disablezoom(); } s->state = CS_SPECTATOR; } - else if(s->state==CS_SPECTATOR) - { + else if(s->state==CS_SPECTATOR) { if(s==player1) stopfollowing(); deathstate(s, true); } break; } - - case N_SETTEAM: - { + case N_SETTEAM: { int wn = getint(p); getstring(text, p); int reason = getint(p); @@ -1736,44 +1394,34 @@ namespace game conoutf(fmt[reason], colorname(w), w->team); break; } - - case N_ANNOUNCE: - { + case N_ANNOUNCE: { int t = getint(p); - if (t==I_QUAD) { playsound(S_V_QUAD10, NULL, NULL, 0, 0, 0, -1, 0, 3000); conoutf(CON_GAMEINFO, "\f2quad damage will spawn in 10 seconds!"); } + if (t==I_QUAD) { playsound(S_V_QUAD10, NULL, NULL, 0, 0, 0, -1, 0, 3000); conoutf(CON_GAMEINFO, "\f2quad damage will spawn in 10 seconds!"); } else if(t==I_BOOST) { playsound(S_V_BOOST10, NULL, NULL, 0, 0, 0, -1, 0, 3000); conoutf(CON_GAMEINFO, "\f2health boost will spawn in 10 seconds!"); } break; } - - case N_NEWMAP: - { + case N_NEWMAP: { int size = getint(p); if(size>=0) emptymap(size, true, NULL); else enlargemap(true); - if(d && d!=player1) - { + if(d && d!=player1) { int newsize = 0; while(1<<newsize < getworldsize()) newsize++; conoutf(size>=0 ? "%s started a new map of size %d" : "%s enlarged the map to size %d", colorname(d), newsize); } break; } - - case N_REQAUTH: - { + case N_REQAUTH: { getstring(text, p); if(autoauth && text[0] && tryauth(text)) conoutf("server requested authkey \"%s\"", text); break; } - - case N_AUTHCHAL: - { + case N_AUTHCHAL: { getstring(text, p); authkey *a = findauthkey(text); uint id = (uint)getint(p); getstring(text, p); - if(a && a->lastauth && lastmillis - a->lastauth < 60*1000) - { + if(a && a->lastauth && lastmillis - a->lastauth < 60*1000) { vector<char> buf; answerchallenge(a->key, text, buf); //conoutf(CON_DEBUG, "answering %u, challenge %s with %s", id, text, buf.getbuf()); @@ -1786,9 +1434,7 @@ namespace game } break; } - - case N_INITAI: - { + case N_INITAI: { int bn = getint(p), on = getint(p), at = getint(p), sk = clamp(getint(p), 1, 101), pm = getint(p); string name, team; getstring(text, p); @@ -1800,45 +1446,35 @@ namespace game ai::init(b, at, on, sk, bn, pm, name, team); break; } - case N_SERVCMD: getstring(text, p); break; - default: neterr("type", cn < 0); return; } } - - struct demoreq - { + struct demoreq { int tag; string name; }; vector<demoreq> demoreqs; enum { MAXDEMOREQS = 7 }; static int lastdemoreq = 0; - - void receivefile(packetbuf &p) - { + void receivefile(packetbuf &p) { int type; - while(p.remaining()) switch(type = getint(p)) - { + while(p.remaining()) switch(type = getint(p)) { case N_DEMOPACKET: return; - case N_SENDDEMO: - { + case N_SENDDEMO: { string fname; fname[0] = '\0'; int tag = getint(p); - loopv(demoreqs) if(demoreqs[i].tag == tag) - { + loopv(demoreqs) if(demoreqs[i].tag == tag) { copystring(fname, demoreqs[i].name); demoreqs.remove(i); break; } - if(!fname[0]) - { + if(!fname[0]) { time_t t = time(NULL); size_t len = strftime(fname, sizeof(fname), "%Y-%m-%d_%H.%M.%S", localtime(&t)); fname[min(len, sizeof(fname)-1)] = '\0'; @@ -1855,9 +1491,7 @@ namespace game delete demo; break; } - - case N_SENDMAP: - { + case N_SENDMAP: { if(!m_edit) return; string oldname; copystring(oldname, getclientmap()); @@ -1876,69 +1510,52 @@ namespace game } } } - - void parsepacketclient(int chan, packetbuf &p) // processes any updates from the server - { + void parsepacketclient(int chan, packetbuf &p) { // processes any updates from the server { if(p.packet->flags&ENET_PACKET_FLAG_UNSEQUENCED) return; - switch(chan) - { + switch(chan) { case 0: parsepositions(p); break; - case 1: parsemessages(-1, NULL, p); break; - case 2: receivefile(p); break; } } - - void getmap() - { + void getmap() { if(!m_edit) { conoutf(CON_ERROR, "\"getmap\" only works in coop edit mode"); return; } conoutf("getting map..."); addmsg(N_GETMAP, "r"); } COMMAND(getmap, ""); - - void stopdemo() - { - if(remote) - { + void stopdemo() { + if(remote) { if(player1->privilege<PRIV_MASTER) return; addmsg(N_STOPDEMO, "r"); } else server::stopdemo(); } COMMAND(stopdemo, ""); - - void recorddemo(int val) - { + void recorddemo(int val) { if(remote && player1->privilege<PRIV_MASTER) return; addmsg(N_RECORDDEMO, "ri", val); } ICOMMAND(recorddemo, "i", (int *val), recorddemo(*val)); - - void cleardemos(int val) - { + void cleardemos(int val) { if(remote && player1->privilege<PRIV_MASTER) return; addmsg(N_CLEARDEMOS, "ri", val); } ICOMMAND(cleardemos, "i", (int *val), cleardemos(*val)); - - void getdemo(char *val, char *name) - { + void getdemo(char *val, char *name) { int i = 0; if(isdigit(val[0]) || name[0]) i = parseint(val); else name = val; if(i<=0) conoutf("getting demo..."); else conoutf("getting demo %d...", i); ++lastdemoreq; - if(name[0]) - { + if(name[0]) { if(demoreqs.length() >= MAXDEMOREQS) demoreqs.remove(0); demoreq &r = demoreqs.add(); r.tag = lastdemoreq; @@ -1947,29 +1564,23 @@ namespace game addmsg(N_GETDEMO, "rii", i, lastdemoreq); } ICOMMAND(getdemo, "ss", (char *val, char *name), getdemo(val, name)); - - void listdemos() - { + void listdemos() { conoutf("listing demos..."); addmsg(N_LISTDEMOS, "r"); } COMMAND(listdemos, ""); - - void sendmap() - { + void sendmap() { if(!m_edit || (player1->state==CS_SPECTATOR && remote && !player1->privilege)) { conoutf(CON_ERROR, "\"sendmap\" only works in coop edit mode"); return; } conoutf("sending map..."); defformatstring(mname, "sendmap_%d", lastmillis); save_world(mname, true); defformatstring(fname, "packages/maps/%s.ogz", mname); stream *map = openrawfile(path(fname), "rb"); - if(map) - { + if(map) { stream::offset len = map->size(); if(len > 4*1024*1024) conoutf(CON_ERROR, "map is too large"); else if(len <= 0) conoutf(CON_ERROR, "could not read map"); - else - { + else { sendfile(-1, 2, map); if(needclipboard >= 0) needclipboard++; } @@ -1979,13 +1590,10 @@ namespace game remove(findfile(fname, "rb")); } COMMAND(sendmap, ""); - - void gotoplayer(const char *arg) - { + void gotoplayer(const char *arg) { if(player1->state!=CS_SPECTATOR && player1->state!=CS_EDITING) return; int i = parseplayer(arg); - if(i>=0) - { + if(i>=0) { fpsent *d = getclient(i); if(!d || d==player1) return; player1->o = d->o; @@ -1996,9 +1604,7 @@ namespace game } } COMMANDN(goto, gotoplayer, "s"); - - void gotosel() - { + void gotosel() { if(player1->state!=CS_EDITING) return; player1->o = getselpos(); vec dir; |
