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

Gorskin

I shit on you
Проверенный
1,247
1,043
Помогите найти ошибку

Lua:
require'lib.moonloader'
local colr = 0xfc05cf
function main()
    if not isSampLoaded() or not  isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
   
    sampRegisterChatCommand("text", cmd_text)
   
end
function cmd_text(arg)
    i = 1
    repeat
        sampAddChatMessage(i, colr)
        i = i+1
    until i >= 10
end
Lua:
require'lib.moonloader'
local colr = 0xfc05cf
function main()
    if not isSampLoaded() or not  isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    
    sampRegisterChatCommand("text", cmd_text)
    wait(-1)
end

function cmd_text(arg)
    i = 1
    repeat
        sampAddChatMessage(i, colr)
        i = i+1
    until i >= 10
end
ты wait забыл в main()
 

blessave

Известный
364
106
setClipboardText
Как сделать чтобы норм копировал кириллицу?

UP

setClipboardText("Русский"), clipboard.settext("Русский") - при CTRL+V выдает кракозябры. Всувывал в кодировке CP1251 и UTF8. Как сделать шоб копировалось нормально с русским?
как сделать все-таки?)
 
Последнее редактирование:

Uzkon

Участник
23
14
setClipboardText
Как сделать чтобы норм копировал кириллицу?

UP


как сделать все-таки?)
Пробовал с включённой русской раскладкой? Проблема как я знаю в винде, и исправляется вроде ток переключением раскладки, хотя я могу ошибаться.
 
  • Нравится
Реакции: YarikVL

blessave

Известный
364
106
Пробовал с включённой русской раскладкой? Проблема как я знаю в винде, и исправляется вроде ток переключением раскладки, хотя я могу ошибаться.
с переключение на русский - все хорошо да, интересно как можно это автоматизировать, либо обходить переключение и копировать нормально
 

KOLBASKA@

Участник
35
0
Выбивает ошибку просит где-то енд не понмиаю где помогите
script.lua: D:\Games\Samp\moonloader\dsscript.lua:32: '=' expected near 'end'

Lua:
require'lib.moonloader'
local colr = 0xfc05cf
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.dafault = 'CP1251'
u8 = encoding.UTF8
function main()
    if not isSampLoaded() or not  isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    
    sampRegisterChatCommand("imgui", cmd_imgui) 
    
    imgui.Process = true
    while true do
        wait(0)
    end
    
end
function cmd_imgui(arg)

end
function imgui.OnDrawFrame()
    imgui.Begin("Start Imgui")
    imgui.Text("You, pidor")
    imgui.End
end
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,771
11,214
Выбивает ошибку просит где-то енд не понмиаю где помогите
script.lua: D:\Games\Samp\moonloader\dsscript.lua:32: '=' expected near 'end'

Lua:
require'lib.moonloader'
local colr = 0xfc05cf
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.dafault = 'CP1251'
u8 = encoding.UTF8
function main()
    if not isSampLoaded() or not  isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
   
    sampRegisterChatCommand("imgui", cmd_imgui)
   
    imgui.Process = true
    while true do
        wait(0)
    end
   
end
function cmd_imgui(arg)

end
function imgui.OnDrawFrame()
    imgui.Begin("Start Imgui")
    imgui.Text("You, pidor")
    imgui.End
end
сюда скобки ебани
1662408637531.png
 
  • Нравится
Реакции: KOLBASKA@

KOLBASKA@

Участник
35
0
спасибо дадя

Здравствуйте, киньте структуру имгуи как мне в imgui.Button добавить события imgui, Типо что бы после нажатия на кнопку выводился опять имгуи
 
Последнее редактирование:

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
спасибо дадя

Здравствуйте, киньте структуру имгуи как мне в imgui.Button добавить события imgui, Типо что бы после нажатия на кнопку выводился опять имгуи
Так, что-ли?
Lua:
require "lib.moonloader"
local imgui = require 'imgui'
local first_window = imgui.ImBool(false)
local second_window = imgui.ImBool(false)

function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("imgui", function() first_window.v = not first_window.v end)
    while true do
        wait(0)
        imgui.Process = first_window.v or second_window.v
    end
end

function imgui.OnDrawFrame()
    if first_window.v then
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(500, 450), imgui.Cond.FirstUseEver)
        imgui.Begin("First window", first_window)
        if imgui.Button("Press") then
            second_windov.v = not second_windov.v
        end
        imgui.End()
    end
    if second_windov.v then
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(500, 450), imgui.Cond.FirstUseEver)
        imgui.Begin("Second window", second_windov)
        imgui.Text("Hi")
        imgui.End()
    end
end
 

Anti...

Участник
242
18
Есть массив
Код:
    local list = {
                    drygoe.list = false
                       drygoe.drova = false
                    drygoe.odezda = false
                    drygoe.kraska = false
                    drygoe.klych = false
                    drygoe.bin = false
                    drygoe.vay = false
                    drygoe.mvay = false
                    drygoe.svay = false
                    drygoe.ovay = false
                    drygoe.mevay = false
                    drygoe.chas = false
                    drygoe.tainik = false
                    drygoe.razia = false
                    drygoe.del = false
                    drygoe.disk = false
                    drygoe.kata = false
                    drygoe.material = false
}
как мне в коде его выключить что бы не писать каждый раз это всё? я хз как это обьяснить

Есть массив
Код:
    local list = {
                    drygoe.list = false
                       drygoe.drova = false
                    drygoe.odezda = false
                    drygoe.kraska = false
                    drygoe.klych = false
                    drygoe.bin = false
                    drygoe.vay = false
                    drygoe.mvay = false
                    drygoe.svay = false
                    drygoe.ovay = false
                    drygoe.mevay = false
                    drygoe.chas = false
                    drygoe.tainik = false
                    drygoe.razia = false
                    drygoe.del = false
                    drygoe.disk = false
                    drygoe.kata = false
                    drygoe.material = false
}
как мне в коде его выключить что бы не писать каждый раз это всё? я хз как это обьяснить
типо что-то на подобии list = false

изменять ключ
 
Последнее редактирование:

Vespan

loneliness
Проверенный
2,101
1,633
Есть массив
Код:
    local list = {
                    drygoe.list = false
                       drygoe.drova = false
                    drygoe.odezda = false
                    drygoe.kraska = false
                    drygoe.klych = false
                    drygoe.bin = false
                    drygoe.vay = false
                    drygoe.mvay = false
                    drygoe.svay = false
                    drygoe.ovay = false
                    drygoe.mevay = false
                    drygoe.chas = false
                    drygoe.tainik = false
                    drygoe.razia = false
                    drygoe.del = false
                    drygoe.disk = false
                    drygoe.kata = false
                    drygoe.material = false
}
как мне в коде его выключить что бы не писать каждый раз это всё? я хз как это обьяснить


типо что-то на подобии list = false

изменять ключ
Lua:
local list = {
    drygoe.list = false
    drygoe.drova = false
    drygoe.odezda = false
    drygoe.kraska = false
    drygoe.klych = false
    drygoe.bin = false
    drygoe.vay = false
    drygoe.mvay = false
    drygoe.svay = false
    drygoe.ovay = false
    drygoe.mevay = false
    drygoe.chas = false
    drygoe.tainik = false
    drygoe.razia = false
    drygoe.del = false
    drygoe.disk = false
    drygoe.kata = false
    drygoe.material = false
}
--
function listF(bool)
    bool = bool or false

    list.drygoe.list = bool
    list.drygoe.drova = bool
    list.drygoe.odezda = bool
    list.drygoe.kraska = bool
    list.drygoe.klych = bool
    list.drygoe.bin = bool
    list.drygoe.vay = bool
    list.drygoe.mvay = bool
    list.drygoe.svay = bool
    list.drygoe.ovay = bool
    list.drygoe.mevay = bool
    list.drygoe.chas = bool
    list.drygoe.tainik = bool
    list.drygoe.razia = bool
    list.drygoe.del = bool
    list.drygoe.disk = bool
    list.drygoe.kata = bool
    list.drygoe.material = bool
    
end--колхоз :>)

listF(false)
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,771
11,214
Есть массив
Код:
    local list = {
                    drygoe.list = false
                       drygoe.drova = false
                    drygoe.odezda = false
                    drygoe.kraska = false
                    drygoe.klych = false
                    drygoe.bin = false
                    drygoe.vay = false
                    drygoe.mvay = false
                    drygoe.svay = false
                    drygoe.ovay = false
                    drygoe.mevay = false
                    drygoe.chas = false
                    drygoe.tainik = false
                    drygoe.razia = false
                    drygoe.del = false
                    drygoe.disk = false
                    drygoe.kata = false
                    drygoe.material = false
}
как мне в коде его выключить что бы не писать каждый раз это всё? я хз как это обьяснить


типо что-то на подобии list = false

изменять ключ
Lua:
local list = {
    drygoe = {
        list = false,
        drova = false,
        odezda = false,
        kraska = false,
        klych = false,
        bin = false,
        vay = false,
        mvay = false,
        svay = false,
        ovay = false,
        mevay = false,
        chas = false,
        tainik = false,
        razia = false,
        del = false,
        disk = false,
        kata = false,
        material = false
    }
}
function Toggle(bool)
    for k, v in pairs(list.drygoe) do
        list.drygoe[k] = bool
    end
end
 
  • Вау
Реакции: sizeoftrickster

Anti...

Участник
242
18
Lua:
local list = {
    drygoe = {
        list = false,
        drova = false,
        odezda = false,
        kraska = false,
        klych = false,
        bin = false,
        vay = false,
        mvay = false,
        svay = false,
        ovay = false,
        mevay = false,
        chas = false,
        tainik = false,
        razia = false,
        del = false,
        disk = false,
        kata = false,
        material = false
    }
}
function Toggle(bool)
    for k, v in pairs(list.drygoe) do
        list.drygoe[k] = bool
    end
end
как с этим работать? типо например мне нужно что бы всё было false кроме 1
 

Ononimus

Потрачен
60
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ребят как сделать что бы остался стандартный имгуи интерфейс но при этом другого цвета некоторые функции внизу скину код измените если не сложно
код:
local imgui = require 'mimgui'
local wm = require 'windows.message'
local vkeys = require 'vkeys'
local ev = require 'lib.samp.events'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local sw, sh = 500, 300
local active = imgui.new.bool(false)
local checkbox = imgui.new.bool(false)

function onWindowMessage(msg, wparam, lparam)
    if msg == wm.WM_KEYUP and wparam == vkeys.VK_M and not sampIsCursorActive() then
        active[0] = not active[0]
    end
end

local mainFrame = imgui.OnFrame(function() return active[0] end, function(self)
    imgui.SetNextWindowSize(imgui.ImVec2(sw, sh), imgui.Cond.FirstUseEver)
    imgui.Begin('Online RP: Mafia Helper V - 0.1', active, imgui.WindowFlags.NoResize)
    if imgui.BeginTabBar(u8'оо') then
        if imgui.BeginTabItem(u8'О хелпере') then
            imgui.Text(u8'Здравствуйте, вас приветствует команда разработчиков')
            imgui.Text(u8'Mafia Helper.') -- Красный
            imgui.Text(u8'Данный хелпер создан для того, чтобы упростить игру')
            imgui.Text(u8'участникам преступных синдикатов, а так же их лидерам и')
            imgui.Text(u8'заместителям.')
            imgui.Text(u8'Команда которая создала данный хелпер, не несёт')
            imgui.Text(u8'ответственности за ваши аккаунты. Качайте хелпер только с')
            imgui.Text(u8'официального форума Online Role Play и') -- ORP ЖОЛТЫМ
            imgui.Text(u8'официального сообщества во ВКонтакте"') -- ВК СИНИМ
            imgui.Separator()
            imgui.Text(u8'Кодер - Wayne Martini.')
            imgui.Text(u8'Оформление - Angel Blanco')
            imgui.Separator()
            imgui.Text(u8' ')
            if imgui.CollapsingHeader(u8'Mafia Helper - обратная связь') then
            end
            imgui.EndTabItem()
        end
        if imgui.BeginTabItem(u8'Для лидеров') then
                        if imgui.Button(u8"Отыграть выдачу формы.") then
                                lua_thread.create(function()
                                sampSendChat("/do sdsd")
                                wait(1200)
                                sampSendChat("/me вава")
                                wait(1234)
                                sampSendChat("/do вава")
                                wait(1234)
                                sampSendChat("вава")
                                end)
                        end
                        if imgui.Button(u8"Отыграть КПК.                  ") then
                                lua_thread.create(function()
                                sampSendChat("/do КПК в кармане.")
                                wait(1233)
                                sampSendChat("/me достал кпк, затем включил его")
                                wait(1233)
                                sampSendChat("/do КПК в руке.")
                                wait(1233)
                                sampSendChat("/me нашол базу данных сотрудника")
                                wait(1233)
                                sampSendChat("/me нажал на нужную кнопку, затем выключил КПК")
                                wait(1000)
                                sampSendChat('/me убрал КПК в левый карман')
                                wait(1000)
                                end)
                        end
                        if imgui.Button(u8"Начать собеседование.   ") then
                                lua_thread.create(function()
                                sampSendChat("/f Начинаем собеседование.")
                                end)
                        end
                        imgui.SameLine()
                        if imgui.Button(u8"Закончить собеседование.") then
                                lua_thread.create(function()
                                sampSendChat("/f Заканчиваем собеседование.")
                                end)
                        end
                        imgui.EndTabItem()
                end
        if imgui.BeginTabItem(u8'Чат') then
                        imgui.Checkbox(u8'Японский акцент.', checkbox)
        end
        if imgui.BeginTabItem(u8'Оружие') then
                        imgui.Checkbox(u8'Авто-отыгровка оружия.', checkbx)
        end
    end
    imgui.End()
end)

function ev.onSendChat(msg)
    return {checkbox[0] and "[Японский акцент]: "..msg or msg}
end

если что нужно изменить верхнию панель imgui.begin на синий
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,771
11,214
ребят как сделать что бы остался стандартный имгуи интерфейс но при этом другого цвета некоторые функции внизу скину код измените если не сложно
код:
local imgui = require 'mimgui'
local wm = require 'windows.message'
local vkeys = require 'vkeys'
local ev = require 'lib.samp.events'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local sw, sh = 500, 300
local active = imgui.new.bool(false)
local checkbox = imgui.new.bool(false)

function onWindowMessage(msg, wparam, lparam)
    if msg == wm.WM_KEYUP and wparam == vkeys.VK_M and not sampIsCursorActive() then
        active[0] = not active[0]
    end
end

local mainFrame = imgui.OnFrame(function() return active[0] end, function(self)
    imgui.SetNextWindowSize(imgui.ImVec2(sw, sh), imgui.Cond.FirstUseEver)
    imgui.Begin('Online RP: Mafia Helper V - 0.1', active, imgui.WindowFlags.NoResize)
    if imgui.BeginTabBar(u8'оо') then
        if imgui.BeginTabItem(u8'О хелпере') then
            imgui.Text(u8'Здравствуйте, вас приветствует команда разработчиков')
            imgui.Text(u8'Mafia Helper.') -- Красный
            imgui.Text(u8'Данный хелпер создан для того, чтобы упростить игру')
            imgui.Text(u8'участникам преступных синдикатов, а так же их лидерам и')
            imgui.Text(u8'заместителям.')
            imgui.Text(u8'Команда которая создала данный хелпер, не несёт')
            imgui.Text(u8'ответственности за ваши аккаунты. Качайте хелпер только с')
            imgui.Text(u8'официального форума Online Role Play и') -- ORP ЖОЛТЫМ
            imgui.Text(u8'официального сообщества во ВКонтакте"') -- ВК СИНИМ
            imgui.Separator()
            imgui.Text(u8'Кодер - Wayne Martini.')
            imgui.Text(u8'Оформление - Angel Blanco')
            imgui.Separator()
            imgui.Text(u8' ')
            if imgui.CollapsingHeader(u8'Mafia Helper - обратная связь') then
            end
            imgui.EndTabItem()
        end
        if imgui.BeginTabItem(u8'Для лидеров') then
                        if imgui.Button(u8"Отыграть выдачу формы.") then
                                lua_thread.create(function()
                                sampSendChat("/do sdsd")
                                wait(1200)
                                sampSendChat("/me вава")
                                wait(1234)
                                sampSendChat("/do вава")
                                wait(1234)
                                sampSendChat("вава")
                                end)
                        end
                        if imgui.Button(u8"Отыграть КПК.                  ") then
                                lua_thread.create(function()
                                sampSendChat("/do КПК в кармане.")
                                wait(1233)
                                sampSendChat("/me достал кпк, затем включил его")
                                wait(1233)
                                sampSendChat("/do КПК в руке.")
                                wait(1233)
                                sampSendChat("/me нашол базу данных сотрудника")
                                wait(1233)
                                sampSendChat("/me нажал на нужную кнопку, затем выключил КПК")
                                wait(1000)
                                sampSendChat('/me убрал КПК в левый карман')
                                wait(1000)
                                end)
                        end
                        if imgui.Button(u8"Начать собеседование.   ") then
                                lua_thread.create(function()
                                sampSendChat("/f Начинаем собеседование.")
                                end)
                        end
                        imgui.SameLine()
                        if imgui.Button(u8"Закончить собеседование.") then
                                lua_thread.create(function()
                                sampSendChat("/f Заканчиваем собеседование.")
                                end)
                        end
                        imgui.EndTabItem()
                end
        if imgui.BeginTabItem(u8'Чат') then
                        imgui.Checkbox(u8'Японский акцент.', checkbox)
        end
        if imgui.BeginTabItem(u8'Оружие') then
                        imgui.Checkbox(u8'Авто-отыгровка оружия.', checkbx)
        end
    end
    imgui.End()
end)

function ev.onSendChat(msg)
    return {checkbox[0] and "[Японский акцент]: "..msg or msg}
end

если что нужно изменить верхнию панель imgui.begin на синий
 
  • Вау
Реакции: sizeoftrickster