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

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

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

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

Создание склада через диалоги

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

PI

The world on the edge of reality
1. Для системы склада, или как по другому его называют "тайник", нам потребуется добавить несколько #define в самое начало мода (Они служат для диалогов):

PHP:
#define DIALOG_TSAVE 1000
#define DIALOG_TINFO 1001
#define DIALOG_TINPUT 1002
#define DIALOG_TOUTPUT 1003
#define DIALOG_TINMATS 1004
#define DIALOG_TINDRUGS 1005
#define DIALOG_TOUTMATS 1006
#define DIALOG_TOUTDRUGS 1007
Названия могут быть свои, цифры от названий обозначают ID диалогов. Взял у себя такие большие, ибо писал всё это в скачанный мод и незнаю какие там ID диалогов.

2. Далее добавляем Пикап в OnGameModeInit:

PHP:
AddStaticPickup(1239,23,121.9291,-294.3183,1.5781,0); // 1239 - Модель пикапа, 23 - тип пикапа, 121.9291,-294.3183,1.5781 - координаты пикапа, 0 - виртуальны мир.
3. Далее создаём саму команду для вызова диалога склада:

PHP:
if(strcmp(cmd, "/tsave", true) == 0)  //Сама команда, название можете указать своё, но вызов диалога будет осуществляться нажатием клавиши 'ALT'
{
    if(IsPlayerConnected(playerid)) 
    {
        if(IsPlayerInRangeOfPoint(playerid, 5.0, 121.9291,-294.3183,1.5781)) //Проверка на Координаты игрока (Можете указать те же, которые были указаны в координатах пикапа
        {
            ShowPlayerDialog(playerid,DIALOG_TSAVE,DIALOG_STYLE_LIST,"Выберите функцию из списка (Хранилище):","* Информация\n* Положить вещи в хранилище\n* Достать вещи из хранилища","ACCEPT","CANCEL"); //Сам диалог. DIALOG_TSAVE - ID диалога, который мы указали в #define, DIALOG_STYLE_LIST - Стиль (Тип) диалога. Далее идёт само меню
        } 
    } 
    return 1; 
}
4. Далее идём в OnPlayerKeyStateChange, чтобы сделать вызов диалога на клавишу 'ALT':

PHP:
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
	if (newkeys == 1024) //ID Клавиши
	{
		OnPlayerCommandText(playerid,"/tsave"); //Какая команда будет вызываться при нажатии на клавишу
	}
        return 1;
}
5. Итак, создаём сами диалоги в OnDialogResponse:

PHP:
if(dialogid == DIALOG_TSAVE) //ID диалога из #define
{
    if(response)
    {
        if(listitem == 0)
	{
	    new dptMats = PlayerInfo[playerid][ptMats]; //Объявляем новые переменны для ptMats и ptDrugs (Их можно и не добавлять)
            new dptDrugs = PlayerInfo[playerid][ptDrugs];
	    format(string,sizeof(string),"Количество Материалов на Складе: %d\n\nКоличество Наркотиков на Складе: %d", dptMats,dptDrugs);
	    ShowPlayerDialog(playerid,DIALOG_TINFO,DIALOG_STYLE_MSGBOX,"Информация о Складе",string,"ACCEPT","");
	}
	if(listitem == 1)
	{
	    ShowPlayerDialog(playerid,DIALOG_TINPUT,DIALOG_STYLE_INPUT,"Положить вещи в Склад","Введите наименование вещи (Наркотики/Материалы)","DONE","BACK");
	}
        if(listitem == 2)
	{
                ShowPlayerDialog(playerid,DIALOG_TOUTPUT,DIALOG_STYLE_INPUT,"Взять вещи из Склада","Введите наименование вещи (Наркотики/Материалы)","DONE","BACK");
	}
    }
}
PHP:
DIALOG_TINPUT, DIALOG_TOUTPUT и т.д. в дальнейшем будут браться из #define, которые мы указали в самом начале
Далее:

PHP:
	if(dialogid == DIALOG_TINPUT)
	{
	    if(response)
		{
            if(!strlen(inputtext)) //Если ничего не введено, то...
			{
			    ShowPlayerDialog(playerid,DIALOG_TINPUT,DIALOG_STYLE_INPUT,"Положить вещи в Склад","Введите наименование вещи (Наркотики/Материалы)","DONE","BACK");
			}
            else if(!strcmp(inputtext, "Материалы", true)) //Если введено Материалы, то...
			{
                ShowPlayerDialog(playerid,DIALOG_TINMATS,DIALOG_STYLE_INPUT,"Положить Материалы на Склад","Введите кол-во материалов, которое вы хотите положить на склад","ACCEPT","BACK");
			}
			else if(!strcmp(inputtext, "Наркотики", true))//Если введено Наркотики, то...
			{
                ShowPlayerDialog(playerid,DIALOG_TINDRUGS,DIALOG_STYLE_INPUT,"Положить Наркотики на Склад","Введите кол-во наркотиков, которое вы хотите положить на склад","ACCEPT","BACK");
			}
            else //Если введена какая-то чушь, то....
            {
                ShowPlayerDialog(playerid,DIALOG_TINPUT,DIALOG_STYLE_INPUT,"Положить вещи в Склад","Введите наименование вещи (Наркотики/Материалы)","DONE","BACK");
			}
		}
		else ShowPlayerDialog(playerid,DIALOG_TSAVE,DIALOG_STYLE_LIST,"Выберите функцию из списка (Хранилище):","* Информация\n* Положить вещи в хранилище\n* Достать вещи из хранилища","ACCEPT","CANCEL");
	}
	if(dialogid == DIALOG_TOUTPUT)
	{
	    if(response)
		{
            if(!strlen(inputtext))
			{
			    ShowPlayerDialog(playerid,DIALOG_TOUTPUT,DIALOG_STYLE_INPUT,"Взять вещи из Склада","Введите наименование вещи (Наркотики/Материалы)","DONE","BACK");
			}
            else if(!strcmp(inputtext, "Материалы", true))
			{
                ShowPlayerDialog(playerid,DIALOG_TOUTMATS,DIALOG_STYLE_INPUT,"Взять Материалы со Склада","Введите кол-во материалов, которое вы хотите взять со склада","ACCEPT","BACK");
			}
			else if(!strcmp(inputtext, "Наркотики", true))
			{
                ShowPlayerDialog(playerid,DIALOG_TOUTDRUGS,DIALOG_STYLE_INPUT,"Взять Наркотики со Склада","Введите кол-во наркотиков, которое вы хотите взять на склада","ACCEPT","BACK");
			}
			else
			{
			    ShowPlayerDialog(playerid,DIALOG_TOUTPUT,DIALOG_STYLE_INPUT,"Взять вещи из Склада","Введите наименование вещи (Наркотики/Материалы)","DONE","BACK");
            }
		}
		else ShowPlayerDialog(playerid,DIALOG_TSAVE,DIALOG_STYLE_LIST,"Выберите функцию из списка (Хранилище):","* Информация\n* Положить вещи в хранилище\n* Достать вещи из хранилища","ACCEPT","CANCEL");
	}
Тут думаю всё понятно, идём далее:

PHP:
	if(dialogid == DIALOG_TINMATS)
	{
	    if(response)
		{
            if(!strlen(inputtext))
			{
                ShowPlayerDialog(playerid,DIALOG_TINMATS,DIALOG_STYLE_INPUT,"Положить Материалы на Склад","Введите кол-во материалов, которое вы хотите положить на склад","ACCEPT","BACK");
	        }
	        new input = strval(inputtext); //Объявляем переменной input введённый текст
			if(input > PlayerInfo[playerid][pMats] || input < 1) //Если введённый текст больше реального кол-во материалов у персонажа, то будет писать об ошибке
			{
                ShowPlayerDialog(playerid,DIALOG_TINMATS,DIALOG_STYLE_INPUT,"Положить Материалы на Склад","У вас нету столько Материалов. Повторите попытку","ACCEPT","");
            }
			else
			{
                PlayerInfo[playerid][pMats] -= input; //Отнимаем наркотики
                PlayerInfo[playerid][ptMats] += input; //Добавляем их на склад
                format(string,sizeof(string),"* Вы успешно положили %d материалов на склад. Всего материалов: %d", input,PlayerInfo[playerid][ptMats]);
                SendClientMessage(playerid,COLOR_WHITE, string); //Сообщение об успешной опреции
			}
		}
		else ShowPlayerDialog(playerid,DIALOG_TINPUT,DIALOG_STYLE_INPUT,"Положить вещи в Склад","Введите наименование вещи (Наркотики/Материалы)","DONE","BACK");
	}
Аналогично и с наркотиками

PHP:
	if(dialogid == DIALOG_TINDRUGS)
	{
	    if(response)
		{
            if(!strlen(inputtext))
            {
                ShowPlayerDialog(playerid,DIALOG_TINDRUGS,DIALOG_STYLE_INPUT,"Положить Наркотики на Склад","Введите кол-во наркотиков, которое вы хотите положить на склад","ACCEPT","BACK");
	        }
	        new input = strval(inputtext);
			if(input > PlayerInfo[playerid][pDrugs] || input < 1) 
			{
                ShowPlayerDialog(playerid,DIALOG_TINDRUGS,DIALOG_STYLE_INPUT,"Положить Наркотики на Склад","У вас нету столько Наркотиков. Повторите попытку","ACCEPT","");
            }
            else
			{
                PlayerInfo[playerid][pDrugs] -= input;
                PlayerInfo[playerid][ptDrugs] += input;
                format(string,sizeof(string),"* Вы успешно положили %d наркотиков на склад. Всего наркотиков: %d", input,PlayerInfo[playerid][ptDrugs]);
                SendClientMessage(playerid,COLOR_WHITE, string);
			}
		}
		else ShowPlayerDialog(playerid,DIALOG_TINPUT,DIALOG_STYLE_INPUT,"Положить вещи в Склад","Введите наименование вещи (Наркотики/Материалы)","DONE","BACK");
	}
Далее, диалоги, чтобы взять со склада:

PHP:
	if(dialogid == DIALOG_TOUTMATS)
	{
	    if(response)
		{
            if(!strlen(inputtext))
			{
                ShowPlayerDialog(playerid,DIALOG_TOUTMATS,DIALOG_STYLE_INPUT,"Взять Материалы со Склада","Введите кол-во материалов, которое вы хотите взять со склада","ACCEPT","BACK");
	        }
	        new input = strval(inputtext);
			if(input > PlayerInfo[playerid][ptMats] || input < 1) //Если введёные цифры больше того, сколько на складе, выдаст ошибку
			{
                ShowPlayerDialog(playerid,DIALOG_TOUTMATS,DIALOG_STYLE_INPUT,"Взять Материалы со Склада","У вас нету столько Материалов на Складе. Повторите Попытку","ACCEPT","");
            }
			else
			{
                PlayerInfo[playerid][pMats] += input; //Прибавляем материалов
                PlayerInfo[playerid][ptMats] -= input; //Отнимает их со склада
                format(string,sizeof(string),"* Вы успешно взяли %d материалов со склада. Материалов Осталось: %d", input,PlayerInfo[playerid][ptMats]);
                SendClientMessage(playerid,COLOR_WHITE, string); //Сообщение об успешной операции
			}
		}
		else ShowPlayerDialog(playerid,DIALOG_TOUTPUT,DIALOG_STYLE_INPUT,"Взять вещи из Склада","Введите наименование вещи (Наркотики/Материалы)","DONE","BACK");
	}

Аналогично и для наркотиков:


PHP:
	if(dialogid == DIALOG_TOUTDRUGS)
	{
	    if(response)
		{
            if(!strlen(inputtext))
			{
                ShowPlayerDialog(playerid,DIALOG_TOUTDRUGS,DIALOG_STYLE_INPUT,"Взять Наркотики со Склада","Введите кол-во наркотиков, которое вы хотите взять на склада","ACCEPT","BACK");
	        }
	        new input = strval(inputtext);
			if(input > PlayerInfo[playerid][ptDrugs] || input < 1)
			{
                ShowPlayerDialog(playerid,DIALOG_TOUTDRUGS,DIALOG_STYLE_INPUT,"Взять Наркотики со Склада","У вас нету столько Наркотиков на Складе. Повторите Попытку","ACCEPT","");
            }
			else
			{
                PlayerInfo[playerid][pDrugs] += input;
                PlayerInfo[playerid][ptDrugs] -= input;
                format(string,sizeof(string),"* Вы успешно взяли %d наркотиков со склада. Наркотиков Осталось: %d", input,PlayerInfo[playerid][ptDrugs]);
                SendClientMessage(playerid,COLOR_WHITE, string);
			}
		}
		else ShowPlayerDialog(playerid,DIALOG_TOUTPUT,DIALOG_STYLE_INPUT,"Взять вещи из Склада","Введите наименование вещи (Наркотики/Материалы)","DONE","BACK");
	}
* Примечение:
Чуть не забыл, необходимо добавить 2 переменный в PlayerInfo, в OnPlayerRegister, в OnPlayerLogin и в OnPlayerUpdate (Или у кого где)

В PlayerInfo:
PHP:
ptMats,
ptDrugs,
OnPlayerRegister и в OnPlayerUpdate:
PHP:
format(var, 32, "tMaterials=%d\n",PlayerInfo[playerid][ptMats]);fwrite(hFile, var);
format(var, 32, "tDrugs=%d\n",PlayerInfo[playerid][ptDrugs]);fwrite(hFile, var);
В OnPlayerLogin:
PHP:
if( strcmp( key , "tMaterials" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerInfo[playerid][ptMats] = strval( val ); }
if( strcmp( key , "tDrugs" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerInfo[playerid][ptDrugs] = strval( val ); }
Если у кого будут вопросы, задавайте, если у кого-то будут баги, говорите, может какую-то переменную упустил.

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