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

Ken Block

Известный
432
31
Как достать все ники из history (дудванс рпг) и делать с ними действия?
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,484
Есть функция которая проверяет установлен ли данный шрифт на компьютер?
Lua:
font = renderCreateFont('Arial', 10)
if font then --[[code]] end
Lua:
if doesFileExist(getFolderPath(0x14)..'/название шрифта, например trebucbd.ttf') then --[[code]] end

Lua:
function require 'lib.samp.events'.onShowDialog(id, style, title, b1, b2, text)
    if id == id then
        history = {}
        for w in string.gmatch(text, "[%a_%a%x]+") do
            table.insert(history, w)
        end
    end
end
Ну конечно id будет равен id, что за фигню написал
 

Caton

Участник
64
17
Код:
local sampev =     require 'lib.samp.events'
local kek_state = false

function main()
    repeat wait(0) until isSampAvailable()
    wait(2000)
    sampRegisterChatCommand('kek', kek)
    while true do
        wait(0)
    end
end

function kek()
    if kek_state then
    kek_state = false
    sampAddChatMessage("Выключен", -2)
else
        kek_state = true
        sampAddChatMessage("Включен", -1)
    end
end

function sampev.onServerMessage(color, text)
  if text:find('[Ошибка] Вы уже активировали промо-код!') then
    sampProcessChatInput('/q')
  end
end
не могу понять в чем проблема. Мне должна выйти надпись [Ошибка] Вы уже активировали промо-код! и я должен выйти из игры, но почему-то когда надпись выходит, ничего тупо не происходит
 

sakovnv

Участник
72
0
Еще вопрос, есть imgui окно в котором находится лог чата и если там очень много строк, то начинает приседать фпс. Можно как то обойти это не удаляя строк?
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,484
Код:
local sampev =     require 'lib.samp.events'
local kek_state = false

function main()
    repeat wait(0) until isSampAvailable()
    wait(2000)
    sampRegisterChatCommand('kek', kek)
    while true do
        wait(0)
    end
end

function kek()
    if kek_state then
    kek_state = false
    sampAddChatMessage("Выключен", -2)
else
        kek_state = true
        sampAddChatMessage("Включен", -1)
    end
end

function sampev.onServerMessage(color, text)
  if text:find('[Ошибка] Вы уже активировали промо-код!') then
    sampProcessChatInput('/q')
  end
end
не могу понять в чем проблема. Мне должна выйти надпись [Ошибка] Вы уже активировали промо-код! и я должен выйти из игры, но почему-то когда надпись выходит, ничего тупо не происходит
Для начала посмотри эту строку в логах чата, может быть там есть цвета (например: {ff0000})

-------------------------------------
Еще вопрос, есть imgui окно в котором находится лог чата и если там очень много строк, то начинает приседать фпс. Можно как то обойти это не удаляя строк?
Нет, ведь каждая строка рендерится по отдельности.
 

Caton

Участник
64
17
Для начала посмотри эту строку в логах чата, может быть там есть цвета (например: {ff0000})

-------------------------------------

Нет, ведь каждая строка рендерится по отдельности.
[Ошибка] {FFFFFF}Вы уже активировали промо-код!
Поставил щас его вместо того текста, затестил - все равно ниччего не происходит
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,484
[Ошибка] {FFFFFF}Вы уже активировали промо-код!
Поставил щас его вместо того текста, затестил - все равно ниччего не происходит
Lua:
function sampev.onServerMessage(color, text)
    if text:find('[Ошибка].+Вы уже активировали промо') then
        sampProcessChatInput('/q')
    end
end
 

Caton

Участник
64
17
Lua:
"%[Ошибка%] {FFFFFF}Вы уже активировали промо-код!"
на это замени
upload_2018-11-13_16-47-12.png

Неа, не помогает (если че скинул надпись)
 

tlwsn

Известный
537
85
как можно получить все текстовые файлы, которые лежат в папке moonloader/txts
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,484
как можно получить все текстовые файлы, которые лежат в папке moonloader/txts
Переделай под себя
Lua:
function getFilesSpur()
    local files = {}
    local handleFile, nameFile = findFirstFile('moonloader/Police Helper/Spurs/*.txt')
    while nameFile do
        if handleFile then
            if not nameFile then 
                findClose(handleFile)
            else
                files[#files+1] = nameFile
                nameFile = findNextFile(handleFile)
            end
        end
    end
    return files
end
 
  • Нравится
Реакции: tlwsn и CatKnight