|
Форум Программирование в Pawno Готовые решения Простая регистрация с помощью [dini] |
Простая регистрация с помощью [dini] |
Если у нас нет инклуда dini, то скачаем его и кинем в папку "pawno\include\"
Дальше создадим новый проект, или попытаемся доработать ваш старый. В начале скрипта добавим инклуд, несколько дефайнов и переменных: Код #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() и заменяем его содержимое на это: Код 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): Код 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) добавляем это: Код 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 следующее: Код 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: Код 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; } Если игрок отключился, запишем его данные. При спауне идет проверка - предоставить игроку выбор скина или нет. В самом конце мода добавляем строки: Код stock PlayerName(playerid){ new pname[MAX_PLAYER_NAME]; GetPlayerName(playerid,pname,sizeof(pname)); return pname;} Они возвращают имя игрока. По идее всё, можно тыкать F6 Автор: Неизвестен Программист любитель :) |
| |||
| |||