#include float g_kick_need_count = 0.3; int g_kick_player_votes[TF2_MAXPLAYERS][TF2_MAXPLAYERS]; Handle g_kick_timer = INVALID_HANDLE; char g_kick_votecmd[32] = "sm_votekick"; #define KICK_VOTE_COMPLETE "Игрок %N был кикнут по итогу подсчетов голосов!" #define KICK_VOTE_VOTED "Игрок %N проголосовал за кик игрока %N. Проголосовать за: !votekick в чат или через меню." stock bool KickCheckVotes(int client){ if(ReturnVoteCount(client, g_kick_player_votes) >= CalcNeedCount(g_kick_need_count)){ KickPlayer(client); return true; } else { return false; } } stock KickClearPlayerVotes(int client){ ClearPlayerVotes(client, g_kick_player_votes); } stock KickPlayer(int client){ PrintCenterTextAll(KICK_VOTE_COMPLETE, client); PrintToChatAll(KICK_VOTE_COMPLETE, client); KickClient(client, "votekick"); } stock KickVoteOn(){ if(g_kick_timer != INVALID_HANDLE) KillTimer(g_kick_timer); else g_kick_timer = CreateTimer(5.0, CallbackKickTimer, _, TIMER_REPEAT); RegConsoleCmd(g_kick_votecmd, CommandKickVote, "Vote for kick player on server"); PrintToServer("[FV] [VoteKick] support enable"); } stock KickVoteOff(){ if(g_kick_timer != INVALID_HANDLE) KillTimer(g_kick_timer); } stock DisplayKickMenu(int client){ Handle KickMenu = CreateMenu(CallbackKickBuildMenu); SetMenuTitle(KickMenu, "Кикнуть игрока:"); char menu_line[64]; char player_uid[32]; for(int player = 1; player <= MaxClients; player++){ if(IsValidClient(player)){ //if(player == client) continue; if(CheckCommandAccess(player, "", ADMFLAG_BAN)) continue; Format(player_uid, sizeof(player_uid), "%i", GetClientUserId(player)); if(g_kick_player_votes[player][client] == 0) { Format(menu_line, sizeof(menu_line), "%N [%i/%i]", player, ReturnVoteCount(player, g_kick_player_votes), CalcNeedCount(g_kick_need_count)); AddMenuItem(KickMenu, player_uid, menu_line); } else { Format(menu_line, sizeof(menu_line), "%N [Ты проголосовал]", player); AddMenuItem(KickMenu, player_uid, menu_line, ITEMDRAW_DISABLED); } } } if(GetMenuItemCount(KickMenu) == 0){ PrintCenterText(client, "Незакого голосовать, ты один на сервере"); return; } DisplayMenu(KickMenu, client, 0); return; } stock CallbackKickBuildMenu(Handle KickMenu, MenuAction action, int client, int pos){ switch(action){ case MenuAction_Select:{ char player_uid[32]; GetMenuItem(KickMenu, pos, player_uid, sizeof(player_uid)); int player = GetClientOfUserId(StringToInt(player_uid)); if(player == 0){ PrintCenterText(client, "Увы игрок вышел!"); return; } g_kick_player_votes[player][client] = 1; if(!KickCheckVotes(player)) PrintCenterTextAll(KICK_VOTE_VOTED, client, player); } case MenuAction_End: delete KickMenu; } return; } stock Action CallbackKickTimer(Handle timer){ for(int client = 1; client <= MaxClients; client++){ if(IsValidClient(client)) KickCheckVotes(client); } } public Action CommandKickVote(int client, int args){ if (client == 0) { ReplyToCommand(client, "Cannot use command from RCON."); return Plugin_Handled; } DisplayKickMenu(client); return Plugin_Handled; }