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

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

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

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

Andrey_Kiryuhin

Изучающий
Пользователь
Регистрация
11 Ноя 2010
Сообщения
514
Лучшие ответы
0
Репутация
123
Простая регистрация с помощью [dini] !
Недавно начал работать с pawno и в первые же дни столкнулся с проблемой - регистрация игроков на РП сервере. Одни скрипты достаточно кривые, в других слишком много ненужных функций. Пришлось путем курения мануалов писать свой. Функционал практически на нуле но для общего развития, думаю, пойдет

Если у нас нет инклуда dini, то скачаем его (Вложение) и кинем в папку "pawno\include\"

Дальше создадим новый проект, или попытаемся доработать ваш старый.

В начале скрипта добавим инклуд, несколько дефайнов и переменных:
PHP:
#include <a_samp>
#include <dini>

#define COLOR_Y 0xE0EA64AA
#define COLOR_A 0xF97804FF
#define COLOR_ME 0xC2A2DAAA

new pass[MAX_PLAYERS][256];
new skin[MAX_PLAYERS];
new money[MAX_PLAYERS];
new fraction[MAX_PLAYERS];
Дальше идем в паблик OnGameModeInit() и заменяем его содержимое на это:
PHP:
public OnGameModeInit()
{
AddPlayerClass(26,  -1974.1481,137.7335,27.6875,91.5174, 0, 0, 0, 0, 0, 0);//турист
AddPlayerClass(285,  -1974.1481,137.7335,27.6875,91.5174, 0, 0, 0, 0, 0, 0);//мент
return 1;
}
Этим мы добавили пару скинов на выбор. Дальше меняем OnPlayerRequestClass(playerid, classid):
PHP:
public OnPlayerRequestClass(playerid, classid)
{
    switch(fraction[playerid])
    {
    case 0:
    {
    SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.5746);
    SetPlayerCameraPos(playerid,1960.2456, 1342.1572, 16.3746);//+2; -1; 0
    SetPlayerFacingAngle(playerid,220.0);
    }
    case 1:
    {
    SpawnPlayer(playerid);
    SetSpawnInfo(playerid,0,skin[playerid],-1974.1481,137.7335,27.6875,91.5174,0,0,0,0,0,0);
    }
    case 2:
    {
    SpawnPlayer(playerid);
    SetSpawnInfo(playerid,0,skin[playerid],-1627.8296,693.3826,6.9881,177.3655,0,0,0,0,0,0);
    }
    }
    return 1;
}
Здесь мы выбираем где будет стоять чувак при выборе скина. Затем посложнее:
в паблик OnPlayerConnect(playerid) добавляем это:
PHP:
public OnPlayerConnect(playerid)
{
        new fn[256];
        format (fn,256,"%s.ini",PlayerName(playerid));
        if(!dini_Exists(fn))
        {
        dini_Create(fn);
        new s[128];
        format(s,sizeof(s)," Регистрация пользователя.\n\n Имя: %s\n\n Пароль:",PlayerName(playerid));
        ShowPlayerDialog(playerid,0,DIALOG_STYLE_INPUT," Форма регистрации!",s," Зарегать"," Отмена");
        return 1;
        }
        else
        {
        new s[128];
        format(s,sizeof(s)," Привет, %s!\n\n Введи пароль:",PlayerName(playerid));
        ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT," Форма входа!",s," Логин"," Отмена");
        return 1;
        }
}
Здесь мы проверяем зареган ли пользователь путем проверки ini файла с именем пользователя.
Если файла нету то создаем его. Дальше нужно разобрать ответы пользователя: добавляем в паблик OnDialogResponse следующее:
PHP:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    new fn[256];
    format (fn,256,"%s.ini",PlayerName(playerid));

    if(dialogid == 0)
    {
    if(response)
    {
    new str[256];
    format(str, 256, "%s, приветствуем тебя на сервере!", PlayerName(playerid));
    SendClientMessage(playerid, COLOR_Y, str);
    dini_Set(fn,"Pass",inputtext);
    dini_IntSet(fn,"Skin", 26);
    dini_IntSet(fn,"Money",1000);
    dini_IntSet(fn,"Fraction",0);
    new s[128];
    format(s,sizeof(s)," Привет, %s!\n\n Введи пароль:",PlayerName(playerid));
    ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT," Форма входа!",s," Логин"," Отмена");
    }
    else
    {
    SendClientMessage(playerid, COLOR_A, "Этот сервер требует регистрации!");
    SetSpawnInfo(playerid,0,285,-1974.1481,137.7335,27.6875,91.5174,0,0,0,0,0,0);
    SpawnPlayer(playerid);
    Kick(playerid);
    }
    return 1;
    }

    if(dialogid == 1)
    {
    if(response)
    {
    pass[playerid] = dini_Get(fn,"Pass");
    if(strcmp(pass[playerid],inputtext,false,strlen(pass[playerid])) == 0)
    {
    //===================================================спаун!
    money[playerid]=dini_Int(fn,"Money");
    fraction[playerid]=dini_Int(fn,"Fraction");
    skin[playerid]=dini_Int(fn,"Skin");

    new msg[256];

    switch(fraction[playerid])
    {
    case 0:
    {//чел 1й раз на серве, выбор скинов, спаун -вокзал
    format (msg,256," * %s первый раз зашел на сервер =)",PlayerName(playerid));
    SendClientMessage(playerid, COLOR_ME, msg);
    GivePlayerMoney(playerid,money[playerid]);
    }
    case 1:
    {//чел НЕ 1й раз на серве, без выбор скинов (только по F4), спаун -вокзал
    format (msg,256," * %s зашел как Бомж",PlayerName(playerid));
    SendClientMessage(playerid, COLOR_ME, msg);
    SetSpawnInfo(playerid,0,skin[playerid],-1974.1481,137.7335,27.6875,91.5174,0,0,0,0,0,0);
    SpawnPlayer(playerid);
    GivePlayerMoney(playerid,money[playerid]);
    }
    case 2:
    { //чел вообще админ и хз какой раз на серве, без выбора скинов, спаун - СФПД
    format (msg,256," * %s зашел как Админ",PlayerName(playerid));
    SendClientMessage(playerid, COLOR_ME, msg);
    SetSpawnInfo(playerid,0,skin[playerid],-1627.8296,693.3826,6.9881,177.3655,0,0,0,0,0,0);
    SpawnPlayer(playerid);
    SetPlayerColor(playerid,0x0000BBAA);
    GivePlayerMoney(playerid,money[playerid]);
    }
    }
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++!спаун
    }
    else
    {
    SetSpawnInfo(playerid,0,285,-1974.1481,137.7335,27.6875,91.5174,0,0,0,0,0,0);
    SpawnPlayer(playerid);
    SendClientMessage(playerid, COLOR_A, "Пароль набран неверно!");
    Kick(playerid);
    }
    }
    else
    {
    SetSpawnInfo(playerid,0,285,-1974.1481,137.7335,27.6875,91.5174,0,0,0,0,0,0);
    SpawnPlayer(playerid);
    SendClientMessage(playerid, COLOR_A, "Этот сервер требует регистрации!");
    Kick(playerid);
    }
    return 1;
    }

    return 1;
}
Кратко: если пользователь не зареган, регаем его, потом логинимся. Если зареган- просто логинимся. После этого изменим еще 2 паблика: OnPlayerDisconnect и OnPlayerSpawn:
PHP:
public OnPlayerDisconnect(playerid, reason)
{//запись переменых
    new fn[256];
    format(fn,256,"%s.ini",PlayerName(playerid));
    dini_IntSet(fn,"Skin", GetPlayerSkin(playerid));
    dini_IntSet(fn,"Money", GetPlayerMoney(playerid));
    dini_IntSet(fn,"Fraction", fraction[playerid]);
    return 1;
}

public OnPlayerSpawn(playerid)
{/*если чувак первый раз зашел на серв и выбрал скин, после второго захода скин будет выбираться автоматом
 фракция 0-чувак первый раз на сервере
 фракция 1-чувак второй и более раз на сервере
 фракция 2-админ
 */
    new fn[256];
    format (fn,256,"%s.ini",PlayerName(playerid));
    fraction[playerid] = dini_Int(fn,"Fraction");
    if (fraction[playerid] ==0)
    {
    fraction[playerid] =1;
    dini_IntSet(fn,"Fraction", fraction[playerid]);
    }
    return 1;
}
Если игрок отключился, запишем его данные. При спауне идет проверка - предоставить игроку выбор скина или нет. В самом конце мода добавляем строки:
PHP:
stock PlayerName(playerid){
new pname[MAX_PLAYER_NAME];
GetPlayerName(playerid,pname,sizeof(pname));
return pname;}
Они возвращают имя игрока.

По идее всё, можно тыкать F6
Урок от:vadosnn
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу