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

damag

Женюсь на официантке в моем любимом баре
Проверенный
1,152
1,194
у меня есть таблица:
Lua:
ids = {}
И у меня одна функция заполняет таблицу, текстом: 'привет', 'пока'
И мне нужно парсить это таблицу, и функцией 'string:find('пока')' находить слово 'пока'
и выводить в print.
Как это можно сделать?
help
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,891
1,257
из-за чего может выходить такая ошибка?
Lua:
attempt to index global 'ini' (a nil value)
stack traceback:
    D:\Games\GTA SAMP\moonloader\my_mo_help.lua:872: in function 'saveSettings'
не присвоено значение переменной ini
Какие пакеты не нужно отправлять серверу, чтобы сервер не мог узнать вышел ли я из машины или нет?
events.onSendExitVehicle, но при выходе из машины скорее всего сервер сам перестанет считать тебя за водителя, ибо идет отправка плеер синхры
 

advancerp

Известный
77
5
Можно как-то игнорировать сообщения, которые выводятся в чат от другого скрипта?
 

Pasquale Developer

Известный
109
8
Почему запускаеться только команда /mh после того как будет включена команда /sobes, как сделать так чтобы команду /mh можно было вводить без команды /sobes.

Lua:
function cmd_sobes(arg)
    main_window_state.v = not main_window_state.vkeys
    imgui.Process = main_window_state.v
end

function cmd_mh(arg)
    lol_window_state.v = not lol_window_state.vkeys
    imgui.Process = lol_window_state.v
end

function imgui.OnDrawFrame()
    if not main_window_state.v and not lol_window_state.v then
        imgui.Process=false
    end
    ------------------МЕНЮ(/mh)-------------------------------------
    if lol_window_state.v then
        imgui.Begin(u8"Меню скрипта MH Tools", lol_window_state)
        imgui.Text(u8"kak dela")
        if imgui.Button(u8"Автор скрипта") then
            os.execute("start https://vk.com/id591093018")
        end
        imgui.End()
    end
    ----------------------------SOBES-----------------------------------------------------------------------------------
    if main_window_state.v then
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2))
        ScreenX, ScreenY = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(ScreenX / 1.08 , ScreenY / 1.12), imgui.Cond.FirsUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.Begin(u8"  Проверка граждан", main_window_state)
        --imgui.InputText(u8'Введите значение', text_buffer)
        --imgui.Text(text_buffer.v)
        
        if imgui.Button(u8'Приветствие') then
            sampSendChat('Здравствуйте, я ' .. nick2 .. ', вы на собеседование?')
        end
        if imgui.Button(u8'Попросить документы') then
            lua_thread.create(function()
                sampSendChat('Хорошо, предьявите мне ваши документы, а именно паспорт и лицензии.')
                wait(500)
                sampSendChat('/n /pass ' .. id .. ' | /lic ' .. id)
            end)   
        end
        if imgui.Button(u8'Вопрос номер 1') then
            sampSendChat('С документами у вас все хорошо, расскажите что такое по вашему МЗ?')
        end
        if imgui.Button(u8'Вопрос номер 2') then
            sampSendChat('Супер, скажите мне, что находиться над моей головой?')
        end
        if imgui.Button(u8'Вопрос номер 3') then
            lua_thread.create(function()
                sampSendChat('/n МГ, ДМ, в /n чат')
                wait(300)
                sampSendChat('/n МГ, ДМ, в /n чат')
            end)
        end
        if imgui.Button(u8'Прошел собеседование') then
            sampSendChat('Поздравляю, вы прошли собеседование, сейчас вам будет выдана форма.')
        end
        if imgui.Button(u8'Не прошел собеседование') then
            sampSendChat('К моему огромному сожалению, вы нам не подходите.')
        end
        imgui.End()
    end
end
 

p0pc0rn

Участник
32
1
Оно получает координаты выстрелов
ну понятно, однако где, в какой строчке? :D ты просто тупо дал мне код, я понимаю, что ты тем самым помочь хотел, однако я слишком нуб, чтобы разобраться слёту. Было бы здорово, если бы ты разъяснил
 

CaJlaT

Овощ
Модератор
2,809
2,623
Почему запускаеться только команда /mh после того как будет включена команда /sobes, как сделать так чтобы команду /mh можно было вводить без команды /sobes.

Lua:
function cmd_sobes(arg)
    main_window_state.v = not main_window_state.vkeys
    imgui.Process = main_window_state.v
end

function cmd_mh(arg)
    lol_window_state.v = not lol_window_state.vkeys
    imgui.Process = lol_window_state.v
end

function imgui.OnDrawFrame()
    if not main_window_state.v and not lol_window_state.v then
        imgui.Process=false
    end
    ------------------МЕНЮ(/mh)-------------------------------------
    if lol_window_state.v then
        imgui.Begin(u8"Меню скрипта MH Tools", lol_window_state)
        imgui.Text(u8"kak dela")
        if imgui.Button(u8"Автор скрипта") then
            os.execute("start https://vk.com/id591093018")
        end
        imgui.End()
    end
    ----------------------------SOBES-----------------------------------------------------------------------------------
    if main_window_state.v then
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2))
        ScreenX, ScreenY = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(ScreenX / 1.08 , ScreenY / 1.12), imgui.Cond.FirsUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.Begin(u8"  Проверка граждан", main_window_state)
        --imgui.InputText(u8'Введите значение', text_buffer)
        --imgui.Text(text_buffer.v)
       
        if imgui.Button(u8'Приветствие') then
            sampSendChat('Здравствуйте, я ' .. nick2 .. ', вы на собеседование?')
        end
        if imgui.Button(u8'Попросить документы') then
            lua_thread.create(function()
                sampSendChat('Хорошо, предьявите мне ваши документы, а именно паспорт и лицензии.')
                wait(500)
                sampSendChat('/n /pass ' .. id .. ' | /lic ' .. id)
            end)  
        end
        if imgui.Button(u8'Вопрос номер 1') then
            sampSendChat('С документами у вас все хорошо, расскажите что такое по вашему МЗ?')
        end
        if imgui.Button(u8'Вопрос номер 2') then
            sampSendChat('Супер, скажите мне, что находиться над моей головой?')
        end
        if imgui.Button(u8'Вопрос номер 3') then
            lua_thread.create(function()
                sampSendChat('/n МГ, ДМ, в /n чат')
                wait(300)
                sampSendChat('/n МГ, ДМ, в /n чат')
            end)
        end
        if imgui.Button(u8'Прошел собеседование') then
            sampSendChat('Поздравляю, вы прошли собеседование, сейчас вам будет выдана форма.')
        end
        if imgui.Button(u8'Не прошел собеседование') then
            sampSendChat('К моему огромному сожалению, вы нам не подходите.')
        end
        imgui.End()
    end
end
 

Anton Nixon

Активный
474
48
как использовать несколько разных настроек шрифта для faIcon для, допустим, разных окон?
 

roman_vodola

Участник
157
16
Форматирование кода
function onServerMessage(msg)
if msg:find('Вы уже взяли ресурсы') then
runCommand('!route 106')
end
end

помогите пожалуйста.Скажите почему у меня не работает?Тут же выдает сервер текст Вы уже взяли ресурсы,но маршрут не воспроизводится.


1588194528703.png
 

CaJlaT

Овощ
Модератор
2,809
2,623
Как узнать ID человека, за которым ты в реконе?
Lua:
local samp = require "samp.events"
function samp.onSpectatePlayer(id, camtype)
    print(id) -- вроде как будет флудить
end
Помогите, у меня 4 окона imgui, как сделать, чтобы курсор показывался, только если окно render активно. Код ниже не работает.

Lua:
local render = imgui.ImBool(false)
local quests = imgui.ImBool(false)
local events = imgui.ImBool(false)
local records = imgui.ImBool(false)

function imgui.OnDrawFrame()
    if render.v then
        imgui.ShowCursor = render.v
        imgui.Begin(u8("[Q&ERender]: settings | by CaJlaT"), render, imgui.WindowFlags.NoResize + imgui.WindowFlags.AlwaysAutoResize)
        imgui.End()
    end
    if quests.v and text1 ~= '' then
        imgui.ShowCursor = render.v
        imgui.Begin(u8(""), quests, imgui.WindowFlags.NoTitleBar + imgui.WindowFlags.NoResize + imgui.WindowFlags.AlwaysAutoResize + imgui.WindowFlags.NoSavedSettings)
        imgui.End()
    end
    if events.v and text2 ~= '' then
        imgui.ShowCursor = render.v
        imgui.Begin(u8(""), events, imgui.WindowFlags.NoTitleBar + imgui.WindowFlags.NoResize + imgui.WindowFlags.AlwaysAutoResize + imgui.WindowFlags.NoSavedSettings)
        imgui.End()
    end
    if records.v then
        imgui.ShowCursor = render.v
        imgui.Begin(u8(""), records, imgui.WindowFlags.NoTitleBar + imgui.WindowFlags.NoResize + imgui.WindowFlags.AlwaysAutoResize + imgui.WindowFlags.NoSavedSettings)
        imgui.End()
    end
end
 
Последнее редактирование:
  • Нравится
Реакции: encore: