Вопросы по 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
 
Последнее редактирование:
1,417
1,029
У меня получилось такое:
Lua:
        -- где то в начале
local NameFile = inicfg.load({
    Test =
    {
        Text = "Тут нужно написать текст (Перед тем как вставить текст, удалите всё написанное тут)"
    }
}, "example/NameFile")

        -- в imgui.OnDrawFrame
        if show_imgui_test then
            imgui.Begin(u8'Titile', show_imgui_test)
            local result = inicfg.load(nil, "NameFile")
            if result ~= nil then
                imgui.Text(result)
            end
            imgui.End()
        end
Захожу в игру, открываю окно, а том "(null)".
Файл NameFile находится в папке moonloader/config/example/NameFile.ini
p.s файл NameFile.ini содержит текст
Lua:
if NameFile then
    imgui.Text(NameFile.Test.Text)
end
Что если делать каким-то таким образом? Почему выскакивает (null)?
Lua:
        if show_imgui_test.v then
            local FileName = inicfg.load("config\\example\\FileName")
            imgui.Begin(u8'Titile', show_imgui_test)
        imgui.Text(FileName)
            imgui.End()
        end
p.s в файле написано очень много строк)
p.s.s ну помогите мне уже с работой с файлами ибо это хрень какая-то. Все ваши советы перебрал
ты дурак?
 

f0rtrix

Известный
208
15
Ну как тебе сказать... я все делал как говорили выше.. итог 0. Я попросил изначально:
Здарова всем, всех с 9 мая. Такой вопросик:
Можете написать каким образом мне открыть файл, который находится в папке "moonloader/config", а файл называется "test.ini". Там находится много строк текста, который нужно вывести в imgui.Text() с кодировкой u8 (( u8 = encoding.UTF8 ))
p.s всем кто ответит большое спасибо :)
Мне скинули ссылку, я начал по ней пытать что-то сделать - не вышло, обратился снова... и мне сказали как это делать через inicfg, но согласись это бред делать так:
Код:
[Example]
Text = и сюда вставлять текст
Я попросил, что-бы подсказали как сделать без фигни выше... ответ был такой:
Lua:
NameFile.Test.Text = 'new text.'
inicfg.save(NameFile, 'example/NameFile')
Я сделал так, добавил/изменил пару строк и в итоге текста нет вообще...
После ответа содержащего полезную информацию не было...
p.s что то мне кажется, что ответа больше и не будет :(
 
Последнее редактирование:

f0rtrix

Известный
208
15
Добрый вечер, вот такая проблема. Я написал немножко такой код, задача которого считывать данные из файла и присваивать их какой нибудь переменной и выводить через imgui.Text. Я насочинял примерное такое:
Lua:
       -- в начале
      local dir = "moonloader\\config\\example"
      local test = dir .. "gTest.ini"

       -- в imgui.OnDrawFrame
       if show_imgui_test.v then
           local sw, sh = getScreenResolution() -- center
           imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
           imgui.SetNextWindowSize(imgui.ImVec2(600, 600), imgui.Cond.FirstUseEver)
           imgui.Begin(u8'Title', show_imgui_test)
           local test1 = io.open(test, "test1")
           local lastTest = nil
           if(test1 ~= nil) then
               lastTest = test1:read("*a")
           end
       imgui.Text(lastTest)
           test1:close()
           imgui.End()
       end

Я открываю это окно и у меня моментально samp зависает и не крашит, а именно "Программа не отвечает, закрыть ее?"
p.s текст там есть, файл создан по указанному пути. подскажи пожалуйста
p.s.s заранее большое спасибо
 
  • Нравится
Реакции: uczoja62

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,635
2,485
Добрый вечер, вот такая проблема. Я написал немножко такой код, задача которого считывать данные из файла и присваивать их какой нибудь переменной и выводить через imgui.Text. Я насочинял примерное такое:
Lua:
       -- в начале
      local dir = "moonloader\\config\\example"
      local test = dir .. "gTest.ini"

       -- в imgui.OnDrawFrame
       if show_imgui_test.v then
           local sw, sh = getScreenResolution() -- center
           imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
           imgui.SetNextWindowSize(imgui.ImVec2(600, 600), imgui.Cond.FirstUseEver)
           imgui.Begin(u8'Title', show_imgui_test)
           local test1 = io.open(test, "test1")
           local lastTest = nil
           if(test1 ~= nil) then
               lastTest = test1:read("*a")
           end
       imgui.Text(lastTest)
           test1:close()
           imgui.End()
       end

Я открываю это окно и у меня моментально samp зависает и не крашит, а именно "Программа не отвечает, закрыть ее?"
p.s текст там есть, файл создан по указанному пути. подскажи пожалуйста
p.s.s заранее большое спасибо
В начало скрипта:
Lua:
show_imgui_test = imgui.ImBool(false)
 

f0rtrix

Известный
208
15
После каждого действия print('номер')
Переделал немного код и теперь вот что:
Lua:
        if show_imgui_test.v then
            local sw, sh = getScreenResolution() -- center
            imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
            imgui.SetNextWindowSize(imgui.ImVec2(600, 600), imgui.Cond.FirstUseEver)
            imgui.Begin(u8'Title', show_imgui_test)
            local FileName = io.open(moonloader\\config\\example\\test.ini)
            FileName:read("*all")
            FileName:close()
            imgui.Text(u8(FileName))
            imgui.End()
        end
[ML] (error) Script v1.0: D:\Games\GTA_San_Andreas-0.2\moonloader\script.lua:249: attempt to index local 'FileName' (a nil value)
stack traceback:
D:\Games\GTA_San_Andreas-0.2\moonloader\script.lua:249: in function 'OnDrawFrame'
D:\Games\GTA_San_Andreas-0.2\moonloader\lib\imgui.lua:1377: in function <D:\Games\GTA_San_Andreas-0.2\moonloader\lib\imgui.lua:1366>
[ML] (error) Script: Script died due to an error. (1EBA781C)
И что делать? Чего-т как то не очень продумана система работы с файлами, или она не раскрыта :(
 
Последнее редактирование:

AnWu

Guardian of Order
Всефорумный модератор
4,690
5,193
Переделал немного код и теперь вот что:
Lua:
        if show_imgui_test.v then
            local sw, sh = getScreenResolution() -- center
            imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
            imgui.SetNextWindowSize(imgui.ImVec2(600, 600), imgui.Cond.FirstUseEver)
            imgui.Begin(u8'Title', show_imgui_test)
            local FileName = io.open(moonloader\\config\\example\\test.ini)
            FileName:read("*all")
            FileName:close()
            imgui.Text(u8(FileName))
            imgui.End()
        end
[ML] (error) Script v1.0: D:\Games\GTA_San_Andreas-0.2\moonloader\script.lua:249: attempt to index local 'FileName' (a nil value)
stack traceback:
D:\Games\GTA_San_Andreas-0.2\moonloader\script.lua:249: in function 'OnDrawFrame'
D:\Games\GTA_San_Andreas-0.2\moonloader\lib\imgui.lua:1377: in function <D:\Games\GTA_San_Andreas-0.2\moonloader\lib\imgui.lua:1366>
[ML] (error) Script: Script died due to an error. (1EBA781C)
И что делать? Чего-т как то не очень продумана система работы с файлами, или она не раскрыта :(
Проверку не сделал
if FileName then
code
end

Не поставил ковычки при указании пути файла. Что за мелочами не следишь то
 

f0rtrix

Известный
208
15
Проверку не сделал
if FileName then
code
end

Не поставил ковычки при указании пути файла. Что за мелочами не следишь то
Спасибо огромное, это был единственный хороший ответ, который принес пользу. Но такой вопросик, у меня текст не все строчки показывает, то есть строк 50 покажет, а остальное пропадает, мб там как то размер текста в input.Text можно указать?
 

AnWu

Guardian of Order
Всефорумный модератор
4,690
5,193
Спасибо огромное, это был единственный хороший ответ, который принес пользу. Но такой вопросик, у меня текст не все строчки показывает, то есть строк 50 покажет, а остальное пропадает, мб там как то размер текста в input.Text можно указать?
не.
дели текст на строки например и через цикл показывай
 

Jason2222

Известный
180
3
Как можно вывести ники игроков, которые мне известны, в диалоговое окно, предварительно проверив, есть ли они на сервере?
Как это в этом окне.
bDeeGDZ.png