PDA

Просмотр полной версии : [Вопрос] VehicleParamsEx <Закрыто>



gambit26
20.01.2016, 09:36
Ситуация такова:
Существует некая команда, которая запускает двигатель у автомобиля. Эта команда сначала берёт параметры автомобиля и, в зависимости от состояния параметра engine, запускает либо глушит двигатель. Я решил отследить этот параметр.


GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры
printf("step 1 | engine - %d", engine);//вывожу в лог состояние параметра engine
if(engine < 1)//если двигатель заглушен
{
print("start engine");//сообщаю в лог, что происходит запуск двигателя
SetVehicleParamsEx(GetPlayerVehicleID(playerid),1,lights,alarm,doors,bonnet,boot,objective);//запускаю двигатель
return printf("step 2 | engine - %d", engine);//вывожу в лог новое состояние параметра engine
}
else//если двигатель запущен
{
print("stop engine");//сообщаю в лог, что происходит остановка двигателя
SetVehicleParamsEx(GetPlayerVehicleID(playerid),0,lights,alarm,doors,bonnet,boot,objective);//глушу двигатель
return printf("step 2 | engine - %d", engine);//вывожу в лог новое состояние параметра engine
}

Всё прекрасно, двигатель действительно запускается и глушится тогда, когда это нужно. Компилируется тоже всё отлично. То есть, нареканий никаких нет. Но вот если открыть логи...

[08:23:13]
//запуск двигателя
step 1 | engine - 0 //двигатель заглушен, лог говорит то же самое
[08:23:13] start engine //начинаем запуск
[08:23:13] step 2 | engine - 0 //в игре двигатель запущен, но логи говорят, что по прежнему заглушен
//теперь заглушу двигатель
[08:23:25] step 1 | 1 //двигатель запущен, лог говорит то же самое (непонятно, как так получилось, если на предыдущем шаге логи показывали нам engine = 0 после запуска двигателя. а сейчас на этом же автомобиле, через 12 секунд engine равен 1)
[08:23:25] stop engine //глушим двигатель
[08:23:25] step 2 | 1 //в игре двигатель заглушен, но логи говорят, что по прежнему запущен

Пойдём дальше. Я запилил ещё одну команду, которая будет возвращать состояние engine в консоль.

return printf("test command | engine - %d", engine);

И действительно, когда я использую команду запуска двигателя, в игре он запускается. Но при использовании второй команды логи показывают, что двигатель заглушен. Теперь мы получаем такую картину:

[08:23:13]
//запуск двигателя
step 1 | engine - 0 //двигатель заглушен, лог говорит то же самое
[08:23:13] start engine //начинаем запуск
[08:23:13] step 2 | engine - 0 //в игре двигатель запущен, но логи говорят, что по прежнему заглушен
[08:23:14] test command | engine - 0 //в игре двигатель запущен, но логи говорят, что по прежнему заглушен
[08:23:15] test command | engine - 0 //в игре двигатель запущен, но логи говорят, что по прежнему заглушен
[08:23:16] test command | engine - 0 //в игре двигатель запущен, но логи говорят, что по прежнему заглушен

А теперь вопрос: Как всё это объяснить?

P.S. Может у кого-то возникнет вопрос, для чего я вообще в этом копаюсь, ведь в игре всё работает.
Ответ: пишу функцию, в которой нужно корректное отображение состояния engine.

Fantom
20.01.2016, 10:05
GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры
printf("step 1 | engine - %d", engine);//вывожу в лог состояние параметра engine
if(engine < 1)//если двигатель заглушен
{
engine = 1;
print("start engine");//сообщаю в лог, что происходит запуск двигателя
SetVehicleParamsEx(GetPlayerVehicleID(playerid), engine,lights,alarm,doors,bonnet,boot,objective);//запускаю двигатель
return printf("step 2 | engine - %d", engine);//вывожу в лог новое состояние параметра engine
}
else//если двигатель запущен
{
engine = 0;
print("stop engine");//сообщаю в лог, что происходит остановка двигателя
SetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//глушу двигатель
return printf("step 2 | engine - %d", engine);//вывожу в лог новое состояние параметра engine
}

DeimoS
20.01.2016, 10:24
Эмм, хоть ответ выше и поможет, но он не раскрывает суть проблемы. А нужно было просто обновить данные в переменных...

GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры
printf("step 1 | engine - %d", engine);//вывожу в лог состояние параметра engine
if(engine < 1)//если двигатель заглушен
{
print("start engine");//сообщаю в лог, что происходит запуск двигателя
SetVehicleParamsEx(GetPlayerVehicleID(playerid),1,lights,alarm,doors,bonnet,boot,objective);//запускаю двигатель
GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры
return printf("step 2 | engine - %d", engine);//вывожу в лог новое состояние параметра engine
}
else//если двигатель запущен
{
print("stop engine");//сообщаю в лог, что происходит остановка двигателя
SetVehicleParamsEx(GetPlayerVehicleID(playerid),0,lights,alarm,doors,bonnet,boot,objective);//глушу двигатель
GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры
return printf("step 2 | engine - %d", engine);//вывожу в лог новое состояние параметра engine
}
Ибо ты показываешь те данные, что были до изменения значения. И лучше ID авто тоже записать в переменную, а не вызывать GetPlayerVehicleID по несколько раз

gambit26
20.01.2016, 13:46
Эмм, хоть ответ выше и поможет, но он не раскрывает суть проблемы. А нужно было просто обновить данные в переменных...

Как всегда, невнимательность - лучшая подруга :) спасибо что подсказал.


И лучше ID авто тоже записать в переменную, а не вызывать GetPlayerVehicleID по несколько раз

Почему?

UPD: Странная чушь происходит. Заметил вот такую тему:
Когда используешь эту команду, то она устанавливает engine = 1 не только для транспорта, в котором сидишь, но и для транспорта с ID = 0.


GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры
printf("step 1 | engine - %d", engine);//вывожу в лог состояние параметра engine
if(engine < 1)//если двигатель заглушен
{
print("start engine");//сообщаю в лог, что происходит запуск двигателя
SetVehicleParamsEx(GetPlayerVehicleID(playerid),1,lights,alarm,doors,bonnet,boot,objective);//запускаю двигатель
GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры
printf("step 2 | vehicle - %d | engine - %d", GetPlayerVehicleID(playerid), engine);//вывожу в лог новое состояние параметра engine для своего транспорта
GetVehicleParamsEx(0,engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры транспорта с ID = 0
printf("step 2 | engine - %d", engine);//вывожу в лог новое состояние параметра engine
}



[12:44:37] step 1 | vehicle - 65 | engine - 0
[12:44:37] step 1 | vehicle - 0 | engine - 0
[12:44:37] start engine
[12:44:37] step 2 | vehicle - 65 | engine - 1
[12:44:37] step 2 | vehicle - 0 | engine - 1

Fantom
20.01.2016, 13:53
GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры
printf("step 1 | engine - %d", engine);//вывожу в лог состояние параметра engine
if(engine < 1)//если двигатель заглушен
{
engine = 1;
print("start engine");//сообщаю в лог, что происходит запуск двигателя
SetVehicleParamsEx(GetPlayerVehicleID(playerid), engine,lights,alarm,doors,bonnet,boot,objective);//запускаю двигатель
return printf("step 2 | engine - %d", engine);//вывожу в лог новое состояние параметра engine
}
else//если двигатель запущен
{
engine = 0;
print("stop engine");//сообщаю в лог, что происходит остановка двигателя
SetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//глушу двигатель
return printf("step 2 | engine - %d", engine);//вывожу в лог новое состояние параметра engine
}


Мда.

gambit26
20.01.2016, 14:01
GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры
printf("step 1 | engine - %d", engine);//вывожу в лог состояние параметра engine
if(engine < 1)//если двигатель заглушен
{
engine = 1;
print("start engine");//сообщаю в лог, что происходит запуск двигателя
SetVehicleParamsEx(GetPlayerVehicleID(playerid), engine,lights,alarm,doors,bonnet,boot,objective);//запускаю двигатель
return printf("step 2 | engine - %d", engine);//вывожу в лог новое состояние параметра engine
}
else//если двигатель запущен
{
engine = 0;
print("stop engine");//сообщаю в лог, что происходит остановка двигателя
SetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//глушу двигатель
return printf("step 2 | engine - %d", engine);//вывожу в лог новое состояние параметра engine
}


Мда.

Да я это видел... Этот вариант идентичен тому, только на одно действие больше.

DeimoS
20.01.2016, 19:47
Почему?

Ну а зачем сервер заставлять по несколько раз обращаться к игроку, нагружая тем самым канал связи, когда можно 1 раз узнать и потом уже работать с этой информацией?


Да я это видел... Этот вариант идентичен тому, только на одно действие больше.

Его вариант, по-сути, оптимизированее, ибо функцию лишний раз не вызываем :) Я свой дал только для того, чтоб ты причину проблемы понял.

Только тогда лучше так, раз уж краткость - сестра таланта

new vehicleid = GetPlayerVehicleID(playerid);
GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры
printf("step 1 | engine - %d", engine);//вывожу в лог состояние параметра engine
if(!engine)//если двигатель заглушен
{
engine = 1;
print("start engine");//сообщаю в лог, что происходит запуск двигателя
printf("step 2 | engine - %d", engine);//вывожу в лог новое состояние параметра engine
}
else//если двигатель запущен
{
engine = 0;
print("stop engine");//сообщаю в лог, что происходит остановка двигателя
printf("step 2 | engine - %d", engine);//вывожу в лог новое состояние параметра engine
}
SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);


Странная чушь происходит. Заметил вот такую тему:
Когда используешь эту команду, то она устанавливает engine = 1 не только для транспорта, в котором сидишь, но и для транспорта с ID = 0.
Если и в том варианте, что дан у меня, такое будет, скинь полностью весь код

gambit26
20.01.2016, 20:16
Если и в том варианте, что дан у меня, такое будет, скинь полностью весь код

так я же его и кинул



GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры
printf("step 1 | engine - %d", engine);//вывожу в лог состояние параметра engine
if(engine < 1)//если двигатель заглушен
{
print("start engine");//сообщаю в лог, что происходит запуск двигателя
SetVehicleParamsEx(GetPlayerVehicleID(playerid),1,lights,alarm,doors,bonnet,boot,objective);//запускаю двигатель
GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры
printf("step 2 | vehicle - %d | engine - %d", GetPlayerVehicleID(playerid), engine);//вывожу в лог новое состояние параметра engine для своего транспорта
GetVehicleParamsEx(0,engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры транспорта с ID = 0
printf("step 2 | engine - %d", engine);//вывожу в лог новое состояние параметра engine
}



[12:44:37] step 1 | vehicle - 65 | engine - 0
[12:44:37] step 1 | vehicle - 0 | engine - 0
[12:44:37] start engine
[12:44:37] step 2 | vehicle - 65 | engine - 1
[12:44:37] step 2 | vehicle - 0 | engine - 1

Daniel_Cortez
20.01.2016, 20:17
Ну а зачем сервер заставлять по несколько раз обращаться к игроку, нагружая тем самым канал связи, когда можно 1 раз узнать и потом уже работать с этой информацией?
Функции SA:MP возвращают данные об игроке, которые сервер получил при последнем обновлении (т.е. перед последним вызовом OnPlayerUpdate). Никакой дополнительной нагрузки на канал связи от них нет.



Почему?
Вызов нативной функции сам по себе занимает время из-за перехода из вирт. машины на нативный код и обратно, и из-за передачи параметров из ВМ.
Если нативная функция при нескольких вызовах с одними и теми же параметрами возвращает одинаковые значения - есть смысл вызвать функцию только один раз и записать результат в переменную.

Впрочем, если вам нравидся садо-мазохизм с религиозным отказом от использования переменных и нагрузкой сервера лишними вызовами нативок - ваше право.

Fantom
20.01.2016, 21:18
Функции SA:MP возвращают данные об игроке, которые сервер получил при последнем обновлении (т.е. перед последним вызовом OnPlayerUpdate). Никакой дополнительной нагрузки на канал связи от них нет.



Вызов нативной функции сам по себе занимает время из-за перехода из вирт. машины на нативный код и обратно, и из-за передачи параметров из ВМ.
Если нативная функция при нескольких вызовах с одними и теми же параметрами возвращает одинаковые значения - есть смысл вызвать функцию только один раз и записать результат в переменную.

Впрочем, если вам нравидся садо-мазохизм с религиозным отказом от использования переменных и нагрузкой сервера лишними вызовами нативок - ваше право.

Хоть и оффтоп, но спрошу, как ты поставил картинку в подпись? :xd:

gambit26
20.01.2016, 21:58
Функции SA:MP возвращают данные об игроке, которые сервер получил при последнем обновлении (т.е. перед последним вызовом OnPlayerUpdate). Никакой дополнительной нагрузки на канал связи от них нет.



Вызов нативной функции сам по себе занимает время из-за перехода из вирт. машины на нативный код и обратно, и из-за передачи параметров из ВМ.
Если нативная функция при нескольких вызовах с одними и теми же параметрами возвращает одинаковые значения - есть смысл вызвать функцию только один раз и записать результат в переменную.

Впрочем, если вам нравидся садо-мазохизм с религиозным отказом от использования переменных и нагрузкой сервера лишними вызовами нативок - ваше право.

спасибо, учту.

Теперь бы по теме что-нибудь услышать.

gambit26
22.01.2016, 17:05
Актуально..

gambit26
25.01.2016, 15:14
up...

DeimoS
25.01.2016, 17:42
Собстно, а в чём проблема? Автомобиля под ID 0 существовать чисто теоретически не может, ибо транспорт создаётся с ID 1. Так что ты проверяешь несуществующий транспорт

gambit26
25.01.2016, 23:44
Автомобиля под ID 0 существовать чисто теоретически не может

может, существует

Роуди.
25.01.2016, 23:46
может, существует

Почему ты так любишь спорить? Покажи мне автомобиль, который создается под идом 0?

DeimoS
26.01.2016, 00:01
может, существует

Что значит "может"? -_- SA-MP создаёт автомобили начиная с первого ID и нет никакого "может" тут.
Не веришь - проверь сам. В OnGameModeInIt

printf("Первый ID автомобиля - %d", CreateVehicle(520, 0.0, 0.0, 0.0, 0.0, -1, -1, 300));