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

abnomegd

Известный
358
39
Как сделать чтобы при выборе в диалоговом окне то только /history срабатывала на "История ников" а на остальных нет.
dialogscript:
require "lib.moonloader" -- подключение библиотеки
local color_dialog = 0xDEB887

-- Для диалога с ID 12
local dialogArr = {"История ников", "Добавить в записную книгу", "Показать документы", "Действия", "Имущество"}
local dialogStr = ""

for _, str in ipairs(dialogArr) do
    dialogStr = dialogStr .. str .. "\n"
end

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("dialog", cmd_dialog)
    while true do
        wait(0)
        -- Блок выполняющийся бесконечно (пока самп активен)
        local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)
        if valid and doesCharExist(ped) then
            local result, id = sampGetPlayerIdByCharHandle(ped)
            if result and isKeyJustPressed(VK_X) then
                playerid = id
                cmd_dialog(2)
            end
        end

        local result, button, list, input = sampHasDialogRespond(11) -- /dialog1 (InputBox)
        if result then -- если диалог открыт
            if button == 1 then -- если нажата первая кнопка (Выбрать)
         
            end
        end

        local result, button, list, input = sampHasDialogRespond(12) -- /dialog2 (ListBox)
        if result then -- если диалог открыт
            if button == 1 then -- если нажата первая кнопка (Выбрать)
                    sampSendChat("/history "..sampGetPlayerNickname(tostring(playerid)))
                if list == 0 then
                elseif list == 1 then
                elseif list == 2 then
                elseif list == 3 then
                end
            end
        end
    end
end

function cmd_dialog(arg)
    if tonumber(arg) == 1 then
        sampShowDialog(11, "Диалог с типом ID 1 (InputBox)", "Введите какую-либо строку", "Выбрать", "Закрыть", 1)
    elseif tonumber(arg) == 2 then
        sampShowDialog(12, "Меню взаимодействия с игроком", dialogStr, "Выбрать", "Закрыть", 2)
    end
end
И за что отвечает вот это? в диалоговом окне.

if list == 0 then
elseif list == 1 then
elseif list == 2 then
elseif list == 3 then
up
 

relog

Участник
62
0
Lua:
[/B]
require 'lib.moonloader'
local sampev = require 'lib.samp.events'

local gang_names = {
    {'1', 1470.2920, -1744.9198, 13.5469},
    {'2', 1417.2753,-1706.6865, 13.5469},
    {'3', 1183.9902, -1328.8834, 13.5769},
    {'4', -542.1138, -184.9735, 78.4063},
    {'5', -2026.9467, -89.5129, 35.3203},
    {'6', 1987.0355, -1276.0983, 23.8203},
    {'6.1', 1166.5494, -1031.4227, 32.1131},
    {'6.2', 1379.0463, -1084.4694, 27.3989},
    {'6.3', 2218.4917, -1394.6610, 23.4882},
    {'7', 1379.0463, -1084.4694, 27.3989}
}

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage("{00ffff}Квестовик {00ffff}для {00ffff}Sucre {00ffff}успешно {00ffff}загружен.", -1)
    sampAddChatMessage("{00ffff}Активация{00ffff}: {ff0000}/qst", -1)
    sampRegisterChatCommand("qst", function()
        sampShowDialog(123, "Автор: ", "Введите НОМЕР точки:\n1 Мэрия.\n2. Банк ЛС\n3 Больница лс.\n4 Лесопилка.\n5 Автошкола.\n6 Почтальон.\n6.1 Центр\n6.2 Загород.\n6.3 Гетто.\n7 Сотовый салон.", "Выбрать", "Закрыть", 1)
    end)
    sampRegisterChatCommand('tpp', function(coords)
        local x, y, z = coords:match('(.+) (.+) (.+)')
        setCharCoordinates(PLAYER_PED, x, y, z)
        end)
    while true do
        wait(0)
        local result, button, list, input = sampHasDialogRespond(123)
        if result then
            if button == 1 then
                for i = 1, #gang_names do
                    if input:lower() == gang_names[i][1]:lower() then
                        setCharCoordinates(PLAYER_PED, gang_names[i][2], gang_names[i][3], gang_names[i][4])
                        sampAddChatMessage("Вы на респe "..gang_names[i][1], 0x00ffff)
                    end
                end
            end
        end
        end
        end
[B]
что я сделал не так помогите, диологовое окно выходит но не телепортирует, хотя должно
Хелп
 

abnomegd

Известный
358
39
Lua:
[/B]
require 'lib.moonloader'
local sampev = require 'lib.samp.events'

local gang_names = {
    {'1', 1470.2920, -1744.9198, 13.5469},
    {'2', 1417.2753,-1706.6865, 13.5469},
    {'3', 1183.9902, -1328.8834, 13.5769},
    {'4', -542.1138, -184.9735, 78.4063},
    {'5', -2026.9467, -89.5129, 35.3203},
    {'6', 1987.0355, -1276.0983, 23.8203},
    {'6.1', 1166.5494, -1031.4227, 32.1131},
    {'6.2', 1379.0463, -1084.4694, 27.3989},
    {'6.3', 2218.4917, -1394.6610, 23.4882},
    {'7', 1379.0463, -1084.4694, 27.3989}
}

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage("{00ffff}Квестовик {00ffff}для {00ffff}Sucre {00ffff}успешно {00ffff}загружен.", -1)
    sampAddChatMessage("{00ffff}Активация{00ffff}: {ff0000}/qst", -1)
    sampRegisterChatCommand("qst", function()
        sampShowDialog(123, "Автор: ", "Введите НОМЕР точки:\n1 Мэрия.\n2. Банк ЛС\n3 Больница лс.\n4 Лесопилка.\n5 Автошкола.\n6 Почтальон.\n6.1 Центр\n6.2 Загород.\n6.3 Гетто.\n7 Сотовый салон.", "Выбрать", "Закрыть", 1)
    end)
    sampRegisterChatCommand('tpp', function(coords)
        local x, y, z = coords:match('(.+) (.+) (.+)')
        setCharCoordinates(PLAYER_PED, x, y, z)
        end)
    while true do
        wait(0)
        local result, button, list, input = sampHasDialogRespond(123)
        if result then
            if button == 1 then
                for i = 1, #gang_names do
                    if input:lower() == gang_names[i][1]:lower() then
                        setCharCoordinates(PLAYER_PED, gang_names[i][2], gang_names[i][3], gang_names[i][4])
                        sampAddChatMessage("Вы на респe "..gang_names[i][1], 0x00ffff)
                    end
                end
            end
        end
        end
        end
[B]
что я сделал не так помогите, диологовое окно выходит но не телепортирует, хотя должно
телепортирует, пробовал на адвансе только античит кикает
 

Shepi

Активный
177
36
Как поместить Text, Ques и ToggleButton в одну строчку?
Посмотреть вложение 112650
Lua:
imgui.Text('RP guns '); imgui.SameLine()
imgui.Ques('Автоматическая RP отыгровка оружия.')
imgui.ToggleButton("RP guns", ToggleButton1)

imgui.Text('RP guns '); imgui.SameLine()
imgui.Ques('Автоматическая RP отыгровка оружия.') imgui.SameLine()
imgui.ToggleButton("RP guns", ToggleButton1)
 

Biuti

Участник
165
8
Я так понял функция sampSendChat(string text) не работает с командами активации скрипта или работает?
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,238
12,672
Как поместить Text, Ques и ToggleButton в одну строчку?
Посмотреть вложение 112650
Lua:
imgui.Text('RP guns '); imgui.SameLine()
imgui.Ques('Автоматическая RP отыгровка оружия.')
imgui.ToggleButton("RP guns", ToggleButton1)
Lua:
imgui.Text('RP guns '); imgui.SameLine() imgui.ToggleButton("##RP guns", ToggleButton1) imgui.SameLine() imgui.Ques('Автоматическая RP отыгровка оружия.')
Я так понял функция sampSendChat(string text) не работает с командами активации скрипта или работает?
что бы скрипты видели команду юзай
Lua:
sampProcessChatInput('')
 
  • Нравится
Реакции: Biuti

Shepi

Активный
177
36
Lua:
imgui.Text('RP guns '); imgui.SameLine() imgui.ToggleButton("##RP guns", ToggleButton1) imgui.SameLine() imgui.Ques('Автоматическая RP отыгровка оружия.')

что бы скрипты видели команду юзай
Lua:
sampProcessChatInput('')
как сделать подсказку в имгуи? знак ? и пояснение функции при наводке курсора
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,238
12,672
как сделать подсказку в имгуи? знак ? и пояснение функции при наводке курсора
Lua:
function imgui.TextQuestion(text)
    imgui.SameLine()
    imgui.TextDisabled('?')
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.PushTextWrapPos(450)
        imgui.TextUnformatted(text)
        imgui.PopTextWrapPos()
        imgui.EndTooltip()
    end
end
 

barjik

Известный
458
190
Lua:
imgui.Text('RP guns '); imgui.SameLine() imgui.ToggleButton("##RP guns", ToggleButton1) imgui.SameLine() imgui.Ques('Автоматическая RP отыгровка оружия.')
У меня после "imgui.ToggleButton" стоит "if"
Можно как то исправить?
Lua:
imgui.Text('RP guns '); imgui.SameLine()
imgui.Ques('Автоматическая RP отыгровка оружия.')
if imgui.ToggleButton("RP guns", ToggleButton1) then
 

William_Roses

Активный
258
26
У меня после "imgui.ToggleButton" стоит "if"
Можно как то исправить?
Lua:
imgui.Text('RP guns '); imgui.SameLine()
imgui.Ques('Автоматическая RP отыгровка оружия.')
if imgui.ToggleButton("RP guns", ToggleButton1) then
Lua:
imgui.Text('RP guns ')
imgui.SameLine()
imgui.Ques('Автоматическая RP отыгровка оружия.')
imgui.SameLine()
if imgui.ToggleButton("RP guns", ToggleButton1) then
    --code
end
ну или как изначально у тебя было:
Lua:
imgui.Text('RP guns ')

imgui.SameLine()

imgui.Ques('Автоматическая RP отыгровка оружия.')

imgui.SameLine()

imgui.ToggleButton("RP guns", ToggleButton1)

-- можно запихать samline в одну и ту же строку, но лично я предпочитаю делать так
 

barjik

Известный
458
190
Lua:
imgui.Text('RP guns ')
imgui.SameLine()
imgui.Ques('Автоматическая RP отыгровка оружия.')
imgui.SameLine()
if imgui.ToggleButton("RP guns", ToggleButton1) then
    --code
end
ну или как изначально у тебя было:
Lua:
imgui.Text('RP guns ')

imgui.SameLine()

imgui.Ques('Автоматическая RP отыгровка оружия.')

imgui.SameLine()

imgui.ToggleButton("RP guns", ToggleButton1)

-- можно запихать samline в одну и ту же строку, но лично я предпочитаю делать так
Спасибо, но мне нужно чтоб подсказка появлялась в конце, а не по середине
Screenshot_1.png
 

Sanchez.

Известный
704
190
  • Нравится
Реакции: barjik

abnomegd

Известный
358
39
Как пофиксить/сделать чтобы когда выбирал Историю ников то срабатывало команда /history и ник человека напротив, но это работает и на остальных что ниже((надо чтобы не срабатывало))
Вот код
scriptы:
require "lib.moonloader" -- подключение библиотеки
local color_dialog = 0xDEB887

-- Для диалога с ID 12
local dialogArr = {"История ников", "Добавить в записную книгу", "Показать документы", "Действия", "Имущество"}
local dialogStr = ""

for _, str in ipairs(dialogArr) do
    dialogStr = dialogStr .. str .. "\n"
end

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("dialog", cmd_dialog)
    while true do
        wait(0)
        -- Блок выполняющийся бесконечно (пока самп активен)
        local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)
        if valid and doesCharExist(ped) then
            local result, id = sampGetPlayerIdByCharHandle(ped)
            if result and isKeyJustPressed(VK_X) then
                playerid = id
                cmd_dialog(2)
            end
        end

        local result, button, list, input = sampHasDialogRespond(11) -- /dialog1 (InputBox)
        if result then -- если диалог открыт
            if button == 1 then -- если нажата первая кнопка (Выбрать)
      
            end
        end

        local result, button, list, input = sampHasDialogRespond(12) -- /dialog2 (ListBox)
        if result then -- если диалог открыт
            if button == 1 then -- если нажата первая кнопка (Выбрать)
                    sampSendChat("/history "..sampGetPlayerNickname(tostring(playerid)))
                if list == 0 then
                elseif list == 1 then
                elseif list == 2 then
                elseif list == 3 then
                end
            end
        end
    end
end

function cmd_dialog(arg)
    if tonumber(arg) == 1 then
        sampShowDialog(11, "Диалог с типом ID 1 (InputBox)", "Введите какую-либо строку", "Выбрать", "Закрыть", 1)
    elseif tonumber(arg) == 2 then
        sampShowDialog(12, "Меню взаимодействия с игроком", dialogStr, "Выбрать", "Закрыть", 2)
    end
end

И за что отвечает вот эти функции в диалоговом окне:

figznaet:
   if list == 0 then

                elseif list == 1 then

                elseif list == 2 then

                elseif list == 3 then
 
Последнее редактирование:

#SameLine

Известный
422
39
Не умею делать цвета для окон imgui, нужен прозрачный chiled, без цвета, кому не лень киньте плиз