· 7 years ago · Nov 01, 2018, 05:16 PM
1#include <sourcemod>
2#include <sdktools>
3#include <csgo_colors>
4#include <cstrike>
5#pragma tabsize 0
6
7int p_queue[8], g_iRankCT[MAXPLAYERS+1], gStageTimer[MAXPLAYERS+1];
8bool bOffSecurity, sBlock_Actived[MAXPLAYERS+1], g_bVIPFlag[MAXPLAYERS+1];
9native int ctcontrol_rank(int iClient);
10Handle tBalance, RulesTimer[MAXPLAYERS+1];
11Database g_hDatabase;
12native bool n_game(int i);
13
14int g_iClientID[MAXPLAYERS+1], g_iTest[MAXPLAYERS+1], g_iKills[MAXPLAYERS+1], g_iDeaths[MAXPLAYERS+1], g_iCTMinute[MAXPLAYERS+1], g_iAllMinute[MAXPLAYERS+1], g_iCTWarn[MAXPLAYERS+1], g_iReasonWarn[MAXPLAYERS+1], g_iDataTimer[2];
15bool bActived;
16static const String:WarnReasons[][] = {
17 "Ðарушение правил",
18 "Ðарушение правил",
19 "Ðеадекватное поведение",
20 "ОтÑутÑтвие микрофона"
21};
22
23public Plugin myinfo =
24{
25 name = "[VC] CT CONTROL",
26 description = "Controling ct",
27 author = "DarkLegend",
28 version = "1.5",
29 url = "http://vk.com/jjailcsgo"
30};
31
32public OnMapStart()
33{
34 CreateTimer(60.0, Timer_CTMinute, _, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT);
35 tBalance = null;
36}
37
38public OnMapEnd()
39{
40 for(int i = 1; i <= MaxClients; ++i)
41 {
42 if(g_iTest[i] == -140 || g_iTest[i] == -110) g_iTest[i] = 0;
43 }
44}
45
46public OnPluginStart()
47{
48 AddCommandListener(CListener_JoinTeam, "jointeam");
49 RegConsoleCmd("sm_queue", Command_Queune);
50 RegConsoleCmd("sm_ct", Command_Queune);
51 RegAdminCmd("sm_clearqueue", Command_ClearQueune, ADMFLAG_ROOT);
52 RegAdminCmd("sm_listqueue", Command_ListQueune, ADMFLAG_ROOT);
53 RegAdminCmd("sm_testtest", Command_Test, ADMFLAG_UNBAN);
54 RegAdminCmd("sm_ctwarn", Command_CTWarn, ADMFLAG_BAN);
55 HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
56 HookEvent("round_start", Event_RoundStart, EventHookMode_Pre);
57 HookEvent("player_death", Event_PlayerDeath);
58 HookEvent("player_hurt", Event_PlayerHurt);
59 Database.Connect(ConnectCallBack, "CTControl");
60}
61
62public void ConnectCallBack (Database hDB, const char[] sError, any data)
63{
64 if (hDB == null)
65 {
66 SetFailState("Database failure: %s", sError);
67 return;
68 }
69
70 g_hDatabase = hDB;
71
72 SQL_LockDatabase(g_hDatabase); // Блокируем базу Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… запроÑов
73
74 g_hDatabase.Query(SQL_Callback_CheckError, "CREATE TABLE IF NOT EXISTS `ctcontrol` (`id` int(20) NOT NULL AUTO_INCREMENT, `auth` varchar(32) NOT NULL, `name` varchar(32) NOT NULL default 'unknown', `test` int(8) NOT NULL, `kills` int(32) NOT NULL, `deaths` int(32) NOT NULL, `ctminute` int(32) NOT NULL, `allminute` int(32) NOT NULL, `ctwarn` int(16) NOT NULL, `warnreasons` int(16) NOT NULL, PRIMARY KEY (`id`)) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1", 1);
75 SQL_UnlockDatabase(g_hDatabase); // Разблокируем базу
76
77 g_hDatabase.SetCharset("utf8"); // УÑтанавливаем кодировку
78}
79
80public void OnClientPostAdminCheck(int iClient)
81{
82 sBlock_Actived[iClient] = false;
83 CreateTimer(16.0, Timer_Welcome, GetClientUserId(iClient), TIMER_FLAG_NO_MAPCHANGE);
84 if(!IsFakeClient(iClient))
85 {
86 char szQuery[256], szAuth[32];
87 GetClientAuthId(iClient, AuthId_Engine, szAuth, sizeof(szAuth), true); // Получаем SteamID игрока
88 FormatEx(szQuery, sizeof(szQuery), "SELECT `id`, `test`, `kills`, `deaths`, `ctminute`, `allminute`, `ctwarn`, `warnreasons` FROM `ctcontrol` WHERE `auth` = '%s';", szAuth); // Формируем запроÑ
89 g_hDatabase.Query(SQL_Callback_SelectClient, szQuery, GetClientUserId(iClient)); // ОтправлÑем запроÑ
90 }
91}
92
93// Обработчик ошибок
94public void SQL_Callback_CheckError(Database hDatabase, DBResultSet results, const char[] szError, any data)
95{
96 if(szError[0])
97 {
98 LogError("SQL_Callback_CheckError: %s", szError);
99 }
100}
101
102public void SQL_Callback_SelectClient(Database hDatabase, DBResultSet hResults, const char[] sError, any iUserID)
103{
104 if(sError[0]) // ЕÑли произошла ошибка
105 {
106 LogError("SQL_Callback_SelectClient: %s", sError); // Выводим в лог
107 return; // Прекращаем выполнение ф-и
108 }
109
110 int iClient = GetClientOfUserId(iUserID);
111 if(iClient)
112 {
113 char szQuery[256], szName[MAX_NAME_LENGTH*2+1];
114 GetClientName(iClient, szQuery, MAX_NAME_LENGTH);
115 g_hDatabase.Escape(szQuery, szName, sizeof(szName)); // Ðкранируем запрещенные Ñимволы в имени
116
117 // Игрок вÑÑ‘ еще на Ñервере
118 if(hResults.FetchRow()) // Игрок еÑть в базе
119 {
120 // Получаем Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð· результата
121 g_iClientID[iClient] = hResults.FetchInt(0); // id
122 g_iTest[iClient] = hResults.FetchInt(1);
123 g_iKills[iClient] = hResults.FetchInt(2);
124 g_iDeaths[iClient] = hResults.FetchInt(3);
125 g_iCTMinute[iClient] = hResults.FetchInt(4);
126 g_iAllMinute[iClient] = hResults.FetchInt(5);
127 g_iCTWarn[iClient] = hResults.FetchInt(6);
128 g_iReasonWarn[iClient] = hResults.FetchInt(7);
129
130 // ОбновлÑем в базе ник и дату поÑледнего входа
131 FormatEx(szQuery, sizeof(szQuery), "UPDATE `ctcontrol` SET `name` = '%s' WHERE `id` = %i;", GetFixNamePlayer(iClient), g_iClientID[iClient]);
132 g_hDatabase.Query(SQL_Callback_CheckError, szQuery);
133 }
134 else
135 {
136 g_iTest[iClient] = 0;
137 g_iKills[iClient] = 0;
138 g_iDeaths[iClient] = 0;
139 g_iCTMinute[iClient] = 0;
140 g_iAllMinute[iClient] = 0;
141 g_iCTWarn[iClient] = 0;
142 g_iReasonWarn[iClient] = 0;
143
144 // ДобавлÑем игрока в базу
145 char szAuth[32];
146 GetClientAuthId(iClient, AuthId_Engine, szAuth, sizeof(szAuth));
147
148 FormatEx(szQuery, sizeof(szQuery), "INSERT INTO `ctcontrol` (`auth`, `name`) VALUES ( '%s', '%s' );", szAuth, GetFixNamePlayer(iClient));
149 g_hDatabase.Query(SQL_Callback_CreateClient, szQuery, GetClientUserId(iClient));
150 }
151 }
152}
153
154char[] GetFixNamePlayer(int iClient)
155{
156 char sName[MAX_NAME_LENGTH * 2 + 1];
157 GetClientName(iClient, sName, sizeof(sName));
158
159 for(int i = 0, len = strlen(sName), CharBytes; i < len;)
160 {
161 if((CharBytes = GetCharBytes(sName[i])) == 4)
162 {
163 len -= 4;
164 for(int u = i; u <= len; u++)
165 {
166 sName[u] = sName[u+4];
167 }
168 }
169 else i += CharBytes;
170 }
171 return sName;
172}
173
174public void SQL_Callback_CreateClient(Database hDatabase, DBResultSet results, const char[] szError, any iUserID)
175{
176 if(szError[0])
177 {
178 LogError("SQL_Callback_CreateClient: %s", szError);
179 return;
180 }
181
182 int iClient = GetClientOfUserId(iUserID);
183 if(iClient)
184 {
185 g_iClientID[iClient] = results.InsertId; // Получаем ID только что добавленного игрока
186 }
187}
188
189public void OnClientDisconnect(int iClient)
190{
191/* for(int i = 0; i < 7; i++)
192 {
193 if(p_queue[i] == iClient)
194 {
195 for(int k = 0; k < 7; k++)
196 {
197 int k2 = k;
198 if(p_queue[++k2] > 0)
199 {
200 if(p_queue[k] && IsClientInGame(p_queue[k]))
201 CGOPrintToChat(p_queue[k], "Теперь вы в очереди: {GREEN}%d", k2);
202
203 p_queue[k] = p_queue[k2];
204 p_queue[k2] = 0;
205 }
206 }
207 break;
208 }
209 }*/
210
211 for(int i = 0; i < 7; i++)
212 {
213 if(p_queue[i] == iClient)
214 {
215 // PrintToChat(client, "I: %d", i);
216 for(int k = i; k < 7; k++)
217 {
218 int k2 = k;
219 // PrintToChat(client, "K: %d", k);
220 if(p_queue[++k2] > 0)
221 {
222 if(p_queue[k] && IsClientInGame(p_queue[k])) CGOPrintToChat(p_queue[k], "Теперь вы в очереди: {GREEN}%d", k2);
223 p_queue[k] = p_queue[k2];
224 p_queue[k2] = 0;
225 //PrintToChat(client, "K: %d K2: %d", k, k2);
226 }
227 else p_queue[k] = 0;
228 }
229 break;
230 }
231 }
232
233 if(!IsFakeClient(iClient))
234 {
235 char szQuery[512];
236 FormatEx(szQuery, sizeof(szQuery), "UPDATE `ctcontrol` SET `test` = %i, `kills` = %i, `deaths` = %i, `ctminute` = %i, `ctwarn` = %i, `warnreasons` = %i, `allminute` = %i WHERE `id` = %i;", g_iTest[iClient], g_iKills[iClient], g_iDeaths[iClient], g_iCTMinute[iClient], g_iCTWarn[iClient], g_iReasonWarn[iClient], g_iAllMinute[iClient], g_iClientID[iClient]);
237 g_hDatabase.Query(SQL_Callback_CheckError, szQuery);
238 }
239}
240
241public Action:CListener_JoinTeam(client, const String:command[], args)
242{
243 if(client && args > 0)
244 {
245 decl String:teamString[3];
246 GetCmdArg(1, teamString, sizeof(teamString));
247 new Target_Team = StringToInt(teamString);
248 if (Target_Team == 0)
249 {
250 ClientCommand(client, "play buttons/button11.wav");
251 CGOPrintToChat(client, "[{BLUE}CT CONTROL{DEFAULT}] Ðвтовыбор отключен, нажми 1 или 2!");
252 return Plugin_Handled;
253 }
254 else if (Target_Team == 3)
255 {
256 ClientCommand(client, "play buttons/button11.wav");
257 CGOPrintToChat(client, "[{BLUE}CT CONTROL{DEFAULT}] За Охрану можно зайти только Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ команды {BLUE}!ct");
258 if(IsClientInGame(client)) ChangeClientTeam(client, 2);
259 return Plugin_Handled;
260 }
261 }
262 return Plugin_Continue;
263}
264
265public Action Timer_Welcome(Handle hTimer, any UserId)
266{
267 int iClient = GetClientOfUserId(UserId);
268 if(iClient && IsClientInGame(iClient) && !IsFakeClient(iClient))
269 {
270 sBlock_Actived[iClient] = true;
271 // g_iImmunity[iClient] = GetClientImmunity(iClient);
272 if(GetUserFlagBits(iClient) & ADMFLAG_GENERIC) g_bVIPFlag[iClient] = true;
273 else g_bVIPFlag[iClient] = false;
274 if(GetClientTeam(iClient) != 2)
275 {
276 ChangeClientTeam(iClient, 2);
277 }
278 }
279}
280
281public Action:Command_ListQueune(client, args)
282{
283 if(!client) return Plugin_Continue;
284 for(int i = 0; i < 7; i++)
285 {
286 if(p_queue[i] > 0) CGOPrintToChat(client, "%d: %N", i, p_queue[i]);
287 }
288 return Plugin_Handled;
289}
290
291public Action:Command_Test(client, args)
292{
293 if(!client) return Plugin_Continue;
294 PrintToChat(client, "%d", g_iTest[client]);
295 g_iTest[client] = 0;
296 return Plugin_Handled;
297}
298
299public Action:Command_CTWarn(client, args)
300{
301 if(!client) return Plugin_Continue;
302 /*if(args != 1)
303 {
304 ReplyToCommand(client, "[SM] sm_ctwarn | CTWarn");
305 return Plugin_Continue;
306 }
307 char cArg1[128], cArg2[16];
308 GetCmdArg(1, cArg1, sizeof(cArg1));
309 GetCmdArg(2, cArg2, sizeof(cArg2));*/
310
311 ctwPlayerSelect(client);
312
313 return Plugin_Handled;
314}
315
316void ctwPlayerSelect(int client)
317{
318 int iCount;
319 char idx[4], name[PLATFORM_MAX_PATH], lang[48];
320 Menu mwSelectPlayer = new Menu(mwSelectPlayer_Callback);
321 FormatEx(lang, sizeof(lang), "Выберите игрока:");
322 mwSelectPlayer.SetTitle(lang);
323 mwSelectPlayer.ExitButton = true;
324 mwSelectPlayer.ExitBackButton = true;
325
326 for (int i = 2; i <= MaxClients; ++i)
327 {
328 if (IsClientInGame(i))
329 {
330 if(i != client && (!(GetUserFlagBits(i) & ADMFLAG_KICK) || GetUserFlagBits(client) & ADMFLAG_ROOT))
331 {
332 iCount++;
333 IntToString(i, idx, sizeof(idx));
334 GetClientName(i, name, sizeof(name));
335 Format(name, sizeof(name), "%s [%d/3]", name, g_iCTWarn[i]);
336 mwSelectPlayer.AddItem(idx, name);
337 }
338 }
339 }
340
341 if(iCount == 0)
342 mwSelectPlayer.AddItem(idx, "ДоÑтупные игроки отÑутÑтвуют.", ITEMDRAW_DISABLED);
343
344 mwSelectPlayer.Display(client, MENU_TIME_FOREVER);
345}
346
347public int mwSelectPlayer_Callback(Menu menu, MenuAction action, int client, int param2)
348{
349 switch (action)
350 {
351 case MenuAction_End: delete menu;
352 case MenuAction_Select:
353 {
354 char idx[8];
355 menu.GetItem(param2, idx, sizeof(idx));
356 int iTarget = StringToInt(idx);
357 if (IsClientInGame(iTarget))
358 {
359 char lang[256], szwarnreasons[256];
360 Menu mwSelectReason = new Menu(mwSelectReason_Callback);
361 if(g_iCTWarn[iTarget] > 0)
362 {
363 for(int i = 1; i <= g_iCTWarn[iTarget]; i++)
364 {
365 switch(i)
366 {
367 case 1:
368 {
369 int a = g_iReasonWarn[iTarget] / 100; a *= 100; a = g_iReasonWarn[iTarget] - a; int b = a; a /= 10; a *= 10; a = b - a;
370 //PrintToChatAll("%d", a);
371 FormatEx(szwarnreasons, sizeof(szwarnreasons), "%i.%s\n", i, WarnReasons[a+1]);
372 }
373 case 2:
374 {
375 int a = g_iReasonWarn[iTarget] / 100; a *= 100; a = g_iReasonWarn[iTarget] - a; a /= 10;
376 FormatEx(szwarnreasons, sizeof(szwarnreasons), "%s%i.%s\n", szwarnreasons, i, WarnReasons[a+1]);
377 }
378 case 3:
379 {
380 int a = g_iReasonWarn[iTarget] / 100;
381 FormatEx(szwarnreasons, sizeof(szwarnreasons), "%s%i.%s\n", szwarnreasons, i, WarnReasons[a+1]);
382 }
383 }
384 }
385 }
386 else Format(szwarnreasons, sizeof(szwarnreasons), "Выговоры отÑутÑтвуют.");
387 if(g_iCTWarn[iTarget] < 3)
388 {
389 FormatEx(lang, sizeof(lang), "Игрок: %N(%d/3) \nПричины выговоров: \n%s \nВыдать новый выговор по причине:", iTarget, g_iCTWarn[iTarget], szwarnreasons);
390 for(int i = 1; i < sizeof(WarnReasons); i++)
391 {
392 mwSelectReason.AddItem(idx, WarnReasons[i]);
393 }
394 }
395 else
396 {
397 FormatEx(lang, sizeof(lang), "Игрок: %N \nПричины выговоров: \n%s ", iTarget, szwarnreasons);
398 }
399 mwSelectReason.SetTitle(lang);
400 mwSelectReason.ExitButton = true;
401 mwSelectReason.ExitBackButton = true;
402 //for(int i = 0; i < strlen(idx)-1; i++) idx[i+1] = idx[i];
403 if(g_iCTWarn[iTarget] > 0)
404 {
405 if((GetUserFlagBits(client) & ADMFLAG_UNBAN || GetUserFlagBits(client) & ADMFLAG_ROOT))
406 {
407 mwSelectReason.AddItem(idx, "CнÑть предупреждение");
408 }
409 else mwSelectReason.AddItem(idx, "У Ð²Ð°Ñ Ð½ÐµÑ‚ прав, чтобы ÑнÑть предупреждение.", ITEMDRAW_DISABLED);
410 }
411 if(g_iTest[iTarget] < 0)
412 {
413 if((GetUserFlagBits(client) & ADMFLAG_UNBAN || GetUserFlagBits(client) & ADMFLAG_ROOT))
414 {
415 int c = strlen(idx)+1;
416 PrintToChat(client, "C: %d", c);
417 idx[c] = '|';
418 mwSelectReason.AddItem(idx, "CнÑть ограничение на прохождение теÑта");
419 PrintToChat(client, "%s", idx);
420 }
421 }
422
423
424 mwSelectReason.Display(client, MENU_TIME_FOREVER);
425 }
426 }
427 }
428}
429
430public int mwSelectReason_Callback(Menu menu, MenuAction action, int client, int param2)
431{
432 switch (action)
433 {
434 case MenuAction_Cancel:
435 {
436 if (param2 == MenuCancel_ExitBack)
437 ctwPlayerSelect(client);
438 }
439 case MenuAction_End: delete menu;
440 case MenuAction_Select:
441 {
442 char idx[8];
443 menu.GetItem(param2, idx, sizeof(idx));
444 int index = FindCharInString(idx, '|');
445 if(index != -1)
446 {
447 idx[index] = 0;
448 }
449 /*if(StrEqual(idx[7], "1")) bCase = true;
450 if(bCase) PrintToChatAll("1");
451 idx[7] = 0;*/
452 //for(int i = 0; i < strlen(idx)-1; i++) idx[i] = idx[i+1];
453 int iTarget = StringToInt(idx);
454 if (IsClientInGame(iTarget))
455 {
456 if(index != -1)
457 {
458 if(g_iTest[iTarget] < 0)
459 {
460 CGOPrintToChatAll("[{BLUE}CT C.{DEFAULT}]{GREEN} %N{RED} ÑнÑл {GREEN}%N {RED}ограничение на прохождение теÑта", client, iTarget);
461 char szAdminSteamID[40], szTargetSteamID[40];
462 GetClientAuthId(client, AuthId_Steam2, szAdminSteamID, 40);
463 GetClientAuthId(iTarget, AuthId_Steam2, szTargetSteamID, 40);
464 LogToFile("addons/sourcemod/logs/CTCONTROL/WarnLog.txt", "[%N|%s] ÑнÑл ограничение на прохождение теÑта [%N|%s]", client, szAdminSteamID, iTarget, szTargetSteamID);
465 g_iTest[iTarget] = 0;
466 }
467 }
468 else
469 {
470 if(g_iCTWarn[iTarget] < 3)
471 {
472 //int temp = param2+1;
473 int temp = param2+1;
474 if(temp == sizeof(WarnReasons))
475 {
476 CGOPrintToChatAll("[{BLUE}CT C.{DEFAULT}]{GREEN} %N{RED} ÑнÑл предупреждение(%d{GREEN}-1{RED}/3) игроку %N", client, g_iCTWarn[iTarget], iTarget);
477 switch(g_iCTWarn[iTarget])
478 {
479 case 1:
480 {
481 g_iReasonWarn[iTarget] = 0;
482 }
483 case 2:
484 {
485 int a = g_iReasonWarn[iTarget];
486 a /= 10; a *= 10; g_iReasonWarn[iTarget] -= a;
487 }
488 case 3:
489 {
490 int a = g_iReasonWarn[iTarget];
491 a /= 100; a *= 100; g_iReasonWarn[iTarget] -= a;
492 }
493 }
494 g_iCTWarn[iTarget] -= 1;
495 }
496 else
497 {
498 g_iCTWarn[iTarget] += 1;
499 switch(g_iCTWarn[iTarget])
500 {
501 case 1: g_iReasonWarn[iTarget] = param2;
502 case 2:
503 {
504 int c = param2*10;
505 g_iReasonWarn[iTarget] += c;
506 }
507 case 3:
508 {
509 int c = param2*100;
510 g_iReasonWarn[iTarget] += c;
511 }
512 }
513 if(g_iCTWarn[iTarget] == 3) KickClient(iTarget, "Ð’Ñ‹ получили CT BAN(3/3 предупреждений). ЕÑли вы не ÑоглаÑны - напишите жалобу на Ðдмина %N в группе vk.com/jjailcsgo", client);
514 else KickClient(iTarget, "Ð’Ñ‹ получили предупреждение %d/3 по причине %s. Перезайдите на Ñервер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð³Ñ€Ñ‹", g_iCTWarn[iTarget], WarnReasons[param2+1]);
515 //PrintToChatAll("%d", g_iReasonWarn[iTarget]);
516 CGOPrintToChatAll("[{BLUE}CT C.{DEFAULT}]{GREEN} %N{RED} выдал предупреждение(%d/3) игроку %N", client, g_iCTWarn[iTarget], iTarget);
517 char szAdminSteamID[40], szTargetSteamID[40], NameAdminPath[PLATFORM_MAX_PATH];
518 GetClientAuthId(client, AuthId_Steam2, szAdminSteamID, 40);
519 GetClientAuthId(iTarget, AuthId_Steam2, szTargetSteamID, 40);
520 BuildPath(Path_SM, NameAdminPath, sizeof(NameAdminPath), "logs/AdminControl/%s.txt", szAdminSteamID);
521 LogToFileEx(NameAdminPath, "[%N|%s] выдал выговор игроку [%N|%s] Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð¾Ð¹ %s", client, szAdminSteamID, iTarget, szTargetSteamID, WarnReasons[temp]);
522 LogToFile("addons/sourcemod/logs/CTCONTROL/WarnLog.txt", "[%N|%s] выдал выговор игроку [%N|%s] Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð¾Ð¹ %s", client, szAdminSteamID, iTarget, szTargetSteamID, WarnReasons[temp]);
523 }
524 }
525 else
526 {
527 CGOPrintToChatAll("[{BLUE}CT C.{DEFAULT}]{GREEN} %N{RED} ÑнÑл предупреждение(%d{GREEN}-1{RED}/3) игроку %N", client, g_iCTWarn[iTarget], iTarget);
528 char szAdminSteamID[40], szTargetSteamID[40];
529 GetClientAuthId(client, AuthId_Steam2, szAdminSteamID, 40);
530 GetClientAuthId(iTarget, AuthId_Steam2, szTargetSteamID, 40);
531 LogToFile("addons/sourcemod/logs/CTCONTROL/WarnLog.txt", "[%N|%s] ÑнÑл предупреждение игроку [%N|%s]", client, szAdminSteamID, iTarget, szTargetSteamID);
532 g_iCTWarn[iTarget] -= 1;
533 }
534 }
535 }
536 }
537 }
538}
539
540public Action:Command_ClearQueune(client, args)
541{
542 if(!client) return Plugin_Continue;
543 CGOPrintToChatAll("[{BLUE}CT C.{DEFAULT}] Очередь была очищена админиÑтратором {RED}%N", client);
544 for(int i = 0; i < 7; i++)
545 {
546 if(p_queue[i] > 0 && IsClientInGame(p_queue[i]))
547 {
548 CGOPrintToChat(p_queue[i], "Вы были удалены из очереди");
549 ClientCommand(p_queue[i], "play buttons/button11.wav");
550 p_queue[i] = 0;
551 }
552 }
553 return Plugin_Handled;
554}
555
556public Action:Command_Queune(client, args)
557{
558 if(!client && IsClientInGame(client)) return Plugin_Continue;
559
560 QueuneMain(client);
561
562 return Plugin_Handled;
563}
564
565void QueuneMain(int client)
566{
567 Menu qPanel = new Menu(qPanel_Callback, MenuAction_Select|MenuAction_End|MenuAction_Cancel);
568 char lang[128], ctcount[64], szTest[64];
569 FormatEx(lang, sizeof(lang), "%s УдоÑтоверение Охранника: \n %N", 0 >= g_iTest[client] ? "ÐедейÑтвительное":"", client);
570 qPanel.SetTitle(lang);
571 qPanel.ExitButton = true;
572
573 if(g_iTest[client] == 0)
574 qPanel.AddItem("1", "Пройти теÑÑ‚ на знание правил");
575 else if(g_iTest[client] > 0)
576 {
577 FormatEx(szTest, sizeof(szTest), "Знание правил: %s", g_iTest[client] == 1 ? "Хорошое" : "Отличное");
578 qPanel.AddItem("0", szTest, ITEMDRAW_DISABLED);
579 }
580 else if(g_iTest[client] < -1)
581 {
582 char cTitle[256];
583 int iTest = g_iTest[client] * -1;
584 FormatEx(cTitle, sizeof(cTitle), "ТеÑÑ‚ на знание правил был провален. \nЧерез %d раунд(-ов) вы Ñможете пройти проверку заново.", iTest);
585 qPanel.AddItem("0", cTitle, ITEMDRAW_DISABLED);
586 }
587
588 if(g_iTest[client] > 0 || bOffSecurity)
589 {
590 int placequene;
591 for(int i = 0; i < 7; i++)
592 {
593 if(p_queue[i] == client)
594 {
595 placequene = i;
596 break;
597 }
598 }
599
600 if(0 < placequene || p_queue[0] == client)
601 {
602 FormatEx(ctcount, sizeof(ctcount), "Вы в очереди: %d", placequene+1);
603 qPanel.AddItem("0", ctcount, ITEMDRAW_DISABLED);
604 qPanel.AddItem("5", "Выйти из очереди");
605 }
606 else
607 {
608 if(g_iCTWarn[client] < 3)
609 {
610 if(g_iTest[client] > 0 && GetClientTeam(client) == 2) qPanel.AddItem("2", "Перейти в команду Охраны");
611 }
612 else qPanel.AddItem("2", "У Ð²Ð°Ñ CT BAN", ITEMDRAW_DISABLED);
613 }
614 }
615
616 qPanel.AddItem("3", "СтатиÑтика");
617 qPanel.AddItem("4", "Правила проекта");
618 qPanel.Display(client, MENU_TIME_FOREVER);
619}
620
621public int qPanel_Callback(Menu qPanel, MenuAction action, int client, int param2)
622{
623 switch (action)
624 {
625 case MenuAction_Cancel:
626 {
627 if (param2 == MenuCancel_ExitBack)
628 QueuneMain(client);
629 }
630 case MenuAction_End: delete qPanel;
631 case MenuAction_Select:
632 {
633 char szInfo[16];
634 qPanel.GetItem(param2, szInfo, sizeof(szInfo));
635 int queuneselect = StringToInt(szInfo);
636 switch(queuneselect)
637 {
638 case 1:
639 {
640 if(g_iAllMinute[client] > 360 && g_iRankCT[client] > 3)
641 {
642 QueuneTest(client);
643 }
644 else
645 {
646 ClientCommand(client, "play buttons/button11.wav");
647 CGOPrintToChat(client, "Ð’Ñ‹ еще мало отыграли на нашем Ñервере, и не имеете опыта.");
648 CGOPrintToChat(client, "{GREEN}ОÑваивайтеÑÑŒ на нашем Ñервере :3");
649 CGOPrintToChat(client, "{GREEN}Или можете купить привилегию, и заходить без очереди! {RED}vk.com/jjailcsgo");
650 }
651 }
652 case 2:
653 {
654 if(g_iTest[client] > 0)
655 {
656 QueuneStart(client);
657 QueuneMain(client);
658 }
659
660 }
661 case 3:
662 {
663 Menu q_Stat = new Menu(Stattq_Callback, MenuAction_End|MenuAction_Cancel);
664 char lang[128], info[256];
665 FormatEx(lang, sizeof(lang), "СтатиÑтика %N игры за Ñторону Охраны", client);
666 q_Stat.SetTitle(lang);
667 q_Stat.ExitButton = true;
668 float fKD;
669 if(g_iKills[client] != 0 && g_iDeaths[client] != 0)
670 fKD = FloatDiv(float(g_iKills[client]), float(g_iDeaths[client]));
671 else fKD = 0.0;
672 char kd[32];
673 FormatEx(kd, sizeof(kd), "%f", fKD);
674 kd[4] = 0;
675 FormatEx(info, sizeof(info), "\nОтыгранных минут: Ð’Ñего: %d | за Охрану: %d \nУбийÑтв: %d \nСмертей: %d \nK/D: %s \nВыговоров %d/3", g_iAllMinute[client], g_iCTMinute[client], g_iKills[client], g_iDeaths[client], kd, g_iCTWarn[client]);
676 q_Stat.AddItem("1", info, ITEMDRAW_DISABLED);
677
678 q_Stat.Display(client, MENU_TIME_FOREVER);
679 }
680 //case 4: ShowMOTDPanel(client, "Rules", "http://xn----ctbz2aw.xn--p1acf/motd.html", MOTDPANEL_TYPE_URL);
681 case 4: CGOPrintCenterText(client, "USE: вц-кÑ.руÑ/#rules");
682 case 5:
683 {
684 for(int i = 0; i < 7; i++)
685 {
686 if(p_queue[i] == client)
687 {
688 // PrintToChat(client, "I: %d", i);
689 for(int k = i; k < 7; k++)
690 {
691 int k2 = k;
692 // PrintToChat(client, "K: %d", k);
693 if(p_queue[++k2] > 0)
694 {
695 if(p_queue[k] && IsClientInGame(p_queue[k])) CGOPrintToChat(p_queue[k], "Теперь вы в очереди: {GREEN}%d", k2);
696 p_queue[k] = p_queue[k2];
697 p_queue[k2] = 0;
698 //PrintToChat(client, "K: %d K2: %d", k, k2);
699 }
700 else p_queue[k] = 0;
701 }
702 CGOPrintToChat(client, "{RED}Ð’Ñ‹ уÑпешно удалены из очереди.");
703 QueuneMain(client);
704 break;
705 }
706 }
707 }
708 }
709 }
710 }
711
712 return 0;
713}
714
715public int Stattq_Callback(Menu menu, MenuAction action, int client, int param2)
716{
717 switch(action)
718 {
719 case MenuAction_Cancel:
720 {
721 if(param2 == MenuCancel_ExitBack)
722 QueuneMain(client);
723 }
724 case MenuAction_End: delete menu;
725 }
726}
727
728void QueuneTest(int client)
729{
730 Menu q_Test = new Menu(Starttq_Callback, MenuAction_Select|MenuAction_End|MenuAction_Cancel);
731 char lang[128];
732 FormatEx(lang, sizeof(lang), "Проверка на общие правила проекта.");
733 q_Test.SetTitle(lang);
734 q_Test.ExitButton = true;
735
736 q_Test.AddItem("0", "Рекомендуем: зайти за наблюдателей, выключить звук, и ÑоредоточитьÑÑ." , ITEMDRAW_DISABLED);
737 q_Test.AddItem("0", "Отвечайте на вопроÑÑ‹ макÑимально чеÑтно," , ITEMDRAW_DISABLED);
738 q_Test.AddItem("0", "иначе вы можете получить пожизненную блокировку!" , ITEMDRAW_DISABLED);
739 q_Test.AddItem("1", "Я ÑоглаÑен, начать теÑтирование." );
740
741 q_Test.Display(client, MENU_TIME_FOREVER);
742}
743
744public int Starttq_Callback(Menu menu, MenuAction action, int client, int param2)
745{
746 switch (action)
747 {
748 case MenuAction_Cancel:
749 {
750 LogToFile("addons/sourcemod/logs/ctban/errorsgame.txt", "1");
751 if (param2 == MenuCancel_ExitBack)
752 QueuneMain(client);
753 else if (param2 == MenuCancel_Interrupted)
754 {
755 g_iDataTimer[0] = client;
756 g_iDataTimer[1] = 0;
757 CreateTimer(0.2, Timer_UnInterrupted);
758 }
759 }
760 case MenuAction_End: delete menu;
761 case MenuAction_Select: if(param2 == 3) QuestionOne(client, 1);
762 }
763}
764
765public Action Timer_UnInterrupted(Handle hTimer)
766{
767 int client = g_iDataTimer[0];
768 int param = g_iDataTimer[1];
769 switch(param)
770 {
771 case 0: QueuneTest(client);
772 case 1: QuestionOne(client, 0);
773 case 2: QuestionTwo(client, 0);
774 case 3: QuestionThree(client, 0);
775 case 4: QuestionFour(client, 0);
776 case 5: QuestionFive(client, 0);
777 }
778}
779
780void QuestionOne(int client, int timer)
781{
782 g_iTest[client] = -110;
783 if(timer == 1)
784 {
785 gStageTimer[client] = 15;
786 RulesTimer[client] = CreateTimer(1.0, TimerRules_CallBack, GetClientUserId(client), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT);
787 }
788 Menu q_Test = new Menu(tq_Callback, MenuAction_Select|MenuAction_End|MenuAction_Cancel);
789 char lang[128];
790 FormatEx(lang, sizeof(lang), "Ð’Ð¾Ð¿Ñ€Ð¾Ñ 1: Сколько вам лет?");
791 q_Test.SetTitle(lang);
792
793 q_Test.AddItem("11", "11 или меньше");
794 q_Test.AddItem("14", "14");
795 q_Test.AddItem("16", "16 или больше");
796 q_Test.AddItem("15", "15");
797 q_Test.AddItem("13", "13");
798 q_Test.AddItem("12", "12");
799
800 q_Test.Display(client, gStageTimer[client]);
801}
802
803void QuestionTwo(int client, int timer)
804{
805 if(timer == 1)
806 {
807 gStageTimer[client] = 15;
808 RulesTimer[client] = CreateTimer(1.0, TimerRules_CallBack, GetClientUserId(client), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT);
809 }
810 Menu q2_Test = new Menu(tq2_Callback, MenuAction_Select|MenuAction_End|MenuAction_Cancel);
811 char lang[128];
812 FormatEx(lang, sizeof(lang), "Ð’Ð¾Ð¿Ñ€Ð¾Ñ 2: Как вы оценивате Ñвой микрофон?");
813 q2_Test.SetTitle(lang);
814
815 q2_Test.AddItem("5", "5 баллов");
816 q2_Test.AddItem("4", "4 балла");
817 q2_Test.AddItem("3", "3 балла");
818 q2_Test.AddItem("2", "2 балла");
819 q2_Test.AddItem("0", "У Ð¼ÐµÐ½Ñ Ð½ÐµÑ‚ микрофона");
820
821 q2_Test.Display(client, gStageTimer[client]);
822}
823
824void QuestionThree(int client, int timer)
825{
826 if(timer == 1)
827 {
828 gStageTimer[client] = 30;
829 RulesTimer[client] = CreateTimer(1.0, TimerRules_CallBack, GetClientUserId(client), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT);
830 }
831 Menu q3_Test = new Menu(tq3_Callback, MenuAction_Select|MenuAction_End|MenuAction_Cancel);
832 char lang[256];
833 FormatEx(lang, sizeof(lang), "Ð’Ð¾Ð¿Ñ€Ð¾Ñ 3: ЕÑли во Ð²Ñ€ÐµÐ¼Ñ Ð›Ð Ð¸Ð³Ñ€Ð¾ÐºÐ¸ выбрали рулетку, \n и не могут договоритьÑÑ Ñ‡ÑŒÑ‘ меÑто, а чьи правила, то...");
834 q3_Test.SetTitle(lang);
835 q3_Test.ExitButton = true;
836
837 q3_Test.AddItem("0", "Правила выбирает тот, у кого патрон");
838 q3_Test.AddItem("0", "Правила и меÑто выбирает Т");
839 q3_Test.AddItem("0", "Правила выбирает КТ, а меÑто выбирает Т");
840 q3_Test.AddItem("1", "Правила выбирает Т, а меÑто выбирает КТ");
841
842 q3_Test.Display(client, gStageTimer[client]);
843}
844
845void QuestionFour(int client, int timer)
846{
847 if(timer == 1)
848 {
849 gStageTimer[client] = 25;
850 RulesTimer[client] = CreateTimer(1.0, TimerRules_CallBack, GetClientUserId(client), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT);
851 }
852 Menu q4_Test = new Menu(tq4_Callback, MenuAction_Select|MenuAction_End|MenuAction_Cancel);
853 char lang[256];
854 FormatEx(lang, sizeof(lang), "Ð’Ð¾Ð¿Ñ€Ð¾Ñ 4: ПоÑле Ñмерти дейÑтвующего командира, \n приказом Ð´Ð»Ñ Ð—ÐµÐºÐ¾Ð² по умолчанию ÑвлÑетÑÑ");
855 q4_Test.SetTitle(lang);
856
857 q4_Test.AddItem("0", "РазбегатьÑÑ Ð² разные Ñтороны");
858 q4_Test.AddItem("0", "Выжить любой ценой");
859 q4_Test.AddItem("1", "Ðе подавать признаки жизни");
860 q4_Test.AddItem("0", "Ждать пока поÑвитÑÑ Ð½Ð¾Ð²Ñ‹Ð¹ КМД");
861 q4_Test.AddItem("0", "Ждать пока кончитÑÑ Ñ€Ð°ÑƒÐ½Ð´");
862
863 q4_Test.Display(client, gStageTimer[client]);
864}
865
866void QuestionFive(int client, int timer)
867{
868 if(timer == 1)
869 {
870 gStageTimer[client] = 15;
871 RulesTimer[client] = CreateTimer(1.0, TimerRules_CallBack, GetClientUserId(client), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT);
872 }
873 Menu q5_Test = new Menu(tq5_Callback, MenuAction_Select|MenuAction_End|MenuAction_Cancel);
874 char lang[128];
875 FormatEx(lang, sizeof(lang), "Ð’Ð¾Ð¿Ñ€Ð¾Ñ 5: Можно ли проводить неÑтандартные игры?");
876 q5_Test.SetTitle(lang);
877
878 q5_Test.AddItem("1", "Да");
879 q5_Test.AddItem("0", "Ðет");
880
881 q5_Test.Display(client, gStageTimer[client]);
882}
883
884public int tq_Callback(Menu menu, MenuAction action, int client, int param2)
885{
886 switch (action)
887 {
888 case MenuAction_Cancel:
889 {
890 if (param2 == MenuCancel_Timeout)
891 CGOPrintToChat(client, "{RED}Ð’Ñ€ÐµÐ¼Ñ Ð²Ñ‹ÑˆÐ»Ð¾. Ð’Ñ‹ провалили теÑÑ‚.");
892 else if (param2 == MenuCancel_Interrupted)
893 {
894 g_iDataTimer[0] = client;
895 g_iDataTimer[1] = 1;
896 CreateTimer(0.2, Timer_UnInterrupted);
897 }
898 }
899 case MenuAction_End: delete menu;
900 case MenuAction_Select:
901 {
902 char szInfo[16];
903 menu.GetItem(param2, szInfo, sizeof(szInfo));
904 int queuneselect = StringToInt(szInfo);
905 if(RulesTimer[client] != null)
906 {
907 KillTimer(RulesTimer[client]);
908 RulesTimer[client] = null;
909 }
910 if(queuneselect < 12)
911 {
912 g_iReasonWarn[client] = 111;
913 g_iCTWarn[client] = 3;
914 g_iTest[client] = -300;
915 }
916 else QuestionTwo(client, 1);
917 }
918 }
919}
920
921public int tq2_Callback(Menu q2_Test, MenuAction action, int client, int param2)
922{
923 switch (action)
924 {
925 case MenuAction_Cancel:
926 {
927 if (param2 == MenuCancel_Timeout)
928 CGOPrintToChat(client, "{RED}Ð’Ñ€ÐµÐ¼Ñ Ð²Ñ‹ÑˆÐ»Ð¾. Ð’Ñ‹ провалили теÑÑ‚.");
929 else if (param2 == MenuCancel_Interrupted)
930 {
931 g_iDataTimer[0] = client;
932 g_iDataTimer[1] = 2;
933 CreateTimer(0.2, Timer_UnInterrupted);
934 }
935 }
936 case MenuAction_End: delete q2_Test;
937 case MenuAction_Select:
938 {
939 char szInfo[16];
940 q2_Test.GetItem(param2, szInfo, sizeof(szInfo));
941 int queuneselect = StringToInt(szInfo);
942
943 if(RulesTimer[client] != null)
944 {
945 KillTimer(RulesTimer[client]);
946 RulesTimer[client] = null;
947 }
948
949 if(queuneselect <= 3)
950 {
951 if(queuneselect == 0)
952 {
953 CGOPrintToChat(client, "{RED}Купите микрофон, и обратитеÑÑŒ в поддержку за разбаном!");
954 g_iReasonWarn[client] = 333;
955 g_iCTWarn[client] = 3;
956 }
957 else
958 {
959 CGOPrintToChat(client, "{RED}ИÑправьте работу микрофона до отметки отлично, и попробуйте Ñнова.");
960 CGOPrintToChat(client, "{BLUE}Ð’ группе еÑть Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¿Ð¾ улучшению работы микрофона.");
961 g_iTest[client] = -10;
962 }
963 }
964 else QuestionThree(client, 1);
965 }
966 }
967}
968
969public int tq3_Callback(Menu q3_Test, MenuAction action, int client, int param2)
970{
971 switch (action)
972 {
973 case MenuAction_Cancel:
974 {
975 if (param2 == MenuCancel_Timeout)
976 CGOPrintToChat(client, "{RED}Ð’Ñ€ÐµÐ¼Ñ Ð²Ñ‹ÑˆÐ»Ð¾. Ð’Ñ‹ провалили теÑÑ‚.");
977 else if (param2 == MenuCancel_Interrupted)
978 {
979 g_iDataTimer[0] = client;
980 g_iDataTimer[1] = 3;
981 CreateTimer(0.2, Timer_UnInterrupted);
982 }
983 }
984 case MenuAction_End: delete q3_Test;
985 case MenuAction_Select:
986 {
987 char szInfo[16];
988 q3_Test.GetItem(param2, szInfo, sizeof(szInfo));
989 int queuneselect = StringToInt(szInfo);
990
991 if(RulesTimer[client] != null)
992 {
993 KillTimer(RulesTimer[client]);
994 RulesTimer[client] = null;
995 }
996
997 if(queuneselect != 1)
998 {
999 if(g_iTest[client] == -110)
1000 {
1001 g_iTest[client] = -140;
1002 CGOPrintCenterText(client, "Допущена ошибка! ОÑталаÑÑŒ 1 попытка.");
1003 }
1004 else
1005 {
1006 CGOPrintCenterText(client, "Ð’Ñ‹ провалили теÑÑ‚.");
1007 g_iTest[client] = -30;
1008 return;
1009 }
1010 }
1011
1012 QuestionFour(client, 1);
1013 }
1014 }
1015}
1016
1017public int tq4_Callback(Menu q4_Test, MenuAction action, int client, int param2)
1018{
1019 switch (action)
1020 {
1021 case MenuAction_Cancel:
1022 {
1023 if (param2 == MenuCancel_Timeout)
1024 CGOPrintToChat(client, "{RED}Ð’Ñ€ÐµÐ¼Ñ Ð²Ñ‹ÑˆÐ»Ð¾. Ð’Ñ‹ провалили теÑÑ‚.");
1025 else if (param2 == MenuCancel_Interrupted)
1026 {
1027 g_iDataTimer[0] = client;
1028 g_iDataTimer[1] = 4;
1029 CreateTimer(0.2, Timer_UnInterrupted);
1030 }
1031 }
1032 case MenuAction_End: delete q4_Test;
1033 case MenuAction_Select:
1034 {
1035 char szInfo[16];
1036 q4_Test.GetItem(param2, szInfo, sizeof(szInfo));
1037 int queuneselect = StringToInt(szInfo);
1038
1039 if(RulesTimer[client] != null)
1040 {
1041 KillTimer(RulesTimer[client]);
1042 RulesTimer[client] = null;
1043 }
1044
1045 if(queuneselect != 1)
1046 {
1047 if(g_iTest[client] == -110)
1048 {
1049 g_iTest[client] = -140;
1050 CGOPrintCenterText(client, "Допущена ошибка! ОÑталаÑÑŒ 1 попытка.");
1051 }
1052 else
1053 {
1054 CGOPrintCenterText(client, "Ð’Ñ‹ провалили теÑÑ‚.");
1055 g_iTest[client] = -30;
1056 return;
1057 }
1058 }
1059
1060 QuestionFive(client, 1);
1061 }
1062 }
1063}
1064
1065public int tq5_Callback(Menu q5_Test, MenuAction action, int client, int param2)
1066{
1067 switch (action)
1068 {
1069 case MenuAction_Cancel:
1070 {
1071 if (param2 == MenuCancel_Timeout)
1072 CGOPrintToChat(client, "{RED}Ð’Ñ€ÐµÐ¼Ñ Ð²Ñ‹ÑˆÐ»Ð¾. Ð’Ñ‹ провалили теÑÑ‚.");
1073 else if (param2 == MenuCancel_Interrupted)
1074 {
1075 g_iDataTimer[0] = client;
1076 g_iDataTimer[1] = 5;
1077 CreateTimer(0.2, Timer_UnInterrupted);
1078 }
1079
1080 }
1081 case MenuAction_End: delete q5_Test;
1082 case MenuAction_Select:
1083 {
1084 char szInfo[16];
1085 q5_Test.GetItem(param2, szInfo, sizeof(szInfo));
1086 int queuneselect = StringToInt(szInfo);
1087
1088 if(RulesTimer[client] != null)
1089 {
1090 KillTimer(RulesTimer[client]);
1091 RulesTimer[client] = null;
1092 }
1093
1094 if(queuneselect != 1)
1095 {
1096 if(g_iTest[client] == -110)
1097 {
1098 g_iTest[client] = -140;
1099 CGOPrintCenterText(client, "Допущена ошибка! ОÑталаÑÑŒ 1 попытка.");
1100 }
1101 else
1102 {
1103 CGOPrintCenterText(client, "Ð’Ñ‹ провалили теÑÑ‚.");
1104 g_iTest[client] = -30;
1105 return;
1106 }
1107 }
1108
1109 if(-120 > g_iTest[client] > -150)
1110 {
1111 g_iTest[client] = 1;
1112 CGOPrintCenterText(client, "Хорошо, но была одна ошибка!");
1113 }
1114 else
1115 {
1116 g_iTest[client] = 2;
1117 CGOPrintCenterText(client, "Отлично!");
1118 }
1119 Menu q_TestFinish = new Menu(tqFinish_Callback, MenuAction_Select|MenuAction_End|MenuAction_Cancel);
1120 q_TestFinish.AddItem("finish", "ПоздравлÑем Ñ ÑƒÑпешным завершением теÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° знание правил!", ITEMDRAW_DISABLED);
1121 q_TestFinish.AddItem("finish", "Теперь вы Ñможете играть за Ñторону Охраны!", ITEMDRAW_DISABLED);
1122 q_TestFinish.AddItem("finish", "Ртак же отÑлеживать Ñвою активноÑть!", ITEMDRAW_DISABLED);
1123 q_TestFinish.AddItem("finish", "GL!", ITEMDRAW_DISABLED);
1124 q_TestFinish.AddItem("finish", "Продолжить");
1125
1126 q_TestFinish.Display(client, MENU_TIME_FOREVER);
1127 }
1128 }
1129}
1130
1131public int tqFinish_Callback(Menu menu, MenuAction action, int client, int param2)
1132{
1133 switch (action)
1134 {
1135 case MenuAction_Cancel:
1136 {
1137 if (param2 == MenuCancel_ExitBack)
1138 QueuneMain(client);
1139 }
1140 case MenuAction_End: delete menu;
1141 case MenuAction_Select:
1142 {
1143 if(param2 == 4)
1144 QueuneMain(client);
1145 }
1146 }
1147}
1148
1149void QueuneStart(int client)
1150{
1151 if(!sBlock_Actived[client])
1152 {
1153 CGOPrintToChat(client, "{RED}ПроизводитÑÑ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð»Ð¸Ñ‡Ð½Ð¾Ñти, ожидайте.");
1154 return;
1155 }
1156
1157 if(GetClientTeam(client) == CS_TEAM_T)
1158 {
1159 for(int i = 0; i < 7; i++)
1160 {
1161 if(p_queue[i] == 0 || p_queue[i] == client)
1162 {
1163 p_queue[i] = client;
1164 CGOPrintToChat(client, "Вы в очереди: {GREEN}%d", ++i);
1165 break;
1166 }
1167 else if(p_queue[6] != 0)
1168 {
1169 CGOPrintToChat(client, "{RED}Очередь переполнена! Попробуйте позже.");
1170 return;
1171 }
1172 }
1173 }
1174 int iCountCT;
1175 for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && GetClientTeam(i) == CS_TEAM_CT) iCountCT++;
1176 if(iCountCT == 0)
1177 {
1178 if(p_queue[0] > 0)
1179 {
1180 if(IsClientInGame(p_queue[0]))
1181 {
1182 CGOPrintToChat(p_queue[0], "Теперь вы играете за команду {BLUE}Охраны");
1183 ChangeClientTeam(p_queue[0], 3);
1184 }
1185 p_queue[0] = 0;
1186 for(int k = 0; k < 7; k++)
1187 {
1188 int temp = k + 1;
1189 if(p_queue[temp] > 0)
1190 {
1191 p_queue[k] = p_queue[temp];
1192 p_queue[temp] = 0;
1193
1194 if(p_queue[k] && IsClientInGame(p_queue[k]))
1195 CGOPrintToChat(p_queue[k], "Теперь вы в очереди: {GREEN}%d", temp);
1196 }
1197 }
1198 }
1199 }
1200 if(GameRules_GetProp("m_bWarmupPeriod"))
1201 {
1202 if(tBalance == null) tBalance = CreateTimer(0.0, Timer_Balance, 0, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT);
1203 }
1204// if(tBalance == null) tBalance = CreateTimer(0.0, Timer_Balance, 0, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT);
1205}
1206
1207public Action Timer_CTMinute(Handle hTimer)
1208{
1209 int iCountCT, iTempIndex;
1210 for(int i = 1; i <= MaxClients; ++i)
1211 {
1212 if(IsClientInGame(i))
1213 {
1214 int iTeam = GetClientTeam(i);
1215 if(iTeam == 3)
1216 {
1217 iCountCT++;
1218 ++g_iCTMinute[i];
1219 }
1220 else if(iTeam == 2)
1221 {
1222 if(g_bVIPFlag[i]) iTempIndex = i;
1223 }
1224
1225 ++g_iAllMinute[i];
1226 }
1227 }
1228 if(iCountCT == 0 && !(n_game(0)))
1229 {
1230 LogToFile("addons/sourcemod/logs/ctban/ctcontrol.txt", "A-60");
1231 if(p_queue[0] <= 0)
1232 {
1233 if(iTempIndex > 0 && IsClientInGame(iTempIndex)) p_queue[0] = iTempIndex;
1234 for(int i = 1; i <= MaxClients; ++i) if(IsClientInGame(i) && GetClientTeam(i) == 2 && g_iTest[i] > 0) iTempIndex = i;
1235 if(iTempIndex == 0) for(int i = 1; i <= MaxClients; ++i) if(IsClientInGame(i) && GetClientTeam(i) == 2) iTempIndex = i;
1236 }
1237 if(p_queue[0] > 0)
1238 {
1239 if(IsClientInGame(p_queue[0]))
1240 {
1241 CGOPrintToChat(p_queue[0], "Теперь вы играете за команду {BLUE}Охраны");
1242 ChangeClientTeam(p_queue[0], 3);
1243 }
1244 p_queue[0] = 0;
1245 for(int k = 0; k < 7; k++)
1246 {
1247 int temp = k + 1;
1248 if(p_queue[temp] > 0)
1249 {
1250 p_queue[k] = p_queue[temp];
1251 p_queue[temp] = 0;
1252
1253 if(p_queue[k] && IsClientInGame(p_queue[k]))
1254 CGOPrintToChat(p_queue[k], "Теперь вы в очереди: {GREEN}%d", temp);
1255 }
1256 }
1257 }
1258 }
1259}
1260
1261public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
1262{
1263 for(int i = 1; i <= MaxClients; ++i)
1264 {
1265 if(IsClientInGame(i) && -300 < g_iTest[i] < 0)
1266 {
1267 ++g_iTest[i];
1268 }
1269 }
1270 if(GetClientCount() >= 6) bActived = true;
1271 else bActived = false;
1272}
1273public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
1274{
1275 //if(tBalance == null) tBalance = CreateTimer(0.0, Timer_Balance, 1, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT);
1276 LogToFile("addons/sourcemod/logs/ctban/ctcontrol.txt", "A-1");
1277 if(tBalance == null)
1278 {
1279 LogToFile("addons/sourcemod/logs/ctban/ctcontrol.txt", "A-2");
1280 tBalance = CreateTimer(0.0, Timer_Balance, 1, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT);
1281 }
1282}
1283
1284public Action TimerRules_CallBack(Handle hTimer, any UserId)
1285{
1286 int iClient = GetClientOfUserId(UserId);
1287 if(iClient && --gStageTimer[iClient] > 0)
1288 {
1289 CGOPrintCenterText(iClient, "Ð”Ð»Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð° оÑталоÑÑŒ: %d Ñекунд", gStageTimer[iClient]);
1290 return Plugin_Continue;
1291 }
1292
1293 RulesTimer[iClient] = null;
1294 return Plugin_Stop;
1295}
1296
1297public Action Timer_Balance(Handle hTimer, any mode)
1298{
1299 LogToFile("addons/sourcemod/logs/ctban/ctcontrol.txt", "A-3");
1300 if(n_game(0))
1301 {
1302 LogToFile("addons/sourcemod/logs/ctban/ctcontrol.txt", "A-4");
1303 CGOPrintToChatAll("{BLUE}[CT CONTROL] {RED}Ð‘Ð°Ð»Ð°Ð½Ñ Ð½Ðµ был Ñоздан из-за игрового днÑ.");
1304 tBalance = null;
1305 return Plugin_Stop;
1306 }
1307 int iRank, iCountT, iCountCT, iTempIndex, iCTLastIndex;
1308 for(int i = 1; i <= MaxClients; i++)
1309 {
1310 if(IsClientInGame(i))
1311 {
1312 g_iRankCT[i] = ctcontrol_rank(i);
1313 if(g_iTest[i] > 0) iRank++;
1314
1315 int iTeam = GetClientTeam(i);
1316
1317 if(iTeam == 2)
1318 {
1319 iCountT++;
1320 if(g_bVIPFlag[i]) iTempIndex = i;
1321 }
1322 else if(iTeam == 3)
1323 {
1324 iCountCT++
1325 iCTLastIndex = i;
1326 }
1327 }
1328 }
1329 LogToFile("addons/sourcemod/logs/ctban/ctcontrol.txt", "A-3 iRank: %d", iRank);
1330 if(iRank < 2) bOffSecurity = true;
1331 else bOffSecurity = false;
1332
1333 if(p_queue[0] <= 0 && iTempIndex > 0 && IsClientInGame(iTempIndex))
1334 {
1335 if(mode == 1)
1336 {
1337 LogToFile("addons/sourcemod/logs/ctban/ctcontrol.txt", "A-3 index: %d", iTempIndex);
1338 p_queue[0] = iTempIndex;
1339 }
1340 }
1341
1342 if(iCountT > 0 && iCountCT > 0 && p_queue[0] > 0)
1343 {
1344 LogToFile("addons/sourcemod/logs/ctban/ctcontrol.txt", "A-3 N3", iTempIndex);
1345 /* float fAllCount = iCountT/iCountCT;
1346 float imethod = (iCountT > 10) ? 5.4 : 3.0;*/
1347 //if(iCountT > 9) iCountCT -= 1;
1348 // int iAllCount = iCountT-iCountCT; iAllCount /= 3;
1349 if(iCountT > 11 && iCountCT > 1) iCountCT -= 1;
1350 int iAllCount = iCountT-1; iAllCount /= 3;
1351 if(iAllCount < 1) iAllCount = 1;
1352 if(IsClientInGame(p_queue[0])) LogToFile("addons/sourcemod/logs/ctban/ctcontrol.txt", "A-5 %N", p_queue[0]);
1353 else LogToFile("addons/sourcemod/logs/ctban/ctcontrol.txt", "A-5 E");
1354 // LogToFile("addons/sourcemod/logs/ctban/ctcontrol.txt", "0) MODE: %d", iMode);
1355 if(iAllCount > iCountCT/* && iMode == 1*/)
1356 {
1357 LogToFile("addons/sourcemod/logs/ctban/ctcontrol.txt", "1) C: %d, T: %d, CT: %d", iAllCount, iCountT, iCountCT);
1358 if(IsClientInGame(p_queue[0]))
1359 {
1360 CGOPrintToChat(p_queue[0], "Теперь вы играете за команду {BLUE}Охраны");
1361 ChangeClientTeam(p_queue[0], 3);
1362 }
1363
1364 p_queue[0] = 0;
1365 for(int k = 0; k < 7; k++)
1366 {
1367 int temp = k + 1;
1368 if(p_queue[temp] > 0)
1369 {
1370 p_queue[k] = p_queue[temp];
1371 p_queue[temp] = 0;
1372
1373 if(p_queue[k] && IsClientInGame(p_queue[k]))
1374 CGOPrintToChat(p_queue[k], "Теперь вы в очереди: {GREEN}%d", temp);
1375 }
1376 }
1377 }
1378 else if(++iAllCount < iCountCT)
1379 {
1380 LogToFile("addons/sourcemod/logs/ctban/ctcontrol.txt", "2) C: %d, T: %d, CT: %d", iAllCount, iCountT, iCountCT);
1381 CGOPrintToChat(iCTLastIndex, "Ð”Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð°Ð»Ð°Ð½Ñа команд, вы были перемещены.");
1382 ChangeClientTeam(iCTLastIndex, 2);
1383 }
1384 else if(iAllCount == iAllCount)
1385 {
1386 tBalance = null;
1387 return Plugin_Stop;
1388 }
1389 return Plugin_Continue;
1390 }
1391 LogToFile("addons/sourcemod/logs/ctban/ctcontrol.txt", "A-6");
1392 tBalance = null;
1393 return Plugin_Stop;
1394}
1395
1396
1397public void Event_PlayerHurt(Event hEvent, const char[] sEvName, bool bDontBroadcast)
1398{
1399 int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));
1400 if(iAttacker && !IsFakeClient(iAttacker) && GetClientTeam(iAttacker) == 3 && bActived)
1401 {
1402 ++g_iKills[iAttacker];
1403 }
1404}
1405
1406public void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
1407{
1408 int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
1409 if(iClient && GetClientTeam(iClient) == 3 && bActived)
1410 {
1411 ++g_iDeaths[iClient];
1412 }
1413}