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

Lil Xean

о да моя госпожа
214
225
А точнее можно? Именно как вытащить с мульти лайна, и как всунуть туда
для записи ников открываешь файл в режиме записи, записываешь, сохраняешь и закрываешь.
для чтения аналогично, только в режиме чтения открывать. все функи для работы с файлами в статье, которую я кинул.
 

BARRY BRADLEY

Известный
711
176
Что не так?? Зависает гта.. Код нашел ..
Lua:
imgui.Text(u8("Список ников [" .. #PlayerList .. "]:"))

                if not EditNickList then
                    while not io.open("moonloader/config/PoliceHelp/Nick.txt", "r") do
                        msg1 = io.open("moonloader/config/PoliceHelp/Nick.txt", "r")
                    end

                    fileText = msg1:read("*a")

                    for test1 in fileText:gmatch("[^\r\n]+") do
                        imgui.Text(u8(test1))
                    end
                else
                    imgui.InputTextMultiline("##1", ListNickEdit, imgui.ImVec2(-0.1, -0.1))
                end

                if not EditNickList then
                    if imgui.Button(u8("Редактировать список"), imgui.ImVec2(215, 20)) then
                        EditNickList = true
                        ListNickEdit.v = u8(fileText)
                    end
                else
                    if imgui.Button(u8("Сохранить список"), imgui.ImVec2(140, 20)) then
                        msg2 = io.open("moonloader/config/PoliceHelp/Nick.txt", "w")

                        msg2:write(u8:decode(ListNickEdit[slot6].v))
                        msg2:flush()
                        msg2:close()

                        if doesFileExist("moonloader/config/PoliceHelp/Nick.txt") then
                            PlayerList = {}
                            MessageIMG = io.open("moonloader/config/PoliceHelp/Nick.txt", "r").read(test2, "*a")

                            for test3 in MessageIMG:gmatch("[^\r\n]+") do
                                PlayerList[#PlayerList + 1] = test3
                            end

                            io.close(test2)
                        end

                        EditNickList = false
                    end

                    imgui.SameLine(153)

                    if imgui.Button(u8("Отмена"), imgui.ImVec2(70, 20)) then
                        EditNickList = false
                    end
                end

Перед main:
Lua:
ListNickEdit = imgui.ImBuffer(17000)
EditNickList = false
PlayerList = {}
В main:
Lua:
if doesFileExist("moonloader/config/PoliceHelp/Nick.txt") then
            MessageIMG = io.open("moonloader/config/PoliceHelp/Nick.txt", "r").read(tester2, "*a")
            for tester1 in MessageIMG:gmatch("[^\r\n]+") do
                PlayerList[#PlayerList + 1] = tester1
            end

            io.close(tester2)
        end

Задача стоит в том чтоб взять с мультилайна текст и внести в txt
 
Последнее редактирование:

klk300

Участник
36
1
Уважаемые lua программисты. есть уже диалоговое окно imgui, там хочу добавить, что бы можно было забиндить клавишу для отыгровки. Допусти он выбирает B на клавиатуре в поле ввода и там будет эта отыгровка, помогите пожалуйста. Ниже скрин как все выглядит
imgui addons

Что не так?? Зависает гта.. Код нашел ..
Lua:
imgui.Text(u8("Список ников [" .. #PlayerList .. "]:"))

                if not EditNickList then
                    while not io.open("moonloader/config/PoliceHelp/Nick.txt", "r") do
                        msg1 = io.open("moonloader/config/PoliceHelp/Nick.txt", "r")
                    end

                    fileText = msg1:read("*a")

                    for test1 in fileText:gmatch("[^\r\n]+") do
                        imgui.Text(u8(test1))
                    end
                else
                    imgui.InputTextMultiline("##1", ListNickEdit, imgui.ImVec2(-0.1, -0.1))
                end

                if not EditNickList then
                    if imgui.Button(u8("Редактировать список"), imgui.ImVec2(215, 20)) then
                        EditNickList = true
                        ListNickEdit.v = u8(fileText)
                    end
                else
                    if imgui.Button(u8("Сохранить список"), imgui.ImVec2(140, 20)) then
                        msg2 = io.open("moonloader/config/PoliceHelp/Nick.txt", "w")

                        msg2:write(u8:decode(ListNickEdit[slot6].v))
                        msg2:flush()
                        msg2:close()

                        if doesFileExist("moonloader/config/PoliceHelp/Nick.txt") then
                            PlayerList = {}
                            MessageIMG = io.open("moonloader/config/PoliceHelp/Nick.txt", "r").read(test2, "*a")

                            for test3 in MessageIMG:gmatch("[^\r\n]+") do
                                PlayerList[#PlayerList + 1] = test3
                            end

                            io.close(test2)
                        end

                        EditNickList = false
                    end

                    imgui.SameLine(153)

                    if imgui.Button(u8("Отмена"), imgui.ImVec2(70, 20)) then
                        EditNickList = false
                    end
                end

Перед main:
Lua:
ListNickEdit = imgui.ImBuffer(17000)
EditNickList = false
PlayerList = {}
В main:
Lua:
if doesFileExist("moonloader/config/PoliceHelp/Nick.txt") then
            MessageIMG = io.open("moonloader/config/PoliceHelp/Nick.txt", "r").read(tester2, "*a")
            for tester1 in MessageIMG:gmatch("[^\r\n]+") do
                PlayerList[#PlayerList + 1] = tester1
            end

            io.close(tester2)
        end

Задача стоит в том чтоб взять с мультилайна текст и внести в txt
moonloader.log скинь
 

tlwsn

Известный
537
85
при использовании ассинхронных, из-за чего проблема?
Lua:
[22:47:06.933297] (script)    script: ...and Theft Auto - San Andreas\moonloader\lib\requests.lua:72: attempt to index local 'request' (a boolean value)
 

BARRY BRADLEY

Известный
711
176
imgui addons


moonloader.log скинь
Код:
[22:11:20.439890] (error)    [BB]_PoliceHelp: ...tar Games\GTA San Andreas\moonloader\[BB]_PoliceHelp.lua:825: attempt to index global 'msg1' (a nil value)
stack traceback:
    ...tar Games\GTA San Andreas\moonloader\[BB]_PoliceHelp.lua:825: in function 'OnDrawFrame'
    ...\Rockstar Games\GTA San Andreas\moonloader\lib\imgui.lua:1378: in function <...\Rockstar Games\GTA San Andreas\moonloader\lib\imgui.lua:1367>
[22:11:20.444890] (error)    [BB]_PoliceHelp: Script died due to an error. (01AC794C)
это если я убрал перед main doesExitsFile. С ним же просто зависает гта и все и ошибки в лог не выводит
 
Последнее редактирование:

DeMoN3D

Известный
366
77
Как в регулярке указать переход на другую строку самповского диалога? Там вроде \n но хотелось бы уточнить, как это выглядит в регулярке
 

MrCold

Активный
364
118
Обьясните пожалуйста этот код, в частности где брать offset, структуры и значения для опкода setStructFloatElement. А также можете пожалуйста рассказать про
setStructElement(только не пишите что он записывает значение целого в память по адресу и указанному оффсету размером от 1-го до 4-х байт. Мне нужно узнать откуда брать указатель на структуру, оффсет, размер, значение). Вот код, плиз напишите комментариями что каждый опкод делает):
Lua:
function sendPassengerSync(x, y, z)
    local _, myId = sampGetPlayerIdByCharHandle(PLAYER_PED)
    local data = allocateMemory(63)
    sampStorePlayerPassengerData(myId, data)
    setStructFloatElement(data, 12, x, false)
    setStructFloatElement(data, 16, y, false)
    setStructFloatElement(data, 20, z, false)
    setStructElement(data, 2, 1, 1, false)
    sampSendPassengerData(data)
    freeMemory(data)
end

function sendOnfootSync(x, y, z, veh)
    local _, myId = sampGetPlayerIdByCharHandle(PLAYER_PED)
    local data = allocateMemory(68)
    sampStorePlayerOnfootData(myId, data)
    setStructElement(data, 37, 1, 3, false)
    setStructFloatElement(data, 6, x, false)
    setStructFloatElement(data, 10, y, false)
    setStructFloatElement(data, 14, z, false)
    setStructElement(data, 62, 2, veh, false)
    sampSendOnfootData(data)
    freeMemory(data)
end
 

BARRY BRADLEY

Известный
711
176
Как вывести в InputText текст с конфига прямо в InputText, а не справа, но при это чтоб при нажатии кнопки оно сохраняло изменённый InputText (сохранение реализовал)
Код:
buffer.v = ini["test"]["test1"]
imgui.InputText('##test', buffer)
[КНОПКА]
Так не канает ибо не обновляет потом в конфиге.. Очень глупый код
 

astynk

Известный
Проверенный
742
532
Обьясните пожалуйста этот код, в частности где брать offset, структуры и значения для опкода setStructFloatElement. А также можете пожалуйста рассказать про
setStructElement(только не пишите что он записывает значение целого в память по адресу и указанному оффсету размером от 1-го до 4-х байт. Мне нужно узнать откуда брать указатель на структуру, оффсет, размер, значение). Вот код, плиз напишите комментариями что каждый опкод делает):
Lua:
function sendPassengerSync(x, y, z)
    local _, myId = sampGetPlayerIdByCharHandle(PLAYER_PED)
    local data = allocateMemory(63)
    sampStorePlayerPassengerData(myId, data)
    setStructFloatElement(data, 12, x, false)
    setStructFloatElement(data, 16, y, false)
    setStructFloatElement(data, 20, z, false)
    setStructElement(data, 2, 1, 1, false)
    sampSendPassengerData(data)
    freeMemory(data)
end

function sendOnfootSync(x, y, z, veh)
    local _, myId = sampGetPlayerIdByCharHandle(PLAYER_PED)
    local data = allocateMemory(68)
    sampStorePlayerOnfootData(myId, data)
    setStructElement(data, 37, 1, 3, false)
    setStructFloatElement(data, 6, x, false)
    setStructFloatElement(data, 10, y, false)
    setStructFloatElement(data, 14, z, false)
    setStructElement(data, 62, 2, veh, false)
    sampSendOnfootData(data)
    freeMemory(data)
end
Структуры всех пакетов есть в /lib/samp/synchronization.lua. int8 - это 1 байт, int16 - 2 байта, float - 4 байта. Складываешь кол-во байтов и получаешь нужный оффсет.
 

BARRY BRADLEY

Известный
711
176
Крч, есть .txt документ с текстом:
Код:
Тест
Тест2
Тест3
Как его преобразовать в таблицу?:
Код:
{
    "Тест",
    " тест2",
    "Тест3"
}