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

CaJlaT

Овощ
Модератор
2,809
2,623
[ML] (error) ...d Theft Auto San Andreas XXXXX\moonloader\admincheck.lua:7: attempt to index local 'font_flags' (a nil value)
stack traceback:
...d Theft Auto San Andreas XXXXX\moonloader\admincheck.lua:7: in main chunk
Ладно, я хуйню сморозил...
Снова чекнул либу, а там....
1612208431802.png
Рабочий код:
Lua:
local font_flag = require('lib.moonloader').font_flag
print(font_flag.BOLD + font_flag.BORDER) -- out: 5
 
  • Нравится
Реакции: copypaste_scripter

Nelit

Потрачен
252
38
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как воспроизвести любой мп3 файл если условие выполняется?
 

copypaste_scripter

Известный
1,219
225
Ладно, я хуйню сморозил...
Снова чекнул либу, а там....
Посмотреть вложение 84991Рабочий код:
Lua:
local font_flag = require('lib.moonloader').font_flag
print(font_flag.BOLD + font_flag.BORDER) -- out: 5
да блин опять тот же пишет:
script_name("Admincheck1337 v0.1")
script_author("L1ct0r")

local inicfg = require 'inicfg'

local font_flag = require('moonloader').font_flag
local my_font = renderCreateFont('Arial', 8, font_flag.BOLD + font_flag.BORDER)

local sampev = require 'lib.samp.events'

local showadmins = true
local showplayers = true

local mainIni = inicfg.load({
    admins = {}
})

function sampev.onServerMessage(color,msg)
    if msg:find("Администратор") and color == -10270721 then
        local nick = string.match(msg,"%a+_%a+")
        local found = false
        for _,v in pairs(mainIni.admins) do
            if v == nick and not found then
                found = true
            end
        end
        if found == false then
            sampAddChatMessage("Новый админ! Это - "..nick,-255)
            table.insert(mainIni.admins,nick)
            inicfg.save(mainIni)
        end
    end
end

function admcheck(arg)
    if #arg == 0 then
        sampAddChatMessage("Неправильный синтаксис команды! Попробуйте /admcheck [int state]",-255)
    elseif arg == "1" then
        showadmins = true
    else
        showadmins = false
    end
end

function plycheck(arg)
    if #arg == 0 then
        sampAddChatMessage("Неправильный синтаксис команды! Попробуйте /plycheck [int state]",-255)
    elseif arg == "1" then
        showplayers = true
    else
        showplayers = false
    end
end

function mySort(a,b)
    if  a[2] < b [2] then
        return true
    end
    return false
end

function main()
    while not isSampAvailable() do wait(0) end
    local resX, resY = getScreenResolution()
    sampRegisterChatCommand("admcheck", admcheck)
    sampRegisterChatCommand("plycheck", plycheck)
    while true do
        wait(0)
        if showplayers then
        local tbl = {}
        local ids = {}
        for _,v in pairs(getAllChars()) do
            local result, id = sampGetPlayerIdByCharHandle(v)
            if result and v ~= PLAYER_PED then
                local name = sampGetPlayerNickname(id)
                table.insert(tbl,{name,id})
            end
        end
        table.sort (tbl, mySort)
        local y = -1
        local n = 0
        for _,v in pairs(tbl) do
            local found = false
            for _,vv in pairs(mainIni.admins) do
                if vv == v[1] and not found then
                    found = true
                end
            end
            y = y + 1
            if (resY/4.25)+_*13 > resY and n == 0 then
                n = 1
                y = 0
            end
            if found == false then
                renderFontDrawText(my_font, v[1].."["..v[2].."]", resX/27+n*150, (resY/4.25)+y*13, 0xFFFFFFFF)
            else
                renderFontDrawText(my_font, v[1].."["..v[2].."]", resX/27+n*150, (resY/4.25)+y*13, -255)
            end
        end
        end
        if showadmins then
        local admtbl = {}
        for id = 0, sampGetMaxPlayerId() do
            if sampIsPlayerConnected(id) then
                local name = sampGetPlayerNickname(id)
                local found = false
                for _,vv in pairs(mainIni.admins) do
                    if vv == name and not found then
                        found = true
                    end
                end
                if found == true then table.insert(admtbl,{name,id}) end
            end
        end
        for _,v in pairs(admtbl) do
            renderFontDrawText(my_font, v[1], resX-(resX/27*3), (resY/4.25)+_*13, -255)
        end
        end
    end
end



[ML] (system) Loading script 'D:\Games\Grand Theft Auto San Andreas XXXXX\moonloader\admincheck.lua'...
[ML] (system) Admincheck1337 v0.1: Script terminated. (21AB5DC4)
[ML] (error) ...d Theft Auto San Andreas XXXXX\moonloader\admincheck.lua:7: attempt to index local 'font_flag' (a nil value)
stack traceback:
...d Theft Auto San Andreas XXXXX\moonloader\admincheck.lua:7: in main chunk
 

CaJlaT

Овощ
Модератор
2,809
2,623
да блин опять тот же пишет:
script_name("Admincheck1337 v0.1")
script_author("L1ct0r")

local inicfg = require 'inicfg'

local font_flag = require('moonloader').font_flag
local my_font = renderCreateFont('Arial', 8, font_flag.BOLD + font_flag.BORDER)

local sampev = require 'lib.samp.events'

local showadmins = true
local showplayers = true

local mainIni = inicfg.load({
    admins = {}
})

function sampev.onServerMessage(color,msg)
    if msg:find("Администратор") and color == -10270721 then
        local nick = string.match(msg,"%a+_%a+")
        local found = false
        for _,v in pairs(mainIni.admins) do
            if v == nick and not found then
                found = true
            end
        end
        if found == false then
            sampAddChatMessage("Новый админ! Это - "..nick,-255)
            table.insert(mainIni.admins,nick)
            inicfg.save(mainIni)
        end
    end
end

function admcheck(arg)
    if #arg == 0 then
        sampAddChatMessage("Неправильный синтаксис команды! Попробуйте /admcheck [int state]",-255)
    elseif arg == "1" then
        showadmins = true
    else
        showadmins = false
    end
end

function plycheck(arg)
    if #arg == 0 then
        sampAddChatMessage("Неправильный синтаксис команды! Попробуйте /plycheck [int state]",-255)
    elseif arg == "1" then
        showplayers = true
    else
        showplayers = false
    end
end

function mySort(a,b)
    if  a[2] < b [2] then
        return true
    end
    return false
end

function main()
    while not isSampAvailable() do wait(0) end
    local resX, resY = getScreenResolution()
    sampRegisterChatCommand("admcheck", admcheck)
    sampRegisterChatCommand("plycheck", plycheck)
    while true do
        wait(0)
        if showplayers then
        local tbl = {}
        local ids = {}
        for _,v in pairs(getAllChars()) do
            local result, id = sampGetPlayerIdByCharHandle(v)
            if result and v ~= PLAYER_PED then
                local name = sampGetPlayerNickname(id)
                table.insert(tbl,{name,id})
            end
        end
        table.sort (tbl, mySort)
        local y = -1
        local n = 0
        for _,v in pairs(tbl) do
            local found = false
            for _,vv in pairs(mainIni.admins) do
                if vv == v[1] and not found then
                    found = true
                end
            end
            y = y + 1
            if (resY/4.25)+_*13 > resY and n == 0 then
                n = 1
                y = 0
            end
            if found == false then
                renderFontDrawText(my_font, v[1].."["..v[2].."]", resX/27+n*150, (resY/4.25)+y*13, 0xFFFFFFFF)
            else
                renderFontDrawText(my_font, v[1].."["..v[2].."]", resX/27+n*150, (resY/4.25)+y*13, -255)
            end
        end
        end
        if showadmins then
        local admtbl = {}
        for id = 0, sampGetMaxPlayerId() do
            if sampIsPlayerConnected(id) then
                local name = sampGetPlayerNickname(id)
                local found = false
                for _,vv in pairs(mainIni.admins) do
                    if vv == name and not found then
                        found = true
                    end
                end
                if found == true then table.insert(admtbl,{name,id}) end
            end
        end
        for _,v in pairs(admtbl) do
            renderFontDrawText(my_font, v[1], resX-(resX/27*3), (resY/4.25)+_*13, -255)
        end
        end
    end
end



[ML] (system) Loading script 'D:\Games\Grand Theft Auto San Andreas XXXXX\moonloader\admincheck.lua'...
[ML] (system) Admincheck1337 v0.1: Script terminated. (21AB5DC4)
[ML] (error) ...d Theft Auto San Andreas XXXXX\moonloader\admincheck.lua:7: attempt to index local 'font_flag' (a nil value)
stack traceback:
...d Theft Auto San Andreas XXXXX\moonloader\admincheck.lua:7: in main chunk
в папку либ и нет проблем
 

Вложения

  • moonloader.lua
    3.1 KB · Просмотры: 6
  • Нравится
Реакции: copypaste_scripter

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,791
11,263
Почему игра крашится?

начало кода:
local fa = require 'faIcons'
local fa_large = require 'faIcons'

local font1 = nil
local font2 = nil
local font3 = nil
local fa_font = nil


BeforeDrawFrame:
function imgui.BeforeDrawFrame()
    if font1 == nil then
        font1 = imgui.GetIO().Fonts:AddFontFromFileTTF(getFolderPath(0x14) .. '\\trebucbd.ttf', 15.0, nil, imgui.GetIO().Fonts:GetGlyphRangesCyrillic()) -- вместо 30 любой нужный размер
    end

    if font2 == nil then
        font2 = imgui.GetIO().Fonts:AddFontFromFileTTF(getFolderPath(0x14) .. '\\trebucbd.ttf', 30.0, nil, imgui.GetIO().Fonts:GetGlyphRangesCyrillic()) -- вместо 30 любой нужный размер
    end

    if font3 == nil then
        font3 = imgui.GetIO().Fonts:AddFontFromFileTTF(getFolderPath(0x14) .. '\\trebucbd.ttf', 70.0, nil, imgui.GetIO().Fonts:GetGlyphRangesCyrillic()) -- вместо 30 любой нужный размер
    end

    if fa_font == nil then
        local font_config = imgui.ImFontConfig() -- to use 'imgui.ImFontConfig.new()' on error
        font_config.MergeMode = true
        fa_font = imgui.GetIO().Fonts:AddFontFromFileTTF('moonloader/resource/fonts/fontawesome-webfont.ttf', 14.0, font_config, fa_glyph_ranges)
    end
end

onDrawFrame:
imgui.PushFont(font2)
imgui.Text('hello world')
imgui.PopFont()

если закомментировать beforeDrawFrame то все норм
 

nomio

Известный
551
208
ребята помогите мне нужна функция которая к примеру находит в табе нужный мне ник
Lua:
for i = 0, 999 do -- цикл от 0 до 999 с шагом 1
   local PlayerName = sampGetPlayerNickname(i)
   if PlayerName == Argumnets then
        print("Игрок с ником "..Arguments.." найден! Его ид "..i)
    end
end


Вроде все так,знатоки поправят
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,791
11,263
Почему imgui.Text(u8(fa.ICON_LOCK))превращается в
1612211674498.png
?


Lua:
imgui.PushFont(font1)
imgui.SetCursorPos(imgui.ImVec2(5, 50))
imgui.Text(fa.ICON_HEART)
imgui.PopFont()
1612211912935.png
 

Nelit

Потрачен
252
38
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как зафризить управление игрока А потом через секунд 40 разфризить??