| WedMacK | Дата: Воскресенье, 03.07.2011, 23:15 | Сообщение # 1 |
 Сдешний
Сообщений: 51
| FAQ по созданию завода двигателя, управления фарами, учета бензина.
Здравствуйте, в этой теме я хотел бы рассказать, как сделать завод двигателя, управление фарами и учет бензина, в зависимости от того заведен двигатель или нет. Возможно, что то подобное уже обсуждалось, но моя тема рассчитана конкретно под мод Godfather, хотя легко можно приспособить и к другому моду.
Подготавливаемся.
Для начала нам нужно убедиться, что версия нашего сервера 0.3c, иначе все бесполезно. Если с версией все в порядке, приступаем непосредственно к реализации. Открываем наш мод в pawno, для начала нам нужно создать несколько вспомогательных функций, если их еще нет в моде.
Во-первых нам нужна функция, которая определяет по ID транспорта, велосипед это или нет. Если такой функции нет, создаем ее. В начале мода прописываем forward IsAVelik(carid); Затем в любом месте, главное до использования этой функции, описываем ее.
Quote public IsAVelik(carid) { new model = GetVehicleModel(carid); if(model==509||model==481||model==510) { return 1; } return 0; }
Аналогично можно сделать проверку для водного транспорта и воздушного. После этого нам нужно сделать функцию, которая будет определять состояние двигателя автомобиля (заведен или нет). Для этого опять в начале мода прописываем forward Checkengine(carid); Дальше так же описываем функцию.
Quote public CheckEngine(carid) { new engine, lights, alarm, doors, bonnet, boot, objective; GetVehicleParamsEx(carid, engine, lights, alarm, doors, bonnet, boot, objective); if(engine){ return 1; } else { return 0; } }
На этом подготовка закончена, приступаем к основной части.
Реализовываем.
В самом начале public OnGameModeInit() прописываем ManualVehicleEngineAndLights(); Данная функция делает выключенными двигатель и фары, когда игрок садится в машину. Но тут есть небольшая проблема, двигатель и фары действительно выключены, но если получить параметры автомобиля, то результаты будут такие, как будто двигатель и фары включены. Поэтому в том же паблике после того как объявлены автомобили мода, добавляем следующий цикл:
Quote or(new i = 0 ; i<99 ; i ++) { if(!IsAVelik(i)) { SetVehicleParamsEx(i,false,false,false,false,false,false,false); } else { SetVehicleParamsEx(i,true,false,false,false,false,false,false); }
}
Вместо 99, пишем количество машин в моде. Данный цикл устанавливает выключенными двигатель и фары у всего транспорта в моде, кроме велосипедов. Аналогично можно проверять водный транспорт и воздушный. Кстати, если в моде у вас есть команда, которая респавнит все машины, то этот же цикл нужно добавить в тело этой команды.
Далее делаем так, что бензин не заканчивается если двигатель выключен. Ищем public CheckGas() и первая часть этой функции должны выглядеть так:
Quote public CheckGas() { new string[256]; new vehicle = GetPlayerVehicleID(i); for(new i=0;i<MAX_PLAYERS;i++) { if(IsPlayerConnected(i)) {
if(GetPlayerState(i) == PLAYER_STATE_DRIVER && !IsAVelik(vehicle) && CheckEngine(vehicle)) {
if(Gas[vehicle] >= 1) {
Quote Тут важно учесть, что строка с переменой new vehicle = GetPlayerVehicleID(i);, должна быть указана один раз и в том месте где это указано в моем коде. После этого ищем public OnPlayerKeyStateChange
И в самое начало прописываем new vid = GetPlayerVehicleID(playerid); и после объявления переменных добавляем
Quote if (newkeys == 4 && IsPlayerInVehicle(playerid,vid) && !IsAVelik(vid)) { new engine,lights,alarm,doors,bonnet,boot,objective; GetVehicleParamsEx(vid,engine,lights,alarm,doors,bonnet,boot,objective); if(engine){SetVehicleParamsEx(vid,false,lights,alarm,doors,bonnet,boot,objective); format(string, sizeof(string), "* %s заглушил двигатель.",name); ProxDetector(30.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE); } else if(!engine){SetVehicleParamsEx(vid,true,true,alarm,doors,bonnet,boot,objective); format(string, sizeof(string), "* %s завел двигатель.",name); ProxDetector(30.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE); } } if (newkeys == 1 && IsPlayerInVehicle(playerid,GetPlayerVehicleID(playerid)) && !IsAVelik(vid)) { new engine,lights,alarm,doors,bonnet,boot,objective; GetVehicleParamsEx(vid,engine,lights,alarm,doors,bonnet,boot,objective); if(lights){SetVehicleParamsEx(vid,engine,false,alarm,doors,bonnet,boot,objective);} else if(!lights){SetVehicleParamsEx(vid,engine,true,alarm,doors,bonnet,boot,objective);} }
|
| |
| |