From: Samual Date: Thu, 11 Aug 2011 10:42:38 +0000 (-0400) Subject: FINALLY done adding all of the commands to clientcommands.qc!! Now it just needs... X-Git-Tag: xonotic-v0.6.0~188^2~28^2~268 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=83661c212bdbf7d620115e24676dc8e61044aaee;p=xonotic%2Fxonotic-data.pk3dir.git FINALLY done adding all of the commands to clientcommands.qc!! Now it just needs some more refining and a lot of testing. --- diff --git a/qcsrc/server/clientcommands.qc b/qcsrc/server/clientcommands.qc index b90151f04..c7d2cefe3 100644 --- a/qcsrc/server/clientcommands.qc +++ b/qcsrc/server/clientcommands.qc @@ -255,87 +255,6 @@ void restartTimer_Think() { return; } -/** - * Checks whether the player who calls the timeout is allowed to do so. - * If so, it initializes the timeout countdown. It also checks whether another - * timeout was already running at this time and reacts correspondingly. - * - * affected globals/fields: .allowedTimeouts, remainingTimeoutTime, remainingLeadTime, - * timeoutInitiator, timeoutStatus, timeoutHandler - * - * This function is called when a player issues the calltimeout command. - */ -void evaluateTimeout() { - if (inWarmupStage && !g_warmup_allow_timeout) - return sprint(self, "^7Error: You can not call a timeout in warmup-stage!\n"); - if (time < game_starttime ) - return sprint(self, "^7Error: You can not call a timeout while the map is being restarted!\n"); - if (timeoutStatus != 2) { - //if the map uses a timelimit make sure that timeout cannot be called right before the map ends - if (autocvar_timelimit) { - //a timelimit was used - local float myTl; - myTl = autocvar_timelimit; - - local float lastPossibleTimeout; - lastPossibleTimeout = (myTl*60) - autocvar_sv_timeout_leadtime - 1; - - if (lastPossibleTimeout < time - game_starttime) - return sprint(self, "^7Error: It is too late to call a timeout now!\n"); - } - } - //player may not call a timeout if he has no calls left - if (self.allowedTimeouts < 1) - return sprint(self, "^7Error: You already used all your timeout calls for this map!\n"); - //now all required checks are passed - self.allowedTimeouts -= 1; - bprint(self.netname, " ^7called a timeout (", ftos(self.allowedTimeouts), " timeouts left)!\n"); //write a bprint who started the timeout (and how many he has left) - remainingTimeoutTime = autocvar_sv_timeout_length; - remainingLeadTime = autocvar_sv_timeout_leadtime; - timeoutInitiator = self; - if (timeoutStatus == 0) { //if another timeout was already active, don't change its status (which was 1 or 2) to 1, only change it to 1 if no timeout was active yet - timeoutStatus = 1; - //create the timeout indicator which centerprints the information to all players and takes care of pausing/unpausing - timeoutHandler = spawn(); - timeoutHandler.think = timeoutHandler_Think; - } - timeoutHandler.nextthink = time; //always let the entity think asap - - //inform all connected clients about the timeout call - Announce("timeoutcalled"); -} - -/** - * Checks whether a player is allowed to resume the game. If he is allowed to do it, - * and the lead time for the timeout is still active, this countdown just will be aborted (the - * game will never be paused). Otherwise the remainingTimeoutTime will be set to the corresponding - * value of the cvar sv_timeout_resumetime. - * - * This function is called when a player issues the resumegame command. - */ -void evaluateTimein() { - if (!timeoutStatus) - return sprint(self, "^7Error: There is no active timeout which could be aborted!\n"); - if (self != timeoutInitiator) - return sprint(self, "^7Error: You may not abort the active timeout. Only the player who called it can do that!\n"); - if (timeoutStatus == 1) { - remainingTimeoutTime = timeoutStatus = 0; - timeoutHandler.nextthink = time; //timeoutHandler has to take care of it immediately - bprint(strcat("^7The timeout was aborted by ", self.netname, " !\n")); - } - else if (timeoutStatus == 2) { - //only shorten the remainingTimeoutTime if it makes sense - if( remainingTimeoutTime > (autocvar_sv_timeout_resumetime + 1) ) { - bprint(strcat("^1Attention: ^7", self.netname, " resumed the game! Prepare for battle!\n")); - remainingTimeoutTime = autocvar_sv_timeout_resumetime; - timeoutHandler.nextthink = time; //timeoutHandler has to take care of it immediately - } - else - sprint(self, "^7Error: Your resumegame call was discarded!\n"); - - } -} - // ======================= // Command Sub-Functions @@ -905,6 +824,204 @@ void ClientCommand_suggestmap(float request, float argc) } } +void ClientCommand_teamstatus(float request) +{ + switch(request) + { + case CC_REQUEST_HELP: + sprint(self, " ^2teamstatus^7: Print detailed score information for all players\n"); + return; + + case CC_REQUEST_COMMAND: + Score_NicePrint(self); + return; // never fall through to usage + + default: + case CC_REQUEST_USAGE: + sprint(self, "\nUsage:^3 cmd teamstatus\n"); + sprint(self, " No arguments required.\n"); + return; + } +} + +void ClientCommand_tell(float request, float argc, string command) +{ + entity e; + + switch(request) + { + case CC_REQUEST_HELP: + sprint(self, " ^2tell^7: Send a message directly to a player\n"); + return; + + case CC_REQUEST_COMMAND: + e = GetCommandPlayerSlotTargetFromTokenizedCommand(argc, 1); + if(e && argc > ParseCommandPlayerSlotTarget_firsttoken) + { + Say(self, FALSE, e, substring(command, argv_start_index(ParseCommandPlayerSlotTarget_firsttoken), argv_end_index(-1) - argv_start_index(ParseCommandPlayerSlotTarget_firsttoken)), TRUE); + } + else + { + if(argc > ParseCommandPlayerSlotTarget_firsttoken) + trigger_magicear_processmessage_forallears(self, -1, world, substring(command, argv_start_index(ParseCommandPlayerSlotTarget_firsttoken), argv_end_index(-1) - argv_start_index(ParseCommandPlayerSlotTarget_firsttoken))); + } + return; // never fall through to usage + + default: + case CC_REQUEST_USAGE: + sprint(self, "\nUsage:^3 cmd tell playerid \n"); + sprint(self, " Where 'playerid' is the entity number of the player to send the 'message' to.\n"); + return; + } +} + +void ClientCommand_timein(float request) +{ + switch(request) + { + case CC_REQUEST_HELP: + sprint(self, " ^2timein^7: Resume the game from being paused with a timeout\n"); + return; + + case CC_REQUEST_COMMAND: + if(self.flags & FL_CLIENT) + { + if(autocvar_sv_timeout) + { + if (!timeoutStatus) + return sprint(self, "^7Error: There is no active timeout which could be aborted!\n"); + if (self != timeoutInitiator) + return sprint(self, "^7Error: You may not abort the active timeout. Only the player who called it can do that!\n"); + + if (timeoutStatus == 1) + { + remainingTimeoutTime = timeoutStatus = 0; + timeoutHandler.nextthink = time; //timeoutHandler has to take care of it immediately + bprint(strcat("^7The timeout was aborted by ", self.netname, " !\n")); + } + else if (timeoutStatus == 2) + { + //only shorten the remainingTimeoutTime if it makes sense + if( remainingTimeoutTime > (autocvar_sv_timeout_resumetime + 1) ) + { + bprint(strcat("^1Attention: ^7", self.netname, " resumed the game! Prepare for battle!\n")); + remainingTimeoutTime = autocvar_sv_timeout_resumetime; + timeoutHandler.nextthink = time; //timeoutHandler has to take care of it immediately + } + else + sprint(self, "^7Error: Your resumegame call was discarded!\n"); + } + } + } + return; // never fall through to usage + + default: + case CC_REQUEST_USAGE: + sprint(self, "\nUsage:^3 cmd timein\n"); + sprint(self, " No arguments required.\n"); + return; + } +} + +void ClientCommand_timeout(float request) // DEAR GOD THIS COMMAND IS TERRIBLE. +{ + switch(request) + { + case CC_REQUEST_HELP: + sprint(self, " ^2timeout^7: Call a timeout which pauses the game for certain amount of time unless unpaused\n"); + return; + + case CC_REQUEST_COMMAND: + if(self.flags & FL_CLIENT) + { + if(autocvar_sv_timeout) + { + if(self.classname == "player") + { + if(votecalled) + sprint(self, "^7Error: you can not call a timeout while a vote is active!\n"); + else + { + if (inWarmupStage && !g_warmup_allow_timeout) + return sprint(self, "^7Error: You can not call a timeout in warmup-stage!\n"); + if (time < game_starttime ) + return sprint(self, "^7Error: You can not call a timeout while the map is being restarted!\n"); + + if (timeoutStatus != 2) { + //if the map uses a timelimit make sure that timeout cannot be called right before the map ends + if (autocvar_timelimit) { + //a timelimit was used + float myTl; + myTl = autocvar_timelimit; + + float lastPossibleTimeout; + lastPossibleTimeout = (myTl*60) - autocvar_sv_timeout_leadtime - 1; + + if (lastPossibleTimeout < time - game_starttime) + return sprint(self, "^7Error: It is too late to call a timeout now!\n"); + } + } + + //player may not call a timeout if he has no calls left + if (self.allowedTimeouts < 1) + return sprint(self, "^7Error: You already used all your timeout calls for this map!\n"); + + + //now all required checks are passed + self.allowedTimeouts -= 1; + bprint(self.netname, " ^7called a timeout (", ftos(self.allowedTimeouts), " timeouts left)!\n"); //write a bprint who started the timeout (and how many he has left) + remainingTimeoutTime = autocvar_sv_timeout_length; + remainingLeadTime = autocvar_sv_timeout_leadtime; + timeoutInitiator = self; + if (timeoutStatus == 0) { //if another timeout was already active, don't change its status (which was 1 or 2) to 1, only change it to 1 if no timeout was active yet + timeoutStatus = 1; + //create the timeout indicator which centerprints the information to all players and takes care of pausing/unpausing + timeoutHandler = spawn(); + timeoutHandler.think = timeoutHandler_Think; + } + timeoutHandler.nextthink = time; //always let the entity think asap + + //inform all connected clients about the timeout call + Announce("timeoutcalled"); + } + } + else + sprint(self, "^7Error: only players can call a timeout!\n"); + } + } + return; // never fall through to usage + + default: + case CC_REQUEST_USAGE: + sprint(self, "\nUsage:^3 cmd timeout\n"); + sprint(self, " No arguments required.\n"); + return; + } +} + +void ClientCommand_voice(float request, float argc, string command) +{ + switch(request) + { + case CC_REQUEST_HELP: + sprint(self, " ^2voice^7: Send voice message via sound\n"); + return; + + case CC_REQUEST_COMMAND: + if(argc >= 3) + VoiceMessage(argv(1), substring(command, argv_start_index(2), argv_end_index(-1) - argv_start_index(2))); + else + VoiceMessage(argv(1), ""); + return; // never fall through to usage + + default: + case CC_REQUEST_USAGE: + sprint(self, "\nUsage:^3 cmd voice\n"); + sprint(self, " FIXME ARGUMENTS UNKNOWN.\n"); + return; + } +} + /* void ClientCommand_(float request) { @@ -983,6 +1100,11 @@ void SV_ParseClientCommand(string command) ClientCommand_sentcvar(CC_REQUEST_HELP, 0, ""); ClientCommand_spectate(CC_REQUEST_HELP); ClientCommand_suggestmap(CC_REQUEST_HELP, 0); + ClientCommand_teamstatus(CC_REQUEST_HELP); + ClientCommand_tell(CC_REQUEST_HELP, 0, ""); + ClientCommand_timein(CC_REQUEST_HELP); + ClientCommand_timeout(CC_REQUEST_HELP); + ClientCommand_voice(CC_REQUEST_HELP, 0, ""); sprint(self, "For help about specific commands, type cmd help COMMAND\n"); return; } @@ -1030,6 +1152,11 @@ void SV_ParseClientCommand(string command) case "sentcvar": ClientCommand_sentcvar(search_request_type, argc, command); break; case "spectate": ClientCommand_spectate(search_request_type); break; case "suggestmap": ClientCommand_suggestmap(search_request_type, argc); break; + case "teamstatus": ClientCommand_teamstatus(search_request_type); break; + case "tell": ClientCommand_tell(search_request_type, argc, command); break; + case "timein": ClientCommand_timein(search_request_type); break; + case "timeout": ClientCommand_timeout(search_request_type); break; + case "voice": ClientCommand_voice(search_request_type, argc, command); break; default: clientcommand(self, command); //print("Invalid command. For a list of supported commands, try cmd help.\n"); diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index 2e8ba3d69..0e57c5c36 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -284,8 +284,6 @@ float orig_slowmo; // contains the value of autocvar_slowmo so that, after timeo .vector lastV_angle; //used when pausing the game in order to force the player to keep his old view angle fixed entity timeoutHandler; //responsible for centerprinting the timeout countdowns and playing sounds void timeoutHandler_Think(); -void evaluateTimeout(); -void evaluateTimein(); string getTimeoutText(float addOneSecond); .float spawnshieldtime;