Машрут

eqzzz

Участник
Автор темы
126
19
В общем, пишу бота, который собирает маркеры, но не понимаю, как реализовать, чтобы перс бежал там, где возможно, а не напрямую, тем самым упираясь в здания и т.д

Использую функцию:

Код:
function runToPoint(tox, toy)
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local angle = getHeadingFromVector2d(tox - x, toy - y)
    local xAngle = math.random(-50, 50)/100
    setCameraPositionUnfixed(xAngle, math.rad(angle - 90))
    stopRun = false
    while getDistanceBetweenCoords2d(x, y, tox, toy) > 0.8 do
        setGameKeyState(1, -255)
        setGameKeyState(16, 1)
        wait(1)
        x, y, z = getCharCoordinates(PLAYER_PED)
        angle = getHeadingFromVector2d(tox - x, toy - y)
        setCameraPositionUnfixed(xAngle, math.rad(angle - 90))
        if stopRun then
            stopRun = false
            break
        end
    end
end
 

VanoKLR

Известный
641
373
если маршрут одинаковый, сделай больше контрольных точек
1707745074516.png
 

Vespan

loneliness
Проверенный
2,103
1,633
упираясь в здания и т.д
Если справа близко объект то нажимает кнопку влево шобы отойти чутка от объекта и наоборот
processLineOfSight( x,y,z,xx,yy,zz, true, false, false, true, false)

Или сделать "сетку" куда можно пойти, ну точки разкидать
Потом реализовать граф - каво-чаво
И применить алгоритм дейкстры или другой для создание маршрута по графу-точкам

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

Вот исходник с примером алгоритмом дейкстры - https://www.blast.hk/threads/198094/
Функция дейкстры на луа - https://stackoverflow.com/questions...dijkstras-algorithm-not-working-in-some-cases
Граф реализуешь сам

Или запись маршрута как ты бежишь куда-то, потом когда надо начинаешь воспроизведение записаного маршрута, как бы ты просто отправляешь серверу синхру куда бежишь-едишь
damnnnn:
--1 запись
--= или + запустить

require "moonloader"

play = false
record = false
bytes = {}

function main()
    while true do wait(0)
        if isKeyJustPressed(VK_1) and not sampIsCursorActive() then
            record = not record
            if record then bytes = {} end
            sampAddChatMessage('record: ' .. tostring(record),-1)
            if not record then
                local t = "{"
                for k,v in pairs(bytes) do
                    t = t .. "\t{"
                    for kk,vv in pairs(bytes[k]) do
                        t = t .. "" .. vv .. ', '
                    end
                    t = t .. "},\n"
                end
                t = t .. "}"
                io.open(getWorkingDirectory()..'/__BYTES.txt',"w"):write(t):close()
            end
        end
        if isKeyJustPressed(VK_OEM_PLUS) and not sampIsCursorActive() then
            record = false
            play = not play
            sampAddChatMessage('play: ' .. tostring(play),-1)
            while play do wait(0)
                for k,v in pairs(bytes) do
                    local bs = raknetNewBitStream()
                    for _,vv in pairs(bytes[k]) do
                        raknetBitStreamWriteInt8(bs,vv)
                    end
                    raknetSendBitStream(bs)
                    raknetDeleteBitStream(bs)
                    wait(35)
                end
                play = false
                sampAddChatMessage('fin',-1)
            end
        end
    end
end

function onSendPacket(id,bs)
    if record then
        local p = {}
        for i = 1, raknetBitStreamGetNumberOfBytesUsed(bs) do
            table.insert(p,raknetBitStreamReadInt8(bs))
        end
        table.insert(bytes,p)
    end
    return not play
end
 
Последнее редактирование: