1 #include "sv_kick_teamkiller.qh"
2 #include <server/ipban.qh>
4 float autocvar_g_kick_teamkiller_rate;
5 float autocvar_g_kick_teamkiller_lower_limit;
6 int autocvar_g_kick_teamkiller_severity;
7 float autocvar_g_kick_teamkiller_bantime;
9 REGISTER_MUTATOR(kick_teamkiller, (autocvar_g_kick_teamkiller_rate > 0));
11 MUTATOR_HOOKFUNCTION(kick_teamkiller, PlayerDies)
21 entity attacker = M_ARGV(1, entity);
22 if (!IS_REAL_CLIENT(attacker))
27 float masksize = autocvar_g_ban_default_masksize;
28 float bantime = autocvar_g_kick_teamkiller_bantime;
30 int teamkills = PlayerScore_Get(attacker, SP_TEAMKILLS);
31 // use the players actual playtime
32 float playtime = time - CS(attacker).startplaytime;
33 // rate is in teamkills/minutes, playtime in seconds
34 if (teamkills >= autocvar_g_kick_teamkiller_lower_limit &&
35 teamkills >= autocvar_g_kick_teamkiller_rate*playtime/60.0)
37 switch (autocvar_g_kick_teamkiller_severity)
41 if (dropclient_schedule(attacker))
42 Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_QUIT_KICK_TEAMKILL, attacker.netname);
47 attacker.respawn_flags = RESPAWN_SILENT;
48 Ban_KickBanClient(attacker, bantime, masksize, "Team Killing");
49 Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_QUIT_KICK_TEAMKILL, attacker.netname);
54 attacker.respawn_flags = RESPAWN_SILENT;
57 if(!PlayerInIPList(attacker, autocvar_g_playban_list))
58 theid = cons(theid, attacker.netaddress);
59 if(!PlayerInIDList(attacker, autocvar_g_playban_list))
60 theid = cons(theid, attacker.crypto_idfp);
62 LOG_INFO(strcat("Play-banning player ", GetCallerName(attacker), " (", attacker.netaddress, ")."));
63 PutObserverInServer(attacker, true, true);
64 cvar_set("g_playban_list", cons(autocvar_g_playban_list, theid));
66 Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_QUIT_PLAYBAN_TEAMKILL, attacker.netname);
67 Send_Notification(NOTIF_ONE, attacker, MSG_CENTER, CENTER_QUIT_PLAYBAN_TEAMKILL);
69 if (PlayerInList(attacker, autocvar_g_playban_list))
70 TRANSMUTE(Observer, attacker);