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

Общая тема для вопросов по разработке скриптов на языке программирования Lua, в частности под MoonLoader.
  • Задавая вопрос, убедитесь, что его нет в списке частых вопросов и что на него ещё не отвечали (воспользуйтесь поиском).
  • Поищите ответ в теме посвященной разработке Lua скриптов в MoonLoader
  • Отвечая, убедитесь, что ваш ответ корректен.
  • Старайтесь как можно точнее выразить мысль, а если проблема связана с кодом, то обязательно прикрепите его к сообщению, используя блок [code=lua]здесь мог бы быть ваш код[/code].
  • Если вопрос связан с MoonLoader-ом первым делом желательно поискать решение на wiki.

Частые вопросы

Как научиться писать скрипты? С чего начать?
Информация - Гайд - Всё о Lua скриптинге для MoonLoader(https://blast.hk/threads/22707/)
Как вывести текст на русском? Вместо русского текста у меня какие-то каракули.
Изменить кодировку файла скрипта на Windows-1251. В Atom: комбинация клавиш Ctrl+Shift+U, в Notepad++: меню Кодировки -> Кодировки -> Кириллица -> Windows-1251.
Как получить транспорт, в котором сидит игрок?
Lua:
local veh = storeCarCharIsInNoSave(PLAYER_PED)
Как получить свой id или id другого игрока?
Lua:
local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получить свой ид
local _, id = sampGetPlayerIdByCharHandle(ped) -- получить ид другого игрока. ped - это хендл персонажа
Как проверить, что строка содержит какой-то текст?
Lua:
if string.find(str, 'текст', 1, true) then
-- строка str содержит "текст"
end
Как эмулировать нажатие игровой клавиши?
Lua:
local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main

setGameKeyState(game_keys.player.FIREWEAPON, -1) -- будет сэмулировано нажатие клавиши атаки
Все иды клавиш находятся в файле moonloader/lib/game/keys.lua.
Подробнее о функции setGameKeyState здесь: lua - setgamekeystate | BlastHack — DEV_WIKI(https://www.blast.hk/wiki/lua:setgamekeystate)
Как получить id другого игрока, в которого целюсь я?
Lua:
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE) -- получить хендл персонажа, в которого целится игрок
if valid and doesCharExist(ped) then -- если цель есть и персонаж существует
  local result, id = sampGetPlayerIdByCharHandle(ped) -- получить samp-ид игрока по хендлу персонажа
  if result then -- проверить, прошло ли получение ида успешно
    -- здесь любые действия с полученным идом игрока
  end
end
Как зарегистрировать команду чата SAMP?
Lua:
-- До бесконечного цикла/задержки
sampRegisterChatCommand("mycommand", function (param)
     -- param будет содержать весь текст введенный после команды, чтобы разделить его на аргументы используйте string.match()
    sampAddChatMessage("MyCMD", -1)
end)
Крашит игру при вызове sampSendChat. Как это исправить?
Это происходит из-за бага в SAMPFUNCS, когда производится попытка отправки пакета определенными функциями изнутри события исходящих RPC и пакетов. Исправления для этого бага нет, но есть способ не провоцировать его. Вызов sampSendChat изнутри обработчика исходящих RPC/пакетов нужно обернуть в скриптовый поток с нулевой задержкой:
Lua:
function onSendRpc(id)
  -- крашит:
  -- sampSendChat('Send RPC: ' .. id)

  -- норм:
  lua_thread.create(function()
    wait(0)
    sampSendChat('Send RPC: ' .. id)
  end)
end
 
Последнее редактирование:

madrasso

Потрачен
883
324
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Почему вылетает при асинхронных запросах, постоянных..?
 

madrasso

Потрачен
883
324
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Она сейчас противопоказана для использования с moonloader.
Вот тут пример с использованием другой библиотеки.
https://blast.hk/threads/20532/page-2#post-256096
Такая же фигня, крашит игру после нескольких исп, в цикле с кд 5сек..


21647

Можно код?
 

seruj22048

Участник
74
6
Как избавиться краша??
[ML] (error) new_1 (7).lua: cannot resume non-suspended coroutine
stack traceback:
[C]: in function 'request_lane'
D:\Games\GTA San Andreas\moonloader\new_1 (7).lua:117: in function <D:\Games\GTA San Andreas\moonloader\new_1 (7).lua:116>
[ML] (error) new_1 (7).lua: Script died due to an error. (1274CF8C)

Lua:
function async_http_request(method, url, args, resolve, reject)
reqq = true
    local request_lane = lanes.gen('*', {package = {path = package.path, cpath = package.cpath}}, function()
        local requests = require 'requests'
        local ok, res = pcall(requests.request, method, url, args)
        if ok then
            res.json, res.xml = nil, nil -- cannot be passed through a lane
            return true, res
        else
            return false, res -- return error
        end
    end)
    if not reject then reject = function() end end
    lua_thread.create(function()
        local lh = request_lane()
        while true do
            local status = lh.status
            if status == 'done' then
                local ok, res = lh[1], lh[2]
                if ok then resolve(res) else reject(res) end
                return
            elseif status == 'error' then
                return reject(lh[1])
            elseif status == 'killed' or status == 'cancelled' then
                return reject(status)
            end
            wait(0)
        end
    end)
end
 

zulfat2004

Потрачен
2
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Всем привет.Можно Вопрос , С чего начинать lua есть советы или надо читать книги скажите если вам не трудно.Спасибо заранее за ответ
 

zulfat2004

Потрачен
2
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

Cucumber

Участник
40
21
Всем привет. Нужна помощь, lua сегодня первый день начал учиться. Подскажите как добавить задержку в 9 строке в цикле, то когда я использую команду wait() у меня весь скрипт уходит в "сон".
Код:
function SE.onSendCommand(cmd)
    local reFail = string.match(cmd, "^%/fail (%d+)")
    if reFail then
        lk = 0
        sampAddChatMessage(lk, 0xAAAAAAAA)
        while lk <= 3 do 
            lk = lk + 1
            sampAddChatMessage(lk, 0xAAAAAAAA)
            -- Тут нужно вставить задержку
        end
    sampAddChatMessage("return", 0xAAAAAAAA)
    end
end
 

Petr_Sergeevich

Известный
Проверенный
707
296
Всем привет. Нужна помощь, lua сегодня первый день начал учиться. Подскажите как добавить задержку в 9 строке в цикле, то когда я использую команду wait() у меня весь скрипт уходит в "сон".
Код:
function SE.onSendCommand(cmd)
    local reFail = string.match(cmd, "^%/fail (%d+)")
    if reFail then
        lk = 0
        sampAddChatMessage(lk, 0xAAAAAAAA)
        while lk <= 3 do
            lk = lk + 1
            sampAddChatMessage(lk, 0xAAAAAAAA)
            -- Тут нужно вставить задержку
        end
    sampAddChatMessage("return", 0xAAAAAAAA)
    end
end


Lua:
function SE.onSendCommand(cmd)
    local reFail = cmd:match("^%/fail (%d+)")
    if reFail then
        lk = 0
        sampAddChatMessage(lk, 0xAAAAAAAA)
        lua_thread.create(function()
            while lk <= 3 do
                lk = lk + 1
                sampAddChatMessage(lk, 0xAAAAAAAA)
                wait(0)
            end
        end)
    sampAddChatMessage("return", 0xAAAAAAAA)
    end
end
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,637
2,486
Есть ли тут люди, которые работали с VK APİ для Lua?

Если есть - объясните, как это работает вообще, как использовать и т.п.
 
Последнее редактирование:

madrasso

Потрачен
883
324
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как отправить серверу то, что ты в афк?