Merge remote-tracking branch 'remotes/origin/next' into release_v1.3

This commit is contained in:
drian
2021-02-10 21:00:09 +01:00
58 changed files with 4340 additions and 3913 deletions
+76 -57
View File
@@ -525,6 +525,7 @@ extern void gets2c();
extern void c2sinfo(playerent *d);
extern void c2skeepalive();
extern void neterr(const char *s);
extern ENetPeer *curpeer;
extern int getclientnum();
extern void getmap(char *name = NULL, char *callback = NULL);
extern void newteam(char *name);
@@ -845,15 +846,15 @@ extern const char *particletypenames[MAXPARTYPES + 1];
// worldio
enum { LWW_ENTATTROVERFLOW = 0x1, LWW_DECODEERR = 0x10, LWW_WORLDERROR = 0x100, LWW_MISSINGMEDIA = 0x1000, LWW_CONFIGERR = 0x10000, LWW_MODELERR = 0x100000, LWW_SCRIPTERR = 0x1000000 };
extern const char *setnames(const char *name);
extern const char **setnames(const char *name);
extern void save_world(char *mname, bool skipoptimise = false, bool addcomfort = false);
extern int _ignoreillegalpaths;
extern int load_world(char *mname);
extern char *getfiledesc(const char *dir, const char *name, const char *ext);
extern void writemap(char *name, int size, uchar *data);
extern void writecfggz(char *name, int size, int sizegz, uchar *data);
extern uchar *readmap(char *name, int *size, int *revision);
extern uchar *readmcfggz(char *name, int *size, int *sizegz);
extern void writemap(const char *name, int size, uchar *data);
extern void writecfggz(const char *name, int size, int sizegz, uchar *data);
extern uchar *readmap(const char *name, int *size, int *revision);
extern uchar *readmcfggz(const char *name, int *size, int *sizegz);
extern void rlencodecubes(vector<uchar> &f, sqr *s, int len, bool preservesolids);
extern bool rldecodecubes(ucharbuf &f, sqr *s, int len, int version, bool silent);
extern void clearheaderextras();
@@ -916,7 +917,6 @@ extern void addgib(playerent *d);
extern playerent *playerincrosshair();
extern int magsize(int gun);
extern void setscope(bool activate);
extern void setburst(bool activate);
extern void intersectgeometry(const vec &from, vec &to);
extern int intersect(playerent *d, const vec &from, const vec &to, vec *end = NULL);
extern bool intersect(entity *e, const vec &from, const vec &to, vec *end = NULL);
@@ -928,6 +928,7 @@ extern int burstshotssettings[NUMGUNS];
// entities
extern int edithideentmask;
extern void pickupeffects(int n, playerent *d);
extern void rendereditentities();
extern void renderentities();
extern void rendermapmodels();
extern void resetpickups(int type = -1);
@@ -953,6 +954,13 @@ extern const char *docgetdesc(const char *name);
extern const char *acronymmodestr(int n);
extern const char *fullmodestr(int n);
extern int defaultgamelimit(int gamemode);
extern int gmode_possible(bool hasffaspawns, bool hasteamspawns, bool hasflags);
extern int gmode_parse(const char *list);
extern char *gmode_enum(int gm, char *buf);
extern int encodepitch(float p);
extern float decodepitch(int r);
extern int encodeyaw(float y);
extern float decodeyaw(int r);
// crypto
#define TIGERHASHSIZE 24
@@ -960,18 +968,13 @@ extern void tigerhash(uchar *hash, const uchar *msg, int len);
extern void *tigerhash_init(uchar *hash);
extern void tigerhash_add(uchar *hash, const void *msg, int len, void *state);
extern void tigerhash_finish(uchar *hash, void *state);
extern const char *bin2hex(char *d, const uchar *s, int len);
extern int hex2bin(uchar *d, const char *s, int maxlen);
extern void ed25519_pubkey_from_private(uchar *pubkey, const uchar *privkey);
extern void ed25519_sign(uchar *sm, int *smlen, const uchar *m, int mlen, const uchar *sk);
extern uchar *ed25519_sign_check(uchar *sm, int smlen, const uchar *pk);
extern uchar *sk; // client game key
extern void loadcertdir(); // load all certs in "config/certs"
#if 0
// crypto // for AUTH
extern void genprivkey(const char *seed, vector<char> &privstr, vector<char> &pubstr);
extern bool hashstring(const char *str, char *result, int maxlen);
extern void answerchallenge(const char *privstr, const char *challenge, vector<char> &answerstr);
extern void *parsepubkey(const char *pubstr);
extern void freepubkey(void *pubkey);
extern void *genchallenge(void *pubkey, const void *seed, int seedlen, vector<char> &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);
@@ -1011,7 +1014,6 @@ extern void writecfg();
extern void deletecfg();
extern void identnames(vector<const char *> &names, bool builtinonly);
extern void explodelist(const char *s, vector<char *> &elems);
extern const char *escapestring(const char *s, bool force = true, bool noquotes = false);
extern int execcontext;
extern void pushscontext(int newcontext);
extern int popscontext();
@@ -1022,14 +1024,18 @@ extern void dumpexecutionstack(stream *f);
extern const char *currentserver(int i);
// server
enum { /* timecodes */ VS_FIRSTLOGIN = 0, VS_LASTLOGIN, VS_MUTE, VS_NOVOTE, VS_BAN, VS_ADMIN, VS_OWNER, VS_MAPUPLOAD,
/* stats/counters */ VS_MINUTESCONNECTED, VS_MINUTESACTIVE, VS_FLAGS, VS_FRAGS, VS_DEATHS, VS_TKS, VS_DAMAGE, VS_FF, VS_NUM, VS_NUMCOUNTERS = VS_MINUTESCONNECTED };
extern const char *vskeywords[VS_NUM + 1], *vsnames[VS_NUM + 1];
extern int modeacronyms;
extern void servertoclient(int chan, uchar *buf, int len, bool demo = false);
extern void localservertoclient(int chan, uchar *buf, int len, bool demo = false);
extern const char *modestr(int n, bool acronyms = false);
extern const char *voteerrorstr(int n);
extern const char *mmfullname(int n);
extern void filterconfigset(char *list, void *cs = NULL);
extern void fatal(const char *s, ...) PRINTFARGS(1, 2);
extern void initserver(bool dedicated, int argc = 0, char **argv = NULL);
extern void initserver(bool dedicated);
extern void cleanupserver();
extern void localconnect();
extern void localdisconnect();
@@ -1055,20 +1061,33 @@ extern void sendstring(const char *t, ucharbuf &p);
extern void sendstring(const char *t, packetbuf &p);
extern void sendstring(const char *t, vector<uchar> &p);
extern void getstring(char *t, ucharbuf &p, int len = MAXTRANS);
extern void putip4(ucharbuf &p, enet_uint32 ip);
extern void putip4(packetbuf &p, enet_uint32 ip);
extern void putip4(vector<uchar> &p, enet_uint32 ip);
extern enet_uint32 getip4(ucharbuf &p);
extern void putuintn(ucharbuf &p, uint64_t val, int n);
extern void putuintn(packetbuf &p, uint64_t val, int n);
extern void putuintn(vector<uchar> &p, uint64_t val, int n);
extern uint64_t getuintn(ucharbuf &p, int n);
extern void putgzbuf(vector<uchar> &d, vector<uchar> &s); // zips a vector into a stream, stored in another vector
extern ucharbuf *getgzbuf(ucharbuf &p); // fetch a gzipped buffer; needs to be freed properly later
extern void freegzbuf(ucharbuf *p); // free a ucharbuf created by getgzbuf()
extern bool validmapname(const char *s); // checks for length, allowed chars and special DOS filenames
extern char *filtertext(char *dst, const char *src, int flags, int len = sizeof(string)-1);
extern void filterrichtext(char *dst, const char *src, int len = sizeof(string)-1);
extern const char *escapestring(const char *s, bool force = true, bool noquotes = false, vector<char> *buf = NULL);
extern void filterlang(char *d, const char *s);
extern void filtercountrycode(char *d, const char *s); // returns exactly two uppercase chars or "--"
extern void trimtrailingwhitespace(char *s);
extern int msgsizelookup(int msg);
extern const char *disc_reason(int reason);
extern string mastername;
extern int masterport;
extern bool usemaster;
extern ENetSocket connectmaster();
extern void serverms(int mode, int numplayers, int minremain, char *smapname, int millis, const ENetAddress &localaddr, int *mnum, int *msend, int *mrec, int *cnum, int *csend, int *crec, int protocol_version);
extern int msgsizelookup(int msg);
extern void serverms(int mode, int numplayers, int minremain, char *smapname, int millis, const ENetAddress &localaddr, int *mnum, int *msend, int *mrec, int *cnum, int *csend, int *crec, int protocol_version, const char *servdesccur, int _interm);
extern const char *genpwdhash(const char *name, const char *pwd, int salt);
extern void servermsinit(const char *master, const char *ip, int serverport, bool listen);
extern void servermsinit(bool listen);
extern bool serverpickup(int i, int sender);
extern bool valid_client(int cn);
extern void extinfo_cnbuf(ucharbuf &p, int cn);
@@ -1078,6 +1097,7 @@ extern char *votestring(int type, char *arg1, char *arg2, char *arg3);
extern int wizardmain(int argc, char **argv);
// some tools
extern header *peekmapheader(uchar *data, int len);
extern servsqr *createservworld(const sqr *s, int _cubicsize);
extern int calcmapdims(mapdim_s &md, const servsqr *s, int _ssize);
extern int calcmapareastats(mapareastats_s &ms, servsqr *s, int _ssize, const mapdim_s &md);
@@ -1093,8 +1113,6 @@ struct demoheader
char desc[DHDR_DESCCHARS];
char plist[DHDR_PLISTCHARS];
};
#define DEFDEMOFILEFMT "%w_%h_%n_%Mmin_%G"
#define DEFDEMOTIMEFMT "%Y%m%d_%H%M"
extern bool watchingdemo;
extern int demoprotocol;
@@ -1104,9 +1122,13 @@ extern void enddemoplayback();
enum { ACLOG_DEBUG = 0, ACLOG_VERBOSE, ACLOG_INFO, ACLOG_WARNING, ACLOG_ERROR, ACLOG_NUM };
extern bool initlogging(const char *identity, int facility_, int consolethres, int filethres, int syslogthres, bool logtimestamp);
extern bool initlogging(const char *identity, int facility_, int consolethres, int filethres, int syslogthres, bool logtimestamp, const char *logfilepath);
extern void exitlogging();
extern bool logline(int level, const char *msg, ...) PRINTFARGS(2, 3);
extern bool logcheck(int level);
extern void mlog(int level, const char *msg, ...) PRINTFARGS(2, 3); // log line from main thread (never blocks)
extern void tlog(int level, const char *msg, ...) PRINTFARGS(2, 3); // log line from other-than-main thread (may block)
extern void xlog(int level, const char *msg, ...) PRINTFARGS(2, 3); // log line from any thread (more expensive: only use for functions, that are called from main and other threads)
extern void poll_logbuffers();
// server config
@@ -1115,35 +1137,40 @@ struct serverconfigfile
string filename;
int filelen;
char *buf;
serverconfigfile() : filelen(0), buf(NULL) { filename[0] = '\0'; }
uint32_t filehash;
sl_semaphore busy;
bool readfailed, updated;
serverconfigfile() : filelen(0), buf(NULL), busy(1, NULL) { filename[0] = '\0'; fnv1a_init(filehash); }
virtual ~serverconfigfile() { DELETEA(buf); }
virtual void clear() {}
virtual void read() {}
void init(const char *name);
bool load();
void init(const char *name, bool tracking = true);
virtual bool load();
bool isbusy();
void trypreload();
void process();
};
// server commandline parsing
struct servercommandline
{
int uprate, serverport, syslogfacility, filethres, syslogthres, maxdemos, maxclients, kickthreshold, banthreshold, verbose, incoming_limit, afk_limit, ban_time, demotimelocal;
const char *ip, *master, *logident, *serverpassword, *adminpasswd, *demopath, *maprot, *pwdfile, *blfile, *nbfile, *infopath, *motdpath, *forbidden, *demofilenameformat, *demotimestampformat;
int uprate, serverport, syslogfacility, filethres, syslogthres, maxdemos, maxclients, kickthreshold, banthreshold, verbose, incoming_limit, afk_limit, ban_time;
const char *ip, *master, *logident, *serverpassword, *adminpasswd, *demopath, *maprotfile, *pwdfile, *blfile, *geoipfile, *nbfile, *infopath, *motdpath, *forbidden, *service, *logfilepath, *parfilepath, *ssk, *vitabasename;
bool logtimestamp, demo_interm, loggamestatus;
string motd, servdesc_full, servdesc_pre, servdesc_suf, voteperm, mapperm;
int clfilenesting;
vector<const char *> adminonlymaps;
vector<const char *> adminonlymaps; // FIXME: remove this
servercommandline() : uprate(0), serverport(CUBE_DEFAULT_SERVER_PORT), syslogfacility(6), filethres(-1), syslogthres(-1), maxdemos(5),
maxclients(DEFAULTCLIENTS), kickthreshold(-5), banthreshold(-6), verbose(0), incoming_limit(10), afk_limit(45000), ban_time(20*60*1000), demotimelocal(0),
ip(""), master(NULL), logident(""), serverpassword(""), adminpasswd(""), demopath(""),
maprot("config/maprot.cfg"), pwdfile("config/serverpwd.cfg"), blfile("config/serverblacklist.cfg"), nbfile("config/nicknameblacklist.cfg"),
infopath("config/serverinfo"), motdpath("config/motd"), forbidden("config/forbidden.cfg"),
servercommandline() : uprate(0), serverport(CUBE_DEFAULT_SERVER_PORT), syslogfacility(6), filethres(-1), syslogthres(-1), maxdemos(-1),
maxclients(DEFAULTCLIENTS), kickthreshold(-5), banthreshold(-6), verbose(0), incoming_limit(10), afk_limit(45000), ban_time(20*60*1000),
ip(""), master(NULL), logident(""), serverpassword(""), adminpasswd(""), demopath(NULL),
maprotfile("config/maprot.cfg"), pwdfile("config/serverpwd.cfg"), blfile("config/serverblacklist.cfg"), geoipfile("config/geoip.cfg"), nbfile("config/nicknameblacklist.cfg"),
infopath("config/serverinfo"), motdpath("config/motd"), forbidden("config/forbidden.cfg"), service(NULL), logfilepath("logs/"), parfilepath("config/serverparameters.cfg"), ssk(NULL), vitabasename("config/servervita"),
logtimestamp(false), demo_interm(false), loggamestatus(true),
clfilenesting(0)
{
motd[0] = servdesc_full[0] = servdesc_pre[0] = servdesc_suf[0] = voteperm[0] = mapperm[0] = '\0';
demofilenameformat = DEFDEMOFILEFMT;
demotimestampformat = DEFDEMOTIMEFMT;
}
bool checkarg(const char *arg)
@@ -1154,22 +1181,10 @@ struct servercommandline
int ai = atoi(a);
// client: dtwhzbsave
switch(arg[1])
{ // todo: gjlqEGHJQUYZ
{ // todo: gjlqEJQU
case 'Y': ssk = a; break; // private server key
case '-':
if(!strncmp(arg, "--demofilenameformat=", 21))
{
demofilenameformat = arg+21;
}
else if(!strncmp(arg, "--demotimestampformat=", 22))
{
demotimestampformat = arg+22;
}
else if(!strncmp(arg, "--demotimelocal=", 16))
{
int ai = atoi(arg+16);
demotimelocal = ai == 0 ? 0 : 1;
}
else if(!strncmp(arg, "--masterport=", 13))
if(!strncmp(arg, "--masterport=", 13))
{
int ai = atoi(arg+13);
masterport = ai == 0 ? AC_MASTER_PORT : ai;
@@ -1191,7 +1206,9 @@ struct servercommandline
case 'S': syslogthres = atoi(a + 1); break;
}
break;
case 'A': if(*a) adminonlymaps.add(a); break;
case 'H': logfilepath = a; break;
case 'A': parfilepath = a; break;
case 'U': vitabasename = a; break;
case 'c': if(ai > 0) maxclients = min(ai, MAXCLIENTS); break;
case 'k':
{
@@ -1221,9 +1238,10 @@ struct servercommandline
break;
}
case 'W': demopath = a; break;
case 'r': maprot = a; break;
case 'r': maprotfile = a; break;
case 'X': pwdfile = a; break;
case 'B': blfile = a; break;
case 'G': geoipfile = a; break;
case 'K': nbfile = a; break;
case 'I': infopath = a; break;
case 'o': filterrichtext(motd, a); break;
@@ -1244,11 +1262,12 @@ struct servercommandline
case 'P': concatstring(voteperm, a); break;
case 'M': concatstring(mapperm, a); break;
case 'Z': if(ai >= 0) incoming_limit = ai; break;
case 'S': service = a; break;
case 'V': verbose++; break;
case 'C': if(*a && clfilenesting < 3)
{
serverconfigfile cfg;
cfg.init(a);
cfg.init(a, false);
cfg.load();
int line = 1;
clfilenesting++;