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

whyega52

Eblang головного мозга
Модератор
2,839
2,779
https://www.blast.hk/threads/27544/ я это имел ввиду, а не пуш уведомления.
аналог для мимгуи
 

copypaste_scripter

Известный
1,338
263
Lua:
local samp = require 'samp.events'

function main()
  if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    sampRegisterChatCommand('script', function()
        activated = not activated
        sampAddChatMessage("script activated = " .. tostring(activated), -1)
    end)
    while true do wait(0)
        if activated then
            for i = 1, 10 do
                if not activated then break end
                setVirtualKeyDown(VK_MENU, true)
                wait(100)
                setVirtualKeyDown(VK_MENU, false)
                wait(300)
                sampSendDialogResponse(1482, 3, 0, false)
                wait(300)
            end
        end
    end
end

ничего не происходит, скрипт не выдает ошибок, должен нажать альт, потом выбрать из диалога пункт и так 10 раз
1666877616772.png
 
Последнее редактирование:

Мандрагора

Участник
77
4
Есть цвет основного чилда, есть цвет внутреннего.
Основной я задаю через стили ChildWindowBg, а как мне на внутренний повесить цвет элемента, который не используется?

Lua:
colors[clr.ChildWindowBg] = ImVec4(0.11, 0.28, 0.34, 1.00)
colors[clr.PopupBg] = ImVec4(0.15, 0.25, 0.28, 1.00)

imgui.BeginChild("###2", imgui.ImVec2(788, 482), true) -- для этого я задал цвет в стилях

    imgui.PushStyleColor(imgui.Col.ChildWindowBg, imgui.Col.PopupBg???) -- для этого как через цвет ненцжного элемента накинуть?
        imgui.BeginChild("###2", imgui.ImVec2(788, 482), true)
            ------------------------------------------------------------------
        imgui.EndChild()
    imgui.PopStyleColor()

imgui.EndChild()
 

whyega52

Eblang головного мозга
Модератор
2,839
2,779
знаю про эту тему, но это не то что мне нужно.
как сделать хоткей в мимгуи?


Как правильно зарегать команду?
Lua:
local mainIni = inicfg.load({
    config =
    {
        command = /rak
    }
}, "raknet.ini")

-- main()
sampRegisterChatCommand(tostring(mainIni.config.command), function() config.mainWindow[0], config.titleWindow[0] = not config.mainWindow[0], not config.titleWindow[0] end)
 
Последнее редактирование:

XRLM

Против ветра рождённый
Модератор
1,570
1,154


Как правильно зарегать команду?
Lua:
local mainIni = inicfg.load({
    config =
    {
        command = /rak
    }
}, "raknet.ini")

-- main()
sampRegisterChatCommand(tostring(mainIni.config.command), function() config.mainWindow[0], config.titleWindow[0] = not config.mainWindow[0], not config.titleWindow[0] end)
Lua:
local mainIni = inicfg.load({
    config =
    {
        command = 'rak'
    }
}, "raknet.ini")

-- main()

sampRegisterChatCommand(mainIni.config.command, function() config.mainWindow[0], config.titleWindow[0] = not config.mainWindow[0], not config.titleWindow[0] end)
 
  • Клоун
  • Нравится
Реакции: Air_Official и whyega52

chapo

tg/inst: @moujeek
Модератор
9,072
12,034
Как правильно зарегать команду?
Lua:
local mainIni = inicfg.load({
    config =
    {
        command = /rak
    }
}, "raknet.ini")

-- main()
sampRegisterChatCommand(tostring(mainIni.config.command), function() config.mainWindow[0], config.titleWindow[0] = not config.mainWindow[0], not config.titleWindow[0] end)
если планируешь добавить изменение команды прямо в скрипте, то лучше хукай отправку команды:
Lua:
local Command = '/hui'

addEventHandler('onSendRpc', function(id, bs)
    if id == 50 then
        local cmd = raknetBitStreamReadString(bs, raknetBitStreamReadInt32(bs))
        if cmd_text == Command then
            -- code
            return false
        end
    end
end)

-- ИЛИ
local sampev = require('lib.samp.events')

function sampev.onSendCommand(command)
    if command == Command then
        -- Code
        return false
    end
end
 
  • Нравится
Реакции: whyega52 и XRLM

whyega52

Eblang головного мозга
Модератор
2,839
2,779
если планируешь добавить изменение команды прямо в скрипте, то лучше хукай отправку команды:
Lua:
local Command = '/hui'

addEventHandler('onSendRpc', function(id, bs)
    if id == 50 then
        local cmd = raknetBitStreamReadString(bs, raknetBitStreamReadInt32(bs))
        if cmd_text == Command then
            -- code
            return false
        end
    end
end)

-- ИЛИ
local sampev = require('lib.samp.events')

function sampev.onSendCommand(command)
    if command == Command then
        -- Code
        return false
    end
end
у мя такая бабайка
Lua:
local config = {
    command = new.char[256]("/rak")
}

if imgui.InputText(u8"Команда активации меню", config.command, sizeof(config.command)) then
    mainIni.config.command = u8:decode(str(config.command))
    inicfg.save(mainIni, "raknet.ini")
end

Lua:
local mainIni = inicfg.load({
    config =
    {
        command = 'rak'
    }
}, "raknet.ini")

-- main()

sampRegisterChatCommand(mainIni.config.command, function() config.mainWindow[0], config.titleWindow[0] = not config.mainWindow[0], not config.titleWindow[0] end)
не робит чет
 
Последнее редактирование:

maxymkaa0

Новичок
27
2
Хотел проверить isKeyDown() и написал очень простой скриптик, но почему то 30 строчка просто не работает (должна нажиматься стрелочка вниз). Как это исправить?
Заранее спасибо всем.
lua:
script_name ('test')
script_author ('test')
script_description ('test')

require "lib.moonloader"
local keys = require "vkeys"

local tag = ('test is loaded.')
local label = 0
local main_color = 0x008B8B
local main_color_text = "{00FFFF}"
local white_color = "{FFFFFF}"

function main()
     if not isSampLoaded () or not isSampfuncsLoaded () then return end
     while not isSampAvailable() do wait(100) end
   
     if label == 1 then
        sampAddChatMessage(tag, 0x00FFFF)
     else
        sampAddChatMessage(tag, 0x00FFFF)
     end
   
     while true do
        wait(0)
       
        if isKeyDown(VK_M) then
            sampSendChat("/mm")
            wait(300)
            setVirtualKeyDown(34, false)
            wait(100)
            setVirtualKeyDown(13, false)
        end
    end  
end
 
  • Ха-ха
Реакции: ARMOR

chapo

tg/inst: @moujeek
Модератор
9,072
12,034
Из-за чего может возникать ошибка
Lua:
 opcode '0107' call caused an unhandled exception
stack traceback:
    [C]: in function 'createObject'
?
В коде объекты спавнятся много раз, при этом ошибка вылезает на рандомной строке
 

maxymkaa0

Новичок
27
2
потому что надо так
Lua:
setVirtualKeyDown(34, true)
wait(10)
setVirtualKeyDown(34, false)
wait(10)
setVirtualKeyDown(13, true)
wait(10)
setVirtualKeyDown(13, false)

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

ARMOR

Мне кажется, я всё проебал
Модератор
5,018
7,093
как проверять серверный текст через таблицу, чтобы километрового кода не было? чет башка не варит уже.
Lua:
function ev.onServerMessage(color, text)
    for k, v in ipairs(array) do
        if text:find(v) then
            sampAddChatMessage("1", -1)
        end
    end
end
 
  • Нравится
Реакции: XRLM

whyega52

Eblang головного мозга
Модератор
2,839
2,779
Из-за чего может возникать ошибка
Lua:
 opcode '0107' call caused an unhandled exception
stack traceback:
    [C]: in function 'createObject'
?
В коде объекты спавнятся много раз, при этом ошибка вылезает на рандомной строке
попробуй в pcall засунуть
 

chapo

tg/inst: @moujeek
Модератор
9,072
12,034
попробуй в pcall засунуть
пробовал, скрипт не крашит, но я все ровно не знаю как фиксить
1666888878105.png

Lua:
                math.randomseed(os.clock() * math.random(1999, 9999))
                local Rand = 3--math.random(1, #EnvTemplate)

                for X = Map.GameFieldX + 20, Map.GameFieldEndX, 500 do
                    for k, object in ipairs(EnvTemplate[Rand]) do
                        if not hasModelLoaded(object.model) then
                            requestModel(object.model)
                            loadAllModelsNow()
                        end
                        local Result, Object = pcall(createObject, object.model, X + object.x, Map.Lobby.Pos[2] + object.y, Map.Lobby.Pos[3] + object.z)
                        if Result then
                            table.insert(Map.Objects.Environment, Object)
                            setObjectHeading(Map.Objects.Environment[#Map.Objects.Environment], object.heading or 0)
                            setObjectScale(Map.Objects.Environment[#Map.Objects.Environment], object.scale or 1)
                            print('[MAP][ENVIRONMENT] SPAWNED', object.model, X + object.x, Map.Lobby.Pos[2] + object.y, Map.Lobby.Pos[3] + object.z)
                        else
                            print('[MAP][ENVIRONMENT]{ff0000}[ERROR]{ffffff} ERROR SPAWNIN OBJECT, MODEL,MODEL_LOADED,X,Y,Z:', object.model, hasModelLoaded( object.model), X + object.x, Map.Lobby.Pos[2] + object.y, Map.Lobby.Pos[3] + object.z, Object)
                        end
                    end
                end
 
D

deleted-user-422095

Гость
пробовал, скрипт не крашит, но я все ровно не знаю как фиксить
Посмотреть вложение 174867
Lua:
                math.randomseed(os.clock() * math.random(1999, 9999))
                local Rand = 3--math.random(1, #EnvTemplate)

                for X = Map.GameFieldX + 20, Map.GameFieldEndX, 500 do
                    for k, object in ipairs(EnvTemplate[Rand]) do
                        if not hasModelLoaded(object.model) then
                            requestModel(object.model)
                            loadAllModelsNow()
                        end
                        local Result, Object = pcall(createObject, object.model, X + object.x, Map.Lobby.Pos[2] + object.y, Map.Lobby.Pos[3] + object.z)
                        if Result then
                            table.insert(Map.Objects.Environment, Object)
                            setObjectHeading(Map.Objects.Environment[#Map.Objects.Environment], object.heading or 0)
                            setObjectScale(Map.Objects.Environment[#Map.Objects.Environment], object.scale or 1)
                            print('[MAP][ENVIRONMENT] SPAWNED', object.model, X + object.x, Map.Lobby.Pos[2] + object.y, Map.Lobby.Pos[3] + object.z)
                        else
                            print('[MAP][ENVIRONMENT]{ff0000}[ERROR]{ffffff} ERROR SPAWNIN OBJECT, MODEL,MODEL_LOADED,X,Y,Z:', object.model, hasModelLoaded( object.model), X + object.x, Map.Lobby.Pos[2] + object.y, Map.Lobby.Pos[3] + object.z, Object)
                        end
                    end
                end
Лимит на объекты превышен, попробуй с Open Limit Adjuster или fastman92 limit adjuster
 

Мандрагора

Участник
77
4
Есть цвет основного чилда, есть цвет внутреннего.
Цвет основного я задаю через стили для ChildWindowBg, а как мне на внутренний повесить цвет другого элемента?

Lua:
colors[clr.ChildWindowBg] = ImVec4(0.11, 0.28, 0.34, 1.00)
colors[clr.PopupBg] = ImVec4(0.15, 0.25, 0.28, 1.00)

imgui.BeginChild("###2", imgui.ImVec2(788, 482), true) -- для этого я задал цвет в стилях

    imgui.PushStyleColor(imgui.Col.ChildWindowBg, imgui.Col.PopupBg???) -- Как мне на этот повесить цвет другого элемента, например, PopupBg?
        imgui.BeginChild("###2", imgui.ImVec2(788, 482), true)
        
            ------------------------------------------------------------------
            
        imgui.EndChild()
    imgui.PopStyleColor()

imgui.EndChild()