]> 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 f8e364fddca307cab249b853f72c8ec3ac6921a5..5d55fc1cf6cdfe8cf74555c0fd69680fdbb7b68c 100644 (file)
@@ -1,7 +1,10 @@
 #include "sv_kick_teamkiller.qh"
+#include <server/ipban.qh>
 
 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_rate > 0));
 
@@ -21,14 +24,53 @@ MUTATOR_HOOKFUNCTION(kick_teamkiller, PlayerDies)
                return;
        }
 
+       float masksize = autocvar_g_ban_default_masksize;
+       float bantime = autocvar_g_kick_teamkiller_bantime;
+
        int teamkills = PlayerScore_Get(attacker, SP_TEAMKILLS);
        // 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)
+               teamkills >= autocvar_g_kick_teamkiller_rate*playtime/60.0)
        {
-               if (dropclient_schedule(attacker))
-                       Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_QUIT_KICK_TEAMKILL, attacker.netname);
+               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;
+                       }
+               }
        }
 }