Здравствуйте,это мой первый урок и мы будем обсуждать и делать регистрацию.
0)Обсуждение "на чем будет держаться мод"
1)mxINI - самый быстрый INI ридер,но при онлайне 100+ серв может слететь
2)Mysql - стабильный и удобный(но легок ко взлому)
3)Dini - в отличие от mxINI долгий,но зато держаит онлайн и под 150+
Но все же я возьму mxINI
1)Создаем Пустой скрипт и удаляем вот это:
// This is a comment
// uncomment the line below if you want to write a filterscript
//#define FILTERSCRIPT
и
#if defined FILTERSCRIPT
public OnFilterScriptInit()
{
print("\n--------------------------------------");
print(" Blank Filterscript by your name here");
print("--------------------------------------\n");
return 1;
}
public OnFilterScriptExit()
{
return 1;
}
#else
и вот это
#endif
2)Какие паблики нам нужны?
Нам понадобиться 4-5 паблика
OnPlayerRequestClass - будет вызывать сами диалоги
OnPlayerDisconnect - им будем сохранять данные
OnPlayerConnect - им обнуляем данные
OnDialogResponse - там будут диалоги
3)Структура Нашего Кода:
OnPlayerRequestClass
|
Вступление
| |
Рега Логин
| |
Спавн Спавн
4)А не лучше нам создать #define?
Ведь для диалогов это будет удобно,например задефайнил диалог,а если захотел поменять ид,то просто поменял
#define D_NULL 0//Нулевой Диалог
#define D_VSTUP 1//Вступление Диалог
#define D_AUTORIZ 2//Диалог Авторизации
#define D_REGISTER 3//Диалог Регистрации
Таким образом у нас:
#define Название_Диалога Ид_Диалога
И они должны использоваться в диалогах.
5)Начнем писать
Давайте добавим вступление к нашему коду,и добавим в OnPlayerRequestClass:
ShowPlayerDialog(playerid,D_VSTUP,DSM,"{6EF83C}[Жизнь [В]Деревне] {FFFFFF}Вступление",
"{B7FF00}Добро Пожаловать на Upgrade RP\n\n\t{FFFFFF}На нашем сервере вы встретите множество систем:\n\t\t1)Система Домов\n\t\t2)Система Заповедников\n\t\t3)Система Бизнессов\n\t\t4)Система Фракций\n\t\t5)Система Автомобиля\n\tВсе остальное вы запечитлите сами!",">>>>","");
Это как бы наше "вступление"
И перейдем к OnDialogResponse,и он должен выглядеть вот так:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid){
}
return 1;
}
и добавим под switch(dialogid){
Вот это:
case D_VSTUP:{
new stringer[126];
format(stringer,sizeof(stringer),"%s.ini",GN(playerid));
if(fexist(stringer)){
ShowPlayerDialog(playerid,D_AUTORIZ,DIALOG_STYLE_INPUT, "[Жизнь [В]Деревне] Авторизация", "{FFFFFF}Добро пожаловать на "ServerName"\n{FFFFFF}Вы зарегестрированы\n\n{FFFFFF}Введите ваш пароль:", "Войти", "");
}
else{
ShowPlayerDialog(playerid,D_REGISTER,DIALOG_STYLE_INPUT, "[Жизнь [В]Деревне] Регистрация", "{ffffff}Добро пожаловать на сервер "ServerName"\n{ffffff}Чтобы начать игру вам необходимо пройти регистрацию\n\nВведите пароль для вашего аккаунта\nОн будет запрашиваться каждый раз,когда вы заходите на сервер\n\n\t{66cc33}Примечания:\n\t- Пароль может состоять из русских и латинских символов\n\t- Пароль чувствителен к регистру\n\t- Длина пароля от 6-ти до 15 символов", "Войти", "Выйти");
}
}
Таким образом,когда игрок нажимает на ">>>>" идет проверка,если его файл есть,то идет авторизация,а если нет то регистрация
Добавим Регистрацию и Логин:
case D_AUTORIZ:{
if(response)
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid,D_AUTORIZ,DIALOG_STYLE_INPUT, "[Жизнь [В]Деревне] Авторизация", "{FFFFFF}Добро пожаловать на "ServerName"\n{FFFFFF}Вы зарегестрированы\n\n{FFFFFF}Введите ваш пароль:", "Войти", "");
return 1;
}
new pass[64];
strmid(pass,inputtext,0,strlen(inputtext),64);
OnPlayerLogin(playerid,pass);
}
else
{
ShowPlayerDialog(playerid,D_AUTORIZ,DIALOG_STYLE_INPUT, "[Жизнь [В]Деревне] Авторизация", "{FFFFFF}Добро пожаловать на "ServerName"\n{FFFFFF}Вы зарегестрированы\n\n{FFFFFF}Введите ваш пароль:", "Войти", "");
}
}
case D_REGISTER:{
if(response)
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid,D_REGISTER,DIALOG_STYLE_INPUT, "[Жизнь [В]Деревне] Регистрация", "{ffffff}Добро пожаловать на сервер "ServerName"\n{ffffff}Чтобы начать игру вам необходимо пройти регистрацию\n\nВведите пароль для вашего аккаунта\nОн будет запрашиваться каждый раз,когда вы заходите на сервер\n\n\t{66cc33}Примечания:\n\t- Пароль может состоять из русских и латинских символов\n\t- Пароль чувствителен к регистру\n\t- Длина пароля от 6-ти до 15 символов", "Войти", "Выйти");
return 1;
}
new pass[64];
strmid(pass,inputtext,0,strlen(inputtext),64);
OnPlayerRegister(playerid,pass);
}
else
{
ShowPlayerDialog(playerid,D_REGISTER,DIALOG_STYLE_INPUT, "[Жизнь [В]Деревне] Регистрация", "{ffffff}Добро пожаловать на сервер "ServerName"\n{ffffff}Чтобы начать игру вам необходимо пройти регистрацию\n\nВведите пароль для вашего аккаунта\nОн будет запрашиваться каждый раз,когда вы заходите на сервер\n\n\t{66cc33}Примечания:\n\t- Пароль может состоять из русских и латинских символов\n\t- Пароль чувствителен к регистру\n\t- Длина пароля от 6-ти до 15 символов", "Войти", "Выйти");
}
}
И добавим паблики после OnDialogResponse:
public OnPlayerRegister(playerid, password[])
{
if(IsPlayerConnected(playerid))
{
new string[64];
new playername[MAX_PLAYER_NAME];
GetPlayerName(playerid, playername, sizeof(playername));
format(string,sizeof(string), "%s.ini", playername);
new iniFile = ini_createFile(string);
if(iniFile < 0)
{
iniFile = ini_openFile(string);
}
if(iniFile >= 0)
{
strmid(PlayerInfo[playerid][pPass],password,0,strlen(password),255);
ini_setString(iniFile,"Pass",PlayerInfo[playerid][pPass]);
ini_setInteger(iniFile,"Admin",PlayerInfo[playerid][pAdmin]);
ini_closeFile(iniFile);
ShowPlayerDialog(playerid,D_AUTORIZ,DIALOG_STYLE_INPUT, "[Жизнь [В]Деревне] Авторизация", "{FFFFFF}Добро пожаловать на "ServerName"\n{FFFFFF}Вы зарегестрированы\n\n{FFFFFF}Введите ваш пароль:", "Войти", "");
}
}
return 1;
}
public OnPlayerLogin(playerid,password[])
{
if(IsPlayerConnected(playerid))
{
new string[64];
new pass[64];
new playername[MAX_PLAYER_NAME];
GetPlayerName(playerid, playername, sizeof(playername));
format(string,sizeof(string), "%s.ini", playername);
new iniFile = ini_openFile(string);
ini_getString(iniFile,"Pass",pass,64);
if(strcmp(pass,password,true) == 0)
{
ini_getString(iniFile,"Pass",PlayerInfo[playerid][pPass],64);
ini_getInteger(iniFile,"Admin",PlayerInfo[playerid][pAdmin]);
ini_closeFile(iniFile);
}
else
{
ini_closeFile(iniFile);
ShowPlayerDialog(playerid,D_AUTORIZ,DIALOG_STYLE_INPUT, "[Жизнь [В]Деревне] Авторизация", "{FFFFFF}Добро пожаловать на "ServerName"\n{FFFFFF}Вы зарегестрированы\n\n{FFFFFF}Введите ваш пароль:", "Войти", "");
return 1;
}
SendClientMessage(playerid,0xFF00000,"Добро пожаловать на наш сервер");
SpawnPlayer(playerid);
}
return 1;
}
и сток:
stock SavePlayer(playerid)
{
new string[64];
new playername[MAX_PLAYER_NAME];
GetPlayerName(playerid, playername, sizeof(playername));
format(string, sizeof(string), "%s.ini", playername);
new iniFile = ini_openFile(string);
ini_setString(iniFile,"Pass",PlayerInfo[playerid][pPass]);
ini_setInteger(iniFile,"Admin",PlayerInfo[playerid][pAdmin]);
ini_closeFile(iniFile);
}
6)Ошибки
Какие ошибки могут быть:
1)Не найден "ServerName":
#define ServerName "Жизнь [В]Деревне"//Свое название
2)Нету GN:
В конец мода:
stock GN(p){new pl[MAX_PLAYERS];GetPlayerName(p,pl,sizeof(pl));return pl;}
7)Конец
Если будут ошибки,то пишите!
P.S Второй урок по реги ждите в ближайшую неделю
Удачи!
0)Обсуждение "на чем будет держаться мод"
1)mxINI - самый быстрый INI ридер,но при онлайне 100+ серв может слететь
2)Mysql - стабильный и удобный(но легок ко взлому)
3)Dini - в отличие от mxINI долгий,но зато держаит онлайн и под 150+
Но все же я возьму mxINI
1)Создаем Пустой скрипт и удаляем вот это:
// This is a comment
// uncomment the line below if you want to write a filterscript
//#define FILTERSCRIPT
и
#if defined FILTERSCRIPT
public OnFilterScriptInit()
{
print("\n--------------------------------------");
print(" Blank Filterscript by your name here");
print("--------------------------------------\n");
return 1;
}
public OnFilterScriptExit()
{
return 1;
}
#else
и вот это
#endif
2)Какие паблики нам нужны?
Нам понадобиться 4-5 паблика
OnPlayerRequestClass - будет вызывать сами диалоги
OnPlayerDisconnect - им будем сохранять данные
OnPlayerConnect - им обнуляем данные
OnDialogResponse - там будут диалоги
3)Структура Нашего Кода:
OnPlayerRequestClass
|
Вступление
| |
Рега Логин
| |
Спавн Спавн
4)А не лучше нам создать #define?
Ведь для диалогов это будет удобно,например задефайнил диалог,а если захотел поменять ид,то просто поменял
#define D_NULL 0//Нулевой Диалог
#define D_VSTUP 1//Вступление Диалог
#define D_AUTORIZ 2//Диалог Авторизации
#define D_REGISTER 3//Диалог Регистрации
Таким образом у нас:
#define Название_Диалога Ид_Диалога
И они должны использоваться в диалогах.
5)Начнем писать
Давайте добавим вступление к нашему коду,и добавим в OnPlayerRequestClass:
ShowPlayerDialog(playerid,D_VSTUP,DSM,"{6EF83C}[Жизнь [В]Деревне] {FFFFFF}Вступление",
"{B7FF00}Добро Пожаловать на Upgrade RP\n\n\t{FFFFFF}На нашем сервере вы встретите множество систем:\n\t\t1)Система Домов\n\t\t2)Система Заповедников\n\t\t3)Система Бизнессов\n\t\t4)Система Фракций\n\t\t5)Система Автомобиля\n\tВсе остальное вы запечитлите сами!",">>>>","");
Это как бы наше "вступление"
И перейдем к OnDialogResponse,и он должен выглядеть вот так:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid){
}
return 1;
}
и добавим под switch(dialogid){
Вот это:
case D_VSTUP:{
new stringer[126];
format(stringer,sizeof(stringer),"%s.ini",GN(playerid));
if(fexist(stringer)){
ShowPlayerDialog(playerid,D_AUTORIZ,DIALOG_STYLE_INPUT, "[Жизнь [В]Деревне] Авторизация", "{FFFFFF}Добро пожаловать на "ServerName"\n{FFFFFF}Вы зарегестрированы\n\n{FFFFFF}Введите ваш пароль:", "Войти", "");
}
else{
ShowPlayerDialog(playerid,D_REGISTER,DIALOG_STYLE_INPUT, "[Жизнь [В]Деревне] Регистрация", "{ffffff}Добро пожаловать на сервер "ServerName"\n{ffffff}Чтобы начать игру вам необходимо пройти регистрацию\n\nВведите пароль для вашего аккаунта\nОн будет запрашиваться каждый раз,когда вы заходите на сервер\n\n\t{66cc33}Примечания:\n\t- Пароль может состоять из русских и латинских символов\n\t- Пароль чувствителен к регистру\n\t- Длина пароля от 6-ти до 15 символов", "Войти", "Выйти");
}
}
Таким образом,когда игрок нажимает на ">>>>" идет проверка,если его файл есть,то идет авторизация,а если нет то регистрация
Добавим Регистрацию и Логин:
case D_AUTORIZ:{
if(response)
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid,D_AUTORIZ,DIALOG_STYLE_INPUT, "[Жизнь [В]Деревне] Авторизация", "{FFFFFF}Добро пожаловать на "ServerName"\n{FFFFFF}Вы зарегестрированы\n\n{FFFFFF}Введите ваш пароль:", "Войти", "");
return 1;
}
new pass[64];
strmid(pass,inputtext,0,strlen(inputtext),64);
OnPlayerLogin(playerid,pass);
}
else
{
ShowPlayerDialog(playerid,D_AUTORIZ,DIALOG_STYLE_INPUT, "[Жизнь [В]Деревне] Авторизация", "{FFFFFF}Добро пожаловать на "ServerName"\n{FFFFFF}Вы зарегестрированы\n\n{FFFFFF}Введите ваш пароль:", "Войти", "");
}
}
case D_REGISTER:{
if(response)
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid,D_REGISTER,DIALOG_STYLE_INPUT, "[Жизнь [В]Деревне] Регистрация", "{ffffff}Добро пожаловать на сервер "ServerName"\n{ffffff}Чтобы начать игру вам необходимо пройти регистрацию\n\nВведите пароль для вашего аккаунта\nОн будет запрашиваться каждый раз,когда вы заходите на сервер\n\n\t{66cc33}Примечания:\n\t- Пароль может состоять из русских и латинских символов\n\t- Пароль чувствителен к регистру\n\t- Длина пароля от 6-ти до 15 символов", "Войти", "Выйти");
return 1;
}
new pass[64];
strmid(pass,inputtext,0,strlen(inputtext),64);
OnPlayerRegister(playerid,pass);
}
else
{
ShowPlayerDialog(playerid,D_REGISTER,DIALOG_STYLE_INPUT, "[Жизнь [В]Деревне] Регистрация", "{ffffff}Добро пожаловать на сервер "ServerName"\n{ffffff}Чтобы начать игру вам необходимо пройти регистрацию\n\nВведите пароль для вашего аккаунта\nОн будет запрашиваться каждый раз,когда вы заходите на сервер\n\n\t{66cc33}Примечания:\n\t- Пароль может состоять из русских и латинских символов\n\t- Пароль чувствителен к регистру\n\t- Длина пароля от 6-ти до 15 символов", "Войти", "Выйти");
}
}
И добавим паблики после OnDialogResponse:
public OnPlayerRegister(playerid, password[])
{
if(IsPlayerConnected(playerid))
{
new string[64];
new playername[MAX_PLAYER_NAME];
GetPlayerName(playerid, playername, sizeof(playername));
format(string,sizeof(string), "%s.ini", playername);
new iniFile = ini_createFile(string);
if(iniFile < 0)
{
iniFile = ini_openFile(string);
}
if(iniFile >= 0)
{
strmid(PlayerInfo[playerid][pPass],password,0,strlen(password),255);
ini_setString(iniFile,"Pass",PlayerInfo[playerid][pPass]);
ini_setInteger(iniFile,"Admin",PlayerInfo[playerid][pAdmin]);
ini_closeFile(iniFile);
ShowPlayerDialog(playerid,D_AUTORIZ,DIALOG_STYLE_INPUT, "[Жизнь [В]Деревне] Авторизация", "{FFFFFF}Добро пожаловать на "ServerName"\n{FFFFFF}Вы зарегестрированы\n\n{FFFFFF}Введите ваш пароль:", "Войти", "");
}
}
return 1;
}
public OnPlayerLogin(playerid,password[])
{
if(IsPlayerConnected(playerid))
{
new string[64];
new pass[64];
new playername[MAX_PLAYER_NAME];
GetPlayerName(playerid, playername, sizeof(playername));
format(string,sizeof(string), "%s.ini", playername);
new iniFile = ini_openFile(string);
ini_getString(iniFile,"Pass",pass,64);
if(strcmp(pass,password,true) == 0)
{
ini_getString(iniFile,"Pass",PlayerInfo[playerid][pPass],64);
ini_getInteger(iniFile,"Admin",PlayerInfo[playerid][pAdmin]);
ini_closeFile(iniFile);
}
else
{
ini_closeFile(iniFile);
ShowPlayerDialog(playerid,D_AUTORIZ,DIALOG_STYLE_INPUT, "[Жизнь [В]Деревне] Авторизация", "{FFFFFF}Добро пожаловать на "ServerName"\n{FFFFFF}Вы зарегестрированы\n\n{FFFFFF}Введите ваш пароль:", "Войти", "");
return 1;
}
SendClientMessage(playerid,0xFF00000,"Добро пожаловать на наш сервер");
SpawnPlayer(playerid);
}
return 1;
}
и сток:
stock SavePlayer(playerid)
{
new string[64];
new playername[MAX_PLAYER_NAME];
GetPlayerName(playerid, playername, sizeof(playername));
format(string, sizeof(string), "%s.ini", playername);
new iniFile = ini_openFile(string);
ini_setString(iniFile,"Pass",PlayerInfo[playerid][pPass]);
ini_setInteger(iniFile,"Admin",PlayerInfo[playerid][pAdmin]);
ini_closeFile(iniFile);
}
6)Ошибки
Какие ошибки могут быть:
1)Не найден "ServerName":
#define ServerName "Жизнь [В]Деревне"//Свое название
2)Нету GN:
В конец мода:
stock GN(p){new pl[MAX_PLAYERS];GetPlayerName(p,pl,sizeof(pl));return pl;}
7)Конец
Если будут ошибки,то пишите!
P.S Второй урок по реги ждите в ближайшую неделю
Удачи!
Последнее редактирование модератором: