root | Дата: Воскресенье, 03.02.2013, 01:56 | Сообщение # 1 |
Генералиссимус
Группа: Администраторы
Сообщений: 561
Статус: Offline
| Даю примерик небольшого скрипта голосования за кик игрока в начале раунда.
Код #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; }
#pragma semicolon 1 говорит компилятору, что в конце каждой строки будет символ ; (точка с запятой). Это не обязательно, можно убрать, просто кому как нравится.
|
|
| |
root | Дата: Воскресенье, 03.02.2013, 01:56 | Сообщение # 2 |
Генералиссимус
Группа: Администраторы
Сообщений: 561
Статус: Offline
| У переменных есть значения по умолчанию, например:
Код new x; // 0 new Float:x // 0.0 new Handle:x // INVALID_HANDLE
Handle:h_Menu - храним в этой переменной созданное меню Handle:h_Timer - в этой таймер kick_vots[MAXPLAYERS+1] - количество голосов
kick_vots[65]; // доступные индексы: с kick_vots[0] до kick_vots[64]. Каждый игрок это уникальный индекс (как userid). Поэтому, если индекс игрока 5 и за него голосуют, мы делаем kick_vots[5] += 1; MaxClients - максимальный индекс игрока (число равно максимальному количеству слотов на сервере).
timer_sec - время таймера в секундах. all_votes - сколько всего было голосов. Это глобальные переменные (так как созданы вверху, а не внутри какой-то функции). Такие переменные доступны внутри любой функции, т.е. их можно получать/менять.
|
|
| |