Вопросы по Lua скриптингу

Тема в разделе "Lua", создана пользователем FYP, 8 авг 2016.

  1. тащер229

    тащер229 Участник

    Регистрация:
    28 мар 2015
    Сообщения:
    10
    Симпатии:
    0
    Приветствую, помогите с airbreak'om на lua) Код ниже.
    require 'lib.sampfuncs'
    require 'lib.moonloader'
    
    function main()
      if not isSampfuncsLoaded() or not isSampLoaded() then return end
      while not isSampAvailable() do
        wait(200)
      end
        while true do
        wait(0)
            if isKeyJustPressed(VK_RSHIFT) then -- airbrake
                funcsStatus.AirBrk = not funcsStatus.AirBrk
                if funcsStatus.AirBrk then
                    local posX, posY, posZ = getCharCoordinates(playerPed)
                    airBrkCoords = {posX, posY, posZ, 0.0, 0.0, getCharHeading(playerPed)}
                    func_change_status('AirBrake', 1, true)
                else
                    func_change_status('AirBrake', 1, false)
                end
        end
      end
    end
    
    function al()
        if funcsStatus.AirBrk then -- airbrake
            if isCharInAnyCar(playerPed) then heading = getCarHeading(storeCarCharIsInNoSave(playerPed))
            else heading = getCharHeading(playerPed) end
            local camCoordX, camCoordY, camCoordZ = getActiveCameraCoordinates()
            local targetCamX, targetCamY, targetCamZ = getActiveCameraPointAt()
            local angle = getHeadingFromVector2d(targetCamX - camCoordX, targetCamY - camCoordY)
            if isCharInAnyCar(playerPed) then difference = 0.79 else difference = 1.0 end
            setCharCoordinates(playerPed, airBrkCoords[1], airBrkCoords[2], airBrkCoords[3] - difference)
            if isKeyDown(VK_W) then
                airBrkCoords[1] = airBrkCoords[1] + config.AirBrake.Speed * math.sin(-math.rad(angle))
                airBrkCoords[2] = airBrkCoords[2] + config.AirBrake.Speed * math.cos(-math.rad(angle))
                if not isCharInAnyCar(playerPed) then setCharHeading(playerPed, angle)
                else setCarHeading(storeCarCharIsInNoSave(playerPed), angle) end
            elseif isKeyDown(VK_S) then
                airBrkCoords[1] = airBrkCoords[1] - config.AirBrake.Speed * math.sin(-math.rad(heading))
                airBrkCoords[2] = airBrkCoords[2] - config.AirBrake.Speed * math.cos(-math.rad(heading))
            end
            if isKeyDown(VK_A) then
                airBrkCoords[1] = airBrkCoords[1] - config.AirBrake.Speed * math.sin(-math.rad(heading - 90))
                airBrkCoords[2] = airBrkCoords[2] - config.AirBrake.Speed * math.cos(-math.rad(heading - 90))
            elseif isKeyDown(VK_D) then
                airBrkCoords[1] = airBrkCoords[1] - config.AirBrake.Speed * math.sin(-math.rad(heading + 90))
                airBrkCoords[2] = airBrkCoords[2] - config.AirBrake.Speed * math.cos(-math.rad(heading + 90))
            end
            if isKeyDown(VK_UP) then airBrkCoords[3] = airBrkCoords[3] + config.AirBrake.Speed / 2.0 end
            if isKeyDown(VK_DOWN) and airBrkCoords[3] > -95.0 then airBrkCoords[3] = airBrkCoords[3] - config.AirBrake.Speed / 2.0 end
            if not isSampfuncsConsoleActive() and not sampIsChatInputActive() and not sampIsDialogActive() and not isPauseMenuActive() then
                if isKeyDown(VK_OEM_PLUS) and time - tick.Keys.Plus > tick.Time.PlusMinus then
                    if config.AirBrake.Speed < 14.9 then config.AirBrake.Speed = config.AirBrake.Speed + 0.5 end
                    post_of_notification(string.format('AirBrk speed changed to: %.1f.', config.AirBrake.Speed))
                    tick.Keys.Plus = os.clock() * 1000
                elseif isKeyDown(VK_OEM_MINUS) and time - tick.Keys.Minus > tick.Time.PlusMinus then
                    if config.AirBrake.Speed > 0.5 then config.AirBrake.Speed = config.AirBrake.Speed - 0.5 end
                    post_of_notification(string.format('AirBrk speed changed to: %.1f.', config.AirBrake.Speed))
                    tick.Keys.Minus = os.clock() * 1000
                end
            end
        end
    end
    Не могу понять в чём косяк.
     

    Вложения:

    • moonloader.log
      Размер файла:
      3 КБ
      Просмотров:
      2
  2. TheWille

    TheWille Активный участник

    Регистрация:
    24 окт 2015
    Сообщения:
    35
    Симпатии:
    2
    Здесь есть список *Click*
     
  3. KostX

    KostX Участник

    Регистрация:
    16 мар 2018
    Сообщения:
    21
    Симпатии:
    1
    attempt to index global 'funcsStatus' (a nil value) -_-, сделай все проще...
    if activate then -- activate - переменная активации
       --code airbrake
    end
     
  4. Pu$$y

    Pu$$y Активный участник

    Регистрация:
    5 июл 2018
    Сообщения:
    32
    Симпатии:
    0
    The wiki has some functions that are in red. That means they are not working or what?
     
  5. тащер229

    тащер229 Участник

    Регистрация:
    28 мар 2015
    Сообщения:
    10
    Симпатии:
    0
    Все равно не понимаю, код не мой, а вырезан из собейта от @cover
     
  6. FBenz

    FBenz Интересующийся

    Регистрация:
    12 дек 2018
    Сообщения:
    152
    Симпатии:
    10
    That means that there r no describe for this function, but it is working.
     
    Pu$$y нравится это.
  7. KostX

    KostX Участник

    Регистрация:
    16 мар 2018
    Сообщения:
    21
    Симпатии:
    1
    это вопросы по луа , а не напиши плиз чит
    local key = require "vkeys"
    activate = false
    function main()
        while not isSampAvailable() do wait(100) end
        while true do wait(0)
            if isKeyJustPressed(key.VK_RSHIFT) then
                activate = not activate
                local posX, posY, posZ = getCharCoordinates(playerPed)
                airBrkCoords = {posX, posY, posZ, 0.0, 0.0, getCharHeading(playerPed)}
            end
            doWork()
        end
    end
    
    function doWork()
        if activate then
            local camCoordX, camCoordY, camCoordZ = getActiveCameraCoordinates()
            local targetCamX, targetCamY, targetCamZ = getActiveCameraPointAt()
            local angle = getHeadingFromVector2d(targetCamX - camCoordX, targetCamY - camCoordY)
            if isCharInAnyCar(playerPed) then difference = 0.79 else difference = 1.0 end
                setCharCoordinates(playerPed, airBrkCoords[1], airBrkCoords[2], airBrkCoords[3] - difference)
                if isKeyDown(VK_W) then
                    airBrkCoords[1] = airBrkCoords[1] + 1 * math.sin(-math.rad(angle))
                    airBrkCoords[2] = airBrkCoords[2] + 1 * math.cos(-math.rad(angle))
                    if not isCharInAnyCar(playerPed) then setCharHeading(playerPed, angle)
                    else setCarHeading(storeCarCharIsInNoSave(playerPed), angle) end
                elseif isKeyDown(VK_S) then
                    airBrkCoords[1] = airBrkCoords[1] - 1 * math.sin(-math.rad(heading))
                    airBrkCoords[2] = airBrkCoords[2] - 1 * math.cos(-math.rad(heading))
                end
                if isKeyDown(VK_A) then
                    airBrkCoords[1] = airBrkCoords[1] - 1 * math.sin(-math.rad(heading - 90))
                    airBrkCoords[2] = airBrkCoords[2] - 1 * math.cos(-math.rad(heading - 90))
                elseif isKeyDown(VK_D) then
                    airBrkCoords[1] = airBrkCoords[1] - 1 * math.sin(-math.rad(heading + 90))
                    airBrkCoords[2] = airBrkCoords[2] - 1 * math.cos(-math.rad(heading + 90))
                end
                if isKeyDown(VK_UP) then airBrkCoords[3] = airBrkCoords[3] + 1 / 2.0 end
                if isKeyDown(VK_DOWN) and airBrkCoords[3] > -95.0 then airBrkCoords[3] = airBrkCoords[3] - 1 / 2.0 end
        end
    end
    это самый простой вариант, вырезал все не понятное
     
  8. FBenz

    FBenz Интересующийся

    Регистрация:
    12 дек 2018
    Сообщения:
    152
    Симпатии:
    10
    Запилил вот такой код, все остальные асинхроны вырубил. Все равно крашит. Что может быть не так? Проверку не обходят, потоки в асинхронной функции успевают завершиться, проверял вручную и при помощи чата, куда выводил состояние асинхронного потока. Перед началом другого он всегда принимал значение Dead. Но все равно крашит. Может что-то не так?
    Уже подустал ломать голову над этой задачей. В лог вообще ничего не выводит. Вылетает именно игра.

    Асинхроны не встречаются, понятия не имею, что не так.
    
    
    settings.threadtwo = lua_thread.create(onGetCasefile) -- пример запуска. Где-то в onDrawFrame()
    
    function onGetCasefile()
    
    
    asyncHttpRequest('GET', "ссыль", nil, -- выполняется асинхрон
      function(response)
    --ну, тут код х
      end,
      function(err)
         sampAddChatMessage('{6600FF}Нет связи')
      end)
     
      while true do
        wait(5)
         if settings.thread:status() == 'dead' then -- ждем, когда завершится асинхронный поток (аналог settings.thread.dead)
          wait(1000)
           break -- по завершению переходим к другим асинхронам
         end
       end
     
     
      for i = 1, tonumber(casefile.get.count) do -- nick, name, old, frac, sex, status, short, invest, imgur
     
       while true do
        wait(5)
         if settings.thread:status() == 'dead' then -- проверяем, завершился ли асинхронный запрос перед тем, который в цикле
          wait(1000) -- на всякий ждем секунду
           sampAddChatMessage('{6600ff}'..tostring(settings.thread.dead))
           break
         end
       end
    
        asyncHttpRequest('GET', "ссыль2", nil,
         function(response)
          --ну, тут код х2
          end
         end,
         function(err)
          sampAddChatMessage('{6600FF}Нет связи')
         end)
     
       end
    
    
    end
    
    function asyncHttpRequest(method, url, args, resolve, reject) -- взято у ковера.
       local request_thread = effil.thread(function (method, url, args)
          local requests = require 'requests'
          local result, response = pcall(requests.request, method, url, args)
          if result then
             response.json, response.xml = nil, nil
             return true, response
          else
             return false, response
          end
       end)(method, url, args)
       if not resolve then resolve = function() end end
       if not reject then reject = function() end end
       settings.thread = lua_thread.create(function() -- Сюда я и поставил переменную, содержащую поток.
          local runner = request_thread
          while true do
             local status, err = runner:status()
             if not err then
                if status == 'completed' then
                   local result, response = runner:get()
                   if result then
                      resolve(response)
                   else
                      reject(response)
                   end
                   return
                elseif status == 'canceled' then
                   return reject(status)
                end
             else
                return reject(err)
             end
             wait(0)
          end
       end)
    end
     
    #27063 FBenz, 15 май 2019 в 20:57
    Последнее редактирование: 15 май 2019 в 21:16
  9. ReDexter

    ReDexter Новичок

    Регистрация:
    18 фев 2015
    Сообщения:
    3
    Симпатии:
    0
    Дайте пример передачи переменной на кнопку imgui
     
  10. FBenz

    FBenz Интересующийся

    Регистрация:
    12 дек 2018
    Сообщения:
    152
    Симпатии:
    10
    if imgui.Button(u8'Название') then
     per = not per
    end
    Ты про это?
     
  11. Anton Nixon

    Anton Nixon Активный участник

    Регистрация:
    14 авг 2018
    Сообщения:
    34
    Симпатии:
    2
    Хелпаните по ошибке
    [ML] (error) mo_helper.lua: ...es\Grand Theft Auto San Andreas\moonloader\mo_helper.lua:47: attempt to index global 'main' (a nil value)
    stack traceback:
        ...es\Grand Theft Auto San Andreas\moonloader\mo_helper.lua:47: in main chunk
    local Password             = imgui.ImBuffer(tostring(main.settings.password) or "", 256)
     
  12. Roger Camillo

    Roger Camillo Участник

    Регистрация:
    28 июл 2017
    Сообщения:
    21
    Симпатии:
    0
    Ребята, вопросик, как сделать так что в диалог автоматически так сказать писался текст, и нажимал 'enter'
    За ранее спасибо <3
     
  13. Anton Nixon

    Anton Nixon Активный участник

    Регистрация:
    14 авг 2018
    Сообщения:
    34
    Симпатии:
    2
    в какой диалог в игровой?
     
  14. Roger Camillo

    Roger Camillo Участник

    Регистрация:
    28 июл 2017
    Сообщения:
    21
    Симпатии:
    0
    Да, в игровой.
     
  15. Anton Nixon

    Anton Nixon Активный участник

    Регистрация:
    14 авг 2018
    Сообщения:
    34
    Симпатии:
    2
    вот как оно сделано у меня:
    -- подключаю библиотеку
    local sampev = require 'lib.samp.events'
    -- загружаю из ini файла переменную с текстом и объявляю ее
    local gInfo = inicfg.load({
         info = {
            text = ""
            }
    }, "primer.ini")
    local Text = imgui.ImBuffer(tostring(gInfo.info.text) or "", 256)
    -- cоздаю функцию для этой всей бодяги
    function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
        if title:find("название диалога") and text:find("немного текста из окна диалога(2-3 слова)") then
            sampSendDialogResponse(dialogId, 1, 0, u8:decode(Text.v)) -- 1 - клавиша enter; u8:decode(Text.v) - текст который возьмется из файла
            return false
        end
    end
    Это лишь пример, может и быдлокод, но я делал у себя автологин для АРП, не знаю, вроде работает безотказно ;)
     
  16. Roger Camillo

    Roger Camillo Участник

    Регистрация:
    28 июл 2017
    Сообщения:
    21
    Симпатии:
    0
    Спасибо
     
  17. KostX

    KostX Участник

    Регистрация:
    16 мар 2018
    Сообщения:
    21
    Симпатии:
    1
    blast.hk/wiki sampSendDialogResponse
     
  18. DmitryMakarov

    DmitryMakarov Постоянный участник

    Регистрация:
    29 апр 2017
    Сообщения:
    62
    Симпатии:
    0
    как сделать команду на включение/выключения всего скрипта?
    нужна команда /mh для включения и выключения
     
  19. KostX

    KostX Участник

    Регистрация:
    16 мар 2018
    Сообщения:
    21
    Симпатии:
    1
    activate = false -- вне main
    
    sampRegisterChatCommand("mh", function()
    activate = not activate
    if activate then
       thisScript():resume()
    else
       thisScript():pause()
    end
    end)
     
  20. Pu$$y

    Pu$$y Активный участник

    Регистрация:
    5 июл 2018
    Сообщения:
    32
    Симпатии:
    0
    how to get checkpoint coordinates?
     
  21. KostX

    KostX Участник

    Регистрация:
    16 мар 2018
    Сообщения:
    21
    Симпатии:
    1
    float X, float Y, float Z = getPickupCoordinates(Pickup pickup)
     
  22. Roger Camillo

    Roger Camillo Участник

    Регистрация:
    28 июл 2017
    Сообщения:
    21
    Симпатии:
    0
    sampSendDialogResponse(dialogId, 1, 0, c)
    У меня переменная называется 'c', но как сделать чтобы писало именно переменную, а не просто слово 'с'
     
  23. KostX

    KostX Участник

    Регистрация:
    16 мар 2018
    Сообщения:
    21
    Симпатии:
    1
    так и будет писать, по другому будет бить ошибку, если пишет с, то это ты написал "с"
     
  24. Roger Camillo

    Roger Camillo Участник

    Регистрация:
    28 июл 2017
    Сообщения:
    21
    Симпатии:
    0
    text = a + b
    sampSendDialogResponse(dialogId, 1, 0, text)
    Если у меня вот так код выглядит, то шо мне брат и писать там text??
     
  25. KostX

    KostX Участник

    Регистрация:
    16 мар 2018
    Сообщения:
    21
    Симпатии:
    1
    Да, только без скобок
     
  26. HanPrincess

    HanPrincess Знающий

    Регистрация:
    17 июн 2015
    Сообщения:
    221
    Симпатии:
    23
    Можно ли как-то узнать ид пикапа по его модели?
     
  27. KostX

    KostX Участник

    Регистрация:
    16 мар 2018
    Сообщения:
    21
    Симпатии:
    1
    в снипетах есть, чекни
     
  28. DmitryMakarov

    DmitryMakarov Постоянный участник

    Регистрация:
    29 апр 2017
    Сообщения:
    62
    Симпатии:
    0
    у мя работает почему то
    activate = false у меня вне майн
    остальное в main
    все правильно?
     
  29. Roger Camillo

    Roger Camillo Участник

    Регистрация:
    28 июл 2017
    Сообщения:
    21
    Симпатии:
    0
    Как закрыть диалог? серверный.
     
  30. Pu$$y

    Pu$$y Активный участник

    Регистрация:
    5 июл 2018
    Сообщения:
    32
    Симпатии:
    0
    how to get pickup handler as the checkpoint tho?
     
  31. KostX

    KostX Участник

    Регистрация:
    16 мар 2018
    Сообщения:
    21
    Симпатии:
    1
    fuction sampev.onServerDalog(id, title, ...)
    return false
    end

    https://blast.hk/wiki/moonloader:functions

    Pickup pickup = sampGetPickupHandleBySampId(int id)
     
  32. FBenz

    FBenz Интересующийся

    Регистрация:
    12 дек 2018
    Сообщения:
    152
    Симпатии:
    10
    Подумал так немного, может ли вылетать из-за того, что сам асинхронный запрос в потоке находится? То бишь:

    lua_thread.create(function()
    -- Асинхронный запрос
    )
     
  33. I_FYS

    I_FYS Участник

    Регистрация:
    6 май 2019
    Сообщения:
    11
    Симпатии:
    5
    upload_2019-5-15_23-34-32.png

    При нажатии numpad 2, текст не выводится никакой, скрипт не умирает. Что не так и как быть?
     
  34. trefa

    trefa ДРУК
    Друг

    Регистрация:
    5 фев 2015
    Сообщения:
    1.112
    Симпатии:
    438
    Значит одно из условий не соблюдается
     
    I_FYS нравится это.
  35. sanreal

    sanreal Интересующийся

    Регистрация:
    19 авг 2017
    Сообщения:
    141
    Симпатии:
    1
    есть у кого-нибудь готовый код, который получает серверный ид авто в котором находится ваш актер?