PDA

Просмотр полной версии : [Вопрос] Система поставки материалов для Армий (с СРП)



StevenH
07.05.2017, 14:05
Здравствуйте.

Предисловие: на самп рп, есть матовозки, где после загрузки лежат материалы, а в дальнейшем Зона 51 их развозит по гос. фракциям.

Так вот, в чем вопрос. Вот что ТОЛЬКО пришло в голову сделать:


// Переменные
new materials_car[MAX_VEHICLES];

// При загрузке:
new vehicleid = GetPlayerVehicleID(playerid);
materials_car[vehicleid] = 10000;


Но, таких ТС только 7 штук будет (2 cargobob для SFa и 5 матовозок для LVa), и создавать переменную с 2000 ячейками помойму (по дефолту MAX_VEHICLES), не очень целесообразно.

Кто может лучше вариант предложить, буду благодарен!

Nash_Brigers
07.05.2017, 14:08
del (не так понял вопрос)

Mr.Forest
07.05.2017, 14:23
Создаешь двойной массив (как минимум нужно хранить ID машины и кол-во материалов в кузове). Инициализируешь ячейки с ID автомобилей значением INVALID_VEHICLE_ID. Далее, при когда дело подойдет до создания транспорта, прогоняйся по ячейкам массива и смотрим: если ID автомобиля равен INVALID_VEHICLE_ID, вытаскивай номер итерации к крепи к массиву с ранее вытащенным номером ID автомобиля (уже будет любой другой, кроме INVALID_VEHICLE_ID).
Когда потребуется изменить кол-во материалов в кузове автомобиле, то опять же при помощи цикла, сравнивай ID автомобилей, и если они совпали, записывай в нужную ячейку новое количество материалов

UPD: Хотя, при создание транспорта можно обойтись и без лишних взаимодействий с массивами. Крепить в ручную, начиная с нуля и кончая шестьми.

ziggi
07.05.2017, 14:45
Да, можно сэкономить память, но лишь ценой процессорного времени, что в наше время не имеет смысла. Я напомню, что 2000 ячеек - это 8000 байт, а это меньше, чем 8 КиБ. Всего 8 КиБ, когда сейчас иметь в телефоне 4 ГиБ оперативной памяти - это стандарт (а скоро уже и 8).

DeimoS
07.05.2017, 14:57
const MAX_MATERIALS_CAR = 7;
new materials_car_id[2],
materials_car[MAX_MATERIALS_CAR];

public OnGameModeInit()
{
//Остальной код
materials_car_id[0] = CreateVehicle(...);
CreateVehicle(...);
CreateVehicle(...);
CreateVehicle(...);
CreateVehicle(...);
CreateVehicle(...);
materials_car_id[1] = CreateVehicle(...);
//Остальной код
}


stock IsVehicleCarriesMaterials(vehicleid)//Вернёт "-1", если автомобиль не является транспортным и номер ячейки, если является
return ((materials_car_id[0] <= vehicleid <= materials_car_id[1]) ? vehicleid-materials_car_id[0] : -1);

Пример использования:

new result = IsVehicleCarriesMaterials(GetPlayerVehicleID(playerid));
if(result == -1)
return SendClientMessage(playerid, -1, "Вы не находитесь в матовозе!");
else
{
new string[17+11+1];
format(string, sizeof(string), "В матовозе %d матов", materials_car[result];
SendClientMessage(playerid, -1, string);
}

Но на деле это всё довольно бессмысленно и лишь делает систему привязанной к ID автомобилей при создании. Гораздо надёжнее будет создать тот самый массив в 2000 автомобилей

StevenH
07.05.2017, 15:29
const MAX_MATERIALS_CAR = 7;
new materials_car_id[2],
materials_car[MAX_MATERIALS_CAR];

public OnGameModeInit()
{
//Остальной код
materials_car_id[0] = CreateVehicle(...);
CreateVehicle(...);
CreateVehicle(...);
CreateVehicle(...);
CreateVehicle(...);
CreateVehicle(...);
materials_car_id[1] = CreateVehicle(...);
//Остальной код
}


stock IsVehicleCarriesMaterials(vehicleid)//Вернёт "-1", если автомобиль не является транспортным и номер ячейки, если является
return ((materials_car_id[0] <= vehicleid <= materials_car_id[1]) ? vehicleid-materials_car_id[0] : -1);

Пример использования:

new result = IsVehicleCarriesMaterials(GetPlayerVehicleID(playerid));
if(result == -1)
return SendClientMessage(playerid, -1, "Вы не находитесь в матовозе!");
else
{
new string[17+11+1];
format(string, sizeof(string), "В матовозе %d матов", materials_car[result];
SendClientMessage(playerid, -1, string);
}

Но на деле это всё довольно бессмысленно и лишь делает систему привязанной к ID автомобилей при создании. Гораздо надёжнее будет создать тот самый массив в 2000 автомобилей

Благодарю