Плавная остановка персонажа при достижении координат

Dmitriy Makarov

25.05.2021
Автор темы
Проверенный
2,478
1,113
Версия MoonLoader
.027.0-preview
Привет. Делал тут кое-что и столкнулся с неприятным моментом. Попробовал данный код в действии:
При достижении координат, персонаж то-ли сбивает анимацию, то ли телепортируется на эти координаты заново (на видео). Можно исправить этот момент и сделать имитацию отпускания клавиши бега? Чтобы со стороны казалось, что игрок добежал до координат и отпустил клавишу бега?
Lua:
local state = false

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand("walk", function()
        state = true
    end)
    while true do wait(0)
        if state then
            taskCharSlideToCoord(PLAYER_PED, 0, 0, 0, 0, 1)
            local mX, mY, mZ = getCharCoordinates(PLAYER_PED)
            if getDistanceBetweenCoords3d(0, 0, 0, mX, mY, mZ) > 2 then
                setGameKeyState(16, 1)
            else
                state = false
            end
        end
    end
end

require("lib.samp.events").onSendPlayerSync = function(data)
    if state then
        data.upDownKeys = 65408
    end
end
 

P U L V I L I Z A T O R

Участник
84
29
Есть такая функция как taskCharSlideToCoordAndPlayAnim(Ped ped, float toX, float toY, float toZ, float angle, float radius, string animation, int ifp1, float ifp2, bool LA, bool LX, bool LY, bool LF, int LT), но я без понятия как ей воспользоваться. Попробовал вставлять аргументы из функции
taskPlayAnim, но результата это не показало. Я там в исходнике нашёл, что при определенной дистанции отрубается цикл путем enabled false. Попробовал перед enabaled = false поставить вызов анимации с 0 секунд и когда ПЕД доходит до конца, то эта анимация типа отыгрывается и за ней следует анимация "остановки после бега". Костыль, но работает. Хуй знает как сделать лучше, по идее должна корректно работать taskCharSlideToCoordAndPlayAnim.

1707264965385.png


В твоем случае такой вариант работает

Пример:
local state = false

function main()

    while not isSampAvailable() do wait(0) end

    sampRegisterChatCommand("walk", function()

        state = true

    end)

    while true do wait(0)

        if state then

            local mX, mY, mZ = getCharCoordinates(PLAYER_PED)

            taskCharSlideToCoord(PLAYER_PED, 0, 0, 0, 0, 1)

            if getDistanceBetweenCoords3d(0, 0, 0, mX, mY, mZ) > 5 then

                setGameKeyState(16, 1)

            else

                taskPlayAnim(PLAYER_PED, "WF_FWD", "WAYFARER", 0, false, false, false, false, -1)

                state = false

            end

        end

    end

end

require("lib.samp.events").onSendPlayerSync = function(data)

    if state then

        data.upDownKeys = 65408

    end

end
 
Последнее редактирование:

Dmitriy Makarov

25.05.2021
Автор темы
Проверенный
2,478
1,113
Есть такая функция как taskCharSlideToCoordAndPlayAnim(Ped ped, float toX, float toY, float toZ, float angle, float radius, string animation, int ifp1, float ifp2, bool LA, bool LX, bool LY, bool LF, int LT), но я без понятия как ей воспользоваться. Попробовал вставлять аргументы из функции
taskPlayAnim, но результата это не показало. Я там в исходнике нашёл, что при определенной дистанции отрубается цикл путем enabled false. Попробовал перед enabaled = false поставить вызов анимации с 0 секунд и когда ПЕД доходит до конца, то эта анимация типа отыгрывается и за ней следует анимация "остановки после бега". Костыль, но работает. Хуй знает как сделать лучше, по идее должна корректно работать taskCharSlideToCoordAndPlayAnim.

Посмотреть вложение 231352

В твоем случае такой вариант работает

Пример:
local state = false

function main()

    while not isSampAvailable() do wait(0) end

    sampRegisterChatCommand("walk", function()

        state = true

    end)

    while true do wait(0)

        if state then

            local mX, mY, mZ = getCharCoordinates(PLAYER_PED)

            taskCharSlideToCoord(PLAYER_PED, 0, 0, 0, 0, 1)

            if getDistanceBetweenCoords3d(0, 0, 0, mX, mY, mZ) > 5 then

                setGameKeyState(16, 1)

            else

                taskPlayAnim(PLAYER_PED, "WF_FWD", "WAYFARER", 0, false, false, false, false, -1)

                state = false

            end

        end

    end

end

require("lib.samp.events").onSendPlayerSync = function(data)

    if state then

        data.upDownKeys = 65408

    end

end
В большинстве случаев не срабатывает.. 😧
В первые разы срабатывало, а сейчас, почему-то, нет...
(Скрипт в теме у меня работает так же)
 

P U L V I L I Z A T O R

Участник
84
29
В большинстве случаев не срабатывает.. 😧
В первые разы срабатывало, а сейчас, почему-то, нет...
(Скрипт в теме у меня работает так же)
В исходнике за то стабильно работает такой костыль. Попробуй посмотреть в чем там разница принципиальная между твоим и первоисточником. Возможно, есть вариант по другому реализовать этот костыль, поиграйся с этим.