Форум Pawn.Wiki - Воплоти мечту в реальность!: Простая Регистрация В Диалоговых Окнах - Mxini - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

  • (6 Страниц) +
  • 1
  • 2
  • 3
  • Последняя »
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Scr ][ All ]
Простая Регистрация В Диалоговых Окнах - Mxini
Оценка: ***-- 2 Голосов

#1
Пользователь офлайн   h4pok 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию
Делаю сервер. Столкнулся с регистрацией, но уроки регистрации через mxINI не много не понятные (лично для меня были), а регистрация через Dini - медленная.
Так вот. Также я смотрю, что народу больше нравиться регаться через диалоги, чем через чат. Ну вот я и сделал.

Судя по постам, я понял, что не у всех есть инклуды, так что, вот, держите:
include mxINI
include md5
Скачали?! Ну тогда разберемся куда его кинуть, что бы все заработало.
1. Разархивируйте файл
2. Перенесите скачанные инклюды в папку с вашим сервером, разархивируйте. Перекидывать сюда:
Папка с сервером/Pawno/include

3. Все, теперь вы можете пользоваться скачанными инклюдами.

Приступим:
В начало вставляем include:
#include <mxINI>
#include <md5>

А во все форварды:
forward SaveAccounts();

Ко всем дефайнам поставим это:
#define COLOR_SYSTEM 0xFF0000AA


Создаем переменные для записи денег и жизни в файл:
enum pInfo {
    pMoney, // Сохраняет кол-во денег.
    Float:pHeal, // Сохраняет кол-во жизней.
};

И под enum'ом вставляем:
new Player[MAX_PLAYERS][pInfo];


Создаем диалоговые окна:
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'ом.

Теперь задаем действия для диалогов:
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? Так вот, теперь создаем под этот форвард паблик.
public SaveAccounts()
{
    for(new f; f < GetMaxPlayers(); f++)
    {
        if(!IsPlayerConnected(f))continue;
        SaveAccount(f);
    }
}

Ну а дальше создаем stock для сейва аккаунтов.
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'а это:
if(GetPVarInt(playerid, "Logged") != 1) return 0; 


P.S.
Насколько я знаю, чтобы mxINI сохранял акки
users/%s.ini

нужно сначала создать папку users(или любую другую и тогда заменить в павно "users" на вашу) в scriptfiles.

P.S.S.
Так же я заметил, что не все понимают куда пихать. Что бы они не обижались, я отвечаю: Регистрацию пихаем в мод.

Изменено:
02.06.2011 - игрок не респнется, пока не введет пароль от акка (добавил)
04.06.2011 - пароли в файлах шифруются (заменил) + инклюд для шифровки пароля (добавил)
07.06.2011 - шифровка через MD5 (удалено)
03.07.2011 - Простая проверка на обход регистрации (добавил).
04.07.2011 - Устранена проблема с обходом реги. Просьба заменить всех старые реги на новый код выше из паблика OnDialogResponse. (заменил)
11.07.2011 - Дописана регистрация в new.pwn и выложена на rghost.ru (добавил).
8

#2
Пользователь офлайн   Romzes 

  • ( ^_^ )
  • Вставить ник
  • Раскрыть информацию
Тема перенесена как соответствует разделу Готовые решения
0

#3
Пользователь офлайн   TorreTo 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию
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,1,DIALOG_STYLE_INPUT, "Регистрация", "Вы должны зарегистрироваться! \nВведите ваш пароль:", "REGISTER", ""); //...Показываем игроку диалог реги
    }
        else
    {
        ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "LOGIN", ""); //если он есть, то авторизуем его
    }
}
	return 1;
}

(89) : error 010: invalid function or declaration

что делать?
0

#4
Пользователь офлайн   Romzes 

  • ( ^_^ )
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияTorreTo (13 октября 2011 - 20:22) писал:

...


Попробуй удалить } сразу над return 1;
0

#5
Пользователь офлайн   Emka 

  • Прохожий
  • Вставить ник
  • Раскрыть информацию
Кто-нибудь может скинуть a_samp.inc вместе с SetPVarInt?
Либо объясните мне, пожалуйста, SetPVarInt для чего это, что это делает и как можно заменить, ибо ловлю варн (number of arguments does not match definition).

Сообщение отредактировал Emka: 16 декабря 2011 - 21:53

0

#6
Пользователь офлайн   Erick 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
a_samp.inc


Может стоит сначало почитать, как пользоваться pawno, а потом приступать к регистрации? :blink:
1

#7
Пользователь офлайн   DragoSFire 

  • Знаток
  • Вставить ник
  • Раскрыть информацию
Emka, мда....это стандартный инклюд без него хер че сделаешь
0

#8
Пользователь офлайн   Apple007 

  • Новичок
  • Вставить ник
  • Раскрыть информацию
E:\???? ? 0\gamemodes\dm.pwn(251) : error 017: undefined symbol "Player"
E:\???? ? 0\gamemodes\dm.pwn(251) : warning 215: expression has no effect
E:\???? ? 0\gamemodes\dm.pwn(251) : error 001: expected token: ";", but found "]"
E:\???? ? 0\gamemodes\dm.pwn(251) : error 029: invalid expression, assumed zero
E:\???? ? 0\gamemodes\dm.pwn(251) : fatal error 107: too many error messages on one line


чё за?
0

#9
Пользователь офлайн   Harp 

  • Прохожий
  • Вставить ник
  • Раскрыть информацию
del

Сообщение отредактировал Harp: 28 мая 2012 - 16:58

0

#10
Пользователь офлайн   Djon_VeNDeTTa 

  • Прохожий
  • Вставить ник
  • Раскрыть информацию
C:\Documents and Settings\User\Рабочий стол\Godfather_server\gamemodes\GF.pwn(124) : error 017: undefined symbol "ShowPlayerDialog"
C:\Documents and Settings\User\Рабочий стол\Godfather_server\gamemodes\GF.pwn(124) : error 029: invalid expression, assumed zero
C:\Documents and Settings\User\Рабочий стол\Godfather_server\gamemodes\GF.pwn(124) : error 029: invalid expression, assumed zero
C:\Documents and Settings\User\Рабочий стол\Godfather_server\gamemodes\GF.pwn(124) : fatal error 107: too many error messages on one line

Compilation aborted.Pawn compiler 3.2.3664 Copyright © 1997-2006, ITB CompuPhase


4 Errors.
Ошибки!!!!
0

Поделиться темой:


  • (6 Страниц) +
  • 1
  • 2
  • 3
  • Последняя »
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика