From: Freddy Date: Wed, 27 Sep 2017 20:01:09 +0000 (+0200) Subject: Kick teamkiller mutator: use a teamkill rate X-Git-Tag: xonotic-v0.8.5~2425^2~6 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=3b72549a0a0b64116ac693d4044621d43e05783f;p=xonotic%2Fxonotic-data.pk3dir.git Kick teamkiller mutator: use a teamkill rate --- diff --git a/mutators.cfg b/mutators.cfg index e2a38f922..6e581fdbc 100644 --- a/mutators.cfg +++ b/mutators.cfg @@ -476,4 +476,5 @@ set g_dynamic_handicap_max 0 "The maximum value of the handicap." // =============== // kick teamkiller // =============== -set g_kick_teamkiller_limit 0 "Limit for teamkills before the client gets dropped." +set g_kick_teamkiller_rate 0 "Limit for teamkills per minute before the client gets dropped." +set g_kick_teamkiller_mintime 2 "Minimum playtime in minutes that is used for teamkill rate calculation" diff --git a/qcsrc/common/mutators/mutator/kick_teamkiller/sv_kick_teamkiller.qc b/qcsrc/common/mutators/mutator/kick_teamkiller/sv_kick_teamkiller.qc index 6355f2524..1772bcc63 100644 --- a/qcsrc/common/mutators/mutator/kick_teamkiller/sv_kick_teamkiller.qc +++ b/qcsrc/common/mutators/mutator/kick_teamkiller/sv_kick_teamkiller.qc @@ -1,12 +1,19 @@ -float autocvar_g_kick_teamkiller_limit; +float autocvar_g_kick_teamkiller_rate; +float autocvar_g_kick_teamkiller_mintime; -REGISTER_MUTATOR(kick_teamkiller, (autocvar_g_kick_teamkiller_limit > 0)); +REGISTER_MUTATOR(kick_teamkiller, (autocvar_g_kick_teamkiller_rate > 0)); MUTATOR_HOOKFUNCTION(kick_teamkiller, PlayerDies) { if (!teamplay) + { return; + } + if (warmup_stage) + { + return; + } entity attacker = M_ARGV(1, entity); if (!IS_REAL_CLIENT(attacker)) { @@ -14,7 +21,10 @@ MUTATOR_HOOKFUNCTION(kick_teamkiller, PlayerDies) } int teamkills = PlayerScore_Get(attacker, SP_TEAMKILLS); - if (teamkills >= autocvar_g_kick_teamkiller_limit) + // don't use the players actual playtime if they just started playing + // to avoid kicking players who only teamkilled by mistake just after joining + float playtime_minutes = max((time - attacker.alivetime)/60.0, autocvar_g_kick_teamkiller_mintime); + if (teamkills >= autocvar_g_kick_teamkiller_rate*playtime_minutes) { Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_QUIT_KICK_TEAMKILL, attacker.netname); dropclient(attacker);