Дата: Четверг, 27.09.2012, 07:03 | Сообщение # 1
|
Простая регистрация с помощью [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
|
| |