Вопросы по 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

07.11.2024 14:55
Модератор
2,835
2,673
то, что ты мне предлагаешь это равносильно тому, что я создам блокнотик и в него буду записывать
Lua:
local samp = require 'samp.events'
local inicfg = require 'inicfg'
local mainIni = inicfg.load({
config =
    {
        za_den = 0,
        data = os.date('%x')
    }
}, "bla-bla.ini")
if not doesFileExist('moonloader/config/bla-bla.ini') then inicfg.save(mainIni, 'bla-bla.ini') end
function main()
    sampRegisterChatCommand('skolko', function() sampAddChatMessage('Stolko: '..mainIni.config.za_den, -1) end)
    while true do
        wait(0)
        if mainIni.config.data ~= os.date('%x') then
            sampAddChatMessage('Новый день, сброс данных', -1)
            mainIni.config.za_den = 0
            mainIni.config.data = os.date('%x')
            inicfg.save(mainIni, 'bla-bla.ini')
        end
    end
end
function samp.onSendCommand(cmd)
    if cmd:find('^/hui') then
        mainIni.config.za_den = mainIni.config.za_den + 1
        inicfg.save(mainIni, 'bla-bla.ini')
    end
end
 
  • Нравится
Реакции: thedqrkway

meosh

Новичок
20
0
Хочу сделать слайдеры выдает ошибку.
025beta:
local show_imgui_example = imgui.ImBool(false)


local imgui = require 'imgui'
local encoding = require 'encoding' -- загружаем библиотеку
encoding.default = 'CP1251' -- указываем кодировку по умолчанию, она должна совпадать с кодировкой файла. CP1251 - это Windows-1251
u8 = encoding.UTF8 -- и создаём короткий псевдоним для кодировщика UTF-8

local test_text_buffer = imgui.ImBuffer(256)

function imgui.OnDrawFrame()
    if show_imgui_example.v then
        imgui.Begin('ImGui example', show_imgui_example)
        imgui.Text('Hello, world!')
        imgui.SliderFloat('float', slider_float, 0.0, 1.0)
        imgui.ColorEdit3('clear color', clear_color)
        if imgui.Button('Test Window') then
            show_test_window.v = not show_test_window.v
        end
        if imgui.Button('Another Window') then
            show_another_window.v = not show_another_window.v
        end
        local framerate = imgui.GetIO().Framerate
        imgui.Text(string.format('Application average %.3f ms/frame (%.1f FPS)', 1000.0 / framerate, framerate))
        imgui.End()
    end

    if show_another_window.v then
        imgui.Begin('Another Window', show_another_window)
        imgui.Text('Hello from another window!')
        imgui.End()
    end

    if show_test_window.v then
        imgui.SetNextWindowPos(imgui.ImVec2(650, 20), imgui.Cond.FirstUseEver)
        imgui.ShowTestWindow(show_test_window)
    end
end

function main()
    sampRegisterChatCommand("imgui", cmd_imgui)
  imgui.Process = true
end

function cmd_imgui()
    state = not state
    if state then
    end
end
 

SHARLYBUTTOM

Известный
598
119
Можно подробнее о потоке lua_create?
О возможности wait(), вне главной функции?
Я что то не очень понял.
 

Orlov

Новичок
10
1
дайте паже подробную статейку про шаблоны луа, там всякие textmatch, textfind, ну где ещё $[%d]/ как то так. нигде не нашел :(
 

CaJlaT

07.11.2024 14:55
Модератор
2,835
2,673
Хочу сделать слайдеры выдает ошибку.
025beta:
local show_imgui_example = imgui.ImBool(false)


local imgui = require 'imgui'
local encoding = require 'encoding' -- загружаем библиотеку
encoding.default = 'CP1251' -- указываем кодировку по умолчанию, она должна совпадать с кодировкой файла. CP1251 - это Windows-1251
u8 = encoding.UTF8 -- и создаём короткий псевдоним для кодировщика UTF-8

local test_text_buffer = imgui.ImBuffer(256)

function imgui.OnDrawFrame()
    if show_imgui_example.v then
        imgui.Begin('ImGui example', show_imgui_example)
        imgui.Text('Hello, world!')
        imgui.SliderFloat('float', slider_float, 0.0, 1.0)
        imgui.ColorEdit3('clear color', clear_color)
        if imgui.Button('Test Window') then
            show_test_window.v = not show_test_window.v
        end
        if imgui.Button('Another Window') then
            show_another_window.v = not show_another_window.v
        end
        local framerate = imgui.GetIO().Framerate
        imgui.Text(string.format('Application average %.3f ms/frame (%.1f FPS)', 1000.0 / framerate, framerate))
        imgui.End()
    end

    if show_another_window.v then
        imgui.Begin('Another Window', show_another_window)
        imgui.Text('Hello from another window!')
        imgui.End()
    end

    if show_test_window.v then
        imgui.SetNextWindowPos(imgui.ImVec2(650, 20), imgui.Cond.FirstUseEver)
        imgui.ShowTestWindow(show_test_window)
    end
end

function main()
    sampRegisterChatCommand("imgui", cmd_imgui)
  imgui.Process = true
end

function cmd_imgui()
    state = not state
    if state then
    end
end
Переменную не задал для слайдера
Lua:
local slider_float = imgui.ImFloat(0.0)
 
  • Нравится
Реакции: meosh

CaJlaT

07.11.2024 14:55
Модератор
2,835
2,673
дайте паже подробную статейку про шаблоны луа, там всякие textmatch, textfind, ну где ещё $[%d]/ как то так. нигде не нашел :(
Можно подробнее о потоке lua_create?
О возможности wait(), вне главной функции?
Я что то не очень понял.
 

yummyme

Участник
36
1
Вообщем, есть ini файл в котором есть название и значение, например "Number = 112233", как реализовать смену значения Name с окна Imgui? Какую функцию использовать?
 

meosh

Новичок
20
0
выдает в консоли
(error) Imgui: D:\New GTA debila a che\moonloader\imguikakoeta.lua:12: attempt to index global 'show_imgui_example' (a nil value)
stack traceback:
025beta:
script_name ('Imgui')
script_author ('rockyanderson')
script_description ('imgui okna')

local tag ="[By Rocky Anderson]:{CECECE}"
local label = 1
local main_color = 0xB5B5B5
local main_color_text = "{19FFF4}"
local white_color = "{FFFFFF}"

-- Standard ImGui example
if show_imgui_example.v then
    local slider_float = imgui.ImFloat(0.0)
    imgui.Begin('ImGui example', show_imgui_example)
    imgui.Text('Hello, world!')
    imgui.SliderFloat('float', slider_float, 0.0, 1.0)
    imgui.ColorEdit3('clear color', clear_color)
    if imgui.Button('Test Window') then
        show_test_window.v = not show_test_window.v
    end
    if imgui.Button('Another Window') then
        show_another_window.v = not show_another_window.v
    end
    local framerate = imgui.GetIO().Framerate
    imgui.Text(string.format('Application average %.3f ms/frame (%.1f FPS)', 1000.0 / framerate, framerate))
    imgui.End()
end

if show_another_window.v then
    imgui.Begin('Another Window', show_another_window)
    imgui.Text('Hello from another window!')
    imgui.End()
end

if show_test_window.v then
    imgui.SetNextWindowPos(imgui.ImVec2(650, 20), imgui.Cond.FirstUseEver)
    imgui.ShowTestWindow(show_test_window)
end

function main()
while true do
    wait(0)
    if wasKeyPressed(key.VK_X) then
        show_main_window.v = not show_main_window.v
    end
    imgui.Process = show_main_window.v
end
end
 

enyag

Известный
345
12
как сделать если на чекбоксе значение true, то скрипт включает имгуи окно на команду, а если false, то скрипт открывает дефолт окно сервера?
 

advancerp

Известный
78
5
выдает в консоли
(error) Imgui: D:\New GTA debila a che\moonloader\imguikakoeta.lua:12: attempt to index global 'show_imgui_example' (a nil value)
stack traceback:
025beta:
script_name ('Imgui')
script_author ('rockyanderson')
script_description ('imgui okna')

local tag ="[By Rocky Anderson]:{CECECE}"
local label = 1
local main_color = 0xB5B5B5
local main_color_text = "{19FFF4}"
local white_color = "{FFFFFF}"

-- Standard ImGui example
if show_imgui_example.v then
    local slider_float = imgui.ImFloat(0.0)
    imgui.Begin('ImGui example', show_imgui_example)
    imgui.Text('Hello, world!')
    imgui.SliderFloat('float', slider_float, 0.0, 1.0)
    imgui.ColorEdit3('clear color', clear_color)
    if imgui.Button('Test Window') then
        show_test_window.v = not show_test_window.v
    end
    if imgui.Button('Another Window') then
        show_another_window.v = not show_another_window.v
    end
    local framerate = imgui.GetIO().Framerate
    imgui.Text(string.format('Application average %.3f ms/frame (%.1f FPS)', 1000.0 / framerate, framerate))
    imgui.End()
end

if show_another_window.v then
    imgui.Begin('Another Window', show_another_window)
    imgui.Text('Hello from another window!')
    imgui.End()
end

if show_test_window.v then
    imgui.SetNextWindowPos(imgui.ImVec2(650, 20), imgui.Cond.FirstUseEver)
    imgui.ShowTestWindow(show_test_window)
end

function main()
while true do
    wait(0)
    if wasKeyPressed(key.VK_X) then
        show_main_window.v = not show_main_window.v
    end
    imgui.Process = show_main_window.v
end
end
Lua:
function main()
    while true do
        wait(0)
        if wasKeyPressed(key.VK_X) then
            show_imgui_example.v = not show_imgui_example.v
        end
        imgui.Process = show_imgui_example.v
    end
end
пробуй так
 
  • Нравится
Реакции: meosh

pheal

Участник
70
8
234:
coordPV =
{
    xCoord=100
    yCoord=100
}
В ини кфг.
Краш:
[20:04:01.465057] (error) phelper.lua: C:\games\ARIZONA GAMES\bin\Arizona\moonloader\phelper.lua:86: '}' expected (to close '{' at line 84) near 'yCoord'
[20:04:01.465057] (error) phelper.lua: Script died due to an error. (1CCB563C)