PDA

Просмотр полной версии : [Вопрос] Помощь по команде



Andrik851
11.04.2019, 15:04
Добрый день помогите написать команду к этому диалогу я так понимаю это система доставки материалов фракциям а команд нету ни для загрузки не для разгрузки



case D_JOB+9://============= загрузка авто армии
{
if(!response) return true;
new till = 0;
if(sscanf(inputtext, "i",till)) return ShowPlayerDialog(playerid, D_JOB+9, 1, "материалы", "Введите кол-во материалов:", "Принять", "Отмена");
if(till < 1 || till > 10000)
{
SendMes(playerid, COLOR_GREY, "Кол-во материалов от 1 до 10000!");
return ShowPlayerDialog(playerid, D_JOB+9, 1, "материалы", "Введите кол-во материалов:", "Принять", "Отмена");
}
if(till > Mats[0])
{
SendClientMessage(playerid, COLOR_GREY, "На складе недостаточно материалов!");
return ShowPlayerDialog(playerid, D_JOB+9, 1, "материалы", "Введите кол-во материалов:", "Принять", "Отмена");
}
Mats[0] -= till;
format(string, 50, "материалов: {9ACD32}%i / 10000", Mats[0]);
UpdateDynamic3DTextLabelText(tPickup[5], 0xFFFFFFFF, string);
UpdateDynamic3DTextLabelText(tPickup[12], 0xFFFFFFFF, string);
SetOtherInt("armymats", Mats[0]);
SendMes(playerid, COLOR_LIGHTGREEN, "Вы загрузили {ffffff}%i {9ACD32}материалов. Остаток на складе: {ffffff}%i {9ACD32}материалов",till,Mats[0]);
materials_Vehicle[GetPlayerVehicleID(playerid)] += till;
return true;
}

DeimoS
11.04.2019, 16:31
Ну обычная команда, которая вызывает DIALOG_STYLE_INPUTTEXT, в который нужно ввести число

Andrik851
11.04.2019, 18:38
еслибы я еще знал да и команда должна быть с проверкой на фракцию и авто

Andrik851
11.04.2019, 19:19
Ну с загрузкой материалов я вопрос решил теперь остался такой вопрос сделать команду для разгрузки и переписать диалог вместо загрузки только разгрузку но только на 3х чекпоинтах подскажите пожалуйста как это сделать?

Daniel_Cortez
11.04.2019, 20:11
Больше одного чекпоинта поставить нельзя, поэтому единственное очевидное решение - сделать диалог, в котором игрок сам выберет место разгрузки.

Andrik851
11.04.2019, 20:32
Больше одного чекпоинта поставить нельзя, поэтому единственное очевидное решение - сделать диалог, в котором игрок сам выберет место разгрузки.

Помогите пожалуйста с диалогом и вот еще такая проблемма разгрузку материалов я сделал но не могу понять как сделать счтобы не разгружало больше загруженного количества а точнее вот у меня загрузка 3000 и я могу по несколько раз вводить эту команду и оно разгружает по 3000

вот сама команда


CMD:unmatget(playerid, params[])//разгрузка материалов у армии
{
if(!PlayerLogged[playerid]) return true;
if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_GREY, "[INFO] Вы должны быть в автомобиле!");
if(MatsVehicle[GetPlayerVehicleID(playerid)] <= 0) return SendClientMessage(playerid, COLOR_GREY, "[INFO] В автомобиле нет материалов!");
if(GetPlayerVehicleSeat(playerid) == 0)
{
if(GetVehicleModel(GetPlayerVehicleID(playerid)) == 427)
{
if(PlayerInfo[playerid][pMember] == F_POLICE || PlayerInfo[playerid][pMember] == F_DPS || PlayerInfo[playerid][pMember] == F_FSB || PlayerInfo[playerid][pMember] == F_ARMY)
{
if(IsPlayerInRangeOfPoint(playerid, 5.0, 2542.8711, -2430.6648, 21.0034))
{
ShowPlayerDialog(playerid,D_JOB+6,1,"Склад боеприпасов ПОЛИЦИИ","{FFFFFF}Введите кол-во материалов разгрузки.\nМаксимально : 3000","Принять","Отмена");
}
}
}
else SendClientMessage(playerid, COLOR_GREY, "Вы должны быть в специализированом автомобиле для перевозки материалов!");
}
else SendClientMessage(playerid, COLOR_GREY, "[INFO] Вы должны быть на водительском сидении!");
return true;
}




и диалог разгрузки



case D_JOB+6://============= разгрузка авто армии
{
if(!response) return true;
new till = 0;
if(sscanf(inputtext, "i",till)) return ShowPlayerDialog(playerid, D_JOB+6, 1, "материалы", "Введите кол-во материалов:", "Принять", "Отмена");
if(till < 1 || till > 3000)
{
SendMes(playerid, COLOR_GREY, "Кол-во материалов от 1 до 3000!");
return ShowPlayerDialog(playerid, D_JOB+6, 1, "материалы", "Введите кол-во материалов:", "Принять", "Отмена");
}
if(till > Mats[1])
{
SendClientMessage(playerid, COLOR_GREY, "В транспорте недостаточно материалов!");
return ShowPlayerDialog(playerid, D_JOB+6, 1, "материалы", "Введите кол-во материалов:", "Принять", "Отмена");
}
Mats[1] += till;
format(string, 60, "БОЕПРИПАСОВ: {FF9900}%i{ffffff} шт.", Mats[1]); //police
Update3DTextLabelText(tPickup[34], 0xFFFFFFFF, string);
SetOtherInt("lspdmats", Mats[1]);
SendMes(playerid, COLOR_LIGHTGREEN, "Вы разгрузили {ffffff}%i {9ACD32}материалов.На складе: {ffffff}%i {9ACD32}материалов",till,Mats[1]);
materials_Vehicle[GetPlayerVehicleID(playerid)] -= till;
return true;
}


- - - Добавлено - - -

и если возможно подскажите как установить таймер на разгрузку

DeimoS
11.04.2019, 21:20
Как я ранее уже писал, то, о в чём просишь помочь ты - это не просто написать 3 строки кода, а целая система. И тут никто не сможет объяснить тебе как это сделать, ибо для этого нужно целый пласт основ Pawn и api SA-MP тебе расписать. Ну либо сделать всё за тебя, что делать вряд ли кто-то будет. Так что либо займись изучением основ и постепенно научишься сам всё делать, либо иди в стол заказов и оплачивай работу скриптера, который будет делать всё, что тебе нужно. Третьего тут не дано.

Andrik851
12.04.2019, 03:56
Как я ранее уже писал, то, о в чём просишь помочь ты - это не просто написать 3 строки кода, а целая система. И тут никто не сможет объяснить тебе как это сделать, ибо для этого нужно целый пласт основ Pawn и api SA-MP тебе расписать. Ну либо сделать всё за тебя, что делать вряд ли кто-то будет. Так что либо займись изучением основ и постепенно научишься сам всё делать, либо иди в стол заказов и оплачивай работу скриптера, который будет делать всё, что тебе нужно. Третьего тут не дано.

Я конечно извеняюсь но где в моих словах нпаисано что я прошу делать целую систему я всего лишь попросил подскажите как исправить чтобы постоянной разгрузки не было и таймер типа как на заправке а остальное я уже сам все сделаю

DeimoS
12.04.2019, 09:08
Отнимай от переменной, в которой хранится количество материалов, количество выгруженных материалов и остановишь разгрузку.

Создать таймер - SetTimer (http://wiki.pro-pawn.ru/wiki/SetTimer)/SetTimerEx (http://wiki.pro-pawn.ru/wiki/SetTimerEx) (хотя достаточно было вбить в гугл "как создать таймер pawn")

Andrik851
12.04.2019, 09:28
Отнимай от переменной, в которой хранится количество материалов, количество выгруженных материалов и остановишь разгрузку.

Создать таймер - SetTimer (http://wiki.pro-pawn.ru/wiki/SetTimer)/SetTimerEx (http://wiki.pro-pawn.ru/wiki/SetTimerEx) (хотя достаточно было вбить в гугл "как создать таймер pawn")

с таймерами я надеюсь разберусь но вот переменная про которую вы говорите знать бы как она выглядит визуально я смогу понять но переменная в которой хранятся материалы мне не о чем не говорит. Здесь переменных полно и они все разные

DeimoS
12.04.2019, 09:38
Ну у тебя должна быть переменная, в которую ты записываешь значение материалов, которые игрок загрузил. Собственно, от этой же переменной и отнимаешь количество материалов, которые игрок выгрузил.

Всё же предельно логично: чтоб количество материалов обновлялось при выгрузке, нужно отнять выгруженное количество материалов от того, которое уже есть у игрока/в машине. Данные хранятся где? Правильно, в переменной. Соответственно, нужно найти переменную, которая хранит количество материалов. По хорошему, название самой переменной должно говорить об её предназначении. Но если переменные назывались абы как, то, во-первых, я советую назвать их нормально, а во-вторых, как я уже говорил, находишь код загрузки материалов, смотришь в какую переменную записывается значение и используешь эту переменную. Ничего сложного ведь :)

Если будут проблемы с таймерами - предоставляй все свои текущие наработки по тому таймеру, который у тебя не получается сделать и пиши о том, что ты не понимаешь/что у тебя не получается + что ты хочешь получить в итоге. Тогда тебе точно помогут.

Andrik851
12.04.2019, 12:47
Ну у тебя должна быть переменная, в которую ты записываешь значение материалов, которые игрок загрузил. Собственно, от этой же переменной и отнимаешь количество материалов, которые игрок выгрузил.

Всё же предельно логично: чтоб количество материалов обновлялось при выгрузке, нужно отнять выгруженное количество материалов от того, которое уже есть у игрока/в машине. Данные хранятся где? Правильно, в переменной. Соответственно, нужно найти переменную, которая хранит количество материалов. По хорошему, название самой переменной должно говорить об её предназначении. Но если переменные назывались абы как, то, во-первых, я советую назвать их нормально, а во-вторых, как я уже говорил, находишь код загрузки материалов, смотришь в какую переменную записывается значение и используешь эту переменную. Ничего сложного ведь :)

Если будут проблемы с таймерами - предоставляй все свои текущие наработки по тому таймеру, который у тебя не получается сделать и пиши о том, что ты не понимаешь/что у тебя не получается + что ты хочешь получить в итоге. Тогда тебе точно помогут.

на счет таймера у меня есть готовый таймер для заправки авто воя его хочу клонировать и переписать только с отсчетом в обратную сторону
но пока ничего не получается

- - - Добавлено - - -

как я понял вот она эта переменная авто в которую грузятся материалы,только что здесь нужно отнимать


new materials_Vehicle[MAX_PLAYERS];


если это она то я изменил + на - но всеровно сколько команду не вводи и какое количество всеровно отгрузка идет и маты в организации добавляются



Mats[0] -= till;
format(string, 50, "материалов: {9ACD32}%i / 10000", Mats[0]);
UpdateDynamic3DTextLabelText(tPickup[5], 0xFFFFFFFF, string);
UpdateDynamic3DTextLabelText(tPickup[12], 0xFFFFFFFF, string);
SetOtherInt("armymats", Mats[0]);
SendMes(playerid, COLOR_LIGHTGREEN, "Вы разгрузили {ffffff}%i {9ACD32}материалов. Остаток на складе: {ffffff}%i {9ACD32}материалов",till,Mats[0]);
materials_Vehicle[GetPlayerVehicleID(playerid)] -= till; // вот здесь я изменил + на -
return true;

Paradox
12.04.2019, 13:05
Переменную Mats, на сколько понял я, ее нужно отнимать.
Переменная materials_Vehicle чисто для подсчета индивидуально для каждого игрока.

В вообще по хорошему переписать эту систему загрузки, назвать нормально переменные, да бы тебе было понятно, и сделать более правильно что-ли, не вижу смысла создавать переменную MAX_PLAYERS для подсчета, если машину будут грузить максимум 20 человек, проще тогда уже использовать PVar для подсчета выгрузки/загрузки материалов определенного игрока.

Andrik851
12.04.2019, 13:20
Переменную Mats, на сколько понял я, ее нужно отнимать.
Переменная materials_Vehicle чисто для подсчета индивидуально для каждого игрока.

есть вот еще такая


new MatsVehicle[MAX_VEHICLES];


но в коде загрузки я не нашел подходящей переменной кроме выше указанной

вот код загрузки



case D_JOB+9://============= загрузка авто армии
{
if(!response) return true;
new till = 0;
if(sscanf(inputtext, "i",till)) return ShowPlayerDialog(playerid, D_JOB+9, 1, "материалы", "Введите кол-во материалов:", "Принять", "Отмена");
if(till < 1 || till > 3000)
{
SendMes(playerid, COLOR_GREY, "Кол-во материалов от 1 до 3000!");
return ShowPlayerDialog(playerid, D_JOB+9, 1, "материалы", "Введите кол-во материалов:", "Принять", "Отмена");
}
if(till > Mats[0])
{
SendClientMessage(playerid, COLOR_GREY, "На складе недостаточно материалов!");
return ShowPlayerDialog(playerid, D_JOB+9, 1, "материалы", "Введите кол-во материалов:", "Принять", "Отмена");
}
Mats[0] -= till;
format(string, 60, "Боеприпасов: {FF9900}%i{ffffff} шт.", Mats[0]); //police
Update3DTextLabelText(tPickup[38], 0xFFFFFFFF, string);
format(string, 60, "На складе: {FF9900}%i{ffffff} шт.", Mats[0]);//army
UpdateDynamic3DTextLabelText(tPickup[4], 0xFFFFFFFF, string);
SetOtherInt("armymats", Mats[0]);
SendMes(playerid, COLOR_LIGHTGREEN, "Вы загрузили {ffffff}%i {9ACD32}материалов. Остаток на складе: {ffffff}%i {9ACD32}материалов",till,Mats[0]);
materials_Vehicle[GetPlayerVehicleID(playerid)] += till;
return true;
}

Paradox
12.04.2019, 13:36
есть вот еще такая


new MatsVehicle[MAX_VEHICLES];


но в коде загрузки я не нашел подходящей переменной кроме выше указанной

вот код загрузки



case D_JOB+9://============= загрузка авто армии
{
if(!response) return true;
new till = 0;
if(sscanf(inputtext, "i",till)) return ShowPlayerDialog(playerid, D_JOB+9, 1, "материалы", "Введите кол-во материалов:", "Принять", "Отмена");
if(till < 1 || till > 3000)
{
SendMes(playerid, COLOR_GREY, "Кол-во материалов от 1 до 3000!");
return ShowPlayerDialog(playerid, D_JOB+9, 1, "материалы", "Введите кол-во материалов:", "Принять", "Отмена");
}
if(till > Mats[0])
{
SendClientMessage(playerid, COLOR_GREY, "На складе недостаточно материалов!");
return ShowPlayerDialog(playerid, D_JOB+9, 1, "материалы", "Введите кол-во материалов:", "Принять", "Отмена");
}
Mats[0] -= till;
format(string, 60, "Боеприпасов: {FF9900}%i{ffffff} шт.", Mats[0]); //police
Update3DTextLabelText(tPickup[38], 0xFFFFFFFF, string);
format(string, 60, "На складе: {FF9900}%i{ffffff} шт.", Mats[0]);//army
UpdateDynamic3DTextLabelText(tPickup[4], 0xFFFFFFFF, string);
SetOtherInt("armymats", Mats[0]);
SendMes(playerid, COLOR_LIGHTGREEN, "Вы загрузили {ffffff}%i {9ACD32}материалов. Остаток на складе: {ffffff}%i {9ACD32}материалов",till,Mats[0]);
materials_Vehicle[GetPlayerVehicleID(playerid)] += till;
return true;
}


переписал бы сис-му загрузки. проще было бы тебе в дальнейшем.


new vehicle_mats[6]; // Допустим у меня на сервере 1 армия 5 банд (у всех по 1 фуре) = 6
/*
То есть машины:
vehicle_mats[0] (армия)
vehicle_mats[0] (банда 1)
vehicle_mats[0] (банда 2)
vehicle_mats[0] (банда 3)
vehicle_mats[0] (банда 4)
vehicle_mats[0] (банда 5)
*/

case dialog_load_mats:
{
if(response)
{
if(/*Провера на фракцию армия.*/)
{
vehicle_mats[0] += amount; // кол-во
}
if(/*Провера на фракцию банда 1.*/)
{
vehicle_mats[1] += amount; // кол-во
}
if(/*Провера на фракцию банда 2.*/)
{
vehicle_mats[2] += amount; // кол-во
}
if(/*Провера на фракцию банда 3.*/)
{
vehicle_mats[3] += amount; // кол-во
}
if(/*Провера на фракцию банда 4.*/)
{
vehicle_mats[4] += amount; // кол-во
}
if(/*Провера на фракцию банда 5.*/)
{
vehicle_mats[5] += amount; // кол-во
}
}
return true;
}

case dialog_unload_mats:
{
if(response)
{
if(/*Провера на фракцию армия.*/)
{
vehicle_mats[0] -= amount; // кол-во
}
if(/*Провера на фракцию банда 1.*/)
{
vehicle_mats[1] -= amount; // кол-во
}
if(/*Провера на фракцию банда 2.*/)
{
vehicle_mats[2] -= amount; // кол-во
}
if(/*Провера на фракцию банда 3.*/)
{
vehicle_mats[3] -= amount; // кол-во
}
if(/*Провера на фракцию банда 4.*/)
{
vehicle_mats[4] -= amount; // кол-во
}
if(/*Провера на фракцию банда 5.*/)
{
vehicle_mats[5] -= amount; // кол-во
}
}
return true;
}

Andrik851
12.04.2019, 13:42
если честно я вообще не шарю как это сделать.Я пытаюсь то что в моде было доделать.Команды разгрузки а также диалоа вообще не было я просто изменил команду и диалог в обратную сторону и всего лищь и сталкнулся с такой проблеммой что сколько не вводи команду он всеровно пополняет склады

Paradox
12.04.2019, 13:44
у тебя элементарно, текст на пикапах:
То есть tPickup[38], tPickup[4], это разные переменные, соответственно разные текста должны быть, у тебя по сути так и есть, [Боеприпасы] [На складе], а выводит оно из одной переменной Mats[0], судя по всему не верно (дескрипт: police/army)


format(string, 60, "Боеприпасов: {FF9900}%i{ffffff} шт.", Mats[0]); //police
Update3DTextLabelText(tPickup[38], 0xFFFFFFFF, string);
format(string, 60, "На складе: {FF9900}%i{ffffff} шт.", Mats[0]); //army
UpdateDynamic3DTextLabelText(tPickup[4], 0xFFFFFFFF, string);


- - - Добавлено - - -


если честно я вообще не шарю как это сделать.Я пытаюсь то что в моде было доделать.Команды разгрузки а также диалоа вообще не было я просто изменил команду и диалог в обратную сторону и всего лищь и сталкнулся с такой проблеммой что сколько не вводи команду он всеровно пополняет склады

диалоги это пример, это можно реализовать как в командах, так и в чекпоинтах и т. д.

P.S возьми основу для себя, посмотри на форумах, где не очень много строк, буквально регистрация, может пару фракций, посмотри, попрактикуйся там. должно быть легче, а вообще не плохо было бы функции почитать, и вообще как что работает.

Andrik851
12.04.2019, 13:45
если честно я вообще не шарю как это сделать.Я пытаюсь то что в моде было доделать.Команды разгрузки а также диалоа вообще не было я просто изменил команду и диалог в обратную сторону и всего лищь и сталкнулся с такой проблеммой что сколько не вводи команду он всеровно пополняет склады



да вот еще что посмотрел твой код получается что у тебя в базе данных тоже есть таблица vehicle_mats или я чтото путаю

Paradox
12.04.2019, 13:49
если честно я вообще не шарю как это сделать.Я пытаюсь то что в моде было доделать.Команды разгрузки а также диалоа вообще не было я просто изменил команду и диалог в обратную сторону и всего лищь и сталкнулся с такой проблеммой что сколько не вводи команду он всеровно пополняет склады



да вот еще что посмотрел твой код получается что у тебя в базе данных тоже есть таблица vehicle_mats или я чтото путаю

Да, я не менял нечего, она у тебя есть, но ее удалить бы, она у тебя для подсчета загрузки индивидуального игрока, а для подсчета игрокам сделать PVar'ы, а у меня она идет уже для подсчета материалов в фуре.

Andrik851
12.04.2019, 13:52
Да, я не менял нечего, она у тебя есть, но ее удалить бы, она у тебя для подсчета загрузки индивидуального игрока, а для подсчета игрокам сделать PVar'ы, а у меня она идет уже для подсчета материалов в фуре.

Все сходится к тому что я незнаю как это делать удалить то диалог и команду проблем нету а вот как это все заново написать я не знаю

- - - Добавлено - - -

а по поводу police/army это проверка на 3д текст армии просто забил изменить police на army прикопировании проверки

DeimoS
12.04.2019, 14:10
case D_JOB+6://============= разгрузка авто армии
{
if(!response)
return true;
new vehicleid = GetPlayerVehicleID(playerid);
if(vehicleid == 0)
return SendClientMessage(playerid, -1, "Вы должны быть в транспорте!");
new till = 0;
if(sscanf(inputtext, "i",till))
return ShowPlayerDialog(playerid, D_JOB+6, 1, "материалы", "Введите кол-во материалов:", "Принять", "Отмена");
if(till < 1 || till > 3000)
{
SendMes(playerid, COLOR_GREY, "Кол-во материалов от 1 до 3000!");
return ShowPlayerDialog(playerid, D_JOB+6, 1, "материалы", "Введите кол-во материалов:", "Принять", "Отмена");
}
if(till > materials_Vehicle[vehicleid])
{
SendClientMessage(playerid, COLOR_GREY, "В транспорте недостаточно материалов!");
return ShowPlayerDialog(playerid, D_JOB+6, 1, "материалы", "Введите кол-во материалов:", "Принять", "Отмена");
}
Mats[1] += till;
format(string, 60, "БОЕПРИПАСОВ: {FF9900}%i{ffffff} шт.", Mats[1]);
Update3DTextLabelText(tPickup[34], 0xFFFFFFFF, string);
SetOtherInt("lspdmats", Mats[1]);
SendMes(playerid, COLOR_LIGHTGREEN, "Вы разгрузили {ffffff}%i {9ACD32}материалов.На складе: {ffffff}%i {9ACD32}материалов",till,Mats[1]);
materials_Vehicle[vehicleid] -= till;
return true;
}

Andrik851
12.04.2019, 16:45
спасибо все работает.Тему можно закрывать