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

neverlane

t.me/neverlane00
Друг
997
1,132
Как сделать текст-ссылку? Например:
if imgui.Link(текст) then
---
end

-- отображаться должен только текст, ну, синего цвета, например.
-- при наведении текст становится светлосиним или подчеркнутым
-- при клике по ссылке возвращает true
используй imgui.IsItemHovered и imgui.IsMouseClicked
пример
Lua:
imgui.Text(u8"Донат")
if imgui.IsItemHovered() then
    if imgui.IsMouseClicked(0,false) then
        os.execute('explorer https://www.donationalerts.com/r/ronnyevans')
    end
end
 
  • Нравится
Реакции: Double Tap Inside

Double Tap Inside

Известный
Проверенный
1,899
1,254
используй imgui.IsItemHovered и imgui.IsMouseClicked
пример
Lua:
imgui.Text(u8"Донат")
if imgui.IsItemHovered() then
    if imgui.IsMouseClicked(0,false) then
        os.execute('explorer https://www.donationalerts.com/r/ronnyevans')
    end
end
Супер. Но как изменить цвет этого текста при нведении?
 

McLore

Известный
559
279
Подскажите как правильно подрузить текст в InputTextMultiline из таблицы, почему то всегда выводит последние значение в таблице
1591283708506.png

1591283731076.png
 

neverlane

t.me/neverlane00
Друг
997
1,132
Супер. Но как изменить цвет этого текста при нведении?
Хотя есть один костыль через invisiblebutton

Lua:
local add = ''
imgui.InvisibleButton('invis',imgui.ImVec2(150,20))
if imgui.IsItemHovered() then
    add = 'hovered'
    if imgui.IsMouseClicked(0,false) then
        setClipboardText('https://www.donationalerts.com/r/ronnyevans')
        arzmessage('Ссылка скопирована',5)
    end
end
imgui.SameLine(10)
imgui.CenterText(fa.ICON_MONEY..u8' Донат'..add)
Подскажите как правильно подрузить текст в InputTextMultiline из таблицы, почему то всегда выводит последние значение в таблице
Посмотреть вложение 58518
Посмотреть вложение 58519
логично что надо к прошлому значению дописывать новое

Lua:
for i = 1, #blacklist do
    blist.v = blist.v .. tostring(blacklist[i]:gsub("&","\n")
end
 
  • Влюблен
Реакции: Double Tap Inside

McLore

Известный
559
279
Хотя есть один костыль через invisiblebutton

Lua:
local add = ''
imgui.InvisibleButton('invis',imgui.ImVec2(150,20))
if imgui.IsItemHovered() then
    add = 'hovered'
    if imgui.IsMouseClicked(0,false) then
        setClipboardText('https://www.donationalerts.com/r/ronnyevans')
        arzmessage('Ссылка скопирована',5)
    end
end
imgui.SameLine(10)
imgui.CenterText(fa.ICON_MONEY..u8' Донат'..add)

логично что надо к прошлому значению дописывать новое

Lua:
for i = 1, #blacklist do
    blist.v = blist.v .. tostring(blacklist[i]:gsub("&","\n")
end
Выводит в строчку
1591284670586.png

1591284682111.png
 

Sedoj

Участник
56
1
Как убрать метку с игрока, если целишься на другого?
Lua:
marker = addBlipForChar
 

G W

Участник
141
5
Крашет, что делать ?
Lua:
 function samp.onServerMessage(color, text)
testid, msg = text:match('.+%[(%d+)]: (.+)')

if testid and msg and msg:find('Тест') then
sampAddChatMessage('Чтобы выдать мут на 15 минут нажмите клавишу CTRL', -1)
end

if isKeyJustPressed(key.VK_CTRL) and testid ~= nil then
sampAddChatMessage('/mute '..testid..' 15')
end
end
 

Cosmo

Известный
Друг
646
2,598
Без всяких invisibleButton

Супер. Но как изменить цвет этого текста при нведении?

Lua:
local link = 'https://www.blast.hk/' -- наша ссылочка

if status_hovered then
    imgui.TextColoredRGB('{0009FF}'..link) -- синенький
else
    imgui.TextColoredRGB('{007BFF}'..link) -- голубенький
end

if imgui.IsItemClicked() then
    os.execute('explorer '..link)
elseif imgui.IsItemHovered() then
    status_hovered = true
else
    status_hovered = false
end

-- (нужна функа TextColoredRGB от imring'а)
 
Последнее редактирование:

fleysher

Новичок
9
1
Как сделать задержку в функции команды? (не шарю вообще за потоки эти)
 

Double Tap Inside

Известный
Проверенный
1,899
1,254
Хотя есть один костыль через invisiblebutton

Lua:
local add = ''
imgui.InvisibleButton('invis',imgui.ImVec2(150,20))
if imgui.IsItemHovered() then
    add = 'hovered'
    if imgui.IsMouseClicked(0,false) then
        setClipboardText('https://www.donationalerts.com/r/ronnyevans')
        arzmessage('Ссылка скопирована',5)
    end
end
imgui.SameLine(10)
imgui.CenterText(fa.ICON_MONEY..u8' Донат'..add)

логично что надо к прошлому значению дописывать новое

Lua:
for i = 1, #blacklist do
    blist.v = blist.v .. tostring(blacklist[i]:gsub("&","\n")
end

Решение
Lua:
function imgui.Link(label, text)
    
    local size = imgui.CalcTextSize(label)
    
    local pos = imgui.GetCursorPos()
    
    imgui.InvisibleButton(label, imgui.ImVec2(size.x, size.y) )
    
    imgui.SameLine()
    
    imgui.SetCursorPos(pos)
    
    if imgui.IsItemHovered() then
    
        if text then
            imgui.BeginTooltip()
            imgui.PushTextWrapPos(640)
            imgui.TextUnformatted(text)
            imgui.PopTextWrapPos()
            imgui.EndTooltip()
        
        end
        
        
        imgui.PushStyleColor(imgui.Col.Text, imgui.ImVec4(0., 0.60, 1, 1))
            imgui.Text(label)
        imgui.PopStyleColor()
        
        if imgui.IsMouseClicked(0) then
            return true
            
        end
        
    else
        imgui.PushStyleColor(imgui.Col.Text, imgui.ImVec4(0, 0.40, 1, 1))
            imgui.Text(label)
        imgui.PopStyleColor()
        
    end
    
end
 
Последнее редактирование:
  • Вау
Реакции: Cosmo

G W

Участник
141
5
Почему она крашет ?
Lua:
 function samp.onServerMessage(color, text)
testid, msg = text:match('.+%[(%d+)]: (.+)')

if testid and msg and msg:find('Тест') then
sampAddChatMessage('Чтобы выдать мут на 15 минут нажмите клавишу CTRL', -1)
end

if isKeyJustPressed(key.VK_CTRL) and testid ~= nil then
sampAddChatMessage('/mute '..testid..' 15')
end
end