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

Fabregoo

Известный
656
128
Как сделать более 10+ биндов.
С активацией на чит код, допусти l = в чат /lock
k = в чат /key
и так далее..Можно код?
 

Angr

Известный
291
97
Как сделать более 10+ биндов.
С активацией на чит код, допусти l = в чат /lock
k = в чат /key
и так далее..Можно код?
Если как чит код то ниже, а если тебе нужно на 1 Клавишу, то можно использовать if isKeyJustPressed(ид клавиши) then print("Press") end
Lua:
function main()
    while true do
        wait(0)
        if testCheat('test') then
            sampSendChat("/lock")
        end
    end
end
 
  • Нравится
Реакции: Fabregoo

Fabregoo

Известный
656
128
Если как чит код то ниже, а если тебе нужно на 1 Клавишу, то можно использовать if isKeyJustPressed(ид клавиши) then print("Press") end
Lua:
function main()
    while true do
        wait(0)
        if testCheat('test') then
            sampSendChat("/lock")
        end
    end
end
Хз, вставил в свой не до скрипт, и твоя функция не рабоает, в отдельном скрипте работает...
 

neverlane

t.me/neverlane00
Друг
997
1,132
Есть функция для респавна кара, но диалог почему-то остаётся. Если нажать enter то диалог пропадёт и не будет никаких действий
Lua:
function fixcar(num)
    if #num == 0 then
        notf.addNotification("ARZ Assistant\nВведите номер авто из списка /cars",5,3)
    else
        sampSendChat('/cars')
        sampSendDialogResponse(162, 1, num - 1, -1)
        sampSendDialogResponse(163, 1, 9, -1)
        sampCloseCurrentDialogWithButton(1)
    end
end
 

Fabregoo

Известный
656
128
мб потому что у тебя 2 "Main"? ее кидать надо в беск цикл
Дак я так и сделал..Имуги окно работает, а то нет, код снизу.
Lua:
require 'moonloader'
local ev = require 'lib.samp.events'
local ac = true
local imgui = require 'imgui'
local key = require 'vkeys'
local inicfg = require 'inicfg'
local inicfg_file = 'moonloader/config/test.ini'
local load_inicfg = inicfg.load (nil, inicfg_file)
local mainini = inicfg.load(nil, directini)
local hook = require("lib.samp.events")
local encoding = require 'encoding'
local CheckBox = imgui.ImBool(false)
encoding.default = 'CP1251'
u8 = encoding.UTF8
activation = false

local main_window_state = imgui.ImBool(false)
function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.SetNextWindowSize(imgui.ImVec2(1200, 600), imgui.Cond.FirstUseEver)
        imgui.Begin('Mini_Helper', main_window_state)
        imgui.Text(u8'РП Документы.')
        if imgui.Button(u8"РП паспорт.") then
            lua_thread.create(function()
                sampSendChat("/me снял портфель с плечей, положил на землю, и открыл его")
                wait(1200)
                sampSendChat("/me достал из откротого портфеля, и открыл первую страницу")
                wait(1200)
                sampSendChat("/me передал паспорт человеку напротив")
                wait(1200)
                sampSetChatInputText('/showpass ')
                sampSetChatInputEnabled(true)
            end)
        end
                    imgui.SameLine()
                         imgui.TextQuestion(u8'Отыграет за вас паспорт по РП')
                imgui.SameLine(220)
            if imgui.Button(u8"РП Мед.Карта.") then
            lua_thread.create(function()
                sampSendChat("/me достал из левого кармана штанов мед.книжку")
                wait(1200)
                sampSendChat("/me открыл мед.книжку на 1 странице, и передал человеку напротив")
                wait(1200)
                sampSendChat("/todo Вот держите*говорит передаваю документ человеку напротив.")
                wait(1200)
                sampSetChatInputText('/showmc ')
                sampSetChatInputEnabled(true)
            end)
        end
        imgui.SameLine()
              imgui.TextQuestion(u8"Отыграет за вас по РП Мед.Карту.")
              imgui.SameLine(440)
        if imgui.Button(u8'РП лицензии.') then
            lua_thread.create(function()
                sampSendChat("/me достал из нагрудного карманчика, и открыл 1-у страницу")
                wait(1200)
                sampSendChat("/todo Вот держите* говорит передаваю лицензии человеку напротив.")
                wait(1200)
                sampSendChat("/me передал лицензии человеку напротив")
                wait(1200)
                sampSetChatInputText('/showlic ')
                sampSetChatInputEnabled(true)
            end)
        end
        imgui.SameLine()
        imgui.TextQuestion(u8"Отыграет за вас по РП лицензии.")
        imgui.Separator(0)
        imgui.SameLine(0)
        if imgui.Button('Disconnect') then
            sampDisconnectWithReason(0)
        end
        imgui.SameLine()
        imgui.TextQuestion(u8'По нажатию вас сразу дисконектит от сервера.')
        imgui.SameLine(220)
        if imgui.Button(u8'Репорт') then
            activation = not activation
            sampSendChat('/report')
        end
        imgui.SameLine()
           imgui.TextQuestion(u8"Как только вы нажмете сюда, то в репорт отправится фраза,'Фаст следите'")
        imgui.Separator()
             if imgui.Button('rprprprprprp') then
             sampAddChatMessage('</3', -1)
             end
             imgui.SameLine(220)
              if imgui.Button('rprprprprprprprprp') then
              sampSendChat("Привет")
              end
              imgui.SameLine(420)
               if imgui.Button('prosto rp') then
                sampAddChatMessage('ты кросс нажал на prosto rp', -1)
                 end
               if imgui.Button('1') then sampSendChat('MQ') end
                    imgui.SameLine()
                         imgui.TextQuestion(u8'ЦЕ КНОПКА 1')           
        imgui.End()
    end
end


function hook.onShowDialog(dialogId, style, title ,button1, button2, text)
    lua_thread.create(function()
        if activation then
            wait(100)
            if dialogId == (32) and ac then
                sampSendDialogResponse(dialogId, 1, sampGetCurrentDialogListItem(), 'Фаст следите, требуется помощь')
                ac = false
                return false
            end
        end
    end)
end

function imgui.TextQuestion(text)
    imgui.TextDisabled('( ? )')
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.PushTextWrapPos(450)
        imgui.TextUnformatted(text)
        imgui.PopTextWrapPos()
        imgui.EndTooltip()
    end
end

 
function main()
while not isSampAvailable() do wait(3000) end
sampRegisterChatCommand("test", function() main_window_state.v = not main_window_state.v end)
while true do
   wait(0)
     imgui.Process = main_window_state.v
     end
end     


function main()
    while true do
        wait(0)
        if testCheat('test') then
            sampSendChat("/lock")
        end
    end
end
 

neverlane

t.me/neverlane00
Друг
997
1,132
Дак я так и сделал..Имуги окно работает, а то нет, код снизу.
Lua:
require 'moonloader'
local ev = require 'lib.samp.events'
local ac = true
local imgui = require 'imgui'
local key = require 'vkeys'
local inicfg = require 'inicfg'
local inicfg_file = 'moonloader/config/test.ini'
local load_inicfg = inicfg.load (nil, inicfg_file)
local mainini = inicfg.load(nil, directini)
local hook = require("lib.samp.events")
local encoding = require 'encoding'
local CheckBox = imgui.ImBool(false)
encoding.default = 'CP1251'
u8 = encoding.UTF8
activation = false

local main_window_state = imgui.ImBool(false)
function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.SetNextWindowSize(imgui.ImVec2(1200, 600), imgui.Cond.FirstUseEver)
        imgui.Begin('Mini_Helper', main_window_state)
        imgui.Text(u8'РП Документы.')
        if imgui.Button(u8"РП паспорт.") then
            lua_thread.create(function()
                sampSendChat("/me снял портфель с плечей, положил на землю, и открыл его")
                wait(1200)
                sampSendChat("/me достал из откротого портфеля, и открыл первую страницу")
                wait(1200)
                sampSendChat("/me передал паспорт человеку напротив")
                wait(1200)
                sampSetChatInputText('/showpass ')
                sampSetChatInputEnabled(true)
            end)
        end
                    imgui.SameLine()
                         imgui.TextQuestion(u8'Отыграет за вас паспорт по РП')
                imgui.SameLine(220)
            if imgui.Button(u8"РП Мед.Карта.") then
            lua_thread.create(function()
                sampSendChat("/me достал из левого кармана штанов мед.книжку")
                wait(1200)
                sampSendChat("/me открыл мед.книжку на 1 странице, и передал человеку напротив")
                wait(1200)
                sampSendChat("/todo Вот держите*говорит передаваю документ человеку напротив.")
                wait(1200)
                sampSetChatInputText('/showmc ')
                sampSetChatInputEnabled(true)
            end)
        end
        imgui.SameLine()
              imgui.TextQuestion(u8"Отыграет за вас по РП Мед.Карту.")
              imgui.SameLine(440)
        if imgui.Button(u8'РП лицензии.') then
            lua_thread.create(function()
                sampSendChat("/me достал из нагрудного карманчика, и открыл 1-у страницу")
                wait(1200)
                sampSendChat("/todo Вот держите* говорит передаваю лицензии человеку напротив.")
                wait(1200)
                sampSendChat("/me передал лицензии человеку напротив")
                wait(1200)
                sampSetChatInputText('/showlic ')
                sampSetChatInputEnabled(true)
            end)
        end
        imgui.SameLine()
        imgui.TextQuestion(u8"Отыграет за вас по РП лицензии.")
        imgui.Separator(0)
        imgui.SameLine(0)
        if imgui.Button('Disconnect') then
            sampDisconnectWithReason(0)
        end
        imgui.SameLine()
        imgui.TextQuestion(u8'По нажатию вас сразу дисконектит от сервера.')
        imgui.SameLine(220)
        if imgui.Button(u8'Репорт') then
            activation = not activation
            sampSendChat('/report')
        end
        imgui.SameLine()
           imgui.TextQuestion(u8"Как только вы нажмете сюда, то в репорт отправится фраза,'Фаст следите'")
        imgui.Separator()
             if imgui.Button('rprprprprprp') then
             sampAddChatMessage('</3', -1)
             end
             imgui.SameLine(220)
              if imgui.Button('rprprprprprprprprp') then
              sampSendChat("Привет")
              end
              imgui.SameLine(420)
               if imgui.Button('prosto rp') then
                sampAddChatMessage('ты кросс нажал на prosto rp', -1)
                 end
               if imgui.Button('1') then sampSendChat('MQ') end
                    imgui.SameLine()
                         imgui.TextQuestion(u8'ЦЕ КНОПКА 1')         
        imgui.End()
    end
end


function hook.onShowDialog(dialogId, style, title ,button1, button2, text)
    lua_thread.create(function()
        if activation then
            wait(100)
            if dialogId == (32) and ac then
                sampSendDialogResponse(dialogId, 1, sampGetCurrentDialogListItem(), 'Фаст следите, требуется помощь')
                ac = false
                return false
            end
        end
    end)
end

function imgui.TextQuestion(text)
    imgui.TextDisabled('( ? )')
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.PushTextWrapPos(450)
        imgui.TextUnformatted(text)
        imgui.PopTextWrapPos()
        imgui.EndTooltip()
    end
end


function main()
while not isSampAvailable() do wait(3000) end
sampRegisterChatCommand("test", function() main_window_state.v = not main_window_state.v end)
while true do
   wait(0)
     imgui.Process = main_window_state.v
     end
end   


function main()
    while true do
        wait(0)
        if testCheat('test') then
            sampSendChat("/lock")
        end
    end
end
у тебя 2 мейна -_-
Lua:
function main()
while not isSampAvailable() do wait(3000) end
sampRegisterChatCommand("test", function() main_window_state.v = not main_window_state.v end)
while true do
   wait(0)
     imgui.Process = main_window_state.v
     if testCheat('test') then
         sampSendChat('/test')
     end       
     end
end
 
  • Нравится
Реакции: Fabregoo
D

deleted-user-204957

Гость
Дак я так и сделал..Имуги окно работает, а то нет, код снизу.
Lua:
require 'moonloader'
local ev = require 'lib.samp.events'
local ac = true
local imgui = require 'imgui'
local key = require 'vkeys'
local inicfg = require 'inicfg'
local inicfg_file = 'moonloader/config/test.ini'
local load_inicfg = inicfg.load (nil, inicfg_file)
local mainini = inicfg.load(nil, directini)
local hook = require("lib.samp.events")
local encoding = require 'encoding'
local CheckBox = imgui.ImBool(false)
encoding.default = 'CP1251'
u8 = encoding.UTF8
activation = false

local main_window_state = imgui.ImBool(false)
function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.SetNextWindowSize(imgui.ImVec2(1200, 600), imgui.Cond.FirstUseEver)
        imgui.Begin('Mini_Helper', main_window_state)
        imgui.Text(u8'РП Документы.')
        if imgui.Button(u8"РП паспорт.") then
            lua_thread.create(function()
                sampSendChat("/me снял портфель с плечей, положил на землю, и открыл его")
                wait(1200)
                sampSendChat("/me достал из откротого портфеля, и открыл первую страницу")
                wait(1200)
                sampSendChat("/me передал паспорт человеку напротив")
                wait(1200)
                sampSetChatInputText('/showpass ')
                sampSetChatInputEnabled(true)
            end)
        end
                    imgui.SameLine()
                         imgui.TextQuestion(u8'Отыграет за вас паспорт по РП')
                imgui.SameLine(220)
            if imgui.Button(u8"РП Мед.Карта.") then
            lua_thread.create(function()
                sampSendChat("/me достал из левого кармана штанов мед.книжку")
                wait(1200)
                sampSendChat("/me открыл мед.книжку на 1 странице, и передал человеку напротив")
                wait(1200)
                sampSendChat("/todo Вот держите*говорит передаваю документ человеку напротив.")
                wait(1200)
                sampSetChatInputText('/showmc ')
                sampSetChatInputEnabled(true)
            end)
        end
        imgui.SameLine()
              imgui.TextQuestion(u8"Отыграет за вас по РП Мед.Карту.")
              imgui.SameLine(440)
        if imgui.Button(u8'РП лицензии.') then
            lua_thread.create(function()
                sampSendChat("/me достал из нагрудного карманчика, и открыл 1-у страницу")
                wait(1200)
                sampSendChat("/todo Вот держите* говорит передаваю лицензии человеку напротив.")
                wait(1200)
                sampSendChat("/me передал лицензии человеку напротив")
                wait(1200)
                sampSetChatInputText('/showlic ')
                sampSetChatInputEnabled(true)
            end)
        end
        imgui.SameLine()
        imgui.TextQuestion(u8"Отыграет за вас по РП лицензии.")
        imgui.Separator(0)
        imgui.SameLine(0)
        if imgui.Button('Disconnect') then
            sampDisconnectWithReason(0)
        end
        imgui.SameLine()
        imgui.TextQuestion(u8'По нажатию вас сразу дисконектит от сервера.')
        imgui.SameLine(220)
        if imgui.Button(u8'Репорт') then
            activation = not activation
            sampSendChat('/report')
        end
        imgui.SameLine()
           imgui.TextQuestion(u8"Как только вы нажмете сюда, то в репорт отправится фраза,'Фаст следите'")
        imgui.Separator()
             if imgui.Button('rprprprprprp') then
             sampAddChatMessage('</3', -1)
             end
             imgui.SameLine(220)
              if imgui.Button('rprprprprprprprprp') then
              sampSendChat("Привет")
              end
              imgui.SameLine(420)
               if imgui.Button('prosto rp') then
                sampAddChatMessage('ты кросс нажал на prosto rp', -1)
                 end
               if imgui.Button('1') then sampSendChat('MQ') end
                    imgui.SameLine()
                         imgui.TextQuestion(u8'ЦЕ КНОПКА 1')          
        imgui.End()
    end
end


function hook.onShowDialog(dialogId, style, title ,button1, button2, text)
    lua_thread.create(function()
        if activation then
            wait(100)
            if dialogId == (32) and ac then
                sampSendDialogResponse(dialogId, 1, sampGetCurrentDialogListItem(), 'Фаст следите, требуется помощь')
                ac = false
                return false
            end
        end
    end)
end

function imgui.TextQuestion(text)
    imgui.TextDisabled('( ? )')
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.PushTextWrapPos(450)
        imgui.TextUnformatted(text)
        imgui.PopTextWrapPos()
        imgui.EndTooltip()
    end
end


function main()
while not isSampAvailable() do wait(3000) end
sampRegisterChatCommand("test", function() main_window_state.v = not main_window_state.v end)
while true do
   wait(0)
     imgui.Process = main_window_state.v
     end
end    


function main()
    while true do
        wait(0)
        if testCheat('test') then
            sampSendChat("/lock")
        end
    end
end
У тебя 2-e функции main, в 1 вставь все.
 
  • Нравится
Реакции: Fabregoo

neverlane

t.me/neverlane00
Друг
997
1,132
  • Нравится
Реакции: Fabregoo

Vespan

loneliness
Проверенный
2,105
1,634
Lua:
local sampev = require 'samp.events'

function sampev.onSendDeathNotification(reason, killerId)
     --code
end
-- или
function sampev.onPlayerDeathNotification(killerId,killedId,reason)
    --code
end
41574

Lua:
function sampev.onSendDeathNotification(reason, killerId)
    sampAddChatMessage('killed:'..killerId..' | :'..reason, -1)
end
не работает чёто
 

Fabregoo

Известный
656
128
function main()
while not isSampAvailable() do wait(3000) end
sampRegisterChatCommand("test", function() main_window_state.v = not main_window_state.v end)
while true do
wait(0)
imgui.Process = main_window_state.v
if testCheat('test') then
sampSendChat('/test')
end
end
end

Serega_Tofik самый сексуальный тащир.
Как добавлять сразу несколько биндов?