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

Corrygan228

Участник
132
9
Не открывается popup. Никакой ошибки в консоли нет, просто когда нажимаю кнопку ничего не происходит.
Lua:
    if imgui.Button(u8'Сбросить настройки', imgui.ImVec2(150, 40)) then
        imgui.OpenPopup('##reset_confirm')
    end
   
    if imgui.BeginPopup('##reset_confirm') then
        imgui.SetNextWindowSize(imgui.ImVec2(350, 150))
        imgui.CenterText(u8'Вы уверены, что хотите сбросить настройки?\nБудут применены бинды, созданные разработчиком!')
        imgui.NewLine()
        imgui.SetCursorPosX(37)
        if imgui.Button(u8'Да', imgui.ImVec2(120, 50)) then
            iniReset()
        end
        imgui.SameLine()
        imgui.SetCursorPosX(194)
        if imgui.Button(u8'Нет', imgui.ImVec2(120, 50)) then
            imgui.CloseCurrentPopup()
        end
    end
 
Последнее редактирование:

CaJlaT

07.11.2024 14:55
Модератор
2,846
2,687
Не открывается popup. Никакой ошибки в консоли нет, просто когда нажимаю кнопку ничего не происходит.
Lua:
    if imgui.Button(u8'Сбросить настройки', imgui.ImVec2(150, 40)) then
        imgui.OpenPopup('##reset_confirm')
    end
  
    if imgui.BeginPopup('##reset_confirm') then
        imgui.SetNextWindowSize(imgui.ImVec2(350, 150))
        imgui.CenterText(u8'Вы уверены, что хотите сбросить настройки?\nБудут применены бинды, созданные разработчиком!')
        imgui.NewLine()
        imgui.SetCursorPosX(37)
        if imgui.Button(u8'Да', imgui.ImVec2(120, 50)) then
            iniReset()
        end
        imgui.SameLine()
        imgui.SetCursorPosX(194)
        if imgui.Button(u8'Нет', imgui.ImVec2(120, 50)) then
            imgui.CloseCurrentPopup()
        end
    end
Просто забыл imgui.EndPopup()
Lua:
    if imgui.Button(u8'Сбросить настройки', imgui.ImVec2(150, 40)) then
        imgui.OpenPopup('##reset_confirm')
    end
  
    if imgui.BeginPopup('##reset_confirm') then
        imgui.SetNextWindowSize(imgui.ImVec2(350, 150))
        imgui.CenterText(u8'Вы уверены, что хотите сбросить настройки?\nБудут применены бинды, созданные разработчиком!')
        imgui.NewLine()
        imgui.SetCursorPosX(37)
        if imgui.Button(u8'Да', imgui.ImVec2(120, 50)) then
            iniReset()
        end
        imgui.SameLine()
        imgui.SetCursorPosX(194)
        if imgui.Button(u8'Нет', imgui.ImVec2(120, 50)) then
            imgui.CloseCurrentPopup()
        end
        imgui.EndPopup()
    end
1670661462890.png
 

Corrygan228

Участник
132
9
Ошибка в строке, где я пытаюсь посчитать кол-во элементов в массиве и занести это в переменную
[ML] (error) script.lua: ...\Arizona Games Launcher\bin\rodina\moonloader\script.lua:296: attempt to call global 'len' (a nil value)
stack traceback:
...\Arizona Games Launcher\bin\rodina\moonloader\script.lua:296: in function 'OnDrawFrame'
...izona Games Launcher\bin\rodina\moonloader\lib\imgui.lua:1378: in function <...izona Games Launcher\bin\rodina\moonloader\lib\imgui.lua:1367>
[ML] (error) script.lua: Script died due to an error. (217C2324)
Код:
local elements = len(createbomb_binds)

Просто забыл imgui.EndPopup()
Lua:
    if imgui.Button(u8'Сбросить настройки', imgui.ImVec2(150, 40)) then
        imgui.OpenPopup('##reset_confirm')
    end
 
    if imgui.BeginPopup('##reset_confirm') then
        imgui.SetNextWindowSize(imgui.ImVec2(350, 150))
        imgui.CenterText(u8'Вы уверены, что хотите сбросить настройки?\nБудут применены бинды, созданные разработчиком!')
        imgui.NewLine()
        imgui.SetCursorPosX(37)
        if imgui.Button(u8'Да', imgui.ImVec2(120, 50)) then
            iniReset()
        end
        imgui.SameLine()
        imgui.SetCursorPosX(194)
        if imgui.Button(u8'Нет', imgui.ImVec2(120, 50)) then
            imgui.CloseCurrentPopup()
        end
        imgui.EndPopup()
    end
Посмотреть вложение 181163
почему-то не помогло(
 

CaJlaT

07.11.2024 14:55
Модератор
2,846
2,687
Ошибка в строке, где я пытаюсь посчитать кол-во элементов в массиве и занести это в переменную

Код:
local elements = len(createbomb_binds)
в луа нет функции len, есть оператор # используй local elements = #createbomb_binds
(Вообще функция len() есть, но только для строк string.len())

Ошибка в строке, где я пытаюсь посчитать кол-во элементов в массиве и занести это в переменную

Код:
local elements = len(createbomb_binds)


почему-то не помогло(
значит ошибка в чём-то другом, на пустом скрипте всё работает
1670662772182.png


Lua:
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local window = imgui.ImBool(false)
function main()
    sampRegisterChatCommand('popup', function()
        window.v = not window.v
    end)
    while true do
        wait(0)
        imgui.Process = window.v
    end
end

function imgui.OnDrawFrame()
    imgui.Begin('title', window)
    if imgui.Button(u8'Сбросить настройки', imgui.ImVec2(150, 40)) then
        imgui.OpenPopup('##reset_confirm')
    end
  
    if imgui.BeginPopup('##reset_confirm') then
        imgui.SetNextWindowSize(imgui.ImVec2(350, 150))
        imgui.Text(u8'Вы уверены, что хотите сбросить настройки?\nБудут применены бинды, созданные разработчиком!')
        imgui.NewLine()
        imgui.SetCursorPosX(37)
        if imgui.Button(u8'Да', imgui.ImVec2(120, 50)) then
            iniReset()
        end
        imgui.SameLine()
        imgui.SetCursorPosX(194)
        if imgui.Button(u8'Нет', imgui.ImVec2(120, 50)) then
            imgui.CloseCurrentPopup()
        end
        imgui.EndPopup()
    end
    imgui.End()
end
 

Вложения

  • zdarova.lua
    1.1 KB · Просмотры: 3
  • Нравится
Реакции: Corrygan228 и ARMOR

Sadow

Известный
1,427
592
Как переместить текст правее в InputText без пробелов в Imgui? И как получать игровое время которое видит пользователь скрипта?
 
Последнее редактирование:

savvin

Известный
404
139
Можно как-то заставить педа воспроизводить анимацию перезарядки оружия?
 

qdIbp

Автор темы
Проверенный
1,451
1,190
Помогите пожалуйста. У меня не самп не получает и не отправляет урон. Модов, плагинов мало и они проверены, не в них дело.
Может у кого такая же проблема была? Кто знает как починить урон?
Или может возможно заново создать систему урона? Чтобы хотя бы отправлять что нанёс кому-то урон.
когда луа стало сампом?
если у тебя вопрос по гта то тебе сюда
 
  • Нравится
Реакции: XRLM

Gorskin

🖕
Проверенный
1,350
1,201
Помогите найти адрес эффекта брызга воды когда в неё прыгаешь, и брызги при ходьбе в воде (не длинный шлейф который создается, я его офнул сам. А мелкие брызги я не смог найти.)
sa-mp-245.png
 
  • Вау
Реакции: whyega52

Dmitriy Makarov

25.05.2021
Проверенный
2,513
1,138
Как переместить текст правее в InputText без пробелов в Imgui?
Если ты про позиционирование текста в InputText (слева, центр, справа), то, насколько мне известно, никак.

Разве что с помощью кастомной функции, о существовании которой я не знаю. Да и не знаю точно, возможно ли это.

Если ты про текст с первого аргумента InputText, то можешь, как вариант, после этой функции написать текст с помощью imgui.Text. Ну и переместить его по оси X как тебе удобно.
Lua:
imgui.InputText("##1", var)
imgui.SameLine(x) -- Где "x" - отступ. Отвечает за ширину, вроде.
imgui.Text("Text")
 

chapo

tg/inst: @moujeek
Модератор
9,074
12,037
Как переместить текст правее в InputText без пробелов в Imgui? И как получать игровое время которое видит пользователь скрипта?
Если ты про позиционирование текста в InputText (слева, центр, справа), то, насколько мне известно, никак.

Разве что с помощью кастомной функции, о существовании которой я не знаю. Да и не знаю точно, возможно ли это.

Если ты про текст с первого аргумента InputText, то можешь, как вариант, после этой функции написать текст с помощью imgui.Text. Ну и переместить его по оси X как тебе удобно.
Lua:
imgui.InputText("##1", var)
imgui.SameLine(x) -- Где "x" - отступ. Отвечает за ширину, вроде.
imgui.Text("Text")
изменить x в StyleVar.FramePadding
1670697929750.png
 
  • Нравится
Реакции: Dmitriy Makarov и Sadow