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

Карен

Участник
112
17
У тебя есть функция runToPoint(), ты ее объявляешь где-нибудь в коде только 1 раз, чтобы вызвать ее, она принимает два аргумента: координаты x, y, на которые будет бежать перс, чтобы ее вызвать тебе надо написать название функции и вставить два значения (x, y)
Да это я понял, я хочу в runToPoint поставить переменную, челик мне скинул код но он с помощью команды, как без команды туда переменную всунуть?
 

вайега52

Налуашил состояние
Модератор
2,978
3,096
Да это я понял, я хочу в runToPoint поставить переменную, челик мне скинул код но он с помощью команды, как без команды туда переменную всунуть?
Вместо значений вставь две переменные 😐
 

Карен

Участник
112
17
Ребята теперь еще одна проблема
Lua:
[/B]
function sampev.onSetObjectMaterialText(id, data)
    if data.text:find('Номер %d+%. {......}Свободная!') then
        sampAddChatMessage(data.text, -1)
        sampAddChatMessage(object, -1)
        local object = sampGetObjectHandleBySampId(id) 
        table.insert(lavki, object)
    else
        local ob = sampGetObjectHandleBySampId(id)
        for i = 1, #lavki do
            if ob == lavki[i] then
                table.remove(lavki, i)
            end
        end
    end
    if data.text:find('Номер 45. {......}Свободная!') then
        local obj = sampGetObjectHandleBySampId(id)
        sampAddChatMessage('Работает'.. data.text, -1)
        local Lx, Ly, Lz = getCharCoordinates(PLAYER_PED)
        local yX, yY = convert3DCoordsToScreen(x, y, z)
        sampAddChatMessage(yX, -1)
        sampAddChatMessage(yY, -1)
        runToPoint(yX, yY)
    end    
end
[B]
Координаты на 22 строчке особенно Y почему-то пишется без минуса (-), и скрипт не понимает куда идти, почему так? Как можно решить?
 

вайега52

Налуашил состояние
Модератор
2,978
3,096
Ребята теперь еще одна проблема
Lua:
[/B]
function sampev.onSetObjectMaterialText(id, data)
    if data.text:find('Номер %d+%. {......}Свободная!') then
        sampAddChatMessage(data.text, -1)
        sampAddChatMessage(object, -1)
        local object = sampGetObjectHandleBySampId(id) 
        table.insert(lavki, object)
    else
        local ob = sampGetObjectHandleBySampId(id)
        for i = 1, #lavki do
            if ob == lavki[i] then
                table.remove(lavki, i)
            end
        end
    end
    if data.text:find('Номер 45. {......}Свободная!') then
        local obj = sampGetObjectHandleBySampId(id)
        sampAddChatMessage('Работает'.. data.text, -1)
        local Lx, Ly, Lz = getCharCoordinates(PLAYER_PED)
        local yX, yY = convert3DCoordsToScreen(x, y, z)
        sampAddChatMessage(yX, -1)
        sampAddChatMessage(yY, -1)
        runToPoint(yX, yY)
    end    
end
[B]
Координаты на 22 строчке особенно Y почему-то пишется без минуса (-), и скрипт не понимает куда идти, почему так? Как можно решить?
Тебе не надо конвертировать из 3д в 2д
 

Sadow

Известный
1,420
587
А как можно в SliderInt убрать 0.? Именно чтобы показывало без 0., а сохраняло с 0. И что отвечает за обводку Mimgui окна? Как для определённого окна в Mimgui сделать отдельный стиль? Как правильно сделать настройку прозрачности через SliderInt для Mimgui?
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,203
12,526
А как можно в SliderInt убрать 0.? Именно чтобы показывало без 0., а сохраняло с 0.
ну сделай SliderInt и потом дели его значение. Например так:

Lua:
local mySlider = imgui.new.int(500)

imgui.SliderInt('My value', mySlider, 0, 1000)

print(mySlider[0] / 1000)
И что отвечает за обводку Mimgui окна?
Lua:
imgui.StyleVar.WindowBorderSize -- размер обводки окна в пикселях
imgui.Col.Border -- цвет обводки
Как для определённого окна в Mimgui сделать отдельный стиль?
Lua:
imgui.PushStyleColor(imgui.Col.Border, imgui.ImVec4(1, 0, 0, 1))
if imgui.Begin('red border') then
    imgui.Text('red border!')
    imgui.End()
end
imgui.PopStyleColor()

imgui.PushStyleVarFloat(imgui.StyleVar.WindowBorderSize, 5)
imgui.PushStyleColor(imgui.Col.Border, imgui.ImVec4(1, 1, 1, 1))
if imgui.Begin('WHITE border (bolshoy razmer obvodki)') then
    imgui.Text('WHITE border! (bolshoy razmer obvodki)')
    imgui.End()
end
imgui.PopStyleColor()
imgui.PopStyleVar()
 

Sadow

Известный
1,420
587
ну сделай SliderInt и потом дели его значение. Например так:

Lua:
local mySlider = imgui.new.int(500)

imgui.SliderInt('My value', mySlider, 0, 1000)

print(mySlider[0] / 1000)

Lua:
imgui.StyleVar.WindowBorderSize -- размер обводки окна в пикселях
imgui.Col.Border -- цвет обводки

Lua:
imgui.PushStyleColor(imgui.Col.Border, imgui.ImVec4(1, 0, 0, 1))
if imgui.Begin('red border') then
    imgui.Text('red border!')
    imgui.End()
end
imgui.PopStyleColor()

imgui.PushStyleVarFloat(imgui.StyleVar.WindowBorderSize, 5)
imgui.PushStyleColor(imgui.Col.Border, imgui.ImVec4(1, 1, 1, 1))
if imgui.Begin('WHITE border (bolshoy razmer obvodki)') then
    imgui.Text('WHITE border! (bolshoy razmer obvodki)')
    imgui.End()
end
imgui.PopStyleColor()
imgui.PopStyleVar()
Как правильно сделать настройку прозрачности через SliderInt для Mimgui?
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,203
12,526
Как правильно сделать настройку прозрачности через SliderInt для Mimgui?
Lua:
local window_transparency = imgui.new.int(100) -- проще было бы с флоатом, но пох

imgui.PushStyleVar(imgui.Col.WindowBg, imgui.ImVec4(R, G, B, window_transparency[0] / 100)) -- R, G и B - цвета окна
-- window
imgui.PopStyleVar()
 
  • Нравится
Реакции: Sadow

Terratomorf

Известный
315
58
Подскажите пожалуйста как сделать, телепорт по объекту ид 874 работает, но как сделать что бы он зафризился на месте последнего телепорта, так как он подезмлёй это делает и падает когда заканчивается подбор объекта 874, нужно что бы он дальше ждал появления этого объекта и не падал под землёй вниз(кд появления объекта 3 минуты)
Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    getLastUpdate() -- вызываем функцию получения последнего ID сообщения
    sampRegisterChatCommand('telegram',function() -- тестовая команда
        sampAddChatMessage('[Telegram] Отправляю тестовое сообщение',-1)
        sendTelegramNotification('Тестовое сообщение от '..sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))) -- отправляем сообщение юзеру
    end)
    lua_thread.create(get_telegram_updates)

    sampRegisterChatCommand('rmine', function()
        window.v = not window.v
        imgui.Process = window.v
    end)

    while true do
        wait(0)
        if en.v then
            lockPlayerControl(true)
            freezeCharPosition(PLAYER_PED, true)
            for _, v in pairs(getAllObjects()) do
                local asd
                if sampGetObjectSampIdByHandle(v) ~= -1 then
                    asd = sampGetObjectSampIdByHandle(v)
                end
                if isObjectOnScreen(v) then
                    local _, x, y, z = getObjectCoordinates(v)
                    local x1, y1 = convert3DCoordsToScreen(x,y,z)
                    local model = getObjectModel(v)
                    local x2,y2,z2 = getCharCoordinates(PLAYER_PED)
                    local x10, y10 = convert3DCoordsToScreen(x2,y2,z2)
                    local distance = string.format("%.1f", getDistanceBetweenCoords3d(x, y, z, x2, y2, z2))
                    if model == 874 and getDistanceBetweenCoords3d(x, y, z, x2, y2, z2) <= 1000000 then
                        lockPlayerControl(true)
                        freezeCharPosition(PLAYER_PED, true)
                        renderFontDrawText(font, (asd and "model = "..model.."; id = "..asd or "model = "..model).."; distance: "..distance.."; coords: x:"..x.."y:"..y.."z:"..z, x1, y1, -1)
                        setCharCoordinates(1,x,y,z-3)
                    end
                end
            end
        end
    end
end
 

Sadow

Известный
1,420
587
Как добавить символ в SliderInt? Чтобы было например: 90%. Использую мимгуи. Какие элементы стиля в Mimgui отвечают за: Все элементы с меняющим значением (кнопки, sliderInt, checkbox, combobox и тому подобное) и за заголовок?
 
Последнее редактирование:

Andrinall

Известный
704
527
Как добавить символ в SliderInt? Чтобы было например: 90%. Использую мимгуи. Какие элементы стиля в Mimgui отвечают за: Все элементы с меняющим значением (кнопки, sliderInt, checkbox, combobox и тому подобное) и за заголовок?
imgui.SliderInt('test', test --[[ int* ]], 0 --[[ min ]], 100 --[[ max ]], "%d%%" --[[ format ]])
1671092990416.png
 
  • Нравится
Реакции: Sadow