diff --git a/source/src/clientgame.cpp b/source/src/clientgame.cpp index 3bcba83d..f13b67bf 100644 --- a/source/src/clientgame.cpp +++ b/source/src/clientgame.cpp @@ -83,13 +83,13 @@ int smallerteam() if(teamsize[0] == teamsize[1]) return -1; return teamsize[0] < teamsize[1] ? 0 : 1; } - -void changeteam(int team, bool forced) // force team and respawn + +void changeteam(int team, bool respawn) // force team and respawn { c2sinit = false; if(m_ctf) tryflagdrop(NULL); filtertext(player1->team, team_string(team), false, MAXTEAMLEN); - if(!forced) deathstate(player1); + if(respawn) spawnplayer(player1); } void newteam(char *name) @@ -636,7 +636,7 @@ votedisplayinfo *newvotedisplayinfo(playerent *owner, int type, char *arg1, char votedisplayinfo *v = new votedisplayinfo(); v->owner = owner; v->type = type; - v->millis = lastmillis + (60+10)*1000; + v->millis = lastmillis + (30+10)*1000; char *msgs[] = { "kick player %s", "ban player %s", "remove all bans", "set mastermode to %s", "%s autoteam", "force player %s to the enemy team", "give master to player %s", "load map %s in mode %s", "%s demo recording for the next match", "stop demo recording", "clear all demos"}; char *msg = msgs[type]; switch(v->type) diff --git a/source/src/clients2c.cpp b/source/src/clients2c.cpp index 7d1f2a31..d8ad78f8 100644 --- a/source/src/clients2c.cpp +++ b/source/src/clients2c.cpp @@ -533,7 +533,9 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) case SV_FORCETEAM: { - changeteam(getint(p), true); + int team = getint(p); + bool respawn = getint(p) == 1; + changeteam(team, respawn); break; } diff --git a/source/src/protos.h b/source/src/protos.h index 1d2522d7..38d65a23 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -160,7 +160,7 @@ extern void c2skeepalive(); extern void neterr(char *s); extern int getclientnum(); extern void changemapserv(char *name, int mode); -extern void changeteam(int team, bool forced = false); +extern void changeteam(int team, bool respawn = true); extern void newteam(char *name); extern bool securemapcheck(char *map); extern void sendintro(); diff --git a/source/src/server.cpp b/source/src/server.cpp index f6bcd64c..2702cf02 100644 --- a/source/src/server.cpp +++ b/source/src/server.cpp @@ -1282,10 +1282,10 @@ void resetvotes() loopv(clients) clients[i]->vote = VOTE_NEUTRAL; } -void forceteam(int client, int team) +void forceteam(int client, int team, bool respawn) { if(!valid_client(client) || team < 0 || team > 1) return; - sendf(client, 1, "rii", SV_FORCETEAM, team); + sendf(client, 1, "riii", SV_FORCETEAM, team, respawn ? 1 : 0); } void shuffleteams() @@ -1296,7 +1296,7 @@ void shuffleteams() { int team = rnd(2); if(teamsize[team] >= numplayers/2) team = team_opposite(team); - forceteam(i, team); + forceteam(i, team, false); teamsize[team]++; } } @@ -1583,6 +1583,7 @@ void welcomepacket(ucharbuf &p, int n) { putint(p, SV_FORCETEAM); putint(p, freeteam()); + putint(p, 0); } if(c && (m_demo || m_mp(smode))) { @@ -1979,6 +1980,9 @@ void process(ENetPacket *packet, int sender, int chan) // sender may be -1 case SA_AUTOTEAM: vi->action = new autoteamaction(getint(p) > 0); break; + case SA_FORCETEAM: + vi->action = new forceteamaction(getint(p)); + break; case SA_GIVEMASTER: vi->action = new givemasteraction(getint(p) > 0); break; diff --git a/source/src/serveractions.h b/source/src/serveractions.h index eade13f8..c73ad21e 100644 --- a/source/src/serveractions.h +++ b/source/src/serveractions.h @@ -32,7 +32,7 @@ struct playeraction : serveraction struct forceteamaction : playeraction { - void perform() { forceteam(cn, team_opposite(team_int(clients[cn]->team))); } + void perform() { forceteam(cn, team_opposite(team_int(clients[cn]->team)), true); } forceteamaction(int cn) : playeraction(cn) { role = CR_MASTER;