X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fclientcommands.qc;h=f89d383631c453c35f2d64ee2fd0d82528d56a6e;hb=979f3b4688685a32b22bc1efc9ecf2eeaeeca61e;hp=adaf36f16415dc860c2b746dfc5d42074e98a856;hpb=e274360bc96e7bdb2f2c139c7eeb1763ecc086c6;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/clientcommands.qc b/qcsrc/server/clientcommands.qc index adaf36f16..f89d38363 100644 --- a/qcsrc/server/clientcommands.qc +++ b/qcsrc/server/clientcommands.qc @@ -1,11 +1,22 @@ entity nagger; float readycount; + float Nagger_SendEntity(entity to, float sendflags) { float nags, i, f, b; entity e; WriteByte(MSG_ENTITY, ENT_CLIENT_NAGGER); + // bits: + // 1 = ready + // 2 = player needs to ready up + // 4 = vote + // 8 = player needs to vote + // 16 = warmup + // sendflags: + // 64 = vote counts + // 128 = vote string + nags = 0; if(readycount) { @@ -22,16 +33,28 @@ float Nagger_SendEntity(entity to, float sendflags) if(inWarmupStage) nags |= 16; + if(sendflags & 64) + nags |= 64; + if(sendflags & 128) nags |= 128; + if(!(nags & 4)) // no vote called? send no string + nags &~= (64 | 128); + WriteByte(MSG_ENTITY, nags); - if(nags & 128) + if(nags & 64) { - WriteString(MSG_ENTITY, votecalledvote_display); + WriteByte(MSG_ENTITY, vote_yescount); + WriteByte(MSG_ENTITY, vote_nocount); + WriteByte(MSG_ENTITY, vote_needed_absolute); + WriteChar(MSG_ENTITY, to.vote_vote); } + if(nags & 128) + WriteString(MSG_ENTITY, votecalledvote_display); + if(nags & 1) { for(i = 1; i <= maxclients; i += 8) @@ -57,7 +80,7 @@ void Nagger_VoteChanged() void Nagger_VoteCountChanged() { if(nagger) - nagger.SendFlags |= 1; + nagger.SendFlags |= 64; } void Nagger_ReadyCounted() { @@ -120,6 +143,7 @@ float cmd_floodcheck() return FALSE; } +.float checkfail; void SV_ParseClientCommand(string s) { string cmd; float tokens; @@ -128,7 +152,7 @@ void SV_ParseClientCommand(string s) { tokens = tokenize_console(s); - cmd = argv(0); + cmd = strtolower(argv(0)); if(cmd != "reportcvar") if(cmd != "sentcvar") if(cmd != "pause") @@ -144,6 +168,9 @@ void SV_ParseClientCommand(string s) { return; } else if(GameCommand_MapVote(argv(0))) { return; + } else if(cmd == "checkfail") { + print(sprintf("CHECKFAIL: %s (%s) epically failed check %s\n", self.netname, self.netaddress, substring(s, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)))); + self.checkfail = 1; } else if(cmd == "autoswitch") { // be backwards compatible with older clients (enabled) self.autoswitch = ("0" != argv(1)); @@ -170,7 +197,7 @@ void SV_ParseClientCommand(string s) { ClientKill_TeamChange(-2); // observe } else if(autocvar_g_campaign || autocvar_g_balance_teams || autocvar_g_balance_teams_force) { //JoinBestTeam(self, FALSE, TRUE); - } else if(teams_matter && !autocvar_sv_spectate && !(self.team_forced > 0)) { + } else if(teamplay && !autocvar_sv_spectate && !(self.team_forced > 0)) { self.classname = "observer"; stuffcmd(self,"menu_showteamselect\n"); } @@ -212,13 +239,18 @@ void SV_ParseClientCommand(string s) { if(self.classname == "player" && autocvar_sv_spectate == 1) { ClientKill_TeamChange(-2); // observe } + if(g_ca && self.caplayer && (self.classname == "spectator" || self.classname == "observer")) { + // in CA, allow a dead player to move to spectatators (without that, caplayer!=0 will be moved back to the player list) + sprint(self, "WARNING: you will spectate in the next round.\n"); + self.caplayer = 0; + } } else if(cmd == "join") { if not(self.flags & FL_CLIENT) return; if(!g_arena) if (self.classname != "player" && !lockteams) { - if(isJoinAllowed()) { + if(nJoinAllowed(1)) { self.classname = "player"; if(g_ca) self.caplayer = 1; @@ -230,13 +262,13 @@ void SV_ParseClientCommand(string s) { } else { //player may not join because of g_maxplayers is set - centerprint_atprio(self, CENTERPRIO_MAPVOTE, PREVENT_JOIN_TEXT); + centerprint(self, PREVENT_JOIN_TEXT); } } } else if( cmd == "selectteam" ) { if not(self.flags & FL_CLIENT) return; - if( !teams_matter ) { + if( !teamplay ) { sprint( self, "selectteam can only be used in teamgames\n"); } else if(autocvar_g_campaign) { //JoinBestTeam(self, 0); @@ -245,13 +277,25 @@ void SV_ParseClientCommand(string s) { } else if(lockteams) { sprint( self, "^7The game has already begun, you must wait until the next map to be able to join a team.\n"); } else if( argv(1) == "red" ) { - ClientKill_TeamChange(COLOR_TEAM1); + if(self.team != COLOR_TEAM1 || self.deadflag != DEAD_NO) + ClientKill_TeamChange(COLOR_TEAM1); + else + sprint( self, "^7You already are on that team.\n"); } else if( argv(1) == "blue" ) { - ClientKill_TeamChange(COLOR_TEAM2); + if(self.team != COLOR_TEAM2 || self.deadflag != DEAD_NO) + ClientKill_TeamChange(COLOR_TEAM2); + else + sprint( self, "^7You already are on that team.\n"); } else if( argv(1) == "yellow" ) { - ClientKill_TeamChange(COLOR_TEAM3); + if(self.team != COLOR_TEAM3 || self.deadflag != DEAD_NO) + ClientKill_TeamChange(COLOR_TEAM3); + else + sprint( self, "^7You already are on that team.\n"); } else if( argv(1) == "pink" ) { - ClientKill_TeamChange(COLOR_TEAM4); + if(self.team != COLOR_TEAM4 || self.deadflag != DEAD_NO) + ClientKill_TeamChange(COLOR_TEAM4); + else + sprint( self, "^7You already are on that team.\n"); } else if( argv(1) == "auto" ) { ClientKill_TeamChange(-1); } else { @@ -261,7 +305,7 @@ void SV_ParseClientCommand(string s) { if not(self.flags & FL_CLIENT) return; - if((inWarmupStage && 0 >= g_warmup_limit) // with unlimited warmup players have to be able to restart + if((inWarmupStage) || autocvar_sv_ready_restart || g_race_qualifying == 2) { if(!readyrestart_happened || autocvar_sv_ready_restart_repeatable) @@ -358,6 +402,7 @@ void SV_ParseClientCommand(string s) { sprint(self, cvar_purechanges); } else if(CheatCommand(tokens)) { } else { +#if 0 //if(ctf_clientcommand()) // return; // grep for Cmd_AddCommand_WithClientCommand to find them all @@ -383,6 +428,7 @@ void SV_ParseClientCommand(string s) { print("WARNING: Invalid clientcommand by ", self.netname, ": ", s, "\n"); return; } +#endif if(self.jointime > 0 && time > self.jointime + 10 && time > self.nickspamtime) // allow any changes in the first 10 seconds since joining if(cmd == "name" || cmd == "playermodel") // TODO also playerskin and color? @@ -436,7 +482,7 @@ void ReadyRestartForce() readycount = 0; Nagger_ReadyCounted(); // NOTE: this causes a resend of that entity, and will also turn off warmup state on the client - if(autocvar_teamplay_lockonrestart && teams_matter) { + if(autocvar_teamplay_lockonrestart && teamplay) { lockteams = 1; bprint("^1The teams are now locked.\n"); }