X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fcommand%2Fvote.qc;h=252ab2f852cbf45647ea9b8d81a5b402f1fad57c;hp=60faeb3c254c709009966df0ebe13a3b8c725860;hb=bf28c62f9ad2f130024109354c2503457195898d;hpb=18e2cd311a581f77ba8eb9c5421dd219ff5d760d diff --git a/qcsrc/server/command/vote.qc b/qcsrc/server/command/vote.qc index 60faeb3c2..252ab2f85 100644 --- a/qcsrc/server/command/vote.qc +++ b/qcsrc/server/command/vote.qc @@ -1,4 +1,5 @@ -#include "../../common/command/command.qh" +#include "vote.qh" +#include #include "vote.qh" #include "common.qh" @@ -9,13 +10,13 @@ #include "../round_handler.qh" #include "../scores.qh" -#include "../mutators/mutators_include.qh" +#include "../mutators/all.qh" -#include "../../common/constants.qh" -#include "../../common/mapinfo.qh" -#include "../../common/notifications.qh" -#include "../../common/playerstats.qh" -#include "../../common/util.qh" +#include +#include +#include +#include +#include // ============================================= // Server side voting code, reworked by Samual @@ -27,7 +28,7 @@ bool Nagger_SendEntity(entity this, entity to, float sendflags) { int nags, i, f, b; entity e; - WriteByte(MSG_ENTITY, ENT_CLIENT_NAGGER); + WriteHeader(MSG_ENTITY, ENT_CLIENT_NAGGER); // bits: // 1 = ready @@ -40,33 +41,28 @@ bool Nagger_SendEntity(entity this, entity to, float sendflags) // 128 = vote string nags = 0; - if(readycount) + if (readycount) { - nags |= 1; - if(to.ready == 0) - nags |= 2; + nags |= BIT(0); + if (to.ready == 0) nags |= BIT(1); } - if(vote_called) + if (vote_called) { - nags |= 4; - if(to.vote_selection == 0) - nags |= 8; + nags |= BIT(2); + if (to.vote_selection == 0) nags |= BIT(3); } - if(warmup_stage) - nags |= 16; + if (warmup_stage) nags |= BIT(4); - if(sendflags & 64) - nags |= 64; + if (sendflags & BIT(6)) nags |= BIT(6); - if(sendflags & 128) - nags |= 128; + if (sendflags & BIT(7)) nags |= BIT(7); - if(!(nags & 4)) // no vote called? send no string - nags &= ~(64 | 128); + if (!(nags & 4)) // no vote called? send no string + nags &= ~(BIT(6) | BIT(7)); WriteByte(MSG_ENTITY, nags); - if(nags & 64) + if (nags & BIT(6)) { WriteByte(MSG_ENTITY, vote_accept_count); WriteByte(MSG_ENTITY, vote_reject_count); @@ -74,16 +70,14 @@ bool Nagger_SendEntity(entity this, entity to, float sendflags) WriteChar(MSG_ENTITY, to.vote_selection); } - if(nags & 128) - WriteString(MSG_ENTITY, vote_called_display); + if (nags & BIT(7)) WriteString(MSG_ENTITY, vote_called_display); - if(nags & 1) + if (nags & 1) { - for(i = 1; i <= maxclients; i += 8) + for (i = 1; i <= maxclients; i += 8) { - for(f = 0, e = edict_num(i), b = 1; b < 256; b *= 2, e = nextent(e)) - if(!IS_REAL_CLIENT(e) || e.ready) - f |= b; + for (f = 0, e = edict_num(i), b = 1; b < 256; b *= 2, e = nextent(e)) + if (!IS_REAL_CLIENT(e) || e.ready) f |= b; WriteByte(MSG_ENTITY, f); } } @@ -93,32 +87,28 @@ bool Nagger_SendEntity(entity this, entity to, float sendflags) void Nagger_Init() { - Net_LinkEntity(nagger = spawn(), false, 0, Nagger_SendEntity); + Net_LinkEntity(nagger = new_pure(nagger), false, 0, Nagger_SendEntity); } void Nagger_VoteChanged() { - if(nagger) - nagger.SendFlags |= 128; + if (nagger) nagger.SendFlags |= BIT(7); } void Nagger_VoteCountChanged() { - if(nagger) - nagger.SendFlags |= 64; + if (nagger) nagger.SendFlags |= BIT(6); } void Nagger_ReadyCounted() { - if(nagger) - nagger.SendFlags |= 1; + if (nagger) nagger.SendFlags |= BIT(0); } // If the vote_caller is still here, return their name, otherwise vote_caller_name string OriginalCallerName() { - if (IS_REAL_CLIENT(vote_caller)) - return vote_caller.netname; + if (IS_REAL_CLIENT(vote_caller)) return vote_caller.netname; return vote_caller_name; } @@ -128,11 +118,9 @@ string OriginalCallerName() void VoteReset() { - entity tmp_player; - - FOR_EACH_CLIENT(tmp_player) { tmp_player.vote_selection = 0; } + FOREACH_CLIENT(true, LAMBDA(it.vote_selection = 0)); - if(vote_called) + if (vote_called) { strunzone(vote_called_command); strunzone(vote_called_display); @@ -156,11 +144,9 @@ void VoteReset() void VoteStop(entity stopper) { bprint("\{1}^2* ^3", GetCallerName(stopper), "^2 stopped ^3", OriginalCallerName(), "^2's vote\n"); - if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vstop:", ftos(stopper.playerid))); } - + if (autocvar_sv_eventlog) GameLogEcho(strcat(":vote:vstop:", ftos(stopper.playerid))); // Don't force them to wait for next vote, this way they can e.g. correct their vote. - if((vote_caller) && (stopper == vote_caller)) { vote_caller.vote_waittime = time + autocvar_sv_vote_stop; } - + if ((vote_caller) && (stopper == vote_caller)) vote_caller.vote_waittime = time + autocvar_sv_vote_stop; VoteReset(); } @@ -168,12 +154,10 @@ void VoteAccept() { bprint("\{1}^2* ^3", OriginalCallerName(), "^2's vote for ^1", vote_called_display, "^2 was accepted\n"); - if((vote_called == VOTE_MASTER) && vote_caller) - vote_caller.vote_master = 1; - else - localcmd(strcat(vote_called_command, "\n")); + if ((vote_called == VOTE_MASTER) && vote_caller) vote_caller.vote_master = 1; + else localcmd(strcat(vote_called_command, "\n")); - if(vote_caller) { vote_caller.vote_waittime = 0; } // people like your votes, you don't need to wait to vote again + if (vote_caller) vote_caller.vote_waittime = 0; // people like your votes, you don't need to wait to vote again VoteReset(); Send_Notification(NOTIF_ALL, world, MSG_ANNCE, ANNCE_VOTE_ACCEPT); @@ -202,7 +186,7 @@ void VoteSpam(float notvoters, float mincount, string result) strcat(", ^1", ftos(vote_abstain_count), "^2 didn't care"), strcat(", ^1", ftos(notvoters), strcat("^2 didn't ", ((mincount >= 0) ? "" : "have to "), "vote\n")))); - if(autocvar_sv_eventlog) + if (autocvar_sv_eventlog) { GameLogEcho(strcat( strcat(":vote:v", result, ":", ftos(vote_accept_count)), @@ -218,9 +202,7 @@ void VoteCount(float first_count) // declarations vote_accept_count = vote_reject_count = vote_abstain_count = 0; - float spectators_allowed = ((autocvar_sv_vote_nospectators != 2) - || ((autocvar_sv_vote_nospectators == 1) && (warmup_stage || gameover)) - || (autocvar_sv_vote_nospectators == 0)); + bool spectators_allowed = (!autocvar_sv_vote_nospectators || (autocvar_sv_vote_nospectators == 1 && (warmup_stage || gameover))); float vote_player_count = 0, notvoters = 0; float vote_real_player_count = 0, vote_real_accept_count = 0; @@ -228,36 +210,41 @@ void VoteCount(float first_count) float vote_needed_of_voted, final_needed_votes; float vote_factor_overall, vote_factor_of_voted; - entity tmp_player; - Nagger_VoteCountChanged(); // add up all the votes from each connected client - FOR_EACH_REALCLIENT(tmp_player) - { + FOREACH_CLIENT(IS_REAL_CLIENT(it) && IS_CLIENT(it), LAMBDA( ++vote_player_count; - if(IS_PLAYER(tmp_player)) { ++vote_real_player_count; } - - switch(tmp_player.vote_selection) + if (IS_PLAYER(it)) ++vote_real_player_count; + switch (it.vote_selection) { - case VOTE_SELECT_REJECT: { ++vote_reject_count; { if(IS_PLAYER(tmp_player)) ++vote_real_reject_count; } break; } - case VOTE_SELECT_ACCEPT: { ++vote_accept_count; { if(IS_PLAYER(tmp_player)) ++vote_real_accept_count; } break; } - case VOTE_SELECT_ABSTAIN: { ++vote_abstain_count; { if(IS_PLAYER(tmp_player)) ++vote_real_abstain_count; } break; } + case VOTE_SELECT_REJECT: + { ++vote_reject_count; + { if (IS_PLAYER(it)) ++vote_real_reject_count; } break; + } + case VOTE_SELECT_ACCEPT: + { ++vote_accept_count; + { if (IS_PLAYER(it)) ++vote_real_accept_count; } break; + } + case VOTE_SELECT_ABSTAIN: + { ++vote_abstain_count; + { if (IS_PLAYER(it)) ++vote_real_abstain_count; } break; + } default: break; } - } + )); // Check to see if there are enough players on the server to allow master voting... otherwise, vote master could be used for evil. - if((vote_called == VOTE_MASTER) && autocvar_sv_vote_master_playerlimit > vote_player_count) + if ((vote_called == VOTE_MASTER) && autocvar_sv_vote_master_playerlimit > vote_player_count) { - if(vote_caller) { vote_caller.vote_waittime = 0; } + if (vote_caller) vote_caller.vote_waittime = 0; print_to(vote_caller, "^1There are not enough players on this server to allow you to become vote master."); VoteReset(); return; } // if spectators aren't allowed to vote and there are players in a match, then only count the players in the vote and ignore spectators. - if(!spectators_allowed && (vote_real_player_count > 0)) + if (!spectators_allowed && (vote_real_player_count > 0)) { vote_accept_count = vote_real_accept_count; vote_reject_count = vote_real_reject_count; @@ -277,43 +264,43 @@ void VoteCount(float first_count) vote_needed_of_voted = floor((vote_accept_count + vote_reject_count) * vote_factor_of_voted) + 1; // are there any players at all on the server? it could be an admin vote - if(vote_player_count == 0 && first_count) + if (vote_player_count == 0 && first_count) { - VoteSpam(0, -1, "yes"); // no players at all, just accept it + VoteSpam(0, -1, "yes"); // no players at all, just accept it VoteAccept(); return; } // since there ARE players, finally calculate the result of the vote - if(vote_accept_count >= vote_needed_overall) + if (vote_accept_count >= vote_needed_overall) { - VoteSpam(notvoters, -1, "yes"); // there is enough acceptions to pass the vote + VoteSpam(notvoters, -1, "yes"); // there is enough acceptions to pass the vote VoteAccept(); return; } - if(vote_reject_count > vote_player_count - vote_abstain_count - vote_needed_overall) + if (vote_reject_count > vote_player_count - vote_abstain_count - vote_needed_overall) { - VoteSpam(notvoters, -1, "no"); // there is enough rejections to deny the vote + VoteSpam(notvoters, -1, "no"); // there is enough rejections to deny the vote VoteReject(); return; } // there is not enough votes in either direction, now lets just calculate what the voters have said - if(time > vote_endtime) + if (time > vote_endtime) { final_needed_votes = vote_needed_overall; - if(autocvar_sv_vote_majority_factor_of_voted) + if (autocvar_sv_vote_majority_factor_of_voted) { - if(vote_accept_count >= vote_needed_of_voted) + if (vote_accept_count >= vote_needed_of_voted) { VoteSpam(notvoters, min(vote_needed_overall, vote_needed_of_voted), "yes"); VoteAccept(); return; } - if(vote_accept_count + vote_reject_count > 0) + if (vote_accept_count + vote_reject_count > 0) { VoteSpam(notvoters, min(vote_needed_overall, vote_needed_of_voted), "no"); VoteReject(); @@ -331,13 +318,11 @@ void VoteCount(float first_count) void VoteThink() { - if(vote_endtime > 0) // a vote was called - if(time > vote_endtime) // time is up + if (vote_endtime > 0) // a vote was called { - VoteCount(false); + if (time > vote_endtime) // time is up + VoteCount(false); } - - return; } @@ -346,190 +331,155 @@ void VoteThink() // ======================= // Resets the state of all clients, items, weapons, waypoints, ... of the map. -void reset_map(float dorespawn) -{SELFPARAM(); +void reset_map(bool dorespawn) +{ + SELFPARAM(); - if(time <= game_starttime && round_handler_IsActive()) - round_handler_Reset(game_starttime); + if (time <= game_starttime && round_handler_IsActive()) round_handler_Reset(game_starttime); MUTATOR_CALLHOOK(reset_map_global); - for(entity e = world; (e = nextent(e)); ) - { - setself(e); - if(IS_NOT_A_CLIENT(self)) + FOREACH_ENTITY_ORDERED(IS_NOT_A_CLIENT(it), { + if (it.reset) { - if(self.reset) - { - self.reset(); - continue; - } - - if(self.team_saved) - self.team = self.team_saved; - - if(self.flags & FL_PROJECTILE) // remove any projectiles left - remove(self); + WITHSELF(it, it.reset(it)); + continue; } - } + if (it.team_saved) it.team = it.team_saved; + if (it.flags & FL_PROJECTILE) remove(it); // remove any projectiles left + }); // Waypoints and assault start come LAST - for(entity e = world; (e = nextent(e)); ) - { - setself(e); - if(IS_NOT_A_CLIENT(self)) - { - if(self.reset2) - { - self.reset2(); - continue; - } - } - } + FOREACH_ENTITY_ORDERED(IS_NOT_A_CLIENT(it), { + if (it.reset2) WITHSELF(it, it.reset2()); + }); - entity e; - FOR_EACH_PLAYER(e) - if(e.frozen) - { - WITH(entity, self, e, Unfreeze(self)); - } + FOREACH_CLIENT(IS_PLAYER(it) && STAT(FROZEN, it), LAMBDA(WITHSELF(it, Unfreeze(it)))); // Moving the player reset code here since the player-reset depends // on spawnpoint entities which have to be reset first --blub - if(dorespawn) - if(!MUTATOR_CALLHOOK(reset_map_players)) - FOR_EACH_CLIENT(e) // reset all players + if (dorespawn) { - setself(e); - /* - only reset players if a restart countdown is active - this can either be due to cvar sv_ready_restart_after_countdown having set - restart_mapalreadyrestarted to 1 after the countdown ended or when - sv_ready_restart_after_countdown is not used and countdown is still running - */ - if (restart_mapalreadyrestarted || (time < game_starttime)) + if (!MUTATOR_CALLHOOK(reset_map_players)) { - //NEW: changed behaviour so that it prevents that previous spectators/observers suddenly spawn as players - if (IS_PLAYER(self)) { - //PlayerScore_Clear(self); - self.killcount = 0; - //stop the player from moving so that he stands still once he gets respawned - self.velocity = '0 0 0'; - self.avelocity = '0 0 0'; - self.movement = '0 0 0'; - PutClientInServer(); - } + FOREACH_CLIENT(true, LAMBDA( + setself(it); + /* + only reset players if a restart countdown is active + this can either be due to cvar sv_ready_restart_after_countdown having set + restart_mapalreadyrestarted to 1 after the countdown ended or when + sv_ready_restart_after_countdown is not used and countdown is still running + */ + if (restart_mapalreadyrestarted || (time < game_starttime)) + { + // NEW: changed behaviour so that it prevents that previous spectators/observers suddenly spawn as players + if (IS_PLAYER(self)) + { + // PlayerScore_Clear(self); + self.killcount = 0; + // stop the player from moving so that he stands still once he gets respawned + self.velocity = '0 0 0'; + self.avelocity = '0 0 0'; + self.movement = '0 0 0'; + PutClientInServer(); + } + } + )); + + setself(this); } } - - if(g_keyhunt) - kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_round + (game_starttime - time), kh_StartRound); - - setself(this); } // Restarts the map after the countdown is over (and cvar sv_ready_restart_after_countdown is set) void ReadyRestart_think() -{SELFPARAM(); - restart_mapalreadyrestarted = 1; +{ + SELFPARAM(); + restart_mapalreadyrestarted = true; reset_map(true); Score_ClearAll(); - remove(self); - - return; + remove(this); } // Forces a restart of the game without actually reloading the map // this is a mess... void ReadyRestart_force() { - entity tmp_player, restart_timer; - bprint("^1Server is restarting...\n"); VoteReset(); // clear overtime, we have to decrease timelimit to its original value again. - if (checkrules_overtimesadded > 0 && g_race_qualifying != 2) { cvar_set("timelimit", ftos(autocvar_timelimit - (checkrules_overtimesadded * autocvar_timelimit_overtime))); } - + if (checkrules_overtimesadded > 0 && g_race_qualifying != 2) + cvar_set("timelimit", ftos(autocvar_timelimit - (checkrules_overtimesadded * autocvar_timelimit_overtime))); checkrules_suddendeathend = checkrules_overtimesadded = checkrules_suddendeathwarning = 0; - readyrestart_happened = 1; + readyrestart_happened = true; game_starttime = time + RESTART_COUNTDOWN; // clear player attributes - FOR_EACH_CLIENT(tmp_player) - { - tmp_player.alivetime = 0; - tmp_player.killcount = 0; - PS_GR_P_ADDVAL(tmp_player, PLAYERSTATS_ALIVETIME, -PS_GR_P_ADDVAL(tmp_player, PLAYERSTATS_ALIVETIME, 0)); - } + FOREACH_CLIENT(true, LAMBDA( + it.alivetime = 0; + it.killcount = 0; + PS_GR_P_ADDVAL(it, PLAYERSTATS_ALIVETIME, -PS_GR_P_ADDVAL(it, PLAYERSTATS_ALIVETIME, 0)); + )); - restart_mapalreadyrestarted = 0; // reset this var, needed when cvar sv_ready_restart_repeatable is in use + restart_mapalreadyrestarted = false; // reset this var, needed when cvar sv_ready_restart_repeatable is in use // disable the warmup global for the server - warmup_stage = 0; // once the game is restarted the game is in match stage + warmup_stage = 0; // once the game is restarted the game is in match stage // reset the .ready status of all players (also spectators) - FOR_EACH_REALCLIENT(tmp_player) { tmp_player.ready = 0; } + FOREACH_CLIENT(IS_REAL_CLIENT(it), LAMBDA(it.ready = false)); readycount = 0; - Nagger_ReadyCounted(); // NOTE: this causes a resend of that entity, and will also turn off warmup state on the client + Nagger_ReadyCounted(); // NOTE: this causes a resend of that entity, and will also turn off warmup state on the client // lock teams with lockonrestart - if(autocvar_teamplay_lockonrestart && teamplay) + if (autocvar_teamplay_lockonrestart && teamplay) { - lockteams = 1; + lockteams = true; bprint("^1The teams are now locked.\n"); } - //initiate the restart-countdown-announcer entity - if(autocvar_sv_ready_restart_after_countdown) + // initiate the restart-countdown-announcer entity + if (autocvar_sv_ready_restart_after_countdown) { - restart_timer = spawn(); + entity restart_timer = new_pure(restart_timer); restart_timer.think = ReadyRestart_think; restart_timer.nextthink = game_starttime; } // after a restart every players number of allowed timeouts gets reset, too - if(autocvar_sv_timeout) { FOR_EACH_REALPLAYER(tmp_player) { tmp_player.allowed_timeouts = autocvar_sv_timeout_number; } } - - //reset map immediately if this cvar is not set - if (!autocvar_sv_ready_restart_after_countdown) { reset_map(true); } - - if(autocvar_sv_eventlog) { GameLogEcho(":restart"); } + if (autocvar_sv_timeout) + { + FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it), LAMBDA(it.allowed_timeouts = autocvar_sv_timeout_number)); + } + // reset map immediately if this cvar is not set + if (!autocvar_sv_ready_restart_after_countdown) reset_map(true); + if (autocvar_sv_eventlog) GameLogEcho(":restart"); } void ReadyRestart() { - // no arena, assault support yet... - if(g_assault | gameover | intermission_running | race_completing) - localcmd("restart\n"); - else - localcmd("\nsv_hook_gamerestart\n"); + // no assault support yet... + if (g_assault | gameover | intermission_running | race_completing) localcmd("restart\n"); + else localcmd("\nsv_hook_gamerestart\n"); // Reset ALL scores, but only do that at the beginning of the countdown if sv_ready_restart_after_countdown is off! // Otherwise scores could be manipulated during the countdown. - if (!autocvar_sv_ready_restart_after_countdown) { Score_ClearAll(); } - + if (!autocvar_sv_ready_restart_after_countdown) Score_ClearAll(); ReadyRestart_force(); - - return; } // Count the players who are ready and determine whether or not to restart the match void ReadyCount() { - entity tmp_player; float ready_needed_factor, ready_needed_count; float t_ready = 0, t_players = 0; - FOR_EACH_REALCLIENT(tmp_player) - { - if(IS_PLAYER(tmp_player) || tmp_player.caplayer == 1) - { - ++t_players; - if(tmp_player.ready) { ++t_ready; } - } - } + FOREACH_CLIENT(IS_REAL_CLIENT(it) && (IS_PLAYER(it) || it.caplayer == 1), LAMBDA( + ++t_players; + if (it.ready) ++t_ready; + )); readycount = t_ready; @@ -538,12 +488,7 @@ void ReadyCount() ready_needed_factor = bound(0.5, cvar("g_warmup_majority_factor"), 0.999); ready_needed_count = floor(t_players * ready_needed_factor) + 1; - if(readycount >= ready_needed_count) - { - ReadyRestart(); - } - - return; + if (readycount >= ready_needed_count) ReadyRestart(); } @@ -555,12 +500,9 @@ float Votecommand_check_assignment(entity caller, float assignment) { float from_server = (!caller); - if((assignment == VC_ASGNMNT_BOTH) - || ((!from_server && assignment == VC_ASGNMNT_CLIENTONLY) - || (from_server && assignment == VC_ASGNMNT_SERVERONLY))) - { - return true; - } + if ((assignment == VC_ASGNMNT_BOTH) + || ((!from_server && assignment == VC_ASGNMNT_CLIENTONLY) + || (from_server && assignment == VC_ASGNMNT_SERVERONLY))) return true; return false; } @@ -569,21 +511,18 @@ string VoteCommand_extractcommand(string input, float startpos, float argc) { string output; - if((argc - 1) < startpos) - output = ""; - else - output = substring(input, argv_start_index(startpos), argv_end_index(-1) - argv_start_index(startpos)); + if ((argc - 1) < startpos) output = ""; + else output = substring(input, argv_start_index(startpos), argv_end_index(-1) - argv_start_index(startpos)); return output; } float VoteCommand_checknasty(string vote_command) { - if((strstrofs(vote_command, ";", 0) >= 0) - || (strstrofs(vote_command, "\n", 0) >= 0) - || (strstrofs(vote_command, "\r", 0) >= 0) - || (strstrofs(vote_command, "$", 0) >= 0)) - return false; + if ((strstrofs(vote_command, ";", 0) >= 0) + || (strstrofs(vote_command, "\n", 0) >= 0) + || (strstrofs(vote_command, "\r", 0) >= 0) + || (strstrofs(vote_command, "$", 0) >= 0)) return false; return true; } @@ -592,8 +531,7 @@ float VoteCommand_checkinlist(string vote_command, string list) { string l = strcat(" ", list, " "); - if(strstrofs(l, strcat(" ", vote_command, " "), 0) >= 0) - return true; + if (strstrofs(l, strcat(" ", vote_command, " "), 0) >= 0) return true; return false; } @@ -608,16 +546,16 @@ string ValidateMap(string validated_map, entity caller) return string_null; } - if(!autocvar_sv_vote_override_mostrecent && caller) + if (!autocvar_sv_vote_override_mostrecent && caller) { - if(Map_IsRecent(validated_map)) + if (Map_IsRecent(validated_map)) { print_to(caller, "This server does not allow for recent maps to be played again. Please be patient for some rounds."); return string_null; } } - if(!MapInfo_CheckMap(validated_map)) + if (!MapInfo_CheckMap(validated_map)) { print_to(caller, strcat("^1Invalid mapname, \"^3", validated_map, "^1\" does not support the current game mode.")); return string_null; @@ -630,14 +568,18 @@ float VoteCommand_checkargs(float startpos, float argc) { float p, q, check, minargs; string cvarname = strcat("sv_vote_command_restriction_", argv(startpos)); - string cmdrestriction = cvar_string(cvarname); // note: this warns on undefined cvar. We want that. + string cmdrestriction = ""; // No we don't. string charlist, arg; float checkmate; - if(cmdrestriction == "") - return true; + if(cvar_type(cvarname) & CVAR_TYPEFLAG_EXISTS) + cmdrestriction = cvar_string(cvarname); + else + LOG_INFO("NOTE: ", cvarname, " does not exist, no restrictions will be applied.\n"); + + if (cmdrestriction == "") return true; - ++startpos; // skip command name + ++startpos; // skip command name // check minimum arg count @@ -646,49 +588,45 @@ float VoteCommand_checkargs(float startpos, float argc) // ... minargs = stof(cmdrestriction); - if(argc - startpos < minargs) - return false; + if (argc - startpos < minargs) return false; - p = strstrofs(cmdrestriction, ";", 0); // find first semicolon + p = strstrofs(cmdrestriction, ";", 0); // find first semicolon - for (;;) + for ( ; ; ) { // we know that at any time, startpos <= argc - minargs // so this means: argc-minargs >= startpos >= argc, thus // argc-minargs >= argc, thus minargs <= 0, thus all minargs // have been seen already - if(startpos >= argc) // all args checked? GOOD + if (startpos >= argc) // all args checked? GOOD break; - if(p < 0) // no more args? FAIL + if (p < 0) // no more args? FAIL { // exception: exactly minargs left, this one included - if(argc - startpos == minargs) - break; + if (argc - startpos == minargs) break; // otherwise fail return false; } // cut to next semicolon - q = strstrofs(cmdrestriction, ";", p+1); // find next semicolon - if(q < 0) - charlist = substring(cmdrestriction, p+1, -1); - else - charlist = substring(cmdrestriction, p+1, q - (p+1)); + q = strstrofs(cmdrestriction, ";", p + 1); // find next semicolon + if (q < 0) charlist = substring(cmdrestriction, p + 1, -1); + else charlist = substring(cmdrestriction, p + 1, q - (p + 1)); // in case we ever want to allow semicolons in VoteCommand_checknasty // charlist = strreplace("^^", ";", charlist); - if(charlist != "") + if (charlist != "") { // verify the arg only contains allowed chars arg = argv(startpos); checkmate = strlen(arg); - for(check = 0; check < checkmate; ++check) - if(strstrofs(charlist, substring(arg, check, 1), 0) < 0) - return false; // not allowed character + for (check = 0; check < checkmate; ++check) + if (strstrofs(charlist, substring(arg, check, 1), 0) < 0) return false; + // not allowed character // all characters are allowed. FINE. } @@ -707,42 +645,37 @@ float VoteCommand_parse(entity caller, string vote_command, string vote_list, fl first_command = argv(startpos); /*printf("VoteCommand_parse(): Command: '%s', Length: %f.\n", - substring(vote_command, argv_start_index(startpos), strlen(vote_command) - argv_start_index(startpos)), - strlen(substring(vote_command, argv_start_index(startpos), strlen(vote_command) - argv_start_index(startpos))) + substring(vote_command, argv_start_index(startpos), strlen(vote_command) - argv_start_index(startpos)), + strlen(substring(vote_command, argv_start_index(startpos), strlen(vote_command) - argv_start_index(startpos))) );*/ - if( - (autocvar_sv_vote_limit > 0) - && - (strlen(substring(vote_command, argv_start_index(startpos), strlen(vote_command) - argv_start_index(startpos))) > autocvar_sv_vote_limit) - ) - return false; + if ( + (autocvar_sv_vote_limit > 0) + && + (strlen(substring(vote_command, argv_start_index(startpos), strlen(vote_command) - argv_start_index(startpos))) > autocvar_sv_vote_limit) + ) return false; - if (!VoteCommand_checkinlist(first_command, vote_list)) - return false; + if (!VoteCommand_checkinlist(first_command, vote_list)) return false; - if (!VoteCommand_checkargs(startpos, argc)) - return false; + if (!VoteCommand_checkargs(startpos, argc)) return false; - switch(first_command) // now go through and parse the proper commands to adjust as needed. + switch (first_command) // now go through and parse the proper commands to adjust as needed. { case "kick": - case "kickban": // catch all kick/kickban commands + case "kickban": // catch all kick/kickban commands { entity victim = GetIndexedEntity(argc, (startpos + 1)); float accepted = VerifyClientEntity(victim, true, false); - if(accepted > 0) + if (accepted > 0) { string reason = ((argc > next_token) ? substring(vote_command, argv_start_index(next_token), strlen(vote_command) - argv_start_index(next_token)) : "No reason provided"); string command_arguments; - if(first_command == "kickban") - command_arguments = strcat(ftos(autocvar_g_ban_default_bantime), " ", ftos(autocvar_g_ban_default_masksize), " ~"); - else - command_arguments = reason; + if (first_command == "kickban") command_arguments = strcat(ftos(autocvar_g_ban_default_bantime), " ", ftos(autocvar_g_ban_default_masksize), " ~"); + else command_arguments = reason; - vote_parsed_command = strcat(first_command, " # ", ftos(num_for_edict(victim)), " ", command_arguments); + vote_parsed_command = strcat(first_command, " # ", ftos(etof(victim)), " ", command_arguments); vote_parsed_display = strcat("^1", vote_command, " (^7", victim.netname, "^1): ", reason); } else { print_to(caller, strcat("vcall: ", GetClientErrorString(accepted, argv(startpos + 1)), ".\n")); return false; } @@ -752,10 +685,10 @@ float VoteCommand_parse(entity caller, string vote_command, string vote_list, fl case "map": case "chmap": - case "gotomap": // re-direct all map selection commands to gotomap + case "gotomap": // re-direct all map selection commands to gotomap { vote_command = ValidateMap(argv(startpos + 1), caller); - if (!vote_command) { return false; } + if (!vote_command) return false; vote_parsed_command = strcat("gotomap ", vote_command); vote_parsed_display = strzone(strcat("^1", vote_parsed_command)); @@ -779,22 +712,24 @@ float VoteCommand_parse(entity caller, string vote_command, string vote_list, fl // Command Sub-Functions // ======================= -void VoteCommand_abstain(float request, entity caller) // CLIENT ONLY +void VoteCommand_abstain(float request, entity caller) // CLIENT ONLY { - switch(request) + switch (request) { case CMD_REQUEST_COMMAND: { if (!vote_called) { print_to(caller, "^1No vote called."); } - else if(caller.vote_selection != VOTE_SELECT_NULL && !autocvar_sv_vote_change) { print_to(caller, "^1You have already voted."); } + else if (caller.vote_selection != VOTE_SELECT_NULL && !autocvar_sv_vote_change) + { + print_to(caller, "^1You have already voted."); + } - else // everything went okay, continue changing vote + else // everything went okay, continue changing vote { print_to(caller, "^1You abstained from your vote."); caller.vote_selection = VOTE_SELECT_ABSTAIN; msg_entity = caller; - if(!autocvar_sv_vote_singlecount) { VoteCount(false); } - } + if (!autocvar_sv_vote_singlecount) VoteCount(false); } return; } @@ -809,54 +744,75 @@ void VoteCommand_abstain(float request, entity caller) // CLIENT ONLY } } -void VoteCommand_call(float request, entity caller, float argc, string vote_command) // BOTH +void VoteCommand_call(float request, entity caller, float argc, string vote_command) // BOTH { - switch(request) + switch (request) { case CMD_REQUEST_COMMAND: { - float spectators_allowed = ((autocvar_sv_vote_nospectators != 2) - || ((autocvar_sv_vote_nospectators == 1) && warmup_stage) - || (autocvar_sv_vote_nospectators == 0)); + bool spectators_allowed = (!autocvar_sv_vote_nospectators || (autocvar_sv_vote_nospectators == 1 && (warmup_stage || gameover))); float tmp_playercount = 0; - entity tmp_player; vote_command = VoteCommand_extractcommand(vote_command, 2, argc); - if(!autocvar_sv_vote_call && caller) { print_to(caller, "^1Vote calling is not allowed."); } - else if(!autocvar_sv_vote_gamestart && time < game_starttime) { print_to(caller, "^1Vote calling is not allowed before the match has started."); } - else if(vote_called) { print_to(caller, "^1There is already a vote called."); } - else if(!spectators_allowed && (caller && !IS_PLAYER(caller))) { print_to(caller, "^1Only players can call a vote."); } - else if(caller && !IS_CLIENT(caller)) { print_to(caller, "^1Only connected clients can vote."); } - else if(timeout_status) { print_to(caller, "^1You can not call a vote while a timeout is active."); } - else if(caller && (time < caller.vote_waittime)) { print_to(caller, strcat("^1You have to wait ^2", ftos(ceil(caller.vote_waittime - time)), "^1 seconds before you can again call a vote.")); } - else if (!VoteCommand_checknasty(vote_command)) { print_to(caller, "^1Syntax error in command, see 'vhelp' for more info."); } - else if (!VoteCommand_parse(caller, vote_command, autocvar_sv_vote_commands, 2, argc)) { print_to(caller, "^1This command is not acceptable, see 'vhelp' for more info."); } - - else // everything went okay, continue with calling the vote + if (!autocvar_sv_vote_call && caller) { print_to(caller, "^1Vote calling is not allowed."); } + else if (!autocvar_sv_vote_gamestart && time < game_starttime) + { + print_to(caller, "^1Vote calling is not allowed before the match has started."); + } + else if (vote_called) + { + print_to(caller, "^1There is already a vote called."); + } + else if (!spectators_allowed && (caller && !IS_PLAYER(caller))) + { + print_to(caller, "^1Only players can call a vote."); + } + else if (caller && !IS_CLIENT(caller)) + { + print_to(caller, "^1Only connected clients can vote."); + } + else if (timeout_status) + { + print_to(caller, "^1You can not call a vote while a timeout is active."); + } + else if (caller && (time < caller.vote_waittime)) + { + print_to(caller, strcat("^1You have to wait ^2", ftos(ceil(caller.vote_waittime - time)), "^1 seconds before you can again call a vote.")); + } + else if (!VoteCommand_checknasty(vote_command)) { - vote_caller = caller; // remember who called the vote + print_to(caller, "^1Syntax error in command, see 'vhelp' for more info."); + } + else if (!VoteCommand_parse(caller, vote_command, autocvar_sv_vote_commands, 2, argc)) + { + print_to(caller, "^1This command is not acceptable, see 'vhelp' for more info."); + } + + else // everything went okay, continue with calling the vote + { + vote_caller = caller; // remember who called the vote vote_caller_name = strzone(GetCallerName(vote_caller)); vote_called = VOTE_NORMAL; vote_called_command = strzone(vote_parsed_command); vote_called_display = strzone(vote_parsed_display); vote_endtime = time + autocvar_sv_vote_timeout; - if(caller) + if (caller) { caller.vote_selection = VOTE_SELECT_ACCEPT; caller.vote_waittime = time + autocvar_sv_vote_wait; msg_entity = caller; } - FOR_EACH_REALCLIENT(tmp_player) { ++tmp_playercount; } - if(tmp_playercount > 1) { Send_Notification(NOTIF_ALL, world, MSG_ANNCE, ANNCE_VOTE_CALL); } // don't announce a "vote now" sound if player is alone + FOREACH_CLIENT(IS_REAL_CLIENT(it), LAMBDA(++tmp_playercount)); + if (tmp_playercount > 1) Send_Notification(NOTIF_ALL, world, MSG_ANNCE, ANNCE_VOTE_CALL); // don't announce a "vote now" sound if player is alone bprint("\{1}^2* ^3", OriginalCallerName(), "^2 calls a vote for ", vote_called_display, "\n"); - if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vcall:", ftos(vote_caller.playerid), ":", vote_called_display)); } + if (autocvar_sv_eventlog) GameLogEcho(strcat(":vote:vcall:", ftos(vote_caller.playerid), ":", vote_called_display)); Nagger_VoteChanged(); - VoteCount(true); // needed if you are the only one + VoteCount(true); // needed if you are the only one } return; @@ -874,64 +830,81 @@ void VoteCommand_call(float request, entity caller, float argc, string vote_comm } } -void VoteCommand_master(float request, entity caller, float argc, string vote_command) // CLIENT ONLY +void VoteCommand_master(float request, entity caller, float argc, string vote_command) // CLIENT ONLY { - switch(request) + switch (request) { case CMD_REQUEST_COMMAND: { - if(autocvar_sv_vote_master) + if (autocvar_sv_vote_master) { - switch(strtolower(argv(2))) + switch (strtolower(argv(2))) { case "do": { vote_command = VoteCommand_extractcommand(vote_command, 3, argc); if (!caller.vote_master) { print_to(caller, "^1You do not have vote master privelages."); } - else if (!VoteCommand_checknasty(vote_command)) { print_to(caller, "^1Syntax error in command, see 'vhelp' for more info."); } - else if (!VoteCommand_parse(caller, vote_command, strcat(autocvar_sv_vote_commands, " ", autocvar_sv_vote_master_commands), 3, argc)) { print_to(caller, "^1This command is not acceptable, see 'vhelp' for more info."); } + else if (!VoteCommand_checknasty(vote_command)) + { + print_to(caller, "^1Syntax error in command, see 'vhelp' for more info."); + } + else if (!VoteCommand_parse(caller, vote_command, strcat(autocvar_sv_vote_commands, " ", autocvar_sv_vote_master_commands), 3, argc)) + { + print_to(caller, "^1This command is not acceptable, see 'vhelp' for more info."); + } - else // everything went okay, proceed with command + else // everything went okay, proceed with command { localcmd(strcat(vote_parsed_command, "\n")); print_to(caller, strcat("Executing command '", vote_parsed_display, "' on server.")); bprint("\{1}^2* ^3", GetCallerName(caller), "^2 used their ^3master^2 status to do \"^2", vote_parsed_display, "^2\".\n"); - if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vdo:", ftos(caller.playerid), ":", vote_parsed_display)); } - } + if (autocvar_sv_eventlog) GameLogEcho(strcat(":vote:vdo:", ftos(caller.playerid), ":", vote_parsed_display)); } return; } case "login": { - if(autocvar_sv_vote_master_password == "") { print_to(caller, "^1Login to vote master is not allowed."); } - else if(caller.vote_master) { print_to(caller, "^1You are already logged in as vote master."); } - else if(autocvar_sv_vote_master_password != argv(3)) { print_to(caller, strcat("Rejected vote master login from ", GetCallerName(caller))); } + if (autocvar_sv_vote_master_password == "") { print_to(caller, "^1Login to vote master is not allowed."); } + else if (caller.vote_master) + { + print_to(caller, "^1You are already logged in as vote master."); + } + else if (autocvar_sv_vote_master_password != argv(3)) + { + print_to(caller, strcat("Rejected vote master login from ", GetCallerName(caller))); + } - else // everything went okay, proceed with giving this player master privilages + else // everything went okay, proceed with giving this player master privilages { caller.vote_master = true; print_to(caller, strcat("Accepted vote master login from ", GetCallerName(caller))); bprint("\{1}^2* ^3", GetCallerName(caller), "^2 logged in as ^3master^2\n"); - if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vlogin:", ftos(caller.playerid))); } - } + if (autocvar_sv_eventlog) GameLogEcho(strcat(":vote:vlogin:", ftos(caller.playerid))); } return; } - default: // calling a vote for master + default: // calling a vote for master { - float spectators_allowed = ((autocvar_sv_vote_nospectators != 2) - || ((autocvar_sv_vote_nospectators == 1) && warmup_stage) - || (autocvar_sv_vote_nospectators == 0)); + bool spectators_allowed = (!autocvar_sv_vote_nospectators || (autocvar_sv_vote_nospectators == 1 && (warmup_stage || gameover))); if (!autocvar_sv_vote_master_callable) { print_to(caller, "^1Vote to become vote master is not allowed."); } - else if(vote_called) { print_to(caller, "^1There is already a vote called."); } - else if(!spectators_allowed && (caller && !IS_PLAYER(caller))) { print_to(caller, "^1Only players can call a vote."); } - else if(timeout_status) { print_to(caller, "^1You can not call a vote while a timeout is active."); } + else if (vote_called) + { + print_to(caller, "^1There is already a vote called."); + } + else if (!spectators_allowed && (caller && !IS_PLAYER(caller))) + { + print_to(caller, "^1Only players can call a vote."); + } + else if (timeout_status) + { + print_to(caller, "^1You can not call a vote while a timeout is active."); + } - else // everything went okay, continue with creating vote + else // everything went okay, continue with creating vote { vote_caller = caller; vote_caller_name = strzone(GetCallerName(vote_caller)); @@ -944,9 +917,9 @@ void VoteCommand_master(float request, entity caller, float argc, string vote_co caller.vote_waittime = time + autocvar_sv_vote_wait; bprint("\{1}^2* ^3", OriginalCallerName(), "^2 calls a vote to become ^3master^2.\n"); - if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vcall:", ftos(vote_caller.playerid), ":", vote_called_display)); } + if (autocvar_sv_eventlog) GameLogEcho(strcat(":vote:vcall:", ftos(vote_caller.playerid), ":", vote_called_display)); Nagger_VoteChanged(); - VoteCount(true); // needed if you are the only one + VoteCount(true); // needed if you are the only one } return; @@ -969,23 +942,28 @@ void VoteCommand_master(float request, entity caller, float argc, string vote_co } } -void VoteCommand_no(float request, entity caller) // CLIENT ONLY +void VoteCommand_no(float request, entity caller) // CLIENT ONLY { - switch(request) + switch (request) { case CMD_REQUEST_COMMAND: { if (!vote_called) { print_to(caller, "^1No vote called."); } - else if(caller.vote_selection != VOTE_SELECT_NULL && !autocvar_sv_vote_change) { print_to(caller, "^1You have already voted."); } - else if(((caller == vote_caller) || caller.vote_master) && autocvar_sv_vote_no_stops_vote) { VoteStop(caller); } + else if (caller.vote_selection != VOTE_SELECT_NULL && !autocvar_sv_vote_change) + { + print_to(caller, "^1You have already voted."); + } + else if (((caller == vote_caller) || caller.vote_master) && autocvar_sv_vote_no_stops_vote) + { + VoteStop(caller); + } - else // everything went okay, continue changing vote + else // everything went okay, continue changing vote { print_to(caller, "^1You rejected the vote."); caller.vote_selection = VOTE_SELECT_REJECT; msg_entity = caller; - if(!autocvar_sv_vote_singlecount) { VoteCount(false); } - } + if (!autocvar_sv_vote_singlecount) VoteCount(false); } return; } @@ -1000,16 +978,14 @@ void VoteCommand_no(float request, entity caller) // CLIENT ONLY } } -void VoteCommand_status(float request, entity caller) // BOTH +void VoteCommand_status(float request, entity caller) // BOTH { - switch(request) + switch (request) { case CMD_REQUEST_COMMAND: { - if(vote_called) - print_to(caller, strcat("^7Vote for ", vote_called_display, "^7 called by ^7", OriginalCallerName(), "^7.")); - else - print_to(caller, "^1No vote called."); + if (vote_called) print_to(caller, strcat("^7Vote for ", vote_called_display, "^7 called by ^7", OriginalCallerName(), "^7.")); + else print_to(caller, "^1No vote called."); return; } @@ -1024,16 +1000,15 @@ void VoteCommand_status(float request, entity caller) // BOTH } } -void VoteCommand_stop(float request, entity caller) // BOTH +void VoteCommand_stop(float request, entity caller) // BOTH { - switch(request) + switch (request) { case CMD_REQUEST_COMMAND: { - if (!vote_called) { print_to(caller, "^1No vote called."); } - else if((caller == vote_caller) || !caller || caller.vote_master) { VoteStop(caller); } - else { print_to(caller, "^1You are not allowed to stop that vote."); } - + if (!vote_called) print_to(caller, "^1No vote called."); + else if ((caller == vote_caller) || !caller || caller.vote_master) VoteStop(caller); + else print_to(caller, "^1You are not allowed to stop that vote."); return; } @@ -1047,22 +1022,24 @@ void VoteCommand_stop(float request, entity caller) // BOTH } } -void VoteCommand_yes(float request, entity caller) // CLIENT ONLY +void VoteCommand_yes(float request, entity caller) // CLIENT ONLY { - switch(request) + switch (request) { case CMD_REQUEST_COMMAND: { if (!vote_called) { print_to(caller, "^1No vote called."); } - else if(caller.vote_selection != VOTE_SELECT_NULL && !autocvar_sv_vote_change) { print_to(caller, "^1You have already voted."); } + else if (caller.vote_selection != VOTE_SELECT_NULL && !autocvar_sv_vote_change) + { + print_to(caller, "^1You have already voted."); + } - else // everything went okay, continue changing vote + else // everything went okay, continue changing vote { print_to(caller, "^1You accepted the vote."); caller.vote_selection = VOTE_SELECT_ACCEPT; msg_entity = caller; - if(!autocvar_sv_vote_singlecount) { VoteCount(false); } - } + if (!autocvar_sv_vote_singlecount) VoteCount(false); } return; } @@ -1081,22 +1058,22 @@ void VoteCommand_yes(float request, entity caller) // CLIENT ONLY ** ADD ALL NEW COMMANDS TO commands.cfg WITH PROPER ALIASES IN THE SAME FASHION! void VoteCommand_(float request) { - switch(request) - { - case CMD_REQUEST_COMMAND: - { - - return; - } - - default: - case CMD_REQUEST_USAGE: - { - print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " vote "); - print_to(caller, " No arguments required."); - return; - } - } + switch(request) + { + case CMD_REQUEST_COMMAND: + { + + return; + } + + default: + case CMD_REQUEST_USAGE: + { + print_to(caller, strcat("\nUsage:^3 ", GetCommandPrefix(caller), " vote "); + print_to(caller, " No arguments required."); + return; + } + } } */ @@ -1106,7 +1083,7 @@ void VoteCommand_(float request) // ================================ // Do not hard code aliases for these, instead create them in commands.cfg... also: keep in alphabetical order, please ;) -#define VOTE_COMMANDS(request,caller,arguments,command) \ +#define VOTE_COMMANDS(request, caller, arguments, command) \ VOTE_COMMAND("abstain", VoteCommand_abstain(request, caller), "Abstain your vote in current vote", VC_ASGNMNT_CLIENTONLY) \ VOTE_COMMAND("call", VoteCommand_call(request, caller, arguments, command), "Create a new vote for players to decide on", VC_ASGNMNT_BOTH) \ VOTE_COMMAND("help", VoteCommand_macro_help(caller, arguments), "Shows this information", VC_ASGNMNT_BOTH) \ @@ -1121,38 +1098,36 @@ void VoteCommand_macro_help(entity caller, float argc) { string command_origin = GetCommandPrefix(caller); - if(argc == 2 || argv(2) == "help") // help display listing all commands + if (argc == 2 || argv(2) == "help") // help display listing all commands { print_to(caller, "\nVoting commands:\n"); - #define VOTE_COMMAND(name,function,description,assignment) \ - { if(Votecommand_check_assignment(caller, assignment)) { print_to(caller, strcat(" ^2", name, "^7: ", description)); } } + #define VOTE_COMMAND(name, function, description, assignment) \ + { if (Votecommand_check_assignment(caller, assignment)) { print_to(caller, strcat(" ^2", name, "^7: ", description)); } } VOTE_COMMANDS(0, caller, 0, ""); - #undef VOTE_COMMAND +#undef VOTE_COMMAND print_to(caller, strcat("\nUsage:^3 ", command_origin, " vote COMMAND...^7, where possible commands are listed above.\n")); print_to(caller, strcat("For help about a specific command, type ", command_origin, " vote help COMMAND")); print_to(caller, strcat("\n^7You can call a vote for or execute these commands: ^3", autocvar_sv_vote_commands, "^7 and maybe further ^3arguments^7")); } - else // usage for individual command + else // usage for individual command { - #define VOTE_COMMAND(name,function,description,assignment) \ - { if(Votecommand_check_assignment(caller, assignment)) { if(name == strtolower(argv(2))) { function; return; } } } + #define VOTE_COMMAND(name, function, description, assignment) \ + { if (Votecommand_check_assignment(caller, assignment)) { if (name == strtolower(argv(2))) { function; return; } } } VOTE_COMMANDS(CMD_REQUEST_USAGE, caller, argc, ""); - #undef VOTE_COMMAND +#undef VOTE_COMMAND } - - return; } float VoteCommand_macro_command(entity caller, float argc, string vote_command) { - #define VOTE_COMMAND(name,function,description,assignment) \ - { if(Votecommand_check_assignment(caller, assignment)) { if(name == strtolower(argv(1))) { function; return true; } } } + #define VOTE_COMMAND(name, function, description, assignment) \ + { if (Votecommand_check_assignment(caller, assignment)) { if (name == strtolower(argv(1))) { function; return true; } } } VOTE_COMMANDS(CMD_REQUEST_COMMAND, caller, argc, vote_command); - #undef VOTE_COMMAND +#undef VOTE_COMMAND return false; } @@ -1169,12 +1144,11 @@ void VoteCommand(float request, entity caller, float argc, string vote_command) // argv: 0 - 1 - 2 - 3 // cmd vote - master - login - password - switch(request) + switch (request) { case CMD_REQUEST_COMMAND: { - if(VoteCommand_macro_command(caller, argc, vote_command)) - return; + if (VoteCommand_macro_command(caller, argc, vote_command)) return; } default: