- Notifications
You must be signed in to change notification settings - Fork704
Description
#include <a_samp>
// Максимальное количество игроков
#define MAX_PLAYERS 1000
// Диалоги имеют ID: 101 - Логин, 102 - Регистрация, 103 - Заявка
// Для простоты данные хранятся в массивах (для реального проекта рекомендуется использовать базу данных)
new bool:Registered[MAX_PLAYERS];
new playerLogin[MAX_PLAYERS][32];
new playerPass[MAX_PLAYERS][32];
// Обработчик текстовых команд игрока
public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp(cmdtext, "/login", true) == 0)
{
ShowLoginDialog(playerid);
return 1;
}
if(strcmp(cmdtext, "/register", true) == 0)
{
ShowRegisterDialog(playerid);
return 1;
}
if(strcmp(cmdtext, "/apply", true) == 0)
{
ShowApplicationDialog(playerid);
return 1;
}
return 0;
}
// Функция показа диалога для входа
public ShowLoginDialog(playerid)
{
ShowPlayerDialog(playerid, 101, DIALOG_STYLE_INPUT, "Вход",
"Введите логин;Введите пароль", "Войти", "Отмена");
}
// Функция показа диалога для регистрации
public ShowRegisterDialog(playerid)
{
ShowPlayerDialog(playerid, 102, DIALOG_STYLE_INPUT, "Регистрация",
"Введите логин;Введите пароль", "Зарегистрироваться", "Отмена");
}
// Функция показа диалога для подачи заявки
public ShowApplicationDialog(playerid)
{
ShowPlayerDialog(playerid, 103, DIALOG_STYLE_INPUT, "Заявка",
"Введите текст заявки", "Отправить", "Отмена");
}
// Обработчик выбора в диалоговом окне
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
// Если игрок нажал "ОК" (response == 1)
if(response == 1)
{
switch(dialogid)
{
case 101: // Логин
{
HandleLogin(playerid, inputtext);
}
case 102: // Регистрация
{
HandleRegistration(playerid, inputtext);
}
case 103: // Заявка
{
HandleApplication(playerid, inputtext);
}
}
}
return 1;
}
// Функция обработки входа
// Ожидается, что в inputtext будет строка вида "логин;пароль"
public HandleLogin(playerid, inputtext[])
{
new username[32], password[32];
// Разбиваем строку по символу ';'
SplitInput(inputtext, ';', username, sizeof(username), password, sizeof(password));
if(!strcmp(username, playerLogin[playerid], true) && !strcmp(password, playerPass[playerid], true)){ SendClientMessage(playerid, 0x00FF00FF, "Вход выполнен успешно!");}else{ SendClientMessage(playerid, 0xFF0000FF, "Неверный логин или пароль!");}
}
// Функция обработки регистрации
// Ожидается, что в inputtext будет строка вида "логин;пароль"
public HandleRegistration(playerid, inputtext[])
{
new username[32], password[32];
SplitInput(inputtext, ';', username, sizeof(username), password, sizeof(password));
// Простейшая проверка: если игрок уже зарегистрированif(Registered[playerid]){ SendClientMessage(playerid, 0xFF0000FF, "Вы уже зарегистрированы!"); return;}strcopy(playerLogin[playerid], sizeof(playerLogin[]), username);strcopy(playerPass[playerid], sizeof(playerPass[]), password);Registered[playerid] = true;SendClientMessage(playerid, 0x00FF00FF, "Регистрация прошла успешно! Теперь вы можете войти.");
}
// Функция обработки заявки
public HandleApplication(playerid, inputtext[])
{
// Здесь можно добавить проверку, запись в базу, логирование и т.д.
printf("Игрок %d подал заявку: %s", playerid, inputtext);
SendClientMessage(playerid, 0x00FF00FF, "Заявка отправлена!");
}
// Функция для разбивки входной строки по разделителю
// input - исходная строка, separator - символ-разделитель,
// output1 и output2 - буферы для записанных подстрок.
stock SplitInput(const input[], separator, output1[], len1, output2[], len2)
{
new i = 0, j = 0, k = 0, inputlen = strlen(input);
// Копируем символы в output1 до разделителяwhile(i < inputlen && input[i] != separator){ output1[j++] = input[i++]; if(j >= len1 - 1) break;}output1[j] = '\0';// Если разделитель найден, пропускаем егоif(i < inputlen && input[i] == separator) i++;// Копируем оставшуюся часть в output2while(i < inputlen){ output2[k++] = input[i++]; if(k >= len2 - 1) break;}output2[k] = '\0';
}