Амасинк |
Дата: Воскресенье, 13.09.2015, 15:17 | Сообщение # 1
|
Боец
Сообщений: 267
Статус: Offline
|
Увидел, что некоторые ищут регистрацию на Mysql от BlueG. Дабы не отправлять пользователей на другой портал - решил так сказать "Перенести" урок сюда.
Первым делом подключаем инклуд и включаем denwer (phpmyadmin).
В начало мода добавляем:
Код #define MYSQL_HOST "localhost" #define MYSQL_USER "root" #define MYSQL_DATABASE "bd" #define MYSQL_PASSWORD "" #define MYSQL_CONNECT_INFO MYSQL_HOST,MYSQL_USER,MYSQL_DATABASE,MYSQL_PASSWORD
new mysql_connect_ID;
Где localhost/root/bd - ваш хост/имя пользователя/название базы соответственно.
В OnGamemodeInit:
Код mysql_connect_ID = mysql_connect(MYSQL_CONNECT_INFO);
Тем самым мы подключаем мод к нашей базе.
Далее создаём enum (данные, которые мы будет загружать и выгружать из бд.
Код enum player_information { pID, pName[MAX_PLAYER_NAME], pPassword[30] }; new pInfo[MAX_PLAYERS][player_information];
Теперь нам нужно сделать поиск аккаунта при коннекте. В OnPlayerRequestClass:
Код GetPlayerName(playerid, pInfo[playerid][pName], MAX_PLAYER_NAME); new query_string[52+MAX_PLAYER_NAME]; format(query_string, sizeof(query_string), "SELECT * FROM `accounts` WHERE `player_name` = '%s'", pInfo[playerid][pName]); mysql_function_query(mysql_connect_ID, query_string, true, "FindPlayerInTable","i", playerid);
И создаём паблик в конце мода:
Код forward FindPlayerInTable(playerid); public FindPlayerInTable(playerid) { new rows, fields; cache_get_data(rows, fields); if(!rows) { ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "Введите пароль для регистрации нового аккаунта:", "Регистрация", "Выход"); } else { ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "Введите пароль от аккаунта для того, чтоб продолжить игру:", "Вход", "Выход"); cache_get_field_content(0, "password", pInfo[playerid][pPassword], mysql_connect_ID, 30); } return 1; }
Теперь создаём макросы на диалоги. Делается это для того, чтобы вы не запутались при создании новых диалогов (не обязательно).
В начало мода:
Код #define dRegister 0 #define dLogin 1
Далее создаём сами диалоги. В OnDialogResponse:
Код switch(dialogid) { case dRegister: { if(!response) { ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_MSGBOX, "Оповещение", "{FFFFFF}Вы были кикнуты с сервера.\n{FF0000}Причина: Отказ от регистрации.\n{FFFFFF}Для выхода с сервера введите \"/q\" в чат", "Вход", "Выход"); return Kick(playerid); } if(!strlen(inputtext)) return ErrorDialogMessage(playerid, dRegister, 0); else if(strlen(inputtext) < 4) return ErrorDialogMessage(playerid, dRegister, 1); else if(strlen(inputtext) > 30) return ErrorDialogMessage(playerid, dRegister, 2); for(new i = strlen(inputtext)-1; i != -1; i--) { switch(inputtext[i]) { case '0'..'9', 'а'..'я', 'a'..'z', 'А'..'Я', 'A'..'Z': continue; default: return ErrorDialogMessage(playerid, dRegister, 3); } } strins(pInfo[playerid][pPassword], inputtext, 0); CreateNewAccount(playerid, pInfo[playerid][pPassword]); return 1; } case dLogin: { if(!response) { ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_MSGBOX, "Оповещение", "{FFFFFF}Вы были кикнуты с сервера.\n{FF0000}Причина: Отказ от авторизации.\n{FFFFFF}Для выхода с сервера введите \"/q\" в чат", "Вход", "Выход"); return Kick(playerid); } if(!strlen(inputtext)) return ErrorDialogMessage(playerid, dLogin, 0); for(new i = strlen(inputtext)-1; i != -1; i--) { switch(inputtext[i]) { case '0'..'9', 'а'..'я', 'a'..'z', 'А'..'Я', 'A'..'Z': continue; default: return ErrorDialogMessage(playerid, dLogin, 1); } } if(!strcmp(pInfo[playerid][pPassword], inputtext)) { new query_string[52+MAX_PLAYER_NAME]; format(query_string, sizeof(query_string), "SELECT * FROM `accounts` WHERE `player_name` = '%s'", pInfo[playerid][pName]); mysql_function_query(mysql_connect_ID, query_string, true, "UploadPlayerAccount","i", playerid); } else ErrorDialogMessage(playerid, dLogin, 2); return 1; } }
Создаём функции для этих диалогов. В конец мода:
Код stock CreateNewAccount(playerid, password[]) { new query_string[70+MAX_PLAYER_NAME+30]; format(query_string, sizeof(query_string), "INSERT INTO `accounts` (`player_name`, `password`) VALUES ('%s', '%s')", pInfo[playerid][pName], password); mysql_function_query(mysql_connect_ID, query_string, false, "", "");
format(query_string, sizeof(query_string), "Аккаунт %s успешно зарегистрирован. Администрация желает Вам приятной игры!", pInfo[playerid][pName]); SendClientMessage(playerid, 0xFFFFFF00, query_string); SpawnPlayer(playerid); return 1; }
Загрузка аккаунта. В конец:
Код forward UploadPlayerAccount(playerid); public UploadPlayerAccount(playerid) { pInfo[playerid][pID] = cache_get_field_content_int(0, "ID", mysql_connect_ID); SendClientMessage(playerid, 0xFFFFFF00, "Вы успешно авторизировались!"); SpawnPlayer(playerid); return 1; }
Теперь нужно создать функцию, которая хронит сообщения. Создаём Stock в конце мода.
Код stock ErrorDialogMessage(playerid, dialogid, error_id) { switch(dialogid) { case dRegister: { switch(error_id) { case 0: { ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "{FF0000}Ошибка: {FFFFFF}Вы не можете продолжить регистрацию не введя пароль!\nВведите пароль для регистрации нового аккаунта:\n{C0C0C0}Примечание:\n{666666}- Пароль чувствителен к регистру.\n- Пароль должен содержать от 4 до 30 символов.\n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход"); } case 1: { ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "{FF0000}Ошибка: {FFFFFF}Пароль слишком короткий!\nВведите пароль для регистрации нового аккаунта:\n{C0C0C0}Примечание:\n{666666}- Пароль чувствителен к регистру.\n- Пароль должен содержать от 4 до 30 символов.\n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход"); } case 2: { ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "{FF0000}Ошибка: {FFFFFF}Пароль слишком длинный!\nВведите пароль для регистрации нового аккаунта:\n{C0C0C0}Примечание:\n{666666}- Пароль чувствителен к регистру.\n- Пароль должен содержать от 4 до 30 символов.\n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход"); } case 3: { ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "{FF0000}Ошибка: {FFFFFF}Пароль содержит запрещённые символы!\nВведите пароль для регистрации нового аккаунта:\n{C0C0C0}Примечание:\n{666666}- Пароль чувствителен к регистру.\n- Пароль должен содержать от 4 до 30 символов.\n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход"); } } return 1; } case dLogin: { switch(error_id) { case 0: { ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы не можете продолжить авторизацию не введя пароль!\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход"); } case 1: { ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Введённый пароль содержит запрещённые символы!\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход"); } case 2: { switch(GetPVarInt(playerid, "WrongPassword")) { case 0: ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы ввели неверный пароль! У Вас осталось 3 попытки.\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход"); case 1: ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы ввели неверный пароль! У Вас осталось 2 попытки.\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход"); case 2: ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы ввели неверный пароль! У Вас осталось 1 попытка.\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход"); case 3: ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы ввели неверный пароль! У Вас осталась последняя попытка, после чего Вас кикнет.\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход"); default: { ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_MSGBOX, "Оповещение", "{FFFFFF}Вы были кикнуты с сервера.\n{FF0000}Причина: Превышен лимит попыток на ввод пароля.\n{FFFFFF}Для выхода с сервера введите \"/q\" в чат", "Вход", "Выход"); return Kick(playerid); } } SetPVarInt(playerid, "WrongPassword", GetPVarInt(playerid, "WrongPassword")+1); } } return 1; } } return 1; }
Основа готова. Теперь осталось сделать сохранение.
Код stock SaveAccount(playerid) { new query_string[(21)+(20+MAX_PLAYER_NAME)+(19+MAX_PLAYER_NAME)+(16+30)] = "UPDATE `accounts` SET";
format(query_string, sizeof(query_string), "%s `player_name` = '%s',", query_string, pInfo[playerid][pName]); format(query_string, sizeof(query_string), "%s `password` = '%s'", query_string, pInfo[playerid][pPassword]);
format(query_string, sizeof(query_string), "%s WHERE `player_name` = '%s'", query_string, pInfo[playerid][pName]); mysql_function_query(mysql_connect_ID, query_string, false, "", ""); return 1; }
И в OnPlayerDisconnect:
Код SaveAccount(playerid);
Тем самым мы сохраняем аккаунт при выходе с сервера.
Осталось дело за малым. Создать нашу таблицу. Заходим в phpmyadmin (localhost), затем нажимаем на базы данных, затем в поле, где написано "Создание базы данных" мы вводим название нашей таблицы, которую мы вводили в "MYSQL_DATABASE". В нашем случае это "BD"
Мы создали базу, теперь нужно создать нужные нам таблицы. В нашем случае она одна - accounts. Название таблицы пишите всегда как указываете в моде т.к одна не та буква/раскладка - вы не подключитесь к этой таблице.
Создаём таблицу, в поле вводим "accounts", количество столбцов - 3. Далее настраиваем саму таблицу. Первый столбец называется ID, тип которого INT, а длинна 11. Далее, чтобы иды не мешались - ищем A_I (Auto Increment) и ставим галочку. Второй столбец - имя: player_name, тип: varchar, длинна: 24, остальное не трогаем. Ну и последний столбец - это пароль. Имя столбца: password, тип: varchar, длина - 30.
Нажимаем сохранить и слева у нас есть наша таблица. Думаю как с ней работать вас учить не нужно
Автор урока: Автор урока - DeimoS and Mager Источник: PI Отдельное спасибо [CM]Kingster за то, что ответил в одной из тем на вопрос по созданию регистрации ссылкой на др. портал, тем самым дав идею копировать сюда популярные уроки с указанием авторства.
Помогаю новичкам в pawn
Сообщение отредактировал Амасинк - Воскресенье, 13.09.2015, 15:25 |
|
|
|