AirKite Posted February 7, 2011 Share Posted February 7, 2011 (edited) Собственно вот решил поучить Lua, MTA методом тыка На вики накапал функции различные и решил сделать синхронизированный поворот головы персонажа, в ту сторону куда вы смотрите с помощью мышки. Сама функция клиентская поэтому пришлось делать НЕЧТО Проблема в том что синхронизация не получается, к тому же я так и не понял возможно ли на клиенте повернуть чужую голову или нет. Помогите пожалуйста что где и как. Если не сложно укажите на все ошибки (код ведь совсем маленький). Server-Side: function FSendHeadData (playerhead, x, y, z) for i,player in ipairs(getElementsByType("player")) do triggerClientEvent( "setMoveHead", player, playerhead, x, y, z) end end addEvent( "SendHeadData", true ) addEventHandler( "SendHeadData", getRootElement(), FSendHeadData ) Client-Side: addEventHandler( "onClientResourceStart", getRootElement( ), function () setTimer(MoveHead, 500, 0) end ) function FsetMoveHead(player, x, y, z) setPedLookAt(player, x, y, z , -1) end addEvent( "setMoveHead", true ) addEventHandler( "setMoveHead", getLocalPlayer(), FsetMoveHead) function MoveHead() local w, h = guiGetScreenSize() local x, y, z = getWorldFromScreenPosition (w/2, h/2, 10) triggerServerEvent ( "SendHeadData", getLocalPlayer(), getLocalPlayer(), x, y, z) end p.s. некоторые части я совсем не понимаю и написал методом тыка по сути Edited February 8, 2011 by Guest Link to comment
ference Posted February 7, 2011 Share Posted February 7, 2011 Зачем изобретать велосипед? Поворот головы в MTA уже давно реализован. Или реализован в одном из стандартных ресурсов, я не уверен. Link to comment
AirKite Posted February 7, 2011 Author Share Posted February 7, 2011 divine, вот сначала найди этот ресурс, а потом смело делай заявления о том что это уже есть. Это во первых. Во вторых научись читать, я чётко написал для чего эта тема и почему я её создал. Мне нужна помощь, разобраться что я сделал не так. Не разбираешься в скриптинге, не чем не можешь помочь не пиши. Спасибо Link to comment
DakiLLa Posted February 7, 2011 Share Posted February 7, 2011 Синронизовать поворот головы не получится, удаленные игроки тупо смотрят в точку (0, 0, 0). Баг на багтрекере. Так что вариант только для клиента. Link to comment
MX_Master Posted February 7, 2011 Share Posted February 7, 2011 Канеш, мона придумать еще более бесполезную вещь, но этой идее я даю 6 из 10. Я не думаю, что автор прислушается, но изучать лучше, начав создавать что-то действительно полезное. Я так и поступил. Link to comment
ference Posted February 7, 2011 Share Posted February 7, 2011 divine, вот сначала найди этот ресурс, а потом смело делай заявления о том что это уже есть. Такая фича есть, инфа 100%. Во вторых научись читать, я чётко написал для чего эта тема и почему я её создал А я разве не чётко написал >Зачем изобретать велосипед? Не разбираешься в скриптинге Ахахахахаха Link to comment
Kernell Posted February 7, 2011 Share Posted February 7, 2011 Канеш, мона придумать еще более бесполезную вещь, но этой идее я даю 6 из 10.Я не думаю, что автор прислушается, но изучать лучше, начав создавать что-то действительно полезное. Я так и поступил. Фишка - вообще это фишка как бы. Мелочь а приятно (: divine, вот сначала найди этот ресурс, а потом смело делай заявления о том что это уже есть. Такая фича есть, инфа 100%. Во вторых научись читать, я чётко написал для чего эта тема и почему я её создал А я разве не чётко написал >Зачем изобретать велосипед? Не разбираешься в скриптинге Ахахахахаха divine, ты посты набивать пришёл? Я вот ничего полезного от тебя не увидел и не прочитал, в итоге сделал вывод, что ты флудер. Link to comment
lil Toady Posted February 7, 2011 Share Posted February 7, 2011 МТА уже сама синхронизирует куда смотрит камера у игроков, поэтому все что надо это в onClientRender пустить цикл через игроков поблизости с помощью getElementsByType ( "player", getRootElement(), true ) - где последняя true означает только тех кто в сейчас в зоне видимости, а затем использовать getPedCameraRotation (только по оси x) и расчитать координаты, либо getPedTargetEnd. И да, есть этот баг про который сказали выше, но там дело именно в этом аргументе времени, на каком-то значении точно работает. У меня был такой скрипт но потерялся Link to comment
AirKite Posted February 7, 2011 Author Share Posted February 7, 2011 МТА уже сама синхронизирует куда смотрит камера у игроков, поэтому все что надо это в onClientRender пустить цикл через игроков поблизости с помощью getElementsByType ( "player", getRootElement(), true ) - где последняя true означает только тех кто в сейчас в зоне видимости, а затем использовать getPedCameraRotation (только по оси x) и расчитать координаты, либо getPedTargetEnd.И да, есть этот баг про который сказали выше, но там дело именно в этом аргументе времени, на каком-то значении точно работает. У меня был такой скрипт но потерялся Немного не понял, пока. Но ведь существует баг, который на клиентской стороне поворачивает голову setPedLookAt только на себя и ботов. А на остальных игроков он применяется как на координаты 0 0 0. Link to comment
lil Toady Posted February 7, 2011 Share Posted February 7, 2011 Я же говорю, что бага такая есть, но там что-то нам ныне неизвестное, что зависит от аргумента времени, попробуй поставить его на 10000, на каком-то значении точно работает (это небольшой такой обход бага) Link to comment
AirKite Posted February 7, 2011 Author Share Posted February 7, 2011 Я же говорю, что бага такая есть, но там что-то нам ныне неизвестное, что зависит от аргумента времени, попробуй поставить его на 10000, на каком-то значении точно работает (это небольшой такой обход бага) Спасибо за информацию Ну надоже, выходит мой скрипт полностью рабоче способный. Кстати насчё getCameraRotation, а чем мой вариант плох? Link to comment
lil Toady Posted February 7, 2011 Share Posted February 7, 2011 Твой метод сойдет, но ты синхронизируешь сам, а то что я предлагал не надо синхронизировать, мта это уже сделала Link to comment
AirKite Posted February 7, 2011 Author Share Posted February 7, 2011 тоесть на клиент сайд можно узнать камеру тех кто вокруге? Link to comment
lil Toady Posted February 7, 2011 Share Posted February 7, 2011 Да, именно это я и говорил Link to comment
Kernell Posted February 8, 2011 Share Posted February 8, 2011 Разница лишь в том, что getPedTargetEnd даёт координаты цели, т.е. что бы вертелась голова, тебе нужно постоянно держать клавишу прицеливания. Link to comment
Easterdie Posted February 8, 2011 Share Posted February 8, 2011 давайте забаним самого умного тролля дивайна, он уже поконфликтовал с тремя людьми Link to comment
lil Toady Posted February 8, 2011 Share Posted February 8, 2011 Разница лишь в том, что getPedTargetEnd даёт координаты цели, т.е. что бы вертелась голова, тебе нужно постоянно держать клавишу прицеливания. На сколько я помню она работает когда и не целишься. Link to comment
Kernell Posted February 8, 2011 Share Posted February 8, 2011 Разница лишь в том, что getPedTargetEnd даёт координаты цели, т.е. что бы вертелась голова, тебе нужно постоянно держать клавишу прицеливания. На сколько я помню она работает когда и не целишься. Я проверил - когда целишься. Link to comment
Kay-D Posted February 8, 2011 Share Posted February 8, 2011 Аир можеш скрипт выложить в паблик? Link to comment
AirKite Posted February 8, 2011 Author Share Posted February 8, 2011 Аир можеш скрипт выложить в паблик? Скрипт в первом посте, только зачем он нужен если всё равно функция не работает... Вообще печально, в баг трекере с 2009 года, баг вроде бы не серьёзный но не поправили досих пор. Link to comment
Lex128 Posted October 5, 2011 Share Posted October 5, 2011 По тестировал эту функцию setPedLookAt на удаленных игроках и что получилось: Первое использование ставит взгляд правильно, но последующие не меняют взгляд, даже если голову возвратить обратно (time = 0), то при новом использовании setPedLookAt голова поворачивается с точку, что была задана в первый раз, независимо от новых координат... Ещё используя параметр target, установив его на себя (localPlayer), игроки смотрели всегда в таком же направлении что и моя голова, также независимо от выставленных им координат. Найдя в исходниках MTA определение это функции обнаружил аргумент iBlend, про который на вики почему-то не написали... Проводя эксперименты с фиксом этого "первоначального взгляда", попробовал setPedAimTarget на игроке и... его взгляд вдруг обновился Но опять же это работало не всегда (из-за какого-то бага с функцией setPedAimTarget, когда прицел педа направляется в никуда) Короче, как я понял при использовании setPedLookAt на игроке, ему выставляется "прицел" в эту точку (getPedTargetEnd показывает туже самую точку), и при дальнейшем использовании setPedLookAt этот прицел ему не меняется и игрок смотрит всегда туда же. А при изменении ему прицела setPedAimTarget на другую точку, следующий взгляд setPedLookAt будет туда же, в новый прицел. И всё бы хорошо, но функция setPedLookAt иногда выставляет игроку/педу прицел в никуда (при этом getPedTargetEnd возвращает бесконечные величины) вот из-за этого же и взгляд не обновить Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now