summaryrefslogtreecommitdiff
path: root/src/fpsgame/client.cpp
diff options
context:
space:
mode:
authorxolatile2025-08-06 22:54:55 +0200
committerxolatile2025-08-06 22:54:55 +0200
commit0a1172b75f571685c264a8b9d8ee224bbf11381f (patch)
treed041fdc68a60f0ebb48a3852bbcce6d9432f83d5 /src/fpsgame/client.cpp
parentaffde05dc07a94643f1fd2751b2b441f57f73d7d (diff)
downloadxolatile-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.cpp874
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;