//http://world-source.ru/
#pragma semicolon 1
#include <sourcemod>
new Handle:h_Menu, Handle:h_Timer, kick_vots[MAXPLAYERS+1], timer_sec, all_votes;
public OnPluginStart()
{
HookEvent("round_start", Round_Start, EventHookMode_PostNoCopy);
}
public Round_Start(Handle:event, const String:name[], bool:dontBroadcast)
{
// Если вдруг начался новый раунд, но наш таймер + меню активны, останавливаем их.
// Например, раунд быстро закончился, или был рестарт.
if (h_Timer != INVALID_HANDLE)
{
KillTimer(h_Timer);
h_Timer = INVALID_HANDLE;
}
if (h_Menu != INVALID_HANDLE) CloseHandle(h_Menu);
h_Menu = CreateMenu(Select_Func);
SetMenuTitle(h_Menu, "Кого кикнуть?\n \n");
SetMenuExitButton(h_Menu, false);
decl String:StR_Id[15], String:StR_Name[MAX_NAME_LENGTH];
new players = 0;
for (new i = 1; i <= MaxClients; i++)
{
kick_vots[i] = 0; // очищаем кол-во голосов за кик игрока (i = его индекс)
if (IsClientInGame(i))
{
// получаем userid игрока и делаем его строкой, чтобы добавить в меню
IntToString(GetClientUserId(i), StR_Id, sizeof(StR_Id));
GetClientName(i, StR_Name, sizeof(StR_Name));
AddMenuItem(h_Menu, StR_Id, StR_Name);
players += 1;
}
}
// если игроков на сервере > 0
if (players > 0)
{
// показываем игрокам созданное меню и запускаем таймер
for (new i = 1; i <= MaxClients; i++)
{
if (IsClientInGame(i)) DisplayMenu(h_Menu, i, 10);
}
all_votes = 0; // сколько всего было голосов
timer_sec = 15; // время голосования в сек.
h_Timer = CreateTimer(1.0, Timer_Func, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}
else
{
// если нет игроков, удаляем созданное меню
CloseHandle(h_Menu);
h_Menu = INVALID_HANDLE;
}
}
public Select_Func(Handle:menu, MenuAction:action, i, option)
{
if (action == MenuAction_Select)
{
decl String:StR_Id[15];
GetMenuItem(menu, option, StR_Id, sizeof(StR_Id));
new target_index = GetClientOfUserId(StringToInt(StR_Id));
if (target_index > 0)
{
all_votes += 1;
kick_vots[target_index] += 1;
PrintToChatAll("%N выбрал игрока %N", i, target_index);
}
else PrintToChat(i, "Игрок не найден");
}
}
public Action:Timer_Func(Handle:timer, any:x)
{
timer_sec -= 1;
if (timer_sec > 0)
{
PrintHintTextToAll("До завершения голосования:\n< %d сек >", timer_sec);
return Plugin_Continue;
}
// Время истекло, голосование окончено
h_Timer = INVALID_HANDLE;
if (h_Menu != INVALID_HANDLE)
{
CloseHandle(h_Menu);
h_Menu = INVALID_HANDLE;
}
PrintHintTextToAll("Голосование завершено (%d голосов)", all_votes);
if (all_votes < 1)
{
return Plugin_Stop;
}
// Находим игрока, за которого больше всего проголосовали
new vots = 0, target_index = 0;
for (new i = 1; i <= MaxClients; i++)
{
if (kick_vots[i] > vots)
{
vots = kick_vots[i];
target_index = i;
}
}
if (target_index > 0 && IsClientInGame(target_index))
{
PrintToChatAll("Игрок %N кикнут", target_index);
KickClient(target_index, "бб");
}
else PrintToChatAll("Игрок не найден");
return Plugin_Stop;
}