Nexius_Tailer
31.01.2016, 15:13
Приветствую.
Когда копался по старым файлам, нашёл код, который писал ещё для 0.3z - взрыв автомобиля, если попали с огнестрельного оружия по его бензобаку.
Работает, только если машина занята водителем (т.к. существует баг со взрывом незанятого транспорта).
Код проще некуда.
Сейчас мы это разберём:
Итак, в public OnPlayerWeaponShot вставляем следующее:
if(hittype == BULLET_HIT_TYPE_VEHICLE && GetVehicleDriver(hitid) != INVALID_PLAYER_ID)
{
new Float:Offset[3];
GetVehicleModelInfo(GetVehicleModel(hitid), VEHICLE_MODEL_INFO_PETROLCAP, Offset[0], Offset[1], Offset[2]);
if(VectorSize(Offset[0] - fX, Offset[1] - fY, Offset[2] - fZ) <= 0.3)
{
GetVehicleHealth(hitid, Offset[0]);
if(Offset[0])
{
GetVehiclePos(hitid, Offset[0], Offset[1], Offset[2]);
CreateExplosion(Offset[0], Offset[1], Offset[2], 1, 5.0);
SetVehicleHealth(hitid, 0.0);
}
}
}
Куда-нибудь в конец:
stock GetVehicleDriver(vehicleid)
{
for(new i = GetPlayerPoolSize(); i != -1; --i)
{
if(IsPlayerInVehicle(i, vehicleid) && GetPlayerState(i) == PLAYER_STATE_DRIVER) return i;
}
return INVALID_PLAYER_ID;
}
Разжую:
Первое условие проверяет, во что попал игрок. Если он попал в машину и в машине кто-то сидит за рулём, то двигаемся дальше;
Создаём переменные для последующего узнавания координат бензобака, а также узнаём модель машины, в которую попали;
Узнаём координаты бензобака;
Проверяем, насколько далеко от бензобака попал игрок. Если расстояние до бензобака равно либо меньше 0.3 метра (т.е. попал именно в бензобак), идём дальше;
Узнаём хп машины на тот случай, если она уже взорвана (тогда хп будет равняться 0.0);
Проверяем это. Если хп больше 0.0, двигаемся далее;
Узнаём координаты машины для создания взрыва, создаём взрыв на тех координатах, а также ставим машине 0.0 хп.
При следующем выстреле сработает проверка, и если хп у тачки 0.0, то больше машина взрываться не будет.
Функция "GetVehicleDriver" нужна для проверки транспорта на занятость водителем.
Как должно выглядеть в итоге:
public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
{
if(hittype == BULLET_HIT_TYPE_VEHICLE && GetVehicleDriver(hitid) != INVALID_PLAYER_ID)
{
new Float:Offset[3];
GetVehicleModelInfo(GetVehicleModel(hitid), VEHICLE_MODEL_INFO_PETROLCAP, Offset[0], Offset[1], Offset[2]);
if(VectorSize(Offset[0] - fX, Offset[1] - fY, Offset[2] - fZ) <= 0.3)
{
GetVehicleHealth(hitid, Offset[0]);
if(Offset[0])
{
GetVehiclePos(hitid, Offset[0], Offset[1], Offset[2]);
CreateExplosion(Offset[0], Offset[1], Offset[2], 1, 5.0);
SetVehicleHealth(hitid, 0.0);
}
}
}
return 1;
}
stock GetVehicleDriver(vehicleid)
{
for(new i = GetPlayerPoolSize(); i != -1; --i)
{
if(IsPlayerInVehicle(i, vehicleid) && GetPlayerState(i) == PLAYER_STATE_DRIVER) return i;
}
return INVALID_PLAYER_ID;
}
Вроде-бы я этого пока не видел нигде, потому и выложил.
Когда копался по старым файлам, нашёл код, который писал ещё для 0.3z - взрыв автомобиля, если попали с огнестрельного оружия по его бензобаку.
Работает, только если машина занята водителем (т.к. существует баг со взрывом незанятого транспорта).
Код проще некуда.
Сейчас мы это разберём:
Итак, в public OnPlayerWeaponShot вставляем следующее:
if(hittype == BULLET_HIT_TYPE_VEHICLE && GetVehicleDriver(hitid) != INVALID_PLAYER_ID)
{
new Float:Offset[3];
GetVehicleModelInfo(GetVehicleModel(hitid), VEHICLE_MODEL_INFO_PETROLCAP, Offset[0], Offset[1], Offset[2]);
if(VectorSize(Offset[0] - fX, Offset[1] - fY, Offset[2] - fZ) <= 0.3)
{
GetVehicleHealth(hitid, Offset[0]);
if(Offset[0])
{
GetVehiclePos(hitid, Offset[0], Offset[1], Offset[2]);
CreateExplosion(Offset[0], Offset[1], Offset[2], 1, 5.0);
SetVehicleHealth(hitid, 0.0);
}
}
}
Куда-нибудь в конец:
stock GetVehicleDriver(vehicleid)
{
for(new i = GetPlayerPoolSize(); i != -1; --i)
{
if(IsPlayerInVehicle(i, vehicleid) && GetPlayerState(i) == PLAYER_STATE_DRIVER) return i;
}
return INVALID_PLAYER_ID;
}
Разжую:
Первое условие проверяет, во что попал игрок. Если он попал в машину и в машине кто-то сидит за рулём, то двигаемся дальше;
Создаём переменные для последующего узнавания координат бензобака, а также узнаём модель машины, в которую попали;
Узнаём координаты бензобака;
Проверяем, насколько далеко от бензобака попал игрок. Если расстояние до бензобака равно либо меньше 0.3 метра (т.е. попал именно в бензобак), идём дальше;
Узнаём хп машины на тот случай, если она уже взорвана (тогда хп будет равняться 0.0);
Проверяем это. Если хп больше 0.0, двигаемся далее;
Узнаём координаты машины для создания взрыва, создаём взрыв на тех координатах, а также ставим машине 0.0 хп.
При следующем выстреле сработает проверка, и если хп у тачки 0.0, то больше машина взрываться не будет.
Функция "GetVehicleDriver" нужна для проверки транспорта на занятость водителем.
Как должно выглядеть в итоге:
public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
{
if(hittype == BULLET_HIT_TYPE_VEHICLE && GetVehicleDriver(hitid) != INVALID_PLAYER_ID)
{
new Float:Offset[3];
GetVehicleModelInfo(GetVehicleModel(hitid), VEHICLE_MODEL_INFO_PETROLCAP, Offset[0], Offset[1], Offset[2]);
if(VectorSize(Offset[0] - fX, Offset[1] - fY, Offset[2] - fZ) <= 0.3)
{
GetVehicleHealth(hitid, Offset[0]);
if(Offset[0])
{
GetVehiclePos(hitid, Offset[0], Offset[1], Offset[2]);
CreateExplosion(Offset[0], Offset[1], Offset[2], 1, 5.0);
SetVehicleHealth(hitid, 0.0);
}
}
}
return 1;
}
stock GetVehicleDriver(vehicleid)
{
for(new i = GetPlayerPoolSize(); i != -1; --i)
{
if(IsPlayerInVehicle(i, vehicleid) && GetPlayerState(i) == PLAYER_STATE_DRIVER) return i;
}
return INVALID_PLAYER_ID;
}
Вроде-бы я этого пока не видел нигде, потому и выложил.