Sign in to follow this  
Followers 0

[Pawn][PHP] Привязка ВК к игровому аккаунту

7 posts in this topic

Sleash
Завсегдатый

Итак, всем доброго времени суток.

Сегодня я хочу рассказать и показать, как грамотно подключить систему привязки VK к игровым аккаунтам.

Для начала рассмотрим настройку Вашей группы в ВК, которая будет присылать сообщения пользователям в ВК:

1. Переходим в Вашу группу в ВК

2. Переходим в управление сообществом:

Спойлер

655b4a44261b8__2023-11-20_150003610.png.f8dd4908a5c52e3839cf9dbd720a3607.png

3. Переходим в раздел "Сообщения", и разрешаем сообщения сообществу, сохраняем

Спойлер

655b4bfe0c62b__2023-11-20_150725657.png.b105b8084347a75305b98c611527745d.png

4. Переходим в "Настройки" -> "Работа с API" и создаём ключ (если он у вас уже создан, то просто копируем его)

Спойлер

655b4c7cac9f3__2023-11-20_150931965.png.99e019aab0519d0c72a5cfed833d667c.png

5. В высветившемся списке выбираем "Разрешить приложению доступ к сообщениям сообщества" и нажимаем "Создать"

Спойлер

655b4cd029259__2023-11-20_151055669.png.1f0b99be396d9ecef004b6531dfb61e9.png

6. После подтверждения личности появится запись с ключом, копируем его:

Спойлер

655b4d457f7a4__2023-11-20_151253063.png.8cf1386523dbf9a8c694da81b93e4541.png

7. Переходим на главную страницу сообщества и разрешаем сообщения

Спойлер

655b4e2cdf8c3__2023-11-20_151643741.png.d2af8cd760c298fa8193a6172a4b1741.png

Далее нам надо создать и залить на веб-хостинг наш PHP-файл, который будет обрабатывать запрос от хостинга

Перейдём к созданию PHP файла:

<?php // Объявляем PHP-файл
$token_vk = "vk1.a.Pl1D4M...";                          // Сюда вводим токен, полученный в группе ВК
$msg = $_GET["msg"];                                    // Получаем сообщение из GET-запроса (msg=...) 
$msg = iconv('Windows-1251''UTF-8'$msg);            // Делаем нужную кодировку сообщения (Из-за кириллицы)
$msg = urlencode($msg);                                 // Заного кодируем строку для запроса в ВК
$def_id = $_GET["id"];                                  // Получаем ID пользователя из GET-запроса (id=...)
if(stripos($def_id"/") !== false)                     // Проверка на наличие слешей в ID
    $def_id = substr($def_id, strrpos($def_id"/")+1); // Удаляем всё, что до последнего слеша, и сам слеш
    // Код выше способствует следующим преображениям:
    // vk.com/olegsleash            ->      olegsleash
    // https://vk.com/id405249405   ->      id405249405
if(stripos($def_id"@") !== false)                     // Проверка на наличие "собачки" в ID
    $def_id = substr($def_id, strrpos($def_id"@")+1); // Удаляем всё, что до последней "собачки", и саму "собачку"
    // Код выше способствует следующим преображениям:
    // @olegsleash      ->      olegsleash
    // @id405249405     ->      id405249405
if(stripos($def_id"id") === 0)                        // Проверка на "id" в началае строки
    $def_id = substr($def_id2);                       // Удаление "id" из начала строки
    // Код выше способствует следующим преображениям:
    // id405249405  ->      405249405

// Отправка сообщений в ВК невозможна при помощи короткого имени (olegsleash)
// Поэтому для нормальной и красивой работы получаем имя и числовое ID пользователя:
// Генерируем и отправляем запрос в ВК о получении данных пользователя по его короткому имени/ID:
$httpsfile1 = file_get_contents("https://api.vk.com/method/users.get?access_token=$token_vk&fields=maiden_name&name_case=nom&v=5.154&user_id=$def_id");
$id_data = json_decode($httpsfile1true);              // Переводим строку, которую получили в JSON-таблицу
$def_id = $id_data['response'][0]['id'];                // получаем числовое ID пользователя из овтета ВК
$fn = iconv('UTF-8','Windows-1251'$id_data['response'][0]['first_name']);     // Получаем имя пользователя из овтета ВК
$ln = iconv('UTF-8','Windows-1251'$id_data['response'][0]['last_name']);      // Получаем фамилию пользователя из овтета ВК
// Теперь, когда у нас есть числово ID пользователя, можно отправить сообщение:
// Генерируем и отправляем запрос в ВК с сообщением пользователю:
file_get_contents("https://api.vk.com/method/messages.send?random_id=0&v=5.154&message=$msg&user_id=$def_id&access_token=$token_vk");
print "$def_id,$fn,$ln"// Выводим на страницу ID, имя и фамилию пользователя для callback'a в Pawn
// Завершаем PHP-файл
?>

Сохраняем данный файл под любым названием на хостинг (инструкцию по загрузке файлов можете посмотреть на выбранном Вами хостинге)

Дальше нам надо создать столбцы в базе mysql следующими запросами:

ALTER TABLE `Таблица с акк-ами` ADD vkName TEXT NOT NULL, vkID TEXT NOT NULL, vkStatus INT NOT NULL;

Теперь перейдём к работе с модом:

Для начала импортируем нужные нам плагины и инклуды:

#include <a_samp>       // Думаю понятно для чего нужен a_samp
#include <a_http>       // a_http нужен для создания запросов на сайты
#include <sscanf2>      // sscanf нужен для извлечения данных из ответа сайта
#include <Pawn.CMD>     // Pawn.CMD нужен для использовния команд привязки и отвязки ВК
// Вы можете использовать любой коммандны процессор
#include <a_mysql>      // a_mysql нужен для взаимодействие информацией в базе данных
main(){}                // main как минимум нужен для предотвращения ошибки в консоле при запуске

Дальше пройдёмся по дефайнам, которые я создал для удобной работы:

#define VK_FILE             "yourSise.ru/vk_file.php?"              // Ссылка на ваш PHP-файл
                                                                    // Да, надо искать хостинг, можно бесплатный
                                                                    // Я могу посоветовать sprinthost (не реклама)
#define VK_GROUP            "{0099FF}vk.com/{ffffff}"               // Ссылка на группу сервера в ВК
#define COLOR_ERROR         0xE03F2DFF                              // Бардовый цвет для ошибки (красный не очень)) )
#define DLG_VK_LINK         3175                                    // ID диалога для ввода ссылки на свой ВК
#define DLG_VK_CODE         3176                                    // ID диалога для ввода кода привязки, который придёт в ВК
#define DLG_VK_UNLINK       3177                                    // ID диалога для отвязки ВК
#define DLG_VK_UNCODE       3178                                    // ID диалога для ввода кода отвязки, который придёт в ВК
#define DB_ACCOUNTS         "users"     // Таблица в MySQL-БД с данными аккаунтов   // Заменить на своё
#define DB_ACCOUNTS_NAME    "name"      // Столбец в MySQL-БД с ником аккаунта      // Заменить на своё

Далее создаём переменные для временного хранения информации о игроке:

new str_1[512];                         // Создаём строку для обработки
enum playerVK {                         // Создаём enum для хранения информации о данных ВК игрока
    vkName[64],                         // Имя игрока в ВК
    vkID[16],                           // ID игрока в ВК
    vkStatus                            // Статус привязки к ВК у икрока
}; new plVK[MAX_PLAYERS][playerVK];     // Создаём переменную под каждого игрока

Функции, которые я использовал для сокращения кода в дальнейшем:

stock SendError(playerid, text[]) {                             // Функция отправки ошибки игроку
    format(str_1, sizeof(str_1), "[Ошибка] {ffffff}%s", text);  // Форматирование строки с ошибкой
    return SendClientMessage(playerid, COLOR_ERROR, str_1);     // Отравка ошибки игроку
}
stock SendVKMessage(playerid, msg[], id[], callback[] = "") {   // Отправка сообщения игроку в ВК
    new buf_msg[512]; strmid(buf_msg, msg, 0, strlen(msg));     // Создаём буфер для сообщения, ибо кодировка удлиняет строку
    new buf_id[64];   strmid(buf_id,  id,  0, strlen(id));      // Создаём буфер для ID игрока, ибо кодировка удлиняет строку
    StringURLEncode(buf_msg);                                   // Кодируем сообщение
    StringURLEncode(buf_id);                                    // Кодируем ID игрока
    // Кодировка нужна для того, что бы наша ссылка с HTTP-запросом воспринималась верно
    format(str_1, sizeof(str_1), "%smsg=%s&id=%s",VK_FILE, buf_msg, buf_id);
    // Выше мы составляем строку с запросом к нашему PHP-файлу
    HTTP(playerid, HTTP_GET, str_1, "", callback);              // Создаём GET-Запрос, мне GET как-то ближе))
}
// Данная функция кодировки была позимствована у другого скриптера))
stock StringURLEncode(string[], size = sizeof(string))
{
    for(new i = 0, l = strlen(string), hex[8]; i < l; i++)
    {
        switch(string[i]) {
            case '!','(',')','\'','*','0'..'9','A'..'Z','a'..'z'continue;
            case ' ': {string[i] = '+'continue;}
        }
        if(i+3 >= size) {string[i] = EOS; return 0;}
        if(l+3 >= size) string[size-3] = EOS;
        format(hex, sizeof(hex), "%02h", string[i]);
        string[i] = '%';
        strins(string, hex, i + 1, size);
        l += 2; i += 2;
        if (l > size - 1) l = size - 1;
    }
    return 1;
}

Следующим шагом создаём коллбэки для получения информации о созданных запросах к нашему PHP файлу:

forward VKLinkAPI(playerid, resp, data[]);  // Создаём callback для получения данных
public VKLinkAPI(playerid, resp, data[]) {  // Используем callback для получения данных
    if(resp != 200) {                   // Если ответ от сервера НЕ равен 200
        return SendError(playerid, "{0099FF}[VK] {ffffff}Техническая ошибка сервера. Свяжитесь с разработчиком.");
        // Причины такого ответа:
        //  Ошибка в коде PHP-файла
        //  Неверно указана ссылка на PHP-файл
        //  Был удалён сайт с файлом (неуплата / неактив) на хостинге
    }
    new first_name[32], last_name[32];                                                      // Создаём переменные для получения информации о пользователе
    if(!sscanf(data, "p<,>s[16]s[32]s[32]", plVK[playerid][vkID], first_name, last_name)) { // Если от сервера полчен ожидаемый ответ
        // Можете не спрашивать, почему я сделал ID игрока строкой, а не числом, я так захотел))
        new full_name[64];                                                                  // Создаём переменную под полное имя игрока в ВК
        format(full_name, 64"%s %s", first_name, last_name);                              // Соеденяем имя и фамилию
        strmid(plVK[playerid][vkName], full_name, 0, strlen(full_name));                    // Записываем имя игрока в переменную
        // Форматируем строку и показываем игроук диалог
        format(str_1, sizeof(str_1), "{ffffff}На вашу страницу {0099FF}%s {ffffff}[{0099FF}%s{ffffff}] был отправлен код подтверждения\n\
                                              Пожалуйста, введите его в поле ниже:", plVK[playerid][vkName], plVK[playerid][vkID]);
        ShowPlayerDialog(playerid, DLG_VK_CODE, DIALOG_STYLE_INPUT, "Подтверждение VK", str_1, "Отправить""Отмена"); // Открываем диалог
    } else {        // Если же ответ от сервера не тот, что мы ожидает
        // print("(Слово удалено системой) выходит");
        return SendError(playerid, "{0099FF}[VK] {ffffff}Техническая ошибка сервера. Свяжитесь с разработчиком.");
    }
    return 1;
}
forward VKUnLinkAPI(playerid, resp, data[]);
public VKUnLinkAPI(playerid, resp, data[]) {
    if(resp != 200return SendError(playerid, "{0099FF}[VK] {ffffff}Техническая ошибка сервера. Свяжитесь с разработчиком.");
    new unused_str1[16], unused_str2[32], unused_str3[32]; // для обхода варнинга
    if(!sscanf(data, "p<,>s[16]s[32]s[32]", unused_str1, unused_str2, unused_str3)) {
        #pragma unused unused_str1 // Убираем строки из пользования
        #pragma unused unused_str2
        #pragma unused unused_str3
        format(str_1, sizeof(str_1), "{ffffff}На вашу страницу {0099FF}%s {ffffff}[{0099FF}%s{ffffff}] был отправлен код подтверждения\n\
                                              Пожалуйста, введите его в поле ниже:", plVK[playerid][vkName], plVK[playerid][vkID]);
        ShowPlayerDialog(playerid, DLG_VK_UNCODE, DIALOG_STYLE_INPUT, "Подтверждение VK", str_1, "Отправить""Отмена"); // Открываем диалог
    } else return SendError(playerid, "{0099FF}[VK] {ffffff}Техническая ошибка сервера. Свяжитесь с разработчиком.");
    return 1;
}

Так же не забываем добавить команды для активации диалога с привязкой/отвязкой ВК-Аккаунта:

CMD:linkvk(playerid) {                          // Команда для привязки ВК
    if(plVK[playerid][vkStatus]) return SendError(playerid, "{0099FF}[VK]{ffffff} У Вас уже привязан ВК-аккаунт"); // Ошибка, если у игрока уже привязан ВК
    new VK_code = 100000 + random(899999);      // Генерируем код для ВК
    SetPVarInt(playerid, "VKCode", VK_code);    // Привязываем код к игроку;
    // Форматируем текст диалога и открываем его для игрока
    format(str_1, sizeof(str_1), "{ffffff}Привязка VK\n\
                                          Для того, что привязать аккаунт ВК, выполните несколько действий:\n\
                                          \t1. Перейдите в нашу группу %s\n\
                                          \t2. Разрешите сообщение от группы\n\
                                          \t3. Введите ID/короткое имя/ссылку ваше страницы в ВК.\n\
                                          \t\tПримеры:\n\
                                          \t\t\t- {0099FF}405249405{ffffff}\n\
                                          \t\t\t- {0099FF}@olegsleash{ffffff}\n\
                                          \t\t\t- {0099FF}vk.com/id405249405{ffffff}\n\
                                          \t\t\t- {0099FF}https://vk.com/olegsleash{ffffff}\n\
                                          \t\t\t- И т.д.", VK_GROUP);
    ShowPlayerDialog(playerid, DLG_VK_LINK, DIALOG_STYLE_INPUT, "Привязка ВК", str_1, "Отправить""Отмена");
    return 1;
}
CMD:unlinkvk(playerid) {
    if(!plVK[playerid][vkStatus]) return SendError(playerid, "{0099FF}[VK]{ffffff} У Вас не привязан ВК-аккаунт"); // Ошибка, если у игрока не привязан ВК
    SetPVarInt(playerid, "VKCode"100000 + random(899999));    // Генерируем и привязываем код к игроку;
    // Форматируем текст диалога и открываем его для игрока
    format(str_1, sizeof(str_1), "Вы действительно хотите отвязать ВК-аккаунт {0099FF}%s {ffffff}[{0099FF}%s{ffffff}]?", plVK[playerid][vkName], plVK[playerid][vkID]);
    ShowPlayerDialog(playerid, DLG_VK_UNLINK, DIALOG_STYLE_MSGBOX, "Отвязка ВК", str_1, "Да""Отмена");
    return 1;
}

Соответственно добавляем работу с диалогами:

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
    switch(dialogid) {
        case DLG_VK_LINK: {
            if(!response) return false// Если игрок нажал "Отмена"
            if(!(5 <= strlen(inputtext) <= 50)) return SendError(playerid, "{0099FF}[VK]{ffffff} Длина ссылки не может быть меньше 6 и более 50 символов!");
            // Форматируем строку и отправляем сообщение в ВК игроку
            format(str_1, sizeof(str_1), "Используте следующий код для привязки ВК-Аккаунта для игрового аккаунта: %d", GetPVarInt(playerid, "VKCode"));
            SendVKMessage(playerid, str_1, inputtext, "VKLinkAPI"); // Отправляем запрос PHP-файлу с callback = VKLinkAPI
        } case DLG_VK_CODE: {
            if(!response) {
                strmid(plVK[playerid][vkName], "None"04);
                strmid(plVK[playerid][vkID],   "None"04);
                plVK[playerid][vkStatus]    = 0;
            } // Очищаем данные при отказе вводить код
            if(!strlen(inputtext) || !strval(inputtext)) {
                format(str_1, sizeof(str_1), "{ffffff}На вашу страницу {0099FF}%s {ffffff}[{0099FF}%s{ffffff}] был отправлен код подтверждения\n\
                                              Пожалуйста, введите его в поле ниже:", plVK[playerid][vkName], plVK[playerid][vkID]); // Форматируем строку для диалога
                return ShowPlayerDialog(playerid, DLG_VK_CODE, DIALOG_STYLE_INPUT, "Подстверждение VK", str_1, "Отправить""Отмена"); // Открываем диалог
            } // Если игрок ничего не ввёл или в строке не только цифры
            new input_code = strval(inputtext);
            if(input_code == GetPVarInt(playerid, "VKCode")) { // Если код тот, что отправили в ВК
                SendClientMessage(playerid, 0x0099FFFF"[VK] {ffffff}Вы успешно привязали свою страницу к аккаунту!");
                plVK[playerid][vkStatus] = 1// Статус привязкки ВК устанавливаем на "ДА"
                SaveVKData(playerid);            // Сохраняем данные ВК в базу данных
            } else { // Если код не совпадает
                SendError(playerid, "{0099FF}[VK]{ffffff} Вы ввели неверный код подтверждения!");
                format(str_1, sizeof(str_1), "{ffffff}На вашу страницу {0099FF}%s {ffffff}[{0099FF}%s{ffffff}] был отправлен код подтверждения\n\
                                              Пожалуйста, введите его в поле ниже:", plVK[playerid][vkName], plVK[playerid][vkID]); // Форматируем строку для диалога
                return ShowPlayerDialog(playerid, DLG_VK_CODE, DIALOG_STYLE_INPUT, "Подстверждение VK", str_1, "Отправить""Отмена"); // Открываем диалог
            }
        } case DLG_VK_UNLINK: {
            if(!response) return false// Если игрок нажал "Отмена"
            // Форматируем строку и отправляем сообщение в ВК игроку
            format(str_1, sizeof(str_1), "Используте следующий код для отвязки ВК-Аккаунта для игрового аккаунта: %d", GetPVarInt(playerid, "VKCode"));
            SendVKMessage(playerid, str_1, plVK[playerid][vkID], "VKUnLinkAPI"); // Отправляем запрос PHP-файлу с callback = VKUnLinkAPI
        } case DLG_VK_UNCODE: {
            if(!response) return false;
            if(!strlen(inputtext) || !strval(inputtext)) {
                format(str_1, sizeof(str_1), "{ffffff}На вашу страницу {0099FF}%s {ffffff}[{0099FF}%s{ffffff}] был отправлен код подтверждения\n\
                                              Пожалуйста, введите его в поле ниже:", plVK[playerid][vkName], plVK[playerid][vkID]); // Форматируем строку для диалога
                return ShowPlayerDialog(playerid, DLG_VK_UNCODE, DIALOG_STYLE_INPUT, "Подстверждение VK", str_1, "Отправить""Отмена"); // Открываем диалог
            } // Если игрок ничего не ввёл или в строке не только цифры
            new input_code = strval(inputtext);
            if(input_code == GetPVarInt(playerid, "VKCode")) { // Если код тот, что отправили в ВК
                SendClientMessage(playerid, 0x0099FFFF"[VK] {ffffff}Вы успешно отвязали свою страницу от аккаунта!");
                strmid(plVK[playerid][vkName], "None"04);
                strmid(plVK[playerid][vkID],   "None"04);
                plVK[playerid][vkStatus]    = 0;
                SaveVKData(playerid);            // Сохраняем данные ВК в базу данных
            } else { // Если код не совпадает
                SendError(playerid, "{0099FF}[VK]{ffffff} Вы ввели неверный код подтверждения!");
                format(str_1, sizeof(str_1), "{ffffff}На вашу страницу {0099FF}%s {ffffff}[{0099FF}%s{ffffff}] был отправлен код подтверждения\n\
                                              Пожалуйста, введите его в поле ниже:", plVK[playerid][vkName], plVK[playerid][vkID]); // Форматируем строку для диалога
                return ShowPlayerDialog(playerid, DLG_VK_UNCODE, DIALOG_STYLE_INPUT, "Подстверждение VK", str_1, "Отправить""Отмена"); // Открываем диалог
            }
        }
    }
    return 1;
}

Ну и само собой загрузка и сохранение данных ВК игроков в базу данных:

stock SaveVKData(playerid) {    // Функция созранения ВК-данных игрока
    new playerNName[MAX_PLAYER_NAME];
    GetPlayerName(playerid, playerNName, MAX_PLAYER_NAME);
    format(str_1, sizeof(str_1), "UPDATE `%s` SET `vkName` = '%s', `vkID` = '%s', `vkStatus` = '%d' WHERE `%s' = '%s' LIMIT 1",\
        DB_ACCOUNTS, plVK[playerid][vkName], plVK[playerid][vkID], plVK[playerid][vkStatus], DB_ACCOUNTS_NAME, playerNName);
    // Создаём запрос в базу данных
    mysql_query(1, str_1, false);
}
stock LoadVKData(playerid) {
    new playerNName[MAX_PLAYER_NAME];
    GetPlayerName(playerid, playerNName, MAX_PLAYER_NAME);
    format(str_1, sizeof(str_1), "SELECT `vkName`, `vkID`, `vkStatus` FROM `%s` WHERE `%s' = '%s' LIMIT 1", DB_ACCOUNTS, DB_ACCOUNTS_NAME, playerNName);
    // Создаём запрос в базу данных
    new Cache:vk_cache = mysql_query(1, str_1, true);
    cache_get_field_content(0"vkName", plVK[playerid][vkName]);       // Получаем имя аккаунта ВК
    cache_get_field_content(0"vkID", plVK[playerid][vkID]);           // Получаем ID аккаунта ВК
    plVK[playerid][vkStatus] = cache_get_field_content(0"vkStatus");  // Получаем статус привязки
    cache_delete(vk_cache);
    return 1;
}

Теперь перейдём к тестированию кода:

Скриншоты привязки ВК:

Спойлер

655b5751ed459__2023-11-20_155545292.png.ed128315059459445471637401a09262.png

655b575c75cf8__2023-11-20_155556102.png.3552953965941f0f2a4ec30ba98bbc81.png

655b5768b6bdc__2023-11-20_155608170.png.aaeee7e62f4754b7c66b851b624c18d7.png

655b57711da52__2023-11-20_155616691.png.41900e6a255d8edccbfd28249c771bd9.png

655b57d49d563__2023-11-20_155756186.png.e73d7034f514a9b1a8514518fcece4a4.png

Скриншоты отвязки ВК:

Спойлер

655b57f2aeba3__2023-11-20_155826274.png.f0de8ebbfa79fa5ff0795b47e4c2af40.png

655b580d920b6__2023-11-20_155853192.png.804f5f8610f218295ac732c8682952ff.png

655b5823d8b41__2023-11-20_155915192.png.3d25b1ffc024151ff40e6bee0c566568.png

655b583a8546e__2023-11-20_155938145.png.d93ea51672092727ff9199e9b15e11e2.png

На этом я бы хотел закончить свой урок, всем хорошего настроения!

P.S. Дядюшка Cawfee, пожалуйста не выдавай предупреждение за код, я не хочу, что бы моя темы выглядела как совокупность спойлеров)

Edited by Sleash

Заметка от Cawfee , создано

Дядюшка тебя услышал :)

Share this post


Link to post
Share on other sites
trevison
Активный

не хватает примера использования привязки

я думаю у многих ещё возникнут вопросы как добавить в авторизацию это

а так всё отлично, мне понравилась тема

Edited by trevison

Share this post


Link to post
Share on other sites
trevison
Активный

@egorik_drugsik если вы копируете, вставляете в павн и у вас в тексте вопросики, то смените раскладку на русскую, скопируйте заново и вставьте

Share this post


Link to post
Share on other sites
surenescore
Освоившийся

Тот кто хочет использовать этот код, он не актуален много ошибок в коде.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • DevGen
      By DevGen
      Доброго времени суток форумчане! Как реализовать скрытые ники игроков?

      Ситуация: Хочу что бы полностью у всех игроков были скрыты ники.
      А вместо стандартных ников было к примеру(обязательно с айди):
      Неизвестный[ID игрока] Перелазил много тем, но не нашел нужного. Помогите реализовать это
    • 132123123
      By 132123123
      помогите ошибка в моде радмира что мне делать вот код 
       
      new const ItemsInfo[388][infoitem] = {
          {"Деньги", 1, -1},                        //0
          {"Канистра", 1500, -1},                    //1
          {"Аптечка", 5000, -1},                    //2
          {"Мёртвый олень", 15000, -1},            //3
          {"Буксировочный трос", 7000, -1},        //4
          {"Огнетушитель", 10000, -1},            //5
          {"Мешок с деньгами", 32700, 4},            //6
          {"Нож", 7000, 4},                        //7
          {"Бита", 9500, -1},                        //8
          {"Катана", 23950, -1},                    //9
          {"Бензопила", 6500, -1},                //10
          {"Коктейль Молотова", 48700, -1},        //11
          {"Glock 19", 27000, -1},                //12
          {"Тайзер", 24000, -1},                    //13
          {"Remington 870", 17300, -1},            //14
          {"Обрез", 15400, -1},                    //15
          {"Сайга-12", 16950, -1},                //16
          {"ОЦ-14 Гроза", 27950, -1},                //17
          {"АКС-74У", 32540, -1},                    //18
          {"Desert Eagle", 19500, -1},            //19
          {"HK416", 43750, -1},                    //20
          {"АКМ", 3835, -1},                        //21
          {"AWM", 70000, -1},                        //22
          {"Гранаты", 25000, -1},                    //24
          {"Наркотики", 230000, 4},                //25
          {"Патроны", 35000, 4},                    //26
          {"Металл", 7900, -1},                    //27
          {"Контрабанда", 270000, 4},                //28
          {"Отмычка", 4000, -1},                    //29
          {"Ящик с патронами", 45000, -1},        //30
          {"Кастет", 1500, -1},                    //31
          {"Дубинка", 3500, -1},                    //32
          {"Двойной дилдо", 20000, -1},            //33
          {"Малый дилдо", 15000, -1},                //34
          {"Вибратор", 25000, -1},                //35
          {"Вибратор 2", 27500, -1},                //36
          {"Цветы", 7000, -1},                    //37
          {"Топор", 2400, -1},                    //38
          {"Камера", 17500, 2},                    //39
          {"Парашют", 75000, 4},                    //40
          {"Предмет интерьера", 23500, -1},        //41
          {"MSR", 20000, -1},                        //42
          {"Слезоточивый газ", 6000, -1},            //43
          {"Ремонтный комплект", 50000, 4},        //44
          {"Взрывпакет", 25000, -1},                //45
          {"Детонатор", 5000, -1},                //46
          {"Обычный нож", 2000, -1},                //47
          {"Позолоченный нож", 90000, 0},            //48
          {"Рог изобилия", 80000, 0},                //49
          {"Картина с пейзажем", 270000, 0},        //50
          {"Картина с пятнами", 345000, 0},        //51
          {"Мушкет", 12500, -1},                    //52
          {"Позолоченный мушкет", 37850, -1},        //53
          {"Старый телефон", 1200, -1},            //54
          {"Оленьи рога", 40000, 0},                //55
          {"Статуэтка (человек)", 60000, 0},        //56
          {"Стутуэтка (мамонт)", 45000, 0},        //57
          {"Статуэтка (луна)", 90000, 0},            //58
          {"Самурайский меч", 127990, 0},            //59
          {"Настольная лампа", 3500, -1},            //60
          {"Кувшин", 1500, -1},                    //61
          {"Корона", 485900, 0},                    //62
          {"Золотая корона", 800000, 0},            //63
          {"Шкатулка из дерева", 80000, 0},        //64
          {"Шкатулка с позолотой", 135000, 0},    //65
          {"Гитара", 50000, 4},                    //66
          {"Рокерская гитара", 80000, 4},            //67
          {"Холодильник", 220000, 2},                //68
          {"Холодильник (черный)", 225000, 2},    //69
          {"Микроволновка", 15000, 2},            //70
          {"Стиральная машинка", 100000, 2},        //71
          {"Утюг", 5000, 2},                        //72
          {"Утюг", 5500, 2},                        //73
          {"Ноутбук", 35000, 2},                    //74
          {"Сломанный ноутбук", 10000, 2},        //75
          {"Смартфон", 50000, 2},                    //76
          {"Телевизор", 150000, 2},                //77
          {"Разбитый телевизор", 30000, 2},        //78
          {"Пылесос", 7000, 2},                    //79
          {"XBOX ONE", 65000, 2},                    //80
          {"PS4", 90000, 2},                        //81
          {"Большая плазма", 100000, -1},            //82
          {"Коробка с микрофоном", 6750, -1},        //83
          {"Музыкальный центр", 85000, 2},        //84
          {"Антикварный костюм", 1, -1},            //85
          {"Антикварный костюм", 1, -1},            //86
          {"Антикварный костюм", 1, -1},            //87
          {"Антикварный костюм", 1, -1},            //88
          {"Антикварный костюм", 1, -1},            //89
          {"Антикварный костюм", 1, -1},            //90
          {"Кепка HARD", 3000, -1},                //91
          {"Серая бандана", 6000, -1},            //92
          {"Темная бандана", 6000, -1},            //93
          {"Черная бандана", 6500, -1},            //94
          {"Зеленая бандана", 7500, -1},            //95
          {"Сумка с ремнем", 15000, -1},            //96
          {"Портфель", 450000, 4},                //97
          {"Куфия", 1, -1},                        //98
          {"Автомобильный номер", 1, -1},            //99
          {"Одежда", 1, -1},                        //100
          {"Слезоточивые гранаты", 7000, -1},        //101
          {"Ящик с патронами", 35000, 4},            //102
          {"Сломанный банкомат", 15000, 4},        //103
          {"Старое сиденье", 10000, 4},            //104
          {"Черное сиденье", 20000, 4},            //105
          {"Гоночное сиденье", 50000, 4},            //106
          {"Телефон Brick 3310", 5555, 4},        //107
          {"Телефон Brick", 9000, -1},            //108
          {"Телефон Galaxy", 15000, 4},            //109
          {"Телефон Orange", 115000, 2},            //110
          {"Золотой рубль", 60000, 4},            //111
          {"Золотые два рубля", 90000, 4},        //112
          {"Золотой червонец", 180000, 4},        //113
          {"Золотые пятьдесят", 500000, 4},        //114
          {"Системный блок", 10000, 2},            //115
          {"Отмычки", 100, -1},                    //116
          {"Руль TAZ 2101", 3000, 4},                //117
          {"Руль GTR", 45000, 4},                    //118
          {"Руль Sternchen AMG", 100000, 4},        //119
          {"Старый сейф", 18950, 4},                //120
          {"Сломанный проигрыватель", 25000, 4},    //121
          {"Диски", 30000, 4},                    //122
          {"Ноутбук Apple", 270000, 2},            //123
          {"Металлолом", 3000, 4},                //124
          {"Лопата", 5000, 4},                    //125
          {"Батареи", 600, -1},                    //126
          {"Металлоискатель B.H Junior", 15000, -1},//127
          {"Металлоискатель Garrett 250", 25000, -1},//128
          {"Мертвая утка", 7500, -1},                //129
          {"Надувная лодка", 9000, -1},        //130
          {"Свисток на уток", 500, -1},            //131
          {"Удочка", 45000, -1},                        //132
          {"Улов", 7000, -1},                        //133
          {"Кусочки хлеба", 150, -1},                //134
          {"Лягушки", 250, 4},                    //135
          {"Кузнечики", 300, 4},                    //136
          {"Рецепт отмычки", 100, -1},            //137
          {"Тряпка", 100, -1},                    //138
          {"Дерево", 200, -1},                    //139
          {"Бутылка", 200, -1},                    //140
          {"Шприц", 500, -1},                        //141
          {"Бинт", 600, -1},                        //142
          {"Жгут", 600, 4},                        //143
          {"Порох", 700, 4},                        //144
          {"Крахмал", 350, -1},                    //145
          {"Прицел", 1500, -1},                    //146
          {"Глушитель", 3500, -1},                //147
          {"Сломанный iPhone", 7500, 2},            //148
          {"Запчасти к iPhone", 500, 4},            //149
          {"Запчасти к ноутбуку", 1000, 4},        //150
          {"Денежная печат.машинка", 39000, 2},    //151
          {"Запчасти к печт.машинке", 3000, 4},    //152
          {"Инструменты", 800, 4},                //153
          {"Сварка", 5000, -1},                    //154
          {"Колесо", 50000, 4},                    //155
          {"Аккумулятор", 2500, 4},                //156
          {"Рецепт кастета", 200, -1},            //157
          {"Рецепт обреза", 250, -1},                //158
          {"Рецепт глюкозы", 250, -1},            //159
          {"Рецепт печат.машинки", 1000, -1},        //160
          {"Стеклянная бутылка", 300, -1},        //161
          {"Солярка", 1000, -1},                    //162
          {"Наручные часы (корич)", 15000, -1},    //163
          {"Наручные часы (белые)", 15000, -1},    //164
          {"Моторное масло", 1000, -1},            //165
          {"Воздушный фильтр", 1500, -1},            //166
          {"Масляной фильтр", 1950, -1},            //167
          {"Лейка", 700, -1},                        //168
          {"Марихуанна", 75000, -1},                //169
          {"Огурцы", 1000, -1},                    //170
          {"Помидоры", 1000, -1},                    //171
          {"Семена конопли", 1000, -1},            //172
          {"Семена томата", 350, -1},            //173
          {"Семена огурцов", 350, -1},            //174
          {"Косяк", 1400, -1},                    //175
          {"Кристаллы", 75000, 4},                //176
          {"Ящик с материалами", 5000, 4},        //177
          {"Болторезы", 2000, -1},                //178
          {"Материалы", 3000, -1},                //179
          {"Сабвуфер", 150000, 2},                //180
          {"Очки", 5000, -1},                        //181
          {"Бандана",6000, -1},                    //182
          {"Маска",10000, -1},                    //183
          {"Берет",3000, -1},                        //184
          {"Шляпа", 1000, -1},                    //185
          {"Бочка", 15000, 4},                    //186
          {"Химия", 7000, 4},                        //187
          {"Двигатель", 170000, 4},                //188
          {"Старый руль AMG", 14000, 4},            //189
          {"Запчасти к рулю AMG", 3000, 4},        //190
          {"Лобовое стекло", 30000, 4},            //191
          {"Спутник", 129600, -1},                //192
          {"Кристалл (красный)", 70000, 4},        //193
          {"Кристалл (фиолетовый)", 90000, 4},    //194
          {"Кристалл (зеленый)", 150000, 4},        //195
          {"Кристалл (синий)", 50000, 4},            //196
          {"Модель Volga", 45000, -1},            //197
          {"Модель ВАЗ 2109", 50000, 4},            //198
          {"Модель РАФ-2203", 47500, 4},            //199
          {"Гироскутер", 60000, 2},                //200
          {"Бинокль", 6000, -1},                    //201
          {"Телескоп", 129000, 2},                //202
          {"Комиксы (Spider Man)", 1000, -1},        //203
          {"Комиксы (Ninja)", 1190, -1},            //204
          {"Комиксы (Bakugan)", 990, -1},            //205
          {"Клавиатура RGB", 15290, 2},            //206
          {"Клавиатура", 9000, 2},                //207
          {"Шахматы", 5000, -1},                    //208
          {"Складной зонтик", 6000, -1},            //209
          {"Зонтик", 4000, -1},                    //210
          {"Пирамидка", 400, -1},                    //211
          {"Самокат", 7000, -1},                    //212
          {"Фигурка пришельца", 15900, -1},        //213
          {"Фигурка пони", 6000, -1},                //214
          {"PSP", 9000, -1},                        //215
          {"Анаболики", 6000, -1},                //216
          {"Противорвотное", 3450, -1},            //217
          {"Запчасти к двигателю", 29990, 4},        //218
          {"Сумка", 10000, -1},                    //219
          {"Аксессуар на пояс", 2500, -1},        //220
          {"Украшение на руку", 29000, -1},        //221
          {"Рюкзак", 7900, -1},                    //222
          {"Самовар", 29390, -1},                    //223
          {"Фаберже", 25000, -1},                    //224
          {"Часы", 25000, -1},                    //225
          {"Граммофон", 170000, 0},                //226
          {"Кресло", 80000, 4},                    //227
          {"Чайник", 2500, -1},                    //228
          {"Статуя", 4000, -1},                    //229
          {"Проигрыватель", 5990, -1},            //230
          {"Глобус", 4300, -1},                    //231
          {"Печат.машинка", 23400, 4},            //232
          {"Поп-ит", 600, -1},                    //233
          {"Брелок поп-ит", 150, -1},                //234
          {"Маска Гая-Фокса", 7000, -1},            //235
          {"Красный нож", 15000, -1},                //236
          {"Цветной нож", 25000, 4},                //237
          {"Золотой кастет", 70000, 4},            //238
          {"Поп-ит", 350, -1},                    //239
          {"Поп-ит", 450, -1},                    //240
          {"Стиральный порошок", 790, 4},            //241
          {"Рем.комплект к стир.машинке", 1500, 4},//242
          {"Конфеты", 350, -1},                    //243
          {"Ёлочные украшения", 290, -1},            //244
          {"Снегоуборочная машинка", 15000, 4},    //245
          {"Украшение на шею", 3000, -1},            //246
          {"Наполненная лейка", 600, 4},            //247
          {"Животное", 100000, -1},                //248
          {"Будка для животных", 65000, -1},        //249
          {"Корм для животных", 1500, 4},            //250
          {"Коробка спичек", 500, -1},            //251
          {"Жареная рыба", 1000, -1},                //252
          {"Нелегальная продукция", 500, 4},        //253
          {"Аппарат для диагностики", 50000, -1},    //254
          {"Маска", 700, -1},                        //255
          {"Автосигнализация", 300000, -1},        //256
          {"Лотерейный билет", 100, -1},            //257
          {"Кейс `Форсаж`", 0, -1},            //258
          {"Ключ от кейса", 0, -1},            //259
          {"Украшение на шею", 5000, -1},            //260
          {"Кейс `Темные дела`", 5000, -1},        //261
          {"Книга рецептов", 5000, -1},            //262
          {"Плащ", 5000, -1},                        //263
          {"Растение (одуванчик)", 5000, -1},        //264
          {"Растение (крапива)", 5000, -1},        //265
          {"Растение (валериана)", 5000, -1},        //266
          {"Растение (пещерный гриб)", 5000, -1}, //267
          {"Плот монстра", 5000, -1},                //268
          {"Эликсир здоровья", 5000, -1},            //269
          {"Эликсир силы", 5000, -1},                //270
          {"Эликсир выносливости", 5000, -1},        //271
          {"Кейс `Велесова ночь`", 0, -1},        //272
          {"Эликсир точности", 5000, -1},            //273
          {"Зеленые кристаллы", 5000, -1},        //274
          {"Акссесуар на левое плечо", 5000, -1},    //275
          {"Тауметр", 5000, -1},                    //276
          {"Бронежилет", 5000, -1},                //277
          {"Кейс `Оперской`", 0, -1},            //278
          {"Балончик с краской", 5000, -1},        //279
          {"Напиток", 5000, -1},                    //280
          {"Трап", 5000, -1},                        //281
          {"Лекарство", 5000, -1},                //282
          {"Гарелка", 5000, -1},                    //283
          {"Кейс `Новогодний`", 0, -1},        //284
          {"Украшение для транспорта", 5000, -1},    //285
          {"Бутылка", 5000, -1},                    //286
          {"Крылья", 5000, -1},                    //287
          {"Ценная бумага", 5000, -1},            //288
          {"Посох", 5000, -1},                    //289
          {"Кейс `Черное золото`", 0, -1},        //290
          {"Аксессуар на спину", 5000, -1},        //291
          {"Аксессуар на ногу", 5000, -1},        //292
          {"Фишки", 5000, -1},                    //293
          {"Нож для свежевания", 5000, -1},        //294
          {"Шкура оленя", 5000, -1},                //295
          {"Шкура медведя", 5000, -1},            //296
          {"Шкура заяца", 5000, -1},                //297
          {"Шкура кабана", 5000, -1},                //298
          {"Животный жир", 5000, -1},                //299
          {"Кейс `Охотничий`", 0, -1},            //300
          {"Игровая консоль", 5000, -1},            //301
          {"Виниловая пластинка", 5000, -1},        //302
          {"Запчасти проигрывателя", 5000, -1},    //303
          {"Сломанный сабвуфер", 5000, -1},        //304
          {"Запчасти сабвуфера", 5000, -1},        //305
          {"Сломанный металлоискатель", 5000, -1},//306
          {"Запчасти металлоискателя", 5000, -1},    //307
          {"Полотно для лопаты", 5000, -1},        //308
          {"Черенок для лопаты", 5000, -1},        //309
          {"Сломанный аппарата диагн-ки", 5000, -1},//310
          {"Запчасти аппарата диагн-ки", 5000, -1},//311
          {"Корпус наручных часов", 5000, -1},    //312
          {"Ремешок наручных часов", 5000, -1},    //313
          {"Механизм наручных часов", 5000, -1},    //314
          {"Стекло наручных часов", 5000, -1},    //315
          {"Мешочек для драгоценностей", 5000, -1},//316
          {"Кроссовки", 5000, -1},                //317
          {"Футболка", 5000, -1},                    //318
          {"Джинсы", 5000, -1},                    //319
          {"Золотые серьги", 5000, -1},            //320
          {"Бриллиант", 5000, -1},                //321
          {"Проигрыватель", 5000, -1},            //322
          {"Бронепластина", 5000, -1},            //323
          {"Скейтборд", 5000, -1},                //324
          {"Рыболовная леска", 5000, -1},            //325
          {"Наживка", 5000, -1},                    //326
          {"Осетровая икра", 5000, -1},            //327
          {"Кейс `Египетская сила`", 0, -1},    //328
          {"Золотой череп", 5000, -1},            //329
          {"Древняя табличка", 5000, -1},            //330
          {"Канистра воды", 5000, -1},            //331
          {"Рецепт для пошива", 5000, -1},        //332
          {"Известь", 5000, -1},                    //333
          {"Гербицид", 5000, -1},                    //334
          {"удобрение", 5000, -1},                //335
          {"Семена", 5000, -1},                    //336
          {"Урожай", 5000, -1},                    //337
          {"Эликсир бесшумности", 5000, -1},        //338
          {"Эликсир регенерации", 5000, -1},        //339
          {"Эликсир устойчивости", 5000, -1},        //340
          {"Эликсир удачи", 5000, -1},            //341
          {"Планшет", 5000, -1},                    //342
          {"Растение (клевер)", 5000, -1},        //343
          {"Кейс `Велесова Ночь - 2`", 0, -1},    //344
          {"Шкура белого медведя", 5000, -1},        //345
          {"Растение мох", 5000, -1},                //346
          {"Ёлочные игрушки", 0, -1},            //347
          {"Кейс `Рождественский экспресс`", 0, -1},//348
          {"Обручальное кольцо", 5000, -1},        //349
          {"Кейс `Путь воина`", 0, -1},        //350
          {"Сигареты", 5000, -1},                    //351
          {"Глушилка", 5000, -1},                    //352
          {"Заточка", 5000, -1},                    //353
          {"Чертеж тюнинга", 0, -1},            //354
          {"Кейс `Пиратский`", 0, -1},            //355
          {"Кейс `Проклятие`", 0, -1},            //356
          {"Киберкредиты", 0, -1},            //357
          {"Чертеж Gaz Spooky Baz", 0, -1},            //358
          {"Ледяные механизмы", 0, -1},            //359
          {"Кейс Зимняя сказка", 0, -1},            //360
          {"Домкрат", 0, -1},            //361
          {"Патроны 9х19", 0, -1},            //362
          {"Патроны", 0, -1},            //363
          {"Патроны", 0, -1},            //364
          {"Патроны 12х70", 0, -1},            //365
          {"Патроны 5.45х39", 0, -1},            //366
          {"Патроны 5.56х45", 0, -1},            //367
          {"Патроны 7.62х39", 0, -1},            //368
          {"Болгарка", 0, -1},            //369
          {"Чертеж", 0, -1},            //370
          {"Бомба", 0, -1},            //371
          {"Cветошумовая граната", 0, -1},            //372
          {"Сертификат", 0, -1},            //373
          {"Украденая техника", 0, -1},            //374
          {"Лом", 0, -1},            //375
          {"Устройства взлома замков", 0, -1},            //376
          {"Глушитель для сигнализации", 0, -1},            //377
          {"Белый порошок", 0, -1},            //378
          {"Обезбол", 0, -1},            //379
          {"Ящик с Медикаменты", 0, -1},            //380
          {"Медикаменты", 0, -1},            //381
          {"Кислота", 0, -1},            //382
          {"Ацитон", 0, -1},            //383
          {"Псевоэфедрин", 0, -1},            //384
          {"Кейс `Бандитский`", 0, -1},  // 385
          {"Кейс `Клоунский`", 0, -1},  // 386
          {"Кейс `Мандариновый`", 0, -1}
      };