diff --git a/source/src/client.cpp b/source/src/client.cpp index c4328d30..91623a98 100644 --- a/source/src/client.cpp +++ b/source/src/client.cpp @@ -8,7 +8,6 @@ VAR(connected, 1, 0, 0); ENetHost *clienthost = NULL; ENetPeer *curpeer = NULL, *connpeer = NULL; int connmillis = 0, connattempts = 0, discmillis = 0; -bool c2sinit = false; // whether we need to tell the other clients our stats bool watchingdemo = false; int getclientnum() { return player1 ? player1->clientnum : -1; } @@ -177,7 +176,6 @@ void disconnect(int onlyclean, int async) if(cleanup) { - c2sinit = false; player1->clientnum = -1; player1->lifesequence = 0; player1->clientrole = CR_DEFAULT; @@ -413,19 +411,10 @@ void c2sinfo(playerent *d) // send update to the server sendpackettoserv(0, q.finalize()); } - if(sendmapidenttoserver || !c2sinit || messages.length() || totalmillis-lastping>250) + if(sendmapidenttoserver || messages.length() || totalmillis-lastping>250) { packetbuf p(MAXTRANS); - if(!c2sinit) // tell other clients who I am - { - p.reliable(); - c2sinit = true; - putint(p, SV_INITC2S); - sendstring(player1->name, p); - putint(p, player1->skin(TEAM_CLA)); - putint(p, player1->skin(TEAM_RVSF)); - } if(sendmapidenttoserver) { // new map spawnallitems(); @@ -485,6 +474,7 @@ void sendintro() clientpassword[0] = '\0'; connectrole = CR_DEFAULT; putint(p, player1->nextprimweap->type); + loopi(2) putint(p, player1->skin(i)); sendpackettoserv(1, p.finalize()); } diff --git a/source/src/clientgame.cpp b/source/src/clientgame.cpp index e6ec057b..44a24dcd 100644 --- a/source/src/clientgame.cpp +++ b/source/src/clientgame.cpp @@ -33,12 +33,11 @@ char *getclientmap() { return clientmap; } int getclientmode() { return gamemode; } -extern bool c2sinit, sendmapidenttoserver; +extern bool sendmapidenttoserver; void setskin(playerent *pl, int skin, int team) { if(!pl) return; - if(pl == player1) c2sinit = false; pl->setskin(team, skin); } @@ -160,10 +159,10 @@ void newname(const char *name) { if(name[0]) { - c2sinit = false; filtertext(player1->name, name, 0, MAXNAMELEN); if(!player1->name[0]) copystring(player1->name, "unarmed"); updateclientname(player1); + addmsg(SV_SWITCHNAME, "rs", player1->name); } else conoutf(_("your name is: %s"), player1->name); alias(_("curname"), player1->name); @@ -185,7 +184,7 @@ void newteam(char *name) if(nt == player1->team) return; // same team if(!team_isvalid(nt)) { conoutf(_("\f3\"%s\" is not a valid team name (try CLA, RVSF or SPECTATOR)"), name); return; } if(team_isspect(nt) && player1->state != CS_DEAD) { conoutf(_("you need to be dead to become spectator")); return; } - addmsg(SV_TRYTEAM, "ri", nt); + addmsg(SV_SWITCHTEAM, "ri", nt); } else conoutf(_("your team is: %s"), team_string(player1->team)); } @@ -193,12 +192,16 @@ void newteam(char *name) void benchme() { if(team_isactive(player1->team) && servstate.mastermode == MM_MATCH) - addmsg(SV_TRYTEAM, "ri", team_tospec(player1->team)); + addmsg(SV_SWITCHTEAM, "ri", team_tospec(player1->team)); } int _setskin(char *s, int t) { - if(s && *s) setskin(player1, atoi(s), t); + if(s && *s) + { + setskin(player1, atoi(s), t); + addmsg(SV_SWITCHSKIN, "rii", player1->skin(0), player1->skin(1)); + } return player1->skin(t); } diff --git a/source/src/clients2c.cpp b/source/src/clients2c.cpp index b6e502c0..faf80a34 100644 --- a/source/src/clients2c.cpp +++ b/source/src/clients2c.cpp @@ -6,7 +6,7 @@ VARP(networkdebug, 0, 0, 1); #define DEBUGCOND (networkdebug==1) -extern bool c2sinit, watchingdemo; +extern bool watchingdemo; extern string clientpassword; packetqueue pktlogger; @@ -235,7 +235,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) switch(type) { - case SV_INITS2C: // welcome messsage from the server + case SV_SERVINFO: // welcome messsage from the server { int mycn = getint(p), prot = getint(p); if(prot!=CUR_PROTOCOL_VERSION && !(watchingdemo && prot == -PROTOCOL_VERSION)) @@ -345,9 +345,42 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) break; } - case SV_INITC2S: // another client either connected or changed name/team + case SV_SWITCHNAME: + getstring(text, p); + filtertext(text, text, 0, MAXNAMELEN); + if(!text[0]) copystring(text, "unarmed"); + if(d) + { + if(strcmp(d->name, text)) + conoutf(_("%s is now known as %s"), colorname(d), colorname(d, text)); + copystring(d->name, text, MAXNAMELEN+1); + updateclientname(d); + } + break; + + case SV_SWITCHTEAM: + getint(p); + break; + + case SV_SWITCHSKIN: + loopi(2) + { + int skin = getint(p); + if(d) d->setskin(i, skin); + } + break; + + case SV_INITCLIENT: // another client either connected or changed name/team { - d = newclient(cn); + int cn = getint(p); + playerent *d = newclient(cn); + if(!d) + { + getstring(text, p); + loopi(2) getint(p); + getint(p); + break; + } getstring(text, p); filtertext(text, text, 0, MAXNAMELEN); if(!text[0]) copystring(text, "unarmed"); @@ -358,12 +391,11 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) } else // new client { - c2sinit = false; // send new players my info again conoutf(_("connected: %s"), colorname(d, text)); } copystring(d->name, text, MAXNAMELEN+1); - d->setskin(TEAM_CLA, getint(p)); - d->setskin(TEAM_RVSF, getint(p)); + loopi(2) d->setskin(i, getint(p)); + d->team = getint(p); if(m_flags) loopi(2) { flaginfo &f = flaginfos[i]; diff --git a/source/src/protocol.cpp b/source/src/protocol.cpp index 0faff1d0..04767794 100644 --- a/source/src/protocol.cpp +++ b/source/src/protocol.cpp @@ -315,9 +315,9 @@ const char *modestr(int n, bool acronyms) { return acronyms ? acronymmodestr (n) const char *voteerrorstr(int n) { return (n>=0 && (size_t)n < sizeof(voteerrors)/sizeof(voteerrors[0])) ? voteerrors[n] : "unknown"; } const char *mmfullname(int n) { return (n>=0 && n < MM_NUM) ? mmfullnames[n] : "unknown"; } -char msgsizesl[] = // size inclusive message token, 0 for variable or not-checked sizes +static const int msgsizes[] = // size inclusive message token, 0 for variable or not-checked sizes { - SV_INITS2C, 5, SV_WELCOME, 2, SV_INITC2S, 0, SV_POS, 0, SV_POSC, 0, SV_POSN, 0, SV_TEXT, 0, SV_TEAMTEXT, 0, SV_TEXTME, 0, SV_TEAMTEXTME, 0, + SV_SERVINFO, 5, SV_WELCOME, 2, SV_INITCLIENT, 0, SV_POS, 0, SV_POSC, 0, SV_POSN, 0, SV_TEXT, 0, SV_TEAMTEXT, 0, SV_TEXTME, 0, SV_TEAMTEXTME, 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_SCOPE, 3, SV_GIBDIED, 4, SV_DIED, 4, SV_GIBDAMAGE, 6, SV_DAMAGE, 6, SV_HITPUSH, 6, SV_SHOTFX, 9, SV_THROWNADE, 8, @@ -332,20 +332,26 @@ char msgsizesl[] = // size inclusive message token, 0 for variable SV_ARENAWIN, 2, SV_LMSITEM, 3, SV_SETADMIN, 0, SV_SERVOPINFO, 3, SV_CALLVOTE, 0, SV_CALLVOTESUC, 1, SV_CALLVOTEERR, 2, SV_VOTE, 2, SV_VOTERESULT, 2, - SV_TRYTEAM, 2, SV_SETTEAM, 3, SV_TEAMDENY, 2, SV_SERVERMODE, 2, + SV_SETTEAM, 3, SV_TEAMDENY, 2, SV_SERVERMODE, 2, SV_WHOIS, 2, SV_WHOISINFO, 3, SV_LISTDEMOS, 1, SV_SENDDEMOLIST, 0, SV_GETDEMO, 2, SV_SENDDEMO, 0, SV_DEMOPLAYBACK, 3, SV_CONNECT, 0, SV_SPECTCN, 2, + SV_SWITCHNAME, 0, SV_SWITCHSKIN, 0, SV_SWITCHTEAM, 0, SV_CLIENT, 0, SV_EXTENSION, 0, SV_MAPIDENT, 3, -1 }; -char msgsizelookup(int msg) +int msgsizelookup(int msg) { - for(char *p = msgsizesl; *p>=0; p += 2) if(*p==msg) return p[1]; - return -1; + static int sizetable[SV_NUM] = { -1 }; + if(sizetable[0] < 0) + { + memset(sizetable, -1, sizeof(sizetable)); + for(const int *p = msgsizes; *p >= 0; p += 2) sizetable[p[0]] = p[1]; + } + return msg >= 0 && msg < SV_NUM ? sizetable[msg] : -1; } const char *genpwdhash(const char *name, const char *pwd, int salt) diff --git a/source/src/protocol.h b/source/src/protocol.h index b74b0b87..95eccad4 100644 --- a/source/src/protocol.h +++ b/source/src/protocol.h @@ -18,7 +18,7 @@ extern bool modprotocol; // network messages codes, c2s, c2c, s2c enum { - SV_INITS2C = 0, SV_WELCOME, SV_INITC2S, SV_POS, SV_POSC, SV_POSN, SV_TEXT, SV_TEAMTEXT, SV_TEXTME, SV_TEAMTEXTME, + SV_SERVINFO = 0, SV_WELCOME, SV_INITCLIENT, SV_POS, SV_POSC, SV_POSN, SV_TEXT, SV_TEAMTEXT, SV_TEXTME, SV_TEAMTEXTME, SV_SOUND, SV_VOICECOM, SV_VOICECOMTEAM, SV_CDIS, SV_SHOOT, SV_EXPLODE, SV_SUICIDE, SV_AKIMBO, SV_RELOAD, SV_SCOPE, SV_GIBDIED, SV_DIED, SV_GIBDAMAGE, SV_DAMAGE, SV_HITPUSH, SV_SHOTFX, SV_THROWNADE, @@ -33,10 +33,11 @@ enum SV_ARENAWIN, SV_LMSITEM, SV_SETADMIN, SV_SERVOPINFO, SV_CALLVOTE, SV_CALLVOTESUC, SV_CALLVOTEERR, SV_VOTE, SV_VOTERESULT, - SV_TRYTEAM, SV_SETTEAM, SV_TEAMDENY, SV_SERVERMODE, + SV_SETTEAM, SV_TEAMDENY, SV_SERVERMODE, SV_WHOIS, SV_WHOISINFO, SV_LISTDEMOS, SV_SENDDEMOLIST, SV_GETDEMO, SV_SENDDEMO, SV_DEMOPLAYBACK, SV_CONNECT, SV_SPECTCN, + SV_SWITCHNAME, SV_SWITCHSKIN, SV_SWITCHTEAM, SV_CLIENT, SV_EXTENSION, SV_MAPIDENT, SV_NUM diff --git a/source/src/protos.h b/source/src/protos.h index c07de981..8618c447 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -728,7 +728,7 @@ extern void startintermission(); extern void restoreserverstate(vector &ents); extern uchar *retrieveservers(uchar *buf, int buflen); 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 char msgsizelookup(int msg); +extern int msgsizelookup(int msg); 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 bool serverpickup(int i, int sender); diff --git a/source/src/server.cpp b/source/src/server.cpp index ff962299..d43e821c 100644 --- a/source/src/server.cpp +++ b/source/src/server.cpp @@ -314,8 +314,7 @@ void sendf(int cn, int chan, const char *format, ...) int exclude = -1; bool reliable = false; if(*format=='r') { reliable = true; ++format; } - ENetPacket *packet = enet_packet_create(NULL, MAXTRANS, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); - ucharbuf p(packet->data, packet->dataLength); + packetbuf p(MAXTRANS, reliable ? ENET_PACKET_FLAG_RELIABLE : 0); va_list args; va_start(args, format); while(*format) switch(*format++) @@ -342,17 +341,12 @@ void sendf(int cn, int chan, const char *format, ...) case 'm': { int n = va_arg(args, int); - enet_packet_resize(packet, packet->dataLength+n); - p.buf = packet->data; - p.maxlen += n; p.put(va_arg(args, uchar *), n); break; } } va_end(args); - enet_packet_resize(packet, p.length()); - sendpacket(cn, chan, packet, exclude); - if(packet->referenceCount==0) enet_packet_destroy(packet); + sendpacket(cn, chan, p.finalize(), exclude); } void sendservmsg(const char *msg, int client=-1) @@ -501,45 +495,15 @@ void setupdemorecord() packetbuf p(MAXTRANS, ENET_PACKET_FLAG_RELIABLE); welcomepacket(p, -1); writedemo(1, p.buf, p.len); - - uchar buf[MAXTRANS]; - loopv(clients) - { - client *ci = clients[i]; - if(ci->type==ST_EMPTY) continue; - - uchar header[16]; - ucharbuf q(&buf[sizeof(header)], sizeof(buf)-sizeof(header)); - putint(q, SV_INITC2S); - sendstring(ci->name, q); - putint(q, ci->skin[TEAM_CLA]); - putint(q, ci->skin[TEAM_RVSF]); - putint(q, SV_SETTEAM); - putint(q, ci->clientnum); - putint(q, ci->team | (FTR_INFO << 4)); - - ucharbuf h(header, sizeof(header)); - putint(h, SV_CLIENT); - putint(h, ci->clientnum); - putuint(h, q.len); - - memcpy(&buf[sizeof(header)-h.len], header, h.len); - - writedemo(1, &buf[sizeof(header)-h.len], h.len+q.len); - } } void listdemos(int cn) { - ENetPacket *packet = enet_packet_create(NULL, MAXTRANS, ENET_PACKET_FLAG_RELIABLE); - if(!packet) return; - ucharbuf p(packet->data, packet->dataLength); + packetbuf p(MAXTRANS, ENET_PACKET_FLAG_RELIABLE); putint(p, SV_SENDDEMOLIST); putint(p, demofiles.length()); loopv(demofiles) sendstring(demofiles[i].info, p); - enet_packet_resize(packet, p.length()); - sendpacket(cn, 1, packet); - if(!packet->referenceCount) enet_packet_destroy(packet); + sendpacket(cn, 1, p.finalize()); } static void cleardemos(int n) @@ -573,15 +537,12 @@ void senddemo(int cn, int num) return; } demofile &d = demofiles[num-1]; - ENetPacket *packet = enet_packet_create(NULL, MAXTRANS + d.len, ENET_PACKET_FLAG_RELIABLE); - ucharbuf p(packet->data, packet->dataLength); + packetbuf p(MAXTRANS + d.len, ENET_PACKET_FLAG_RELIABLE); putint(p, SV_SENDDEMO); sendstring(d.file, p); putint(p, d.len); p.put(d.data, d.len); - enet_packet_resize(packet, p.length()); - sendpacket(cn, 2, packet); - if(!packet->referenceCount) enet_packet_destroy(packet); + sendpacket(cn, 2, p.finalize()); } void enddemoplayback() @@ -1907,8 +1868,7 @@ void changeclientrole(int client, int role, char *pwd, bool force) void senddisconnectedscores(int cn) { - ENetPacket *packet = enet_packet_create(NULL, MAXTRANS, ENET_PACKET_FLAG_RELIABLE); - ucharbuf p(packet->data, packet->dataLength); + packetbuf p(MAXTRANS, ENET_PACKET_FLAG_RELIABLE); putint(p, SV_DISCSCORES); if(mastermode == MM_MATCH) { @@ -1926,9 +1886,7 @@ void senddisconnectedscores(int cn) } } putint(p, -1); - enet_packet_resize(packet, p.length()); - sendpacket(cn, 1, packet); - if(!packet->referenceCount) enet_packet_destroy(packet); + sendpacket(cn, 1, p.finalize()); } const char *disc_reason(int reason) @@ -1992,9 +1950,49 @@ void sendresume(client &c, bool broadcast) -1); } -void sendinits2c(client &c) +bool restorescore(client &c) { - sendf(c.clientnum, 1, "ri5", SV_INITS2C, c.clientnum, isdedicated ? SERVER_PROTOCOL_VERSION : PROTOCOL_VERSION, c.salt, scl.serverpassword[0] ? 1 : 0); + //if(ci->local) return false; + savedscore *sc = findscore(c, false); + if(sc && sc->valid) + { + sc->restore(c.state); + sc->valid = false; + return true; + } + return false; +} + +void sendservinfo(client &c) +{ + sendf(c.clientnum, 1, "ri5", SV_SERVINFO, c.clientnum, isdedicated ? SERVER_PROTOCOL_VERSION : PROTOCOL_VERSION, c.salt, scl.serverpassword[0] ? 1 : 0); +} + +void putinitclient(client &c, packetbuf &p) +{ + putint(p, SV_INITCLIENT); + putint(p, c.clientnum); + sendstring(c.name, p); + putint(p, c.skin[TEAM_CLA]); + putint(p, c.skin[TEAM_RVSF]); + putint(p, c.team); +} + +void sendinitclient(client &c) +{ + packetbuf p(MAXTRANS, ENET_PACKET_FLAG_RELIABLE); + putinitclient(c, p); + sendpacket(-1, 1, p.finalize(), c.clientnum); +} + +void welcomeinitclient(packetbuf &p, int exclude = -1) +{ + loopv(clients) + { + client &c = *clients[i]; + if(c.type!=ST_TCPIP || !c.isauthed || c.clientnum == exclude) continue; + putinitclient(c, p); + } } void welcomepacket(packetbuf &p, int n) @@ -2027,33 +2025,25 @@ void welcomepacket(packetbuf &p, int n) if(m_flags) loopi(2) putflaginfo(p, i); } savedscore *sc = NULL; - bool restored = false; if(c) { if(c->type == ST_TCPIP && serveroperator() != -1) sendserveropinfo(n); - sc = findscore(*c, false); c->team = mastermode == MM_MATCH && sc ? team_tospec(sc->team) : TEAM_SPECT; putint(p, SV_SETTEAM); putint(p, n); putint(p, c->team | (FTR_INFO << 4)); - if(sc && sc->valid) - { - sc->restore(c->state); - sc->valid = false; - restored = true; - } putint(p, SV_FORCEDEATH); putint(p, n); sendf(-1, 1, "ri2x", SV_FORCEDEATH, n, n); } - if(clients.length()>1 || restored) + if(!c || clients.length()>1) { putint(p, SV_RESUME); loopv(clients) { client &c = *clients[i]; - if(c.type!=ST_TCPIP || (c.clientnum==n && !restored)) continue; + if(c.type!=ST_TCPIP || c.clientnum==n) continue; putint(p, c.clientnum); putint(p, c.state.state); putint(p, c.state.lifesequence); @@ -2068,6 +2058,7 @@ void welcomepacket(packetbuf &p, int n) loopi(NUMGUNS) putint(p, c.state.mag[i]); } putint(p, -1); + welcomeinitclient(p, n); } putint(p, SV_SERVERMODE); putint(p, sendservermode(false)); @@ -2114,7 +2105,7 @@ int checktype(int type, client *cl) if(cl && cl->type==ST_LOCAL) return type; if(type < 0 || type >= SV_NUM) return -1; // server only messages - static int servtypes[] = { SV_INITS2C, SV_WELCOME, SV_POSN, SV_CDIS, SV_GIBDIED, SV_DIED, + 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_SPAWNSTATE, SV_SPAWNDENY, SV_FORCEDEATH, SV_RESUME, SV_DISCSCORES, SV_TIMEUP, SV_ITEMACC, SV_MAPCHANGE, SV_ITEMSPAWN, SV_PONG, @@ -2168,6 +2159,7 @@ void process(ENetPacket *packet, int sender, int chan) filterlang(cl->lang, text); int wantrole = getint(p); cl->state.nextprimary = getint(p); + loopi(2) cl->skin[i] = getint(p); bool banned = isbanned(sender); bool srvfull = numnonlocalclients() > scl.maxclients; bool srvprivate = mastermode == MM_PRIVATE || mastermode == MM_MATCH; @@ -2239,8 +2231,9 @@ void process(ENetPacket *packet, int sender, int chan) } sendwelcome(cl); - if(findscore(*cl, false)) { sendresume(*cl, true); senddisconnectedscores(-1); } + if(restorescore(*cl)) { sendresume(*cl, true); senddisconnectedscores(-1); } else if(cl->type==ST_TCPIP) senddisconnectedscores(sender); + sendinitclient(*cl); if(clientrole != CR_DEFAULT) changeclientrole(sender, clientrole, NULL, true); } @@ -2346,49 +2339,6 @@ void process(ENetPacket *packet, int sender, int chan) sendvoicecomteam(getint(p), sender); break; - case SV_INITC2S: - { - QUEUE_MSG; - getstring(text, p); - filtertext(text, text, 0, MAXNAMELEN); - if(!text[0]) copystring(text, "unarmed"); - QUEUE_STR(text); - bool namechanged = strcmp(cl->name, text) != 0; - if(namechanged) logline(ACLOG_INFO,"[%s] %s changed name to %s", cl->hostname, cl->name, text); - copystring(cl->name, text, MAXNAMELEN+1); - cl->skin[TEAM_CLA] = getint(p); - cl->skin[TEAM_RVSF] = getint(p); - QUEUE_MSG; - if(namechanged) - { - switch(nickblacklist.checkwhitelist(*cl)) - { - case NWL_PWDFAIL: - case NWL_IPFAIL: - logline(ACLOG_INFO, "[%s] '%s' matches nickname whitelist: wrong IP/PWD", cl->hostname, cl->name); - disconnect_client(sender, DISC_BADNICK); - break; - - case NWL_UNLISTED: - { - int l = nickblacklist.checkblacklist(cl->name); - if(l >= 0) - { - logline(ACLOG_INFO, "[%s] '%s' matches nickname blacklist line %d", cl->hostname, cl->name, l); - disconnect_client(sender, DISC_BADNICK); - } - break; - } - } - } - QUEUE_BUF( - putint(cl->messages, SV_SETTEAM); - putint(cl->messages, sender); - putint(cl->messages, cl->team | (FTR_INFO << 4)) - ); - break; - } - case SV_MAPIDENT: { int gzs = getint(p); @@ -2456,13 +2406,55 @@ void process(ENetPacket *packet, int sender, int chan) break; } - case SV_TRYTEAM: + case SV_SWITCHNAME: + { + QUEUE_MSG; + getstring(text, p); + filtertext(text, text, 0, MAXNAMELEN); + if(!text[0]) copystring(text, "unarmed"); + QUEUE_STR(text); + bool namechanged = strcmp(cl->name, text) != 0; + if(namechanged) logline(ACLOG_INFO,"[%s] %s changed name to %s", cl->hostname, cl->name, text); + copystring(cl->name, text, MAXNAMELEN+1); + if(namechanged) + { + switch(nickblacklist.checkwhitelist(*cl)) + { + case NWL_PWDFAIL: + case NWL_IPFAIL: + logline(ACLOG_INFO, "[%s] '%s' matches nickname whitelist: wrong IP/PWD", cl->hostname, cl->name); + disconnect_client(sender, DISC_BADNICK); + break; + + case NWL_UNLISTED: + { + int l = nickblacklist.checkblacklist(cl->name); + if(l >= 0) + { + logline(ACLOG_INFO, "[%s] '%s' matches nickname blacklist line %d", cl->hostname, cl->name, l); + disconnect_client(sender, DISC_BADNICK); + } + break; + } + } + } + break; + } + + case SV_SWITCHTEAM: { int t = getint(p); if(!updateclientteam(sender, team_isvalid(t) ? t : TEAM_SPECT, FTR_PLAYERWISH)) sendf(sender, 1, "rii", SV_TEAMDENY, t); break; } + case SV_SWITCHSKIN: + { + loopi(2) cl->skin[i] = getint(p); + QUEUE_MSG; + break; + } + case SV_TRYSPAWN: if(team_isspect(cl->team) && canspawn(cl) < SP_OK_NUM) { @@ -3237,7 +3229,7 @@ void serverslice(uint timeout) // main server update, called from cube main lo char hn[1024]; copystring(c.hostname, (enet_address_get_host_ip(&c.peer->address, hn, sizeof(hn))==0) ? hn : "unknown"); logline(ACLOG_INFO,"[%s] client connected", c.hostname); - sendinits2c(c); + sendservinfo(c); break; } @@ -3419,7 +3411,7 @@ void localconnect() c.type = ST_LOCAL; c.role = CR_ADMIN; copystring(c.hostname, "local"); - sendinits2c(c); + sendservinfo(c); } #endif diff --git a/source/src/server.h b/source/src/server.h index c2be5a4f..96360404 100644 --- a/source/src/server.h +++ b/source/src/server.h @@ -336,7 +336,7 @@ extern char *maplayout; const char *messagenames[SV_NUM] = { - "SV_INITS2C", "SV_WELCOME", "SV_INITC2S", "SV_POS", "SV_POSC", "SV_POSN", "SV_TEXT", "SV_TEAMTEXT", "SV_TEXTME", "SV_TEAMTEXTME", + "SV_SERVINFO", "SV_WELCOME", "SV_INITCLIENT", "SV_POS", "SV_POSC", "SV_POSN", "SV_TEXT", "SV_TEAMTEXT", "SV_TEXTME", "SV_TEAMTEXTME", "SV_SOUND", "SV_VOICECOM", "SV_VOICECOMTEAM", "SV_CDIS", "SV_SHOOT", "SV_EXPLODE", "SV_SUICIDE", "SV_AKIMBO", "SV_RELOAD", "SV_SCOPE", "SV_GIBDIED", "SV_DIED", "SV_GIBDAMAGE", "SV_DAMAGE", "SV_HITPUSH", "SV_SHOTFX", "SV_THROWNADE", @@ -351,10 +351,11 @@ const char *messagenames[SV_NUM] = "SV_ARENAWIN", "SV_LMSITEM", "SV_SETADMIN", "SV_SERVOPINFO", "SV_CALLVOTE", "SV_CALLVOTESUC", "SV_CALLVOTEERR", "SV_VOTE", "SV_VOTERESULT", - "SV_TRYTEAM", "SV_SETTEAM", "SV_TEAMDENY", "SV_SERVERMODE", + "SV_SETTEAM", "SV_TEAMDENY", "SV_SERVERMODE", "SV_WHOIS", "SV_WHOISINFO", "SV_LISTDEMOS", "SV_SENDDEMOLIST", "SV_GETDEMO", "SV_SENDDEMO", "SV_DEMOPLAYBACK", "SV_CONNECT", "SV_SPECTCN", + "SV_SWITCHNAME", "SV_SWITCHSKIN", "SV_SWITCHTEAM", "SV_CLIENT", "SV_EXTENSION", "SV_MAPIDENT"