]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/mutators/mutator/kick_teamkiller/sv_kick_teamkiller.qc
New banning systems (ignore, muteban, voteban and playban) and new features for moder...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / mutators / mutator / kick_teamkiller / sv_kick_teamkiller.qc
index 6355f252453c72e94c08a8ed8ac941ffa0f6dff5..5d55fc1cf6cdfe8cf74555c0fd69680fdbb7b68c 100644 (file)
@@ -1,22 +1,76 @@
+#include "sv_kick_teamkiller.qh"
+#include <server/ipban.qh>
 
-float autocvar_g_kick_teamkiller_limit;
+float autocvar_g_kick_teamkiller_rate;
+float autocvar_g_kick_teamkiller_lower_limit;
+int autocvar_g_kick_teamkiller_severity;
+float autocvar_g_kick_teamkiller_bantime;
 
-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))
        {
                return;
        }
 
+       float masksize = autocvar_g_ban_default_masksize;
+       float bantime = autocvar_g_kick_teamkiller_bantime;
+
        int teamkills = PlayerScore_Get(attacker, SP_TEAMKILLS);
-       if (teamkills >= autocvar_g_kick_teamkiller_limit)
+       // use the players actual playtime
+       float playtime = time - CS(attacker).startplaytime;
+       // rate is in teamkills/minutes, playtime in seconds
+       if (teamkills >= autocvar_g_kick_teamkiller_lower_limit &&
+               teamkills >= autocvar_g_kick_teamkiller_rate*playtime/60.0)
        {
-               Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_QUIT_KICK_TEAMKILL, attacker.netname);
-               dropclient(attacker);
+               switch (autocvar_g_kick_teamkiller_severity)
+               {
+                       case 1:
+                       {
+                               if (dropclient_schedule(attacker))
+                                       Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_QUIT_KICK_TEAMKILL, attacker.netname);
+                               return;
+                       }
+                       case 2:
+                       {
+                               attacker.respawn_flags = RESPAWN_SILENT;
+                               Ban_KickBanClient(attacker, bantime, masksize, "Team Killing");
+                               Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_QUIT_KICK_TEAMKILL, attacker.netname);
+                               return;
+                       }
+                       default:
+                       {
+                               attacker.respawn_flags = RESPAWN_SILENT;
+                               string theid = "";
+
+                               if(!PlayerInIPList(attacker, autocvar_g_playban_list))
+                                       theid = cons(theid, attacker.netaddress);
+                               if(!PlayerInIDList(attacker, autocvar_g_playban_list))
+                                       theid = cons(theid, attacker.crypto_idfp);
+
+                               LOG_INFO(strcat("Play-banning player ", GetCallerName(attacker), " (", attacker.netaddress, ")."));
+                               PutObserverInServer(attacker, true, true);
+                               cvar_set("g_playban_list", cons(autocvar_g_playban_list, theid));
+
+                               Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_QUIT_PLAYBAN_TEAMKILL, attacker.netname);
+                               Send_Notification(NOTIF_ONE, attacker, MSG_CENTER, CENTER_QUIT_PLAYBAN_TEAMKILL);
+
+                               if (PlayerInList(attacker, autocvar_g_playban_list))
+                                       TRANSMUTE(Observer, attacker);
+
+                               return;
+                       }
+               }
        }
 }