diff options
-rw-r--r-- | src/game/g_admin.c | 101 | ||||
-rw-r--r-- | src/game/g_admin.h | 1 |
2 files changed, 102 insertions, 0 deletions
diff --git a/src/game/g_admin.c b/src/game/g_admin.c index 05f43f4..e729b40 100644 --- a/src/game/g_admin.c +++ b/src/game/g_admin.c @@ -394,6 +394,11 @@ g_admin_cmd_t g_admin_cmds[ ] = {"scrim", G_admin_scrim, "scrim", "toggles scrim mode", "[on|off]", + }, + + {"give", G_admin_give, "give", + "give funds to a player", + "[^3name|slot#^7] [^3amount^7]" } }; @@ -5614,6 +5619,20 @@ static qboolean G_admin_global_unpause( gentity_t *ent, int skiparg ) return qtrue; } +static qboolean is_numeric(const char *str) +{ + const char *p; + + if (!*str) + return qfalse; + + for (p = str; *p; p++) + if (*p < '0' || *p > '9') + return qfalse; + + return qtrue; +} + qboolean G_admin_pause( gentity_t *ent, int skiparg ) { int pids[ MAX_CLIENTS ]; @@ -7635,3 +7654,85 @@ qboolean G_admin_scrim(gentity_t *ent, int skiparg ) return qtrue; } + +qboolean G_admin_give(gentity_t *ent, int skiparg) +{ + char arg_name_raw[MAX_NAME_LENGTH]; + char arg_name[MAX_NAME_LENGTH]; + char arg_amount[30]; + int target_id, amount; + gentity_t *target; + const char *currency; + + if (G_SayArgc() < 3 + skiparg) { + ADMP("^3!give: ^7usage: !give [player] [amount]\n"); + return qfalse; + } + + G_SayArgv(1 + skiparg, arg_name_raw, sizeof(arg_name_raw)); + G_SanitiseString(arg_name_raw, arg_name, sizeof(arg_name)); + + if (is_numeric(arg_name)) { + target_id = atoi(arg_name); + + if (target_id < 0 || target_id >= MAX_CLIENTS) { + ADMP(va("^3!give: ^7invalid client number\n")); + return qfalse; + } + } else { + int pids[ MAX_CLIENTS ]; + + if (G_ClientNumbersFromString(arg_name, pids) != 1) { + char error[MAX_STRING_CHARS]; + + G_MatchOnePlayer(pids, error, sizeof(error)); + ADMP(va("^3!give: ^7%s\n", error)); + return qfalse; + } + + target_id = pids[0]; + } + + + target = g_entities + target_id; + + if (!target->client || + target->client->pers.connected != CON_CONNECTED) { + invalid_target: + ADMP("^3!give: ^7invalid target\n"); + return qfalse; + } + + G_SayArgv(2 + skiparg, arg_amount, sizeof(arg_amount)); + amount = atoi(arg_amount); + + switch (target->client->pers.teamSelection) { + case PTE_ALIENS: + if (amount < -9 || amount > 9) { + too_big: + ADMP("^3!give: ^7amount is too big\n"); + return qfalse; + } + + currency = "evo"; + break; + + case PTE_HUMANS: + if (amount < -2000 || amount > 2000) + goto too_big; + + currency = "credit"; + break; + + default: + goto invalid_target; + } + + G_AddCreditToClient(target->client, amount, qtrue); + AP(va("print \"^3!give: ^7%s^7 was given %i %s%s by ^7%s^7\n\"", + target->client->pers.netname, amount, currency, + (abs(amount) != 1 ? "s" : ""), + ent ? G_admin_adminPrintName(ent) : "console")); + + return qtrue; +} diff --git a/src/game/g_admin.h b/src/game/g_admin.h index f921d2e..c7d61d7 100644 --- a/src/game/g_admin.h +++ b/src/game/g_admin.h @@ -268,6 +268,7 @@ qboolean G_admin_hstage( gentity_t *ent, int skiparg ); qboolean G_admin_astage( gentity_t *ent, int skiparg ); qboolean G_admin_bubble( gentity_t *ent, int skiparg ); qboolean G_admin_scrim( gentity_t *ent, int skiparg ); +qboolean G_admin_give( gentity_t *ent, int skiparg ); void G_admin_print( gentity_t *ent, char *m ); void G_admin_buffer_print( gentity_t *ent, char *m ); |