From_Enot
Дебютант
Что ж, в 1-ой части, я рассказал о том, как подготовить мод к написанию регистрации. В данном уроке, мы ее напишем.
Что в ней будет:
1. Диалог регистрации
2. Диалог подтверждения пароля
3. Решение математического примера
4. Вывод правил сервера
5. Выбор пола
6. Сохранение аккаунта.
Помимо этого, будет несколько уже интересных функций:
1. Если Вы не прошли регистрацию до конца и случайно нажали ESC и нас выгнало с сервера, то когда Вы зайдете еще раз, регистрация продолжится.
2. Не будет выбора скина. Регистрация конечно для Role Play сервера, но я всегда делал без выбора скина, ибо мне это не нужно.
3. Решение математического примера. В диалоге выведется рандомный пример, который игрок должен будет решить.
Приступим. В начале мода Вы видите:
Как Вы уже поняли, здесь мы добавляем инклуды. Поскольку, наша система находится на mxINI, то добавим его следующим образом
Теперь. Добавим некоторые дефайны, сразу после инклудов:
Рассказывать про виды диалогов я не буду, ибо на форуме их и так полно. И добавим дефайны цветов:
Теперь, после объявления всех инклудов и дефайнов, которые нам понадобятся, мы с Вами добавим несколько переменных:
Теперь создадим массив, который будет хранить в себе информацию об игроке:
Теперь создадим последнюю переменную, которая будет хранить в себе правила сервера
Данные правила, Вы само собой замените на свои. Эти я взял из интернета.
Далее идем в
Его заменяем на:
Теперь расскажу. Я около " трудных " мест, поставил цифры. Теперь объясню их суть.
1) Создаем переменную string которая хранит в себе 250 символов.
2) Получаем имя игрока
3) Как я уже ранее написал, я сделал интересную функцию, которую не везде видел. Если вы заходите на сервер и трижды вводите неправильный пароль, то вас кикает. В следующий раз у вас уже будет всего 2 попытки на ввод правильного пароля. Если же вы опять неправильно вводите пароль, то вас банит сервер. Единственный недочет этой функции в том, что я не сделал, что бы сервер сам разбанивал игрока через некоторое время. Так что разбанить можно через файл.
Продолжаем.
В
мы начинаем вставлять наши диалоги:
Фуф. Теперь объясню что я пометил здесь.
1) Опять же создаем string, который на сей раз будет содержать в себе 1500 символов
2) Создаем switch с диалогами, для каждого диалога отдельный case. Думаю все просто.
3) Здесь мы создаем проверку на то, что ввел игрок. Если он ввел русские символы, то ему высветится сообщение о том, что так делать нельзя
и просьба о том, что бы он сменил раскладку.
4) Все просто. Мод открывает файл, берет информацию из строчки с паролем ( " Password " ) и стадию регистрации ("Registration Stage"), после это будет происходить функция. Полностью ее объяснять я тоже не буду, ибо это займет очень много времени, как на мой ввод, так и на ваше чтение.
5) Создаем еще одну проверку.
6) Теперь пойдут case's которые будут проверять следующее: Как я уже говорил, если Вы не закончили регистрацию до конца, то при заходе у вас все продолжится с того момента где вы остановились. И данные кейсы ( я пометил вам как 7 и 8 ) будут как раз проверять эту стадию регистрации
9) Если, с данной системой все в порядке и игрок все сделал так как надо нам, то мод записывает информацию из массива pInfo в файл с нашим ником. Затем он закрывает его и спавнит нас.
10) Дальше у нас пойдет проверка на то, ошиблись мы в воде пароля или нет. Там я тоже рассказывать не буду, потому что ничего сложного не вижу.
Теперь дополним данный паблик оставшимися диалогами и приступим к окончанию.
С диалогами закончили. Теперь нам останется создать сток с сохранением и подключить его
В самый конец мода:
И заменим паблик
на
И остается сделать последнее, сток со спавном игрока
Опять же в самый конец мода вставляем:
И в OnPlayerSpawn добавим:
Я думаю, что объяснил все очень и очень подробно, проблем возникнуть не должно. Вам останется сделать следующее:
1) В папке scriptfiles создать папку Accounts
2) Скачать инклуд mxINI, и закинуть его в папку pawno --> include
Надеюсь мои старания были не зря. Более опытные скриптеры, к Вам просьба, если заметите какие либо ошибочки или более лучшую оптимизацию, напишите сюда или в лс. Всем спасибо
Скачать инклуд:
файл:
virustotal:
Что в ней будет:
1. Диалог регистрации
2. Диалог подтверждения пароля
3. Решение математического примера
4. Вывод правил сервера
5. Выбор пола
6. Сохранение аккаунта.
Помимо этого, будет несколько уже интересных функций:
1. Если Вы не прошли регистрацию до конца и случайно нажали ESC и нас выгнало с сервера, то когда Вы зайдете еще раз, регистрация продолжится.
2. Не будет выбора скина. Регистрация конечно для Role Play сервера, но я всегда делал без выбора скина, ибо мне это не нужно.
3. Решение математического примера. В диалоге выведется рандомный пример, который игрок должен будет решить.
Приступим. В начале мода Вы видите:
PHP:
#include <a_samp>
PHP:
#include <a_samp>
#include <mxINI>
PHP:
#define Kickk SetTimerEx("kick", 100, false, "i", playerid); // Создадим define с таймером, зачем он я объясню позже.
#define DSM DIALOG_STYLE_MSGBOX // Сокращаем написание DIALOG_STYLE_MSGBOX до DSM
#define DSL DIALOG_STYLE_LIST // Сокращаем написание DIALOG_STYLE_LIST до DSL
#define DSI DIALOG_STYLE_INPUT // Сокращаем написание DIALOG_STYLE_INPUT до DSI
#define DSP DIALOG_STYLE_PASSWORD // Сокращаем написание DIALOG_STYLE_PASSWORD до DSP
PHP:
#define MODER_COLOR 0xff6a6aaa // Цвет для ошибок, предупреждений и т.п.
#define HELP_COLOR 0xfff48daa // Цвет для подсказок и каких либо " Внимание "
#define SERVER_COLOR 0xffd66eaa // Цвет для Регистрации и Авторизации
#define COLOR_RED 0xff0000aa // Красный цвет
#define COLOR_WHITE 0xffffffaa // Белый цвет
PHP:
new nickname[MAX_PLAYER_NAME]; // Будет нужна для получения имени игрока
new Login[MAX_PLAYERS];
new AccountExist[MAX_PLAYERS];
new quest; // Нужна будет для диалога с решением математического примера
PHP:
enum pInfo // Задаем название массиву - pInfo
{
pRegStage, // Стадия регстрации
pLoginTries,
pSex, // Пол
pSkin, // Скин
pLevel, // Уровень
pAdmin, // Админка
pModerator,
pChatModerator,
pHouse, // Дом
Float: pHealth // Здоровье
}
new PlayerInfo[MAX_PLAYERS][pInfo]; // Так же создадим переменную с названием PlayerInfo.
PHP:
new ServerRules[7][]=
{
{"{ffd66e}{ffffff}1){ffd66e} Запрещено использование любых программ, дающих преимущество над другими игроками или раcширяющими возможности персонажа(читов).\nНаказание - {ffffff}бан{ffd66e}. Срок определяется модератором и зависит от типа нарушения, а также уровня игрока."},
{"{ffd66e}\n\n{ffffff}2){ffd66e} Запрещена всевозможная реклама проектов и/или ресурсов, не относящихся к {ffffff}Role Play{ffd66e}.\nНаказание - {ffffff}бан{ffd66e}."},
{"{ffd66e}\n\n{ffffff}3){ffd66e} Запрещены любого рода оскорбления игроков.\nНаказание выбирает модератор, полагаясь на ситуацию и сложившиеся обстоятельства.\nОскорбление родных/родственников. Наказание - {ffffff}бан{ffd66e}."},
{"{ffd66e}\n\n{ffffff}4){ffd66e} Запрещено беспорядочное и непосредственное причинение урона игрокам и транспортным средствам(DM).\nНаказание - {ffffff}блокировка игрового процесса{ffd66e}. "},
{"{ffd66e}\n\n{ffffff}5){ffd66e} Запрещен обман игроков, также любые махинации с игровым имуществом и/или валютой.\nНаказание выбирает модератор, полагаясь на ситуацию и сложившиеся обстоятельства."},
{"{ffd66e}\n\n{ffffff}6){ffd66e} Запрещена передача и/или продажа игрового аккаунта другому игроку.\nНаказание - {ffffff}блокировка аккаунта{ffd66e}."},
{"{ffd66e}\n\n\nНе забудьте посетить наш сайт - {ffffff}Pawno-Info.ru{ffd66e}.\nТам вы найдете много полезной информации и сможете получить ответ на все ваши вопросы, связанные с игровым процессом."}
};
Далее идем в
PHP:
public OnPlayerRequestClass(playerid, classid)
PHP:
public OnPlayerRequestClass(playerid, classid)
{
new string[250]; // - 1
GetPlayerName(playerid, nickname, sizeof(nickname)); // - 2
switch(AccountExist[playerid])
{
case 1:
{
if(PlayerInfo[playerid][pLoginTries] == 3) // - 3
{
SendClientMessage(playerid, MODER_COLOR, "Ранее вы уже пытались войти в аккаунт, но трижды ввели неправильный пароль.");
SendClientMessage(playerid, MODER_COLOR, "Администрация считает, что это попытка взлома аккаунта. На этот раз у вас 2 попытки, чтобы ввести правильный пароль.");
}
if(PlayerInfo[playerid][pLoginTries] == 5) // - 3
{
SendClientMessage(playerid, MODER_COLOR, "Было совершено несколько неудачных входов в аккаунт. Администрация посчитала, что это попытка взлома аккаунта.");
SendClientMessage(playerid, MODER_COLOR, "В целях предотвратить возможный взлом, ваш аккаунт временно заблокирован.");
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Чтобы снять блокировку раньше времени, обратитесь к администрации: Pawno-Info.ru.");
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Доступ к аккаунту временно заблокирован. Введите (q)uit, чтобы выйти.");
Kickk
return true;
}
format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер: Role Play (0.3.7) [RUS]\n•Игровой режим: RP: LS/SF/LV (RP)\n•Сайт сервера: Pawno-Info.ru\n\nЭтот аккаунт уже зарегистрирован.\n\nВведите пароль от аккаунта:", nickname);
ShowPlayerDialog(playerid, 1, DSP, "Авторизация", string, "Вход", "Отмена");
}
case 0:
{
SendClientMessage(playerid, COLOR_WHITE, "Этот ник {ff0000}не зарегистрирован{ffffff} на этом сервере. Зарегистрируйтесь, пожалуйста.");
format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер: Role Play (0.3.7) [RUS]\n•Игровой режим: RP: LS/SF/LV (RP)\n•Сайт сервера: Pawno-Info.ru\n\nИспользуемый вами ник не занят.\nЗарегистрируйтесь\n\nВведите желаемый пароль от аккаунта:", nickname);
ShowPlayerDialog(playerid, 2, DSP, "Регистрация", string, "Далее", "Отмена");
}
}
return 1;
}
1) Создаем переменную string которая хранит в себе 250 символов.
2) Получаем имя игрока
3) Как я уже ранее написал, я сделал интересную функцию, которую не везде видел. Если вы заходите на сервер и трижды вводите неправильный пароль, то вас кикает. В следующий раз у вас уже будет всего 2 попытки на ввод правильного пароля. Если же вы опять неправильно вводите пароль, то вас банит сервер. Единственный недочет этой функции в том, что я не сделал, что бы сервер сам разбанивал игрока через некоторое время. Так что разбанить можно через файл.
Продолжаем.
В
PHP:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
PHP:
new string[1500]; // - 1
switch(dialogid) // - 2
{
case 1:
{
if(response)
{
if(!strlen(inputtext))
{
format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер: Role Play (0.3.7) [RUS]\n•Игровой режим: RP: LS/SF/LV (RP)\n•Сайт сервера: Pawno-Info.ru\n\nЭтот аккаунт уже зарегистрирован.\n\nВведите пароль от аккаунта:", nickname);
ShowPlayerDialog(playerid, 1, DSP, "Авторизация", string, "Вход", "Отмена");
return true;
}
for(new i = strlen(inputtext); i != 0; --i) // - 3
switch(inputtext[i]) // 3
{ // 3
case 'А'..'Я', 'а'..'я': // 3
{
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Смените раскладку вашей клавиатуры.");
format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер: Role Play (0.3.7) [RUS]\n•Игровой режим: RP: LS/SF/LV (RP)\n•Сайт сервера: Pawno-Info.ru\n\nЭтот аккаунт уже зарегистрирован.\n\nВведите пароль от аккаунта:", nickname);
ShowPlayerDialog(playerid, 1, DSP, "Авторизация", string, "Вход", "Отмена");
return true;
}
}
format(string, sizeof(string), "Accounts/%s.ini", nickname);
new File = iniOpen(string);
ini_getString(File, "Password", string); // -4
ini_getInteger(File, "Registration Stage", PlayerInfo[playerid][pRegStage]); // -4
if(!strcmp(inputtext, string, true)) // - 5
{
switch(PlayerInfo[playerid][pRegStage])
{
case 0:
{
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Внимание:{ffffff} В прошлый раз вы закончили регистрацию не до конца.");
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Ответьте на вопрос, чтобы продолжить регистрацию.");
new align = random(10);
SetPVarInt(playerid, "align", align);
format(string, sizeof(string), "{ffd66e}Сколько будет: {ffffff}%i{ffd66e} + {ffffff}%i{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", align, align*2+4);
ShowPlayerDialog(playerid, 4, DIALOG_STYLE_INPUT, "Вопрос:", string, "Далее", "Отмена");
PlayerInfo[playerid][pLoginTries] = 0;
iniClose(File);
return true;
}
case 1:// - 6
{
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Внимание:{ffffff} В прошлый раз вы закончили регистрацию не до конца.");
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Ответьте на вопрос, чтобы продолжить регистрацию.");
new align = random(10);
SetPVarInt(playerid, "align", align);
format(string, sizeof(string), "{ffd66e}Сколько будет: {ffffff}%i{ffd66e} + {ffffff}%i{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", align, align*2+4);
ShowPlayerDialog(playerid, 4, DIALOG_STYLE_INPUT, "Вопрос:", string, "Далее", "Отмена");
PlayerInfo[playerid][pLoginTries] = 0;
iniClose(File);
return true;
}
case 2: //- 7
{
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Внимание:{ffffff} В прошлый раз вы закончили регистрацию не до конца.");
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Выберите желаемый пол, чтобы продолжить регистрацию.");
ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
PlayerInfo[playerid][pLoginTries] = 0;
iniClose(File);
return true;
}
case 3: //- 8
{
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Внимание:{ffffff} В прошлый раз вы закончили регистрацию не до конца.");
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Ознакомьтесь с общими правилами сервера, чтобы продолжить регистрацию.");
format(string, sizeof(string), "%s%s%s%s%s%s%s", ServerRules[0], ServerRules[1], ServerRules[2], ServerRules[3], ServerRules[4], ServerRules[5], ServerRules[6]);
ShowPlayerDialog(playerid, 6, DSM, "Общие правила", string, "Играть", "");
PlayerInfo[playerid][pLoginTries] = 0;
iniClose(File);
return true;
}
case 4: //- 9
{
iniGet(File, "Password", string);
iniGetInt(File, "Sex", PlayerInfo[playerid][pSex]);
iniGetInt(File, "Skin", PlayerInfo[playerid][pSkin]);
iniGetInt(File, "Level", PlayerInfo[playerid][pLevel]);
iniGetInt(File, "Login Tries", PlayerInfo[playerid][pLoginTries]);
iniGetInt(File, "Admin", PlayerInfo[playerid][pAdmin]);
iniGetInt(File, "Moderator", PlayerInfo[playerid][pModerator]);
iniGetInt(File, "Chat Moderator", PlayerInfo[playerid][pChatModerator]);
iniGetInt(File, "House", PlayerInfo[playerid][pHouse]);
iniClose(File);
PlayerInfo[playerid][pLoginTries] = 0;
SpawnPlayer(playerid);
}
}
}
else // - 10
{
iniClose(File);
switch(PlayerInfo[playerid][pLoginTries])
{
case 0:
{
SendClientMessage(playerid, MODER_COLOR, "Вы ввели неправильный пароль. У вас осталось 2 попытки!");
format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер: Role Play (0.3.7) [RUS]\n•Игровой режим: RP: LS/SF/LV (RP)\n•Сайт сервера: Pawno-Info.ru\n\nЭтот аккаунт уже зарегистрирован.\n\nВведите пароль от аккаунта:", nickname);
ShowPlayerDialog(playerid, 1, DSP, "Авторизация", string, "Вход", "Отмена");
PlayerInfo[playerid][pLoginTries] = 1;
}
case 1:
{
SendClientMessage(playerid, MODER_COLOR, "Вы ввели неправильный пароль. У вас осталась 1 попытка!");
format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер: Role Play (0.3.7) [RUS]\n•Игровой режим: RP: LS/SF/LV (RP)\n•Сайт сервера: Pawno-Info.ru\n\nЭтот аккаунт уже зарегистрирован.\n\nВведите пароль от аккаунта:", nickname);
ShowPlayerDialog(playerid, 1, DSP, "Авторизация", string, "Вход", "Отмена");
PlayerInfo[playerid][pLoginTries] = 2;
}
case 2:
{
SendClientMessage(playerid, MODER_COLOR, "Вы трижды ввели неправильный пароль - Вы были кикнуты!");
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Введите (q)uit, чтобы выйти.");
PlayerInfo[playerid][pLoginTries] = 3;
SaveAccounts(playerid);
Kickk
}
case 3:
{
SendClientMessage(playerid, MODER_COLOR, "Вы ввели неправильный пароль. У вас осталась 1 попытка!");
format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер: Role Play (0.3.7) [RUS]\n•Игровой режим:RP: LS/SF/LV (RP)\n•Сайт сервера: Pawno-Info.ru\n\nЭтот аккаунт уже зарегистрирован.\n\nВведите пароль от аккаунта:", nickname);
ShowPlayerDialog(playerid, 1, DSP, "Авторизация", string, "Вход", "Отмена");
PlayerInfo[playerid][pLoginTries] = 4;
}
case 4:
{
SendClientMessage(playerid, MODER_COLOR, "В целях предотвратить возможный взлом, ваш аккаунт временно заблокирован.");
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Чтобы снять блокировку раньше времени, обратитесь к администрации: vk.com/realq5.");
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Введите (q)uit, чтобы выйти.");
PlayerInfo[playerid][pLoginTries] = 5;
SaveAccounts(playerid);
Kickk
}
}
}
}
else
{
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Внимание:{ffffff} Авторизация была отменена - Вы будете кикнуты.");
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Введите (q)uit, чтобы выйти.");
Kickk
}
}
1) Опять же создаем string, который на сей раз будет содержать в себе 1500 символов
2) Создаем switch с диалогами, для каждого диалога отдельный case. Думаю все просто.
3) Здесь мы создаем проверку на то, что ввел игрок. Если он ввел русские символы, то ему высветится сообщение о том, что так делать нельзя
4) Все просто. Мод открывает файл, берет информацию из строчки с паролем ( " Password " ) и стадию регистрации ("Registration Stage"), после это будет происходить функция. Полностью ее объяснять я тоже не буду, ибо это займет очень много времени, как на мой ввод, так и на ваше чтение.
5) Создаем еще одну проверку.
6) Теперь пойдут case's которые будут проверять следующее: Как я уже говорил, если Вы не закончили регистрацию до конца, то при заходе у вас все продолжится с того момента где вы остановились. И данные кейсы ( я пометил вам как 7 и 8 ) будут как раз проверять эту стадию регистрации
9) Если, с данной системой все в порядке и игрок все сделал так как надо нам, то мод записывает информацию из массива pInfo в файл с нашим ником. Затем он закрывает его и спавнит нас.
10) Дальше у нас пойдет проверка на то, ошиблись мы в воде пароля или нет. Там я тоже рассказывать не буду, потому что ничего сложного не вижу.
Теперь дополним данный паблик оставшимися диалогами и приступим к окончанию.
PHP:
case 2: // Данный кейс отвечает за диалог регистрации
{
if(response)
{
if(!strlen(inputtext))
{
format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер: Role Play (0.3.7) [RUS]\n•Игровой режим: RP: LS/SF/LV (RP)\n•Сайт сервера:Pawno-Info.ru\n\nИспользуемый вами ник не занят.\nЗарегистрируйтесь\n\nВведите желаемый пароль от аккаунта:", nickname);
ShowPlayerDialog(playerid, 2, DSP, "Регистрация", string, "Далее", "Отмена");
return true;
}
for(new i = strlen(inputtext); i != 0; --i)
switch(inputtext[i])
{
case 'А'..'Я', 'а'..'я':
{
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Пароль не должен содержать русских символов. Смените раскладку вашей клавиатуры.");
format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер: Role Play (0.3.7) [RUS]\n•Игровой режим: RP: LS/SF/LV (RP)\n•Сайт сервера: Pawno-Info.ru\n\nИспользуемый вами ник не занят.\nЗарегистрируйтесь\n\nВведите желаемый пароль от аккаунта:", nickname);
ShowPlayerDialog(playerid, 2, DSP, "Регистрация", string, "Далее", "Отмена");
return true;
}
}
if(strlen(inputtext) < 6 || strlen(inputtext) > 20) // делаем проверку на то, сколько символов ввел игрок. Если меньше 6 или больше 20, то мы ему отказываем.
{
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Пароль должен состоять минимум из 6 символов.");
format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер: Role Play (0.3.7) [RUS]\n•Игровой режим: : LS/SF/LV (RP)\n•Сайт сервера: Pawno-Info.ru\n\nИспользуемый вами ник не занят.\nЗарегистрируйтесь\n\nВведите желаемый пароль от аккаунта:", nickname);
ShowPlayerDialog(playerid, 2, DSP, "Регистрация", string, "Далее", "Отмена");
return true;
}
GetPlayerName(playerid, nickname, sizeof(nickname)); // Получаем имя игрока
format(string, sizeof(string), "Accounts/%s.ini", nickname);
new File = ini_createFile(string);
if(File < 0) ini_openFile(string);
{
ini_setString(File, "Password", inputtext); // Если регистрация прошла успешно, то записываем все данные из pinfo в файл с нашим ником.
ini_setInteger(File, "Registration Stage", PlayerInfo[playerid][pRegStage]);
ini_setInteger(File, "Login Tries", PlayerInfo[playerid][pLoginTries]);
ini_setInteger(File, "Money", GetPlayerMoney(playerid));
ini_setInteger(File, "Sex", PlayerInfo[playerid][pSex]);
ini_setInteger(File, "Skin", PlayerInfo[playerid][pSkin]);
ini_setInteger(File, "Level", PlayerInfo[playerid][pLevel]);
ini_setInteger(File, "Admin", PlayerInfo[playerid][pAdmin]);
ini_setInteger(File, "Moderator", PlayerInfo[playerid][pModerator]);
ini_setInteger(File, "Chat Moderator", PlayerInfo[playerid][pChatModerator]);
ini_setInteger(File, "House", PlayerInfo[playerid][pHouse]);
iniClose(File); // Закрываем файл
PlayerInfo[playerid][pRegStage] = 0;
ShowPlayerDialog(playerid, 3, DSP, "Подтверждение пароля", "{ffd66e}Аккаунт успешно создан.\nЧтобы продолжить регистрацию подтвердите ваш пароль.\nВведите ваш пароль и нажмите кнопку \"Далее\"", "Далее", "Выход");
}
}
else
{
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Внимание:{ffffff} Вы отменили регистрацию - Вы будете кикнуты.");
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Введите (q)uit, чтобы выйти.");
Kickk
}
}
case 3: // данный кейс отвечает за диаолг с подтверждением пароля
{
if(response)
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid, 3, DSP, "Подтверждение пароля", "{ffd66e}Аккаунт успешно создан.\nЧтобы продолжить регистрацию подтвердите ваш пароль.\nВведите ваш пароль и нажмите кнопку \"Далее\"", "Далее", "Выход");
return true;
}
for(new i = strlen(inputtext); i != 0; --i)
switch(inputtext[i])
{
case 'А'..'Я', 'а'..'я': // Опять же проверка на то какие символы ввел игрок
{
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Смените раскладку вашей клавиатуры.");
ShowPlayerDialog(playerid, 3, DSP, "Подтверждение пароля", "{ffd66e}Аккаунт успешно создан.\nЧтобы продолжить регистрацию подтвердите ваш пароль.\nВведите ваш пароль и нажмите кнопку \"Далее\"", "Далее", "Выход");
return true;
}
}
format(string, sizeof(string), "Accounts/%s.ini", nickname);
new File = iniOpen(string);
ini_getString(File, "Password", string);
if(!strcmp(inputtext, string, true))
{
PlayerInfo[playerid][pRegStage] = 1;
SaveAccounts(playerid);
quest = random(10) +1; // Создаем рандом, для того что бы нам выдавались всегда разные примеры для решения
if (quest== 1) ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}девять{ffd66e} + {ffffff}два{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена"); // 11
if (quest== 2) ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}восемь{ffd66e} + {ffffff}четыре{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена"); // 12
if (quest== 3) ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}семь{ffd66e} + {ffffff}шесть{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена"); // 13
if (quest== 4) ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}шесть{ffd66e} + {ffffff}восемь{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена"); // 14
if (quest== 5) ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}пять{ffd66e} + {ffffff}десять{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена"); // 15
if (quest== 6) ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}пять{ffd66e} + {ffffff}одиннадцать{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена"); // 16
if (quest== 7) ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}девять{ffd66e} + {ffffff}восемь{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена"); // 17
if (quest== 8) ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}девять{ffd66e} + {ffffff}девять{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена"); //18
if (quest== 9) ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}десять{ffd66e} + {ffffff}девять{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена"); // 19
if (quest== 10) ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}десять{ffd66e} + {ffffff}десять{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена"); // 20
}
else
{
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Пароль неверный. Попробуйте еще раз.");
ShowPlayerDialog(playerid, 3, DSP, "Подтверждение пароля", "{ffd66e}Аккаунт успешно создан.\nЧтобы продолжить регистрацию подтвердите ваш пароль.\nВведите ваш пароль и нажмите кнопку \"Далее\"", "Далее", "Выход");
return true;
}
}
else
{
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Внимание:{ffffff} Регистрация была прервана - Вы будете кикнуты.");
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Чтобы продолжить регистрацию, в следующий раз просто войдите на сервер под своим ником.");
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Введите (q)uit, чтобы выйти.");
Kickk
}
}
case 4: // Теперь пойдет кейс, отвечающий за диалог с решением примера.
{
new regQuest[10]={11, 12, 13, 14, 15, 16, 17, 18, 19, 20};// Переменная в которой хранятся " ответы " на математический пример.
if(response)
{
if(quest == 1) // Если выпал 1 диалог из нашего ранее созданного рандома, то выводится следующее:
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}девять{ffd66e} + {ffffff}два{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
if(strcmp(inputtext, regQuest[0], true)) // Если введенный текст соответствует нашей переменной с ответами, то продолжается система регистрации
{
PlayerInfo[playerid][pRegStage] = 2;
SaveAccounts(playerid);
ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
}
else
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}девять{ffd66e} + {ffffff}два{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
}
if(quest == 2)
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}восемь{ffd66e} + {ffffff}четыре{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
if(strcmp(inputtext, regQuest[1], true))
{
PlayerInfo[playerid][pRegStage] = 2;
SaveAccounts(playerid);
ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
}
else
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}восемь{ffd66e} + {ffffff}четыре{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
}
if(quest == 3)
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}семь{ffd66e} + {ffffff}шесть{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
if(strcmp(inputtext, regQuest[2], true))
{
PlayerInfo[playerid][pRegStage] = 2;
SaveAccounts(playerid);
ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
}
else
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}семь{ffd66e} + {ffffff}шесть{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
}
if(quest == 4)
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}шесть{ffd66e} + {ffffff}восемь{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
if(strcmp(inputtext, regQuest[3], true))
{
PlayerInfo[playerid][pRegStage] = 2;
SaveAccounts(playerid);
ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
}
else
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}шесть{ffd66e} + {ffffff}восемь{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
}
if(quest == 5)
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}пять{ffd66e} + {ffffff}десять{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
if(strcmp(inputtext, regQuest[4], true))
{
PlayerInfo[playerid][pRegStage] = 2;
SaveAccounts(playerid);
ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
}
else
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}пять{ffd66e} + {ffffff}десять{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
}
if(quest == 6)
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}пять{ffd66e} + {ffffff}одиннадцать{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
if(strcmp(inputtext, regQuest[5], true))
{
PlayerInfo[playerid][pRegStage] = 2;
SaveAccounts(playerid);
ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
}
else
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}пять{ffd66e} + {ffffff}одиннадцать{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
}
if(quest == 7)
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}девять{ffd66e} + {ffffff}восемь{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
if(strcmp(inputtext, regQuest[6], true))
{
PlayerInfo[playerid][pRegStage] = 2;
SaveAccounts(playerid);
ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
}
else
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}девять{ffd66e} + {ffffff}восемь{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
}
if(quest == 8)
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}девять{ffd66e} + {ffffff}девять{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
if(strcmp(inputtext, regQuest[7], true))
{
PlayerInfo[playerid][pRegStage] = 2;
SaveAccounts(playerid);
ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
}
else
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}девять{ffd66e} + {ffffff}девять{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
}
if(quest == 9)
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}десять{ffd66e} + {ffffff}девять{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
if(strcmp(inputtext, regQuest[8], true))
{
PlayerInfo[playerid][pRegStage] = 2;
SaveAccounts(playerid);
ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
}
else
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}десять{ffd66e} + {ffffff}девять{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
}
if(quest == 10)
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}десять{ffd66e} + {ffffff}десять{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
if(strcmp(inputtext, regQuest[9], true))
{
PlayerInfo[playerid][pRegStage] = 2;
SaveAccounts(playerid);
ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
}
else
{
ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}десять{ffd66e} + {ffffff}десять{ffd66e} = {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
return true;
}
}
}
else
{
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Внимание:{ffffff} Регистрация была прервана - Вы будете кикнуты.");
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Чтобы продолжить регистрацию, в следующий раз просто войдите на сервер под своим ником.");
SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Введите (q)uit, чтобы выйти.");
Kickk
}
}
case 5: // Отвечает за то, что регистрация прошла успешна, нам высветится диалог с выбором пола, и нам останется только прочитать правила сервера
{
if(response)
{
PlayerInfo[playerid][pSex] = 1; // Если выбрали мужской пол, то записывается 1
PlayerInfo[playerid][pRegStage] = 3; // Стадия регистрации - 3
PlayerInfo[playerid][pSkin] = 23; // Выдаем 23 скин
SaveAccounts(playerid);
format(string, sizeof(string), "%s%s%s%s%s%s%s", ServerRules[0], ServerRules[1], ServerRules[2], ServerRules[3], ServerRules[4], ServerRules[5], ServerRules[6]);
ShowPlayerDialog(playerid, 6, DSM, "Общие правила", string, "Играть", "");
}
else
{
PlayerInfo[playerid][pSex] = 2; // Если выбрали женский пол, то записывается 2
PlayerInfo[playerid][pRegStage] = 3;
PlayerInfo[playerid][pSkin] = 12; // Выдаем 12 скин
SaveAccounts(playerid);
format(string, sizeof(string), "%s%s%s%s%s%s%s", ServerRules[0], ServerRules[1], ServerRules[2], ServerRules[3], ServerRules[4], ServerRules[5], ServerRules[6]);
ShowPlayerDialog(playerid, 6, DSM, "Общие правила", string, "Играть", "");
}
}
case 6: // отвечает за полностью пройденную регистрация
{
if(response)
{
PlayerInfo[playerid][pRegStage] = 4; // Стадия регистрации 4 - все нормально
SaveAccounts(playerid); // Сохраняем аккаунт
SpawnPlayer(playerid); // И спавним игрока
}
else
{
PlayerInfo[playerid][pRegStage] = 4;
SaveAccounts(playerid);
SpawnPlayer(playerid);
}
}
}
В самый конец мода:
PHP:
stock SaveAccounts(playerid)
{
new string[128];
GetPlayerName(playerid, nickname, sizeof(nickname));
format(string, sizeof(string), "Accounts/%s.ini", nickname);
new File = iniOpen(string);
ini_setInteger(File, "Registration Stage", PlayerInfo[playerid][pRegStage]);
ini_setInteger(File, "Login Tries", PlayerInfo[playerid][pLoginTries]);
ini_setInteger(File, "Money", GetPlayerMoney(playerid));
ini_setInteger(File, "Sex", PlayerInfo[playerid][pSex]);
ini_setInteger(File, "Skin", PlayerInfo[playerid][pSkin]);
ini_setInteger(File, "Level", PlayerInfo[playerid][pLevel]);
ini_setInteger(File, "Admin", PlayerInfo[playerid][pAdmin]);
ini_setInteger(File, "Moderator", PlayerInfo[playerid][pModerator]);
ini_setInteger(File, "Chat Moderator", PlayerInfo[playerid][pChatModerator]);
ini_setInteger(File, "House", PlayerInfo[playerid][pHouse]);
iniClose(File);
}
PHP:
public OnPlayerDisconnect(playerid, reason)
PHP:
public OnPlayerDisconnect(playerid, reason)
{
if Login[playerid] == 0 *then return 1;
GetPlayerName(playerid, nickname, sizeof(nickname));
SaveAccounts(playerid);
return 1;
}
Опять же в самый конец мода вставляем:
PHP:
stock SetPlayerSpawn(playerid)
{
SetPlayerSkin(playerid, PlayerInfo[playerid][pSkin]); // Задаем скин из переменной pSkin
SetPlayerScore(playerid, PlayerInfo[playerid][pLevel]); // Выдем level
SetPlayerColor(playerid, 0xFFFFFF20);
if(PlayerInfo[playerid][pHealth] <= 0) PlayerInfo[playerid][pHealth] = 100.0; // делаем здоровье - 100, дабы нас не спавнило и не убивало в туже секунду
SetPlayerHealth(playerid, PlayerInfo[playerid][pHealth]);
if(PlayerInfo[playerid][pLevel] >= 0)
{
SetPlayerPos(playerid, 330.0964,-1516.5410,35.8672); // Координаты появления. У меня это рядом с отелем в ЛС.
SetPlayerFacingAngle(playerid, 229.3571);
SetCameraBehindPlayer(playerid);
SetPlayerVirtualWorld(playerid, 0);
SetPlayerInterior(playerid, 0);
}
return true;
}
PHP:
SetPlayerSpawn(playerid);
1) В папке scriptfiles создать папку Accounts
2) Скачать инклуд mxINI, и закинуть его в папку pawno --> include
Надеюсь мои старания были не зря. Более опытные скриптеры, к Вам просьба, если заметите какие либо ошибочки или более лучшую оптимизацию, напишите сюда или в лс. Всем спасибо
Скачать инклуд:
файл:
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
virustotal:
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Последнее редактирование:
