Как сделать регистрацию самп

Добавил пользователь Алексей Ф.
Обновлено: 04.10.2024

Новые сервера

Новые сайты

Новые форумы

Статистика

Серверов онлайн: 2 148

Игроков онлайн: 30 468

Всего слотов онлайн: 497 503

Всего серверов в БД: 127 192

+11 новых серверов за 24 часа

Новые комментарии

[China-RP] 10lvl, 50.000.000$, 20.000 Donate •

Имя:Давид
Имя в игре:Claus_Salvadore
Лет:16
Хочу встать на пост администратора сервера(опыта много)

Beautifull Role Play

•• Набор в адм/лид на респе | Eternity EMPIRE Role

Здраствуйте, мы открыли свой проект! Нужны админы, ждём вас! 194.93.2.226:3827

Ваш игровой никнейм:Что вы хотите добавить на сервер?:Опишите вашу идею: Если ваша идея будет уникальной или понравится нашим Администратором, ва .

СЕРВЕР ОТКРЫЛСЯ ЗАЛИТАЙ ВОТ АЙРИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИ 176.32.39.178:7777

Тема: Правила сервера

Основное:RolePlay(сокращение RP) - реальная игра, реальное поведение, как в жизни, игра по ролям.Non Role Play (сокращение NonRP) - действие .

Тема: Жалобы на Администрацыю

Ваш ник:Ник нарушителя:Дата нарушения:Суть нарушения:На каком гриферском режиме было нарушение (GRIEF-1.12/GRIEF-1.16) :Доказательства о нарушени .

-->

Создание системы регистрации

В этой теме я расскажу Вам, как можно написать систему регистрации с нуля (можно и адаптировать под Ваш Godfather мод).


>>>> Так будет выглядеть пустая, без аккаунтов таблица:

> Базу данных и таблицу мы подготовили, теперь перейдем к моду.

>> Сверху мода, где вы подключаете все инклюды, добавляем эти строки:

enum Variables <
aID ,
aName [ MAX_PLAYER_NAME ],
aPassword [ 64 ],
bool : aLogged ,
aWrongPassword ,
>;
new playerVariable [ 100 ][ Variables ]; // 100 - моё кол-во слотов для игроков на сервере.

ConnectMySQL () < // В OnGameModeInIt вставьте ConnectMySQL();
mysql_connect ( SQL_HOST , SQL_USER , SQL_DB , SQL_PASS ); // Тут мы используем все данные, которые мы дефайнили.
switch( mysql_ping ()) < // Проверка на то, что мы подключены к БД.
case 1 : print( "MySQL connection: alive." ); // Если подключена БД.
case - 1 : print( "MySQL connection: dead." ); // Если не подключена БД.
>
return 1 ;
>

CreateAccount ( playerid , password []) <
new
query [ 128 ], // Для запроса.
sqlname [ MAX_PLAYER_NAME ],
sqlpassword [ 32 ];
mysql_real_escape_string ( playerVariable [ playerid ][ aName ], sqlname ); // Защитит от sql inject
mysql_real_escape_string ( password , sqlpassword ); // Защитит от sql inject
format ( query , sizeof ( query ), "INSERT INTO `Accounts` (`Nickname`, `Password`) VALUE ('%s', '%s')" , sqlname , sqlpassword ); // Добавляем в таблицу запись.
// INSERT - добавление записи в таблицу, 1. () — поля. 2. VALUE — значения этих полей.
mysql_query ( query ); // Отправляем запрос.
playerVariable [ playerid ][ aID ] = mysql_insert_id (); // Узнаём ИД аккаунта, будет использоваться для сохранения и прочих операций.
strmid ( playerVariable [ playerid ][ aPassword ], password , 0 , 64 , 255 ); // Внедряем в массив аккаунта введенный игроком пароль.
playerVariable [ playerid ][ aLogged ] = true ; // Мы авторизованы.
return 1 ;
>
LoadAccount ( playerid , password []) <
new
query [ 128 ],
sqlpass [ 32 ],
result [ 5 + 24 + 64 ],
dialog [ 128 ];
mysql_real_escape_string ( password , sqlpass ); // Защита от SQL Inject, шифрует кодировку.
format ( query , sizeof ( query ), "SELECT * FROM `Accounts` WHERE `Password` = '%s' AND `ID` = '%i'" , sqlpass , playerVariable [ playerid ][ aID ]);
// SELECT * - выбрать, FROM - с таблицы, WHERE - где, пароль равен введенному паролю и ID равен иду ника человека.
mysql_query ( query ); // Отправляем запрос.
mysql_store_result (); // Смотрим записи, которые мы выбрали запросом выше.
if( mysql_num_rows () == 1 ) < // Если выбрало только 1 аккаунт с таким паролем и ИД - успех, пароль введен верно, загружаем данные в массив.
mysql_fetch_row_format ( result , "|" ); // split, данные в результате записываются типо "1|Snoowker|parol"
sscanf ( result , "p is[24]s[32]" , // i - ид (int), s[размер] - string, ник и пароль.
playerVariable [ playerid ][ aID ],
playerVariable [ playerid ][ aName ],
playerVariable [ playerid ][ aPassword ]);
playerVariable [ playerid ][ aLogged ] = true ;
mysql_free_result (); // Очищаем память.
return 1 ;
>
else < // Мы ввели неверный пароль.
if( playerVariable [ playerid ][ aWrongPassword ] == 4 ) <
SendClientMessage ( playerid , COLOR_LIGHTRED , "Вы 3 раза ввели неверный пароль и были отключены от сервера." );
Kick ( playerid );
return 1 ;
>
playerVariable [ playerid ][ aWrongPassword ] ++;
format ( dialog , sizeof ( dialog ),
"Вы ввели неверный пароль.\n\
У Вас осталось %i/3 попыток ввода." , 3 - playerVariable [ playerid ][ aWrongPassword ]);
ShowPlayerDialog ( playerid , DIALOG_WRONGPAS , DIALOG_STYLE_MSGBOX , "Ошибка." , dialog , "Повтор" , "Отмена" );
>
return 1 ;
>
GetAccountID ( playerid ) <
new
query [ 128 ];
format ( query , sizeof ( query ), "SELECT `ID` FROM `Accounts` WHERE `Nickname` = '%s'" , playerVariable [ playerid ][ aName ]);
// Выбираем ID, с таблицы Accounts, где Ник равен нику игрока.
mysql_query ( query ); // Отправляем запрос.
mysql_store_result (); // Видим
if( mysql_num_rows () == 1 ) < // Если у нас в результате выбрало 1 запись, т.е. аккаунт игрока.
playerVariable [ playerid ][ aID ] = mysql_fetch_int (); // ИД игрока равен номеру записи.
mysql_free_result (); // Очищаем память.
return playerVariable [ playerid ][ aID ]; // Возвращаем ИД игрока.
>
return 0 ;
>

SaveAccount ( playerid ) < // Сохранение аккаунта.
if( playerVariable [ playerid ][ aLogged ] == true ) < // Проверка, если аккаунт авторизован.
CheckMySQLConnection (); // Проверяем, подключена ли БД.
new
query [ 186 ],
sqlname [ MAX_PLAYER_NAME ],
sqlpass [ 64 ];
mysql_real_escape_string ( playerVariable [ playerid ][ aName ], sqlname );
mysql_real_escape_string ( playerVariable [ playerid ][ aPassword ], sqlpass );
format ( query , sizeof ( query ), "UPDATE `Accounts` SET `Nickname` = '%s', `Password` = '%s' WHERE `ID` = '%i'" , sqlname , sqlpass , playerVariable [ playerid ][ aID ]);
mysql_query ( query ); // Отправляем запрос
>
return 1 ;
>

RemovePlayerVariables ( playerid ) <
playerVariable [ playerid ][ aWrongPassword ] = 0 ;
playerVariable [ playerid ][ aID ] = 0 ;
playerVariable [ playerid ][ aLogged ] = false ;
return 1 ;
>

public OnPlayerText ( playerid , text [])
<
if( playerVariable [ playerid ][ aLogged ] == false ) return 0 ;
return 1 ;
>

public OnPlayerDisconnect ( playerid , reason )
<
if( playerVariable [ playerid ][ aLogged ] == true ) SaveAccount ( playerid );
return 1 ;
>


Готово, у нас есть система регистрации.
Вот так выглядит таблица с аккаунтами:

Автор урока: Snoowker .

Копирование материала на посторонние сайты без указания автора строго запрещено.

Сегодня мы с Вами напишем с нуля полноценный скрипт регистрации и авторизации для сервера rage mp. В качестве интерфейса мы не будем использовать команды, а сразу сделаем "красиво" на CEF. В качестве базы данных будем использовать MySQL.


Видео версия как обычно на youtube канале:

В итоге html файл выглядит так:


Чтобы показать этот интерфейс игроку при входе на сервер, будем дергать с сервера на клиент событие showLoginDialog.

Теперь при входе игрока на сервер ему будет показываться на форма входа.

Вернемся теперь к index.html и браузерной части. У нас есть две формы (register и login). Форма login отображается по-умолчанию, а register скрыта в стилях. Внизу каждой формы есть ссылка на другую и при помощи функций showLogin() и showRegister() мы будем переключаться между ними. Также для кнопок входа и регистрации добавлен вызов функций registerAttempt() и loginAttempt() , которые будут вызываться по событию onclick

В script.js добавим реализацию этих функций. С переключением между формами все просто:


При отправке запроса на вход или регистрацию нам нужно считать содержимое полей формы, выполнить их базовые проверки и передать в клиент rage mp

Также в коде Вы наверное заметили функции связанные с выводом ошибок в форму на нашей страничке. Здесь все просто. У нас есть div блок с id error. Он находится выше наших форм и поэтому может показываться независимо от того на какой форме сейчас пользователь.


В клиентской части добавим обработчики событий loginAttempt и registerAttempt, которые будут вызываться из браузерного скрипта.

Они максимально простые и просто передают данные с браузера дальше на сервер при помощи callRemote. Напоминаю что в качестве data у нас JSON строка с логином и паролем. В таком виде мы передаем ее дальше, поскольку callRemote также позволяет нам передавать только простые строки и числа.

  1. Добавить пакет mysql и настроить подключение к серверу MySQL. Структура базы данных и само подключение будет таким же, как и в уроке по подключению MySQL. У нас будет 1 таблица accounts с тремя столбцами: id, login и password
  2. Добавить пакет bcrypt для генерации хэша паролей и его проверки.

Для регистрации на серверной стороне обработчик onRegisterAttempt будет немного сложнее. Прежде чем добавить аккаунт нам нужно проверить его на уникальность и его такой логин уже есть в базе данных, то выдавать ошибку.

Для тех кто захочет дальше ковырять эту форму, напишу парочку идей того, что можно улучшить и доработать:
1. Добавить защиту от перебора паролей. Кикать после 3 неправильных вводов.
2. Написать функцию isPlayerLoggedIn() которая будет возвращать true если игрок авторизовался и false если еще нет.
3. Добавить столбец position в таблицу accounts. Записывать туда позицию игрока при выходе с сервера.
4. Добавить возможность восстановить пароль. Для этого понадобиться добавить поле для email аккаунта и какой-то способ чтобы отправлять электронные письма с сервера.

Если при установке библиотеки bcrypt появляется ошибка 'undefined symbol: napi_module_register', то попробуйте это решение.

Вложения

Lev Angel

evgee

Junior Developer

Покажите мне кто ещё подробнее объясняет чем автор, я первым брошу в него камень!
Ооочень подробный мануал, все по полочками.
За старания большой плюс тебе.

Lev Angel

Developer

Покажите мне кто ещё подробнее объясняет чем автор, я первым брошу в него камень!
Ооочень подробный мануал, все по полочками.
За старания большой плюс тебе.

Junior Developer
Junior Developer

evgee

Junior Developer

Lev Angel

Developer

Сейчас мы инициируем показ окна входа с сервера. Если делать это сразу на клиенте, то окно будет выскакивать быстрее.
Как вариант еще поискать на вики, может быть функция которая отключает авто спавн.

YoungCoder

Junior Developer

1606427864513.jpg

YoungCoder

Junior Developer

Lev Angel

Developer

Lev Angel

Developer
Junior Developer
Junior Developer

Для тех кто захочет дальше ковырять эту форму, напишу парочку идей того, что можно улучшить и доработать:
1. Добавить защиту от перебора паролей. Кикать после 3 неправильных вводов.
2. Написать функцию isPlayerLoggedIn() которая будет возвращать true если игрок авторизовался и false если еще нет.
3. Добавить столбец position в таблицу accounts. Записывать туда позицию игрока при выходе с сервера.
4. Добавить возможность восстановить пароль. Для этого понадобиться добавить поле для email аккаунта и какой-то способ чтобы отправлять электронные письма с сервера.

Lev Angel

Developer

geneff

Middle Developer

Для тех кто захочет дальше ковырять эту форму, напишу парочку идей того, что можно улучшить и доработать:
1. Добавить защиту от перебора паролей. Кикать после 3 неправильных вводов.
2. Написать функцию isPlayerLoggedIn() которая будет возвращать true если игрок авторизовался и false если еще нет.
3. Добавить столбец position в таблицу accounts. Записывать туда позицию игрока при выходе с сервера.
4. Добавить возможность восстановить пароль. Для этого понадобиться добавить поле для email аккаунта и какой-то способ чтобы отправлять электронные письма с сервера.

Вроде успешно выполнил данное "домашнее" задание и решил поделится своими успехами с Вами, вдруг кому будет интересно.

1) Добавить защиту от перебора паролей. Кикать после 3 неправильных вводов.

В ивенте playerReady добавляем инициализацию переменой player.loginAttemp, которая будет отвечать за кол-во спроб:

Ну вот и первое задание выполнено.

2) Написать функцию isPlayerLoggedIn() которая будет возвращать true если игрок авторизовался и false если еще нет.

Так же идем в ивент playerReady для инициализации переменных.

Задание выполнено и этой функцией мы воспользуемся в следуещем задании.

3) Добавить столбец position в таблицу accounts. Записывать туда позицию игрока при выходе с сервера.
Для начала нужно в нашей таблицы MySQL создать три поля (float): posX, posY, posZ

Далее сделаем сохранение нашей позиции при выходе из сервера:


И в onRegisterAttempt добавил дефолтною позицию спавна игрока (рандомные координаты, для демонстрации):


В общем добавлю под спойлер полный код, чтобы вы смогли разобратся сами, если чего-то не поняли до этого.

Lev Angel

Developer

@geneff ого. Ты крут Молодец что сделал и еще +100 в карму что поделился результатами.

Придраться не к чему, особо не покритикую. Единственное что я бы поменял это касается стандартного спавна (когда у игрока нет сохраненных координат в базе). У тебя он задается два раза в двух местах при регистрации и логине. Оно работает без проблем, но если ты захочешь поменять координаты, то нужно будет не забыть сделать это в двух местах. Из-за этого дублирование кода плохая идея.

Лучше либо вынести эти координаты в какой-то конфиг или константу в начале скрипта, либо код спавна вынести в одно место (например, в playerReady сразу спавнить на стандартных координатах).

Lev Angel

Developer

geneff

Middle Developer

Честно говоря, понятия не имею как это сделать. Но думаю пару роликов на ютубе как о том как отправлять письма на почту это исправит. Правда я не понимаю как это было бы правильно сделать? Отсылать новый пароль на почту? Или отослать на почту код с потверждение, далее его ввести в игре и откроется меню смены пароля?

seaniwe

Senior Developer

Честно говоря, понятия не имею как это сделать. Но думаю пару роликов на ютубе как о том как отправлять письма на почту это исправит. Правда я не понимаю как это было бы правильно сделать? Отсылать новый пароль на почту? Или отослать на почту код с потверждение, далее его ввести в игре и откроется меню смены пароля?

Я хоть таким не занимался, но думаю по логике нужен нам "gmail API" для отправки кода на почту, и уже сравнивать значения.

Lev Angel

Developer

@geneff что касается алгоритма восстановления пароля. В задании не сказано как именно восстанавливать пароль, так что можно делать как угодно - главное достичь цели. Просто высылать новый пароль на почту будет неправильно. Тогда кто угодно, зная email аккаунта может менять пароль бесконечное количество раз Он конечно не будет знать новый пароль, но владельцу аккаунта будет весело

Второй вариант мне кажется более правильный. Генерируем код восстановления и отправляем его на почту. Этот код можно даже не хранить с базе, а только в памяти, поскольку когда игрок выйдет с сервера этот код уже будет недействителен. Так будет даже безопаснее, потенциальный хакер даже если и выманит этот код у игрока, то для него он будет бесполезен.
Ну и нужна простая форма в которую вводим код восстановления и два раза новый пароль.

Версия 0.3z.
Захотелось играть только со своей компанией или решили сменить амплуа игрока на творца? Зачастую новички задаются вопросом "Как же создать SAMP сервер? ".Установить и настроить сервер SAMP не так уж и сложно, даже для "чайников". Главное подойти к решению задачи комплексно и последовательно.

Актуальной версией мультиплеера является "samp 0,3z". Обновленный клиент вышел в 2014 году, были исправлены баги, практически все сервера перешли на нее. Создавать свой сервер мы начнем именно на этой платформе.

Папка-сервер.

Сперва необходимо скачать "sa-mp" файлы сервера отсюда
Устанавливать нужно на чистую от модов, но необязательно официальную, версию San-Andreas.

архив самп 0.3z

1. Распаковываем архив в наиболее удобное место (конечно, в папку, а не на рабочий стол). Данная папка в дальнейшем будет нашим инструментом администрирования:

файлы сервера самп


  • "scriptfiles"содержит мини-дополнения к серверу, конфигурации домов и бизнеса. Сюда в дальнейшем добавляются спидометры, скины и т.п.
  • "plugins" — плагины.
  • "pawno"программа. Отвечает за компиляцию (трансляцию) модов.
  • "npcmodes"содержит файлы ботов и маршруты их передвижения.
  • "include"инклуды - исходные файлы.
  • "gamemodes"основная папка, в ней хранится мод (режим карты).
  • "server.cfg"основной файл, для запуска сервера. Через него подключаются моды и основные параметры сервера. Далее рассмотрим его по деталям.
  • "samp-server.exe"основное приложение, которое запускает сервер samp.

Начальная коррекция server.cfg

Внимание! Если у Вас динамический айпи, возможно потребуется дополнительный софт (прога.Hamachi). Или попробуйте подключение без модема. В противном случае Ваш сервер никто не найдет, даже Вы уже через некоторое время не сможете подключаться, до внесения актуального айпи.

Открываем файл "server.cfg". Открыть его можно любым редактором, в данном случае обычным блокнотом. Server.cfg — предустановочный файл для будущего сервера. С ним придется поработать.

server.cfg самп


  • "echo Executing Server Config. " — Информирует систему о том, что данный файл является конфигом. Оставляем без изменений.
  • "lanmode-0" – Переключатель глобальная/локальная сеть. Если требуется подключение по локальной ставим "1" (без кавычек) на место "0". Мы будем играть через локальное подключение и меняем на "1".
  • " rcon_password — changeme" - пароль администратора. Здесь устанавливаем свой пароль. Если оставить по умолчанию сервер не запустится.
  • "maxplayers — 50" — максимальное количество игроков на сервере. Задаем нужное нам количество слотов.
  • "port — 7777" — порт будущего сервера, отвечает за подключение. Оставляем по умолчанию.
  • "hostname — SA-MP 0.3 Server"— название нашего сервера. Отображается в клиентских списках поиска серверов. Сочиняем название. Например: "Na penek sel? Kosar davaj"
  • "gamemode 0 — grandlarc 1" — Выбранный жанр. Пока что оставляем как есть.
  • "maxnpc 0"число ботов на карте. Можно выставить на свое усмотрение.
  • "filterscripts — gl_actions gl_realtime gl_property gl_mapicon ls_mall attachments skinchanger vspawner" -подключаемыефильтр-скрипты.
  • "weburl — "www.sa-mp.com" — Сайт сервера. Пишете свой (если есть сайт) или оставляете без изменений.

server.cfg самп

Разбор ошибок и пробный запуск сервера.exe

Затем запускаем samp-server.exe. Если все проделано правильно екзешник откроется в виде командной строки, например:

samp-server.exe командная строка

В том случае если панель не открывается или моментально сворачивается - возвращаемся к server.cfg. Скорее всего, не был изменен RCON пароль или ошибка в коррекции тех файлов, которые не стоило трогать. В поиске занозы придет server_log.txt — вспомогательный "текстовик" для выявления проблем сервера.


  • Error: Ваш пароль не был изменен с дефолтного. Пожалуйста, исправьте это.

скриншот лаунчера самп

Если все проделано верно, согласно инструкции - вместо "retrieving info" высветится имя нашей карты, в рассмотренном случае "Na penek sel? Kosar davaj" наш сервер:

самп сервер онлайн

Пробуем подключиться. Вводим свой пароль из server.cfg, клацаем connect. Возможно первое подключение займет непривычно много времени. 2 - 5 минут и вуаля — мы на собственном сервере:

самп вход на сервер

Но, пока что на правах рядового гражданина. Чтоб залогиниться в качестве администратора открываем чат (английская "Т") и прописываем следующую RCON команду — /rcon login , обязательна вначале косая черта "/" и свой пароль без скобок:


  • SERVER: Вы зашли в качестве админа. Пример: /rcon login garrik

  • /rcon cmdlist— Данной командой мы отобразили на экране все доступные RCON команды. И клацая мышкой применяем их к серверу.
  • /rcon varlistВсе действующие настройки нашего сервера отображаются в окне..
  • /rcon password (пароль)Пароль для входа на сервер..
  • /rcon rcon_password (пароль)Замена пароля админа на новый.
  • /rcon reloadbansПосле двух предыдущих команд обязательно требуется перезагрузить списки забаненных/разбаненных по айпи пользователей.
  • /rcon reloadlogЕсли требуется почистить чат и все сохраненные действия игроков из регистра.
  • /rcon exec server.cfgОткрываем конфигурационный файл server.cfg не отлучаясь от карты. Таким образом возможно открывать любой файл сервера.
  • /rcon say привет, с вами админОбращаемся к контингенту через общий чат:"Admin: привет, с вами админ"
  • /rcon playersПросматриваем список активных пользователей с их данными. В общем дает почувствовать себя сотрудником спецслужб.
  • /rcon gravity 0.05Усиливаем/ослабляем силу гравитации (по умолчанию 0,008)
  • /rcon weather 2Мы теперь всевластвуем над погодой!(значения выставляются от 1 до 100 экспериментируйте).
  • /rcon maxplayersКорректировать количество народа на сервере.
  • /rcon timestampВарьируем скорость смены день/ночь.
  • /rcon worldtime 3Смена часового режима (1100).
  • /rcon pluginsОтображает все загруженные плагины.
  • /rcon filterscriptsОтображает все загруженные фильтрскрипты.
  • /rcon loadfs (название ф.с.)Добавить фильтрскрипт.
  • /rcon unloadfs (название ф.с.)Убрать фильтрскрипт.
  • /rcon reload (название ф.с.)Перезапускаем скрипт. На случай если он некорректно себя проявляет.
  • /rcon changemode (наименование режима)Изменить режим игры.
  • /rcon gmxЕсли Вы изменили настройки в cfg, требуется перезапустить конфигуратор, чтоб новые коррекции вступили в силу.
  • /rcon hostname мойСервакЗаходинебойсяКогда требуется сменить имя сервера.
  • /rcon gamemodetext дрифтБезпределаПереименовали дополнение карты.
  • /rcon mapname всем россияНаколесахПереименовали карту.
  • /rcon instagib 0Варьируем урон от выстрела ( 0 — выносит с одной пули). Значение распространяется на всех пользователей.
  • /rcon lanmodeПерешли в лан режим.
  • /rcon port 7779Заменили порт трансляции сервера. Для тех кто уже освоился. Что такое порт — читаем на википедии.
  • /rcon weburlwww.sa-mp.com— Устанавливаем новый/старый URL сайта сервера.
  • /rcon exitЗакрываем/выходим с сервера.
  • /rcon kick 15 — Убрали ("кикнули") игрока айди 15.
  • /rcon ban 15 — Забанили на сервере пользователя айди 15.
  • /rcon banip (IP)Забанили по айпи (Наример: /rcon banip 133.0.9.0).
  • /rcon unbanip (IP)Разбанили по айпи IP (Например: /rcon unbanip 133.0.9.0).

Полный список rcon команд здесь.

На этом всё, ваш сервер работает и вы можете им управлять. Осталось только позвать своих друзей!

Для тех, кто хочет запустить серьёзный проект SAMP на стабильно работающем оборудовании с защитой от DOS атак, рекомендуем заказать хостинг .

Читайте также: