Я до сих пор не понимаю в чём сложность просто взять и протестировать работу функции GetVehicleModelInfo и работу тех твоих функций, а после скомпилировать из них то, что тебе нужно. Это не требует совершенно никаких знаний тригонометрии. Просто уделить пол часа тестам и методом тыка понять какие значения за какой отступ (на сколько и в какую сторону) отвечают.
Хотя если не хочется ни в чём разбираться и пытаться понять как всё работает - можно просто загуглить. Гуглим "GetVehicleModelInfo VEHICLE_MODEL_INFO_FRONTSEAT" и в одной из первых ссылок видим "GetVehicleParamsCarDoors fix (beta) (https://gist.github.com/ziggi/a378063a2da2bdbf4425)" от Ziggi. Там в OnPlayerUpdate есть готовые проверки, определяющие рядом с каким местом сидит игрок. Немного переделываем проверки, убирая то, что нам не нужно, и получаем следующее:
stock GetVehicleSeatPos(vehicleid, seatid, &Float:x, &Float:y, &Float:z)
{
switch(seatid)
{
case 0:
{
new Float:veh_pos_x;
new Float:veh_pos_y;
new Float:veh_pos_z;
GetVehiclePos(vehicleid, veh_pos_x, veh_pos_y, veh_pos_z);
new Float:v_wide;
new Float:buff;
new model = GetVehicleModel(vehicleid);
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_SIZE, v_wide, buff, buff);
new Float:seat_x;
new Float:seat_y;
new Float:seat_z;
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_FRONTSEAT, seat_x, seat_y, seat_z);
x = veh_pos_x+seat_x/2.0-v_wide/2.0;
y = veh_pos_y + seat_y;
z = veh_pos_z + seat_z;
return 1;
}
case 1:
{
new Float:veh_pos_x;
new Float:veh_pos_y;
new Float:veh_pos_z;
GetVehiclePos(vehicleid, veh_pos_x, veh_pos_y, veh_pos_z);
new Float:v_wide;
new Float:buff;
new model = GetVehicleModel(vehicleid);
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_SIZE, v_wide, buff, buff);
new Float:seat_x;
new Float:seat_y;
new Float:seat_z;
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_FRONTSEAT, seat_x, seat_y, seat_z);
x = veh_pos_x-seat_x/2.0+v_wide/2.0;
y = veh_pos_y + seat_y;
z = veh_pos_z + seat_z;
return 1;
}
case 2:
{
new Float:veh_pos_x;
new Float:veh_pos_y;
new Float:veh_pos_z;
GetVehiclePos(vehicleid, veh_pos_x, veh_pos_y, veh_pos_z);
new Float:v_wide;
new Float:buff;
new model = GetVehicleModel(vehicleid);
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_SIZE, v_wide, buff, buff);
new Float:seat_x;
new Float:seat_y;
new Float:seat_z;
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_REARSEAT, seat_x, seat_y, seat_z);
x = veh_pos_x+seat_x/2.0-v_wide/2.0;
y = veh_pos_y + seat_y;
z = veh_pos_z + seat_z;
return 1;
}
case 3:
{
new Float:veh_pos_x;
new Float:veh_pos_y;
new Float:veh_pos_z;
GetVehiclePos(vehicleid, veh_pos_x, veh_pos_y, veh_pos_z);
new Float:v_wide;
new Float:buff;
new model = GetVehicleModel(vehicleid);
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_SIZE, v_wide, buff, buff);
new Float:seat_x;
new Float:seat_y;
new Float:seat_z;
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_REARSEAT, seat_x, seat_y, seat_z);
x = veh_pos_x-seat_x/2.0+v_wide/2.0;
y = veh_pos_y + seat_y;
z = veh_pos_z + seat_z;
return 1;
}
}
return 0;
}
Пишем простенький скрипт, который покажет какие координаты возвращает функция, беря все дополнительные массивы и функции так же из интернета:
new const MaxVehicleSeats[212] =
{
4, 2, 2, 2, 4, 4, 1, 2, 2, 4, 2, 2, 2, 4, 2, 2, 4, 2, 4, 2, 4, 4, 2, 2, 2,
1, 4, 4, 4, 2, 1, 2, 1, 2, 2, 0, 2, 2, 4, 2, 4, 1, 2, 2, 2, 4, 1,
2, 1, 2, 0, 2, 1, 1, 1, 2, 2, 2, 4, 4, 2, 2, 1, 2, 1, 2, 4, 4, 2, 2, 4, 2, 1,
1, 2, 2, 1, 2, 2, 4, 2, 1, 4, 3, 1, 1, 1, 4, 4, 2, 4, 2, 4, 1, 2, 2, 2, 4, 4,
2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 1, 1, 2, 1, 1, 2, 2, 4, 2, 2, 1, 1, 2, 2, 2, 2,
2, 2, 2, 2, 4, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 4, 2, 2, 2, 2, 2, 4, 4, 2, 2, 4,
4, 2, 1, 2, 2, 2, 2, 2, 2, 4, 4, 2, 2, 1, 2, 4, 4, 1, 0, 0, 1, 1, 2,
1, 2, 2, 4, 2, 4, 4, 2, 4, 1, 0, 4, 2, 2, 2, 2, 0, 0, 2, 2, 1, 1,
4, 4, 4, 2, 2, 2, 2, 2, 4, 2, 0, 0, 0, 4, 0, 0
};
const MAX_VEHICLE_SEATS = 4;
CMD:get(playerid, params[])
{
new Float:x, Float:y, Float:z;
new Float:veh_x = 2137.2124, Float:veh_y = -2493.8198, Float:veh_z = 13.5469;
for(new vehicleid, i, vehicletype = 400; vehicletype < 612; vehicletype++)
{
vehicleid = CreateVehicle(vehicletype,
veh_x, veh_y, veh_z, 0.0, -1, -1, 100000);
veh_x -= 5.0;
for(i = 0; i < MAX_VEHICLE_SEATS; i++)
{
if(i >= MaxVehicleSeats[vehicletype-400])
continue;
GetVehicleSeatPos(vehicleid, i, x, y, z);
static const seat_name[][] =
{
"Водительское",
"Перед. пасс.",
"Зад. лев. пасс.",
"Зад. прав. пасс."
};
CreateDynamic3DTextLabel(seat_name[i], -1, x, y, z, 5.0);
}
}
SetPlayerPos(playerid, 2137.2124, -2493.8198-10.0, 13.5469);
return 1;
}
stock GetVehicleSeatPos(vehicleid, seatid, &Float:x, &Float:y, &Float:z)
{
switch(seatid)
{
case 0:
{
new Float:veh_pos_x;
new Float:veh_pos_y;
new Float:veh_pos_z;
GetVehiclePos(vehicleid, veh_pos_x, veh_pos_y, veh_pos_z);
new Float:v_wide;
new Float:buff;
new model = GetVehicleModel(vehicleid);
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_SIZE, v_wide, buff, buff);
new Float:seat_x;
new Float:seat_y;
new Float:seat_z;
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_FRONTSEAT, seat_x, seat_y, seat_z);
x = veh_pos_x+seat_x/2.0-v_wide/2.0;
y = veh_pos_y + seat_y;
z = veh_pos_z + seat_z;
return 1;
}
case 1:
{
new Float:veh_pos_x;
new Float:veh_pos_y;
new Float:veh_pos_z;
GetVehiclePos(vehicleid, veh_pos_x, veh_pos_y, veh_pos_z);
new Float:v_wide;
new Float:buff;
new model = GetVehicleModel(vehicleid);
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_SIZE, v_wide, buff, buff);
new Float:seat_x;
new Float:seat_y;
new Float:seat_z;
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_FRONTSEAT, seat_x, seat_y, seat_z);
x = veh_pos_x-seat_x/2.0+v_wide/2.0;
y = veh_pos_y + seat_y;
z = veh_pos_z + seat_z;
return 1;
}
case 2:
{
new Float:veh_pos_x;
new Float:veh_pos_y;
new Float:veh_pos_z;
GetVehiclePos(vehicleid, veh_pos_x, veh_pos_y, veh_pos_z);
new Float:v_wide;
new Float:buff;
new model = GetVehicleModel(vehicleid);
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_SIZE, v_wide, buff, buff);
new Float:seat_x;
new Float:seat_y;
new Float:seat_z;
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_REARSEAT, seat_x, seat_y, seat_z);
x = veh_pos_x+seat_x/2.0-v_wide/2.0;
y = veh_pos_y + seat_y;
z = veh_pos_z + seat_z;
return 1;
}
case 3:
{
new Float:veh_pos_x;
new Float:veh_pos_y;
new Float:veh_pos_z;
GetVehiclePos(vehicleid, veh_pos_x, veh_pos_y, veh_pos_z);
new Float:v_wide;
new Float:buff;
new model = GetVehicleModel(vehicleid);
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_SIZE, v_wide, buff, buff);
new Float:seat_x;
new Float:seat_y;
new Float:seat_z;
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_REARSEAT, seat_x, seat_y, seat_z);
x = veh_pos_x-seat_x/2.0+v_wide/2.0;
y = veh_pos_y + seat_y;
z = veh_pos_z + seat_z;
return 1;
}
}
return 0;
}
stock GetNearestVehicleID(playerid, Float:radius = FLOAT_INFINITY)
{
new vehicleid = INVALID_VEHICLE_ID;
new Float: dist;
new Float: pos_x, Float: pos_y, Float: pos_z;
GetPlayerPos(playerid, pos_x, pos_y, pos_z);
for(new idx; idx < MAX_VEHICLES; idx ++)
{
if(!IsValidVehicle(idx)) continue;
if(!IsVehicleStreamedIn(idx, playerid)) continue;
dist = GetVehicleDistanceFromPoint(idx, pos_x, pos_y, pos_z);
if(dist < radius)
{
radius = dist,
vehicleid = idx;
}
}
return vehicleid;
}
В итоге на всё у меня ушло не больше 10 минут и знаний по тригонометрии я, при этом, применил ровно 0.
Единственное, что потребуется - это, скорее всего, написать отдельные формулы (точнее, продублировать и подредактировать текущие) для всякого специфического транспорта, по типу автобусов или самолётов (у одного из автобусов GetVehicleModelInfo либо не возвращает правильно координаты пассажирской двери, либо возвращает их под вторым или третьим ID, а написанный мной скрипт выведет только первые две. Так же с самолётами - GetVehicleModelInfo у некоторых самолётов вернёт позицию у начала крыльев, а не у дверей).
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot