SA:MP Lua [ARZ] Бот на начальную ферму (бот на деморган)

myzhkk

Новичок
4
0
И что делать если нету папки
 

DracBladus

Участник
115
17
убери пробел, траектория бота при сворачивание или переносе на второй моник ломаеться и постоянный прижок появляеться

Lua:
-- автор Kontix (clean run, no jump)

local state = false
local state_taked = false
local state_harvest = false
local wheat_dist = 1.5
local step = {200, 400}

function GetNearWheat(wheat)
    local table, dist
    for _, k in pairs(wheat) do
        if (not k.peds or (k.dist < wheat_dist and state_harvest))
        and (table == nil or k.dist < dist) then
            table, dist = k, k.dist
        end
    end
    return table
end

-- === ДВИЖЕНИЕ: ТОЛЬКО БЕГ, БЕЗ ПРЫЖКОВ ===
function WalkEngine(active)
    state_harvest = false

    setGameKeyState(1, -255) -- вперёд
    if active then
        setGameKeyState(14, 255) -- постоянный бег
    end
end

function StartWork()
    state = not state
    sampAddChatMessage(
        state and "{DDECFF}Бот на ферму {55FF00}начал работу"
        or "{DDECFF}Бот на ферму {FF0000}завершил работу",
    -1)
    state_taked = false
end

function EngineWork()
    local x, y, z = getCharCoordinates(PLAYER_PED)

    if not state_taked then
        local wheat = {}

        for id = 0, 2047 do
            if sampIs3dTextDefined(id) then
                local str, _, x1, y1, z1 = sampGet3dTextInfoById(id)
                if str:find("Куст на ферме") then
                    table.insert(wheat, {
                        x = x1,
                        y = y1,
                        z = z1,
                        peds = findAllRandomCharsInSphere(x1, y1, z1, 3, false, true),
                        dist = getDistanceBetweenCoords3d(x, y, z, x1, y1, z1)
                    })
                end
            end
        end

        if #wheat == 0 then return end
        wheat = GetNearWheat(wheat)

        if wheat.dist > wheat_dist then
            setCameraPositionUnfixed(
                -0.3,
                math.rad(getHeadingFromVector2d(wheat.x - x, wheat.y - y)) + 4.7
            )
            WalkEngine(true)
        else
            if sampGetPlayerAnimationId(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))) == 163 then
                state_harvest = true
            end
        end
    else
        local x1, y1, z1 = -105.60591125488, 100.61192321777, 3.1171875
        if getDistanceBetweenCoords3d(x, y, z, x1, y1, z1) > 1.5 then
            setCameraPositionUnfixed(
                -0.3,
                math.rad(getHeadingFromVector2d(x1 - x, y1 - y)) + 4.7
            )
            WalkEngine(true)
        end
    end
end

function main()
    math.randomseed(os.time())
    while not isSampAvailable() or not sampIsLocalPlayerSpawned() do wait(0) end

    sampAddChatMessage(
        "{E0BA29}[Ferma Bot] {FFFFFF} Бот загружен! Команда: {E0BA29}/ferma",
    -1)

    sampRegisterChatCommand("ferma", StartWork)

    while true do
        wait(0)
        if state then
            EngineWork()
        end
    end
end

function onReceiveRpc(id, bs)
    if not state then return end

    if id == 113 then
        local playerId = raknetBitStreamReadInt16(bs)
        raknetBitStreamReadInt32(bs)
        raknetBitStreamReadBool(bs)
        local model = raknetBitStreamReadInt32(bs)

        if not state_taked
        and select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)) == playerId
        and model == 2901 then
            state_taked = true
        end

    elseif id == 93 then
        raknetBitStreamReadInt32(bs)
        local len = raknetBitStreamReadInt32(bs)
        local str = raknetBitStreamReadString(bs, len)

        if state_taked and str:find("{FF6347} Теперь Ваш навык фермерства") then
            state_taked = false
        end
    end
end

function sendCustomPacket(text)
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt8(bs, 220)
    raknetBitStreamWriteInt8(bs, 18)
    raknetBitStreamWriteInt16(bs, #text)
    raknetBitStreamWriteString(bs, text)
    raknetBitStreamWriteInt32(bs, 0)
    raknetSendBitStream(bs)
    raknetDeleteBitStream(bs)
end

function onReceivePacket(id, bs)
    if id ~= 220 then return end

    raknetBitStreamIgnoreBits(bs, 8)
    if raknetBitStreamReadInt8(bs) ~= 17 then return end

    raknetBitStreamIgnoreBits(bs, 32)
    local length = raknetBitStreamReadInt16(bs)
    local encoded = raknetBitStreamReadInt8(bs)
    local str = encoded ~= 0
        and raknetBitStreamDecodeString(bs, length + encoded)
        or raknetBitStreamReadString(bs, length)

    if str:find([[window%.executeEvent%('event%.setActiveView', `%["FindGame"%]`%);]]) then
        lua_thread.create(function()
            sendCustomPacket('findGame.finish')
        end)
        return false
    end
end
 
Последнее редактирование:

KitNikitaPolk

Новичок
6
0
По многочисленным просьбам на форуме и в игре я создал бота на начальную ферму
Создавался в основном для отсидки в деморгане
Часть кода взял с других скриптов
Скрипт ТОЛЬКО на носку сена с ног и ВСЁ
Иногда может дергаться камера не обращайте внимание
Бот сам подходит к кусту и стоит примерно 5-7 секунд с пустым экраном ЭТО НОРМА!!!
Активация/деактивация: /ferma
Скрипт работает, особенно на ARZMod (на мобиле). А есть ли похожие боты, которые просто едут по чекпоинтам? И можно ли самому записать маршрут, чтобы он идеально работал на мобилке? Потому что я кучу скриптов перекачал, в которых заявлена такая функция, но они либо не работают, либо, когда пишешь их команду в чате, выдает «неизвестная команда, введите /help». Ну, понятно, короче.