Доступ к готовым решениям

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

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

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

Мануал Система зажигания и бензина транспорта для мода с нуля

Edwin

Sir Edwin
Пользователь
Регистрация
4 Апр 2013
Сообщения
4,354
Лучшие ответы
0
Репутация
821
Вчера затронули тему бензина Т/С, где проскочила фраза, что на просторах портала таковой нет, и меня это даже слегка удивило.
Поскольку это было в теме вопросов по программированию, где человек искал подобную, я решил описать все в деталях и показать, что сложного в этом ничего нет.
Так же, так сказать, в качестве дополнения, вплетём сюда систему запуска двигателя, потому что с этими вопросами я тоже неоднократно сталкивался.
Система будет для new.pwn, поэтому встанет в любой мод. Я сейчас буду составлять эту систему прямо из головы, так что могу что-нибудь упустить, вы тогда меня поправьте, ладно?



Итак, начнём с главного. Первым делом нам нужно обозначить данные.
Ко всем new добавляем переменную, для хранения ID таймера, который будет отсчитывать количество бензина:
PHP:
new FuelUpdateTimer;
а в OnGameModeInit мы его заведём, и сохраним в переменную ID:
PHP:
FuelUpdateTimer = SetTimer("FuelUpdate", 120000, false); // Скажем, каждые 2 минуты
ну и конечно же, при выходе из игрового режима убьём его:
в OnGameModeExit
PHP:
KillTimer(FuelUpdateTimer);
и сразу после того, как всё это добавили, идём в массив авто (у кого как: VehicleInfo, CarInfo, Vehicles, и т.д.) и добавляем в перечень enum'а переменную бензина:
HTML:
vFuel,
То есть (думаю, как под себя подстроить догадаетесь), массив будет выглядеть примерно так:
PHP:
enum vInfo
{
    vID,
    vModel,
    Float:vCar_x,
    Float:vCar_y,
    Float:vCar_z,
    Float:vCar_a,
	vColor1,
	vColor2,
    vWorld,
    vInt,
	vOwned,
	vLock,
	vFuel // Это наш бензин. Не забываем, что после последнего перечислителя запятая не ставится
};
new VehicleInfo[MAX_VEHICLES][vInfo];
Собственно, то что надо мы обозначили. Теперь сделаем команду, которая будет заводить двигатель, поскольку бензин неразрывно с ней связан
PHP:
	else if(strcmp(cmd, "/engine", true) == 0)
	{
		if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return 1; // Заблокируем вкл/выкл двигателя игроку, не сидящему за рулём
		new veh = GetPlayerVehicleID(playerid);
		if(IsAVelo(veh)) return 1; // Сделаем проверку на велосипед (если понадобится, выложу потом проверку)
		if(!VehicleInfo[veh][vFuel]) return SendClientMessage(playerid, COLOR_GREY, "Бензобак пуст.");
		new engine, lights, alarm, doors, bonnet, boot, objective; // Обозначим параметры транспорта (если не обозначены)
		GetVehicleParamsEx(carid, engine, lights, alarm, doors, bonnet, boot, objective);
		if(!engine) SetTimerEx("EngineStart", 3000, false, "ii", playerid, veh); // Поставим таймер на запуск двигателя на 3 секунды
		else SetVehicleParamsEx(carid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective), SendClientMessage(playerid, -1, "Вы заглушили мотор"); // Или если двигатель уже запущен, выключаем его
		return 1;
	}
Куда-нибудь в свободное место ставим функцию таймера:
PHP:
forward EngineStart(playerid, carid);
public EngineStart(playerid, carid)
{
	if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return 1; // Сделаем откат таймера, если игрок уже вышел из машины
	GetVehicleParamsEx(carid, engine, lights, alarm, doors, bonnet, boot, objective);
	SetVehicleParamsEx(carid, VEHICLE_PARAMS_ON, lights, alarm, doors, bonnet, boot, objective);
    SendClientMessage(playerid, -1, "Двигатель завёлся");
    return 1;
}
Собственно, мы разобрались с зажиганием, и теперь остаётся только одно: доделать расход бензина.
Для этого мы создавали выше таймер FuelUpdate. Сейчас идём к EngineStart и ставим после него функцию таймера:
PHP:
forward FuelUpdate();
public FuelUpdate()
{
    new engine, lights, alarm, doors, bonnet, boot, objective;
    for(new car = 1; car < GetVehiclePoolSize(); car++) // Для версий SA:MP ниже 0.3.7 используйте MAX_VEHICLES
	{
		GetVehicleParamsEx(car,engine,lights,alarm,doors,bonnet,boot,objective);
		if(!engine) continue;
		if(VehicleInfo[car][vFuel]) --VehicleInfo[car][aFuel]; // Отнимаем литр бензина, если он есть
		else SetVehicleParamsEx(car,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective); // В противном случае - глушим двигатель
	}
	return 1;
}
В принципе!, это всё. Однако за вами остаётся только правильно использовать эту систему. Полёт фантазии дальше остаётся за вами. Сделать объём бака, зажигание на кнопку, распределение на типы бензина, вывод топлива на спидометр или же расход топлива, зависящий от скорости - пожалуйста. Основу я вам дал. Описываю:
при вводе команды игрок начинает заводить двигатель, и через три секунды он запускается, если в баке имеется хотя бы литр топлива. Каждые две минуты у всех машин с запущенным двигателем отнимается по литру, и когда бензин станет "нулём", у игрока ещё останется две минуты на то, что бы доехать до бензозаправки, что бы подлить бензинчику (если он, конечно, не заглушит двигатель).
Опять же, повторюсь, что это только урок (мануал) по системе зажигания и бензину, как его использовать, в какое русло пустить - дело ваше, я нарисовал вам скелет. Пользуйтесь на здоровье
 
Последнее редактирование:
Сверху Снизу