X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fcommand%2Fsv_cmd.qc;h=81ef50aeda4a3120c08b71c2c80e77f09ead2c63;hb=1ba558d5de54105a1df52f0be896b53663862df6;hp=c917874c358f5d345cd740fcffa194033f9f54c7;hpb=21d066a6d9db0539908d0d05ced5d34b6375bdb1;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/command/sv_cmd.qc b/qcsrc/server/command/sv_cmd.qc index c917874c3..81ef50aed 100644 --- a/qcsrc/server/command/sv_cmd.qc +++ b/qcsrc/server/command/sv_cmd.qc @@ -1,35 +1,30 @@ #include "sv_cmd.qh" -#include "_mod.qh" +#include #include - -#include "banning.qh" -#include "cmd.qh" -#include "common.qh" -#include "getreplies.qh" -#include "radarmap.qh" - -#include "../anticheat.qh" -#include "../campaign.qh" -#include "../client.qh" -#include "../player.qh" -#include "../g_world.qh" -#include "../ipban.qh" -#include "../teamplay.qh" - -#include "../bot/api.qh" - -#include #include - -#include -#include #include +#include +#include #include #include #include - -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // used by GameCommand_make_mapinfo() void make_mapinfo_Think(entity this) @@ -133,8 +128,8 @@ void GameCommand_adminmsg(int request, int argc) sprint(client, strcat("\{1}\{13}^3", GetCallerName(NULL), "^7: ", admin_message, "\n")); } - successful = strcat(successful, (successful ? ", " : ""), playername(client, false)); - LOG_TRACE("Message sent to ", playername(client, false)); + successful = strcat(successful, (successful ? ", " : ""), playername(client.netname, client.team, false)); + LOG_TRACE("Message sent to ", playername(client.netname, client.team, false)); continue; } @@ -146,15 +141,15 @@ void GameCommand_adminmsg(int request, int argc) } default: - LOG_INFO("Incorrect parameters for ^2adminmsg^7"); + LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0)); case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd adminmsg clients \"message\" [infobartime]"); - LOG_INFO(" 'clients' is a list (separated by commas) of player entity ID's or nicknames"); - LOG_INFO(" If infobartime is provided, the message will be sent to infobar."); - LOG_INFO(" Otherwise, it will just be sent as a centerprint message."); - LOG_INFO("Examples: adminmsg 2,4 \"this infomessage will last for ten seconds\" 10"); - LOG_INFO(" adminmsg 2,5 \"this message will be a centerprint\""); + LOG_HELP("Usage:^3 sv_cmd adminmsg \"\" []"); + LOG_HELP(" is a list (separated by commas) of player entity ID's or nicknames"); + LOG_HELP(" If is provided, the message will be sent to infobar."); + LOG_HELP(" Otherwise, it will just be sent as a centerprint message."); + LOG_HELP("Examples: adminmsg 2,4 \"this infomessage will last for ten seconds\" 10"); + LOG_HELP(" adminmsg 2,5 \"this message will be a centerprint\""); return; } } @@ -173,8 +168,8 @@ void GameCommand_allready(int request) default: case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd allready"); - LOG_INFO(" No arguments required."); + LOG_HELP("Usage:^3 sv_cmd allready"); + LOG_HELP(" No arguments required."); return; } } @@ -201,9 +196,9 @@ void GameCommand_allspec(int request, int argc) default: case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd allspec [reason]"); - LOG_INFO(" Where 'reason' is an optional argument for explanation of allspec command."); - LOG_INFO("See also: ^2moveplayer, shuffleteams^7"); + LOG_HELP("Usage:^3 sv_cmd allspec []"); + LOG_HELP(" Where is an optional argument for explanation of allspec command."); + LOG_HELP("See also: ^2moveplayer, shuffleteams^7"); return; } } @@ -230,11 +225,11 @@ void GameCommand_anticheat(int request, int argc) } default: - LOG_INFO("Incorrect parameters for ^2anticheat^7"); + LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0)); case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd anticheat client"); - LOG_INFO(" 'client' is the entity number or name of the player."); + LOG_HELP("Usage:^3 sv_cmd anticheat "); + LOG_HELP(" is the entity number or name of the player."); return; } } @@ -305,9 +300,9 @@ void GameCommand_bbox(int request) default: case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd bbox"); - LOG_INFO(" No arguments required."); - LOG_INFO("See also: ^2gettaginfo, trace^7"); + LOG_HELP("Usage:^3 sv_cmd bbox"); + LOG_HELP(" No arguments required."); + LOG_HELP("See also: ^2gettaginfo, trace^7"); return; } } @@ -330,6 +325,7 @@ void GameCommand_bot_cmd(int request, int argc, string command) { cvar_settemp("bot_vs_human", "0"); cvar_settemp("minplayers", "0"); + cvar_settemp("minplayers_per_team", "0"); cvar_settemp("bot_number", "0"); bot_fixcount(); cvar_settemp("bot_number", argv(2)); @@ -362,6 +358,7 @@ void GameCommand_bot_cmd(int request, int argc, string command) { cvar_settemp("bot_vs_human", "0"); cvar_settemp("minplayers", "0"); + cvar_settemp("minplayers_per_team", "0"); cvar_settemp("bot_number", "0"); bot_fixcount(); cvar_settemp("bot_number", argv(3)); @@ -430,16 +427,16 @@ void GameCommand_bot_cmd(int request, int argc, string command) } default: - LOG_INFO("Incorrect parameters for ^2bot_cmd^7"); + LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0)); case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd bot_cmd client command [argument]"); - LOG_INFO(" 'client' can be either the name of the bot or a progressive number (not the entity number!)"); - LOG_INFO(" can also be '*' or 'all' to allow sending the command to all the bots"); - LOG_INFO(" For full list of commands, see bot_cmd help [command]."); - LOG_INFO("Examples: sv_cmd bot_cmd 1 cc \"say something\""); - LOG_INFO(" sv_cmd bot_cmd 1 presskey jump"); - LOG_INFO(" sv_cmd bot_cmd * pause"); + LOG_HELP("Usage:^3 sv_cmd bot_cmd []"); + LOG_HELP(" can be either the name of the bot or a progressive number (not the entity number!)"); + LOG_HELP(" can also be '*' or 'all' to allow sending the command to all the bots"); + LOG_HELP(" For full list of commands, see bot_cmd help []."); + LOG_HELP("Examples: sv_cmd bot_cmd 1 cc \"say something\""); + LOG_HELP(" sv_cmd bot_cmd 1 presskey jump"); + LOG_HELP(" sv_cmd bot_cmd * pause"); return; } } @@ -462,8 +459,8 @@ void GameCommand_cointoss(int request, int argc) default: case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd cointoss [result1 result2]"); - LOG_INFO(" Where 'result1' and 'result2' are user created options."); + LOG_HELP("Usage:^3 sv_cmd cointoss [ ]"); + LOG_HELP(" Where and are user created options."); return; } } @@ -500,13 +497,13 @@ void GameCommand_database(int request, int argc) } default: - LOG_INFO("Incorrect parameters for ^2database^7"); + LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0)); case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd database action filename"); - LOG_INFO(" Where 'action' is the command to complete,"); - LOG_INFO(" and 'filename' is what it acts upon."); - LOG_INFO(" Full list of commands here: \"save, dump, load.\""); + LOG_HELP("Usage:^3 sv_cmd database "); + LOG_HELP(" Where is the command to complete,"); + LOG_HELP(" and is what it acts upon."); + LOG_HELP(" Full list of commands here: save, dump, load."); return; } } @@ -529,7 +526,7 @@ void GameCommand_defer_clear(int request, int argc) if (accepted > 0) { stuffcmd(client, "defer clear\n"); - LOG_INFO("defer clear stuffed to ", playername(client, false)); + LOG_INFO("defer clear stuffed to ", playername(client.netname, client.team, false)); } else { LOG_INFO("defer_clear: ", GetClientErrorString(accepted, argv(1)), "."); } @@ -538,12 +535,12 @@ void GameCommand_defer_clear(int request, int argc) } default: - LOG_INFO("Incorrect parameters for ^2defer_clear^7"); + LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0)); case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd defer_clear client"); - LOG_INFO(" 'client' is the entity number or name of the player."); - LOG_INFO("See also: ^2defer_clear_all^7"); + LOG_HELP("Usage:^3 sv_cmd defer_clear "); + LOG_HELP(" is the entity number or name of the player."); + LOG_HELP("See also: ^2defer_clear_all^7"); return; } } @@ -570,9 +567,9 @@ void GameCommand_defer_clear_all(int request) default: case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd defer_clear_all"); - LOG_INFO(" No arguments required."); - LOG_INFO("See also: ^2defer_clear^7"); + LOG_HELP("Usage:^3 sv_cmd defer_clear_all"); + LOG_HELP(" No arguments required."); + LOG_HELP("See also: ^2defer_clear^7"); return; } } @@ -593,18 +590,25 @@ void GameCommand_delrec(int request, int argc) // perhaps merge later with reco } default: - LOG_INFO("Incorrect parameters for ^2delrec^7"); + LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0)); case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd delrec ranking [map]"); - LOG_INFO(" 'ranking' is which ranking level to clear up to, "); - LOG_INFO(" it will clear all records up to nth place."); - LOG_INFO(" if 'map' is not provided it will use current map."); + LOG_HELP("Usage:^3 sv_cmd delrec []"); + LOG_HELP(" is which ranking level to clear up to, "); + LOG_HELP(" it will clear all records up to nth place."); + LOG_HELP(" if is not provided it will use current map."); return; } } } +void print_Effect_Index(int d, string effect_name) +{ + // this is inside a function to avoid expanding it on compilation everytime + LOG_INFO("effect ", effect_name, " is ", ftos(_particleeffectnum(effect_name)), "\n"); + db_put(d, effect_name, "1"); +} + void GameCommand_effectindexdump(int request) { switch (request) @@ -616,78 +620,43 @@ void GameCommand_effectindexdump(int request) d = db_create(); LOG_INFO("begin of effects list"); - db_put(d, "TE_GUNSHOT", "1"); - LOG_INFO("effect TE_GUNSHOT is ", ftos(_particleeffectnum("TE_GUNSHOT"))); - db_put(d, "TE_GUNSHOTQUAD", "1"); - LOG_INFO("effect TE_GUNSHOTQUAD is ", ftos(_particleeffectnum("TE_GUNSHOTQUAD"))); - db_put(d, "TE_SPIKE", "1"); - LOG_INFO("effect TE_SPIKE is ", ftos(_particleeffectnum("TE_SPIKE"))); - db_put(d, "TE_SPIKEQUAD", "1"); - LOG_INFO("effect TE_SPIKEQUAD is ", ftos(_particleeffectnum("TE_SPIKEQUAD"))); - db_put(d, "TE_SUPERSPIKE", "1"); - LOG_INFO("effect TE_SUPERSPIKE is ", ftos(_particleeffectnum("TE_SUPERSPIKE"))); - db_put(d, "TE_SUPERSPIKEQUAD", "1"); - LOG_INFO("effect TE_SUPERSPIKEQUAD is ", ftos(_particleeffectnum("TE_SUPERSPIKEQUAD"))); - db_put(d, "TE_WIZSPIKE", "1"); - LOG_INFO("effect TE_WIZSPIKE is ", ftos(_particleeffectnum("TE_WIZSPIKE"))); - db_put(d, "TE_KNIGHTSPIKE", "1"); - LOG_INFO("effect TE_KNIGHTSPIKE is ", ftos(_particleeffectnum("TE_KNIGHTSPIKE"))); - db_put(d, "TE_EXPLOSION", "1"); - LOG_INFO("effect TE_EXPLOSION is ", ftos(_particleeffectnum("TE_EXPLOSION"))); - db_put(d, "TE_EXPLOSIONQUAD", "1"); - LOG_INFO("effect TE_EXPLOSIONQUAD is ", ftos(_particleeffectnum("TE_EXPLOSIONQUAD"))); - db_put(d, "TE_TAREXPLOSION", "1"); - LOG_INFO("effect TE_TAREXPLOSION is ", ftos(_particleeffectnum("TE_TAREXPLOSION"))); - db_put(d, "TE_TELEPORT", "1"); - LOG_INFO("effect TE_TELEPORT is ", ftos(_particleeffectnum("TE_TELEPORT"))); - db_put(d, "TE_LAVASPLASH", "1"); - LOG_INFO("effect TE_LAVASPLASH is ", ftos(_particleeffectnum("TE_LAVASPLASH"))); - db_put(d, "TE_SMALLFLASH", "1"); - LOG_INFO("effect TE_SMALLFLASH is ", ftos(_particleeffectnum("TE_SMALLFLASH"))); - db_put(d, "TE_FLAMEJET", "1"); - LOG_INFO("effect TE_FLAMEJET is ", ftos(_particleeffectnum("TE_FLAMEJET"))); - db_put(d, "EF_FLAME", "1"); - LOG_INFO("effect EF_FLAME is ", ftos(_particleeffectnum("EF_FLAME"))); - db_put(d, "TE_BLOOD", "1"); - LOG_INFO("effect TE_BLOOD is ", ftos(_particleeffectnum("TE_BLOOD"))); - db_put(d, "TE_SPARK", "1"); - LOG_INFO("effect TE_SPARK is ", ftos(_particleeffectnum("TE_SPARK"))); - db_put(d, "TE_PLASMABURN", "1"); - LOG_INFO("effect TE_PLASMABURN is ", ftos(_particleeffectnum("TE_PLASMABURN"))); - db_put(d, "TE_TEI_G3", "1"); - LOG_INFO("effect TE_TEI_G3 is ", ftos(_particleeffectnum("TE_TEI_G3"))); - db_put(d, "TE_TEI_SMOKE", "1"); - LOG_INFO("effect TE_TEI_SMOKE is ", ftos(_particleeffectnum("TE_TEI_SMOKE"))); - db_put(d, "TE_TEI_BIGEXPLOSION", "1"); - LOG_INFO("effect TE_TEI_BIGEXPLOSION is ", ftos(_particleeffectnum("TE_TEI_BIGEXPLOSION"))); - db_put(d, "TE_TEI_PLASMAHIT", "1"); - LOG_INFO("effect TE_TEI_PLASMAHIT is ", ftos(_particleeffectnum("TE_TEI_PLASMAHIT"))); - db_put(d, "EF_STARDUST", "1"); - LOG_INFO("effect EF_STARDUST is ", ftos(_particleeffectnum("EF_STARDUST"))); - db_put(d, "TR_ROCKET", "1"); - LOG_INFO("effect TR_ROCKET is ", ftos(_particleeffectnum("TR_ROCKET"))); - db_put(d, "TR_GRENADE", "1"); - LOG_INFO("effect TR_GRENADE is ", ftos(_particleeffectnum("TR_GRENADE"))); - db_put(d, "TR_BLOOD", "1"); - LOG_INFO("effect TR_BLOOD is ", ftos(_particleeffectnum("TR_BLOOD"))); - db_put(d, "TR_WIZSPIKE", "1"); - LOG_INFO("effect TR_WIZSPIKE is ", ftos(_particleeffectnum("TR_WIZSPIKE"))); - db_put(d, "TR_SLIGHTBLOOD", "1"); - LOG_INFO("effect TR_SLIGHTBLOOD is ", ftos(_particleeffectnum("TR_SLIGHTBLOOD"))); - db_put(d, "TR_KNIGHTSPIKE", "1"); - LOG_INFO("effect TR_KNIGHTSPIKE is ", ftos(_particleeffectnum("TR_KNIGHTSPIKE"))); - db_put(d, "TR_VORESPIKE", "1"); - LOG_INFO("effect TR_VORESPIKE is ", ftos(_particleeffectnum("TR_VORESPIKE"))); - db_put(d, "TR_NEHAHRASMOKE", "1"); - LOG_INFO("effect TR_NEHAHRASMOKE is ", ftos(_particleeffectnum("TR_NEHAHRASMOKE"))); - db_put(d, "TR_NEXUIZPLASMA", "1"); - LOG_INFO("effect TR_NEXUIZPLASMA is ", ftos(_particleeffectnum("TR_NEXUIZPLASMA"))); - db_put(d, "TR_GLOWTRAIL", "1"); - LOG_INFO("effect TR_GLOWTRAIL is ", ftos(_particleeffectnum("TR_GLOWTRAIL"))); - db_put(d, "TR_SEEKER", "1"); - LOG_INFO("effect TR_SEEKER is ", ftos(_particleeffectnum("TR_SEEKER"))); - db_put(d, "SVC_PARTICLE", "1"); - LOG_INFO("effect SVC_PARTICLE is ", ftos(_particleeffectnum("SVC_PARTICLE"))); + + print_Effect_Index(d, "TE_GUNSHOT"); + print_Effect_Index(d, "TE_GUNSHOTQUAD"); + print_Effect_Index(d, "TE_SPIKE"); + print_Effect_Index(d, "TE_SPIKEQUAD"); + print_Effect_Index(d, "TE_SUPERSPIKE"); + print_Effect_Index(d, "TE_SUPERSPIKEQUAD"); + print_Effect_Index(d, "TE_WIZSPIKE"); + print_Effect_Index(d, "TE_KNIGHTSPIKE"); + print_Effect_Index(d, "TE_EXPLOSION"); + print_Effect_Index(d, "TE_EXPLOSIONQUAD"); + print_Effect_Index(d, "TE_TAREXPLOSION"); + print_Effect_Index(d, "TE_TELEPORT"); + print_Effect_Index(d, "TE_LAVASPLASH"); + print_Effect_Index(d, "TE_SMALLFLASH"); + print_Effect_Index(d, "TE_FLAMEJET"); + print_Effect_Index(d, "EF_FLAME"); + print_Effect_Index(d, "TE_BLOOD"); + print_Effect_Index(d, "TE_SPARK"); + print_Effect_Index(d, "TE_PLASMABURN"); + print_Effect_Index(d, "TE_TEI_G3"); + print_Effect_Index(d, "TE_TEI_SMOKE"); + print_Effect_Index(d, "TE_TEI_BIGEXPLOSION"); + print_Effect_Index(d, "TE_TEI_PLASMAHIT"); + print_Effect_Index(d, "EF_STARDUST"); + print_Effect_Index(d, "TR_ROCKET"); + print_Effect_Index(d, "TR_GRENADE"); + print_Effect_Index(d, "TR_BLOOD"); + print_Effect_Index(d, "TR_WIZSPIKE"); + print_Effect_Index(d, "TR_SLIGHTBLOOD"); + print_Effect_Index(d, "TR_KNIGHTSPIKE"); + print_Effect_Index(d, "TR_VORESPIKE"); + print_Effect_Index(d, "TR_NEHAHRASMOKE"); + print_Effect_Index(d, "TR_NEXUIZPLASMA"); + print_Effect_Index(d, "TR_GLOWTRAIL"); + print_Effect_Index(d, "TR_SEEKER"); + print_Effect_Index(d, "SVC_PARTICLE"); fh = fopen("effectinfo.txt", FILE_READ); while ((s = fgets(fh))) @@ -712,8 +681,8 @@ void GameCommand_effectindexdump(int request) default: case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd effectindexdump"); - LOG_INFO(" No arguments required."); + LOG_HELP("Usage:^3 sv_cmd effectindexdump"); + LOG_HELP(" No arguments required."); return; } } @@ -732,9 +701,9 @@ void GameCommand_extendmatchtime(int request) default: case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd extendmatchtime"); - LOG_INFO(" No arguments required."); - LOG_INFO("See also: ^2reducematchtime^7"); + LOG_HELP("Usage:^3 sv_cmd extendmatchtime"); + LOG_HELP(" No arguments required."); + LOG_HELP("See also: ^2reducematchtime^7"); return; } } @@ -746,10 +715,15 @@ void GameCommand_gametype(int request, int argc) { case CMD_REQUEST_COMMAND: { + if (!world_initialized) + { + LOG_INFOF("This command works only when the server is running."); + return; + } if (argv(1) != "") { string s = argv(1); - Gametype t = MapInfo_Type_FromString(s), tsave = MapInfo_CurrentGametype(); + Gametype t = MapInfo_Type_FromString(s, false), tsave = MapInfo_CurrentGametype(); if (t) { @@ -779,12 +753,12 @@ void GameCommand_gametype(int request, int argc) } default: - LOG_INFO("Incorrect parameters for ^2gametype^7"); + LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0)); case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd gametype mode"); - LOG_INFO(" Where 'mode' is the gametype mode to switch to."); - LOG_INFO("See also: ^2gotomap^7"); + LOG_HELP("Usage:^3 sv_cmd gametype "); + LOG_HELP(" Where is the gametype mode to switch to."); + LOG_HELP("See also: ^2gotomap^7"); return; } } @@ -819,15 +793,14 @@ void GameCommand_gettaginfo(int request, int argc) if (i) { v = gettaginfo(tmp_entity, i); - LOG_INFOF( - "model %s frame %s tag %s index %s parent %s", - tmp_entity.model, ftos(tmp_entity.frame), gettaginfo_name, ftos(i), ftos(gettaginfo_parent) + LOG_HELPF("model %s frame %s tag %s index %s parent %s", + tmp_entity.model, ftos(tmp_entity.frame), gettaginfo_name, ftos(i), ftos(gettaginfo_parent) ); - LOG_INFOF(" vector = %s %s %s", ftos(v.x), ftos(v.y), ftos(v.z)); - LOG_INFOF(" offset = %s %s %s", ftos(gettaginfo_offset.x), ftos(gettaginfo_offset.y), ftos(gettaginfo_offset.z)); - LOG_INFOF(" forward = %s %s %s", ftos(gettaginfo_forward.x), ftos(gettaginfo_forward.y), ftos(gettaginfo_forward.z)); - LOG_INFOF(" right = %s %s %s", ftos(gettaginfo_right.x), ftos(gettaginfo_right.y), ftos(gettaginfo_right.z)); - LOG_INFOF(" up = %s %s %s", ftos(gettaginfo_up.x), ftos(gettaginfo_up.y), ftos(gettaginfo_up.z)); + LOG_HELPF(" vector = %s %s %s", ftos(v.x), ftos(v.y), ftos(v.z)); + LOG_HELPF(" offset = %s %s %s", ftos(gettaginfo_offset.x), ftos(gettaginfo_offset.y), ftos(gettaginfo_offset.z)); + LOG_HELPF(" forward = %s %s %s", ftos(gettaginfo_forward.x), ftos(gettaginfo_forward.y), ftos(gettaginfo_forward.z)); + LOG_HELPF(" right = %s %s %s", ftos(gettaginfo_right.x), ftos(gettaginfo_right.y), ftos(gettaginfo_right.z)); + LOG_HELPF(" up = %s %s %s", ftos(gettaginfo_up.x), ftos(gettaginfo_up.y), ftos(gettaginfo_up.z)); if (argc >= 6) { v.y = -v.y; @@ -845,11 +818,11 @@ void GameCommand_gettaginfo(int request, int argc) } default: - LOG_INFO("Incorrect parameters for ^2gettaginfo^7"); + LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0)); case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd gettaginfo model frame index [command one] [command two]"); - LOG_INFO("See also: ^2bbox, trace^7"); + LOG_HELP("Usage:^3 sv_cmd gettaginfo [] []"); + LOG_HELP("See also: ^2bbox, trace^7"); return; } } @@ -904,11 +877,11 @@ void GameCommand_animbench(int request, int argc) } default: - LOG_INFO("Incorrect parameters for ^2gettaginfo^7"); + LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0)); case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd gettaginfo model frame index [command one] [command two]"); - LOG_INFO("See also: ^2bbox, trace^7"); + LOG_HELP("Usage:^3 sv_cmd animbench "); + LOG_HELP("See also: ^2bbox, trace^7"); return; } } @@ -920,6 +893,11 @@ void GameCommand_gotomap(int request, int argc) { case CMD_REQUEST_COMMAND: { + if (!world_initialized) + { + LOG_INFOF("This command works only when the server is running."); + return; + } if (argv(1)) { LOG_INFO(GotoMap(argv(1))); @@ -928,12 +906,12 @@ void GameCommand_gotomap(int request, int argc) } default: - LOG_INFO("Incorrect parameters for ^2gotomap^7"); + LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0)); case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd gotomap map"); - LOG_INFO(" Where 'map' is the *.bsp file to change to."); - LOG_INFO("See also: ^2gametype^7"); + LOG_HELP("Usage:^3 sv_cmd gotomap "); + LOG_HELP(" Where is the *.bsp file to change to."); + LOG_HELP("See also: ^2gametype^7"); return; } } @@ -960,9 +938,9 @@ void GameCommand_lockteams(int request) default: case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd lockteams"); - LOG_INFO(" No arguments required."); - LOG_INFO("See also: ^2unlockteams^7"); + LOG_HELP("Usage:^3 sv_cmd lockteams"); + LOG_HELP(" No arguments required."); + LOG_HELP("See also: ^2unlockteams^7"); return; } } @@ -986,9 +964,9 @@ void GameCommand_make_mapinfo(int request) default: case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd make_mapinfo"); - LOG_INFO(" No arguments required."); - LOG_INFO("See also: ^2radarmap^7"); + LOG_HELP("Usage:^3 sv_cmd make_mapinfo"); + LOG_HELP(" No arguments required."); + LOG_HELP("See also: ^2radarmap^7"); return; } } @@ -1006,13 +984,13 @@ void GameCommand_moveplayer(int request, int argc) string targets = strreplace(",", " ", argv(1)); string original_targets = strreplace(" ", ", ", targets); string destination = argv(2); + if (destination == "spec") + destination = "spectator"; - string successful, t; - successful = string_null; - - // lets see if the target(s) even actually exist. if ((targets) && (destination)) { + string successful = string_null; + string t; for ( ; targets; ) { t = car(targets); @@ -1029,18 +1007,18 @@ void GameCommand_moveplayer(int request, int argc) } // Where are we putting this player? - if (destination == "spec" || destination == "spectator") + if (destination == "spectator") { if (!IS_SPEC(client) && !IS_OBSERVER(client)) { if (client.caplayer) client.caplayer = 0; PutObserverInServer(client); - successful = strcat(successful, (successful ? ", " : ""), playername(client, false)); + successful = strcat(successful, (successful ? ", " : ""), playername(client.netname, client.team, false)); } else { - LOG_INFO("Player ", ftos(GetFilteredNumber(t)), " (", playername(client, false), ") is already spectating."); + LOG_INFO("Player ", ftos(GetFilteredNumber(t)), " (", playername(client.netname, client.team, false), ") is already spectating."); } continue; } @@ -1051,94 +1029,56 @@ void GameCommand_moveplayer(int request, int argc) if (teamplay) { // set up - float team_id; - float save = client.team_forced; - client.team_forced = 0; + string pl_name = playername(client.netname, client.team, false); + int save = Player_GetForcedTeamIndex(client); + Player_SetForcedTeamIndex(client, TEAM_FORCE_DEFAULT); // find the team to move the player to - team_id = Team_ColorToTeam(destination); + int team_num = Team_ColorToTeam(destination); entity balance; - if (team_id == client.team) // already on the destination team + if (team_num == client.team) // already on the destination team { // keep the forcing undone - LOG_INFO("Player ", ftos(GetFilteredNumber(t)), " (", playername(client, false), ") is already on the ", Team_ColoredFullName(client.team), (targets ? "^7, skipping to next player.\n" : "^7.")); + LOG_INFO("Player ", ftos(GetFilteredNumber(t)), " (", pl_name, ") is already on the ", Team_ColoredFullName(team_num), (targets ? "^7, skipping to next player.\n" : "^7.")); continue; } - else if (team_id == 0) // auto team + else if (team_num == 0) // auto team { balance = TeamBalance_CheckAllowedTeams(client); - team_id = Team_IndexToTeam(TeamBalance_FindBestTeam(balance, client, false)); + team_num = Team_IndexToTeam(TeamBalance_FindBestTeam(balance, client, false)); } else { balance = TeamBalance_CheckAllowedTeams(client); } - client.team_forced = save; + Player_SetForcedTeamIndex(client, save); // Check to see if the destination team is even available - switch (team_id) + int team_id = Team_TeamToIndex(team_num); + if (team_id == -1) { - case NUM_TEAM_1: - { - if (!TeamBalance_IsTeamAllowed(balance, 1)) - { - LOG_INFO("Sorry, can't move player to red team if it doesn't exist."); - TeamBalance_Destroy(balance); - return; - } - TeamBalance_Destroy(balance); - break; - } - case NUM_TEAM_2: - { - if (!TeamBalance_IsTeamAllowed(balance, 2)) - { - LOG_INFO("Sorry, can't move player to blue team if it doesn't exist."); - TeamBalance_Destroy(balance); - return; - } - TeamBalance_Destroy(balance); - break; - } - case NUM_TEAM_3: - { - if (!TeamBalance_IsTeamAllowed(balance, 3)) - { - LOG_INFO("Sorry, can't move player to yellow team if it doesn't exist."); - TeamBalance_Destroy(balance); - return; - } - TeamBalance_Destroy(balance); - break; - } - case NUM_TEAM_4: - { - if (!TeamBalance_IsTeamAllowed(balance, 4)) - { - LOG_INFO("Sorry, can't move player to pink team if it doesn't exist."); - TeamBalance_Destroy(balance); - return; - } - TeamBalance_Destroy(balance); - break; - } - default: - { - LOG_INFO("Sorry, can't move player here if team ", destination, " doesn't exist."); - return; - } + LOG_INFO("Sorry, can't move player here if team ", destination, " doesn't exist."); + TeamBalance_Destroy(balance); + return; } + if (!TeamBalance_IsTeamAllowed(balance, team_id)) + { + LOG_INFOF("Sorry, can't move player to %s team if it doesn't exist.", destination); + TeamBalance_Destroy(balance); + return; + } + TeamBalance_Destroy(balance); // If so, lets continue and finally move the player - client.team_forced = 0; - if (MoveToTeam(client, Team_TeamToIndex(team_id), 6)) + Player_SetForcedTeamIndex(client, TEAM_FORCE_DEFAULT); + if (MoveToTeam(client, team_id, 6)) { - successful = strcat(successful, (successful ? ", " : ""), playername(client, false)); - LOG_INFO("Player ", ftos(GetFilteredNumber(t)), " (", playername(client, false), ") has been moved to the ", Team_ColoredFullName(team_id), "^7."); + successful = strcat(successful, (successful ? ", " : ""), pl_name); + LOG_INFO("Player ", ftos(GetFilteredNumber(t)), " (", pl_name, ") has been moved to the ", Team_ColoredFullName(team_num), "^7."); } else { - LOG_INFO("Unable to move player ", ftos(GetFilteredNumber(t)), " (", playername(client, false), ")"); + LOG_INFO("Unable to move player ", ftos(GetFilteredNumber(t)), " (", pl_name, ")"); } continue; } @@ -1164,16 +1104,16 @@ void GameCommand_moveplayer(int request, int argc) } default: - LOG_INFO("Incorrect parameters for ^2moveplayer^7"); + LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0)); case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd moveplayer clients destination"); - LOG_INFO(" 'clients' is a list (separated by commas) of player entity ID's or nicknames"); - LOG_INFO(" 'destination' is what to send the player to, be it team or spectating"); - LOG_INFO(" Full list of destinations here: \"spec, spectator, red, blue, yellow, pink, auto.\""); - LOG_INFO("Examples: sv_cmd moveplayer 1,3,5 red 3"); - LOG_INFO(" sv_cmd moveplayer 2 spec "); - LOG_INFO("See also: ^2allspec, shuffleteams^7"); + LOG_HELP("Usage:^3 sv_cmd moveplayer "); + LOG_HELP(" is a list (separated by commas) of player entity ID's or nicknames"); + LOG_HELP(" is what to send the player to, be it team or spectating"); + LOG_HELP(" Full list of destinations here: spec, spectator, red, blue, yellow, pink, auto."); + LOG_HELP("Examples: sv_cmd moveplayer 1,3,5 red"); + LOG_HELP(" sv_cmd moveplayer 2 spec"); + LOG_HELP("See also: ^2allspec, shuffleteams^7"); return; } } @@ -1201,8 +1141,8 @@ void GameCommand_nospectators(int request) default: case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd nospectators"); - LOG_INFO(" No arguments required."); + LOG_HELP("Usage:^3 sv_cmd nospectators"); + LOG_HELP(" No arguments required."); return; } } @@ -1222,8 +1162,8 @@ void GameCommand_printstats(int request) default: case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd printstats"); - LOG_INFO(" No arguments required."); + LOG_HELP("Usage:^3 sv_cmd printstats"); + LOG_HELP(" No arguments required."); return; } } @@ -1239,13 +1179,13 @@ void GameCommand_radarmap(int request, int argc) } default: - LOG_INFO("Incorrect parameters for ^2radarmap^7"); + LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0)); case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd radarmap [--force] [--loop] [--quit] [--block | --trace | --sample | --lineblock] [--sharpen N] [--res W H] [--qual Q]"); - LOG_INFO(" The quality factor Q is roughly proportional to the time taken."); - LOG_INFO(" trace supports no quality factor; its result should look like --block with infinite quality factor."); - LOG_INFO("See also: ^2make_mapinfo^7"); + LOG_HELP("Usage:^3 sv_cmd radarmap [--force] [--loop] [--quit] [--block | --trace | --sample | --lineblock] [--sharpen N] [--res W H] [--qual Q]"); + LOG_HELP(" The quality factor Q is roughly proportional to the time taken."); + LOG_HELP(" trace supports no quality factor; its result should look like --block with infinite quality factor."); + LOG_HELP("See also: ^2make_mapinfo^7"); return; } } @@ -1264,9 +1204,9 @@ void GameCommand_reducematchtime(int request) default: case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd reducematchtime"); - LOG_INFO(" No arguments required."); - LOG_INFO("See also: ^2extendmatchtime^7"); + LOG_HELP("Usage:^3 sv_cmd reducematchtime"); + LOG_HELP(" No arguments required."); + LOG_HELP("See also: ^2extendmatchtime^7"); return; } } @@ -1281,6 +1221,7 @@ void GameCommand_setbots(int request, int argc) if (argc >= 2) { cvar_settemp("minplayers", "0"); + cvar_settemp("minplayers_per_team", "0"); cvar_settemp("bot_number", argv(1)); bot_fixcount(); return; @@ -1288,15 +1229,57 @@ void GameCommand_setbots(int request, int argc) } default: - LOG_INFO("Incorrect parameters for ^2setbots^7"); + LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0)); case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd setbots botnumber"); - LOG_INFO(" Where 'botnumber' is the amount of bots to set bot_number cvar to."); - LOG_INFO("See also: ^2bot_cmd^7"); + LOG_HELP("Usage:^3 sv_cmd setbots "); + LOG_HELP(" Where is the amount of bots to set bot_number cvar to."); + LOG_HELP("See also: ^2bot_cmd^7"); + return; + } + } +} + +void shuffleteams() +{ + if (!teamplay) + { + LOG_INFO("Can't shuffle teams when currently not playing a team game."); + return; + } + + FOREACH_CLIENT(IS_PLAYER(it) || it.caplayer, { + if (Player_HasRealForcedTeam(it)) { + // we could theoretically assign forced players to their teams + // and shuffle the rest to fill the empty spots but in practise + // either all players or none are gonna have forced teams + LOG_INFO("Can't shuffle teams because at least one player has a forced team."); return; } + }); + + int number_of_teams = 0; + entity balance = TeamBalance_CheckAllowedTeams(NULL); + for (int i = 1; i <= NUM_TEAMS; ++i) + { + if (TeamBalance_IsTeamAllowed(balance, i)) + { + number_of_teams = max(i, number_of_teams); + } } + TeamBalance_Destroy(balance); + + int team_index = 0; + FOREACH_CLIENT_RANDOM(IS_PLAYER(it) || it.caplayer, { + int target_team_index = team_index + 1; + if (Entity_GetTeamIndex(it) != target_team_index) + { + MoveToTeam(it, target_team_index, 6); + } + team_index = (team_index + 1) % number_of_teams; + }); + + bprint("Successfully shuffled the players around randomly.\n"); } void GameCommand_shuffleteams(int request) @@ -1305,53 +1288,22 @@ void GameCommand_shuffleteams(int request) { case CMD_REQUEST_COMMAND: { - if (!teamplay) - { - LOG_INFO("Can't shuffle teams when currently not playing a team game."); - return; - } - - FOREACH_CLIENT(IS_PLAYER(it) || it.caplayer, { - if (it.team_forced) { - // we could theoretically assign forced players to their teams - // and shuffle the rest to fill the empty spots but in practise - // either all players or none are gonna have forced teams - LOG_INFO("Can't shuffle teams because at least one player has a forced team."); - return; - } - }); - - int number_of_teams = 0; - entity balance = TeamBalance_CheckAllowedTeams(NULL); - for (int i = 1; i <= NUM_TEAMS; ++i) + if (shuffleteams_on_reset_map) { - if (TeamBalance_IsTeamAllowed(balance, i)) - { - number_of_teams = max(i, number_of_teams); - } + bprint("Players will be shuffled when this round is over.\n"); + shuffleteams_on_reset_map = true; } - TeamBalance_Destroy(balance); - - int team_index = 0; - FOREACH_CLIENT_RANDOM(IS_PLAYER(it) || it.caplayer, { - int target_team_index = team_index + 1; - if (Entity_GetTeamIndex(it) != target_team_index) - { - MoveToTeam(it, target_team_index, 6); - } - team_index = (team_index + 1) % number_of_teams; - }); - - bprint("Successfully shuffled the players around randomly.\n"); + else + shuffleteams(); return; } default: case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd shuffleteams"); - LOG_INFO(" No arguments required."); - LOG_INFO("See also: ^2moveplayer, allspec^7"); + LOG_HELP("Usage:^3 sv_cmd shuffleteams"); + LOG_HELP(" No arguments required."); + LOG_HELP("See also: ^2moveplayer, allspec^7"); return; } } @@ -1388,19 +1340,19 @@ void GameCommand_stuffto(int request, int argc) } default: - LOG_INFO("Incorrect parameters for ^2stuffto^7"); + LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0)); case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd stuffto client \"command\""); - LOG_INFO(" 'client' is the entity number or name of the player,"); - LOG_INFO(" and 'command' is the command to be sent to that player."); + LOG_HELP("Usage:^3 sv_cmd stuffto \"\""); + LOG_HELP(" is the entity number or name of the player,"); + LOG_HELP(" and is the command to be sent to that player."); return; } } #else if (request) { - LOG_INFO("stuffto command is not enabled on this server."); + LOG_HELP("stuffto command is not enabled on this server."); return; } #endif @@ -1564,19 +1516,19 @@ void GameCommand_trace(int request, int argc) } } - // no default case, just go straight to invalid + // no default case, just go straight to invalid } } default: - LOG_INFO("Incorrect parameters for ^2trace^7"); + LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0)); case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd trace command [startpos endpos] [endpos_height]"); - LOG_INFO(" Where startpos and endpos are parameters for 'walk' and 'showline' commands,"); - LOG_INFO(" 'endpos_height' is an optional parameter for 'walk' command,"); - LOG_INFO(" Full list of commands here: \"debug, debug2, walk, showline.\""); - LOG_INFO("See also: ^2bbox, gettaginfo^7"); + LOG_HELP("Usage:^3 sv_cmd trace [ ] []"); + LOG_HELP(" Where and are parameters for the 'walk' and 'showline' commands,"); + LOG_HELP(" is an optional parameter for the 'walk' command,"); + LOG_HELP(" Full list of commands here: debug, debug2, walk, showline."); + LOG_HELP("See also: ^2bbox, gettaginfo^7"); return; } } @@ -1603,9 +1555,9 @@ void GameCommand_unlockteams(int request) default: case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd unlockteams"); - LOG_INFO(" No arguments required."); - LOG_INFO("See also: ^2lockteams^7"); + LOG_HELP("Usage:^3 sv_cmd unlockteams"); + LOG_HELP(" No arguments required."); + LOG_HELP("See also: ^2lockteams^7"); return; } } @@ -1640,9 +1592,9 @@ void GameCommand_warp(int request, int argc) default: case CMD_REQUEST_USAGE: { - LOG_INFO("Usage:^3 sv_cmd warp [level]"); - LOG_INFO(" 'level' is the level to change campaign mode to."); - LOG_INFO(" if 'level' is not provided it will change to the next level."); + LOG_HELP("Usage:^3 sv_cmd warp []"); + LOG_HELP(" is the level to change campaign mode to."); + LOG_HELP(" if is not provided it will change to the next level."); return; } } @@ -1663,8 +1615,8 @@ void GameCommand_(int request) default: case CMD_REQUEST_USAGE: { - print("\nUsage:^3 sv_cmd \n"); - print(" No arguments required.\n"); + LOG_HELP("Usage:^3 sv_cmd "); + LOG_HELP(" No arguments required."); return; } } @@ -1710,7 +1662,7 @@ SERVER_COMMAND(warp, "Choose different level in campaign") { GameCommand_warp(re void GameCommand_macro_help() { - FOREACH(SERVER_COMMANDS, true, { LOG_INFOF(" ^2%s^7: %s", it.m_name, it.m_description); }); + FOREACH(SERVER_COMMANDS, true, { LOG_HELPF(" ^2%s^7: %s", it.m_name, it.m_description); }); } float GameCommand_macro_command(int argc, string command) @@ -1757,22 +1709,20 @@ void GameCommand(string command) { if (argc == 1) { - LOG_INFO("Server console commands:"); + LOG_HELP("Server console commands:"); GameCommand_macro_help(); - LOG_INFO("\nBanning commands:"); + LOG_HELP("\nBanning commands:"); BanCommand_macro_help(); - LOG_INFO("\nCommon networked commands:"); + LOG_HELP("\nCommon networked commands:"); CommonCommand_macro_help(NULL); - LOG_INFO("\nGeneric commands shared by all programs:"); + LOG_HELP("\nGeneric commands shared by all programs:"); GenericCommand_macro_help(); - LOG_INFO( - "\nUsage:^3 sv_cmd COMMAND...^7, where possible commands are listed above.\n" - "For help about a specific command, type sv_cmd help COMMAND" - ); + LOG_HELP("\nUsage:^3 sv_cmd ^7, where possible commands are listed above.\n" + "For help about a specific command, type sv_cmd help "); return; }