]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/command/vote.qc
If there aren't any players at all and there is a vote called, don't automatically...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / command / vote.qc
index ab047fecf1483ffa200ad6b0cebb61ffe694c96e..0fd9a199cb5ab7412a64fc95a988b4d10c0e6faa 100644 (file)
@@ -250,8 +250,15 @@ void VoteCount()
        vote_factor_of_voted = bound(0.5, autocvar_sv_vote_majority_factor_of_voted, 0.999);
        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)
+       {
+               VoteSpam(0, -1, "yes"); // no players at all, just accept it 
+               VoteAccept();
+               return;
+       }
        
-       // finally calculate the result of the vote     
+       // since there ARE players, finally calculate the result of the vote    
        if(vote_accept_count >= vote_needed_overall)
        {
                VoteSpam(notvoters, -1, "yes"); // there is enough acceptions to pass the vote
@@ -512,7 +519,6 @@ string ValidateMap(string validated_map, entity caller)
 float VoteCommand_parse(entity caller, string vote_command, string vote_list, float startpos, float argc)
 {
        string first_command;
-       entity victim;
        
        first_command = argv(startpos);
 
@@ -539,11 +545,23 @@ float VoteCommand_parse(entity caller, string vote_command, string vote_list, fl
                case "kick":
                case "kickban": // catch all kick/kickban commands
                {
-                       victim = GetIndexedEntity(argc, (startpos + 1));
-                       if not(victim) { return FALSE; }
-                       // TODO: figure out how kick/kickban/ban commands work and re-write this to fit around them
-                       vote_parsed_command = vote_command;
-                       vote_parsed_display = strcat("^1", vote_command, " (^7", victim.netname, "^1): ", "todo");
+                       entity victim = GetIndexedEntity(argc, (startpos + 1));
+                       float accepted = VerifyClientEntity(victim, TRUE, FALSE);
+                       
+                       if(accepted > 0)
+                       {
+                               string reason = ((argc > next_token) ? substring(vote_command, argv_start_index(next_token), argv_end_index(-1) - 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;
+                               
+                               vote_parsed_command = strcat(first_command, " # ", ftos(num_for_edict(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; }
                        
                        break;
                }
@@ -685,7 +703,7 @@ void VoteCommand_master(float request, entity caller, float argc, string vote_co
                                                
                                                if not(caller.vote_master) { print_to(caller, "^1You do not have vote master privelages."); }
                                                else if not(VoteCommand_checknasty(vote_command)) { print_to(caller, "^1Syntax error in command, see 'vhelp' for more info."); }
-                                               else if not(VoteCommand_parse(caller, vote_command, autocvar_sv_vote_master_commands, 3, argc)) { print_to(caller, "^1This command is not acceptable, see 'vhelp' for more info."); }
+                                               else if not(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
                                                {
@@ -717,8 +735,13 @@ void VoteCommand_master(float request, entity caller, float argc, string vote_co
                                        
                                        default: // calling a vote for master
                                        {
+                                               float spectators_allowed = ((autocvar_sv_vote_nospectators != 2) 
+                                                       || ((autocvar_sv_vote_nospectators == 1) && inWarmupStage) 
+                                                       || (autocvar_sv_vote_nospectators == 0));
+                                               
                                                if not(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 && (caller.classname != "player"))) { 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
@@ -899,7 +922,7 @@ void VoteCommand_(float request)
        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) \
-       VOTE_COMMAND("master", VoteCommand_master(request, caller, arguments, command), "TODO", VC_ASGNMNT_CLIENTONLY) \
+       VOTE_COMMAND("master", VoteCommand_master(request, caller, arguments, command), "Full control over all voting and vote commands", VC_ASGNMNT_CLIENTONLY) \
        VOTE_COMMAND("no", VoteCommand_no(request, caller), "Select no in current vote", VC_ASGNMNT_CLIENTONLY) \
        VOTE_COMMAND("status", VoteCommand_status(request, caller), "Prints information about current vote", VC_ASGNMNT_BOTH) \
        VOTE_COMMAND("stop", VoteCommand_stop(request, caller), "Immediately end a vote", VC_ASGNMNT_BOTH) \
@@ -912,17 +935,16 @@ void VoteCommand_macro_help(entity caller, float argc)
        
        if(argc == 2) // help display listing all commands
        {
-               print_to(caller, strcat("\nUsage:^3 ", command_origin, " vote COMMAND...^7, where possible commands are:"));
-               
+               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)); } }
                        
                VOTE_COMMANDS(0, caller, 0, "")
                #undef VOTE_COMMAND
                
-               print_to(caller, strcat("For help about specific commands, type ", command_origin, " vote help COMMAND"));
-               print_to(caller, "^7You can call a vote for or execute these commands:");
-               print_to(caller, strcat("^3", autocvar_sv_vote_commands, "^7 and maybe further ^3arguments^7"));
+               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
        {