From 1fe478aae44fd1fd0a8e584f600ac3e92fc0d7ee Mon Sep 17 00:00:00 2001 From: ac-stef Date: Sat, 3 Jun 2017 23:53:57 +0200 Subject: [PATCH] cleanup protocol ...and get master to compile again DOCREF hudextras mapstats_hud nextGameMode --- config/menus_settings.cfg | 1 - source/enet/unix.c | 2 + source/src/Makefile | 1 - source/src/bot/bot_waypoint.cpp | 5 +- source/src/client.cpp | 211 +++------------ source/src/clientgame.cpp | 74 ++---- source/src/clients2c.cpp | 214 +++------------- source/src/command.cpp | 30 ++- source/src/cube.h | 2 +- source/src/entity.h | 19 +- source/src/master.cpp | 76 +++--- source/src/physics.cpp | 8 +- source/src/protocol.cpp | 18 +- source/src/protocol.h | 18 +- source/src/protos.h | 11 - source/src/renderhud.cpp | 46 ---- source/src/server.cpp | 303 ++-------------------- source/src/server.h | 57 +---- source/src/serverbrowser.cpp | 23 +- source/src/serverchecks.h | 440 -------------------------------- source/src/texture.cpp | 1 + source/src/vertmodel.h | 1 - source/src/world.cpp | 9 +- source/src/world.h | 22 -- source/src/worldio.cpp | 35 +-- 25 files changed, 237 insertions(+), 1390 deletions(-) diff --git a/config/menus_settings.cfg b/config/menus_settings.cfg index dba8a349..39d0787f 100644 --- a/config/menus_settings.cfg +++ b/config/menus_settings.cfg @@ -144,7 +144,6 @@ menuitemslider [ Votes: ] 0 2 "$hidevote" ["Always show" "Show until you vot menuitemradio [ Graphics statistics: ] 0 2 "$showstats" [None "FPS Only" All] [ showstats $arg1 ] 1 menuitemslider [ Game time: ] 0 2 "$gametimedisplay" [None "Count backward" "Count forward"] [ gametimedisplay $arg1 ] 1 menuitemslider [ Wall clock: ] 0 6 [findlist $wallclockformatlist $wallclockformat] [None "HH:MM (local, 24h)" "HH:MM:SS (local, 24h)" "HH:MM (local, 12h)" "HH:MM:SS (local, 12h)" "HH:MM (UTC/GMT)" "HH:MM:SS (UTC/GMT)"] [ alias wallclockformat (at $wallclockformatlist $arg1)] 1 -menuitemslider [ Extra messages: ] 0 3 "$hudextras" ["No extra messages" "Show extra messages in console" "Pop up extra messages!" "SPAM EXTRA MESSAGES!"] [ hudextras $arg1 ] menuitemradio [ Hand alignment: ] 0 1 "$righthanded" [Left-handed Right-handed] [ righthanded $arg1 ] 1 menuitemslider [ Max-roll: ] 0 (getvarrange max maxroll) "$maxroll" 1 [ maxroll $arg1 ] menuitemslider [ Spectator max-roll: ] 0 (getvarrange max maxrollremote) "$maxrollremote" 2 [ maxrollremote $arg1 ] diff --git a/source/enet/unix.c b/source/enet/unix.c index be621915..cedaec5b 100644 --- a/source/enet/unix.c +++ b/source/enet/unix.c @@ -131,8 +131,10 @@ enet_address_get_host_ip (const ENetAddress * address, char * name, size_t nameL #else char * addr = inet_ntoa (* (struct in_addr *) & address -> host); if (addr != NULL) + { strncpy (name, addr, nameLength); name[nameLength - 1] = '\0'; + } else #endif return -1; diff --git a/source/src/Makefile b/source/src/Makefile index 0835506c..06bbfc69 100644 --- a/source/src/Makefile +++ b/source/src/Makefile @@ -131,7 +131,6 @@ SERVER_OBJS= \ tools-standalone.o \ wizard-standalone.o MASTER_OBJS= \ - crypto-standalone.o \ stream-standalone.o \ command-standalone.o \ master-standalone.o diff --git a/source/src/bot/bot_waypoint.cpp b/source/src/bot/bot_waypoint.cpp index 30551b70..8dbeec50 100644 --- a/source/src/bot/bot_waypoint.cpp +++ b/source/src/bot/bot_waypoint.cpp @@ -15,11 +15,8 @@ vec v_debuggoal = g_vecZero; CACWaypointClass WaypointClass; VAR(xhairwpsel, 0, 1, 1); -// FIXME: multiple selections support ? -// well, TBH I haven't groked this myself yet, but the following curselection segfaults the client, so I'm just putting in a sane-variant until someone groks it ;-) - ft 2011sep28 extern vector sels; -//#define curselection (xhairwpsel ? vec(sels.last().x, sels.last().y, S(sels.last().x, sels.last().y)->floor+2.0f) : vec(player1->o.x, player1->o.y, player1->o.z)) -#define curselection (vec(player1->o.x, player1->o.y, player1->o.z)) +#define curselection (xhairwpsel && sels.length() ? vec(sels.last().x, sels.last().y, S(sels.last().x, sels.last().y)->floor+2.0f) : vec(player1->o.x, player1->o.y, player1->o.z)) // Waypoint class begin diff --git a/source/src/client.cpp b/source/src/client.cpp index 34080850..67f19724 100644 --- a/source/src/client.cpp +++ b/source/src/client.cpp @@ -9,7 +9,6 @@ ENetHost *clienthost = NULL; ENetPeer *curpeer = NULL, *connpeer = NULL; int connmillis = 0, connattempts = 0, discmillis = 0; SVAR(curdemofile, "n/a"); -extern bool clfail, cllock; extern int searchlan; int getclientnum() { return player1 ? player1->clientnum : -1; } @@ -52,20 +51,12 @@ void abortconnect() connectrole = CR_DEFAULT; if(connpeer->state!=ENET_PEER_STATE_DISCONNECTED) enet_peer_reset(connpeer); connpeer = NULL; -#if 0 - if(!curpeer) - { - enet_host_destroy(clienthost); - clienthost = NULL; - } -#endif } void connectserv_(const char *servername, int serverport = 0, const char *password = NULL, int role = CR_DEFAULT) { if(serverport <= 0) serverport = CUBE_DEFAULT_SERVER_PORT; if(watchingdemo) enddemoplayback(); - if(!clfail && cllock && searchlan<2) return; if(connpeer) { @@ -119,6 +110,7 @@ void connectserv(char *servername, int *serverport, char *password) modprotocol = false; connectserv_(servername, *serverport, password); } +COMMANDN(connect, connectserv, "sis"); void connectadmin(char *servername, int *serverport, char *password) { @@ -126,18 +118,21 @@ void connectadmin(char *servername, int *serverport, char *password) if(!password[0]) return; connectserv_(servername, *serverport, password, CR_ADMIN); } +COMMAND(connectadmin, "sis"); void lanconnect() { modprotocol = false; connectserv_(NULL); } +COMMAND(lanconnect, ""); void modconnectserv(char *servername, int *serverport, char *password) { modprotocol = true; connectserv_(servername, *serverport, password); } +COMMANDN(modconnect, modconnectserv, "sis"); void modconnectadmin(char *servername, int *serverport, char *password) { @@ -145,17 +140,14 @@ void modconnectadmin(char *servername, int *serverport, char *password) if(!password[0]) return; connectserv_(servername, *serverport, password, CR_ADMIN); } +COMMAND(modconnectadmin, "sis"); void modlanconnect() { modprotocol = true; connectserv_(NULL); } - -void whereami() -{ - conoutf("you are at (%.2f,%.2f)", player1->o.x, player1->o.y); -} +COMMAND(modlanconnect, ""); void disconnect(int onlyclean, int async) { @@ -192,13 +184,6 @@ void disconnect(int onlyclean, int async) audiomgr.clearworldsounds(false); localdisconnect(); } -#if 0 - if(!connpeer && clienthost) - { - enet_host_destroy(clienthost); - clienthost = NULL; - } -#endif if(!onlyclean) localconnect(); exechook(HOOK_SP_MP, "onDisconnect", "%d", -1); } @@ -219,6 +204,9 @@ void trydisconnect() conoutf("attempting to disconnect..."); disconnect(0, !discmillis); } +COMMANDN(disconnect, trydisconnect, ""); + +// core game function: ingame chat void _toserver(char *text, int msg, int msgt) { @@ -226,25 +214,34 @@ void _toserver(char *text, int msg, int msgt) if(!toteam && text[0] == '%' && strlen(text) > 1) text++; // convert team-text to normal-text if no team-mode is active if(toteam) text++; filtertext(text, text, FTXT__CHAT); - trimtrailingwhitespace(text); if(servstate.mastermode == MM_MATCH && servstate.matchteamsize && !team_isactive(player1->team) && !(player1->team == TEAM_SPECT && player1->clientrole == CR_ADMIN)) toteam = true; // spect chat - if(*text) - { - if(msg == SV_TEXTME) conoutf("\f%d%s %s", toteam ? 1 : 0, colorname(player1), highlight(text)); - else conoutf("%s:\f%d %s", colorname(player1), toteam ? 1 : 0, highlight(text)); - addmsg(toteam ? msgt : msg, "rs", text); - } + if(*text) addmsg(toteam ? msgt : msg, "rs", text); } void toserver(char *text) { _toserver(text, SV_TEXT, SV_TEAMTEXT); } +COMMANDN(say, toserver, "c"); void toserverme(char *text) { _toserver(text, SV_TEXTME, SV_TEAMTEXTME); } +COMMANDN(me, toserverme, "c"); + +void pm(char *text) +{ + char *msg; + int cn = (int) strtol(text, &msg, 10); + if(msg != text && getclient(cn)) + { + filtertext(msg, msg, FTXT__CHAT | FTXT_CROPWHITE_LEAD); + if(*msg) addmsg(SV_TEXTPRIVATE, "ris", cn, msg); + } + else conoutf("\f3pm: invalid client number specified"); +} +COMMAND(pm, "c"); void echo(char *text) { @@ -256,8 +253,10 @@ void echo(char *text) } while(s); } +COMMAND(echo, "c"); VARP(allowhudechos, 0, 1, 1); + void hudecho(char *text) { char *b, *s = strtok_r(text, "\n", &b); @@ -269,65 +268,12 @@ void hudecho(char *text) } while(s); } - -void pm(char *text) -{ - if(!text || !text[0]) return; - int cn = -1; - char digit; - while ((digit = *text++) != '\0') - { - if (digit < '0' || digit > '9') break; - if(cn < 0) cn = 0; - else cn *= 10; - cn += digit - '0'; - } - playerent *to = getclient(cn); - if(!to) - { - conoutf("invalid client number specified"); - return; - } - - if(!isspace(digit)) { --text; } - - // FIXME: - /*if(!text || !text[0] || !isdigit(text[0])) return; - int cn = -1; - char *numend = strpbrk(text, " \t"); - if(!numend) return; - string cnbuf; - copystring(cnbuf, text, min(numend-text+1, MAXSTRLEN)); - cn = atoi(cnbuf); - playerent *to = getclient(cn); - if(!to) - { - conoutf("invalid client number specified"); - return; - } - - if(*numend) numend++;*/ - // :FIXME - - filtertext(text, text, FTXT__CHAT); - trimtrailingwhitespace(text); - - addmsg(SV_TEXTPRIVATE, "ris", cn, text); - conoutf("to %s (PM):\f9 %s", colorname(to), highlight(text)); -} -COMMAND(pm, "c"); - -COMMAND(echo, "c"); COMMAND(hudecho, "c"); -COMMANDN(say, toserver, "c"); -COMMANDN(me, toserverme, "c"); -COMMANDN(connect, connectserv, "sis"); -COMMAND(connectadmin, "sis"); -COMMAND(lanconnect, ""); -COMMANDN(modconnect, modconnectserv, "sis"); -COMMAND(modconnectadmin, "sis"); -COMMAND(modlanconnect, ""); -COMMANDN(disconnect, trydisconnect, ""); + +void whereami() +{ + conoutf("you are at (%.2f,%.2f)", player1->o.x, player1->o.y); +} COMMAND(whereami, ""); void current_version(char *text) @@ -633,84 +579,13 @@ void gets2c() // get updates from the server } } -#if 0 -// for AUTH: - -vector authkeys; - -VARP(autoauth, 0, 1, 1); - -authkey *findauthkey(const char *desc) -{ - loopv(authkeys) if(!strcmp(authkeys[i]->desc, desc) && !strcmp(authkeys[i]->name, player1->name)) return authkeys[i]; - loopv(authkeys) if(!strcmp(authkeys[i]->desc, desc)) return authkeys[i]; - return NULL; -} - -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)); -} - -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; -} - -void genauthkey(const char *secret) -{ - if(!secret[0]) { conoutf("you must specify a secret password"); return; } - vector privkey, pubkey; - genprivkey(secret, privkey, pubkey); - conoutf("private key: %s", privkey.getbuf()); - conoutf("public key: %s", pubkey.getbuf()); -} - -void saveauthkeys() -{ - if(authkeys.length()) - { - stream *f = openfile("config/auth.cfg", "w"); - if(!f) { conoutf("failed to open config/auth.cfg for writing"); return; } - loopv(authkeys) - { - authkey *a = authkeys[i]; - f->printf("authkey \"%s\" \"%s\" \"%s\"\n", a->name, a->key, a->desc); - } - conoutf("saved authkeys to config/auth.cfg"); - delete f; - } - else conoutf("you need to use 'addauthkey USER KEY DESC' first; one DESC 'public', one DESC empty(=private)"); -} - -bool tryauth(const char *desc) -{ - authkey *a = findauthkey(desc); - if(!a) return false; - a->lastauth = lastmillis; - addmsg(SV_AUTHTRY, "rss", a->desc, a->name); - return true; -} - -COMMANDN(authkey, addauthkey, "sss"); -COMMANDF(hasauthkey, "ss", (char *name, char *desc) { intret(_hasauthkey(name, desc) ? 1 : 0); }); -COMMAND(genauthkey, "s"); -COMMAND(saveauthkeys, ""); -COMMANDF(auth, "s", (char *desc) { intret(tryauth(desc)); }); - -// :for AUTH - -#endif - // sendmap/getmap commands, should be replaced by more intuitive map downloading vector securemaps; -void resetsecuremaps() { securemaps.deletearrays(); } -void securemap(char *map) { if(map) securemaps.add(newstring(map)); } +COMMANDF(resetsecuremaps, "", () { securemaps.deletearrays(); }); +COMMANDF(securemap, "s", (char *map) { if(map) securemaps.add(newstring(map)); }); + bool securemapcheck(const char *map, bool msg) { if(strstr(map, "maps/")==map || strstr(map, "maps\\")==map) map += strlen("maps/"); @@ -719,7 +594,7 @@ bool securemapcheck(const char *map, bool msg) if(msg) { conoutf("\f3Map \f4%s\f3 is secured. This means you CAN'T send, receive or overwrite it.", map); - if(connected) + if(curpeer) { conoutf("\f3If you get this error often, you (or the server) may be running an outdated game."); conoutf("\f3You can check for updates at \f1http://assault.cubers.net/download.html"); @@ -768,11 +643,12 @@ void sendmap(char *mapname) sendpackettoserv(2, p.finalize()); conoutf("sending map %s to server...", mapname); } +COMMAND(sendmap, "s"); void getmap(char *name, char *callback) { if((!name || !*name) - || (connected && !strcmp(name, getclientmap())) ) + || (curpeer && !strcmp(name, getclientmap())) ) { conoutf("requesting map from server..."); packetbuf p(10, ENET_PACKET_FLAG_RELIABLE); @@ -790,6 +666,7 @@ void getmap(char *name, char *callback) else conoutf("\f3map download failed"); } } +COMMAND(getmap, "ss"); void deleteservermap(char *mapname) { @@ -797,6 +674,7 @@ void deleteservermap(char *mapname) if(!*name || securemapcheck(name)) return; addmsg(SV_REMOVEMAP, "rs", name); } +COMMAND(deleteservermap, "s"); string demosubpath; void getdemo(int *idx, char *dsp) @@ -812,6 +690,7 @@ void getdemo(int *idx, char *dsp) else conoutf("getting demo %d...", *idx); addmsg(SV_GETDEMO, "ri", *idx); } +COMMAND(getdemo, "is"); void listdemos() { @@ -823,6 +702,7 @@ void listdemos() conoutf("listing demos..."); addmsg(SV_LISTDEMOS, "r"); } +COMMAND(listdemos, ""); void shiftgametime(int newmillis) { @@ -859,13 +739,6 @@ void rewinddemo(char *seconds) } COMMANDN(rewind, rewinddemo, "s"); -COMMAND(sendmap, "s"); -COMMAND(getmap, "ss"); -COMMAND(deleteservermap, "s"); -COMMAND(resetsecuremaps, ""); -COMMAND(securemap, "s"); -COMMAND(getdemo, "is"); -COMMAND(listdemos, ""); COMMANDF(watchingdemo, "", () { intret(watchingdemo); }); diff --git a/source/src/clientgame.cpp b/source/src/clientgame.cpp index 37862593..3f859330 100644 --- a/source/src/clientgame.cpp +++ b/source/src/clientgame.cpp @@ -5,7 +5,6 @@ int nextmode = 0; // nextmode becomes gamemode after next map load VAR(gamemode, 1, 0, 0); -VAR(nextGameMode, 1, 0, 0); VARP(modeacronyms, 0, 1, 1); flaginfo flaginfos[2]; @@ -15,8 +14,6 @@ mapdim_s clmapdims; // min/max X/Y and delta X/Y and min/max Z void mode(int *n) { nextmode = *n; - nextGameMode = nextmode; - if(m_mp(*n) || !multiplayer()) addmsg(SV_GAMEMODE, "ri", *n); } COMMAND(mode, "i"); @@ -112,6 +109,7 @@ void ignore(int *cn) playerent *d = getclient(*cn); if(d && d != player1) d->ignored = true; } +COMMAND(ignore, "i"); void listignored() { @@ -121,17 +119,20 @@ void listignored() if(*pl) conoutf("ignored players: %s", pl + 2); else conoutf("no players are ignored"); } +COMMAND(listignored, ""); void clearignored(int *cn) { loopv(players) if(players[i] && (*cn < 0 || *cn == i)) players[i]->ignored = false; } +COMMAND(clearignored, "i"); void muteplayer(int *cn) { playerent *d = getclient(*cn); if(d && d != player1) d->muted = true; } +COMMAND(muteplayer, "i"); void listmuted() { @@ -141,17 +142,12 @@ void listmuted() if(*pl) conoutf("muted players: %s", pl + 2); else conoutf("no players are muted"); } +COMMAND(listmuted, ""); void clearmuted(char *cn) { loopv(players) if(players[i] && (*cn < 0 || *cn == i)) players[i]->muted = false; } - -COMMAND(ignore, "i"); -COMMAND(listignored, ""); -COMMAND(clearignored, "i"); -COMMAND(muteplayer, "i"); -COMMAND(listmuted, ""); COMMAND(clearmuted, "i"); void newname(const char *name) @@ -168,6 +164,7 @@ void newname(const char *name) } else conoutf("your name is: %s", player1->name); } +COMMANDN(name, newname, "s"); SVARFF(curname, { curname = exchangestr(curname, player1->name); }, {} ); @@ -188,12 +185,14 @@ void newteam(char *name) } else conoutf("your team is: %s", team_string(player1->team)); } +COMMANDN(team, newteam, "s"); void benchme() { if(team_isactive(player1->team) && servstate.mastermode == MM_MATCH) addmsg(SV_SWITCHTEAM, "ri", team_tospec(player1->team)); } +COMMAND(benchme, ""); int _setskin(int s, int t) { @@ -214,14 +213,11 @@ void curmodeattr(char *attr) else if(!strcmp(attr, "bot")) { intret(m_botmode); return; } intret(0); } +COMMAND(curmodeattr, "s"); -COMMANDN(team, newteam, "s"); -COMMANDN(name, newname, "s"); -COMMAND(benchme, ""); COMMANDF(isclient, "i", (int *cn) { intret(getclient(*cn) != NULL ? 1 : 0); } ); COMMANDF(curmastermode, "", (void) { intret(servstate.mastermode); }); COMMANDF(curautoteam, "", (void) { intret(servstate.autoteam); }); -COMMAND(curmodeattr, "s"); COMMANDF(curmap, "", (void) { result(behindpath(getclientmap())); }); COMMANDF(curplayers, "", (void) { intret(players.length() + 1); }); VARP(showscoresondeath, 0, 1, 1); @@ -450,6 +446,7 @@ void deathstate(playerent *pl) if(editmode) toggleedit(true); if(pl->team == TEAM_SPECT) spectatemode(SM_FLY); else if(team_isspect(pl->team)) spectatemode(SM_FOLLOW1ST); + if(pl->spectatemode == SM_DEATHCAM) addmsg(SV_SPECTCN, "ri", (player1->followplayercn = FPCN_DEATHCAM)); } else pl->resetinterp(); } @@ -650,6 +647,7 @@ void addsleep_(int *msec, char *cmd, int *persist) { addsleep(*msec, cmd, *persist != 0); } +COMMANDN(sleep, addsleep_, "isi"); void resetsleep(bool force) { @@ -662,7 +660,6 @@ void resetsleep(bool force) sleepssemaphore->post(); } -COMMANDN(sleep, addsleep_, "isi"); COMMANDF(resetsleeps, "", (void) { resetsleep(true); }); void updateworld(int curtime, int lastmillis) // main game update loop @@ -910,8 +907,6 @@ void dodamage(int damage, playerent *pl, playerent *actor, int gun, bool gib, bo { if(pl->state != CS_ALIVE || intermission) return; pl->lastpain = lastmillis; - // could the author of the FIXME below please elaborate what's to fix?! (ft:2011mar28) - // I suppose someone wanted to play the hitsound for player1 or spectated player (lucas:2011may22) playerent *h = player1->isspectating() && player1->followplayercn >= 0 && (player1->spectatemode == SM_FOLLOW1ST || player1->spectatemode == SM_FOLLOW3RD || player1->spectatemode == SM_FOLLOW3RD_TRANSPARENT) ? getclient(player1->followplayercn) : NULL; if(!h) h = player1; exechook(HOOK_SP, "onHit", "%d %d %d %d %d", actor->clientnum, pl->clientnum, damage, gun, gib ? 1 : 0); @@ -1156,28 +1151,11 @@ void resetmap(bool mrproper) int suicided = -1; -extern bool item_fail; -extern int MA, F2F, Ma, Hhits; -extern float Mh; - -VARP(mapstats_hud, 0, 0, 1); - -void showmapstats() -{ - conoutf("\f2Map Quality Stats"); - conoutf(" The mean height is: %.2f", Mh); - if (Hhits) conoutf(" Height check is: %d", Hhits); - if (MA) conoutf(" The max area is: %d (of %d)", MA, Ma); - if (m_flags && F2F < 1000) conoutf(" Flag-to-flag distance is: %d", (int)sqrtf(F2F)); - if (item_fail) conoutf(" There are one or more items too close to each other in this map"); -} -COMMAND(showmapstats, ""); - VARP(showmodedescriptions, 0, 1, 1); -extern bool canceldownloads; void startmap(const char *name, bool reset, bool norespawn) // called just after a map load { + extern bool canceldownloads; canceldownloads = false; copystring(clientmap, name); @@ -1191,14 +1169,13 @@ void startmap(const char *name, bool reset, bool norespawn) // called just aft suicided = -1; spawncycle = -1; lasthit = 0; - player1->followplayercn = -1; if(m_valid(gamemode) && !m_mp(gamemode)) respawnself(); else findplayerstart(player1); if(!reset) return; - player1->frags = player1->flagscore = player1->deaths = player1->lifesequence = player1->points = player1->tks = 0; - loopv(players) if(players[i]) players[i]->frags = players[i]->flagscore = players[i]->deaths = players[i]->lifesequence = players[i]->points = players[i]->tks = 0; + player1->startmap(); + loopv(players) if(players[i]) players[i]->startmap(); if(editmode) toggleedit(true); intermission = false; showscores(false); @@ -1274,6 +1251,7 @@ void flagmsg(int flag, int message, int actor, int flagtime) } else hudoutf("\f2%s%s has %s flag", flagteam, colorname(act), teamstr); break; + case FM_LOST: case FM_DROP: { @@ -1292,6 +1270,7 @@ void flagmsg(int flag, int message, int actor, int flagtime) if(firstperson) hudoutf("\f2you returned your flag"); else hudoutf("\f2%s returned %s flag", colorname(act), teamstr); break; + case FM_SCORE: audiomgr.playsound(S_FLAGSCORE, SP_HIGHEST); if(firstperson) @@ -1301,6 +1280,7 @@ void flagmsg(int flag, int message, int actor, int flagtime) } else hudoutf("\f2%s scored for %s", colorname(act), neutral ? teamnames[act->team] : teammate ? "your team" : "the enemy team"); break; + case FM_KTFSCORE: { audiomgr.playsound(S_KTFSCORE, SP_HIGHEST); @@ -1317,6 +1297,7 @@ void flagmsg(int flag, int message, int actor, int flagtime) case FM_SCOREFAIL: // sound? hudoutf("\f2%s failed to score (own team flag not taken)", firstperson ? "you" : colorname(act)); break; + case FM_RESET: audiomgr.playsound(S_FLAGRETURN, SP_HIGHEST); hudoutf("the server reset the flag"); @@ -1656,7 +1637,6 @@ void setadmin(int *claim, char *password) else if(*claim != 0 && *password) addmsg(SV_SETADMIN, "ris", *claim, genpwdhash(player1->name, password, sessionid)); } - COMMAND(setadmin, "is"); static vector mlines; @@ -1704,6 +1684,7 @@ playerent *updatefollowplayer(int shiftdirection) if(oldidx < 0) oldidx = 0; int idx = ((oldidx + shiftdirection) % available.length() + available.length()) % available.length(); + if(player1->followplayercn != available[idx]->clientnum) addmsg(SV_SPECTCN, "ri", available[idx]->clientnum); player1->followplayercn = available[idx]->clientnum; return players[player1->followplayercn]; } @@ -1714,7 +1695,6 @@ void spectate() if(!team_isspect(player1->team)) addmsg(SV_SWITCHTEAM, "ri", TEAM_SPECT); else tryrespawn(); } - COMMAND(spectate, ""); void setfollowplayer(int cn) @@ -1724,12 +1704,11 @@ void setfollowplayer(int cn) { if(!(m_teammode && player1->team != TEAM_SPECT && !watchingdemo && team_base(players[cn]->team) != team_base(player1->team))) { - player1->followplayercn = cn; + if(player1->followplayercn != cn) addmsg(SV_SPECTCN, "ri", (player1->followplayercn = cn)); if(player1->spectatemode == SM_FLY) player1->spectatemode = SM_FOLLOW1ST; } } } - COMMANDF(setfollowplayer, "i", (int *cn) { setfollowplayer(*cn); }); // set new spect mode @@ -1760,16 +1739,17 @@ void spectatemode(int mode) player1->resetinterp(); } else entinmap(player1); // or drop 'em at a random place + addmsg(SV_SPECTCN, "ri", (player1->followplayercn = FPCN_FLY)); } break; } case SM_OVERVIEW: + addmsg(SV_SPECTCN, "ri", (player1->followplayercn = FPCN_OVERVIEW)); break; default: break; } player1->spectatemode = mode; } - COMMANDF(spectatemode, "i", (int *mode) { spectatemode(*mode); }); void togglespect() // cycle through all spectating modes @@ -1784,15 +1764,13 @@ void togglespect() // cycle through all spectating modes spectatemode(mode); } } - COMMAND(togglespect, ""); -void changefollowplayer(int shift) +void changefollowplayer(int *shift) { - if(!m_botmode) updatefollowplayer(shift); + if(!m_botmode) updatefollowplayer(*shift); } - -COMMANDF(changefollowplayer, "i", (int *dir) { changefollowplayer(*dir); }); +COMMAND(changefollowplayer, "i"); void spectatecn() { @@ -1801,7 +1779,6 @@ void spectatecn() spectcn = player1->followplayercn; intret(spectcn); } - COMMAND(spectatecn, ""); void serverextension(char *ext, char *args) @@ -1811,5 +1788,4 @@ void serverextension(char *ext, char *args) if(n>0) addmsg(SV_EXTENSION, "rsis", ext, n, args); else addmsg(SV_EXTENSION, "rsi", ext, n); } - COMMAND(serverextension, "ss"); diff --git a/source/src/clients2c.cpp b/source/src/clients2c.cpp index f12a02f1..e31356e2 100644 --- a/source/src/clients2c.cpp +++ b/source/src/clients2c.cpp @@ -29,10 +29,9 @@ VARP(autogetmap, 0, 1, 1); // only if the client doesn't have that map VARP(autogetnewmaprevisions, 0, 1, 1); bool localwrongmap = false; -int MA = 0, Hhits = 0; // flowtron: moved here + bool changemapserv(char *name, int mode, int download, int revision) // forced map change from the server { - MA = Hhits = 0; // reset for checkarea() gamemode = mode; if(m_demo) return true; if(m_coop) @@ -106,8 +105,6 @@ void updatelagtime(playerent *d) } } -extern void trydisconnect(); - void parsepositions(ucharbuf &p) { int type; @@ -228,75 +225,6 @@ void parsepositions(ucharbuf &p) } } -char *mlayout = NULL; -int Mv = 0, Ma = 0, F2F = 1000 * MINFF; // moved up:, MA = 0; -float Mh = 0; -extern int connected; -extern bool noflags; -bool item_fail = false; -int map_quality = MAP_IS_EDITABLE; - - -VARP(hudextras, 0, 0, 3); - -int teamworkid = -1; - -char *strcaps(const char *s, bool on) -{ - static string r; - char *o = r; - if(on) while(*s && o < &r[sizeof(r)-1]) *o++ = toupper(*s++); - else while(*s && o < &r[sizeof(r)-1]) *o++ = tolower(*s++); - *o = '\0'; - return r; -} - -void showhudextras(char hudextras, char value){ - void (*outf)(const char *s, ...) = (hudextras > 1 ? hudoutf : conoutf); - bool caps = hudextras < 3 ? false : true; - switch(value) - { - case HE_COMBO: - case HE_COMBO2: - case HE_COMBO3: - case HE_COMBO4: - case HE_COMBO5: - { - int n = value - HE_COMBO; - if (n > 3) outf("\f3%s",strcaps("monster combo!!!",caps)); // I expect to never see this one - else if (!n) outf("\f5%s",strcaps("combo", caps)); - else outf("\f5%s x%d",strcaps("multi combo", caps),n+1); - break; - } - case HE_TEAMWORK: - outf("\f5%s",strcaps("teamwork done", caps)); break; - case HE_FLAGDEFENDED: - outf("\f5%s",strcaps("you defended the flag", caps)); break; - case HE_FLAGCOVERED: - outf("\f5%s",strcaps("you covered the flag", caps)); break; - case HE_COVER: - if (teamworkid >= 0) - { - playerent *p = getclient(teamworkid); - if (!p || p == player1) teamworkid = -1; - else outf("\f5you covered %s",p->name); break; - } - default: - { - if (value >= HE_NUM) - { - teamworkid = value - HE_NUM; - playerent *p = getclient(teamworkid); - if (!p || p == player1) teamworkid = -1; - else outf("\f4you replied to %s",p->name); - } - else outf("\f3Update your client!"); - break; - } - } -#undef SSPAM -} - int lastspawn = 0; void onCallVote(int type, int vcn, char *text, char *a) @@ -310,8 +238,6 @@ void onChangeVote(int mod, int id) } VARP(voicecomsounds, 0, 1, 2); -bool medals_arrived=0; -medalsst a_medals[END_MDS]; struct session_s { @@ -332,22 +258,10 @@ void parsemessages(int cn, playerent *d, ucharbuf &p, bool demo = false) { type = getint(p); - if(demo && watchingdemo && demoprotocol == 1132) - { - if(type > SV_IPLIST) --type; // SV_WHOIS removed - if(type >= SV_TEXTPRIVATE) ++type; // SV_TEXTPRIVATE added - if(type == SV_SWITCHNAME) // SV_SPECTCN removed - { - getint(p); - continue; - } - else if(type > SV_SWITCHNAME) --type; - } - #ifdef _DEBUG if(type!=SV_POS && type!=SV_CLIENTPING && type!=SV_PING && type!=SV_PONG && type!=SV_CLIENT) { - DEBUGVAR(d); + DEBUGVAR(cn); ASSERT(type>=0 && typeignored) clientlogf("ignored: pm %s %s", colorname(d), text); + playerent *s = getclient(src), *d = getclient(dst); + if(!s) break; + if(s == player1 && d) conoutf("to %s (PM):\f9 %s", colorname(d), highlight(text)); + else if(s->ignored) clientlogf("ignored: pm %s %s", colorname(s), text); else { - conoutf("%s (PM):\f9 %s", colorname(d), highlight(text)); - lastpm = d->clientnum; - exechook(HOOK_SP_MP, "onPM", "%d [%s]", d->clientnum, text); + conoutf("%s (PM):\f9 %s", colorname(s), highlight(text)); + lastpm = s->clientnum; + exechook(HOOK_SP_MP, "onPM", "%d [%s]", s->clientnum, text); } break; } @@ -622,7 +537,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p, bool demo = false) loopi(2) getint(p); getint(p); loopi(4) getint(p); - if(!demo || !watchingdemo || demoprotocol > 1132) getint(p); + getint(p); break; } getstring(text, p); @@ -646,8 +561,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p, bool demo = false) d->maxrolleffect = (float)clamp(getint(p), 0, ROLLEFFMAX); d->ffov = (float)clamp(getint(p), 75, 120); d->scopefov = (float)clamp(getint(p), 5, 60); - - if(!demo || !watchingdemo || demoprotocol > 1132) d->address = getint(p); // partial IP address + d->address = getint(p); // partial IP address if(m_flags) loopi(2) { @@ -699,13 +613,6 @@ void parsemessages(int cn, playerent *d, ucharbuf &p, bool demo = false) case SV_SPAWNSTATE: { - if ( map_quality == MAP_IS_BAD ) - { - loopi(6+2*NUMGUNS) getint(p); - conoutf("map deemed unplayable - fix it before you can spawn"); - break; - } - if(editmode) toggleedit(true); showscores(false); setscope(false); @@ -725,7 +632,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p, bool demo = false) arenaintermission = 0; if(m_arena && !localwrongmap) { - if(connected) closemenu(NULL); + if(curpeer) closemenu(NULL); conoutf("new round starting... fight!"); hudeditf(HUDMSG_TIMER, "FIGHT!"); if(m_botmode) BotManager.RespawnBots(); @@ -737,6 +644,10 @@ void parsemessages(int cn, playerent *d, ucharbuf &p, bool demo = false) break; } + case SV_SPECTCN: + getint(p); + break; + case SV_SHOTFX: { int scn = getint(p), gun = getint(p); @@ -787,34 +698,6 @@ void parsemessages(int cn, playerent *d, ucharbuf &p, bool demo = false) break; } - // for AUTH: WIP - - case SV_AUTHREQ: - { -// extern int autoauth; - getstring(text, p); - // if(autoauth && text[0] && tryauth(text)) conoutf("server requested authkey \"%s\"", text); - break; - } - - case SV_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) - { - // vector buf; - // answerchallenge(a->key, text, buf); - //conoutf("answering %u, challenge %s with %s", id, text, buf.getbuf()); - // addmsg(SV_AUTHANS, "rsis", a->desc, id, buf.getbuf()); - } - break; - } - - // :for AUTH - case SV_GIBDAMAGE: case SV_DAMAGE: { @@ -833,38 +716,6 @@ void parsemessages(int cn, playerent *d, ucharbuf &p, bool demo = false) break; } - case SV_POINTS: - { - int count = getint(p); - if ( count > 0 ) { - loopi(count){ - int pcn = getint(p); int score = getint(p); - playerent *ppl = getclient(pcn); - if (!ppl) break; - ppl->points += score; - } - } else { - int medals = getint(p); - if(medals > 0) { -// medals_arrived=1; - loopi(medals) { - int mcn=getint(p); int mtype=getint(p); int mitem=getint(p); - a_medals[mtype].assigned=1; - a_medals[mtype].cn=mcn; - a_medals[mtype].item=mitem; - } - } - } - break; - } - - case SV_HUDEXTRAS: - { - char value = getint(p); - if (hudextras) showhudextras(hudextras, value); - break; - } - case SV_HITPUSH: { int gun = getint(p), damage = getint(p); @@ -892,9 +743,17 @@ void parsemessages(int cn, playerent *d, ucharbuf &p, bool demo = false) { int cn = getint(p); if(p.overread() || cn<0) break; - int state = getint(p), lifesequence = getint(p), primary = getint(p), gunselect = getint(p), flagscore = getint(p), frags = getint(p), deaths = getint(p), health = getint(p), armour = getint(p), points = getint(p); - int teamkills = 0; - if(!demo || !watchingdemo || demoprotocol > 1132) teamkills = getint(p); + int state = getint(p), + lifesequence = getint(p), + primary = getint(p), + gunselect = getint(p), + flagscore = getint(p), + frags = getint(p), + deaths = getint(p), + health = getint(p), + armour = getint(p), + points = getint(p), + teamkills = getint(p); int ammo[NUMGUNS], mag[NUMGUNS]; loopi(NUMGUNS) ammo[i] = getint(p); loopi(NUMGUNS) mag[i] = getint(p); @@ -1068,11 +927,6 @@ void parsemessages(int cn, playerent *d, ucharbuf &p, bool demo = false) d->ping = getint(p); break; - case SV_GAMEMODE: - nextmode = getint(p); - if (nextmode >= GMODE_NUM) nextmode -= GMODE_NUM; - break; - case SV_TIMEUP: { int curgamemillis = getint(p); @@ -1433,16 +1287,8 @@ void parsemessages(int cn, playerent *d, ucharbuf &p, bool demo = false) bool demoplayback = false; string demofile; extern char *curdemofile; - if(demo && watchingdemo && demoprotocol == 1132) - { - watchingdemo = demoplayback = getint(p)!=0; - copystring(demofile, "n/a"); - } - else - { - getstring(demofile, p, MAXSTRLEN); - watchingdemo = demoplayback = demofile[0] != '\0'; - } + getstring(demofile, p, MAXSTRLEN); + watchingdemo = demoplayback = demofile[0] != '\0'; DELETEA(curdemofile); if(demoplayback) { diff --git a/source/src/command.cpp b/source/src/command.cpp index a79ef267..693ca127 100644 --- a/source/src/command.cpp +++ b/source/src/command.cpp @@ -11,6 +11,11 @@ inline bool identaccessdenied(ident *id); void cslimiterr(const char*msg); +#ifdef STANDALONE + #define FLAGMAPCONFIGERR(x) +#else + #define FLAGMAPCONFIGERR(x) flagmapconfigerror(x); +#endif char *exchangestr(char *o, const char *n) { delete[] o; return newstring(n); } @@ -381,7 +386,6 @@ char *parseexp(const char *&p, int right, int rec) // parse any nest screrr: scripterr(); - flagmapconfigerror(LWW_SCRIPTERR * 4); return NULL; } @@ -398,7 +402,6 @@ char *lookup(char *n, int levels) // find value of ide } conoutf("unknown alias lookup: %s", n); scripterr(); - flagmapconfigerror(LWW_SCRIPTERR * 4); return n; } @@ -407,7 +410,7 @@ char *parseword(const char *&p, int arg, int *infix, int rec) p += strspn(p, " \t"); if(p[0]=='/' && p[1]=='/') p += strcspn(p, "\n\r\0"); if(*p=='"') return parsequotes(p); - if(*p=='(' && !currentcontextisolated) return parseexp(p, ')', rec + 1); + if(*p=='(' && !currentcontextisolated) return parseexp(p, ')', rec + 1); // on isolated contexts, only quotes are parsed if(*p=='[' && !currentcontextisolated) return parseexp(p, ']', rec + 1); int lvls = currentcontextisolated ? 0 : strspn(p, "$"); if(lvls && (p[lvls]=='(' || p[lvls]=='[')) @@ -524,7 +527,7 @@ char *executeret(const char *p) // all evaluation happens here, { conoutf("unknown command: %s", c); scripterr(); - flagmapconfigerror(LWW_SCRIPTERR * 4); + FLAGMAPCONFIGERR(LWW_SCRIPTERR * 4); } setretval(newstring(c)); } @@ -532,7 +535,7 @@ char *executeret(const char *p) // all evaluation happens here, { conoutf("not allowed in this execution context: %s", id->name); scripterr(); - flagmapconfigerror(LWW_SCRIPTERR * 4); + FLAGMAPCONFIGERR(LWW_SCRIPTERR * 4); } else { @@ -591,7 +594,7 @@ char *executeret(const char *p) // all evaluation happens here, { i1 = i1minval ? id->minval : id->maxval; // clamp to valid range conoutf("valid range for %s is %d..%d", id->name, id->minval, id->maxval); - flagmapconfigerror(LWW_SCRIPTERR); + FLAGMAPCONFIGERR(LWW_SCRIPTERR); } *id->storage.i = i1; if(id->fun) ((void (__cdecl *)())id->fun)(); // call trigger function if available @@ -608,7 +611,7 @@ char *executeret(const char *p) // all evaluation happens here, { f1 = f1minvalf ? id->minvalf : id->maxvalf; // clamp to valid range conoutf("valid range for %s is %s..%s", id->name, floatstr(id->minvalf), floatstr(id->maxvalf)); - flagmapconfigerror(LWW_SCRIPTERR * 2); + FLAGMAPCONFIGERR(LWW_SCRIPTERR * 2); } *id->storage.f = f1; if(id->fun) ((void (__cdecl *)())id->fun)(); // call trigger function if available @@ -1306,7 +1309,6 @@ void addpunct(char *s, char *type) // Easily inject a string into various CubeSc else result(punct); } COMMAND(addpunct, "ss"); -#endif void toany(char *s, int (*c)(int)) { while(*s) { *s = (*c)(*s); s++; } } @@ -1331,6 +1333,8 @@ void sortlist(char *list) } COMMAND(sortlist, "c"); +#endif + void modifyvar(const char *name, int arg, char op) { ident *id = idents->access(name); @@ -1488,10 +1492,10 @@ void bnot_(int *a) { intret(~(*a)); } COMMANDN(!b, bnot_, "i"); COMMANDF(strcmp, "ss", (char *a, char *b) { intret((strcmp(a, b) == 0) ? 1 : 0); }); -COMMANDF(rnd, "i", (int *a) { intret(*a>0 ? rnd(*a) : 0); }); - #ifndef STANDALONE +COMMANDF(rnd, "i", (int *a) { intret(*a>0 ? rnd(*a) : 0); }); + COMMANDF(escape, "s", (const char *s) { result(escapestring(s));}); int sortident(ident **a, ident **b) { return strcasecmp((*a)->name, (*b)->name); } @@ -1677,6 +1681,7 @@ int popscontext() return execcontext; } +#ifndef STANDALONE void scriptcontext(char *context, char *idname) { if(contextsealed) return; @@ -1695,6 +1700,7 @@ void isolatecontext(char *context) COMMAND(isolatecontext, "s"); COMMANDF(sealcontexts, "",() { contextsealed = true; }); +#endif inline bool identaccessdenied(ident *id) // check if ident is allowed in current context { @@ -1711,8 +1717,10 @@ void scripterr() ASSERT(execcontext >= 0 && execcontext < IEXC_NUM); if(curcontext) conoutf("(%s: %s [%s])", curcontext, curinfo, contextnames[execcontext]); else conoutf("(from console or builtin [%s])", contextnames[execcontext]); +#ifndef STANDALONE clientlogf("exec nesting level: %d", executionstack.length()); clientlogf("%s", executionstack.length() ? executionstack.last() : ":::nevermind:::"); +#endif } void setcontext(const char *context, const char *info) @@ -1782,5 +1790,7 @@ void debugline(char *fname, char *line) // print one line to a logfile } } COMMAND(debugline, "ss"); + +COMMANDF(numberofidents, "", () { intret(idents->numelems); }); #endif #endif diff --git a/source/src/cube.h b/source/src/cube.h index ebfdf991..7c3cd54b 100644 --- a/source/src/cube.h +++ b/source/src/cube.h @@ -41,7 +41,7 @@ extern vector ents; // map entities extern vec worldpos, camup, camright, camdir; // current target of the crosshair in the world extern int lastmillis, totalmillis, skipmillis; // last time extern int curtime; // current frame time -extern int gamemode, nextmode; +extern int gamemode; extern int gamespeed; extern int xtraverts; extern float fovy, aspect; diff --git a/source/src/entity.h b/source/src/entity.h index 9f3a809d..c99e9226 100644 --- a/source/src/entity.h +++ b/source/src/entity.h @@ -115,14 +115,9 @@ enum { ENT_PLAYER = 0, ENT_BOT, ENT_CAMERA, ENT_BOUNCE }; enum { CS_ALIVE = 0, CS_DEAD, CS_SPAWNING, CS_LAGGED, CS_EDITING, CS_SPECTATE }; enum { CR_DEFAULT = 0, CR_MASTER, CR_ADMIN, CR_OWNER, CR_NUM }; enum { SM_NONE = 0, SM_DEATHCAM, SM_FOLLOW1ST, SM_FOLLOW3RD, SM_FOLLOW3RD_TRANSPARENT, SM_FLY, SM_OVERVIEW, SM_NUM }; +enum { FPCN_VOID = -4, FPCN_DEATHCAM = -2, FPCN_FLY = -2, FPCN_OVERVIEW = -1 }; -class worldobject -{ -public: - virtual ~worldobject() {}; -}; - -class physent : public worldobject +class physent { public: vec o, vel; // origin, velocity @@ -452,7 +447,7 @@ public: bool nocorpse; playerent() : curskin(0), clientnum(-1), lastupdate(0), plag(0), ping(0), address(0), lifesequence(0), frags(0), flagscore(0), deaths(0), points(0), tks(0), lastpain(0), lastvoicecom(0), lastdeath(0), clientrole(CR_DEFAULT), - team(TEAM_SPECT), spectatemode(SM_NONE), eardamagemillis(0), maxroll(ROLLMOVDEF), maxrolleffect(ROLLEFFDEF), movroll(0), effroll(0), ffov(0), scopefov(0), + team(TEAM_SPECT), spectatemode(SM_NONE), followplayercn(FPCN_VOID), eardamagemillis(0), maxroll(ROLLMOVDEF), maxrolleffect(ROLLEFFDEF), movroll(0), effroll(0), ffov(0), scopefov(0), prevweaponsel(NULL), weaponsel(NULL), nextweaponsel(NULL), primweap(NULL), nextprimweap(NULL), lastattackweapon(NULL), smoothmillis(-1), head(-1, -1, -1), ignored(false), muted(false), nocorpse(false) @@ -503,6 +498,7 @@ public: void resetspec() { spectatemode = SM_NONE; + followplayercn = FPCN_VOID; } void respawn() @@ -552,6 +548,10 @@ public: t = team_base(t < 0 ? team : t); nextskin[t] = iabs(s) % maxskin[t]; } + void startmap() + { + frags = flagscore = deaths = lifesequence = points = tks = 0; + } }; @@ -648,6 +648,3 @@ public: void onmoved(const vec &dist); }; -enum {MD_FRAGS = 0, MD_DEATHS, END_MDS}; -struct medalsst {bool assigned; int cn; int item;}; - diff --git a/source/src/master.cpp b/source/src/master.cpp index 5ed629c5..d0a34dfe 100644 --- a/source/src/master.cpp +++ b/source/src/master.cpp @@ -30,13 +30,13 @@ void adduser(char *name, char *pubkey) name = newstring(name); userinfo &u = users[name]; u.name = name; - u.pubkey = parsepubkey(pubkey); +// u.pubkey = parsepubkey(pubkey); } COMMAND(adduser, "ss"); void clearusers() { - enumerate(users, userinfo, u, { delete[] u.name; freepubkey(u.pubkey); }); +// enumerate(users, userinfo, u, { delete[] u.name; freepubkey(u.pubkey); }); users.clear(); } COMMAND(clearusers, ""); @@ -149,7 +149,7 @@ struct messagebuf vector gameserverlists, gbanlists; bool updateserverlist = true; -struct client +struct mclient { ENetAddress address; ENetSocket socket; @@ -164,9 +164,9 @@ struct client bool shouldpurge; bool registeredserver; - client() : message(NULL), inputpos(0), outputpos(0), servport(-1), lastauth(0), shouldpurge(false), registeredserver(false) {} + mclient() : message(NULL), inputpos(0), outputpos(0), servport(-1), lastauth(0), shouldpurge(false), registeredserver(false) {} }; -vector clients; +vector mclients; ENetSocket serversocket = ENET_SOCKET_NULL; @@ -199,20 +199,20 @@ void conoutf(const char *fmt, ...) void purgeclient(int n) { - client &c = *clients[n]; + mclient &c = *mclients[n]; if(c.message) c.message->purge(); enet_socket_destroy(c.socket); - delete clients[n]; - clients.remove(n); + delete mclients[n]; + mclients.remove(n); } -void output(client &c, const char *msg, int len = 0) +void output(mclient &c, const char *msg, int len = 0) { if(!len) len = strlen(msg); c.output.put(msg, len); } -void outputf(client &c, const char *fmt, ...) +void outputf(mclient &c, const char *fmt, ...) { defvformatstring(msg, fmt, fmt); output(c, msg); @@ -303,9 +303,9 @@ void gengbanlist() if(m->refs > 0 && !m->endswith(*l)) m->concat(*l); } gbanlists.add(l); - loopv(clients) + loopv(mclients) { - client &c = *clients[i]; + mclient &c = *mclients[i]; if(c.servport >= 0 && !c.message) { c.message = l; @@ -314,7 +314,7 @@ void gengbanlist() } } -void addgameserver(client &c) +void addgameserver(mclient &c) { if(gameservers.length() >= SERVER_LIMIT) return; loopv(gameservers) @@ -342,11 +342,11 @@ void addgameserver(client &c) s.lastping = s.lastpong = 0; } -client *findclient(gameserver &s) +mclient *findclient(gameserver &s) { - loopv(clients) + loopv(mclients) { - client &c = *clients[i]; + mclient &c = *mclients[i]; if(s.address.host == c.address.host && s.port == c.servport) return &c; } @@ -355,7 +355,7 @@ client *findclient(gameserver &s) void servermessage(gameserver &s, const char *msg) { - client *c = findclient(s); + mclient *c = findclient(s); if(c) outputf(*c, msg); } @@ -377,7 +377,7 @@ void checkserverpongs() { if(s.lastping && (!s.lastpong || ENET_TIME_GREATER(s.lastping, s.lastpong))) { - client *c = findclient(s); + mclient *c = findclient(s); if(c) { c->registeredserver = true; @@ -452,7 +452,7 @@ void messagebuf::purge() } // for AUTH: -void purgeauths(client &c) +void purgeauths(mclient &c) { int expired = 0; loopv(c.authreqs) @@ -460,7 +460,7 @@ void purgeauths(client &c) if(ENET_TIME_DIFFERENCE(servtime, c.authreqs[i].reqtime) >= AUTH_TIME) { outputf(c, "failauth %u\n", c.authreqs[i].id); - freechallenge(c.authreqs[i].answer); +// freechallenge(c.authreqs[i].answer); expired = i + 1; } else break; @@ -468,7 +468,7 @@ void purgeauths(client &c) if(expired > 0) c.authreqs.remove(0, expired); } -void reqauth(client &c, uint id, char *name) +void reqauth(mclient &c, uint id, char *name) { if(ENET_TIME_DIFFERENCE(servtime, c.lastauth) < AUTH_THROTTLE) return; @@ -498,22 +498,22 @@ void reqauth(client &c, uint id, char *name) if(c.authreqs.length() >= AUTH_LIMIT) { outputf(c, "failauth %u\n", c.authreqs[0].id); - freechallenge(c.authreqs[0].answer); +// freechallenge(c.authreqs[0].answer); c.authreqs.remove(0); } authreq &a = c.authreqs.add(); a.reqtime = servtime; a.id = id; - uint seed[3] = { (uint)starttime, (uint)servtime, randomMT() }; +// uint seed[3] = { (uint)starttime, (uint)servtime, randomMT() }; static vector buf; buf.setsize(0); - a.answer = genchallenge(u->pubkey, seed, sizeof(seed), buf); +// a.answer = genchallenge(u->pubkey, seed, sizeof(seed), buf); outputf(c, "chalauth %u %s\n", id, buf.getbuf()); } -void confauth(client &c, uint id, const char *val) +void confauth(mclient &c, uint id, const char *val) { purgeauths(c); @@ -521,7 +521,7 @@ void confauth(client &c, uint id, const char *val) { string ip; if(enet_address_get_host_ip(&c.address, ip, sizeof(ip)) < 0) copystring(ip, "-"); - if(checkchallenge(val, c.authreqs[i].answer)) + if(0)//checkchallenge(val, c.authreqs[i].answer)) { outputf(c, "succauth %u\n", id); conoutf("succeeded %u from %s", id, ip); @@ -531,7 +531,7 @@ void confauth(client &c, uint id, const char *val) outputf(c, "failauth %u\n", id); conoutf("failed %u from %s", id, ip); } - freechallenge(c.authreqs[i].answer); +// freechallenge(c.authreqs[i].answer); c.authreqs.remove(i--); return; } @@ -539,7 +539,7 @@ void confauth(client &c, uint id, const char *val) } // :for AUTH -bool checkclientinput(client &c) +bool checkclientinput(mclient &c) { if(c.inputpos<0) return true; char *end = (char *)memchr(c.input, '\n', c.inputpos); @@ -601,9 +601,9 @@ void checkclients() ENET_SOCKETSET_EMPTY(writeset); ENET_SOCKETSET_ADD(readset, serversocket); ENET_SOCKETSET_ADD(readset, pingsocket); - loopv(clients) + loopv(mclients) { - client &c = *clients[i]; + mclient &c = *mclients[i]; if(c.message || c.output.length()) ENET_SOCKETSET_ADD(writeset, c.socket); else ENET_SOCKETSET_ADD(readset, c.socket); maxsock = max(maxsock, c.socket); @@ -615,29 +615,29 @@ void checkclients() { ENetAddress address; ENetSocket clientsocket = enet_socket_accept(serversocket, &address); - if(clients.length()>=CLIENT_LIMIT || checkban(bans, address.host)) enet_socket_destroy(clientsocket); + if(mclients.length()>=CLIENT_LIMIT || checkban(bans, address.host)) enet_socket_destroy(clientsocket); else if(clientsocket!=ENET_SOCKET_NULL) { int dups = 0, oldest = -1; - loopv(clients) if(clients[i]->address.host == address.host) + loopv(mclients) if(mclients[i]->address.host == address.host) { dups++; - if(oldest<0 || clients[i]->connecttime < clients[oldest]->connecttime) oldest = i; + if(oldest<0 || mclients[i]->connecttime < mclients[oldest]->connecttime) oldest = i; } if(dups >= DUP_LIMIT) purgeclient(oldest); - client *c = new client; + mclient *c = new mclient; c->address = address; c->socket = clientsocket; c->connecttime = servtime; c->lastinput = servtime; - clients.add(c); + mclients.add(c); } } - loopv(clients) + loopv(mclients) { - client &c = *clients[i]; + mclient &c = *mclients[i]; if((c.message || c.output.length()) && ENET_SOCKETSET_CHECK(writeset, c.socket)) { const char *data = c.output.length() ? c.output.getbuf() : c.message->getbuf(); @@ -688,7 +688,7 @@ void checkclients() void banclients() { - loopvrev(clients) if(checkban(bans, clients[i]->address.host)) purgeclient(i); + loopvrev(mclients) if(checkban(bans, mclients[i]->address.host)) purgeclient(i); } volatile bool reloadcfg = true; diff --git a/source/src/physics.cpp b/source/src/physics.cpp index d30e0540..d36392b2 100644 --- a/source/src/physics.cpp +++ b/source/src/physics.cpp @@ -354,7 +354,6 @@ bool collide(physent *d, bool spawn, float drop, float rise) VARFP(maxroll, 0, ROLLMOVDEF, ROLLMOVMAX, player1->maxroll = maxroll); VARFP(maxrolleffect, 0, ROLLEFFDEF, ROLLEFFMAX, player1->maxrolleffect = maxrolleffect); VARP(maxrollremote, 0, ROLLMOVDEF + ROLLEFFDEF, ROLLMOVMAX + ROLLEFFMAX); -//VAR(recoilbackfade, 0, 100, 1000); void resizephysent(physent *pl, int moveres, int curtime, float min, float max) { @@ -734,12 +733,7 @@ void moveplayer(physent *pl, int moveres, bool local, int curtime) pl->pitch += pl->pitchvel*(curtime/1000.0f)*pl->maxspeed*(pl->crouching ? 0.75f : 1.0f); pl->pitchvel *= fric-3; pl->pitchvel /= fric; - /*extern int recoiltest; - if(recoiltest) - { - if(pl->pitchvel < 0.05f && pl->pitchvel > 0.001f) pl->pitchvel -= recoilbackfade/100.0f; // slide back - } - else*/ if(pl->pitchvel < 0.05f && pl->pitchvel > 0.001f) pl->pitchvel -= ((playerent *)pl)->weaponsel->info.recoilbackfade/100.0f; // slide back + if(pl->pitchvel < 0.05f && pl->pitchvel > 0.001f) pl->pitchvel -= ((playerent *)pl)->weaponsel->info.recoilbackfade/100.0f; // slide back if(pl->pitchvel) fixcamerarange(pl); // fix pitch if necessary } diff --git a/source/src/protocol.cpp b/source/src/protocol.cpp index 1f31f874..a919f1ca 100644 --- a/source/src/protocol.cpp +++ b/source/src/protocol.cpp @@ -304,14 +304,14 @@ char *filtertext(char *dst, const char *src, int flags, int len) filename = (flags & FTXT_FILENAME) != 0, // strict a-z, 0-9 and "-_.()" (also translates "[]" and "{}" to "()"), removes everything between '<' and '>' allowslash = (flags & FTXT_ALLOWSLASH) != 0, // only in combination with FTXT_FILENAME or FTXT_MAPNAME mapname = (flags & FTXT_MAPNAME) != 0, // only allows lowercase chars, digits, '_', '-' and '.'; probably should be used in combination with TOLOWER - cropwhite = (flags & FTXT_CROPWHITE) != 0, // removes leading and trailing whitespace + cropwhitelead = (flags & FTXT_CROPWHITE_LEAD) != 0, // removes leading whitespace + cropwhitetrail = (flags & FTXT_CROPWHITE_TRAIL) != 0, // removes trailing whitespace pass = false; if(leet || mapname) nocolor = true; #ifdef FILENAMESALLLOWERCASE if(filename) tolow = true; #endif bool trans = toupp || tolow || leet || filename || fillblanks; - bool leadingwhite = cropwhite; char *lastwhite = NULL; bool insidepointybrackets = false; for(int c = *src; c; c = *++src) @@ -369,7 +369,7 @@ char *filtertext(char *dst, const char *src, int flags, int len) if(mapname && !isalnum(c) && !strchr("_-.", c) && !(allowslash && strchr("/\\", c))) continue; if(isspace(c)) { - if(leadingwhite) continue; + if(cropwhitelead) continue; if(nowhite && !((c == ' ' && allowblanks) || (c == '\n' && allownl)) && !pass) continue; if(!lastwhite) lastwhite = dst; } @@ -378,11 +378,11 @@ char *filtertext(char *dst, const char *src, int flags, int len) lastwhite = NULL; if(!pass && !isprint(c)) continue; } - leadingwhite = false; + cropwhitelead = false; *dst++ = c; if(!--len || !*src) break; } - if(cropwhite && lastwhite) *lastwhite = '\0'; + if(cropwhitetrail && lastwhite) *lastwhite = '\0'; *dst = '\0'; return res; } @@ -583,12 +583,12 @@ static const int msgsizes[] = // size inclusive message token, 0 f SV_SERVINFO, 1, SV_SERVINFO_RESPONSE, 0, SV_SERVINFO_CONTD, 0, SV_WELCOME, 2, SV_INITCLIENT, 0, SV_POS, 0, SV_POSC, 0, SV_POSC2, 0, SV_POSC3, 0, SV_POSC4, 0, SV_POSN, 0, SV_TEXT, 0, SV_TEAMTEXT, 0, SV_TEXTME, 0, SV_TEAMTEXTME, 0, SV_TEXTPRIVATE, 0, SV_SOUND, 2, SV_VOICECOM, 2, SV_VOICECOMTEAM, 2, SV_CDIS, 2, - SV_SHOOT, 0, SV_EXPLODE, 0, SV_SUICIDE, 1, SV_AKIMBO, 2, SV_RELOAD, 3, SV_AUTHT, 0, SV_AUTHREQ, 0, SV_AUTHTRY, 0, SV_AUTHANS, 0, SV_AUTHCHAL, 0, + SV_SHOOT, 0, SV_EXPLODE, 0, SV_SUICIDE, 1, SV_AKIMBO, 2, SV_RELOAD, 3, SV_GIBDIED, 5, SV_DIED, 5, SV_GIBDAMAGE, 7, SV_DAMAGE, 7, SV_HITPUSH, 6, SV_SHOTFX, 6, SV_THROWNADE, 8, SV_TRYSPAWN, 1, SV_SPAWNSTATE, 23, SV_SPAWN, 3, SV_SPAWNDENY, 2, SV_FORCEDEATH, 2, SV_RESUME, 0, SV_DISCSCORES, 0, SV_TIMEUP, 3, SV_EDITENT, 13, SV_ITEMACC, 2, SV_MAPCHANGE, 0, SV_ITEMSPAWN, 2, SV_ITEMPICKUP, 2, - SV_PING, 2, SV_PONG, 2, SV_CLIENTPING, 2, SV_GAMEMODE, 2, + SV_PING, 2, SV_PONG, 2, SV_CLIENTPING, 2, SV_EDITMODE, 2, SV_EDITXY, 8, SV_EDITARCH, 56, SV_EDITBLOCK, 0, SV_EDITD, 6, SV_EDITE, 6, SV_NEWMAP, 2, SV_SENDMAP, 0, SV_RECVMAP, 1, SV_REMOVEMAP, 0, SV_SERVMSG, 0, SV_SERVMSGVERB, 0, SV_ITEMLIST, 0, SV_WEAPCHANGE, 2, SV_PRIMARYWEAP, 2, @@ -597,13 +597,13 @@ static const int msgsizes[] = // size inclusive message token, 0 f SV_SETADMIN, 0, SV_SERVOPINFO, 3, SV_CALLVOTE, 0, SV_CALLVOTESUC, 1, SV_CALLVOTEERR, 2, SV_VOTE, 2, SV_VOTERESULT, 2, SV_SETTEAM, 3, SV_TEAMDENY, 2, SV_SERVERMODE, 2, - SV_IPLIST, 0, + SV_IPLIST, 0, SV_SPECTCN, 2, SV_LISTDEMOS, 1, SV_SENDDEMOLIST, 0, SV_GETDEMO, 2, SV_SENDDEMO, 0, SV_DEMOPLAYBACK, 3, SV_CONNECT, 0, SV_SWITCHNAME, 0, SV_SWITCHSKIN, 0, SV_SWITCHTEAM, 0, SV_CLIENT, 0, SV_EXTENSION, 0, - SV_MAPIDENT, 3, SV_HUDEXTRAS, 2, SV_POINTS, 0, SV_DEMOCHECKSUM, 0, SV_DEMOSIGNATURE, 0, + SV_MAPIDENT, 3, SV_DEMOCHECKSUM, 0, SV_DEMOSIGNATURE, 0, -1 }; diff --git a/source/src/protocol.h b/source/src/protocol.h index a02c9a7a..d50e11e4 100644 --- a/source/src/protocol.h +++ b/source/src/protocol.h @@ -28,12 +28,12 @@ enum { SV_SERVINFO = 0, SV_SERVINFO_RESPONSE, SV_SERVINFO_CONTD, SV_WELCOME, SV_INITCLIENT, SV_POS, SV_POSC, SV_POSC2, SV_POSC3, SV_POSC4, SV_POSN, SV_TEXT, SV_TEAMTEXT, SV_TEXTME, SV_TEAMTEXTME, SV_TEXTPRIVATE, SV_SOUND, SV_VOICECOM, SV_VOICECOMTEAM, SV_CDIS, - SV_SHOOT, SV_EXPLODE, SV_SUICIDE, SV_AKIMBO, SV_RELOAD, SV_AUTHT, SV_AUTHREQ, SV_AUTHTRY, SV_AUTHANS, SV_AUTHCHAL, + SV_SHOOT, SV_EXPLODE, SV_SUICIDE, SV_AKIMBO, SV_RELOAD, SV_GIBDIED, SV_DIED, SV_GIBDAMAGE, SV_DAMAGE, SV_HITPUSH, SV_SHOTFX, SV_THROWNADE, SV_TRYSPAWN, SV_SPAWNSTATE, SV_SPAWN, SV_SPAWNDENY, SV_FORCEDEATH, SV_RESUME, SV_DISCSCORES, SV_TIMEUP, SV_EDITENT, SV_ITEMACC, SV_MAPCHANGE, SV_ITEMSPAWN, SV_ITEMPICKUP, - SV_PING, SV_PONG, SV_CLIENTPING, SV_GAMEMODE, + SV_PING, SV_PONG, SV_CLIENTPING, SV_EDITMODE, SV_EDITXY, SV_EDITARCH, SV_EDITBLOCK, SV_EDITD, SV_EDITE, SV_NEWMAP, SV_SENDMAP, SV_RECVMAP, SV_REMOVEMAP, SV_SERVMSG, SV_SERVMSGVERB, SV_ITEMLIST, SV_WEAPCHANGE, SV_PRIMARYWEAP, @@ -42,13 +42,13 @@ enum SV_SETADMIN, SV_SERVOPINFO, SV_CALLVOTE, SV_CALLVOTESUC, SV_CALLVOTEERR, SV_VOTE, SV_VOTERESULT, SV_SETTEAM, SV_TEAMDENY, SV_SERVERMODE, - SV_IPLIST, + SV_IPLIST, SV_SPECTCN, SV_LISTDEMOS, SV_SENDDEMOLIST, SV_GETDEMO, SV_SENDDEMO, SV_DEMOPLAYBACK, SV_CONNECT, SV_SWITCHNAME, SV_SWITCHSKIN, SV_SWITCHTEAM, SV_CLIENT, SV_EXTENSION, - SV_MAPIDENT, SV_HUDEXTRAS, SV_POINTS, SV_DEMOCHECKSUM, SV_DEMOSIGNATURE, + SV_MAPIDENT, SV_DEMOCHECKSUM, SV_DEMOSIGNATURE, SV_NUM }; @@ -69,7 +69,6 @@ enum { FA_PICKUP = 0, FA_STEAL, FA_DROP, FA_LOST, FA_RETURN, FA_SCORE, FA_NUM, F enum { FM_PICKUP = 0, FM_DROP, FM_LOST, FM_RETURN, FM_SCORE, FM_KTFSCORE, FM_SCOREFAIL, FM_RESET, FM_NUM }; enum { FTR_INFO = 0, FTR_PLAYERWISH, FTR_AUTOTEAM, FTR_SILENTFORCE, FTR_NUM }; // forceteam-reasons enum { SP_OK = 0, SP_REFILLMATCH, SP_OK_NUM, SP_WRONGMAP, SP_SPECT, SP_NUM }; // spawn permission ( &privstr, vector &pubstr); -extern bool hashstring(const char *str, char *result, int maxlen); -extern void answerchallenge(const char *privstr, const char *challenge, vector &answerstr); -extern void *parsepubkey(const char *pubstr); -extern void freepubkey(void *pubkey); -extern void *genchallenge(void *pubkey, const void *seed, int seedlen, vector &challengestr); -extern void freechallenge(void *answer); -extern bool checkchallenge(const char *answerstr, void *correct); -#endif // console extern void conoutf(const char *s, ...) PRINTFARGS(1, 2); diff --git a/source/src/renderhud.cpp b/source/src/renderhud.cpp index 56d48617..59bcd6c7 100644 --- a/source/src/renderhud.cpp +++ b/source/src/renderhud.cpp @@ -724,51 +724,6 @@ inline char rangecolor(int val, const char *colors, int thres1, int thres2, int return colors[3]; } -void drawmedals(float x, float y, int col, int row, Texture *tex) -{ - if(tex) - { - glPushAttrib(GL_COLOR_BUFFER_BIT); - glDisable(GL_BLEND); - drawicon(tex, x, y, 120, col, row, 1/4.0f); - glPopAttrib(); - } -} -const char *medal_str[] = -{ - "Best Fragger", "Dude that dies a lot" -}; //just some medals string tests, nothing serious -extern bool medals_arrived; -extern medalsst a_medals[END_MDS]; -void drawscores() -{ - static float time=0; - if(!medals_arrived) {time=0; return;} else if(time > 5){time=0; medals_arrived=0;} - static Texture *tex = NULL; - if(!tex) tex = textureload("packages/misc/nice_medals.png", 4); - time+=((float)(curtime))/1000; - float vw=VIRTW*7/4,vh=VIRTH*7/4; - glPushAttrib(GL_COLOR_BUFFER_BIT); - glLoadIdentity(); - glOrtho(0, vw, vh, 0, -1, 1); - int left = vw/4, top = vh/4; - blendbox(left, top, left*3, top*3, true, -1); - top+=10;left+=10;const float txtdx=160,txtdy=30,medalsdy=130; - glColor4f(1,1,1,1); - float desttime=0; - loopi(END_MDS) { - if(a_medals[i].assigned) { - desttime+=0.3; - if(time < desttime) continue; - drawmedals(left, top, 0, 0, tex); - playerent *mpl = getclient(a_medals[i].cn); - draw_textf("%s %s: %d", left+txtdx, top+txtdy, medal_str[i], mpl->name, a_medals[i].item); top+=medalsdy; - } - } - - glPopAttrib(); -} - string enginestateinfo = ""; COMMANDF(getEngineState, "", () { result(enginestateinfo); }); @@ -1025,7 +980,6 @@ void gl_drawhud(int w, int h, int curfps, int nquads, int curvert, bool underwat glPopMatrix(); } - drawscores(); if(!hidespecthud && spectating && player1->spectatemode!=SM_DEATHCAM) { glLoadIdentity(); diff --git a/source/src/server.cpp b/source/src/server.cpp index 4928c6dd..88eb4bac 100644 --- a/source/src/server.cpp +++ b/source/src/server.cpp @@ -99,7 +99,9 @@ serverinfofile serverinfomotd; bool isdedicated = false; ENetHost *serverhost = NULL; -int laststatus = 0, servmillis = 0, servclock = 0; +int laststatus = 0, // last per-minute log status + servmillis = 0, // millis since server start + servclock = 0; // unixtime in minutes vector clients; vector worldstates; @@ -642,6 +644,7 @@ void sendf(int cn, int chan, const char *format, ...) { case 'x': // exclude client from getting this message exclude = va_arg(args, int); + ASSERT(cn == -1); break; case 'v': // integer array of variable length @@ -693,42 +696,6 @@ void sendf(int cn, int chan, const char *format, ...) sendpacket(cn, chan, p.finalize(), exclude); } -void sendextras() -{ - if (sg->gamemillis < sg->nextsendscore ) return; - int count = 0, list[MAXCLIENTS]; - loopv(clients) - { - client &c = *clients[i]; - if ( c.type!=ST_TCPIP || !c.isauthed || !(c.md.updated && c.md.upmillis < sg->gamemillis) ) continue; - if ( c.md.combosend ) - { - sendf(c.clientnum, 1, "ri2", SV_HUDEXTRAS, min(c.md.combo,c.md.combofrags)-1 + HE_COMBO); - c.md.combosend = false; - } - if ( c.md.dpt ) - { - list[count] = i; - count++; - } - } - sg->nextsendscore = sg->gamemillis + 160; // about 4 cicles - if ( !count ) return; - - packetbuf p(MAXTRANS, ENET_PACKET_FLAG_RELIABLE); - putint(p, SV_POINTS); - putint(p,count); - int *v = list; - loopi(count) - { - client &c = *clients[*v]; - putint(p,c.clientnum); putint(p,c.md.dpt); c.md.updated = false; c.md.upmillis = c.md.dpt = 0; - v++; - } - - sendpacket(-1, 1, p.finalize()); -} - void sendservmsg(const char *msg, int cn = -1) { sendf(cn, 1, "ris", SV_SERVMSG, msg); @@ -1220,8 +1187,7 @@ void setupdemoplayback() lilswap(&hdr.version, 1); lilswap(&hdr.protocol, 1); if(hdr.version!=DEMO_VERSION) formatstring(msg)("demo \"%s\" requires an %s version of AssaultCube", file, hdr.versionstate.flagscore += score; sendf(-1, 1, "riii", SV_FLAGCNT, actor, c->state.flagscore); - if (m_teammode) computeteamwork(c->team, c->clientnum); /** WIP */ } if(valid_client(actor)) { @@ -1489,7 +1454,6 @@ void flagaction(int flag, int action, int actor) mlog(ACLOG_INFO, "flagaction %d, actor %d, flag %d, message %d", action, actor, flag, message); break; } - flagpoints (&c, message); } else { @@ -1768,12 +1732,13 @@ void sendteamtext(char *text, int sender, int msgtype) ENetPacket *packet = p.finalize(); recordpacket(1, packet); int &st = clients[sender]->team; - loopv(clients) if(i!=sender) + loopv(clients) { int &rt = clients[i]->team; if((rt == TEAM_SPECT && clients[i]->role == CR_ADMIN) || // spect-admin reads all (team_isactive(st) && st == team_group(rt)) || // player to own team + own spects - (team_isspect(st) && team_isspect(rt))) // spectator to other spectators + (team_isspect(st) && team_isspect(rt)) || // spectator to other spectators + (i == sender)) // "local" echo sendpacket(i, 1, packet); } } @@ -1888,7 +1853,6 @@ void checkitemspawns(int diff) void serverdamage(client *target, client *actor, int damage, int gun, bool gib, const vec &hitpush = vec(0, 0, 0)) { - if (!m_demo && !m_coop && !validdamage(target, actor, damage, gun, gib)) return; if ( m_arena && gun == GUN_GRENADE && sg->arenaroundstartmillis + 2000 > sg->gamemillis && target != actor ) return; clientstate &ts = target->state; ts.dodamage(damage, gun); @@ -1898,7 +1862,6 @@ void serverdamage(client *target, client *actor, int damage, int gun, bool gib, sendf(-1, 1, "ri7", gib ? SV_GIBDAMAGE : SV_DAMAGE, target->clientnum, actor->clientnum, gun, damage, ts.armour, ts.health); if(target!=actor) { - checkcombo (target, actor, damage, gun); if(!hitpush.iszero()) { vec v(hitpush); @@ -1913,7 +1876,6 @@ void serverdamage(client *target, client *actor, int damage, int gun, bool gib, int targethasflag = clienthasflag(target->clientnum); bool tk = false, suic = false; target->state.deaths++; - checkfrag(target, actor, gun, gib); if(target!=actor) { if(!isteam(target->team, actor->team)) actor->state.frags += gib && gun != GUN_GRENADE && gun != GUN_SHOTGUN ? 2 : 1; @@ -2142,103 +2104,6 @@ void shuffleteams(int ftr = FTR_AUTOTEAM) } } -bool balanceteams(int ftr) // pro vs noobs never more -{ - if(sg->mastermode != MM_OPEN || totalclients < 3 ) return true; - int tsize[2] = {0, 0}, tscore[2] = {0, 0}; - int totalscore = 0, nplayers = 0; - int flagmult = (m_ctf ? 50 : (m_htf ? 25 : 12)); - - loopv(clients) if(clients[i]->type!=ST_EMPTY) - { - client *c = clients[i]; - if(c->isauthed && team_isactive(c->team)) - { - int time = servmillis - c->connectmillis + 5000; - if(time > sg->gamemillis ) time = sg->gamemillis + 5000; - tsize[c->team]++; - // effective score per minute, thanks to wtfthisgame for the nice idea - // in a normal game, normal players will do 500 points in 10 minutes - c->eff_score = c->state.points * 60 * 1000 / time + c->state.points / 6 + c->state.flagscore * flagmult; - tscore[c->team] += c->eff_score; - nplayers++; - totalscore += c->state.points; - } - } - - int h = 0, l = 1; - if ( tscore[1] > tscore[0] ) { h = 1; l = 0; } - if ( 2 * tscore[h] < 3 * tscore[l] || totalscore < nplayers * 100 ) return true; - if ( tscore[h] > 3 * tscore[l] && tscore[h] > 150 * nplayers ) - { -// sendf(-1, 1, "ri2", SV_SERVERMODE, sendservermode(false) | AT_SHUFFLE); - shuffleteams(); - return true; - } - - float diffscore = tscore[h] - tscore[l]; - - int besth = 0, hid = -1; - int bestdiff = 0, bestpair[2] = {-1, -1}; - if ( tsize[h] - tsize[l] > 0 ) // the h team has more players, so we will force only one player - { - loopv(clients) if( clients[i]->type!=ST_EMPTY ) - { - client *c = clients[i]; // loop for h - // client from the h team, not forced in this game, and without the flag - if( c->isauthed && c->team == h && !c->state.forced && clienthasflag(i) < 0 ) - { - // do not exchange in the way that weaker team becomes the stronger or the change is less than 20% effective - if ( 2 * c->eff_score <= diffscore && 10 * c->eff_score >= diffscore && c->eff_score > besth ) - { - besth = c->eff_score; - hid = i; - } - } - } - if ( hid >= 0 ) - { - updateclientteam(hid, l, ftr); - clients[hid]->at3_lastforce = sg->gamemillis; - clients[hid]->state.forced = true; - return true; - } - } else { // the h score team has less or the same player number, so, lets exchange - loopv(clients) if(clients[i]->type!=ST_EMPTY) - { - client *c = clients[i]; // loop for h - if( c->isauthed && c->team == h && !c->state.forced && clienthasflag(i) < 0 ) - { - loopvj(clients) if(clients[j]->type!=ST_EMPTY && j != i ) - { - client *cj = clients[j]; // loop for l - if( cj->isauthed && cj->team == l && !cj->state.forced && clienthasflag(j) < 0 ) - { - int pairdiff = 2 * (c->eff_score - cj->eff_score); - if ( pairdiff <= diffscore && 5 * pairdiff >= diffscore && pairdiff > bestdiff ) - { - bestdiff = pairdiff; - bestpair[h] = i; - bestpair[l] = j; - } - } - } - } - } - if ( bestpair[h] >= 0 && bestpair[l] >= 0 ) - { - updateclientteam(bestpair[h], l, ftr); - updateclientteam(bestpair[l], h, ftr); - clients[bestpair[h]]->at3_lastforce = clients[bestpair[l]]->at3_lastforce = sg->gamemillis; - clients[bestpair[h]]->state.forced = clients[bestpair[l]]->state.forced = true; - return true; - } - } - return false; -} - -int lastbalance = 0, waitbalance = 2 * 60 * 1000; - bool refillteams(bool now, int ftr) // force only minimal amounts of players { if(sg->mastermode == MM_MATCH) return false; @@ -2310,21 +2175,6 @@ bool refillteams(bool now, int ftr) // force only minimal amounts of players } if(diffnum < 2) { - if ( ( sg->gamemillis - lastbalance ) > waitbalance && ( sg->gamelimit - sg->gamemillis ) > 4*60*1000 ) - { - if ( balanceteams (ftr) ) - { - waitbalance = 2 * 60 * 1000 + sg->gamemillis / 3; - switched = true; - } - else waitbalance = 20 * 1000; - lastbalance = sg->gamemillis; - } - else if ( lastbalance > sg->gamemillis ) - { - lastbalance = 0; - waitbalance = 2 * 60 * 1000; - } lasttime_eventeams = sg->gamemillis; } return switched; @@ -2830,71 +2680,6 @@ void disconnect_client(int n, int reason) if(*scoresaved && sg->mastermode == MM_MATCH) senddisconnectedscores(-1); } -// for AUTH: WIP - -client *findauth(uint id) -{ - loopv(clients) if(clients[i]->authreq == id) return clients[i]; - return NULL; -} - -void authfailed(uint id) -{ - client *cl = findauth(id); - if(!cl) return; - cl->authreq = 0; -} - -void authsucceeded(uint id) -{ - client *cl = findauth(id); - if(!cl) return; - cl->authreq = 0; - mlog(ACLOG_INFO, "player authenticated: %s", cl->name); - defformatstring(auth4u)("player authenticated: %s", cl->name); - sendf(-1, 1, "ris", SV_SERVMSG, auth4u); - //setmaster(cl, true, "", ci->authname);//TODO? compare to sauerbraten -} - -void authchallenged(uint id, const char *val) -{ - client *cl = findauth(id); - if(!cl) return; - sendf(cl->clientnum, 1, "risis", SV_AUTHCHAL, "", id, val); -} - -uint nextauthreq = 0; - -void tryauth(client *cl, const char *user) -{ - extern bool requestmasterf(const char *fmt, ...); - if(!nextauthreq) nextauthreq = 1; - cl->authreq = nextauthreq++; - filtertext(cl->authname, user, FTXT__AUTH, 100); - if(!requestmasterf("reqauth %u %s\n", cl->authreq, cl->authname)) - { - cl->authreq = 0; - sendf(cl->clientnum, 1, "ris", SV_SERVMSG, "not connected to authentication server"); - } -} - -void answerchallenge(client *cl, uint id, char *val) -{ - if(cl->authreq != id) return; - extern bool requestmasterf(const char *fmt, ...); - for(char *s = val; *s; s++) - { - if(!isxdigit(*s)) { *s = '\0'; break; } - } - if(!requestmasterf("confauth %u %s\n", id, val)) - { - cl->authreq = 0; - sendf(cl->clientnum, 1, "ris", SV_SERVMSG, "not connected to authentication server"); - } -} - -// :for AUTH - void sendiplist(int receiver, int cn) { if(!valid_client(receiver)) return; @@ -3079,7 +2864,7 @@ int checktype(int type, client *cl) if(type < 0 || type >= SV_NUM) return -1; // server only messages static int servtypes[] = { SV_SERVINFO, SV_WELCOME, SV_INITCLIENT, SV_POSN, SV_CDIS, SV_GIBDIED, SV_DIED, - SV_GIBDAMAGE, SV_DAMAGE, SV_HITPUSH, SV_SHOTFX, SV_AUTHREQ, SV_AUTHCHAL, + SV_GIBDAMAGE, SV_DAMAGE, SV_HITPUSH, SV_SHOTFX, SV_SPAWNSTATE, SV_SPAWNDENY, SV_FORCEDEATH, SV_RESUME, SV_DISCSCORES, SV_TIMEUP, SV_ITEMACC, SV_MAPCHANGE, SV_ITEMSPAWN, SV_PONG, SV_SERVMSG, SV_SERVMSGVERB, SV_ITEMLIST, SV_FLAGINFO, SV_FLAGMSG, SV_FLAGCNT, @@ -3087,7 +2872,7 @@ int checktype(int type, client *cl) SV_CALLVOTESUC, SV_CALLVOTEERR, SV_VOTERESULT, SV_SETTEAM, SV_TEAMDENY, SV_SERVERMODE, SV_IPLIST, SV_SENDDEMOLIST, SV_SENDDEMO, SV_DEMOPLAYBACK, - SV_CLIENT, SV_HUDEXTRAS, SV_POINTS, SV_DEMOCHECKSUM }; + SV_CLIENT, SV_DEMOCHECKSUM }; // only allow edit messages in coop-edit mode static int edittypes[] = { SV_EDITENT, SV_EDITXY, SV_EDITARCH, SV_EDITBLOCK, SV_EDITD, SV_EDITE, SV_NEWMAP }; if(cl) @@ -3394,14 +3179,12 @@ void process(ENetPacket *packet, int sender, int chan) else protocoldebug(false); #endif - type = checkmessage(cl,type); switch(type) { case SV_TEAMTEXTME: case SV_TEAMTEXT: getstring(text, p); filtertext(text, text, FTXT__CHAT); - trimtrailingwhitespace(text); if(*text) { bool canspeech = forbiddenlist.canspeech(text); @@ -3434,7 +3217,6 @@ void process(ENetPacket *packet, int sender, int chan) int mid1 = curmsg, mid2 = p.length(); getstring(text, p); filtertext(text, text, FTXT__CHAT); - trimtrailingwhitespace(text); if(*text) { bool canspeech = forbiddenlist.canspeech(text); @@ -3445,6 +3227,8 @@ void process(ENetPacket *packet, int sender, int chan) mlog(ACLOG_INFO, "[%s] %s%s says: '%s'", cl->hostname, type == SV_TEXTME ? "(me) " : "", cl->name, text); if(cl->type==ST_TCPIP) while(mid1messages.add(p.buf[mid1++]); QUEUE_STR(text); + ASSERT(SV_TEXT < 126 && SV_TEXTME < 126); + sendf(sender, 1, "riiuis", SV_CLIENT, sender, (int) strlen(text) + 2, type, text); // "local" echo } else // spect chat { @@ -3476,7 +3260,6 @@ void process(ENetPacket *packet, int sender, int chan) int targ = getint(p); getstring(text, p); filtertext(text, text, FTXT__CHAT); - trimtrailingwhitespace(text); if(!valid_client(targ)) break; client *target = clients[targ]; @@ -3488,7 +3271,11 @@ void process(ENetPacket *packet, int sender, int chan) { bool allowed = !(sg->mastermode == MM_MATCH && cl->team != target->team) && cl->role >= roleconf('t'); mlog(ACLOG_INFO, "[%s] %s says to %s: '%s' (%s)", cl->hostname, cl->name, target->name, text, allowed ? "allowed":"disallowed"); - if(allowed) sendf(target->clientnum, 1, "riis", SV_TEXTPRIVATE, cl->clientnum, text); + if(allowed) + { + sendf(cl->clientnum, 1, "riiis", SV_TEXTPRIVATE, cl->clientnum, target->clientnum, text); // "local" echo + sendf(target->clientnum, 1, "riiis", SV_TEXTPRIVATE, cl->clientnum, -1, text); + } } else { @@ -3521,7 +3308,6 @@ void process(ENetPacket *packet, int sender, int chan) if ( cl->spam < 0 ) cl->spam = 0; cl->lastvc = servmillis; // register if ( cl->spam > 4 ) { cl->mute = servmillis + 10000; break; } // 5 vcs in less than 20 seconds... shut up please - if ( m_teammode ) checkteamplay(s,sender); // finally here we check the teamplay comm if ( type == SV_VOICECOM ) { QUEUE_MSG; } else sendvoicecomteam(s, sender); } @@ -3582,7 +3368,6 @@ void process(ENetPacket *packet, int sender, int chan) { int gunselect = getint(p); if(!valid_weapon(gunselect) || gunselect == GUN_CPISTOL) break; - if(!m_demo && !m_coop) checkweapon(type,gunselect); cl->state.gunselect = gunselect; QUEUE_MSG; break; @@ -3701,6 +3486,11 @@ void process(ENetPacket *packet, int sender, int chan) break; } + case SV_SPECTCN: + cl->spectcn = getint(p); + QUEUE_MSG; // FIXME: demo only + break; + case SV_SUICIDE: { gameevent &suicide = cl->addevent(); @@ -3728,21 +3518,19 @@ void process(ENetPacket *packet, int sender, int chan) loopk(3) { shot.shot.from[k] = cl->state.o.v[k] + ( k == 2 ? (((cl->f>>7)&1)?2.2f:4.2f) : 0); } loopk(3) { float v = getint(p)/DMF; shot.shot.to[k] = ((k<2 && v<0.0f)?0.0f:v); } int hits = getint(p); - int tcn = -1; loopk(hits) { gameevent &hit = cl->addevent(); hit.type = GE_HIT; - tcn = hit.hit.target = getint(p); + hit.hit.target = getint(p); hit.hit.lifesequence = getint(p); hit.hit.info = getint(p); loopk(3) hit.hit.dir[k] = getint(p)/DNF; } - if(!m_demo && !m_coop) checkshoot(sender, shot, hits, tcn); break; } - case SV_EXPLODE: // Brahma says: FIXME handle explosion by location and deal damage from server + case SV_EXPLODE: { gameevent &exp = cl->addevent(); exp.type = GE_EXPLODE; @@ -3779,37 +3567,6 @@ void process(ENetPacket *packet, int sender, int chan) break; } - // for AUTH: - - case SV_AUTHTRY: - { - string desc, name; - getstring(desc, p, sizeof(desc)); // unused for now - getstring(name, p, sizeof(name)); - if(!desc[0]) tryauth(cl, name); - break; - } - - case SV_AUTHANS: - { - string desc, ans; - getstring(desc, p, sizeof(desc)); // unused for now - uint id = (uint)getint(p); - getstring(ans, p, sizeof(ans)); - if(!desc[0]) answerchallenge(cl, id, ans); - break; - } - - - case SV_AUTHT: - { -/* int n = getint(p); - loopi(n) getint(p);*/ -// if (cl) disconnect_client(cl->clientnum, DISC_TAGT); // remove this in the future, when auth is complete - break; - } - // :for AUTH - case SV_PING: sendf(sender, 1, "ii", SV_PONG, getint(p)); break; @@ -3850,7 +3607,6 @@ void process(ENetPacket *packet, int sender, int chan) cl->position.setsize(0); while(curmsgposition.add(p.buf[curmsg++]); } - if(!m_demo && !m_coop) checkmove(cl); break; } @@ -3894,7 +3650,6 @@ void process(ENetPacket *packet, int sender, int chan) cl->position.setsize(0); while(curmsgposition.add(p.buf[curmsg++]); } - if(!m_demo && !m_coop) checkmove(cl); break; } @@ -4098,7 +3853,6 @@ void process(ENetPacket *packet, int sender, int chan) getstring(text, p); strncpy(vi->text,text,128); filtertext(text, text, FTXT__KICKBANREASON); - trimtrailingwhitespace(text); vi->action = new kickaction(cn2boot, newstring(text, 128)); vi->boot = 1; break; @@ -4109,7 +3863,6 @@ void process(ENetPacket *packet, int sender, int chan) getstring(text, p); strncpy(vi->text,text,128); filtertext(text, text, FTXT__KICKBANREASON); - trimtrailingwhitespace(text); vi->action = new banaction(cn2boot, newstring(text, 128)); vi->boot = 2; break; @@ -4568,7 +4321,6 @@ void serverslice(uint timeout) // main server update, called from cube main lo if(m_ktf && !ktfflagingame) flagaction(rnd(2), FA_RESET, -1); // ktf flag watchdog if(m_arena) arenacheck(); else if(m_autospawn) autospawncheck(); - sendextras(); if(scl.afk_limit && sg->mastermode == MM_OPEN && next_afk_check < servmillis && sg->gamemillis > 20 * 1000) check_afk(); } @@ -4863,13 +4615,8 @@ void localconnect() void processmasterinput(const char *cmd, int cmdlen, const char *args) { -// AUTH WiP - uint id; string val; - if(sscanf(cmd, "failauth %u", &id) == 1) authfailed(id); - else if(sscanf(cmd, "succauth %u", &id) == 1) authsucceeded(id); - else if(sscanf(cmd, "chalauth %u %s", &id, val) == 2) authchallenged(id, val); - else if(!strncmp(cmd, "cleargbans", cmdlen)) cleargbans(); + if(!strncmp(cmd, "cleargbans", cmdlen)) cleargbans(); else if(sscanf(cmd, "addgban %s", val) == 1) addgban(val); } diff --git a/source/src/server.h b/source/src/server.h index c9f34d63..a9a29b9f 100644 --- a/source/src/server.h +++ b/source/src/server.h @@ -203,26 +203,6 @@ struct savedscore } }; -struct medals -{ - int dpt, lasthit, lastgun, ncovers, nhs; - int combohits, combo, combofrags, combotime, combodamage, ncombos; - int ask, askmillis, linked, linkmillis, linkreason, upmillis, flagmillis; - int totalhits, totalshots; - bool updated, combosend; - vec pos, flagpos; - void reset() - { - dpt = lasthit = lastgun = ncovers = nhs = 0; - combohits = combo = combofrags = combotime = combodamage = ncombos = 0; - askmillis = linkmillis = upmillis = flagmillis = 0; - linkreason = linked = ask = -1; - totalhits = totalshots = 0; - updated = combosend = false; - pos = flagpos = vec(-1e10f, -1e10f, -1e10f); - } -}; - #define VITANAMEHISTLEN 4 #define VITAIPHISTLEN 4 #define VITACCHISTLEN 4 @@ -265,7 +245,7 @@ struct client // server side version of "dynent" type int skin[2]; int vote; int role; - int connectmillis, lmillis, ldt, spj; + int connectmillis, ldt, spj; int mute, spam, lastvc; // server side voice comm spam control int acversion, acbuildtype; bool isauthed; // for passworded servers @@ -289,25 +269,15 @@ struct client // server side version of "dynent" type bool autospawn; int salt; string pwd; - uint authreq; // for AUTH - string authname; // for AUTH + int spectcn; int mapcollisions, farpickups; enet_uint32 bottomRTT; - medals md; bool upspawnp; int lag; vec spawnp; int nvotes; int input, inputmillis; int ffire, wn, f, t, yaw, pitch; - int yb, pb, oy, op, lda, ldda, fam; - int nt[10], np, lp, ls, lsm, ld, nd, nlt, lem, led; - vec cp[10], dp[10], d0, lv, lt, le; - float dda, tr, sda; - int ps, ph, tcn, bdt, pws; - float pr; - int yls, pls, tls; - int bs, bt, blg, bp; gameevent &addevent() { @@ -334,22 +304,12 @@ struct client // server side version of "dynent" type lastevent = 0; at3_lastforce = eff_score = 0; mapcollisions = farpickups = 0; - md.reset(); upspawnp = false; lag = 0; spawnp = vec(-1e10f, -1e10f, -1e10f); - lmillis = ldt = spj = 0; + ldt = spj = 0; ffire = 0; f = yaw = pitch = t = 0; - yb = pb = oy = op = lda = ldda = fam = 0; - np = lp = ls = lsm = ld = nd = nlt = lem = led = 0; - d0 = lv = lt = le = vec(0,0,0); - loopi(10) { cp[i] = dp[i] = vec(0,0,0); nt[i] = 0; } - dda = tr = sda = 0; - ps = ph = bdt = pws = 0; - tcn = -1; - pr = 0.0f; - yls = pls = tls = 0; } void reset() @@ -373,13 +333,10 @@ struct client // server side version of "dynent" type lastsaytext[0] = '\0'; saychars = 0; spawnindex = -1; - authreq = 0; // for AUTH mapchange(); freshgame = false; // don't spawn into running games mute = spam = lastvc = badspeech = badmillis = nvotes = 0; input = inputmillis = 0; - wn = -1; - bs = bt = blg = bp = 0; } void zap() @@ -460,12 +417,12 @@ const char *messagenames[SV_NUM] = "SV_SERVINFO", "SV_SERVINFO_RESPONSE", "SV_SERVINFO_CONTD", "SV_WELCOME", "SV_INITCLIENT", "SV_POS", "SV_POSC", "SV_POSC2", "SV_POSC3", "SV_POSC4", "SV_POSN", "SV_TEXT", "SV_TEAMTEXT", "SV_TEXTME", "SV_TEAMTEXTME", "SV_TEXTPRIVATE", "SV_SOUND", "SV_VOICECOM", "SV_VOICECOMTEAM", "SV_CDIS", - "SV_SHOOT", "SV_EXPLODE", "SV_SUICIDE", "SV_AKIMBO", "SV_RELOAD", "SV_AUTHT", "SV_AUTHREQ", "SV_AUTHTRY", "SV_AUTHANS", "SV_AUTHCHAL", + "SV_SHOOT", "SV_EXPLODE", "SV_SUICIDE", "SV_AKIMBO", "SV_RELOAD", "SV_GIBDIED", "SV_DIED", "SV_GIBDAMAGE", "SV_DAMAGE", "SV_HITPUSH", "SV_SHOTFX", "SV_THROWNADE", "SV_TRYSPAWN", "SV_SPAWNSTATE", "SV_SPAWN", "SV_SPAWNDENY", "SV_FORCEDEATH", "SV_RESUME", "SV_DISCSCORES", "SV_TIMEUP", "SV_EDITENT", "SV_ITEMACC", "SV_MAPCHANGE", "SV_ITEMSPAWN", "SV_ITEMPICKUP", - "SV_PING", "SV_PONG", "SV_CLIENTPING", "SV_GAMEMODE", + "SV_PING", "SV_PONG", "SV_CLIENTPING", "SV_EDITMODE", "SV_EDITXY", "SV_EDITARCH", "SV_EDITBLOCK", "SV_EDITD", "SV_EDITE", "SV_NEWMAP", "SV_SENDMAP", "SV_RECVMAP", "SV_REMOVEMAP", "SV_SERVMSG", "SV_SERVMSGVERB", "SV_ITEMLIST", "SV_WEAPCHANGE", "SV_PRIMARYWEAP", @@ -474,13 +431,13 @@ const char *messagenames[SV_NUM] = "SV_SETADMIN", "SV_SERVOPINFO", "SV_CALLVOTE", "SV_CALLVOTESUC", "SV_CALLVOTEERR", "SV_VOTE", "SV_VOTERESULT", "SV_SETTEAM", "SV_TEAMDENY", "SV_SERVERMODE", - "SV_IPLIST", + "SV_IPLIST", "SV_SPECTCN", "SV_LISTDEMOS", "SV_SENDDEMOLIST", "SV_GETDEMO", "SV_SENDDEMO", "SV_DEMOPLAYBACK", "SV_CONNECT", "SV_SWITCHNAME", "SV_SWITCHSKIN", "SV_SWITCHTEAM", "SV_CLIENT", "SV_EXTENSION", - "SV_MAPIDENT", "SV_HUDEXTRAS", "SV_POINTS", "SV_DEMOCHECKSUM", "SV_DEMOSIGNATURE", + "SV_MAPIDENT", "SV_DEMOCHECKSUM", "SV_DEMOSIGNATURE", }; const char *entnames[] = diff --git a/source/src/serverbrowser.cpp b/source/src/serverbrowser.cpp index 0562bee8..3c52a1ab 100644 --- a/source/src/serverbrowser.cpp +++ b/source/src/serverbrowser.cpp @@ -1305,8 +1305,6 @@ void clearservers() #define RETRIEVELIMIT 5000 -bool cllock = false, clfail = false; - int progress_callback_retrieveservers(void *data, float progress) { if(progress < 0) show_out_of_renderloop_progress(progress + 1.0f, "waiting for response (esc to abort)"); @@ -1335,12 +1333,10 @@ void retrieveservers(vector &data) if(got < 0 || h.response != 200) data.setsize(0); h.outvec = NULL; // must not be cleaned up by httpget if(data.length()) data.add('\0'); - clfail = false; } else { conoutf("failed to resolve host %s", mastername); - clfail = true; } } else @@ -1349,10 +1345,8 @@ void retrieveservers(vector &data) if(sock == ENET_SOCKET_NULL) { conoutf("Master server is not replying."); - clfail = true; return; } - clfail = false; defformatstring(text)("retrieving servers from %s:%d... (esc to abort)", mastername, masterport); show_out_of_renderloop_progress(0, text); int starttime = SDL_GetTicks(), timeout = 0; @@ -1406,17 +1400,12 @@ VAR(msctrl, 1, 1, INT_MAX); void updatefrommaster(int *force) { static int lastupdate = 0; - if(lastupdate==0) cllock = true; if(!*force && lastupdate && totalmillis-lastupdate data; retrieveservers(data); - if(data.empty()) - { - if (!clfail) conoutf("Master server is not replying. \f1Get more information at http://masterserver.cubers.net/"); - cllock = !clfail; - } + if(data.empty()) conoutf("Master server is not replying. \f1Get more information at http://masterserver.cubers.net/"); else { // preserve currently connected server from deletion @@ -1425,12 +1414,10 @@ void updatefrommaster(int *force) if(curserver) copystring(curname, curserver->name); clearservers(); - if(!strncmp(data.getbuf(), "addserver", 9)) cllock = false; // the ms could reply other thing... but currently, this is useless - if(!cllock ) - { - execute(data.getbuf()); - if(curserver) addserver(curname, curserver->port, curserver->msweight); - } + + execute(data.getbuf()); + if(curserver) addserver(curname, curserver->port, curserver->msweight); + lastupdate = totalmillis; } } diff --git a/source/src/serverchecks.h b/source/src/serverchecks.h index 2fcd2414..3feed894 100644 --- a/source/src/serverchecks.h +++ b/source/src/serverchecks.h @@ -21,35 +21,12 @@ inline void checkclientpos(client *cl) } } -#define POW2XY(A,B) (pow2(A.x-B.x)+pow2(A.y-B.y)) - extern inline void addban(client *cl, int reason, int type = BAN_AUTO); #ifdef ACAC #include "anticheat.h" #endif -#define MINELINE 50 - -/** -This part is related to medals system. WIP - */ - -const char * medal_messages[] = { "defended the flag", "covered the flag stealer", "defended the dropped flag", "covered the flag keeper", "covered teammate" }; -enum { CTFLDEF, CTFLCOV, HTFLDEF, HTFLCOV, COVER, MEDALMESSAGENUM }; -inline void print_medal_messages(client *c, int n) -{ - if (n<0 || n>=MEDALMESSAGENUM) return; - xlog(ACLOG_VERBOSE, "[%s] %s %s", c->hostname, c->name, medal_messages[n]); -} - -inline void addpt(client *c, int points, int n = -1) { - c->state.points += points; - c->md.dpt += points; - c->md.updated = true; - c->md.upmillis = sg->gamemillis + 240; // about 2 AR shots - print_medal_messages(c,n); -} /** cnumber is the number of players in the game, at a max value of 12 */ #define CTFPICKPT cnumber // player picked the flag (ctf) @@ -81,353 +58,13 @@ inline void addpt(client *c, int points, int n = -1) { #define TKPT -20 // player tks #define FLAGTKPT -2*(10+cnumber) // player tks the flag keeper/stealer -void flagpoints(client *c, int message) -{ - float distance = 0; - int cnumber = totalclients < 13 ? totalclients : 12; - switch (message) - { - case FM_PICKUP: - c->md.flagpos.x = c->state.o.x; - c->md.flagpos.y = c->state.o.y; - c->md.flagmillis = servmillis; - if (m_ctf) addpt(c, CTFPICKPT); - break; - case FM_DROP: - if (m_ctf) addpt(c, CTFDROPPT); - break; - case FM_LOST: - if (m_htf) addpt(c, HTFLOSTPT); - else if (m_ctf) { - distance = sqrt(POW2XY(c->state.o,c->md.flagpos)); - if (distance > 200) distance = 200; // ~200 is the distance between the flags in ac_depot - addpt(c, CTFLOSTPT); - } - break; - case FM_RETURN: - addpt(c, CTFRETURNPT); - break; - case FM_SCORE: - if (m_ctf) { - distance = sqrt(POW2XY(c->state.o,c->md.flagpos)); - if (distance > 200) distance = 200; -#ifdef ACAC - if ( validflagscore(distance,c) ) -#endif - addpt(c, CTFSCOREPT); - } else addpt(c, HTFSCOREPT); - break; - case FM_KTFSCORE: - addpt(c, KTFSCOREPT); - break; - default: - break; - } -} -inline int minhits2combo(int gun) -{ - switch (gun) - { - case GUN_SUBGUN: - case GUN_AKIMBO: - return 4; - case GUN_GRENADE: - case GUN_ASSAULT: - return 3; - default: - return 2; - } -} -void checkcombo(client *target, client *actor, int damage, int gun) -{ - int diffhittime = servmillis - actor->md.lasthit; - actor->md.lasthit = servmillis; - if ((gun == GUN_SHOTGUN || gun == GUN_GRENADE) && damage < 20) - { - actor->md.lastgun = gun; - return; - } - if ( diffhittime < 750 ) { - if ( gun == actor->md.lastgun ) - { - if ( diffhittime * 2 < guns[gun].attackdelay * 3 ) - { - actor->md.combohits++; - actor->md.combotime+=diffhittime; - actor->md.combodamage+=damage; - int mh2c = minhits2combo(gun); - if ( actor->md.combohits > mh2c && actor->md.combohits % mh2c == 1 ) - { - if (actor->md.combo < 5) actor->md.combo++; - actor->md.ncombos++; - } - } - } - else - { - switch (gun) - { - case GUN_KNIFE: - case GUN_PISTOL: - if ( guns[actor->md.lastgun].isauto ) break; - case GUN_SNIPER: - if ( actor->md.lastgun > GUN_PISTOL ) break; - default: - actor->md.combohits++; - actor->md.combotime+=diffhittime; - actor->md.combodamage+=damage; - if (actor->md.combo < 5) actor->md.combo++; - actor->md.ncombos++; - break; - } - } - } - else - { - actor->md.combo = 0; - actor->md.combofrags = 0; - actor->md.combotime = 0; - actor->md.combodamage = 0; - actor->md.combohits = 0; - } - actor->md.lastgun = gun; -} -#define COVERDIST 2000 // about 45 cubes -#define REPLYDIST 8000 // about 90 cubes -float coverdist = COVERDIST; -int checkteamrequests(int sender) -{ - int dtime, besttime = -1; - int bestid = -1; - client *ant = clients[sender]; - loopv(clients) { - client *prot = clients[i]; - if ( i!=sender && prot->type != ST_EMPTY && prot->team == ant->team && - prot->state.state == CS_ALIVE && prot->md.askmillis > sg->gamemillis && prot->md.ask >= 0 ) { - float dist = POW2XY(ant->state.o,prot->state.o); - if ( dist < REPLYDIST && (dtime=prot->md.askmillis - sg->gamemillis) > besttime) { - bestid = i; - besttime = dtime; - } - } - } - if ( besttime >= 0 ) return bestid; - return -1; -} -/** WIP */ -void checkteamplay(int s, int sender) -{ - client *actor = clients[sender]; - - if ( actor->state.state != CS_ALIVE ) return; - switch(s){ - case S_IMONDEFENSE: // informs - actor->md.linkmillis = sg->gamemillis + 20000; - actor->md.linkreason = s; - break; - case S_COVERME: // demands - case S_STAYTOGETHER: - case S_STAYHERE: - actor->md.ask = s; - actor->md.askmillis = sg->gamemillis + 5000; - break; - case S_AFFIRMATIVE: // replies - case S_ALLRIGHTSIR: - case S_YES: - { - int id = checkteamrequests(sender); - if ( id >= 0 ) { - client *sgt = clients[id]; - actor->md.linked = id; - if ( actor->md.linkmillis < sg->gamemillis ) addpt(actor,REPLYPT); - actor->md.linkmillis = sg->gamemillis + 30000; - actor->md.linkreason = sgt->md.ask; - sendf(actor->clientnum, 1, "ri2", SV_HUDEXTRAS, HE_NUM+id); - switch( actor->md.linkreason ) { // check demands - case S_STAYHERE: - actor->md.pos = sgt->state.o; - addpt(sgt,REPLYPT); - break; - } - } - break; - } - } -} - -void computeteamwork(int team, int exclude) // testing -{ - loopv(clients) - { - client *actor = clients[i]; - if ( i == exclude || actor->type == ST_EMPTY || actor->team != team || actor->state.state != CS_ALIVE || actor->md.linkmillis < sg->gamemillis ) continue; - vec position; - bool teamworkdone = false; - switch( actor->md.linkreason ) - { - case S_IMONDEFENSE: - position = actor->spawnp; - teamworkdone = true; - break; - case S_STAYTOGETHER: - if ( valid_client(actor->md.linked) ) position = clients[actor->md.linked]->state.o; - teamworkdone = true; - break; - case S_STAYHERE: - position = actor->md.pos; - teamworkdone = true; - break; - } - if ( teamworkdone ) - { - float dist = POW2XY(actor->state.o,position); - if (dist < COVERDIST) - { - addpt(actor,TWDONEPT); - sendf(actor->clientnum, 1, "ri2", SV_HUDEXTRAS, HE_TEAMWORK); - } - } - } -} - -float a2c = 0, c2t = 0, a2t = 0; // distances: actor to covered, covered to target and actor to target - -inline bool testcover(int msg, int factor, client *actor) -{ - if ( a2c < coverdist && c2t < coverdist && a2t < coverdist ) - { - sendf(actor->clientnum, 1, "ri2", SV_HUDEXTRAS, msg); - addpt(actor, factor); - actor->md.ncovers++; - return true; - } - return false; -} - -#define CALCCOVER(C) \ - a2c = POW2XY(actor->state.o,C);\ - c2t = POW2XY(C,target->state.o);\ - a2t = POW2XY(actor->state.o,target->state.o) - -bool validlink(client *actor, int cn) -{ - return actor->md.linked >= 0 && actor->md.linked == cn && sg->gamemillis < actor->md.linkmillis && valid_client(actor->md.linked); -} - -/** WIP */ -void checkcover(client *target, client *actor) -{ - int team = actor->team; - int oteam = team_opposite(team); - - bool covered = false; - int coverid = -1; - - int cnumber = totalclients < 13 ? totalclients : 12; - - if ( m_flags ) { - sflaginfo &f = sg->sflaginfos[team]; - sflaginfo &of = sg->sflaginfos[oteam]; - - if ( m_ctf ) - { - if ( f.state == CTFF_INBASE ) - { - CALCCOVER(f); - if ( testcover(HE_FLAGDEFENDED, CTFLDEFPT, actor) ) print_medal_messages(actor,CTFLDEF); - } - if ( of.state == CTFF_STOLEN && actor->clientnum != of.actor_cn ) - { - covered = true; coverid = of.actor_cn; - CALCCOVER(clients[of.actor_cn]->state.o); - if ( testcover(HE_FLAGCOVERED, CTFLCOVPT, actor) ) print_medal_messages(actor,CTFLCOV); - } - } - else if ( m_htf ) - { - if ( actor->clientnum != f.actor_cn ) - { - if ( f.state == CTFF_DROPPED ) - { - struct { short x, y; } nf; - nf.x = f.pos[0]; nf.y = f.pos[1]; - CALCCOVER(nf); - if ( testcover(HE_FLAGDEFENDED, HTFLDEFPT, actor) ) print_medal_messages(actor,HTFLDEF); - } - if ( f.state == CTFF_STOLEN ) - { - covered = true; coverid = f.actor_cn; - CALCCOVER(clients[f.actor_cn]->state.o); - if ( testcover(HE_FLAGCOVERED, HTFLCOVPT, actor) ) print_medal_messages(actor,HTFLCOV); - } - } - } - } - - if ( !(covered && actor->md.linked==coverid) && validlink(actor,actor->md.linked) ) - { - CALCCOVER(clients[actor->md.linked]->state.o); - if ( testcover(HE_COVER, COVERPT, actor) ) print_medal_messages(actor,COVER); - } - -} - -#undef CALCCOVER - -/** WiP */ -void checkfrag(client *target, client *actor, int gun, bool gib) -{ - int targethasflag = clienthasflag(target->clientnum); - int actorhasflag = clienthasflag(actor->clientnum); - int cnumber = totalclients < 13 ? totalclients : 12; - addpt(target,DEATHPT); - if(target!=actor) { - if(!isteam(target->team, actor->team)) { - - if (m_teammode) { - if(!m_flags) addpt(actor, TMBONUSPT); - else addpt(actor, FLBONUSPT); - - checkcover (target, actor); - if ( m_htf && actorhasflag >= 0 ) addpt(actor, HTFFRAGPT); - - if ( m_ctf && targethasflag >= 0 ) { - addpt(actor, CTFFRAGPT); - } - } - else addpt(actor, BONUSPT); - - if (gib && gun != GUN_GRENADE) { - if ( gun == GUN_SNIPER ) { - addpt(actor, HEADSHOTPT); - actor->md.nhs++; - } - else if ( gun == GUN_KNIFE ) addpt(actor, KNIFEPT); - else if ( gun == GUN_SHOTGUN ) addpt(actor, SHOTGPT); - } - else addpt(actor, FRAGPT); - - if ( actor->md.combo ) { - actor->md.combofrags++; - addpt(actor,COMBOPT); - actor->md.combosend = true; - } - - } else { - - if ( targethasflag >= 0 ) addpt(actor, FLAGTKPT); - else addpt(actor, TKPT); - - } - } -} int next_afk_check = 200; @@ -486,80 +123,3 @@ inline int check_pdist(client *c, float & dist) // pick up distance return 0; } -/** -If you read README.txt you must know that AC does not have cheat protection implemented. -However this file is the sketch to a very special kind of cheat detection tools in server side. - -This is not based in program tricks, i.e., encryption, secret bytes, nor monitoring/scanning tools. - -The idea behind these cheat detections is to check (or reproduce) the client data, and verify if -this data is expected or possible. Also, there is no need to check all clients all time, and -one coding this kind of check must pay a special attention to the lag effect and how it can -affect the data observed. This is not a trivial task, and probably it is the main reason why -such tools were never implemented. - -This part is here for compatibility purposes. -If you know nothing about these detections, please, just ignore it. -*/ - -inline void checkmove(client *cl) -{ - cl->ldt = sg->gamemillis - cl->lmillis; - cl->lmillis = sg->gamemillis; - if ( cl->ldt < 40 ) cl->ldt = 40; - cl->t += cl->ldt; - cl->spj = (( 7 * cl->spj + cl->ldt ) >> 3); - - if ( cl->input != cl->f ) - { - cl->input = cl->f; - cl->inputmillis = servmillis; - } - - -#ifdef ACAC - m_engine(cl); -#endif - - if ( !cl->upspawnp ) - { - cl->spawnp = cl->state.o; - cl->upspawnp = true; - cl->spj = cl->ldt = 40; - } - - return; -} - -inline void checkshoot(int & cn, gameevent & shot, int & hits, int & tcn) -{ -#ifdef ACAC - s_engine(cn, shot, hits, tcn); -#endif - return; -} - -inline void checkweapon(int & type, int & var) -{ -#ifdef ACAC - w_engine(type,var); -#endif - return; -} - -bool validdamage(client *&target, client *&actor, int &damage, int &gun, bool &gib) -{ -#ifdef ACAC - if (!d_engine(target, actor, damage, gun, gib)) return false; -#endif - return true; -} - -inline int checkmessage(client *c, int type) -{ -#ifdef ACAC - type = p_engine(c,type); -#endif - return type; -} - diff --git a/source/src/texture.cpp b/source/src/texture.cpp index 0b909727..8a121159 100644 --- a/source/src/texture.cpp +++ b/source/src/texture.cpp @@ -510,6 +510,7 @@ Texture *lookuptexture(int tex, Texture *failtex, bool trydl) { defformatstring(pname)("packages/textures/%s", path(s.name, true)); s.tex = textureload(pname, 0, true, true, s.scale, trydl); + if(s.tex != notexture) s.loaded = true; if(!trydl) { if(s.tex==notexture) s.tex = failtex; diff --git a/source/src/vertmodel.h b/source/src/vertmodel.h index 50fa0b16..ab88f49c 100644 --- a/source/src/vertmodel.h +++ b/source/src/vertmodel.h @@ -1256,7 +1256,6 @@ struct vertmodel : model void setskin(int tex = 0) { - //if(parts.length()!=1 || parts[0]->meshes.length()!=1) return; if(parts.length() < 1 || parts[0]->meshes.length() < 1) return; mesh &m = *parts[0]->meshes[0]; m.tex = tex; diff --git a/source/src/world.cpp b/source/src/world.cpp index d0a00ec8..f6eab2d5 100644 --- a/source/src/world.cpp +++ b/source/src/world.cpp @@ -692,9 +692,7 @@ bool empty_world(int factor, bool force) // main empty world creation routine if(clearmap && unsavededits) { xmapbackup("newmap", ""); unsavededits = 0; } if(copy) ow = blockcopy(shrink ? bs : be); - extern char *mlayout; DELETEA(world); - DELETEA(mlayout); setupworld(factor); loop(x,ssize) loop(y,ssize) @@ -1039,3 +1037,10 @@ void mapareacheck(char *what) // "vdelta" | "steepest" | "total" | "pprest" | "p COMMAND(mapareacheck, "s"); +void showmapstats() +{ + conoutf("\f2Map quality stats"); + conoutf("this map %s", rnd(3) ? "is great" : "sucks"); +} +COMMAND(showmapstats, ""); + diff --git a/source/src/world.h b/source/src/world.h index 39c2c2b8..13e5c666 100644 --- a/source/src/world.h +++ b/source/src/world.h @@ -97,21 +97,6 @@ struct _mapconfigdata } }; -struct mapstats -{ - struct header hdr; - int entcnt[MAXENTTYPES]; - int cgzsize; - uchar *enttypes; - short *entposs; - int spawns[3]; - int flags[2]; - int flagents[2]; - bool hasffaspawns; - bool hasteamspawns; - bool hasflags; -}; - struct mapdim_s { // 0 2 1 3 6 7 int x1, x2, y1, y2, minfloor, maxceil; // outer borders (points to last used cube) @@ -183,10 +168,3 @@ struct entitystats_s short first[MAXENTTYPES], last[MAXENTTYPES]; // first and last occurence of every basic ent type }; - -// legacy - -#define MAXMHEIGHT 30 -#define MAXMAREA 10000 -#define MAXHHITS 50000 // was 6000, which denied my fav. maps - jamz, 2012-06-12; 15000 denies sane map too - lucas -#define MINFF 2500 diff --git a/source/src/worldio.cpp b/source/src/worldio.cpp index f81af9fa..c5159956 100644 --- a/source/src/worldio.cpp +++ b/source/src/worldio.cpp @@ -920,10 +920,6 @@ VARF(mapoverride_limitwaveheight, 0, 0, 1, changemapflag(mapoverride_limitwavehe VARF(mapoverride_nostencilshadows, 0, 0, 1, changemapflag(mapoverride_nostencilshadows, MHF_DISABLESTENCILSHADOWS)); VAR(_ignoreillegalpaths, 0, 0, 1); -extern char *mlayout; -extern int Mv, Ma, Hhits; -extern float Mh; - static string lastloadedconfigfile; int load_world(char *mname) // still supports all map formats that have existed since the earliest cube betas! @@ -1077,34 +1073,15 @@ int load_world(char *mname) // still supports all map formats that have e res |= LWW_WORLDERROR * (iabs(we) & 0xf); delete[] smallworld; - - - DELETEA(mlayout); - mlayout = new char[cubicsize + 256]; - memset(mlayout, 0, cubicsize * sizeof(char)); - Mv = Ma = Hhits = 0; - char texuse[256]; - loopi(256) texuse[i] = 0; - loopk(cubicsize) + // check texture slot usage + char texuse[256] = { 0 }; + sqr *s = world; + loopirev(cubicsize) { - sqr *s = &world[k]; - if(SOLID(s)) mlayout[k] = 127; - else - { - mlayout[k] = s->floor; // FIXME - int diff = s->ceil - s->floor; - if(diff > 6) - { - if(diff > MAXMHEIGHT) Hhits += diff - MAXMHEIGHT; - Ma += 1; - Mv += diff; - } - texuse[s->utex] = texuse[s->ftex] = texuse[s->ctex] = 1; - } + if(!SOLID(s)) texuse[s->utex] = texuse[s->ftex] = texuse[s->ctex] = 1; texuse[s->wtex] = 1; + s++; } - Mh = Ma ? (float)Mv/Ma : 0; - c2skeepalive(); calclight(); conoutf("read map %s rev %d (%d milliseconds)", cgzname, hdr.maprevision, watch.elapsed());