]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Kick teamkiller mutator: use a teamkill rate
authorFreddy <schro.sb@gmail.com>
Wed, 27 Sep 2017 20:01:09 +0000 (22:01 +0200)
committerFreddy <schro.sb@gmail.com>
Wed, 27 Sep 2017 20:01:09 +0000 (22:01 +0200)
mutators.cfg
qcsrc/common/mutators/mutator/kick_teamkiller/sv_kick_teamkiller.qc

index e2a38f92295a33f5b066f10aa1afd80bce4e2fc9..6e581fdbc4275f88ec421b9cf831f08a8f8506dc 100644 (file)
@@ -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"
index 6355f252453c72e94c08a8ed8ac941ffa0f6dff5..1772bcc63402ed1970031095c9ed33c039f892e9 100644 (file)
@@ -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);