Jump to content

[Help, Lua, Scripting] Повороты головы в сторону камеры.


Recommended Posts

Собственно вот решил поучить Lua, MTA методом тыка :oops:

На вики накапал функции различные и решил сделать синхронизированный поворот головы персонажа, в ту сторону куда вы смотрите с помощью мышки. Сама функция клиентская поэтому пришлось делать НЕЧТО :D

Проблема в том что синхронизация не получается, к тому же я так и не понял возможно ли на клиенте повернуть чужую голову или нет.

Помогите пожалуйста что где и как. Если не сложно укажите на все ошибки (код ведь совсем маленький).

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. некоторые части я совсем не понимаю и написал методом тыка по сути :mrgreen:

Edited by Guest
Link to comment

divine, вот сначала найди этот ресурс, а потом смело делай заявления о том что это уже есть. Это во первых. Во вторых научись читать, я чётко написал для чего эта тема и почему я её создал. Мне нужна помощь, разобраться что я сделал не так. Не разбираешься в скриптинге, не чем не можешь помочь не пиши. Спасибо :)

Link to comment

Канеш, мона придумать еще более бесполезную вещь, но этой идее я даю 6 из 10.

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

Link to comment
divine, вот сначала найди этот ресурс, а потом смело делай заявления о том что это уже есть.

Такая фича есть, инфа 100%.

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

А я разве не чётко написал >Зачем изобретать велосипед?

Не разбираешься в скриптинге

Ахахахахаха

Link to comment
Канеш, мона придумать еще более бесполезную вещь, но этой идее я даю 6 из 10.

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

Фишка - вообще это фишка как бы. Мелочь а приятно (:

divine, вот сначала найди этот ресурс, а потом смело делай заявления о том что это уже есть.

Такая фича есть, инфа 100%.

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

А я разве не чётко написал >Зачем изобретать велосипед?

Не разбираешься в скриптинге

Ахахахахаха

divine, ты посты набивать пришёл? Я вот ничего полезного от тебя не увидел и не прочитал, в итоге сделал вывод, что ты флудер.

Link to comment

МТА уже сама синхронизирует куда смотрит камера у игроков, поэтому все что надо это в onClientRender пустить цикл через игроков поблизости с помощью getElementsByType ( "player", getRootElement(), true ) - где последняя true означает только тех кто в сейчас в зоне видимости, а затем использовать getPedCameraRotation (только по оси x) и расчитать координаты, либо getPedTargetEnd.

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

Link to comment
МТА уже сама синхронизирует куда смотрит камера у игроков, поэтому все что надо это в onClientRender пустить цикл через игроков поблизости с помощью getElementsByType ( "player", getRootElement(), true ) - где последняя true означает только тех кто в сейчас в зоне видимости, а затем использовать getPedCameraRotation (только по оси x) и расчитать координаты, либо getPedTargetEnd.

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

Немного не понял, пока. Но ведь существует баг, который на клиентской стороне поворачивает голову setPedLookAt только на себя и ботов. А на остальных игроков он применяется как на координаты 0 0 0.

Link to comment

Я же говорю, что бага такая есть, но там что-то нам ныне неизвестное, что зависит от аргумента времени, попробуй поставить его на 10000, на каком-то значении точно работает (это небольшой такой обход бага)

Link to comment
Я же говорю, что бага такая есть, но там что-то нам ныне неизвестное, что зависит от аргумента времени, попробуй поставить его на 10000, на каком-то значении точно работает (это небольшой такой обход бага)

Спасибо за информацию :D Ну надоже, выходит мой скрипт полностью рабоче способный. Кстати насчё getCameraRotation, а чем мой вариант плох? :)

Link to comment

Разница лишь в том, что getPedTargetEnd даёт координаты цели, т.е. что бы вертелась голова, тебе нужно постоянно держать клавишу прицеливания.

Link to comment
Разница лишь в том, что getPedTargetEnd даёт координаты цели, т.е. что бы вертелась голова, тебе нужно постоянно держать клавишу прицеливания.

На сколько я помню она работает когда и не целишься.

Link to comment
Разница лишь в том, что getPedTargetEnd даёт координаты цели, т.е. что бы вертелась голова, тебе нужно постоянно держать клавишу прицеливания.

На сколько я помню она работает когда и не целишься.

Я проверил - когда целишься.

Link to comment
Аир можеш скрипт выложить в паблик?

Скрипт в первом посте, только зачем он нужен если всё равно функция не работает... Вообще печально, в баг трекере с 2009 года, баг вроде бы не серьёзный но не поправили досих пор.

Link to comment
  • 7 months later...

По тестировал эту функцию setPedLookAt на удаленных игроках и что получилось:

  • Первое использование ставит взгляд правильно, но последующие не меняют взгляд, даже если голову возвратить обратно (time = 0), то при новом использовании setPedLookAt голова поворачивается с точку, что была задана в первый раз, независимо от новых координат...
  • Ещё используя параметр target, установив его на себя (localPlayer), игроки смотрели всегда в таком же направлении что и моя голова, также независимо от выставленных им координат.
  • Найдя в исходниках MTA определение это функции обнаружил аргумент iBlend, про который на вики почему-то не написали...
  • Проводя эксперименты с фиксом этого "первоначального взгляда", попробовал setPedAimTarget на игроке и... его взгляд вдруг обновился :) Но опять же это работало не всегда (из-за какого-то бага с функцией setPedAimTarget, когда прицел педа направляется в никуда)

Короче, как я понял при использовании setPedLookAt на игроке, ему выставляется "прицел" в эту точку (getPedTargetEnd показывает туже самую точку), и при дальнейшем использовании setPedLookAt этот прицел ему не меняется и игрок смотрит всегда туда же. А при изменении ему прицела setPedAimTarget на другую точку, следующий взгляд setPedLookAt будет туда же, в новый прицел. И всё бы хорошо, но функция setPedLookAt иногда выставляет игроку/педу прицел в никуда (при этом getPedTargetEnd возвращает бесконечные величины) вот из-за этого же и взгляд не обновить :(

Link to comment

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...