diff --git a/source/src/client.cpp b/source/src/client.cpp index c8155aa5..2a101c65 100644 --- a/source/src/client.cpp +++ b/source/src/client.cpp @@ -80,7 +80,7 @@ void newteam(char *name) { if(m_teammode) { - if(!strcmp(name, player1->team)) { conoutf("\f3you are already a member of team \"%s\"", name); return; }; + if(!strcmp(name, player1->team)) return; // same team if(!team_valid(name)) { conoutf("\f3\"%s\" is not a valid team name (try CLA or RVSF)", name); return; }; bool checkteamsize = autoteambalance && players.length() >= 1; diff --git a/source/src/clientgame.cpp b/source/src/clientgame.cpp index 9d93ef98..f60f2b51 100644 --- a/source/src/clientgame.cpp +++ b/source/src/clientgame.cpp @@ -685,12 +685,14 @@ void kick(int player) { mastercommand(MCMD_KICK, player); }; void ban(int player) { mastercommand(MCMD_BAN, player); }; void removebans() { mastercommand(MCMD_REMBANS, 0); }; void autoteam(int enable) { mastercommand(MCMD_AUTOTEAM, enable); }; +void mastermode(int mode) { mastercommand(MCMD_MASTERMODE, mode); }; COMMAND(setmaster, ARG_2STR); COMMAND(kick, ARG_1INT); COMMAND(ban, ARG_1INT); COMMAND(removebans, ARG_NONE); COMMAND(autoteam, ARG_1INT); +COMMAND(mastermode, ARG_1INT); struct mline { string cmd; }; static vector mlines; diff --git a/source/src/clients2c.cpp b/source/src/clients2c.cpp index 27cb6f20..47b22bd9 100644 --- a/source/src/clients2c.cpp +++ b/source/src/clients2c.cpp @@ -460,7 +460,9 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) case SV_MASTERINFO: { - loopv(players) { players[i]->ismaster = false; } + loopv(players) { if(players[i]) players[i]->ismaster = false; } + player1->ismaster = false; + int m = getint(p); if(m != -1) { @@ -491,7 +493,12 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) break; case MCMD_MASTERMODE: - conoutf("mastermode set to %i", arg); + conoutf("mastermode set to \"%s\"", arg ? "private" : "open"); + break; + + case MCMD_AUTOTEAM: + autoteambalance = getint(p) == 1; + if(!joining) conoutf("autoteam is %s", autoteambalance ? "enabled" : "disabled"); break; }; break; @@ -504,12 +511,6 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) break; }; - case SV_AUTOTEAM: - { - conoutf("autoteam is %s", (autoteambalance = getint(p) == 1) ? "enabled" : "disabled"); - break; - }; - /* demo recording compat */ case SV_PING: getint(p); diff --git a/source/src/server.cpp b/source/src/server.cpp index cc542fa9..7e4eebbe 100644 --- a/source/src/server.cpp +++ b/source/src/server.cpp @@ -375,8 +375,7 @@ char *disc_reasons[] = { "normal", "end of packet", "client num", "kicked by mas void disconnect_client(int n, int reason = -1) { if(!clients.inrange(n) || clients[n]->type!=ST_TCPIP) return; - if(m_ctf) loopi(2) if(ctfflags[i].state==CTFF_STOLEN && ctfflags[i].actor_cn==n) - flagaction(i, SV_FLAGDROP, -1); + if(m_ctf) loopi(2) if(ctfflags[i].state==CTFF_STOLEN && ctfflags[i].actor_cn==n) flagaction(i, SV_FLAGDROP, -1); client &c = *clients[n]; clientscore *sc = findscore(c, true); if(sc) *sc = c.score; @@ -579,7 +578,7 @@ void setmaster(int client, bool claim, char *pwd = NULL) int curmaster = master(); if((curmaster == -1 || curmaster == client) || (pwd && pwd[0] && masterpasswd && !strcmp(masterpasswd, pwd))) { - if(claim) loopv(clients) if(clients[i]->type!=ST_EMPTY) clients[i]->ismaster = false; + loopv(clients) if(clients[i]->type!=ST_EMPTY) clients[i]->ismaster = false; clients[client]->ismaster = claim; sendmasterinfo(-1); } @@ -589,20 +588,20 @@ void setmaster(int client, bool claim, char *pwd = NULL) }; }; -bool mastercmd(int sender, int cmd, int a) +void mastercmd(int sender, int cmd, int a) { - if(!isdedicated || clients[sender]->ismaster==false) return false; + if(!isdedicated || clients[sender]->ismaster==false) return; switch(cmd) { case MCMD_KICK: { - if(!valid_client(a)) return false; + if(!valid_client(a)) return; disconnect_client(a, DISC_MKICK); break; }; case MCMD_BAN: { - if(!valid_client(a)) return false; + if(!valid_client(a)) return; ban b = { clients[a]->peer->address, lastsec+20*60 }; bans.add(b); disconnect_client(a, DISC_MBAN); @@ -615,19 +614,18 @@ bool mastercmd(int sender, int cmd, int a) }; case MCMD_MASTERMODE: { - if(a < 0 || a >= MM_NUM) return false; + if(a < 0 || a >= MM_NUM) return; mastermode = a; break; }; case MCMD_AUTOTEAM: { - if(a < 0 || a > 1) return false; + if(a < 0 || a > 1) return; if((autoteam = a != 0) == 1 && m_teammode) shuffleteams(); - sendf(-1, 1, "rii", SV_AUTOTEAM, a); break; }; }; - return true; + sendf(-1, 1, "riii", SV_MASTERCMD, cmd, a); }; int checktype(int type, client *cl) @@ -813,7 +811,8 @@ void process(ENetPacket *packet, int sender, int chan) // sender may be -1 { int cmd = getint(p); int arg = getint(p); - if(mastercmd(sender, cmd, arg) && cmd != MCMD_AUTOTEAM) QUEUE_MSG; + //mastercmd(sender, cmd, arg) && cmd != MCMD_AUTOTEAM) QUEUE_MSG; + mastercmd(sender, cmd, arg); break; }; @@ -879,7 +878,8 @@ void send_welcome(int n) putint(p, SV_FORCETEAM); putint(p, freeteam()); }; - putint(p, SV_AUTOTEAM); + putint(p, SV_MASTERCMD); + putint(p, MCMD_AUTOTEAM); putint(p, autoteam); enet_packet_resize(packet, p.length()); sendpacket(n, 1, packet); diff --git a/source/vcpp/cube.suo b/source/vcpp/cube.suo index 5d892955..fc18de85 100644 Binary files a/source/vcpp/cube.suo and b/source/vcpp/cube.suo differ