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

wD.D159

Известный
Друг
446
479
Ребята, сегодня нашел у себя интересный баг. Он связан с функцией sampTextdrawDelete(td id).
Заключается он в следующем:

У нас имеются в скрипте окошки imgui, а так же есть скрипт который использует функцию удаления TD, и если функция удаления была задействована, то окошки imgui начинают багаться, но только при наличии за ними эффектов игры (нитро, взрывы....). Они пропадают, и только в месте где имеется эффект видна часть окошка. Не знаю, возможно ли как-то пофиксить это все...

PS: последний скрин в порядке, добавлен для визуального понятия проблемы =)
 

Вложения

  • sa-mp-035.png
    sa-mp-035.png
    396.5 KB · Просмотры: 108
  • sa-mp-030.png
    sa-mp-030.png
    284.3 KB · Просмотры: 139
  • sa-mp-034.png
    sa-mp-034.png
    382.8 KB · Просмотры: 140
  • sa-mp-038.png
    sa-mp-038.png
    374 KB · Просмотры: 139

ШPEK

Известный
1,476
524
Как на луа написать скрипт, который будет запоминать число, при воде команды в чат. Например, пишу я /afind 25, и у меня 25 как локальная переменная.
Lua:
function main()
sampRegisterChatCommand("afind", function(param) sampAddChatMessage(param, -1) end)
wait(-1)
end
 

AnWu

Guardian of Order
Всефорумный модератор
4,690
5,193
Ребята, сегодня нашел у себя интересный баг. Он связан с функцией sampTextdrawDelete(td id).
Заключается он в следующем:

У нас имеются в скрипте окошки imgui, а так же есть скрипт который использует функцию удаления TD, и если функция удаления была задействована, то окошки imgui начинают багаться, но только при наличии за ними эффектов игры (нитро, взрывы....). Они пропадают, и только в месте где имеется эффект видна часть окошка. Не знаю, возможно ли как-то пофиксить это все...

PS: последний скрин в порядке, добавлен для визуального понятия проблемы =)
конфликт имгуи и енб
 

Gromov512

Новичок
85
2

DonHomka, Хелпани плиз

Почему не срабатывает удаление того что было взято с файла ?

Lua:
function LoadNewAccount()

    ansfile = io.open(folder_drp..'/list_account.txt', 'r')
    for line in ansfile:lines() do
        server, nick, pass = line:match('(.*):(.*):(.*)')
        if nil ~= server or nil ~= nick or nil ~= pass then
            if server:find(ServerName) then
                printLog('Бот взял аккаунт из базы log_acc.txt')
                setNickName(nick)
                setPassword(pass)
                botPassword = pass
            end
        end
    end

    local ansfile = io.open(folder_drp..'/list_account.txt', 'r')
    local fileread = ansfile:read('a*')
    local fileread = fileread:gsub(server..':'..nick..':'..pass..'\n', '')
    ansfile:close()

    local ansfile = io.open(folder_drp..'/list_account.txt', 'w')
    ansfile:write(fileread)
    ansfile:close()

end
 

Petr_Sergeevich

Известный
Проверенный
707
296
Lua:
                            sampShowDialog(15004, "Строки таблицы", table.concat(t, "\n"), "Принять", "Закрыть", 4)
                            lua_thread.create(function()
                                while true do
                                    wait(0)
                                    local result, button, list, input = sampHasDialogRespond(15004)
                                    for i = 0, #t - 1 do
                                        if result and list == i and button == 1 then
                                            sampShowDialog(15005, " ", "Удалить строку?", "Да", "Нет", 0)
                                            lua_thread.create(function()
                                                while true do
                                                    wait(0)
                                                    local res, but, lis, inp = sampHasDialogRespond(15005)
                                                    if res and but == 1 then
                                                        sampAddChatMessage("Строка "..t[i + 1].." удалена.", -1)
                                                        table.remove(t, i + 1)
                                                    end
                                                end
                                            end)
                                        end
                                    end
                                end
                            end)

Проблема в том, что работает неправильно.
У меня постоянно при sampAddChatMessage("Строка "..t[i + 1].." удалена.", -1) пишет одну и ту же строку.
Правильное удаление получается только с той строки, с которой первая строка была убрана изначально.
Возможно неправильно описал, но работает эта херня криво. Уже несколько часов понять не могу, почему так, помогите, пожалуйста.

Как должно быть: есть обычная таблица, заполненная рандомными строками, мы вызываем диалог, где каждая строка отображается на отдельной линии (table.concat(t, "\n")). Если мы выберем какую-нибудь строку, то откроется диалоговое окно с подтверждением "Действительно ли вы хотите удалить эту строку?", как только мы выбираем "Да", строка удаляется из таблицы.

Если делать без цикла, через
if list == 0 ... then
...
elseif list == 1 ... then
...
end
то всё работает нормально

Ещё, если удаление делать без создания доп. диалогового окна, тоже норм работает
 
Последнее редактирование:

ufdhbi

Известный
Проверенный
1,455
861
Lua:
                            sampShowDialog(15004, "{FFFFFF}Строки таблицы: "..#t, table.concat(t, "\n"), "{FFFFFF}Принять", "{FFFFFF}Закрыть", 4)
                            lua_thread.create(function()
                                while true do
                                    wait(0)
                                    local result, button, list, input = sampHasDialogRespond(15004)
                                    for i = 0, #t - 1 do
                                        if result and list == i and button == 1 then
                                            sampShowDialog(15005, " ", "{FFFFFF}Удалить строку?", "{FFFFFF}Да", "{FFFFFF}Нет", 0)
                                            lua_thread.create(function()
                                                while true do
                                                    wait(0)
                                                    local res, but, lis, inp = sampHasDialogRespond(15005)
                                                    if res and but == 1 then
                                                        sampAddChatMessage("Строка "..t[i + 1].." удалена.", -1)
                                                        table.remove(t, i + 1)
                                                    end
                                                end
                                            end)
                                        end
                                    end
                                end
                            end)

Проблема в том, что работает неправильно.
У меня постоянно при sampAddChatMessage("Строка "..t[i + 1].." удалена.", -1) пишет одну и ту же строку.
Правильное удаление получается только с той строки, с которой первая строка была убрана изначально.
Возможно неправильно описал, но работает эта херня криво. Уже несколько часов понять не могу, почему так, помогите, пожалуйста.

Как должно быть: есть обычная таблица, заполненная рандомными строками, мы вызываем диалог, где каждая строка отображается на отдельной линии (table.concat(t, "\n")). Если мы выберем какую-нибудь строку, то откроется диалоговое окно с подтверждением "Действительно ли вы хотите удалить эту строку?", как только мы выбираем "Да", строка удаляется из таблицы.
for i = #t, 0, -1 do попробуй
 

Petr_Sergeevich

Известный
Проверенный
707
296
почему бы не внести list выбранный в переменную и использовать при table.remove его?
Что-то не помогает.. Вот небольшой пример, сделал, чтобы разобраться.
Можешь запустить, проверить
 

Вложения

  • Test.lua
    1 KB · Просмотры: 4

bodyammm1

Новичок
15
1
Код:
1 - ARP: 12.32.45.324:9999
2 - DRP: 123.24.5.61:1111
3 - ARZ: 123.423.645.3:4444
Что надо сделать, чтобы вводя команду /hrc(моя команда) 1 в следующий код:
Lua:
sampDisconnectWithReason(truе)
sampConnectToServer("__",__)
вместо ___ скрипт искал айпи и порт по строке в файле(т.е ввёл айпи АРП)
Задумка была такая, что первое число в строке определяет на какой сервер подключиться, т.е /hrc (цифра) - какой-то сервер с файла
 
Последнее редактирование: