[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » Как создать голосование (Взято с world-source.ru)
Как создать голосование
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 - сколько всего было голосов. Это глобальные переменные (так как созданы вверху, а не внутри какой-то функции). Такие переменные доступны внутри любой функции, т.е. их можно получать/менять.
 
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » Как создать голосование (Взято с world-source.ru)
  • Страница 1 из 1
  • 1
Поиск: