[RakSamp] проблема с кватернион, анимками

demon44482

Участник
Автор темы
17
3
Версия MoonLoader
Другое
код данный что бы бежать на координаты, но вопервых, анимки которые я ставлю сбиваються через секунд 2-3, а при установке кватерниона, кикается, я его хотел ставить что бы бот смотрел в сторону координат на которую идет, ну а анимку что бы была анимация того же бега, щас только анимка обычной ходьбы. код ниже

Lua:
require("libs/addon")
require("libs/Tasking")
local sampev = require "samp.events"
local password = "874090123140"

function sampev.onSendSpawn()
    sleep(2000)
    runToPosition(1674.5709228516, -1738.1187744141)
end

function sampev.onShowDialog(id, style, title, btn1, btn2, text)
    if title:match("Пароль") then
        sendDialogResponse(id, 1, 0, password)
    end
    if title:match("Выберите ваш пол") then
        sendDialogResponse(id, 1, 0, "")
    end
    if title:match("Выберите цвет кожи") then
        sendDialogResponse(id, 1, 0, password)
    end
    if title:match("Откуда вы о нас узнали?") then
        sendDialogResponse(id, 1, 0, "")
    end
    if title:match("Авторизация") then
        sendDialogResponse(id, 1, 0, password)
    end
end

function sampev.onShowTextDraw(id, data)
    if data.position.x == 233 then
        sendClickTextdraw(id)
    end
end

function samp_create_sync_data(sync_type, copy_from_player)
    local ffi = require 'ffi'
    local sampfuncs = require 'sampfuncs'
    -- from SAMP.Lua
    local raknet = require 'samp.raknet'
    require 'samp.synchronization'

    copy_from_player = copy_from_player or true
    local sync_traits = {
        player = {'PlayerSyncData', raknet.PACKET.PLAYER_SYNC, sampStorePlayerOnfootData},
        vehicle = {'VehicleSyncData', raknet.PACKET.VEHICLE_SYNC, sampStorePlayerIncarData},
        passenger = {'PassengerSyncData', raknet.PACKET.PASSENGER_SYNC, sampStorePlayerPassengerData},
        aim = {'AimSyncData', raknet.PACKET.AIM_SYNC, sampStorePlayerAimData},
        trailer = {'TrailerSyncData', raknet.PACKET.TRAILER_SYNC, sampStorePlayerTrailerData},
        unoccupied = {'UnoccupiedSyncData', raknet.PACKET.UNOCCUPIED_SYNC, nil},
        bullet = {'BulletSyncData', raknet.PACKET.BULLET_SYNC, nil},
        spectator = {'SpectatorSyncData', raknet.PACKET.SPECTATOR_SYNC, nil}
    }
    local sync_info = sync_traits[sync_type]
    local data_type = 'struct ' .. sync_info[1]
    local data = ffi.new(data_type, {})
    local raw_data_ptr = tonumber(ffi.cast('uintptr_t', ffi.new(data_type .. '*', data)))
    -- copy player's sync data to the allocated memory
    if copy_from_player then
        local copy_func = sync_info[3]
        if copy_func then
            local _, player_id
            if copy_from_player == true then
                _, player_id = sampGetPlayerIdByCharHandle(PLAYER_PED)
            else
                player_id = tonumber(copy_from_player)
            end
            copy_func(player_id, raw_data_ptr)
        end
    end
    -- function to send packet
    local func_send = function()
        local bs = bitStream.new()
        bs:writeInt8(sync_info[2])
        bs:writeBuffer(raw_data_ptr, ffi.sizeof(data))
        bs:sendPacketEx(sampfuncs.HIGH_PRIORITY, sampfuncs.UNRELIABLE_SEQUENCED, 1)
        bs:reset()
    end
    -- metatable to access sync data and 'send' function
    local mt = {
        __index = function(t, index)
            return data[index]
        end,
        __newindex = function(t, index, value)
            data[index] = value
        end
    }
    return setmetatable({send = func_send}, mt)
end

function getDistanceBetweenCoords3d(x1, y1, z1, x2, y2, z2)
    local dx = x2 - x1
    local dy = y2 - y1
    local dz = z2 - z1
    return math.sqrt(dx * dx + dy * dy + dz * dz)
end

function runToPosition(x, y)
    local speed = 0.05
    local threshold = 0.5
    local bot_x, bot_y, bot_z = getBotPosition()

    local ANIM_LOOP = 1
    local ANIM_LOCKX = 2
    local ANIM_LOCKY = 4
    local ANIM_FREEZE = 8
    local ANIM_REGULAR = 128

    newTask(function()
        while true do
            local current_x, current_y, current_z = getBotPosition()
            local dx = x - current_x
            local dy = y - current_y
            local dist = math.sqrt(dx * dx + dy * dy)

            if dist < threshold then break end

            local angle = math.atan2(dy, dx)
            local sx = math.cos(angle) * speed
            local sy = math.sin(angle) * speed

            local data = samp_create_sync_data("player", false)
            data.position = {current_x + sx, current_y + sy, current_z}
            data.moveSpeed = {sx * 2, sy * 2, 0}
            data.leftRightKeys = 0
            data.upDownKeys = 128
            data.animationId = 1194
            data.animationFlags = 1
            data.health = getBotHealth()
            data.armor = getBotArmor()
            data.quaternion = {1, 0, 0, 0}
            data.send()
            setBotPosition(current_x + sx, current_y + sy, current_z)
            wait(10)
        end
    end)
end