Как создать голосование
| |
_wS_
|
Дата: Вторник, 07.02.2012, 01:55:37 | Сообщение # 1 |
|
Даю примерик небольшого скрипта голосования за кик игрока в начале раунда.
#pragma semicolon 1
#include <sourcemod>
new Handle:h_Menu, Handle:h_Timer;
new 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:silent)
{
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 ;
if (IsClientInGame(i) && GetClientName(i, StR_Name, MAX_NAME_LENGTH))
{
IntToString(GetClientUserId(i), StR_Id, sizeof(StR_Id));
AddMenuItem(h_Menu, StR_Id, StR_Name);
players++;
}
}
if (players > 0 )
{
for ( new i = 1 ; i <= MaxClients; i++)
{
if (IsClientInGame(i) && !IsFakeClient(i)) DisplayMenu(h_Menu, i, 10 );
}
all_votes = 0 ;
timer_sec = 15 ;
h_Timer = CreateTimer( 1 .0 , Timer_Func, _, TIMER_REPEAT);
}
else
{
CloseHandle(h_Menu);
h_Menu = INVALID_HANDLE;
}
}
public Select_Func(Handle:menu, MenuAction:action, client, item)
{
if (action != MenuAction_Select)
return ;
decl String :StR_Id[ 15 ];
if (!GetMenuItem(menu, item, StR_Id, sizeof(StR_Id)))
return ;
new target = GetClientOfUserId(StringToInt(StR_Id));
if (target > 0 )
{
all_votes++;
kick_vots[target]++;
PrintToChatAll( "%N выбрал игрока %N" , client, target);
}
else
PrintToChat(client, "Игрок не найден" );
}
public Action:Timer_Func(Handle:timer)
{
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 = 0 ;
for ( new i = 1 ; i <= MaxClients; i++)
{
if (kick_vots[i] > vots)
{
vots = kick_vots[i];
target = i;
}
}
if (target > 0 && IsClientInGame(target))
{
PrintToChatAll( "Игрок %N кикнут" , target);
KickClient(target, "бб" );
}
else
PrintToChatAll( "Игрок не найден" );
return Plugin_Stop;
}
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
#pragma semicolon 1 говорит компилятору, что в конце каждой строки будет символ ; (точка с запятой). Это не обязательно, можно убрать, просто кому как нравится.
Гости не могут скачивать файлы
|
|
|
| |
naykon4979
|
Дата: Среда, 08.02.2012, 16:58:35 | Сообщение # 2 |
|
Сообщений: 3
Репутация: 0 [ +/- ]
|
|
Поподробней об этом _wS_ писал(а): new Handle:h_Menu, Handle:h_Timer, kick_vots[MAXPLAYERS+1], timer_sec, all_votes;
и этом
_wS_ писал(а): INVALID_HANDLE
|
|
| |
_wS_
|
Дата: Среда, 08.02.2012, 17:37:25 | Сообщение # 3 |
|
У переменных есть значения по умолчанию, например:
new x;
new Float:x
new Handle:x
1 2 3
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 - сколько всего было голосов. Это глобальные переменные (так как созданы вверху, а не внутри какой-то функции). Такие переменные доступны внутри любой функции, т.е. их можно получать/менять.
|
|
| |
Valeriks
|
Дата: Среда, 12.02.2014, 01:20:22 | Сообщение # 4 |
|
Сообщений: 100
Репутация: 3 [ +/- ]
|
|
Интересно, а можно сделать совсем простое голосование ДА/НЕТ по выполнению серверной команды? Как бы регистрируем команду чата, скажем !sv, появляется окошко с голосованием, и если 60% игроков на сервере проголосовали ЗА то выполняем серверную команду.. Или я малость загоняюсь?
п.с..или даже без окошка)) просто чтобы в чате появлялась надпись, там получено столько-то голосов и за это и то. как при запуске голосования по смене карты rtv, что-то типо того.
Сообщение отредактировал Valeriks - Среда, 12.02.2014, 01:25:58 |
|
| |
Darkeneez
|
Дата: Среда, 12.02.2014, 04:14:07 | Сообщение # 5 |
|
Сообщений: 221
Репутация: 18 [ +/- ]
|
|
stock create_vote(client)
{
if (IsVoteInProgress())
{
PrintToChat(client, "\x04[GamesVote]\x01Голосование УЖЕ идет" );
return ;
}
new i_Clients[ 32 ], i_Count;
for ( new i = 1 ; i <= MaxClients; i++)
{
if (!IsClientInGame(i) || !IsPlayerAlive(i) || GetClientTeam(i) != 2 )
continue ;
i_Clients[i_Count++] = i;
}
new Handle:_menu = CreateMenu(Handle_VoteMenu);
SetMenuTitle(_menu, "Во что хотите поиграть?" );
if (KvGotoFirstSubKey(kv_one, false ))
{
new String :name_[ 70 ];
new p_max;
new p_min;
do
{
KvGetSectionName(kv_one, name_, sizeof (name_));
p_max = KvGetNum(kv_one, "max_players" );
p_min = KvGetNum(kv_one, "min_players" );
if (i_Count > p_min && i_Count < p_max && GetRandomInt( 1 , 5 ) == 2 || 3 )
AddMenuItem(_menu, name_, name_);
}
while (KvGotoNextKey(kv_one, false ));
}
KvRewind(kv_one);
SetMenuExitButton(_menu, true );
VoteMenu(_menu, i_Clients, i_Count, 15 );
}
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
Разбирай.
|
|
| | |
Darkeneez
|
Дата: Среда, 12.02.2014, 18:26:17 | Сообщение # 7 |
|
Сообщений: 221
Репутация: 18 [ +/- ]
|
|
Гм, попробуем еще раз.
stock create_vote(client)
{
if (IsVoteInProgress())
{
PrintToChat(client, "\x04[GamesVote]\x01Голосование УЖЕ идет" );
return ;
}
new i_Clients[ 32 ], i_Count;
for ( new i = 1 ; i <= MaxClients; i++)
{
if (!IsClientInGame(i) || !IsPlayerAlive(i) || GetClientTeam(i) != 2 )
continue ;
i_Clients[i_Count++] = i;
}
new Handle:_menu = CreateMenu(Handle_VoteMenu);
SetMenuTitle(_menu, "Во что хотите поиграть?" );
AddMenuItem(_menu, "0" , "Ляля" );
AddMenuItem(_menu, "1" , "Ляля" );
SetMenuExitButton(_menu, true );
VoteMenu(_menu, i_Clients, i_Count, 15 );
}
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
|
| |
Valeriks
|
Дата: Среда, 12.02.2014, 20:42:16 | Сообщение # 8 |
|
Сообщений: 100
Репутация: 3 [ +/- ]
|
|
Хорошо. Теперь приблизительно понятно. Начала кода я попробую собрать сам. Не понятно следующее. Мы проверили нет ли голосования, посчитали игроков, создали меню и показали его игрокам.. А какая функция будет дергать выполнение если большинство проголосовало за?
|
|
| |
Darkeneez
|
Дата: Четверг, 13.02.2014, 05:06:09 | Сообщение # 9 |
|
Сообщений: 221
Репутация: 18 [ +/- ]
|
|
public Handle_VoteMenu(Handle:menu, MenuAction:action, param1, param2)
{
if (param1 > 0 )
{
new String :map[ 64 ];
GetMenuItem(menu, param2, map, sizeof(map));
if (!StrEqual(map, "" ))
PrintToChatAll( "\x04[GamesVote]\x03%N \x01Хочет играть в \x03\"%s\"" , param1, map);
}
if (action == MenuAction_End)
{
CloseHandle(menu);
}
else if (action == MenuAction_VoteEnd)
{
new String :map[ 64 ];
GetMenuItem(menu, param1, map, sizeof(map));
PrintToChatAll( "\x04[GamesVote]\x01Играем в \x03\"%s\"" , map);
PrintCenterTextAll( "Играем в %s" , map);
PrintHintTextToAll( "Играем в %s" , map);
if (KvJumpToKey(kv_one, map))
{
new String :rules_[ 256 ];
KvGetString(kv_one, "rules" , rules_, sizeof(rules_));
if (!StrEqual(rules_, "" ))
PrintToChatAll( "\x04[GamesVote]\x03Правила игры в \x04%s:\x03\n%s" , map, rules_);
}
}
}
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
|
| |
dimoncheg
|
Дата: Суббота, 21.03.2015, 21:45:50 | Сообщение # 10 |
|
Сообщений: 12
Репутация: 1 [ +/- ]
|
|
Реально создать такое меню голосования, по типу плагина maprate( рейтинг карт) Потому что я этот плагин уже даавно ищу, найти никак не магу( а если и нахожу, он нерабочий!
|
|
| |
iEx
|
Дата: Суббота, 21.03.2015, 22:54:53 | Сообщение # 11 |
|
Сообщений: 304
Репутация: 23 [ +/- ]
|
|
Все возможно,руки нужны да знания. Создание меню+Запись данных фаил(kv) и его считывание сойдет,но лучше подключить базу данных...
|
|
| |
dimoncheg
|
Дата: Суббота, 21.03.2015, 23:30:28 | Сообщение # 12 |
|
Сообщений: 12
Репутация: 1 [ +/- ]
|
|
iEx, Во, братан, слушай, если тебя не затруднит, я нашел подобный плагин голоания за карту, называется map rate, я его ставил, он не рабтает, мне написали на вашем форуме, что лагин уже несколько лет с ошибкой лежит, и никто не исправляет, ну так вот, к чему я это говорю: Если тебе время позволяет, пожалуйста перейди по ссылочке: , там исходник этого плагина, ты одним глазком глянь что там не так, и отпиши мне пожалуйсто, если и ошибку исправишь, буду очень благодарен)! За ранее спасибо! Ссылка, откуда я скачивал сам плагин!
|
|
| |
|