Привет, Гость!
  • Страница 1 из 1
  • 1
Форум pawno » Pawno » Готовые решения » Простая регистрация с помощью [dini] (Drift)
Простая регистрация с помощью [dini]
BicbaiДата: Четверг, 27.09.2012, 07:03 | Сообщение # 1
Полковник
Группа: Администратор
Сообщений: 288
Статус: Offline
Простая регистрация с помощью [dini] !
Недавно начал работать с pawno и в первые же дни столкнулся с проблемой - регистрация игроков на РП сервере. Одни скрипты достаточно кривые, в других слишком много ненужных функций. Пришлось путем курения мануалов писать свой. Функционал практически на нуле но для общего развития, думаю, пойдет

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

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

В начале скрипта добавим инклуд, несколько дефайнов и переменных:

Code
#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() и заменяем его содержимое на это:

Code
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):

Code
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) добавляем это:

Code
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 следующее:

Code
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:

Code
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;
}

Если игрок отключился, запишем его данные. При спауне идет проверка - предоставить игроку выбор скина или нет. В самом конце мода добавляем строки:

Code
stock PlayerName(playerid){
new pname[MAX_PLAYER_NAME];
GetPlayerName(playerid,pname,sizeof(pname));
return pname;}


Они возвращают имя игрока.
По идее всё, можно тыкать F6
 
Форум pawno » Pawno » Готовые решения » Простая регистрация с помощью [dini] (Drift)
  • Страница 1 из 1
  • 1
Поиск: