Guest User

Untitled

a guest
Nov 30th, 2020
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 24.87 KB | None | 0 0
  1. #include <sdktools_gamerules>
  2. #include <colorschat>
  3.  
  4. #undef REQUIRE_PLUGIN
  5. #include <basecomm>
  6.  
  7. #undef REQUIRE_EXTENSIONS
  8. #include <steamworks>
  9.  
  10. #pragma semicolon 1
  11. #pragma newdecls required
  12.  
  13. public Plugin myinfo =
  14. {
  15. name = "VoteBKM",
  16. description = "Голосование за бан, кик и мут игрока",
  17. author = "Drumanid",
  18. version = "1.0.6",
  19. url = "vk.com/drumanid"
  20. };
  21.  
  22. enum {BAN, KICK, MUTE};
  23. KeyValues g_hKeyValues;
  24. Menu g_hMenu;
  25. Handle g_hTimer;
  26.  
  27. int g_iType,
  28. g_iTarget,
  29. g_iPlayers,
  30. g_iCount,
  31. g_iTimeTimer,
  32. g_iTimeLimitAll,
  33. g_iTimeLimit[MAXPLAYERS +1],
  34. g_iChat;
  35.  
  36. float g_fPercent,
  37. g_fCount;
  38.  
  39. char g_sBuffer[256],
  40. g_sReason[64],
  41. g_sLog[128];
  42.  
  43. bool g_bExpansion[2],
  44. g_bUse[MAXPLAYERS +1],
  45. g_bVote[MAXPLAYERS +1][MAXPLAYERS +1][3],
  46. g_bNoSteam[MAXPLAYERS +1];
  47.  
  48. //=================================================================
  49.  
  50. bool g_kvbInBan,
  51. g_kvbInKick,
  52. g_kvbInMute,
  53. g_kvbType,
  54. g_kvbAdmins,
  55. g_kvbMessage,
  56. g_kvbMultiplier,
  57. g_kvbLog,
  58. g_kvbNoSteam,
  59. g_kvbMutePlayer;
  60.  
  61. int g_kviTimeTimer,
  62. g_kviPlayersLimit,
  63. g_kviDisconnectBan,
  64. g_kviTimeBan,
  65. g_kviTimeLimitAll,
  66. g_kviPercent;
  67.  
  68. char g_kvsFlag[2][4];
  69.  
  70. public APLRes AskPluginLoad2(Handle hMySelf, bool bLate, char[] szError, int iErrMax)
  71. {
  72. if(GetEngineVersion() == Engine_CSGO) g_bGame = true;
  73. else g_bGame = false;
  74.  
  75. return APLRes_Success;
  76. }
  77.  
  78. public void OnAllPluginsLoaded()
  79. {
  80. g_bExpansion[0] = LibraryExists("basecomm");
  81. g_bExpansion[1] = LibraryExists("SteamWorks");
  82. }
  83.  
  84. public void OnLibraryRemoved(const char[] sName)
  85. {
  86. UsePlugin(sName, false);
  87. }
  88.  
  89. public void OnLibraryAdded(const char[] sName)
  90. {
  91. UsePlugin(sName, true);
  92. }
  93.  
  94. public void OnPluginStart()
  95. {
  96. BuildPath(Path_SM, g_sLog, sizeof(g_sLog), "logs/VoteBKM.log");
  97.  
  98. RegConsoleCmd("sm_voteban", BanCmd);
  99. RegConsoleCmd("sm_votekick", KickCmd);
  100. RegConsoleCmd("sm_votemute", MuteCmd);
  101. RegConsoleCmd("sm_rev", RevoteCmd);
  102. RegConsoleCmd("sm_votecancel", VoteCancelCmd);
  103.  
  104. g_hMenu = new Menu(MenuVoteItems);
  105. g_hMenu.ExitButton = false;
  106.  
  107. for(int i; i < 3; i++) g_hMenu.AddItem(NULL_STRING, NULL_STRING, ITEMDRAW_NOTEXT);
  108. g_hMenu.AddItem(NULL_STRING, "Наказать");
  109. g_hMenu.AddItem(NULL_STRING, "Не наказывать");
  110. }
  111.  
  112. public void OnMapStart()
  113. {
  114. if(g_hKeyValues != null) delete g_hKeyValues;
  115.  
  116. char sPath[128];
  117. BuildPath(Path_SM, sPath, sizeof(sPath), "configs/votebkm.ini");
  118.  
  119. g_hKeyValues = new KeyValues("VoteBKM");
  120. if(!g_hKeyValues.ImportFromFile(sPath)) SetFailState("No found file: '%s'", sPath);
  121.  
  122. if(g_bExpansion[0]) g_kvbType = view_as<bool>(g_hKeyValues.GetNum("Type", 0));
  123. else g_kvbType = true;
  124. g_kvbInBan = view_as<bool>(g_hKeyValues.GetNum("InBan", 1));
  125. g_kvbInKick = view_as<bool>(g_hKeyValues.GetNum("InKick", 1));
  126. g_kvbInMute = view_as<bool>(g_hKeyValues.GetNum("InMute", 1));
  127. g_kvbAdmins = view_as<bool>(g_hKeyValues.GetNum("Admins", 0));
  128. g_kvbMessage = view_as<bool>(g_hKeyValues.GetNum("Message", 1));
  129. g_kvbMultiplier = view_as<bool>(g_hKeyValues.GetNum("Multiplier", 0));
  130. g_kvbLog = view_as<bool>(g_hKeyValues.GetNum("Log", 1));
  131. g_kvbNoSteam = view_as<bool>(g_hKeyValues.GetNum("NoSteam", 1));
  132. g_kvbMutePlayer = view_as<bool>(g_hKeyValues.GetNum("MutePlayer", 1));
  133. g_kviTimeTimer = g_hKeyValues.GetNum("Time", 20);
  134. g_kviPlayersLimit = g_hKeyValues.GetNum("PlayersLimit", 4);
  135. g_kviDisconnectBan = g_hKeyValues.GetNum("DisconnectBan", 60);
  136. g_kviTimeBan = g_hKeyValues.GetNum("TimeBan", 60);
  137. g_kviTimeLimitAll = g_hKeyValues.GetNum("TimeLimitAll", 30);
  138. g_kviPercent = g_hKeyValues.GetNum("VotePercent", 0);
  139. g_hKeyValues.GetString("FlagImmunity", g_kvsFlag[0], sizeof(g_kvsFlag[]), "t");
  140. g_hKeyValues.GetString("FlagCancel", g_kvsFlag[1], sizeof(g_kvsFlag[]), "d");
  141.  
  142. ClearVeriables(false);
  143. }
  144.  
  145. public Action BanCmd(int iClient, int iArgs)
  146. {
  147. if(g_kvbInBan) Type(iClient, BAN);
  148. return Plugin_Handled;
  149. }
  150.  
  151. public Action KickCmd(int iClient, int iArgs)
  152. {
  153. if(g_kvbInKick) Type(iClient, KICK);
  154. return Plugin_Handled;
  155. }
  156.  
  157. public Action MuteCmd(int iClient, int iArgs)
  158. {
  159. if(g_kvbInMute) Type(iClient, MUTE);
  160. return Plugin_Handled;
  161. }
  162.  
  163. public Action RevoteCmd(int iClient, int iArgs)
  164. {
  165. if(iClient && CheckVote(iClient))
  166. {
  167. if(g_bUse[iClient])
  168. {
  169. g_bUse[iClient] = false; g_fCount -= g_fPercent; g_iCount--;
  170. if(g_kvbMessage) CPrintToChatAll("{WHITE}[{GREEN}VoteBKM{WHITE}] {GREEN}%N {WHITE}решил переголосовать!", iClient);
  171. }
  172. else CPrintToChat(iClient, "{WHITE}[{GREEN}VoteBKM{WHITE}] Сначала проголосуйте, а потом сможете переголосовать!");
  173. }
  174. return Plugin_Handled;
  175. }
  176.  
  177. public Action VoteCancelCmd(int iClient, int iArgs)
  178. {
  179. if(iClient && CheckVote(iClient))
  180. {
  181. if(IsAdminFlag(iClient, g_kvsFlag[1]))
  182. {
  183. VoteClosed();
  184. Log("Администратор %L отменил голосование!\n ", iClient);
  185. CPrintToChatAll("{WHITE}[{GREEN}VoteBKM{WHITE}] {RED}Администратор {WHITE}отменил голосование!");
  186. }
  187. else CPrintToChat(iClient, "{WHITE}[{GREEN}VoteBKM{WHITE}] У вас нет доступа к этой команде!");
  188. }
  189. return Plugin_Handled;
  190. }
  191.  
  192. void Type(int iClient, int iType)
  193. {
  194. if(iClient < 1) return;
  195.  
  196. if(g_kvbNoSteam && g_bExpansion[1] && g_bNoSteam[iClient])
  197. {
  198. CPrintToChat(iClient, "{WHITE}[{GREEN}VoteBKM{WHITE}] Вы не можете этого сделать играя с пиратской версии игры!");
  199. return;
  200. }
  201.  
  202. if(!g_kvbMutePlayer && g_bExpansion[0])
  203. {
  204. if(BaseComm_IsClientGagged(iClient) || BaseComm_IsClientMuted(iClient))
  205. {
  206. CPrintToChat(iClient, "{WHITE}[{GREEN}VoteBKM{WHITE}] Вы не можете этого сделать т.к вы имеете блокировку чата или микрофона!");
  207. return;
  208. }
  209. }
  210.  
  211. if(!g_bGame || !GameRules_GetProp("m_bWarmupPeriod"))
  212. {
  213. if(g_iTarget < 1)
  214. {
  215. int iTime = GetTime();
  216. if(g_iTimeLimitAll <= iTime)
  217. {
  218. if(GetPlayers() >= g_kviPlayersLimit)
  219. {
  220. if(!g_kvbAdmins || g_iPlayers == 0)
  221. {
  222. if(g_iTimeLimit[iClient] <= iTime)
  223. {
  224. g_fPercent = 100.0 / float((g_iPlayers = GetPlayers()));
  225.  
  226. Menu hMenu = new Menu(PlayerListMenuItems);
  227. hMenu.ExitButton = true;
  228.  
  229. char sBuffer[64], sBuffer2[32]; int iCount, i;
  230. GetType(iType, sBuffer, sizeof(sBuffer));
  231.  
  232. if(g_kviPercent == 0)
  233. {
  234. g_iTarget++;
  235. hMenu.SetTitle("Выберите игрока которого хотите - '%s'\n ", sBuffer);
  236.  
  237. for(i = 1; i <= MaxClients; i++)
  238. {
  239. if(IsClientInGame(i) && !IsFakeClient(i) && i != iClient)
  240. {
  241. GetClientName(i, sBuffer, sizeof(sBuffer));
  242. FormatEx(sBuffer2, sizeof(sBuffer2), "%i %i", GetClientUserId(i), iType);
  243. if(!IsAdminFlag(i, g_kvsFlag[0])) hMenu.AddItem(sBuffer2, sBuffer);
  244. else hMenu.AddItem(sBuffer2, sBuffer, ITEMDRAW_DISABLED);
  245. iCount++;
  246. }
  247. }
  248. }
  249. else
  250. {
  251. hMenu.SetTitle("Выберите игрока которого хотите - '%s'\nДля того чтобы начать голосование, нужно:\n[n - текущее / n - необходимое] кол-во голосов\n ", sBuffer);
  252.  
  253. int iVotes[2];
  254. for(i = 1; i <= MaxClients; i++)
  255. {
  256. if(IsClientInGame(i) && !IsFakeClient(i) && i != iClient)
  257. {
  258. if(!IsAdminFlag(i, g_kvsFlag[0]))
  259. {
  260. iVotes[0] = GetAllVotes(float(g_kviPercent)); iVotes[1] = GetVotes(i, iType);
  261. if(!g_bVote[iClient][i][iType])
  262. {
  263. if(iVotes[0] > iVotes[1]) FormatEx(sBuffer, sizeof(sBuffer), "%N [%i/%i]", i, iVotes[1], iVotes[0]);
  264. else FormatEx(sBuffer, sizeof(sBuffer), "%N [Начать голосование]", i);
  265. }
  266. else FormatEx(sBuffer, sizeof(sBuffer), "%N [Забрать голос]", i);
  267. FormatEx(sBuffer2, sizeof(sBuffer2), "%i %i %i %i", GetClientUserId(i), iType, iVotes[0], iVotes[1]);
  268. hMenu.AddItem(sBuffer2, sBuffer);
  269. }
  270. else
  271. {
  272. FormatEx(sBuffer, sizeof(sBuffer), "%N [-/-]", i);
  273. hMenu.AddItem(NULL_STRING, sBuffer, ITEMDRAW_DISABLED);
  274. }
  275.  
  276. iCount++;
  277. }
  278. }
  279.  
  280. g_iPlayers = 0;
  281. }
  282.  
  283. if(iCount == 0) CPrintToChat(iClient, "{WHITE}[{GREEN}VoteBKM{WHITE}] На данный момент нет подходящих игроков!");
  284. hMenu.Display(iClient, 0);
  285. }
  286. else CPrintToChat(iClient, "{WHITE}[{GREEN}VoteBKM{WHITE}] Вы недавно создавали голосование! Вы сможете запустить голосование только через {RED}%i{WHITE} секунд(у/ы)!", g_iTimeLimit[iClient] - iTime);
  287. }
  288. else CPrintToChat(iClient, "{WHITE}[{GREEN}VoteBKM{WHITE}] Вы не сможете запустить голосование, т.к на сервере есть администратор!");
  289. }
  290. else CPrintToChat(iClient, "{WHITE}[{GREEN}VoteBKM{WHITE}] Необходимо {RED}%i{WHITE} игрока, чтобы создать голосование!", g_kviPlayersLimit);
  291. }
  292. else CPrintToChat(iClient, "{WHITE}[{GREEN}VoteBKM{WHITE}] Недавно было голосование! Игроки смогут запустить голосование только через {RED}%i{WHITE} секунд(у/ы)!", g_iTimeLimitAll - iTime);
  293. }
  294. else CPrintToChat(iClient, "{WHITE}[{GREEN}VoteBKM{WHITE}] Вы не можете создать голосование, т.к его уже создали(ют)");
  295. }
  296. else CPrintToChat(iClient, "{WHITE}[{GREEN}VoteBKM{WHITE}] Нельзя запустить голосование во время разминки!");
  297. }
  298.  
  299. public int PlayerListMenuItems(Menu hMenu, MenuAction action, int iClient, int iItem)
  300. {
  301. switch(action)
  302. {
  303. case MenuAction_End: delete hMenu;
  304. case MenuAction_Cancel:
  305. {
  306. if(g_kviPercent == 0 && (iItem == MenuCancel_Interrupted || iItem == MenuCancel_Timeout || iItem == MenuCancel_Exit)) g_iTarget = 0;
  307. }
  308. case MenuAction_Select:
  309. {
  310. char sBuffer[24], sExplodeBuffer[4][8]; int iTarget;
  311. hMenu.GetItem(iItem, sBuffer, sizeof(sBuffer));
  312. ExplodeString(sBuffer, " ", sExplodeBuffer, sizeof(sExplodeBuffer), sizeof(sExplodeBuffer[]));
  313. if(!CheckTarget((iTarget = GetClientOfUserId(StringToInt(sExplodeBuffer[0]))), iClient)) return;
  314.  
  315. int iType = StringToInt(sExplodeBuffer[1]);
  316. if(g_kviPercent != 0)
  317. {
  318. if(!g_bVote[iClient][iTarget][iType])
  319. {
  320. g_bVote[iClient][iTarget][iType] = true; int iVotes[2];
  321. iVotes[0] = StringToInt(sExplodeBuffer[2]); iVotes[1] = StringToInt(sExplodeBuffer[3]) +1;
  322.  
  323. if(iVotes[1] < iVotes[0])
  324. {
  325. CPrintToChat(iClient, "{WHITE}[{GREEN}VoteBKM{WHITE}] Необходимо еще {RED}%i{WHITE} голос(а), чтобы создать голосование за наказание данного игрока!", iVotes[0] - iVotes[1]);
  326. if(g_kvbMessage) CPrintToChatAll("{WHITE}[{GREEN}VoteBKM{WHITE}] {GREEN}%N {WHITE}отдал свой голос за наказание игрока {RED}%N", iClient, iTarget);
  327. return;
  328. }
  329. }
  330. else
  331. {
  332. g_bVote[iClient][iTarget][iType] = false;
  333. if(g_kvbMessage) CPrintToChatAll("{WHITE}[{GREEN}VoteBKM{WHITE}] {GREEN}%N {WHITE}забрал свой голос с игрока {RED}%N!", iClient, iTarget);
  334. return;
  335. }
  336. }
  337.  
  338. g_iType = iType;
  339. g_iTarget = iTarget;
  340. ReasonMenu(iClient);
  341. }
  342. }
  343. }
  344.  
  345. void ReasonMenu(int iClient)
  346. {
  347. if(!CheckTarget(g_iTarget, iClient)) return;
  348.  
  349. Menu hMenu = new Menu(ReasonMenuItems);
  350. hMenu.ExitButton = true;
  351.  
  352. hMenu.SetTitle("Выбранный игрок: %N\nВыберите причину наказания:\n ", g_iTarget);
  353.  
  354. char sKey[32];
  355. switch(g_iType)
  356. {
  357. case BAN: sKey = "ban_reason";
  358. case KICK: sKey = "kick_reason";
  359. case MUTE: sKey = "mute_reason";
  360. }
  361.  
  362. g_hKeyValues.Rewind();
  363. if(g_hKeyValues.JumpToKey(sKey) && g_hKeyValues.GotoFirstSubKey(false))
  364. {
  365. char sReason[2][64];
  366. do
  367. {
  368. g_hKeyValues.GetSectionName(sReason[0], sizeof(sReason[]));
  369. g_hKeyValues.GetString(NULL_STRING, sReason[1], sizeof(sReason[]));
  370. hMenu.AddItem(sReason[0], sReason[1]);
  371. }
  372. while(g_hKeyValues.GotoNextKey(false));
  373. }
  374. else g_iTarget = 0;
  375.  
  376. hMenu.Display(iClient, 0);
  377. }
  378.  
  379. public int ReasonMenuItems(Menu hMenu, MenuAction action, int iClient, int iItem)
  380. {
  381. switch(action)
  382. {
  383. case MenuAction_End: delete hMenu;
  384. case MenuAction_Cancel:
  385. {
  386. if(iItem == MenuCancel_Interrupted || iItem == MenuCancel_Timeout || iItem == MenuCancel_Exit) g_iTarget = 0;
  387. }
  388. case MenuAction_Select:
  389. {
  390. hMenu.GetItem(iItem, g_sReason, sizeof(g_sReason));
  391. if(StrContains(g_sReason, "chat", false) == 0)
  392. {
  393. g_hTimer = CreateTimer(15.0, TimerChat, GetClientUserId(iClient), TIMER_FLAG_NO_MAPCHANGE);
  394. CPrintToChat(iClient, "{WHITE}[{GREEN}VoteBKM{WHITE}] Введите причину в чате, вам дано {GREEN}15 {WHITE}секунд!");
  395. g_iChat = iClient; return;
  396. }
  397.  
  398. ConfirmationMenu(iClient);
  399. }
  400. }
  401. }
  402.  
  403. public Action TimerChat(Handle hTimer, any iClient)
  404. {
  405. iClient = GetClientOfUserId(iClient);
  406. if(IsClientInGame(iClient))
  407. {
  408. CPrintToChat(iClient, "{WHITE}[{GREEN}VoteBKM{WHITE}] Вы не успели ввести причину!");
  409. g_iChat = -1; g_iTarget = 0; TimeLimit(iClient, GetTime());
  410. }
  411. else g_iTarget = 0;
  412.  
  413. g_hTimer = null;
  414. return Plugin_Stop;
  415. }
  416.  
  417. void ConfirmationMenu(int iClient)
  418. {
  419. if(!CheckTarget(g_iTarget, iClient)) return;
  420.  
  421. Menu hMenu = new Menu(ConfirmationMenuItems);
  422. hMenu.ExitButton = false;
  423.  
  424. char sType[32];
  425. GetType(g_iType, sType, sizeof(sType));
  426. hMenu.SetTitle("Вы хотите %s игрока %N?\nПричина: %s\n ", sType, g_iTarget, g_sReason);
  427.  
  428. for(int i; i < 3; i++) hMenu.AddItem(NULL_STRING, NULL_STRING, ITEMDRAW_NOTEXT);
  429. hMenu.AddItem(NULL_STRING, "Да");
  430. hMenu.AddItem(NULL_STRING, "Нет, изменить причину!");
  431. hMenu.AddItem(NULL_STRING, "Нет, отменить голосование!");
  432. hMenu.Display(iClient, 0);
  433. }
  434.  
  435. public int ConfirmationMenuItems(Menu hMenu, MenuAction action, int iClient, int iItem)
  436. {
  437. switch(action)
  438. {
  439. case MenuAction_End: delete hMenu;
  440. case MenuAction_Cancel:
  441. {
  442. if(iItem == MenuCancel_Interrupted || iItem == MenuCancel_Timeout) g_iTarget = 0;
  443. }
  444. case MenuAction_Select:
  445. {
  446. switch(iItem)
  447. {
  448. case 3:
  449. {
  450. if(!CheckTarget(g_iTarget, iClient)) return;
  451. g_iPlayers--;
  452.  
  453. int iTime = GetTime();
  454. g_iTimeLimitAll = iTime + g_kviTimeLimitAll;
  455. TimeLimit(iClient, iTime);
  456.  
  457. g_iTimeTimer = g_kviTimeTimer;
  458. g_hTimer = CreateTimer(1.0, TimerReturnMenu, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
  459.  
  460. char sReason[64], sType[32];
  461. FormatEx(sReason, sizeof(sReason), "%s", g_sReason);
  462. switch(g_iType)
  463. {
  464. case BAN:
  465. {
  466. sType = "забанить";
  467. FormatEx(g_sReason, sizeof(g_sReason), "[VOTEBAN] Причина: %s", sReason);
  468.  
  469. }
  470. case KICK:
  471. {
  472. sType = "кикнуть";
  473. FormatEx(g_sReason, sizeof(g_sReason), "[VOTEKICK] Причина: %s", sReason);
  474. }
  475. case MUTE:
  476. {
  477. sType = "замутить";
  478. FormatEx(g_sReason, sizeof(g_sReason), "[VOTEMUTE] Причина: %s", sReason);
  479. }
  480. }
  481.  
  482. FormatEx(g_sBuffer, sizeof(g_sBuffer), "Игрок: %N\nХочет %s игрока: %N\nПричина: %s", iClient, sType, g_iTarget, sReason);
  483. Log("Игрок %L хочет %s игрока %L | Причина: %s", iClient, sType, g_iTarget, sReason);
  484. CPrintToChatAll("{WHITE}[{GREEN}VoteBKM{WHITE}] {GREEN}%N {WHITE}хочет {RED}%s {WHITE}игрока {RED}%N{WHITE}. Создано голосование! Причина: {RED}%s", iClient, sType, g_iTarget, sReason);
  485.  
  486. Voted(iClient, true);
  487. }
  488. case 4: ReasonMenu(iClient);
  489. case 5: g_iTarget = 0;
  490. }
  491. }
  492. }
  493. }
  494.  
  495. public int MenuVoteItems(Menu hMenu, MenuAction action, int iClient, int iItem)
  496. {
  497. if(action == MenuAction_Select)
  498. {
  499. if(!CheckTarget(g_iTarget, iClient)) return;
  500.  
  501. char sMessage[32];
  502. switch(iItem)
  503. {
  504. case 3:
  505. {
  506. Voted(iClient, true);
  507. sMessage = "за наказание";
  508. }
  509. case 4:
  510. {
  511. Voted(iClient, false);
  512. sMessage = "не наказывать";
  513. }
  514. }
  515.  
  516. if(g_kvbMessage) CPrintToChatAll("{WHITE}[{GREEN}VoteBKM{WHITE}] Игрок {GREEN}%N {WHITE}голосует - {GREEN}%s{WHITE} игрока", iClient, sMessage);
  517. CPrintToChat(iClient, "{WHITE}[{GREEN}VoteBKM{WHITE}] Введите в чат {RED}!rev{WHITE}, чтобы переголосовать!");
  518. if(g_iPlayers == g_iCount) FinishVote();
  519. }
  520. }
  521.  
  522. public Action TimerReturnMenu(Handle hTimer)
  523. {
  524. if(--g_iTimeTimer > 0)
  525. {
  526. for(int i = 1; i <= MaxClients; i++)
  527. {
  528. if(IsClientInGame(i) && !IsFakeClient(i) && i != g_iTarget && !g_bUse[i])
  529. {
  530. g_hMenu.SetTitle("%s\nОсталось время на выбор: %i\n ", g_sBuffer, g_iTimeTimer);
  531. g_hMenu.Display(i, 1);
  532. }
  533. }
  534.  
  535. return Plugin_Continue;
  536. }
  537.  
  538. FinishVote();
  539. g_hTimer = null;
  540. return Plugin_Stop;
  541. }
  542.  
  543. void Voted(int iClient, bool bUse)
  544. {
  545. g_iCount++; g_bUse[iClient] = true;
  546.  
  547. if(bUse)
  548. {
  549. if(IsAdminFlag(iClient, g_kvsFlag[1]))
  550. {
  551. CPrintToChat(iClient, "{WHITE}[{GREEN}VoteBKM{WHITE}] Введите {RED}!votecancel{WHITE}, чтобы отменить голсование!");
  552. if(g_kvbMultiplier)
  553. {
  554. g_fCount += g_fPercent * 2;
  555. return;
  556. }
  557. }
  558.  
  559. g_fCount += g_fPercent;
  560. }
  561. }
  562.  
  563. void FinishVote()
  564. {
  565. char sBuffers[256]; int iPercent;
  566. GetKey(sBuffers, sizeof(sBuffers)); g_hKeyValues.Rewind();
  567. if(g_hKeyValues.JumpToKey(sBuffers))
  568. {
  569. g_hKeyValues.GetString("Command", sBuffers, sizeof(sBuffers));
  570. iPercent = g_hKeyValues.GetNum("Percent");
  571. }
  572.  
  573. if(RoundToCeil(g_fCount) >= iPercent)
  574. {
  575. if(!CheckTarget(g_iTarget, _)) return;
  576. Log("Игрок %L был наказан!\n ", g_iTarget);
  577.  
  578. if(g_kvbType)
  579. {
  580. char sReplace[40], sBuffer[32];
  581. if(StrContains(sBuffers, "{UID}", true) != -1)
  582. {
  583. IntToString(GetClientUserId(g_iTarget), sBuffer, sizeof(sBuffer));
  584. FormatEx(sReplace, sizeof(sReplace), "\"#%s\"", sBuffer);
  585. ReplaceString(sBuffers, sizeof(sBuffers), "{UID}", sReplace, true);
  586. }
  587. else if(StrContains(sBuffers, "{NAME}", true) != -1)
  588. {
  589. GetClientName(g_iTarget, sBuffer, sizeof(sBuffer));
  590. FormatEx(sReplace, sizeof(sReplace), "\"%s\"", sBuffer);
  591. ReplaceString(sBuffers, sizeof(sBuffers), "{NAME}", sReplace, true);
  592. }
  593. else if(StrContains(sBuffers, "{STEAMID}", true) != -1)
  594. {
  595. GetClientAuthId(g_iTarget, AuthId_Steam2, sBuffer, sizeof(sBuffer));
  596. FormatEx(sReplace, sizeof(sReplace), "\"%s\"", sBuffer);
  597. ReplaceString(sBuffers, sizeof(sBuffers), "{STEAMID}", sReplace, true);
  598. }
  599.  
  600. if(StrContains(sBuffers, "{REASON}", true) != -1) ReplaceString(sBuffers, sizeof(sBuffers), "{REASON}", g_sReason, true);
  601. ServerCommand(sBuffers);
  602. }
  603. else
  604. {
  605. switch(g_iType)
  606. {
  607. case BAN: BanClient(g_iTarget, g_kviTimeBan, BANFLAG_AUTO, g_sReason);
  608. case KICK: KickClient(g_iTarget, g_sReason);
  609. case MUTE:
  610. {
  611. BaseComm_SetClientGag(g_iTarget, true); BaseComm_SetClientMute(g_iTarget, true);
  612. CPrintToChat(g_iTarget, "{WHITE}[{GREEN}VoteBKM{WHITE}] Вы получили мут! {WHITE}Причина: {RED}%s", g_sReason);
  613. }
  614. }
  615. }
  616.  
  617. sBuffers = "Голосование завершено, игрок был наказан!";
  618. }
  619. else
  620. {
  621. Log("Игрок %L не был наказан, недостаточно голосов!\n ", g_iTarget);
  622. sBuffers = "Недостаточно голосов, голосование завершено!";
  623. }
  624.  
  625. CPrintToChatAll("{WHITE}[{GREEN}VoteBKM{WHITE}] Проголосовало {GREEN}%i {WHITE}игрок(а/ов) из {RED}%i{WHITE} игроков. %s", g_iCount, g_iPlayers, sBuffers);
  626. VoteClosed();
  627. }
  628.  
  629. public void OnClientPostAdminCheck(int iClient)
  630. {
  631. if(g_kvbNoSteam && g_bExpansion[1] && !IsFakeClient(iClient))
  632. {
  633. if(g_bGame && SteamWorks_HasLicenseForApp(iClient, 730) == k_EUserHasLicenseResultDoesNotHaveLicense) g_bNoSteam[iClient] = true;
  634. else if(!g_bGame && SteamWorks_HasLicenseForApp(iClient, 240) == k_EUserHasLicenseResultDoesNotHaveLicense) g_bNoSteam[iClient] = true;
  635. }
  636. }
  637.  
  638. public void OnClientDisconnect(int iClient)
  639. {
  640. g_bUse[iClient] = false;
  641. g_bNoSteam[iClient] = false;
  642. g_iTimeLimit[iClient] = 0;
  643. if(g_iChat == iClient) g_iChat = -1;
  644.  
  645. int a, b;
  646. for(a = 1; a <= MaxClients; a++)
  647. {
  648. for(b = 0; b < 3; b++) g_bVote[iClient][a][b] = false;
  649. }
  650.  
  651. if(g_fPercent > 0.0 && g_iTarget == iClient && !IsFakeClient(iClient))
  652. {
  653. Log("Игрок %L вышел во время голосования!\n ", iClient);
  654. BanClient(iClient, g_kviDisconnectBan, BANFLAG_AUTO, "Покинул сервер во время голосования");
  655. CPrintToChatAll("{WHITE}[{GREEN}VoteBKM{WHITE}] {RED}Игрок вышел с сервера, голсоование завершено!");
  656. VoteClosed();
  657. }
  658. }
  659.  
  660. public Action OnClientSayCommand(int iClient, const char[] sCommand, const char[] sArgs)
  661. {
  662. if(g_kvbInBan && StrContains(sArgs, "voteban", false) == 0)
  663. {
  664. Type(iClient, BAN);
  665. return Plugin_Handled;
  666. }
  667. else if(g_kvbInKick && StrContains(sArgs, "votekick", false) == 0)
  668. {
  669. Type(iClient, KICK);
  670. return Plugin_Handled;
  671. }
  672. else if(g_kvbInMute && StrContains(sArgs, "votemute", false) == 0)
  673. {
  674. Type(iClient, MUTE);
  675. return Plugin_Handled;
  676. }
  677. else if(g_iChat == iClient)
  678. {
  679. FormatEx(g_sReason, sizeof(g_sReason), "%s", sArgs);
  680. g_iChat = -1; DeleteTimer();
  681.  
  682. ConfirmationMenu(iClient);
  683. return Plugin_Handled;
  684. }
  685.  
  686. return Plugin_Continue;
  687. }
  688.  
  689. void ClearVeriables(bool bUse)
  690. {
  691. if(bUse)
  692. {
  693. for(int i = 1; i <= MaxClients; i++)
  694. {
  695. g_bUse[i] = false;
  696. g_bVote[i][g_iTarget][g_iType] = false;
  697. }
  698. }
  699. else
  700. {
  701. for(int a = 1, b, c; a <= MaxClients; a++)
  702. {
  703. g_bUse[a] = false;
  704. for(b = 1; b <= MaxClients; b++) for(c = 0; c < 3; c++) g_bVote[a][b][c] = false;
  705. }
  706. }
  707.  
  708. g_iType = 0;
  709. g_iTarget = 0;
  710. g_iPlayers = 0;
  711. g_iCount = 0;
  712. g_fCount = 0.0;
  713. g_fPercent = 0.0;
  714. g_sBuffer[0] = 0;
  715. g_sReason[0] = 0;
  716. g_iTimeTimer = 0;
  717. g_iChat = -1;
  718. }
  719.  
  720. void GetType(int iType, char[] sType, int iSize)
  721. {
  722. switch(iType)
  723. {
  724. case BAN: strcopy(sType, iSize, "ЗАБАНИТЬ");
  725. case KICK: strcopy(sType, iSize, "КИКНУТЬ");
  726. case MUTE: strcopy(sType, iSize, "ЗАМУТИТЬ");
  727. }
  728. }
  729.  
  730. void GetKey(char[] sKey, int iSize)
  731. {
  732. switch(g_iType)
  733. {
  734. case BAN: strcopy(sKey, iSize, "ban_settings");
  735. case KICK: strcopy(sKey, iSize, "kick_settings");
  736. case MUTE: strcopy(sKey, iSize, "mute_settings");
  737. }
  738. }
  739.  
  740. bool CheckTarget(int iTarget, int iClient = 0)
  741. {
  742. if(iTarget > 0 && IsClientInGame(iTarget)) return true;
  743.  
  744. if(iClient != 0) CPrintToChat(iClient, "{WHITE}[{GREEN}VoteBKM{WHITE}] Игрока больше нет на сервере!");
  745. return false;
  746. }
  747.  
  748. bool CheckVote(int iClient)
  749. {
  750. if(g_hTimer) return true;
  751.  
  752. CPrintToChat(iClient, "{WHITE}[{GREEN}VoteBKM{WHITE}] Нет на данный момент голосования!");
  753. return false;
  754. }
  755.  
  756. bool IsAdminFlag(int iClient, char[] sFlag)
  757. {
  758. int iFlagBits = GetUserFlagBits(iClient);
  759.  
  760. if(iFlagBits & ReadFlagString("z") || iFlagBits & ReadFlagString(sFlag)) return true;
  761. return false;
  762. }
  763.  
  764. int GetPlayers()
  765. {
  766. int iPlayers;
  767. for(int i = 1; i <= MaxClients; i++)
  768. {
  769. if(IsClientInGame(i) && !IsFakeClient(i) && i != g_iTarget)
  770. {
  771. iPlayers++;
  772. if(IsAdminFlag(i, g_kvsFlag[1])) g_iPlayers++;
  773. }
  774. }
  775.  
  776. return iPlayers;
  777. }
  778.  
  779. void VoteClosed()
  780. {
  781. ClearVeriables(true);
  782. DeleteTimer();
  783. }
  784.  
  785. void DeleteTimer()
  786. {
  787. if(g_hTimer)
  788. {
  789. KillTimer(g_hTimer);
  790. g_hTimer = null;
  791. }
  792. }
  793.  
  794. void TimeLimit(int iClient, int iTime)
  795. {
  796. char sKey[32];
  797. GetKey(sKey, sizeof(sKey)); g_hKeyValues.Rewind();
  798. if(g_hKeyValues.JumpToKey(sKey)) g_iTimeLimit[iClient] = g_hKeyValues.GetNum("TimeLimit") + iTime;
  799. }
  800.  
  801. int GetAllVotes(float fPrecent)
  802. {
  803. int iVotes;
  804. for(int i; i < g_iPlayers; i++)
  805. {
  806. fPrecent -= g_fPercent;
  807. if(fPrecent >= 0.0) iVotes++;
  808. else break;
  809. }
  810.  
  811. return iVotes;
  812. }
  813.  
  814. int GetVotes(int iTarget, int iType)
  815. {
  816. int iVotes;
  817. for(int i = 1; i <= MaxClients; i++)
  818. {
  819. if(g_bVote[i][iTarget][iType]) iVotes++;
  820. }
  821.  
  822. return iVotes;
  823. }
  824.  
  825.  
  826. void Log(const char[] sMessage, any ...)
  827. {
  828. if(g_kvbLog)
  829. {
  830. char sBuffer[256];
  831. VFormat(sBuffer, sizeof(sBuffer), sMessage, 2);
  832.  
  833. LogToFile(g_sLog, sBuffer);
  834. }
  835. }
  836.  
  837. void UsePlugin(const char[] sName, bool bUse)
  838. {
  839. if(StrEqual(sName, "basecomm")) g_bExpansion[0] = bUse;
  840. else if(StrEqual(sName, "SteamWorks")) g_bExpansion[1] = bUse;
  841. }
Advertisement
Add Comment
Please, Sign In to add comment