Вопросы по 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
 
Последнее редактирование:

|DEVIL|

Известный
363
280
Есть функция которая реагирует на закрытие диалогового окна?
 

astynk

Известный
Проверенный
742
532
Есть функция которая реагирует на закрытие диалогового окна?
Хук onSendDialogResponse.
подстроить под эту функцию(потому что samp_create_sync_data выдаёт ошибку о: attemp to redefine `VectorXYZ`):
Тоже сталкивался, убери там строчку require 'lib.samp.synchronization'
 
Последнее редактирование:
  • Нравится
Реакции: |DEVIL|

Alan1

Участник
57
4
Здравствуйте!

Подскажите пожалуйста как можно получить текст последнего сообщения из чата?

Заранее спасибо!
 

Eko1337

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

ne4estno

Участник
79
0
bla, пол года не трогал lua, а конкретно imgui, скинь ссылку на ВСЕ сука функции. Спасибо)))))
 

Thief

Участник
108
12
как сделать работу цикла так, чтобы алгоритм работал только на заданном расстоянии, а не в зоне всего стрима?
 

ne4estno

Участник
79
0
kod:
script_name('ghelper')
script_author('ne4estno')
script_version(1.0)

resX, resY = getScreenResolution()
local key = require 'vkeys'
local imgui = require 'imgui'
local inicfg = require 'inicfg'
local encoding = require 'encoding'
local sampev = require 'lib.samp.events'
encoding.default = 'CP1251'
u8 = encoding.UTF8

binder_text = {}
binder_text[2] = imgui.ImBuffer(192)
color = 0xFF5511

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
        sampRegisterChatCommand('gh', gh_cmd)
        sampAddChatMessage('{FFFFFF}Скрипт {FF5511}ghelper {FFFFFF}успешно запущен.', 0xFF5511)
        imgui.Process = show_main_window
    while true do
--БЕСКОНЕЧНЫЙ БЛОК--------------------------------
    wait(0)



    end
--КОНЕЦ БЕСКОНЕЧНОГО БЛОКА--------------------------------
end

--блок команд--------------------------------------

function gh_cmd()
    show_main_window = not show_main_window
    imgui.Process = show_main_window
end

-- блок гуи -----------------------------------------


function imgui.OnDrawFrame()
  if show_main_window then
        imgui.SetNextWindowPos(imgui.ImVec2(resX/2-150, 120))
    imgui.SetNextWindowSize(imgui.ImVec2(300, 160), imgui.Cond.FirstUseEver)
    imgui.Begin(u8'ghelper - главное окно.', show_main_window, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoTitleBar)
        imgui.SetCursorPosX(105)   imgui.Text('ghelper - v1.0',color)
        if getDownKeysText() ~= "None" then
            binder_text[2].v = getDownKeysText()
            is_changeact = true
        else
            AddChatMessage("Зажмите клавишу/клавиши, после чего повторите попытку")
        end
    imgui.End()
  end
end


function ShowHelpMarker(text)
    imgui.SameLine()
    imgui.TextDisabled("(?)")
    if (imgui.IsItemHovered()) then
        imgui.SetTooltip(u8(text))
    end
    end

        function getDownKeysText()
            tKeys = string.split(getDownKeys(), " ")
            if #tKeys ~= 0 then
                for i = 1, #tKeys do
                    if i == 1 then
                        str = key.id_to_name(tonumber(tKeys[i]))
                    else
                        str = str .. "+" .. key.id_to_name(tonumber(tKeys[i]))
                    end
                end
                return str
            else
                return "None"
            end
        end

        function getDownKeys()
            local curkeys = ""
            local bool = false
            for k, v in pairs(key) do
                if isKeyDown(v) and (v == VK_MENU or v == VK_CONTROL or v == VK_SHIFT or v == VK_LMENU or v == VK_RMENU or v == VK_RCONTROL or v == VK_LCONTROL or v == VK_LSHIFT or v == VK_RSHIFT) then
                    if v ~= VK_MENU and v ~= VK_CONTROL and v ~= VK_SHIFT then
                        curkeys = v
                    end
                end
            end
            for k, v in pairs(key) do
                if isKeyDown(v) and (v ~= VK_MENU and v ~= VK_CONTROL and v ~= VK_SHIFT and v ~= VK_LMENU and v ~= VK_RMENU and v ~= VK_RCONTROL and v ~= VK_LCONTROL and v ~= VK_LSHIFT and v ~= VK_RSHIFT) then
                    if tostring(curkeys):len() == 0 then
                        curkeys = v
                    else
                        curkeys = curkeys .. " " .. v
                    end
                    bool = true
                end
            end
            return curkeys, bool
        end

Ошибка:
[ML] (error) ghelper: C:\Games\gta gambit\GTA San Andreas\moonloader\ghelper.lua:71: attempt to call field 'split' (a nil value)
stack traceback:
    C:\Games\gta gambit\GTA San Andreas\moonloader\ghelper.lua:71: in function 'getDownKeysText'
    C:\Games\gta gambit\GTA San Andreas\moonloader\ghelper.lua:51: in function 'OnDrawFrame'
    ...ames\gta gambit\GTA San Andreas\moonloader\lib\imgui.lua:1378: in function <...ames\gta gambit\GTA San Andreas\moonloader\lib\imgui.lua:1367>
[ML] (error) ghelper: Script died due to an error. (241E31C4)
Что не так?
 

Pashyka

Участник
220
17
Lua:
if isKeyJustPressed(VK_RBUTTON) then
    local ped = getCharPlayerIsTargeting(Player) -- получить хендл персонажа, в которого целится игрок
    local id = sampGetPlayerIdByCharHandle(ped) -- получить samp-ид игрока по хендлу персонажа
    nick = sampGetPlayerNickname(id)
    printStringNow(nick, 1000)
end

Я хочу сделать, чтобы когда смотришь на игрока мы получали его айди и по этому айди мы получали ник игрока, но через этот код показывает ник игрока у которого айди 0
Помогите что не так?
 

sᴀxᴏɴ

саксофон
Всефорумный модератор
791
853
Lua:
if isKeyJustPressed(VK_RBUTTON) then
    local ped = getCharPlayerIsTargeting(Player) -- получить хендл персонажа, в которого целится игрок
    local id = sampGetPlayerIdByCharHandle(ped) -- получить samp-ид игрока по хендлу персонажа
    nick = sampGetPlayerNickname(id)
    printStringNow(nick, 1000)
end

Я хочу сделать, чтобы когда смотришь на игрока мы получали его айди и по этому айди мы получали ник игрока, но через этот код показывает ник игрока у которого айди 0
Помогите что не так?
Lua:
function main()
    while not isSampAvailable do wait(100) end
    while true do wait(0)
        local res, pped = getCharPlayerIsTargeting(PLAYER_HANDLE)
        if res then
            local _, id = sampGetPlayerIdByCharHandle(pped)
            printStringNow(sampGetPlayerNickname(id), 1000)
        end
    end
end
 
  • Нравится
Реакции: Pashyka

Pashyka

Участник
220
17
Lua:
function main()
    while not isSampAvailable do wait(100) end
    while true do wait(0)
        local res, pped = getCharPlayerIsTargeting(PLAYER_HANDLE)
        if res then
            local _, id = sampGetPlayerIdByCharHandle(pped)
            printStringNow(sampGetPlayerNickname(id), 1000)
        end
    end
end

Получиииилось, только можешь объяснить что было не так? кароче немного объясни свой код пожалуйста