X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fcommand%2Fcmd.qc;h=d38baf784a49ebac0ff823fb3f789edba57dda29;hp=beb04103628d7e52e3a0b5890e7d5fb9772fb6cb;hb=6cc2d1aa115907d16ae84fb07c3fe6c3329cd9b5;hpb=2ea0c61448fe435ecc8ff255b1fd9bd482ed41fe diff --git a/qcsrc/server/command/cmd.qc b/qcsrc/server/command/cmd.qc index beb0410362..d38baf784a 100644 --- a/qcsrc/server/command/cmd.qc +++ b/qcsrc/server/command/cmd.qc @@ -8,7 +8,6 @@ #include "../campaign.qh" #include "../cheats.qh" #include "../cl_player.qh" -#include "../g_triggers.qh" #include "../ipban.qh" #include "../mapvoting.qh" #include "../scores.qh" @@ -17,7 +16,7 @@ #include "../mutators/mutators_include.qh" #ifdef SVQC - #include "../vehicles/vehicle.qh" + #include "../../common/vehicles/all.qh" #endif #include "../../common/constants.qh" @@ -27,7 +26,7 @@ #include "../../common/teams.qh" #include "../../common/util.qh" -#include "../../common/monsters/all.qh" +#include "../../common/monsters/all.qc" #include "../../common/monsters/spawn.qh" #include "../../common/monsters/sv_monsters.qh" @@ -94,7 +93,7 @@ void ClientCommand_checkfail(float request, string command) // internal command, { case CMD_REQUEST_COMMAND: { - printf("CHECKFAIL: %s (%s) epically failed check %s\n", self.netname, self.netaddress, substring(command, argv_start_index(1), argv_end_index(-1) - argv_start_index(1))); + LOG_INFOF("CHECKFAIL: %s (%s) epically failed check %s\n", self.netname, self.netaddress, substring(command, argv_start_index(1), argv_end_index(-1) - argv_start_index(1))); self.checkfail = 1; return; // never fall through to usage } @@ -221,163 +220,6 @@ void ClientCommand_join(float request) } } -void ClientCommand_mobedit(float request, float argc) -{ - switch(request) - { - case CMD_REQUEST_COMMAND: - { - if(argv(1) && argv(2)) - { - makevectors(self.v_angle); - WarpZone_TraceLine(self.origin + self.view_ofs, self.origin + self.view_ofs + v_forward * 100, MOVE_NORMAL, self); - - if(!autocvar_g_monsters_edit) { sprint(self, "Monster property editing is not enabled.\n"); return; } - if(trace_ent.flags & FL_MONSTER) - { - if(trace_ent.realowner != self) { sprint(self, "That monster does not belong to you.\n"); return; } - switch(argv(1)) - { - case "skin": - { - if(trace_ent.monsterid != MON_MAGE) - trace_ent.skin = stof(argv(2)); - return; - } - case "movetarget": - { - trace_ent.monster_moveflags = stof(argv(2)); - return; - } - } - } - } - } - default: - sprint(self, "Incorrect parameters for ^2mobedit^7\n"); - case CMD_REQUEST_USAGE: - { - sprint(self, "\nUsage:^3 cmd mobedit [argument]\n"); - sprint(self, " Where 'argument' can be skin or movetarget.\n"); - sprint(self, " Aim at your monster to edit its properties.\n"); - return; - } - } -} - -void ClientCommand_mobkill(float request) -{ - switch(request) - { - case CMD_REQUEST_COMMAND: - { - makevectors(self.v_angle); - WarpZone_TraceLine(self.origin + self.view_ofs, self.origin + self.view_ofs + v_forward * 100, MOVE_NORMAL, self); - - if(trace_ent.flags & FL_MONSTER) - { - if(trace_ent.realowner != self) - { - sprint(self, "That monster does not belong to you.\n"); - return; - } - sprint(self, strcat("Your pet '", trace_ent.monster_name, "' has been brutally mutilated.\n")); - Damage (trace_ent, world, world, trace_ent.health + trace_ent.max_health + 200, DEATH_KILL, trace_ent.origin, '0 0 0'); - return; - } - } - - default: - sprint(self, "Incorrect parameters for ^2mobkill^7\n"); - case CMD_REQUEST_USAGE: - { - sprint(self, "\nUsage:^3 cmd mobkill\n"); - sprint(self, " Aim at your monster to kill it.\n"); - return; - } - } -} - -void ClientCommand_mobspawn(float request, float argc) -{ - switch(request) - { - case CMD_REQUEST_COMMAND: - { - entity e; - string tospawn; - float moveflag, monstercount = 0; - - moveflag = (argv(2) ? stof(argv(2)) : 1); // follow owner if not defined - tospawn = strtolower(argv(1)); - - if(tospawn == "list") - { - sprint(self, monsterlist_reply); - return; - } - - FOR_EACH_MONSTER(e) - { - if(e.realowner == self) - ++monstercount; - } - - if(autocvar_g_monsters_max <= 0 || autocvar_g_monsters_max_perplayer <= 0) { sprint(self, "Monster spawning is disabled.\n"); return; } - else if(!IS_PLAYER(self)) { sprint(self, "You can't spawn monsters while spectating.\n"); return; } - else if(MUTATOR_CALLHOOK(AllowMobSpawning)) { sprint(self, "Monster spawning is currently disabled by a mutator.\n"); return; } - else if(!autocvar_g_monsters) { Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_MONSTERS_DISABLED); return; } - else if(self.vehicle) { sprint(self, "You can't spawn monsters while driving a vehicle.\n"); return; } - else if(self.frozen) { sprint(self, "You can't spawn monsters while frozen.\n"); return; } - else if(autocvar_g_campaign) { sprint(self, "You can't spawn monsters in campaign mode.\n"); return; } - else if(self.deadflag != DEAD_NO) { sprint(self, "You can't spawn monsters while dead.\n"); return; } - else if(monstercount >= autocvar_g_monsters_max_perplayer) { sprint(self, "You have spawned too many monsters, kill some before trying to spawn any more.\n"); return; } - else if(totalspawned >= autocvar_g_monsters_max) { sprint(self, "The global maximum monster count has been reached, kill some before trying to spawn any more.\n"); return; } - else if(tospawn != "") - { - float found = 0, i; - entity mon; - - for(i = MON_FIRST; i <= MON_LAST; ++i) - { - mon = get_monsterinfo(i); - if(mon.netname == tospawn) - { - found = true; - break; - } - } - - if(found || tospawn == "random") - { - totalspawned += 1; - - makevectors(self.v_angle); - WarpZone_TraceBox (CENTER_OR_VIEWOFS(self), PL_MIN, PL_MAX, CENTER_OR_VIEWOFS(self) + v_forward * 150, true, self); - //WarpZone_TraceLine(self.origin + self.view_ofs, self.origin + self.view_ofs + v_forward * 150, MOVE_NORMAL, self); - - e = spawnmonster(tospawn, 0, self, self, trace_endpos, false, false, moveflag); - - sprint(self, strcat("Spawned ", e.monster_name, "\n")); - - return; - } - } - } - - default: - sprint(self, "Incorrect parameters for ^2mobspawn^7\n"); - case CMD_REQUEST_USAGE: - { - sprint(self, "\nUsage:^3 cmd mobspawn [movetype]\n"); - sprint(self, " See 'cmd mobspawn list' for available monsters.\n"); - sprint(self, " Argument 'random' spawns a random monster.\n"); - sprint(self, " Monster will follow the owner if second argument is not defined.\n"); - return; - } - } -} - void ClientCommand_physics(float request, float argc) { switch(request) @@ -385,7 +227,7 @@ void ClientCommand_physics(float request, float argc) case CMD_REQUEST_COMMAND: { string command = strtolower(argv(1)); - + if(!autocvar_g_physics_clientselect) { sprint(self, "Client physics selection is currently disabled.\n"); @@ -397,7 +239,7 @@ void ClientCommand_physics(float request, float argc) sprint(self, strcat("Available physics sets: \n\n", autocvar_g_physics_clientselect_options, " default\n")); return; } - + if(Physics_Valid(command) || command == "default") { stuffcmd(self, strcat("\nseta cl_physics ", command, "\nsendcvar cl_physics\n")); @@ -405,7 +247,7 @@ void ClientCommand_physics(float request, float argc) return; } } - + default: sprint(self, strcat("Current physics set: ^3", self.cvar_cl_physics, "\n")); case CMD_REQUEST_USAGE: @@ -718,7 +560,18 @@ void ClientCommand_tell(float request, float argc, string command) { if(tell_to != self) // and we're allowed to send to them :D { - Say(self, false, tell_to, substring(command, argv_start_index(next_token), argv_end_index(-1) - argv_start_index(next_token)), true); + // workaround for argv indexes indexing ascii chars instead of utf8 chars + // In this case when the player name contains utf8 chars + // the message gets partially trimmed in the beginning. + // Potentially this bug affects any substring call that uses + // argv_start_index and argv_end_index. + + string utf8_enable_save = cvar_string("utf8_enable"); + cvar_set("utf8_enable", "0"); + string msg = substring(command, argv_start_index(next_token), argv_end_index(-1) - argv_start_index(next_token)); + cvar_set("utf8_enable", utf8_enable_save); + + Say(self, false, tell_to, msg, true); return; } else { print_to(self, "You can't ^2tell^7 a message to yourself."); return; } @@ -807,9 +660,6 @@ void ClientCommand_(float request) CLIENT_COMMAND("clientversion", ClientCommand_clientversion(request, arguments), "Release version of the game") \ CLIENT_COMMAND("mv_getpicture", ClientCommand_mv_getpicture(request, arguments), "Retrieve mapshot picture from the server") \ CLIENT_COMMAND("join", ClientCommand_join(request), "Become a player in the game") \ - CLIENT_COMMAND("mobedit", ClientCommand_mobedit(request, arguments), "Edit your monster's properties") \ - CLIENT_COMMAND("mobkill", ClientCommand_mobkill(request), "Kills your monster") \ - CLIENT_COMMAND("mobspawn", ClientCommand_mobspawn(request, arguments), "Spawn monsters infront of yourself") \ CLIENT_COMMAND("physics", ClientCommand_physics(request, arguments), "Change physics set") \ CLIENT_COMMAND("ready", ClientCommand_ready(request), "Qualify as ready to end warmup stage (or restart server if allowed)") \ CLIENT_COMMAND("say", ClientCommand_say(request, arguments, command), "Print a message to chat to all players") \ @@ -821,6 +671,7 @@ void ClientCommand_(float request) CLIENT_COMMAND("suggestmap", ClientCommand_suggestmap(request, arguments), "Suggest a map to the mapvote at match end") \ CLIENT_COMMAND("tell", ClientCommand_tell(request, arguments, command), "Send a message directly to a player") \ CLIENT_COMMAND("voice", ClientCommand_voice(request, arguments, command), "Send voice message via sound") \ + CLIENT_COMMAND("minigame", ClientCommand_minigame(request, arguments, command), "Start a minigame") \ /* nothing */ void ClientCommand_macro_help() @@ -889,11 +740,6 @@ void SV_ParseClientCommand(string command) float argc = tokenize_console(command); - // for the mutator hook system - cmd_name = strtolower(argv(0)); - cmd_argc = argc; - cmd_string = command; - // Guide for working with argc arguments by example: // argc: 1 - 2 - 3 - 4 // argv: 0 - 1 - 2 - 3 @@ -942,7 +788,7 @@ void SV_ParseClientCommand(string command) return; } } - else if(MUTATOR_CALLHOOK(SV_ParseClientCommand)) + else if(MUTATOR_CALLHOOK(SV_ParseClientCommand, strtolower(argv(0)), argc, command)) { return; // handled by a mutator }