SetVoteResultCallback, с чем и как его хавать?

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Хотелось бы дожевать "VoteMenu", по этому пытаюсь в тонкостях разобраться.

Из параметров передается:

num_votes - общее кол-во голосов
num_clients - кол-во игроков которые участвовали (?) в голосовании
const client_info[][2] - ???
num_items - кол-во пунктов в меню для голосования
const item_info[][2] - ???

Внятной информации в API нету, разве что написано по поводу

/* Проверяем, нет ли сразу двух победителей */
new winner = 0;
if (num_items > 1
&& (item_info[0][VOTEINFO_ITEM_VOTES] == item_info[1][VOTEINFO_ITEM_VOTES]))
{
winner = GetRandomInt(0, 1);
}
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
Как я понимаю, информация о пункте.
Если я правильно понял, то:
PHP:
item_info[i][VOTEINFO_ITEM_VOTES] - количество голосов за пункт.
item_info[i][VOTEINFO_ITEM_INDEX] - индекс пункта
client_info[i][VOTEINFO_CLIENT_INDEX] - индекс клиента
client_info[i][VOTEINFO_CLIENT_ITEM] - выбранный клиентом пункт
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
невероятная бредятина.

1) Оба игрока проголосовали за первый вариант.
item_info[0][VOTEINFO_ITEM_INDEX] = 0
item_info[1][VOTEINFO_ITEM_INDEX] = 0
item_info[0][VOTEINFO_ITEM_VOTES] = 2
item_info[1][VOTEINFO_ITEM_VOTES] = 2
num_votes = 2
num_clients = 2
2) Один вариант нет, второй вариант да
item_info[0][VOTEINFO_ITEM_INDEX] = 1
item_info[1][VOTEINFO_ITEM_INDEX] = 0
item_info[0][VOTEINFO_ITEM_VOTES] = 1
item_info[1][VOTEINFO_ITEM_VOTES] = 1
num_votes = 2
num_clients = 2

2) Оба варианта нет
item_info[0][VOTEINFO_ITEM_INDEX] = 1
item_info[1][VOTEINFO_ITEM_INDEX] = 33554432
item_info[0][VOTEINFO_ITEM_VOTES] = 2
item_info[1][VOTEINFO_ITEM_VOTES] = 16777216
num_votes = 2
num_clients = 2

Вопрос такой, как сделать с помощью этого подсчёт голосов голосования и ограничение по %.

Есть 2 пункта меню:
AddMenuItem(g_hVotePlayer, "", "Да");
AddMenuItem(g_hVotePlayer, "", "Нет");

В конечном итоге нужно понять, есть ли в пункте "Да" более 60% игроков.
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
Ну, судя по твоим тестам, можно сделать вывод, что в item_info хранится только результат. То бишь, если всего 2 игрока, и они оба выбрали один вариант, то в item_info будет занесена информация только об одном пункте.
Ну здесь, похоже, вы проголосовали оба за один пункт.
item_info[0][VOTEINFO_ITEM_INDEX] = 0 - индекс первого пункта из тех, за которые проголосовали (видимо те, за которые не голосовали, не заносятся в этот массив)
item_info[1][VOTEINFO_ITEM_INDEX] = 0 - я предполагаю, что он равен выбранному пункту
item_info[0][VOTEINFO_ITEM_VOTES] = 2
item_info[1][VOTEINFO_ITEM_VOTES] = 2

Ну а здесь, вы похоже проголосовали за разные пункты.
item_info[0][VOTEINFO_ITEM_INDEX] = 1
item_info[1][VOTEINFO_ITEM_INDEX] = 0
item_info[0][VOTEINFO_ITEM_VOTES] = 1
item_info[1][VOTEINFO_ITEM_VOTES] = 1

По логике, делаешь цикл по всем возможным пунктам, и проверяешь.
item_info[var][VOTEINFO_ITEM_VOTES] делишь на GetClientCount(true), а потом проверка, если результат >= 0,6, то получаем его индекс item_info[var][VOTEINFO_ITEM_INDEX]

P.S. я не работал с этим, просто пытаюсь разобраться вместе с тобой)
И советую тесты проводить в 3 и более, а то обычно в 2 или 1 неточно получается.
 
Последнее редактирование:

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Привет, если ты как и я искал как же все таки работает это чудо,
и не нашел не чего лучше чем эта тема, то хочу поделится нюансом так как не где не нашел про это инфу.

C-подобный:
https://sourcemod.net/new-api/menus/VoteHandler
void Handle_VoteResults(Menu menu, int num_votes, int num_clients, const int[][] client_info, int num_items, const int[][] item_info)
{
    //#define VOTEINFO_CLIENT_INDEX       0       /**< Client index */
    //#define VOTEINFO_CLIENT_ITEM        1       /**< Элемент, выбранный клиентом, или -1 для none */
    //#define VOTEINFO_ITEM_INDEX         0       /**< Item index */
    //#define VOTEINFO_ITEM_VOTES         1       /**< Количество голосов, поданных за данный пункт */

    int iBuf[2];

    //const int[][] client_info - тут кто первый нажал тот и первый в списке (предполагаю)
    for(int i = 0; i < num_clients; ++i)
    {
        iBuf[0] = client_info[i][VOTEINFO_CLIENT_INDEX]; //Так получаем индекс игрока из массива
        iBuf[1] = client_info[i][VOTEINFO_CLIENT_ITEM]; //Так получаем за какой пункт проголосовал игрок
        PrintToChatAll("Индекс игрока[%i] Голосовал за пункт[%i]", iBuf[0], iBuf[1]);
    }

    //const int[][] item_info - массив отсортированный по убыванию голосов
    for(int i = 0; i < num_items; ++i)
    {
        iBuf[0] = item_info[i][VOTEINFO_ITEM_INDEX]; //Получаем индекс пункта
        iBuf[1] = item_info[i][VOTEINFO_ITEM_VOTES]; //Получаем кол-во голосов за пункт
        PrintToChatAll("Индекс пункта[%i] Голосов за пункт[%i]", iBuf[0], iBuf[1]);
    }
}
 
Последнее редактирование:

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Привет, если ты как и я искал как же все таки работает это чудо,
и не нашел не чего лучше чем эта тема, то хочу поделится нюансом так как не где не нашел про это инфу.
Странно, что не нашли, хотя лежит она под носом: menus · SourceMod Scripting API Reference
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Как по мне там не достаточно понятное описание, я более понятно описал как получить кол-во голосов за пункт который нужен. Как и обсуждалось в этой теме.
Я указал на то, что инфа есть.
Я не затрагивал вопрос понимания отдельных пользователей, которым недостаточно описания в API
 
Сверху Снизу