Система двигателя. [for new.pwn]
Приветствую всех посетивших тему. Как ни странно, этого мануала я не нашёл на портале.
1. Добавляем в начало мода:
PHP код:
#include <a_samp>
#include <foreach>
#define PRESSED(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0))) // нажатие кнопки
#define COLOR_PURPLE 0xC2A2DAAA // фиолетовый цвет
new engine_car[MAX_VEHICLES char]; // заведена машина / нет
new engine,lights,alarm,bonnet,boot,objective,doors; // перменные для данных о состоянии машины
2. Добавляем в public OnGameModeInit():
PHP код:
ManualVehicleEngineAndLights(); // отключаем автоматическую заводку двигателя
3. Добавляем в public OnPlayerKeyStateChange(playerid, newkeys, oldkeys):
PHP код:
if(PRESSED(KEY_SUBMISSION)) // если нажали цифру "2" на клавиатуре
{
if(!IsPlayerInAnyVehicle(playerid)) return true; // находится ли игрок в машине
if(GetPVarInt(playerid, "Engining") > 0) return true; // начал ли игрок заводку двигателя
new vehicleid = GetPlayerVehicleID(playerid); // создаём переменную, в которую записываем ID машины игрока, чтобы код был менее громоздким
if(GetPlayerState(playerid) != 2) return true; // находится ли игрок за рулём
if(IsABicycle(vehicleid)) return true; // если на велосипеде
new player_name[MAX_PLAYER_NAME]; // переменная для хранения имени игрока
GetPlayerName(playerid, player_name, sizeof(player_name)); // записываем имя игрока в переменную
if(engine_car{vehicleid} == 0) // если двигатель машины не заведён
{
new text[29+MAX_PLAYER_NAME]; // создаём переменную для хранения текста (29 символов данного текста + ячейки для имени игрока)
format(text, sizeof(text), "*%s пытается завести двигатель.", player_name); // форматируем текст - записываем вместо %s имя игрока
ProxDetectorEx(15.0, playerid, text, COLOR_PURPLE); // отправляем текст в чат всем, кто находится в 15 метрах от нас (фиолетовым цветом)
SetTimerEx("RandomEnginingCar", 1500, 0, "%i", playerid); // переменной таймера присваивам запуск таймера
SetPVarInt(playerid, "Engining", 1); // начинаем заводку двигателя
}
else // если двигатель машины заведён
{
engine_car{vehicleid} = 0; // глушим двигатель
new text2[19+MAX_PLAYER_NAME]; // создаём переменную для хранения текста (19 символов данного текста + ячейки для имени игрока)
format(text2, sizeof(text2), "*%s глушит двигатель.", player_name); // форматируем текст - записываем вместо %s имя игрока
ProxDetectorEx(15.0, playerid, text2, COLOR_PURPLE); // отправляем текст в чат всем, кто находится в 15 метрах от нас (фиолетовым цветом)
GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective); // получаем данные о состоянии машины
SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective); // выключаем двигатель
}
}
4. Добавляем в public OnPlayerStateChange(playerid, newstate, oldstate):
PHP код:
if(newstate == PLAYER_STATE_DRIVER) // если игрок сел за руль
{
new vehicleid = GetPlayerVehicleID(playerid); // создаём переменную, в которую записываем ID машины игрока, чтобы код был менее громоздким
if(IsABicycle(vehicleid) || engine_car{vehicleid} != 0)
// если сели на велосипед или переменная, хранящая информацию о двигателе машины, не равна 0
{
GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective); // получаем данные о состоянии машины
SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective); // включаем "двигатель
}
}
5. Теперь сам процесс заводки двигателя. В середину/конец мода добавляем:
PHP код:
forward RandomEnginingCar(playerid);
public RandomEnginingCar(playerid)
{
new text[36+MAX_PLAYER_NAME]; // создаём переменную для хранения текста
new vehicleid = GetPlayerVehicleID(playerid); // создаём переменную, в которую записываем ID машины игрока, чтобы код был менее громоздким
new Float: vehicle_health; // создаём переменную для хранения HP машины
GetVehicleHealth(vehicleid, vehicle_health); // записываем HP машины в переменную
new player_name[MAX_PLAYER_NAME]; // переменная для хранения имени игрока
GetPlayerName(playerid, player_name, sizeof(player_name)); // записываем имя игрока в переменную
if(vehicle_health >= 900) // если HP машины больше либо равно 900
{
engine_car{vehicleid} = 1; // заводим машину
GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective); // получаем данные о состоянии машины
SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective); // включаем двигатель
format(text, sizeof(text), "*%s заводит двигатель.", player_name); // форматируем текст - записываем вместо %s имя игрока
ProxDetectorEx(15.0, playerid, text, COLOR_PURPLE); // отправляем текст в чат всем, кто находится в 15 метрах от нас (фиолетовым цветом)
}
else if(vehicle_health >= 500 || vehicle_health < 900) // если HP машины от 500 до 900
{
switch(random(5)) // проверяем значения random_engine
{
case 0..3: // если выпали числа 0, 1, 2, 3, двигатель заведётся
{
engine_car{vehicleid} = 1; // заводим машину
GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective); // получаем данные о состоянии машины
SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective); // включаем двигатель
format(text, sizeof(text), "*%s заводит двигатель.", player_name); // форматируем текст - записываем вместо %s имя игрока
ProxDetectorEx(15.0, playerid, text, COLOR_PURPLE); // отправляем текст в чат всем, кто находится в 15 метрах от нас (фиолетовым цветом)
}
case 4: // если выпало число 4, двигатель не заведётся
{
format(text, sizeof(text), "*У %s не получилось завести двигатель.", player_name); // форматируем текст - записываем вместо %s имя игрока
ProxDetectorEx(15.0, playerid, text, COLOR_PURPLE); // отправляем текст в чат всем, кто находится в 15 метрах от нас (фиолетовым цветом)
}
}
}
else if(vehicle_health < 500) // если HP машины < 500
{
switch(random(5)) // проверяем значения random_engine
{
case 3, 4: // если выпали числа 3 или 4, то двигатель заведётся
{
engine_car{vehicleid} = 1; // заводим машину
GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective); // получаем данные о состоянии машины
SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective); // включаем двигатель
format(text, sizeof(text), "*%s заводит двигатель.", player_name); // форматируем текст - записываем вместо %s имя игрока
ProxDetectorEx(15.0, playerid, text, COLOR_PURPLE); // отправляем текст в чат всем, кто находится в 15 метрах от нас (фиолетовым цветом)
}
case 0..2: // если выпали числа 0, 1, 2, то двигатель не заведётся
{
format(text, sizeof(text), "*У %s не получилось завести двигатель.", player_name); // форматируем текст - записываем вместо %s имя игрока
ProxDetectorEx(15.0, playerid, text, COLOR_PURPLE); // отправляем текст в чат всем, кто находится в 15 метрах от нас (фиолетовым цветом)
}
}
}
SetPVarInt(playerid, "Engining", 0); // процесс заводки авто окончен
return true;
}
6. Нужные стоки (stock):
PHP код:
stock ProxDetectorEx(Float:radi, playerid, string[], color) // отправка сообщения в чат на расстояние
{
new Float:positions[3]; // создаём 3 перменные типа FLOAT (0, 1 и 2) для хранения координат игрока
GetPlayerPos(playerid,positions[0],positions[1],positions[2]); // записываем координаты игрока в переменные
foreach(new i: Player) // перебираем всех игроков
{
if(IsPlayerInRangeOfPoint(i,radi,positions[0],positions[1],positions[2])) // если игрок в указанном радиусе
{
if(GetPlayerVirtualWorld(i) == GetPlayerVirtualWorld(playerid) && GetPlayerInterior(playerid) == GetPlayerInterior(i)) SendClientMessage(i, color, string);
// и имеет такие же виртуальный мир и интерьер, как и у данного игрока, то ему приходит сообщение в чат
}
}
return true;
}
stock IsABicycle(vehicleid) // велосипеды
{
switch(GetVehicleModel(vehicleid)) // проверяем значения модели
{
case 481, 509, 510, 448: return true;
}
return false;
}
7. В public OnVehicleSpawn:
PHP код:
engine_car{vehicleid} = 0;
*Во время респавна автомобиля выключаем ему двигатель.
Постарался всё разъяснить предельно подробно. Если заметили недоработки/ошибки или хотите задать вопрос - оставляйте сообщение ниже.
Автор мануала: Hidden.