Вход

Просмотр полной версии : [Вопрос] GetVehicleZAngle возвращает старые координаты после вызова SetVehicleZAngle



verteich
02.08.2019, 14:17
Привет, нашел проблему у себя на сервере с системой автобазара, не так давно в теме как узнать координаты перед автомобилем , DeiMos скинул мне такую функцию:
stock GetCoordBonnetVehicle(vehicleid, &Float:x, &Float:y, &Float:z, Float:distance)
{
new
Float:angle,
Float:dis;

dis = dis/2 + distance;
GetVehiclePos(vehicleid, x, y, z);
GetVehicleZAngle(vehicleid, angle);
x -= (dis * floatsin(-angle+180, degrees));
y -= (dis * floatcos(-angle+180, degrees));
return 1;
}
и вот тут у меня возникла проблема
SetVehicleZAngle(GetPlayerVehicleID(playerid), autoBazarInfo[i][autoBazarZAngle]);
GetCoordBonnetVehicle(GetPlayerVehicleID(playerid), x, y, z, 2.5);
В переменной autoBazarZAngle значение 270.0, но функция записывает, старый угол автомобиля, а не новый, и 3dtext:
autoBazarInfo[i][autoBazarLabel2] = CreateDynamic3DTextLabel(string, -1, x, y, z-0.5, 5.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID);
Создается с другой стороны, из за чего такое?

DeimoS
02.08.2019, 15:45
Попробуй вставить код после SetVehicleZAngle в таймер. Возможно, сервер просто не успевает обновить информацию.

Хотя вообще если бы ты обратил внимание на код функции GetCoordBonnetVehicle, то заметил бы, что Z-координата там никак не изменяется и, следовательно, можно в CreateDynamic3DTextLabel вместо "z" указать "autoBazarInfo[i][autoBazarZAngle]".

verteich
02.08.2019, 17:06
Попробуй вставить код после SetVehicleZAngle в таймер. Возможно, сервер просто не успевает обновить информацию.

Хотя вообще если бы ты обратил внимание на код функции GetCoordBonnetVehicle, то заметил бы, что Z-координата там никак не изменяется и, следовательно, можно в CreateDynamic3DTextLabel вместо "z" указать "autoBazarInfo[i][autoBazarZAngle]".

Я указал вместо z угол автомобиля и у меня пропал 3д text

DeimoS
02.08.2019, 18:25
Я указал вместо z угол автомобиля и у меня пропал 3д text

А, сорри. Что-то не вчитался в название переменной и не понял, что это угол поворота машины. Касаемо переменной чушь написал.

Ну попробуй таймер

verteich
02.08.2019, 18:45
А, сорри. Что-то не вчитался в название переменной и не понял, что это угол поворота машины. Касаемо переменной чушь написал.

Ну попробуй таймер

Поставил таймер на 200 мс, все заработало.
Кстати а почему сервер не успевает обновлять информацию?

DeimoS
02.08.2019, 19:04
Ну это уже к серверу вопросы, а не ко мне :)

Можно сделать вот так
stock GetCoordBonnetVehicle(vehicleid, &Float:x, &Float:y, &Float:z, Float:distance, Float:angle = 65535.0)
{
new Float:dis;

dis = dis/2 + distance;
GetVehiclePos(vehicleid, x, y, z);
if(angle == 65535.0)
GetVehicleZAngle(vehicleid, angle);
x -= (dis * floatsin(-angle+180, degrees));
y -= (dis * floatcos(-angle+180, degrees));
return 1;
}
И просто передавать изменённые координаты напрямую в функцию. Тогда можно обойтись без таймера

verteich
02.08.2019, 20:09
Ну это уже к серверу вопросы, а не ко мне :)

Можно сделать вот так
stock GetCoordBonnetVehicle(vehicleid, &Float:x, &Float:y, &Float:z, Float:distance, Float:angle = 65535.0)
{
new
Float:angle,
Float:dis;

dis = dis/2 + distance;
GetVehiclePos(vehicleid, x, y, z);
if(angle == 65535.0)
GetVehicleZAngle(vehicleid, angle);
x -= (dis * floatsin(-angle+180, degrees));
y -= (dis * floatcos(-angle+180, degrees));
return 1;
}
И просто передавать изменённые координаты напрямую в функцию. Тогда можно обойтись без таймера

О, я не мог до этого догадаться) Спасибо, можно закрыть. (у тебя в функции лишняя переменная angle если шо, варнинги + ерроры:blush2:)