Весь код(Кроме не нужного):
#include <a_samp> #include <fix> #include <a_mysql> #include <streamer> #include <sscanf2> #include <foreach> #include <Pawn.Regex> #include <Pawn.CMD> #include <crashdetect> #define SCM SendClientMessage #define SCMTA SendClientMessageToAll #define SPD ShowPlayerDialog #define COLOR_WHITE 0xFFFFFFFF #define COLOR_RED 0xff0004AA #define MAX_PASSWORD_LENGTH 32 //--------------------------- БАЗА ДАННЫХ ---------------------------- #define MYSQL_HOST "localhost" #define MYSQL_USER "root" #define MYSQL_PASS "" #define MYSQL_BASE "project" //------------------------------------------------------------------------ main() { print("\n----------------------------------"); print(" 14.11.23 | Mr.Sokolowsky"); print("----------------------------------\n"); } //---------------------------- Переменные ---------------------------- //----------------------------- Мусорка ------------------------------ //------------------------------------------------------------------------ //------------------------------------------------------------------------ enum player { ID, NAME[MAX_PLAYER_NAME], PASSWORD[32], EMAIL[64], REF, SEX, RACE, AGE, SKIN, REGDATA[13], REGIP[16], } new player_info[MAX_PLAYERS][player]; // 1 Warning, он ни на что не влияет. enum Dialog { DLG_NONE, DLG_REG, DLG_REGEMAIL, DLG_LOG, DLG_REGREF, DLG_SEX, DLG_REGRACE, DLG_REGAGE } new MySQL:dbHandle; public OnGameModeInit() { ConnectMySQL(); return 1; } stock ConnectMySQL() { dbHandle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_BASE); switch(mysql_errno()) { case 0: print("Успешно"); default: print("НЕ РАБОТАЕТ"); } } public OnGameModeExit() { mysql_close(dbHandle); return 1; } public OnPlayerRequestClass(playerid, classid) { return 1; } public OnPlayerConnect(playerid) { GetPlayerName(playerid, player_info[playerid][NAME], MAX_PLAYER_NAME); TogglePlayerSpectating(playerid, 1); InterpolateCameraPos(playerid, 1243.014526, -2036.578369, 82.257240+5.0, 71.424697, -2078.663574, 37.513919, 25000); InterpolateCameraLookAt(playerid, 498.725097, -1991.036376, 37.513919-5.0, 364.344390, -1828.529296, 8.788626, 25000); static const fmt_query[] = "SELECT `id`, `password` FROM `users` WHERE `name` = '%s'"; new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)]; format(query, sizeof(query), fmt_query, player_info[playerid][NAME]); mysql_tquery(dbHandle, query, "CheckRegistration", "i", playerid); return 1; } forward CheckRegistration(playerid); public CheckRegistration(playerid) { new rows; cache_get_row_count(rows); if(rows) { cache_get_value_name(0, "password", player_info[playerid][PASSWORD], 32); ShowLogin(playerid); } else ShowRegistration(playerid); } stock ShowLogin(playerid) { new dialog[156+(-2+MAX_PLAYER_NAME)]; format(dialog, sizeof(dialog), "{FFFFFF}Уважаемый {0089ff}%s{FFFFFF}, с возврощением на {0089ff}Venera RolePlay{FFFFFF}\n\ \t\tМы рады снова видеть вас!\n\n\ Для продолжения, введите свой пароль в поле ниже:", player_info[playerid][NAME] ); SPD(playerid, DLG_LOG, DIALOG_STYLE_INPUT, "* {ffd100}Авторизация{FFFFFF} *", dialog, "Войти", "Выход"); } stock ShowRegistration(playerid) { new dialog[340+(-2+MAX_PLAYER_NAME)]; format(dialog, sizeof(dialog), "{FFFFFF}Уважаемый {0089ff}%s{FFFFFF}, мы рады вас видеть на {0089ff}Venera RolePlay{FFFFFF}\n\ Аккаунт с таким именем не зарегестрирован в базе\n\ Для игры на нашем сервере, придумайте сложный пароль!\n\ После чего нажмите \"Далее\"\n\ {ff9500}\t* Пароль должен быть от 8-ми до 32-ух символов\n\ \t* Пароль дожен состоять из цифр и латинских букв.", player_info[playerid][NAME] ); SPD(playerid, DLG_REG, DIALOG_STYLE_INPUT, "* {ffd100}Регистрация{FFFFFF} * Ввод пароля", dialog, "Далее", "Выход" ); } public OnPlayerDisconnect(playerid, reason) { return 1; } public OnPlayerSpawn(playerid) { return 1; } public OnPlayerDeath(playerid, killerid, reason) { return 1; } public OnVehicleSpawn(vehicleid) { return 1; } public OnVehicleDeath(vehicleid, killerid) { return 1; } public OnPlayerText(playerid, text[]) { return 1; } public OnPlayerCommandText(playerid, cmdtext[]) { return 0; } public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) { return 1; } public OnPlayerExitVehicle(playerid, vehicleid) { return 1; } public OnPlayerStateChange(playerid, newstate, oldstate) { return 1; } public OnPlayerEnterCheckpoint(playerid) { return 1; } public OnPlayerLeaveCheckpoint(playerid) { return 1; } public OnPlayerEnterRaceCheckpoint(playerid) { return 1; } public OnPlayerLeaveRaceCheckpoint(playerid) { return 1; } public OnRconCommand(cmd[]) { return 1; } public OnPlayerRequestSpawn(playerid) { return 1; } public OnObjectMoved(objectid) { return 1; } public OnPlayerObjectMoved(playerid, objectid) { return 1; } public OnPlayerPickUpPickup(playerid, pickupid) { return 1; } public OnVehicleMod(playerid, vehicleid, componentid) { return 1; } public OnVehiclePaintjob(playerid, vehicleid, paintjobid) { return 1; } public OnVehicleRespray(playerid, vehicleid, color1, color2) { return 1; } public OnPlayerSelectedMenuRow(playerid, row) { return 1; } public OnPlayerExitedMenu(playerid) { return 1; } public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid) { return 1; } public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { return 1; } public OnRconLoginAttempt(ip[], password[], success) { return 1; } public OnPlayerUpdate(playerid) { return 1; } public OnPlayerStreamIn(playerid, forplayerid) { return 1; } public OnPlayerStreamOut(playerid, forplayerid) { return 1; } public OnVehicleStreamIn(vehicleid, forplayerid) { return 1; } public OnVehicleStreamOut(vehicleid, forplayerid) { return 1; } public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { switch(dialogid) { case DLG_REG: { if(response) { if(!strlen(inputtext)) { ShowRegistration(playerid); return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Введите пароль в поле ниже и нажмите \"Далее\""); } if(strlen(inputtext) < 8 || strlen(inputtext) > 32) { ShowRegistration(playerid); return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Длина пароля должна быть от 8 до 32 символов."); } new regex:rg_passwordcheck = regex_new("^[a-zA-Z0-9]{1,}$"); if(regex_check(inputtext, rg_passwordcheck)) { strmid(player_info[playerid][PASSWORD], inputtext, 0, strlen(inputtext), 32); SPD(playerid, DLG_REGEMAIL, DIALOG_STYLE_INPUT, "{ff9300}Регистрация{FFFFFF} * Ввод Email", "{FFFFFF}Введите свой настоящий Email адрес \n\ Если вы потеряете доступ к аккаунту, то сможете восстановить его через Email\n\ Введите его в поле ниже и нажмите \"Далее\"", "Далее", ""); } else { ShowRegistration(playerid); return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Пароль может состоять только из чисел и цифр!"); } regex_delete(rg_passwordcheck); } else { SCM(playerid, COLOR_RED, "Используйте \"/q\", чтобы покинуть сервер"); SPD(playerid, -1, 0, " ", " ", " ", ""); return Kick(playerid); } } case DLG_REGEMAIL: {// case if(!strlen(inputtext)) {//strlen SPD(playerid, DLG_REGEMAIL, DIALOG_STYLE_INPUT, "{ff9300}Регистрация{FFFFFF} * Ввод Email", "{FFFFFF}Введите свой настоящий Email адрес \n\ Если вы потеряете доступ к аккаунту, то сможете восстановить его через Email\n\ Введите его в поле ниже и нажмите \"Далее\"", "Далее", ""); return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Введите ваш Email ниже и нажмите \"Далее\""); }//strlen new regex:rg_emailcheck = regex_new("^[a-zA-Z0-9.-_]{1,43}@[a-zA-Z]{1,12}.[a-zA-Z]{1,8}$"); if(regex_check(inputtext, rg_emailcheck)) {//regex strmid(player_info[playerid][EMAIL], inputtext, 0, strlen(inputtext), 64); SPD(playerid, DLG_REGREF, DIALOG_STYLE_INPUT, "{ff9300}Регистрация{FFFFFF} * Ввод пригласившего игрока", "{FFFFFF}Если ты зашел на сервер по приглашению, то \n\ можешь указать ник пригласившего в поле ниже.", "Далее", "Пропустить"); }//regex else {//else-regex SPD(playerid, DLG_REGEMAIL, DIALOG_STYLE_INPUT, "{ff9300}Регистрация{FFFFFF} * Ввод Email", "{FFFFFF}Введите свой настоящий Email адрес \n\ Если вы потеряете доступ к аккаунту, то сможете восстановить его через Email\n\ Введите его в поле ниже и нажмите \"Далее\"", "Далее", ""); return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Введите ваш Email ниже и нажмите \"Далее\""); return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Укажите правильно ваш Email адрес."); }//else-regex regex_delete(rg_emailcheck); }//case case DLG_REGREF: { // case 2 if(response) { // if response 2 new regex:rg_refcheck = regex_new("^[a-zA-Z_]{4,24}$"); if(regex_check(inputtext, rg_refcheck)) { // if regex static const fmt_query[] = "SELECT * FROM `users` WHERE `name` = '%s'"; new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)]; format(query, sizeof(query), fmt_query, inputtext); mysql_tquery(dbHandle, query, "CheckReferal", "is", playerid, inputtext); } // if regex else { // else regex SPD(playerid, DLG_REGREF, DIALOG_STYLE_INPUT, "{ff9300}Регистрация{FFFFFF} * Ввод пригласившего игрока", "{FFFFFF}Если ты зашел на сервер по приглашению, то \n\ можешь указать ник пригласившего в поле ниже.", "Далее", "Пропустить"); return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Введите ник игрока приглосившего вас корректно!"); } // else regex regex_delete(rg_refcheck); } // if response 2 else { // else if response 2 SPD(playerid, DLG_SEX, DIALOG_STYLE_MSGBOX, "{ff9300}Регистрация{FFFFFF} * Выбор пола", "{FFFFFF}Выберите пол вашего персонажа:", "Мужской", "Женский"); } // else if response 2 } //case 2 case DLG_SEX: { if(response) player_info[playerid][SEX] = 1; else player_info[playerid][SEX] = 2; SPD(playerid, DLG_REGRACE, DIALOG_STYLE_LIST, "{ff9300}Регистрация{FFFFFF} * Выбор расы", "Негроидная\n\ Европиоидная\n\ Монголоидная/Азиатская", "Далее", ""); } case DLG_REGRACE: { switch(listitem) { case 0: player_info[playerid][RACE] = 1; case 1: player_info[playerid][RACE] = 2; case 2: player_info[playerid][RACE] = 3; } SPD(playerid, DLG_REGAGE, DIALOG_STYLE_INPUT, "{ff9300}Регистрация{FFFFFF} * Выбор возраста", "{FFFFFF}Введите возраст вашего будующего персонажа:\n\ {ff9500}\t* Возраст должен быть от 18-ти до 60-ти лет!", "Далее", ""); } case DLG_REGAGE: { if(!strlen(inputtext)) { SPD(playerid, DLG_REGAGE, DIALOG_STYLE_INPUT, "{ff9300}Регистрация{FFFFFF} * Выбор возраста", "{FFFFFF}Введите возраст вашего будующего персонажа:\n\ {ff9500}\t* Возраст должен быть от 18-ти до 60-ти лет!", "Далее", ""); return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Укажите ваш возраст"); } if(strval(inputtext) < 18 || strval(inputtext) > 60) { SPD(playerid, DLG_REGAGE, DIALOG_STYLE_INPUT, "{ff9300}Регистрация{FFFFFF} * Выбор возраста", "{FFFFFF}Введите возраст вашего будующего персонажа:\n\ {ff9500}\t* Возраст должен быть от 18-ти до 60-ти лет!", "Далее", ""); return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Укажите возраст от 18-ти до 60-ти"); } player_info[playerid][AGE] = strval(inputtext); // ИНФ ПРО МАССИВ // В массиве 3 рассы, на каждый диаразон возраста - свои скины // Расы: Негроидная, Европиоидная, Монголоидная // Диапазоны: 18-29, 30-45, 46-60 new regmaleskins[9][2] = { {19,28}, // Негроидная 18-29 {25,36}, // Негроидная 30-45 {14,142}, // Негроидная 46-60 {101,26}, // Европиоидная 18-29 {2,202}, // Европиоидная 30-45 {3,290}, // Европиоидная 46-60 {170,180}, // Монголоидная 18-29 {47,48}, // Монголоидная 30-45 {132,229} // Монголоидная 46-60 }; new regfemaleskins[9][2] = // Аналогично { {13,69}, {9,190}, {10,218}, {41,56}, {31,151}, {39,89}, {169,193}, {207,225}, {54,130} }; new newskinindex; switch(player_info[playerid][RACE]) { case 1: {} case 2: newskinindex+=3; case 3: newskinindex+=6; } switch(player_info[playerid][AGE]) { case 18..29: {} case 30..45: newskinindex++; case 46..60: newskinindex+=2; } if(player_info[playerid][SEX] == 1) player_info[playerid][SKIN] = regfemaleskins[newskinindex][random(2)]; else player_info[playerid][SKIN] = regfemaleskins[newskinindex][random(2)]; new Year, Month, Day; getdate(Year, Month, Day); new date[13]; format(date, sizeof(date), "%02d.%02d.%d", Day, Month, Year); new ip[16]; GetPlayerIp(playerid, ip, sizeof(ip)); static const fmt_query[] = "INSERT INTO `users` (`name`, `password`, `email`, `ref`, `sex`, `race`, `age`, `skin`, `regdata`, `regip`) VALUES ('%s', '%s', '%s', '%d', '%d', '%d', '%d', '%d', '%s', '%s')"; new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)+(-2+64)+(-2+32)+(-2+8)+(-2+2)+(-2+2)+(-2+3)+(-2+4)+(-2+13)+(-2+16)]; format(query, sizeof(query), fmt_query, player_info[playerid][NAME], player_info[playerid][PASSWORD], player_info[playerid][EMAIL], player_info[playerid][REF], player_info[playerid][SEX], player_info[playerid][RACE], player_info[playerid][AGE], player_info[playerid][SKIN], date, ip); mysql_query(dbHandle, query); static const fmt_query2[] = "SELECT * FROM `users` WHERE `name` = '%s' AND `password` = '%s'"; format(query, sizeof(query), fmt_query2, player_info[playerid][NAME], player_info[playerid][PASSWORD]); mysql_tquery(dbHandle, query, "PlayerLogin", "i", playerid); } [code]case DLG_LOG: { if (response) { static const fmt_query[] = "SELECT * FROM `users` WHERE `password` = '%s'"; new query[sizeof(fmt_query)+(-2+32)]; format(query, sizeof(query), fmt_query, player_info[playerid][PASSWORD]); new result; mysql_tquery(dbHandle, query, "PlayerLogin", "i", playerid); if(result) { SCM(playerid, COLOR_WHITE, "{22ff00}[SERVER]{FFFFFF}: {ff0000}Да!"); } else { SCM(playerid, COLOR_WHITE, "{ff0000}[SERVER]{FFFFFF}: {ff0000}Нет!"); ShowLogin(playerid); } } else { SCM(playerid, COLOR_WHITE, "{ff0000}[SERVER]{FFFFFF}: {ff0000}(/q){FFFFFF}."); SPD(playerid, -1, 0, " ", " ", " ", ""); return Kick(playerid); } } }// Не трогать return 1; }// не трогать forward PlayerLogin(playerid); public PlayerLogin(playerid) { new rows; cache_get_row_count(rows); if(rows) { cache_get_value_name_int(0, "id", player_info[playerid][ID]); cache_get_value_name(0, "email", player_info[playerid][EMAIL], 64); cache_get_value_name(0, "password", player_info[playerid][PASSWORD], 32); cache_get_value_name_int(0, "ref", player_info[playerid][REF]); cache_get_value_name_int(0, "sex", player_info[playerid][SEX]); cache_get_value_name_int(0, "race", player_info[playerid][RACE]); cache_get_value_name_int(0, "age", player_info[playerid][AGE]); cache_get_value_name_int(0, "skin", player_info[playerid][SKIN]); cache_get_value_name_int(0, "regdata", player_info[playerid][REGDATA], 13); cache_get_value_name_int(0, "regip", player_info[playerid][REGIP], 16); TogglePlayerSpectating(playerid, 0); SetSpawnInfo(playerid, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); SetPVarInt(playerid, "logged", 1); SpawnPlayer(playerid); } return 1; } forward CheckReferal(playerid, referal[]); public CheckReferal(playerid, referal[]) { new rows; cache_get_row_count(rows); if(rows) { new refid; SPD(playerid, DLG_SEX, DIALOG_STYLE_MSGBOX, "{ff9300}Регистрация{FFFFFF} * Выбор пола", "{FFFFFF}Выберите пол вашего персонажа:", "Мужской", "Женский"); cache_get_value_name_int(0, "id", refid); player_info[playerid][REF] = refid; } else { SPD(playerid, DLG_REGREF, DIALOG_STYLE_INPUT, "{ff9300}Регистрация{FFFFFF} * Ввод пригласившего игрока", "{FFFFFF}Если ты зашел на сервер по приглашению, то \n\ можешь указать ник пригласившего в поле ниже.", "Далее", "Пропустить"); return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Аккаунта с таким ником нет в базе данных!"); } return 1; } public OnPlayerClickPlayer(playerid, clickedplayerid, source) { return 1; } CMD:spawn(playerid) { TogglePlayerSpectating(playerid, 0); SetSpawnInfo(playerid, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); SetPVarInt(playerid, "logged", 1); SpawnPlayer(playerid); }
Код авторизации:
case DLG_LOG:
{
if (response)
{
static const fmt_query[] = "SELECT * FROM `users` WHERE `password` = '%s'";
new query[sizeof(fmt_query)+(-2+32)];
format(query, sizeof(query), fmt_query, player_info[playerid][PASSWORD]);
new result;
mysql_tquery(dbHandle, query, "PlayerLogin", "i", playerid);
if(result)
{
SCM(playerid, COLOR_WHITE, "{22ff00}[SERVER]{FFFFFF}: {ff0000}Да!");
}
else
{
SCM(playerid, COLOR_WHITE, "{ff0000}[SERVER]{FFFFFF}: {ff0000}Нет!");
ShowLogin(playerid);
}
}
else
{
SCM(playerid, COLOR_WHITE, "{ff0000}[SERVER]{FFFFFF}: {ff0000}(/q){FFFFFF}.");
SPD(playerid, -1, 0, " ", " ", " ", "");
return Kick(playerid);
}
}[/code]
mysql.log: [16:30:04] [WARNING] mysql_connect: no password specified