Доступ к архиву

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Простая Регистрация В Диалоговых Окнах - Mxini

Статус
В этой теме нельзя размещать новые ответы.

onix96

Ученик
Приступим:
В начало вставляем include:
PHP:
#include <mxINI>
#include <md5>
А во все форварды:
PHP:
forward SaveAccounts();
Ко всем дефайнам поставим это:
PHP:
#define COLOR_SYSTEM 0xFF0000AA
Создаем переменные для записи денег и жизни в файл:
PHP:
enum pInfo {
    pMoney, // Сохраняет кол-во денег.
    Float:pHeal, // Сохраняет кол-во жизней.
};
И под enum'ом вставляем:
PHP:
new Player[MAX_PLAYERS][pInfo];
Создаем диалоговые окна:
PHP:
public OnPlayerConnect(playerid)
{
    new PlayerName[MAX_PLAYER_NAME]; 
    GetPlayerName(playerid,PlayerName,sizeof(PlayerName)); //узнаем ник игрока
    new account[128];
    format(account,sizeof(account),"users/%s.ini",PlayerName); //создаем акк
    if(!fexist(account)) //если акка не существует, то...
    {
        ShowPlayerDialog(playerid,id вашего диалога,DIALOG_STYLE_INPUT, "Регистрация", "Вы должны зарегистрироваться! \nВведите ваш пароль:", "REGISTER", ""); //...Показываем игроку диалог реги
    }
        else
    {
        ShowPlayerDialog(playerid,id вашего диалога,DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "LOGIN", ""); //если он есть, то авторизуем его
    }
}
id вашего диалога может быть любой, главное, чтобы не встречались два разных диалога с одним id'ом.

Теперь задаем действия для диалогов:
PHP:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
//=========================== Регистрция ===========================
        if(dialogid == 1) //Регистрация
        {
                if(!strlen(inputtext)) return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация", "Вы должны зарегистрироваться! \nВведите ваш пароль:", "Ок", "");
                if(response) //проверка на кнопку "ОК" и на нажатие Enter'а
                {
                        new PlayerName[MAX_PLAYER_NAME];
                        GetPlayerName(playerid,PlayerName,sizeof(PlayerName)); //узнаем ник
                        new account[128];
                        format(account,sizeof(account),"users/%s.ini",PlayerName);//ищем акк
                        if(fexist(account)) return ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "LOGIN", ""); //если акк уже существует, то логиним игрока
                        new iniFile = ini_createFile(account); //создаем акк
                        if(iniFile < 0) ini_openFile (account); //если файл пустой, то...
                        {
                                ini_setString(iniFile,"Пароль",inputtext); //запишем пароль и закодируем его
                                ini_setInteger(iniFile, "Money", 5000); // Запишем кол-во денег в файл.
                                ini_setFloat(iniFile, "Heal", 50.0); // Запишем кол-во жизней в файл.
                                ini_closeFile(iniFile); //закроем файл
                                SetPVarInt(playerid, "Logged", 0); //создаем переменную авторизации
                                ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "LOGIN", ""); //теперь после регистрации, мы дадим игроку залогиниться
                        }
                }
                else //Проверка на вторую кнопку, но ее то мы не указали. Но если нажать Esc, то мы не регаемся. Так что мы ставим проверку на нажатие Esc'ейпа
                {
                        ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация", "Вы должны зарегистрироваться! \nВведите ваш пароль:", "Ок", "");
                }
    }
    if(dialogid == 2)
    {
        if(!strlen(inputtext)) return ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "LOGIN", ""); //если игрок не введет пароль, то игрок мог обойти регу. Но с этой проверкой это исключается
        if(response) // проверка на кнопку "ОК" и Enter
        {
            new PlayerName[MAX_PLAYER_NAME], password[64];
            GetPlayerName(playerid,PlayerName,sizeof(PlayerName));
            new account[128];
            format(account,sizeof(account),"users/%s.ini",PlayerName);
            if(IsPlayerNPC(playerid))return 1;
            new iniFile = ini_openFile(account);
            ini_getString(iniFile, "Пароль",password); // Узнаём пароль аккаунта.
            if(!strcmp(inputtext, password, true))
            {
                ini_getInteger(iniFile, "Money", Player[playerid][pMoney]); // Запишем кол-во денег в переменную.
                ini_getFloat(iniFile, "Heal", Player[playerid][pHeal]); // Запишем кол-во жизней в переменную.
                SetPlayerHealth(playerid, Player[playerid][pHeal]);
                GivePlayerMoney(playerid, Player[playerid][pMoney]);
                ini_closeFile(iniFile);
                OnPlayerSpawn(playerid);
                return 1;
            }
            else
            {
                SendClientMessage(playerid, COLOR_SYSTEM, "System: Неверный пароль!");
                ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "Ок", "");
                return 1;
            }
        }
        else //Если нажать Esc, то...
        {
            ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "Ок", ""); // не даем игроку обойти авторизацию и показываем ему снова окно авторизации
        }
    }
    return 0;
}
Так, а если сервер полетел? Там же ничего не сохранится!
Не не не, все нормально. Помните форвард SaveAccounts? Так вот, теперь создаем под этот форвард паблик.
PHP:
public SaveAccounts()
{
    for(new f; f < GetMaxPlayers(); f++)
    {
        if(!IsPlayerConnected(f))continue;
        SaveAccount(f);
    }
}
Ну а дальше создаем stock для сейва аккаунтов.
PHP:
stock SaveAccount(playerid)
{
    new PlayerName[MAX_PLAYER_NAME], account[128];
    GetPlayerName(playerid,PlayerName,sizeof(PlayerName));
    format(account,sizeof(account), "users/%s.ini", PlayerName);
    new iniFile = ini_openFile(account);
    ini_setInteger(iniFile, "Money", GetPlayerMoney(playerid));
    ini_closeFile(iniFile);
    return 1;
}
Вот и все, теперь игрок может зарегаться и залогиниться без проблем (по крайней мере, у меня без проблем)D:

Прим.: Что бы игрок не рспался пока не введет пароль ставим в паблик Spawn'а это:
PHP:
if(GetPVarInt(playerid, "Logged") != 1) return 0;


---------- Post added at 13:48 ---------- Previous post was at 13:45 ----------

Ставим спасибки и + сики.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу