]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - 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
1 #include "sv_kick_teamkiller.qh"
2 #include <server/ipban.qh>
3
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;
8
9 REGISTER_MUTATOR(kick_teamkiller, (autocvar_g_kick_teamkiller_rate > 0));
10
11 MUTATOR_HOOKFUNCTION(kick_teamkiller, PlayerDies)
12 {
13         if (!teamplay)
14         {
15                 return;
16         }
17         if (warmup_stage)
18         {
19                 return;
20         }
21         entity attacker = M_ARGV(1, entity);
22         if (!IS_REAL_CLIENT(attacker))
23         {
24                 return;
25         }
26
27         float masksize = autocvar_g_ban_default_masksize;
28         float bantime = autocvar_g_kick_teamkiller_bantime;
29
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)
36         {
37                 switch (autocvar_g_kick_teamkiller_severity)
38                 {
39                         case 1:
40                         {
41                                 if (dropclient_schedule(attacker))
42                                         Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_QUIT_KICK_TEAMKILL, attacker.netname);
43                                 return;
44                         }
45                         case 2:
46                         {
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);
50                                 return;
51                         }
52                         default:
53                         {
54                                 attacker.respawn_flags = RESPAWN_SILENT;
55                                 string theid = "";
56
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);
61
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));
65
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);
68
69                                 if (PlayerInList(attacker, autocvar_g_playban_list))
70                                         TRANSMUTE(Observer, attacker);
71
72                                 return;
73                         }
74                 }
75         }
76 }