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

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

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

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

Система регистрации и банка на mxINI

Статус
В этой теме нельзя размещать новые ответы.

No name

Дебютант
Всем привет, многие новички ломают голову с системой регистрации, сохранением и так далее
Чтобы облегчить вам жизнь выкладываю мануал
Используется файловая система mxINI
в начало мода вставляем:
PHP:
#include <mxINI>
ко всем new добавим
PHP:
new Text:Bankirr[MAX_PLAYERS];//Textdraw for two money
эта переменная будет отвечать за вторые деньги, т.е. за банковские
ко всем define добавляем
PHP:
#define COLOR_BANK 0x80FF80AA//color
#define DIALOG_BANK 12343//dialog
#define DIALOG_BANKPUT 12344//dialog
#define DIALOG_BANKWITH 12345//dialog
#define DIALOG_BBALANCE 12346//dialog
#define COLOR_WHITE 0xFFFFFFAA//color
#define registerdialog 1//dialog
#define logindialog 2//dialog
Здесь у нас все нужные цвета, и диалоги
Ко всем forward добавим
PHP:
forward SaveAccounts();//save player
Ну я думаю вы уже поняли что она отвечает за сохранение аккаунта
Создадим массив в котором будут храниться все нужные для игрока переменные
После new добавим
PHP:
enum pInfo
{
	pMoney,//money
    Kills,//score
	pAdmin,//admin level
	pVip,//vip level
    Deaths,///dead
    Bank//bankmoney
};
new PlayerInfo[MAX_PLAYERS][pInfo];
Идем в OnGameModeInit
добавляем
PHP:
	Create3DTextLabel("Здесь вы можете вызвать меню банка\nВведите /bank", 0x008080FF, 2023.3757324219,1017.5886230469,10.463212013245, 40.0, 0, 0);
	Create3DTextLabel("Здесь вы можете вызвать меню банка\nВведите /bank", 0x008080FF, 2173.9328613281,1402.9155273438,10.705399513245, 40.0, 0, 0);
	Create3DTextLabel("Здесь вы можете вызвать меню банка\nВведите /bank", 0x008080FF, 2173.8796386719,1404.4167480469,10.766201972961, 40.0, 0, 0);
	Create3DTextLabel("Здесь вы можете вызвать меню банка\nВведите /bank", 0x008080FF, 2085.6525878906,2047.5118408203,10.700798988342, 40.0, 0, 0);
	Create3DTextLabel("Здесь вы можете вызвать меню банка\nВведите /bank", 0x008080FF, -281.01922607422,2603.9475097656,62.501052856445, 40.0, 0, 0);
	Create3DTextLabel("Здесь вы можете вызвать меню банка\nВведите /bank", 0x008080FF, 1186.8385,-1382.0344,13.5633, 40.0, 0, 0);
	Create3DTextLabel("Здесь вы можете вызвать меню банка\nВведите /bank", 0x008080FF, 241.2990,-1461.2467,13.6501, 40.0, 0, 0);
	Create3DTextLabel("Здесь вы можете вызвать меню банка\nВведите /bank", 0x008080FF, 1829.9319,-1828.6980,13.5781, 40.0, 0, 0);
	Create3DTextLabel("Здесь вы можете вызвать меню банка\nВведите /bank", 0x008080FF, 2307.8562,-1638.6473,14.8270, 40.0, 0, 0);
Если у вас стоит стример то меняйте функцию на свою
В OnPlayerRequestClass добавим
PHP:
	TextDrawHideForPlayer(playerid, Bankirr[playerid]);
эта строка будет убирать текст с банковскими деньгами при выборе скина
В OnPlayerConnect в самое начало поставим
PHP:
	new PlayerName[MAX_PLAYER_NAME];
	GetPlayerName(playerid,PlayerName,sizeof(PlayerName));
	new account[128];
	format(account,sizeof(account),"%s.ini",PlayerName);
	if(!fexist(account))
	{
		ShowPlayerDialog(playerid,registerdialog,DIALOG_STYLE_INPUT, "Регистрация", "Вы должны зарегистрироваться! \nВведите ваш пароль:", "REGISTER", "");
	}
	else
	{
		ShowPlayerDialog(playerid,logindialog,DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "LOGIN", "");
	}
	
	Bankirr[playerid] = TextDrawCreate(500,99,"_______");//500,99 - координаты размещения текстдрава.
    TextDrawAlignment(Bankirr[playerid],0);//положение
    TextDrawFont(Bankirr[playerid],3);//шрифт
    TextDrawLetterSize(Bankirr[playerid],0.55,2.0);//0.55,2.0 - размеры текстдрава
    TextDrawColor(Bankirr[playerid],0xFFA500AA);//цвет текстдрава - оражневый
    TextDrawSetOutline(Bankirr[playerid],2);
    TextDrawSetShadow(Bankirr[playerid],1);
сдесь у нас создается текст и высвечивается при конекте диалог с регистрацией
В OnPlayerDisconnect добавим
PHP:
	SaveAccount(playerid);//save player
	TextDrawDestroy(Bankirr[playerid]);//destroy text bank
Как вы догадались это созраняет аккаунт и удаляет текстдрав у отключившегося игрока
В OnPlayerSpawn
PHP:
	TextDrawShowForPlayer(playerid, Bankirr[playerid]);
Это высветит текст при спавне
в OnPlayerDeath
PHP:
	PlayerInfo[killerid][Kills]++;//+score
	PlayerInfo[playerid][Deaths]++;//+dead
Здесь мы добавляем +1 очко для убившего и добавляем +1 смерть для убитого
Теперь добавим 2 команды
в OnPlayerCommandText добавляем
PHP:
  	if(strcmp(cmd, "/sberbank", true) == 0)
  	{
		if(GetPlayerMoney(playerid)<500)
		{
			return SendClientMessage(playerid,COLOR_WHITE,"У вас нету 500 рублей! Вы не можете оплатить использование услуги Сбербанк OnLine");
		}
		GivePlayerMoney(playerid,-500);
		ShowBankMenuDialog(playerid);
		return 1;
	}
	if(strcmp(cmd, "/bank", true) == 0)
	{
	    if(IsPlayerInRangeOfPoint(2, playerid,2023.3757324219,1017.5886230469,10.463212013245) || IsPlayerInRangeOfPoint(2, playerid,2173.9328613281,1402.9155273438,10.705399513245)
	    || IsPlayerInRangeOfPoint(2, playerid,2173.8796386719,1404.4167480469,10.766201972961) || IsPlayerInRangeOfPoint(2, playerid,2085.6525878906,2047.5118408203,10.700798988342)
	    || IsPlayerInRangeOfPoint(2, playerid,-281.01922607422,2603.9475097656,62.501052856445) || IsPlayerInRangeOfPoint(2, playerid,1186.8385,-1382.0344,13.5633)
		|| IsPlayerInRangeOfPoint(2, playerid,241.2990,-1461.2467,13.6501) || IsPlayerInRangeOfPoint(2, playerid,1829.9319,-1828.6980,13.5781)
		|| IsPlayerInRangeOfPoint(2, playerid,2307.8562,-1638.6473,14.8270))
	    {
	    	ShowBankMenuDialog(playerid);
		}
		return 1;
	}
Если будет ругаться
PHP:
undefined symbol "cmd"
то в начало этого паблика добавьте
PHP:
new cmd[256];
Далее в OnPlayerKeyStateChange добавим
PHP:
    if(newkeys == KEY_WALK)//bank
    {
	    if(IsPlayerConnected(playerid))
	    {
		    if(IsPlayerInRangeOfPoint(2, playerid,2023.3757324219,1017.5886230469,10.463212013245) || IsPlayerInRangeOfPoint(2, playerid,2173.9328613281,1402.9155273438,10.705399513245)
		    || IsPlayerInRangeOfPoint(2, playerid,2173.8796386719,1404.4167480469,10.766201972961) || IsPlayerInRangeOfPoint(2, playerid,2085.6525878906,2047.5118408203,10.700798988342)
		    || IsPlayerInRangeOfPoint(2, playerid,-281.01922607422,2603.9475097656,62.501052856445) || IsPlayerInRangeOfPoint(2, playerid,1186.8385,-1382.0344,13.5633)
			|| IsPlayerInRangeOfPoint(2, playerid,241.2990,-1461.2467,13.6501) || IsPlayerInRangeOfPoint(2, playerid,1829.9319,-1828.6980,13.5781)
			|| IsPlayerInRangeOfPoint(2, playerid,2307.8562,-1638.6473,14.8270))
		    {
		    	ShowBankMenuDialog(playerid);
			}
		}
	}
Т.е. если вы будете стоять на 3d тексте в любой из этих координат и нажмете на альт то у вас высветится диалог с банком
В OnPlayerUpdate добавим обновление денег
PHP:
	new bank[20];
	format(bank, sizeof(bank), "$%08d", PlayerInfo[playerid][Bank]);
    TextDrawSetString(Bankirr[playerid], bank);
Дальше идем в OnDialogResponce
И туда добавляем все диалоги используемые регистрацией/банком
PHP:
	/*[Register & Login]*/
	if(dialogid == registerdialog)
	{
		if(!strlen(inputtext)) return ShowPlayerDialog(playerid, registerdialog, DIALOG_STYLE_INPUT, "Регистрация", "Вы должны зарегистрироваться! \nВведите ваш пароль:", "Ок", "");
		if(response)
		{
			new PlayerName[MAX_PLAYER_NAME];
			GetPlayerName(playerid,PlayerName,sizeof(PlayerName));
			new account[128];
			format(account,sizeof(account),"%s.ini",PlayerName);
			if(fexist(account)) return ShowPlayerDialog(playerid,logindialog,DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "LOGIN", "");
			new iniFile = ini_createFile(account);
			if(iniFile < 0) ini_openFile (account);
			{
				ini_setString(iniFile,"Пароль",inputtext);
				ini_setInteger(iniFile, "Money", 0);
				ini_setInteger(iniFile, "Admin", 0);
				ini_setInteger(iniFile, "Vip", 0);
				ini_setInteger(iniFile, "Score", 0);
				ini_setInteger(iniFile, "Deaths", 0);
				ini_setInteger(iniFile,"BankM",0);
				ini_closeFile(iniFile);
				SetPVarInt(playerid, "Logged", 0);
				ShowPlayerDialog(playerid,logindialog,DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "LOGIN", "");
			}
		}
		else
		{
			ShowPlayerDialog(playerid, registerdialog, DIALOG_STYLE_INPUT, "Регистрация", "Вы должны зарегистрироваться! \nВведите ваш пароль:", "Ок", "");
		}
	}
	if(dialogid == logindialog)
	{
		if(!strlen(inputtext)) return ShowPlayerDialog(playerid,logindialog,DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "LOGIN", "");
		if(response)
		{
			new PlayerName[MAX_PLAYER_NAME], password[64];
			GetPlayerName(playerid,PlayerName,sizeof(PlayerName));
			new account[128];
			format(account,sizeof(account),"%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", PlayerInfo[playerid][pMoney]);
				GivePlayerMoney(playerid, PlayerInfo[playerid][pMoney]);
				ini_getInteger(iniFile, "Score", PlayerInfo[playerid][Kills]);
				SetPlayerScore(playerid, PlayerInfo[playerid][Kills]);
				ini_getInteger(iniFile, "Deaths", PlayerInfo[playerid][Deaths]);
				ini_getInteger(iniFile, "Admin", PlayerInfo[playerid][pAdmin]);
				ini_getInteger(iniFile, "Vip", PlayerInfo[playerid][pVip]);
				ini_getInteger(iniFile, "BankM",PlayerInfo[playerid][Bank]);
				ini_closeFile(iniFile);
				return 1;
			}
			else
			{
				SendClientMessage(playerid, COLOR_WHITE, "Cервер: Неверный пароль! Повторите попытку!");
				ShowPlayerDialog(playerid, logindialog, DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "Ок", "");
				return 1;
			}
		}
		else
		{
			ShowPlayerDialog(playerid, logindialog, DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "Ок", "");
		}
	}
    if(dialogid == DIALOG_BANK)
	{
		if(response)
		{
			if(listitem == 0)
			{
				ShowPutInBankDialog(playerid);
			}
			if(listitem == 1)
			{
				ShowWithdrawBankDialog(playerid);
			}
			if(listitem == 2)
			{
				new string[256];
        		format(string, sizeof(string), "Ваш счет состовляет $%d", PlayerInfo[playerid][Bank]);
	    		ShowPlayerDialog(playerid, DIALOG_BBALANCE, DIALOG_STYLE_MSGBOX, "Баланс в банке", string, "ОК", "Назад");
			}
		}
		return 1;
	}
	if(dialogid == DIALOG_BANKPUT)
    {
        if(!response) return ShowBankMenuDialog(playerid);
        for (new i; i < strlen(inputtext); i++)
        {
        if (inputtext[i] >= '0' && inputtext[i] <= '9')
        {
        return PutInBank(playerid,inputtext);
        }
        else
        {
        ShowBankMenuDialog(playerid);
        return SendClientMessage(playerid, COLOR_WHITE,"' Вводите только цифры '");
		}
		}
        return 1;
    }
    if(dialogid == DIALOG_BANKWITH)
    {
        if(!response) return ShowBankMenuDialog(playerid);
        for (new i; i < strlen(inputtext); i++)
        {
        if (inputtext[i] >= '0' && inputtext[i] <= '9')
        {
        return Withdrawoutofbank(playerid, inputtext);
        }
        else
        {
        ShowBankMenuDialog(playerid);
        return SendClientMessage(playerid, COLOR_WHITE,"' Вводите только цифры '");
		}
		}
        return 1;
    }
    if(dialogid == DIALOG_BBALANCE)
    {
        if(!response) return ShowBankMenuDialog(playerid);
        return 1;
    }
И теперь в самый конец мода поставим
PHP:
stock ShowBankMenuDialog(playerid)
{
	return ShowPlayerDialog(playerid,DIALOG_BANK,DIALOG_STYLE_LIST,"Сбербанк Online","{10F441}Положить на счет\n{10F441}Снять со счета\n{10F441}Узнать свой баланс","Выбрать","Выход");
}
stock ShowPutInBankDialog(playerid)
{
   	return ShowPlayerDialog(playerid, DIALOG_BANKPUT, DIALOG_STYLE_INPUT, "Положить деньги в Сбербанк", "Введите в поле ниже сумму которую\nхотите положить к себе на счет", "Положить", "Назад");
}

stock ShowWithdrawBankDialog(playerid)
{
	return ShowPlayerDialog(playerid, DIALOG_BANKWITH, DIALOG_STYLE_INPUT, "Снять деньги со счета", "Введите в поле ниже сумму которую\nхотите снять со своего счета", "Снять", "Назад");
}

stock PutInBank(playerid,money[])
{
	new moneys,string[256];
 	if(!strlen(money))
 	{
 	ShowPutInBankDialog(playerid);
 	return 1;
	}
 	moneys = strval(money);
  	if(moneys < 1)
  	{
 	SendClientMessage(playerid, COLOR_BANK, "Ты столько не закинеш");
 	return ShowPutInBankDialog(playerid);
   	}
    if(GetPlayerMoney(playerid) < moneys)
	{
	return SendClientMessage(playerid,COLOR_WHITE,"Денег нет");
   	}
 	GivePlayerMoney(playerid, 0-moneys);
 	PlayerInfo[playerid][Bank]+=moneys;
 	format(string, sizeof(string), "Вы положили $%d на свой счет. У вас на счету $%d.", moneys, PlayerInfo[playerid][Bank]);
 	SendClientMessage(playerid, COLOR_BANK, string);
 	return 1;
}
stock Withdrawoutofbank(playerid,money[])
{
	new moneys,string[256];
 	if(!strlen(money))
 	{
	ShowWithdrawBankDialog(playerid);
	return 1;
    }
    moneys = strval(money);

	if(moneys < 1)
	{
	SendClientMessage(playerid, COLOR_BANK, "Ты столько не снимиш");
	return ShowWithdrawBankDialog(playerid);
  	}
  	else
  	{
	if(moneys > PlayerInfo[playerid][Bank])
	moneys = PlayerInfo[playerid][Bank];
	}
	GivePlayerMoney(playerid, moneys);
	PlayerInfo[playerid][Bank] -= moneys;
	format(string, sizeof(string), "Вы сняли $%d с своего счета. У вас на счету осталось $%d", moneys, PlayerInfo[playerid][Bank]);
	SendClientMessage(playerid, COLOR_BANK, string);
    return 1;
}
public SaveAccounts()
{
	for(new f; f < GetMaxPlayers(); f++)
	{
		if(!IsPlayerConnected(f))continue;
		SaveAccount(f);
	}
}

stock SaveAccount(playerid)
{
	new PlayerName[MAX_PLAYER_NAME], account[128];
	GetPlayerName(playerid,PlayerName,sizeof(PlayerName));
	format(account,sizeof(account), "%s.ini", PlayerName);
	new iniFile = ini_openFile(account);
	ini_setInteger(iniFile, "Money", GetPlayerMoney(playerid));
	ini_setInteger(iniFile, "Score", GetPlayerScore(playerid));
	ini_setInteger(iniFile,"Admin",PlayerInfo[playerid][pAdmin]);
	ini_setInteger(iniFile,"Deaths",PlayerInfo[playerid][Deaths]);
	ini_setInteger(iniFile,"Vip",PlayerInfo[playerid][pVip]);
	ini_setInteger(iniFile,"BankM",PlayerInfo[playerid][Bank]);
	ini_closeFile(iniFile);
	return 1;
}
Здесь все то, без чего ничего работать не будет, а именно диалоги и функции банка и сохранение аккаунтов

Все на этом урок закончен
Все вопросы и коментария пишите)

By Seregamil(это я и есть)
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу