Как создать бота

Annanel

Участник
Автор темы
86
8
Версия MoonLoader
Другое
Хотел узнать как можно создать бота который будет брать груз и передвигаться по чекпойнтам
 

RedHolms

Известный
Проверенный
617
360
1. Для передвежения можешь юзать либо:
Lua:
-- доков вообще нету, сам пробуй разные значения mode, и смотри, что они значат
taskGoToCoordAnyMeans(Ped ped, float toX, float toY, float toZ, int mode, Vehicle useCar)
либо:
Lua:
-- вырезано из старого скрипта, что как работает не особо помню
-- помню только что MOVEMODE_*** - режимы ходьбы
local MOVEMODE_AUTO = 0
local MOVEMODE_WALK = 1
local MOVEMODE_RUN = 2
local MOVEMODE_RUNNOJUMP = 3

do
   local _autoMode_Run_Minleght = 5
   local _jumpMinLength = 10

   local function length(vec)
      return math.sqrt((vec.x*vec.x)+(vec.y*vec.y)+(vec.z*vec.z))
   end

   local function sub(a, b)
      return vec3(a.x - b.x, a.y - b.y, a.z - b.z)
   end

   local function _calcAngle(x, y)
      local px, py = getCharCoordinates(PLAYER_PED)
      local plus = 0.0
      local mode = 1
      if px < x and py > y then plus = math.pi/2; mode = 2 end
      if px < x and py < y then plus = math.pi end
      if px > x and py < y then plus = math.pi*1.5; mode = 2 end
      local lx = x - px
      local ly = y - py
      lx = math.abs(lx)
      ly = math.abs(ly)
      if mode == 1 then ly = ly/lx
      else ly = lx/ly end
      ly = math.atan(ly)
      ly = ly + plus
      return ly
   end

   local function _setAngle(x, y, distance, speed)
      setCameraPositionUnfixed(-0.3, _calcAngle(x,y))
   end

   GoToPoint = function(x, y, z, moveMode, runAutoMode)
      local runAutoMode = runAutoMode or MOVEMODE_RUN

      local last_jump_time = winmm.timeGetTime()
      math.randomseed(os.time())
      local cur_jump_mul = math.random(170)

      local target = vec3(x, y, z)

      repeat
         local ppos = vec3(getCharCoordinates(PLAYER_PED))
         local dist_lost = length(sub(vec3(ppos.x, ppos.y, 0), vec3(target.x, target.y, 0)))
         local targetMoveMode = moveMode == MOVEMODE_AUTO and (dist_lost > _autoMode_Run_Minleght and runAutoMode or MOVEMODE_WALK) or moveMode
         _setAngle(target.x, target.y, dist_lost, 0.1)

         setGameKeyState(gkeys.player.GOFORWARD_GOBACK, -255)

         if dist_lost >= _jumpMinLength and targetMoveMode == MOVEMODE_RUN and (winmm.timeGetTime() - last_jump_time) >= 1500 + cur_jump_mul then
            setGameKeyState(gkeys.player.JUMP, 255)
            last_jump_time = winmm.timeGetTime()
            math.randomseed(os.time())
            cur_jump_mul = math.random(500)
            goto continue
         end

         if targetMoveMode == MOVEMODE_RUN or targetMoveMode == MOVEMODE_RUNNOJUMP then
            setGameKeyState(gkeys.player.SPRINT, 255)
         end
      ::continue:: wait(0) until dist_lost < 0.7
   end
end

2. брать чекпоинты setGameKeyState, либо напрямую в пакете отправлять серверу клавишу
3. чекать, когда взял чекпоинт - по чату, либо под другим событиям
4. получить позицию чекпоинта через фукнцию нельзя (как-то можно, но нормальнымы способами - нет). Но есть событие onSetCheckpoint (samp.lua), которое вызывается когда сервер ставит чекпоинт, там коорды есть
 
  • Нравится
  • Вау
Реакции: qdIbp и YarikVL

Annanel

Участник
Автор темы
86
8
тебе по этапно описать как делать?

Могу пошагово, чтоб было максимально подробно
Было бы не плохо если привёл какой-то универсальный пример например чтобы можно было не на одну работу написать а на шахту или автобусника, хочу написать для сервера My Home RP
 

Lance_Sterling

Известный
798
278
Было бы не плохо если привёл какой-то универсальный пример например чтобы можно было не на одну работу написать а на шахту или автобусника, хочу написать для сервера My Home RP
Нахуя на нубо эрпэ писать бота
 

Annanel

Участник
Автор темы
86
8
Нахуя на нубо эрпэ писать бота
Так что на этот сервер что на аризону, код будет одинаковым

1. Для передвежения можешь юзать либо:
Lua:
-- доков вообще нету, сам пробуй разные значения mode, и смотри, что они значат
taskGoToCoordAnyMeans(Ped ped, float toX, float toY, float toZ, int mode, Vehicle useCar)
либо:
Lua:
-- вырезано из старого скрипта, что как работает не особо помню
-- помню только что MOVEMODE_*** - режимы ходьбы
local MOVEMODE_AUTO = 0
local MOVEMODE_WALK = 1
local MOVEMODE_RUN = 2
local MOVEMODE_RUNNOJUMP = 3

do
   local _autoMode_Run_Minleght = 5
   local _jumpMinLength = 10

   local function length(vec)
      return math.sqrt((vec.x*vec.x)+(vec.y*vec.y)+(vec.z*vec.z))
   end

   local function sub(a, b)
      return vec3(a.x - b.x, a.y - b.y, a.z - b.z)
   end

   local function _calcAngle(x, y)
      local px, py = getCharCoordinates(PLAYER_PED)
      local plus = 0.0
      local mode = 1
      if px < x and py > y then plus = math.pi/2; mode = 2 end
      if px < x and py < y then plus = math.pi end
      if px > x and py < y then plus = math.pi*1.5; mode = 2 end
      local lx = x - px
      local ly = y - py
      lx = math.abs(lx)
      ly = math.abs(ly)
      if mode == 1 then ly = ly/lx
      else ly = lx/ly end
      ly = math.atan(ly)
      ly = ly + plus
      return ly
   end

   local function _setAngle(x, y, distance, speed)
      setCameraPositionUnfixed(-0.3, _calcAngle(x,y))
   end

   GoToPoint = function(x, y, z, moveMode, runAutoMode)
      local runAutoMode = runAutoMode or MOVEMODE_RUN

      local last_jump_time = winmm.timeGetTime()
      math.randomseed(os.time())
      local cur_jump_mul = math.random(170)

      local target = vec3(x, y, z)

      repeat
         local ppos = vec3(getCharCoordinates(PLAYER_PED))
         local dist_lost = length(sub(vec3(ppos.x, ppos.y, 0), vec3(target.x, target.y, 0)))
         local targetMoveMode = moveMode == MOVEMODE_AUTO and (dist_lost > _autoMode_Run_Minleght and runAutoMode or MOVEMODE_WALK) or moveMode
         _setAngle(target.x, target.y, dist_lost, 0.1)

         setGameKeyState(gkeys.player.GOFORWARD_GOBACK, -255)

         if dist_lost >= _jumpMinLength and targetMoveMode == MOVEMODE_RUN and (winmm.timeGetTime() - last_jump_time) >= 1500 + cur_jump_mul then
            setGameKeyState(gkeys.player.JUMP, 255)
            last_jump_time = winmm.timeGetTime()
            math.randomseed(os.time())
            cur_jump_mul = math.random(500)
            goto continue
         end

         if targetMoveMode == MOVEMODE_RUN or targetMoveMode == MOVEMODE_RUNNOJUMP then
            setGameKeyState(gkeys.player.SPRINT, 255)
         end
      ::continue:: wait(0) until dist_lost < 0.7
   end
end

2. брать чекпоинты setGameKeyState, либо напрямую в пакете отправлять серверу клавишу
3. чекать, когда взял чекпоинт - по чату, либо под другим событиям
4. получить позицию чекпоинта через фукнцию нельзя (как-то можно, но нормальнымы способами - нет). Но есть событие onSetCheckpoint (samp.lua), которое вызывается когда сервер ставит чекпоинт, там коорды есть
Lua:
local checkpoint = nil

function onSetCheckpoint(x, y)
    checkpoint = {x = x, y = y}
end

function runToCheckpoints()
    local x, y, z = getCharCoordinates(PLAYER_PED)
    while checkpoint do
        local tox, toy = checkpoint.x, checkpoint.y
        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)
            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
        checkpoint = nil
    end
end

function main()
    runToCheckpoints()
end

main()

Таким макаром? проблема в том что он не бежит к чекпойнту
 
Последнее редактирование:
  • Bug
Реакции: Letovo

Lance_Sterling

Известный
798
278
Так что на этот сервер что на аризону, код будет одинаковым


Lua:
local checkpoint = nil

function onSetCheckpoint(x, y)
    checkpoint = {x = x, y = y}
end

function runToCheckpoints()
    local x, y, z = getCharCoordinates(PLAYER_PED)
    while checkpoint do
        local tox, toy = checkpoint.x, checkpoint.y
        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)
            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
        checkpoint = nil
    end
end

function main()
    runToCheckpoints()
end

main()

Таким макаром? проблема в том что он не бежит к чекпойнту
Попробуй поставить проверку, загружен ли вообще самп

И зачем ты в конце мейн вызваля не понятно
 

Annanel

Участник
Автор темы
86
8
Попробуй поставить проверку, загружен ли вообще самп

И зачем ты в конце мейн вызваля не понятно
Я в какой-то теме на форуме этом прочитал что типа main надо вызывать. Просто странно что сам скрипт загружается moonloader-ом.

Lua:
local checkpoint = nil

function onSetCheckpoint(x, y)
    checkpoint = {x = x, y = y}
end

function runToCheckpoints()
    local x, y, z = getCharCoordinates(PLAYER_PED)
    while checkpoint do
        local tox, toy = checkpoint.x, checkpoint.y
        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)
            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
        checkpoint = nil
    end
end

function main()
    if isGameRunning() then
    runToCheckpoints()
    else
    print("В данный момент игра не запущена")
  end
end
 
Последнее редактирование:

Lance_Sterling

Известный
798
278
Я в какой-то теме на форуме этом прочитал что типа main надо вызывать. Просто странно что сам скрипт загружается moonloader-ом.

Lua:
local checkpoint = nil

function onSetCheckpoint(x, y)
    checkpoint = {x = x, y = y}
end

function runToCheckpoints()
    local x, y, z = getCharCoordinates(PLAYER_PED)
    while checkpoint do
        local tox, toy = checkpoint.x, checkpoint.y
        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)
            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
        checkpoint = nil
    end
end

function main()
    if isGameRunning() then
    runToCheckpoints()
    else
    print("В данный момент игра не запущена")
  end
end
Lua:
local checkpoint = nil

function onSetCheckpoint(x, y)
    checkpoint = {x = x, y = y}
end

function runToCheckpoints()
    local x, y, z = getCharCoordinates(PLAYER_PED)
    while checkpoint do
        local tox, toy = checkpoint.x, checkpoint.y
        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)
            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
        checkpoint = nil
    end
end

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    runToCheckpoints()
   
end
 

Annanel

Участник
Автор темы
86
8
Lua:
local checkpoint = nil

function onSetCheckpoint(x, y)
    checkpoint = {x = x, y = y}
end

function runToCheckpoints()
    local x, y, z = getCharCoordinates(PLAYER_PED)
    while checkpoint do
        local tox, toy = checkpoint.x, checkpoint.y
        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)
            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
        checkpoint = nil
    end
end

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    runToCheckpoints()
 
end
Спасибо опробую

Lua:
local checkpoint = nil

function onSetCheckpoint(x, y)
    checkpoint = {x = x, y = y}
end

function runToCheckpoints()
    local x, y, z = getCharCoordinates(PLAYER_PED)
    while checkpoint do
        local tox, toy = checkpoint.x, checkpoint.y
        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)
            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
        checkpoint = nil
    end
end

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    runToCheckpoints()
 
end
Нет не работает, скорее всего и не заработает
1676229687454.png

Код:
[22:20:09.528157] (system)    bot.lua: Loaded successfully.

У них sampfuncs не даёт запустить игру
 
Последнее редактирование:

Lance_Sterling

Известный
798
278
Спасибо опробую


Нет не работает, скорее всего и не заработает
Посмотреть вложение 189789
Код:
[22:20:09.528157] (system)    bot.lua: Loaded successfully.

У них sampfuncs не даёт запустить игру
не работал с ботами, хз
думаю ошибка в том что сразу запускаешь бежать к чекпоинту
еще попробуй на карте поставить чекпоинт сам
Lua:
local checkpoint = nil

function onSetCheckpoint(x, y)
    checkpoint = {x = x, y = y}
end

function runToCheckpoints()
    local x, y, z = getCharCoordinates(PLAYER_PED)
    while checkpoint do
        local tox, toy = checkpoint.x, checkpoint.y
        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)
            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
        checkpoint = nil
    end
end

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('marker', function()--при вводе команды /marker должно побежать
        runToCheckpoints()
    end)
end