Привет! Спасибо что решил зайти помочь мне найти проблему)
ПРоблема - вот решил заняться обратно разработкой мода,все сделал и забил поставить базу данних, крч не нашел я бд и решил понанову создать, создал, запустил и вот что получается -
идет диалог с созданием пароля и первое что заметил єто не полностью текст отобразился типа "латинских с" и дальше что там било написано просто не отображается, подумал я ладно, придумал пароль и нажал далее, вроде все ок вибрал пол нажал далее и вот в чем проблема --- почемуто открился диалог ввода PIN-КОДА ( почему-то мод подумал что есть пин код и решил его запросить хотя раньше все било правильно и не било проблем с регой или авторизацией) и крч после того как меня кикают за 3 раза неправильного ввода пина я зашол в бд и увидел что аккаунт создался, подумал что, что-то не то в бд но какби я не вертел ничего не меняеться( что делать не знаю(ниже дам весь текст которий я пощитал нужним из мода)
enum player // Структура игрока
{
ID,
NAME[MAX_PLAYER_NAME],
PASSWORD[65],
SALT[11], // Соль пароля
PIN[64],
SPIN[11], // Соль ПИН-Кода
GMAIL[65],
SEX,
SKIN,
REGDATA[13],
REGIP[16],
ADMIN,
MONEY,
LVL,
EXP,
MINS
}
new player_info[MAX_PLAYERS][player];
enum dialogs
{
DLG_NONE,
// -----
DLG_REG,
DLG_REG_SEX,
DLG_REG_SUCCESS,
DLG_LOG,
// -----
DLG_REG_GMAIL,
// -----
DLG_MAINMENU,
DLG_STATS,
DLG_SECURESETTINGS,
DLG_NEWPASS1,
DLG_NEWPASS2,
DLG_SETTINGSPIN,
DLG_INSTALLPIN,
DLG_NEWPIN1,
DLG_NEWPIN2,
DLG_DELPIN,
DLG_CONFIRMPIN,
DLG_INFORMADM,
DLG_REPORT,
DLG_ASK,
DLG_AHELP,
DLG_AHELP1,
DLG_AHELP2,
DLG_AHELP3,
DLG_AHELP4,
DLG_AHELP5,
DLG_AHELP6
}
enum time_save // Енум для временного хранения данных о игроке
{
PASSWORD_CLEAR[32], // Временное хранение оригинального пароля
}
new player_time_save[MAX_PLAYERS][time_save];
public OnPlayerConnect(playerid)
{
SetPlayerColor(playerid, 0x99999900);
GetPlayerName(playerid, player_info[playerid][NAME], MAX_PLAYER_NAME);
static const fmt_query[] = "SELECT `password`, `salt` FROM `accounts` WHERE `name` = '%e'"; //запрос на добычу пароля, соли, имя игрока
new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)];
mysql_format(dbHandle, query, sizeof(query), fmt_query, player_info[playerid][NAME]);
mysql_tquery(dbHandle, query, "CkeckReg", "i", playerid);
SetPVarInt(playerid, "WrongPass", 3);
SetPVarInt(playerid, "WrongPin", 3);
return 1;
}
forward CkeckReg(playerid); // Проверка на регистрацию
public CkeckReg(playerid)
{
new rows;
cache_get_row_count(rows);
if(rows)
{
cache_get_value_name(0, "password", player_info[playerid][PASSWORD], 65);
cache_get_value_name(0, "salt", player_info[playerid][SALT], 11);
ShowLogin(playerid); // функция авторизации
}
else ShowReg(playerid); // функция регистрации
}
stock ShowLogin(playerid)
{
new dialog[199+(-2+MAX_PLAYER_NAME)];
format(dialog, sizeof(dialog),
"{FFFFFF}Уважаемый {f5cc00}%s{FFFFFF}, с возвращением на {f5cc00}Lenzetto RolePlay{FFFFFF}\n\
\t\tМы рады снова видеть вас!\n\n\
Для того чтобы войти в игру вам нужно ввести ваш пароль от аккаунта в строку ниже",
pName(playerid)
);
SPD(playerid, DLG_LOG, DIALOG_STYLE_PASSWORD, "{f5cc00}Авторизация", dialog, "Войти", "Закрыть");
}
stock ShowReg(playerid)
{
new dialog[304+(-2+MAX_PLAYER_NAME)];
format(dialog, sizeof(dialog),
"{FFFFFF}Добро пожаловать на {f5cc00}Lenzetto RolePlay\n\
{FFFFFF}Уважаемый {f5cc00}%s{FFFFFF}, для игры на нашем сервере вам необходимо зарегистрироваться\n\n\
Придумайте пароль от 6-ти до 32-ух символов для вашего будущего аккаунта и нажмите \"Далее\"\n\
{f5cc00}Примечание:\n\
Пароль должен состоять только из цифр и латинских символов любого регистра",
pName(playerid)
);
SPD(playerid, DLG_REG, DIALOG_STYLE_INPUT, "{f5cc00}Регистрация{FFFFFF} - Ввод пароля", dialog, "Далее", "Закрыть");
}
public OnPlayerDisconnect(playerid, reason)
{
if(GetPVarInt(playerid, "logged") !=0)
{
Iter_Remove(Admins_ITER, playerid);
static const fmt_query[] = "UPDATE `accounts` SET `mins` = '%d' WHERE `id` = '%d'";
new query[sizeof(fmt_query)+(-2+9)+(-2+8)];
format(query, sizeof(query), fmt_query, player_info[playerid][MINS], player_info[playerid][ID]);
mysql_tquery(dbHandle, query);
}
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
new str_len = strlen(inputtext);
switch(dialogid)
{
case DLG_REG:
{
if(response)
{
if(!str_len)
{
ShowReg(playerid);
return SCM(playerid, COLOR_RED, "[Ошибка]: {FFFFFF}Введите пароль в поле ниже и нажмите \"Далее\"");
}
if(!(6 <= str_len < 32))
{
ShowReg(playerid);
return SCM(playerid, COLOR_RED, "[Ошибка]: {FFFFFF}Длина пароля должна быть от 6-ти до 32-ух символов");
}
new regex:rg_passwordcheck = regex_new("^[a-zA-Z0-9]{1,}$");
if(regex_check(inputtext, rg_passwordcheck))
{
format(player_time_save[playerid][PASSWORD_CLEAR], 32, "%s", inputtext);
new salt[11];
for(new i; i < 10; i++)
{
salt[i] = random(79) + 47;
}
salt[10] = 0; // Соль
SHA256_PassHash(inputtext, salt, player_info[playerid][PASSWORD], 65); // Хеширование пароля
strmid(player_info[playerid][SALT], salt, 0, 11, 11); // Сохранение соли
SPD(playerid, DLG_REG_SEX, DIALOG_STYLE_MSGBOX, "{f5cc00}Регистрация{FFFFFF} - Выбор пола",
"Теперь вам нужно выбрать пол вашего будущего персонажа",
"Мужской", "Женский");
}
else
{
ShowReg(playerid);
regex_delete(rg_passwordcheck);
return SCM(playerid, COLOR_RED, "[Ошибка]: {FFFFFF}Пароль должен состоять только из чисел и латинских символов любого регистра");
}
}
else
{
SCM(playerid, COLOR_RED, "[Ошибка]: {FFFFFF}Используйте /q чтобы выйти...");
return Kick(playerid);
}
}
case DLG_REG_SEX:
{
if(response)
{
player_info[playerid][SEX] = 1; // Мужской пол
player_info[playerid][SKIN] = 2;
}
else
{
player_info[playerid][SEX] = 2; // Женский пол
player_info[playerid][SKIN] = 3;
}
new sex_str[16];
if(player_info[playerid][SEX] == 1)
{
sex_str = "Мужской";
}
else
{
sex_str = "Женский";
}
new Year, Month, Day;
getdate(Year, Month, Day);
new date[13];
format(date, sizeof(date), "%02d.%02d.%02d", Day, Month, Year);
new ip[16];
GetPlayerIp(playerid, ip, sizeof(ip));
//
static const fmt_query[] = "INSERT INTO `accounts` (`name`, `password`, `salt`, `sex`, `skin`, `regdata`, `regip`) VALUES ('%e', '%e', '%e', '%d', '%d', '%e', '%e')"; // Запрос на создание аккаунта
new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)+(-2+64)+(-2+10)+(-2+1)+(-2+3)+(-2+12)+(-2+15)];
mysql_format(dbHandle, query, sizeof(query), fmt_query, player_info[playerid][NAME], player_info[playerid][PASSWORD], player_info[playerid][SALT], player_info[playerid][SEX], player_info[playerid][SKIN], date, ip);
mysql_query(dbHandle, query);
static const fmt_query2[] = "SELECT * FROM `accounts` WHERE `name` = '%e' AND `password` = '%e'"; // После создание аккаунта идет перенаправка на загрузку аккаунта
mysql_format(dbHandle, query, sizeof(query), fmt_query2, player_info[playerid][NAME], player_info[playerid][PASSWORD]);
mysql_tquery(dbHandle, query, "PlayerLogin", "i", playerid); // Загрузка аккаунта
new reg_final_message[159];
format(reg_final_message, sizeof(reg_final_message),
"{00FF00}Регистрация завершена!\n\n\
{FFFFFF}Ваш пароль: {00FF00}%s\n\
{FFFFFF}Ваш пол персонажа: {00FF00}%s\n\n\
{FFFFFF}Спасибо за регистрацию на нашем сервере!",
player_time_save[playerid][PASSWORD_CLEAR],
sex_str
);
SPD(playerid, DLG_REG_SUCCESS, DIALOG_STYLE_MSGBOX, "Регистрация успешна!", reg_final_message, "ОК", "");
}
case DLG_LOG:
{
if(response)
{
if(!str_len)
{
ShowLogin(playerid);
return 1;
}
new checkpass[65];
SHA256_PassHash(inputtext, player_info[playerid][SALT], checkpass, 65);
if(strcmp(player_info[playerid][PASSWORD], checkpass, false, 64) == 0)
{
static const fmt_query[] = "SELECT * FROM accounts WHERE name = '%e' AND password = '%e'";
new query[sizeof(fmt_query) + (-2 + MAX_PLAYER_NAME) + (-2 + 64)];
mysql_format(dbHandle, query, sizeof(query), fmt_query, player_info[playerid][NAME], player_info[playerid][PASSWORD]);
mysql_tquery(dbHandle, query, "PlayerLogin", "i", playerid); // Загрузка аккаунта
}
else
{
new string[81];
SetPVarInt(playerid, "WrongPass", GetPVarInt(playerid, "WrongPass") - 1);
if(GetPVarInt(playerid, "WrongPass") > 0)
{
format(string, sizeof(string), "[Ошибка]: {FFFFFF}Вы ввели неверный пароль от аккаунта. У вас осталось %d попыток.", GetPVarInt(playerid, "WrongPass"));
SCM(playerid, COLOR_RED, string);
}
if(GetPVarInt(playerid, "WrongPass") == 0)
{
SCM(playerid, COLOR_RED, "[Ошибка]: {FFFFFF}Вы исчерпали лимит попыток входа и были отключены от сервера.");
SPD(playerid, -1, 0, " ", " ", " ", "");
return Kick(playerid);
}
ShowLogin(playerid);
}
}
else
{
SCM(playerid, COLOR_RED, "[Ошибка]: {FFFFFF}Используйте /q чтобы выйти...");
return Kick(playerid);
}
}
case DLG_CONFIRMPIN:
{
if(response)
{
if(!str_len) return SPD(playerid, DLG_CONFIRMPIN, DIALOG_STYLE_INPUT, "{f5cc00}Аутентификация", "{FFFFFF}Введите PIN-код для подтверждения личности.", "Ввести", "Выход");
new checkpin[65];
SHA256_PassHash(inputtext, player_info[playerid][SPIN], checkpin, 65);
if(strcmp(player_info[playerid][PIN], checkpin, false, 64) == 0)
{
SetPVarInt(playerid, "logged", 1);
SetSpawnInfo(playerid, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
}
else
{
new string[100];
SetPVarInt(playerid, "WrongPin", GetPVarInt(playerid, "WrongPin") - 1);
if(GetPVarInt(playerid, "WrongPin") > 0)
{
format(string, sizeof(string), "[Ошибка]: {FFFFFF}Неверный PIN-код. Осталось попыток: %d", GetPVarInt(playerid, "WrongPin"));
SCM(playerid, COLOR_RED, string);
}
if(GetPVarInt(playerid, "WrongPin") == 0)
{
SCM(playerid, COLOR_RED, "[Ошибка]: {FFFFFF}Вы исчерпали лимит попыток ввода и были отключены от сервера.");
SPD(playerid, -1, 0, " ", " ", " ", "");
return Kick(playerid);
}
SPD(playerid, DLG_CONFIRMPIN, DIALOG_STYLE_INPUT, "{f5cc00}Аутентификация", "{FFFFFF}Введите PIN-код для подтверждения личности.", "Ввести", "Выход");
}
}
else
{
SCM(playerid, COLOR_RED, "[Ошибка]: {FFFFFF}Используйте /q чтобы выйти...");
return Kick(playerid);
}
}
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]); // int отвечает за числа
cache_get_value_name(0, "pin", player_info[playerid][PIN], 65);
cache_get_value_name(0, "spin", player_info[playerid][SPIN], 11);
cache_get_value_name(0, "gmail", player_info[playerid][GMAIL], 65); // без int отвечает за строковые данные
cache_get_value_name_int(0, "sex", player_info[playerid][SEX]);
cache_get_value_name_int(0, "skin", player_info[playerid][SKIN]);
cache_get_value_name(0, "regdata", player_info[playerid][REGDATA], 13);
cache_get_value_name(0, "regip", player_info[playerid][REGIP], 16);
cache_get_value_name_int(0, "admin", player_info[playerid][ADMIN]);
cache_get_value_name_int(0, "money", player_info[playerid][MONEY]);
cache_get_value_name_int(0, "lvl", player_info[playerid][LVL]);
cache_get_value_name_int(0, "exp", player_info[playerid][EXP]);
cache_get_value_name_int(0, "mins", player_info[playerid][MINS]);
if(player_info[playerid][ADMIN] > 0) Iter_Add(Admins_ITER, playerid);
if(!strlen(player_info[playerid][PIN])) // если PIN пустой
{
SetPVarInt(playerid, "logged", 1);
SetSpawnInfo(playerid, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
}
else
{
SPD(playerid, DLG_CONFIRMPIN, DIALOG_STYLE_INPUT, "{f5cc00}Аутентификация", "{FFFFFF}Введите PIN-код для подтверждения личности.", "Ввести", "Выход");
}
}
return 1;
}
вроде все что связано с регой и авторизацией также с тем диалогом ввода пина я тут вставил(диалоги создания пина и тд я не втсавлял так как нету смисла)
И вот еще текст с бд(кто разберется тот разберется)
Full texts
id Ascending
name
password
salt
pin
spin
gmail
sex
skin
regdata
regip
admin
money
lvl
exp
mins
Edit Edit
Copy Copy
Delete Delete
5
Denis_Batrak
3758D5F8E77EF12FFB5D148B036551274848D7D4C80F929141...
iWB4mgE{?7
0
0
1
2
23.06.2026
127.0.0.1
0
0
1
0
0
помогите пожайлуста
Страница 1 из 1
[ Other ]
Проблема в регистрации
#2
Отправлено 23 июня 2026 - 20:01
Когда ты таблицу пересоздавал, в колонки pin и spin прописался дефолт «0». А у тебя в коде проверка типа «если пин пустой — пускаем без него». Но «0» — это не пустота, там же символ стоит, вот мод и решает, что пин есть, и начинает его требовать, поэтому тебя и кидало на ввод пина после регистрации.
Что сделать в БД (phpMyAdmin или консоль):
Только глянь, чтобы pin был именно VARCHAR, а не INT — туда же хэш на 64 символа летит, в число он никак не влезет.
А текст что обрезается («латинских с...») — просто буфер у диалога маленький. В ShowReg найди
и поставь
Он у тебя просто не помещался.
Попробуй, должно помочь.
Что сделать в БД (phpMyAdmin или консоль):
ALTER TABLE `accounts` MODIFY `pin` VARCHAR(64) NOT NULL DEFAULT '', MODIFY `spin` VARCHAR(10) NOT NULL DEFAULT ''; UPDATE `accounts` SET `pin` = '', `spin` = '' WHERE `pin` = '0';
Только глянь, чтобы pin был именно VARCHAR, а не INT — туда же хэш на 64 символа летит, в число он никак не влезет.
А текст что обрезается («латинских с...») — просто буфер у диалога маленький. В ShowReg найди
new dialog[304+(-2+MAX_PLAYER_NAME)];
и поставь
new dialog[512];
Он у тебя просто не помещался.
Попробуй, должно помочь.
#3
Отправлено 23 июня 2026 - 20:27
Привет! Спасибо, помогло! Долго не мог понять что не так(чат гпт кстате также говорил что там что-то ставится но я думал что ну не как так то)
Я спустя год почти вернулся писать мод и увидел какой же он не доработаний с теми системами что сейчас имеются)
Писал начало по Леоне ГАланте дальше уже понял что да как
СПАСИБО!!
Я спустя год почти вернулся писать мод и увидел какой же он не доработаний с теми системами что сейчас имеются)
Писал начало по Леоне ГАланте дальше уже понял что да как
СПАСИБО!!
Поделиться темой:
Страница 1 из 1
Вход
Регистрация
Помощь








