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

Oki_Bern

Участник
297
8
Хотел эмулировать рпс. Через addEventHandler("onSendRpc", function(id, bitstream) все робит, а вне этой функции не выходит, в чем проблема?
Lua:
local test = false
function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand("xd", function()
        test = true
    end)

    while true do wait(0)
        if test then
            local bitstream = 24637976
            local temp = raknetNewBitStream()
            raknetBitStreamWriteBitStream(temp, bitstream)
            raknetSendRpc(62, temp)
            raknetDeleteBitStream(temp)
            test = false
        end
    end
end


addEventHandler("onSendRpc", function(id, bitstream)
    if id == 62 then
      lua_thread.create(function()
        local temp = raknetNewBitStream()
        raknetBitStreamWriteBitStream(temp, bitstream)
        raknetSendRpc(id, temp)
        raknetDeleteBitStream(temp)
      end)
      return false
    end
end)
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,259
12,701
Хотел эмулировать рпс. Через addEventHandler("onSendRpc", function(id, bitstream) все робит, а вне этой функции не выходит, в чем проблема?
Lua:
local test = false
function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand("xd", function()
        test = true
    end)

    while true do wait(0)
        if test then
            local bitstream = 24637976
            local temp = raknetNewBitStream()
            raknetBitStreamWriteBitStream(temp, bitstream)
            raknetSendRpc(62, temp)
            raknetDeleteBitStream(temp)
            test = false
        end
    end
end


addEventHandler("onSendRpc", function(id, bitstream)
    if id == 62 then
      lua_thread.create(function()
        local temp = raknetNewBitStream()
        raknetBitStreamWriteBitStream(temp, bitstream)
        raknetSendRpc(id, temp)
        raknetDeleteBitStream(temp)
      end)
      return false
    end
end)
addEventHandler замени на function onSendRpc, затем просто вызывай ее и передавай ид и созданный битстрим в качестве аргументов
 
  • Нравится
Реакции: Oki_Bern

sep

Известный
714
79
помогите с регуляркой [Family Murzik] Усатый нянь nil_nik: время

ваше не понимаю как вы делаете регулярку
 

Oleg1337228

Известный
433
21
сделайте пожалуйста кто может скрипт "Chief_Black и Mari_Guerra бросили кости. Результат: {CC9900}4 : 2" нужно чтобы после активации скрипта после подобной строчки в чате с моим ником "Chief_Black" чтобы на другие не реагировало в чат писалась комманда /dice 22 3000000 я потом сам поменяю и задержку чтобы можно было поставить буду очень благодарен.
 

WinOS

Участник
15
1
сделайте пожалуйста кто может скрипт "Chief_Black и Mari_Guerra бросили кости. Результат: {CC9900}4 : 2" нужно чтобы после активации скрипта после подобной строчки в чате с моим ником "Chief_Black" чтобы на другие не реагировало в чат писалась комманда /dice 22 3000000 я потом сам поменяю и задержку чтобы можно было поставить буду очень благодарен.
Напиши мне в ТГ, помогу. А то я чутка не понял что ты хочешь.
TG: @Empty_Domain
 

dmitry.karle

Известный
407
108
помогите с регуляркой [Family Murzik] Усатый нянь nil_nik: время

ваше не понимаю как вы делаете регулярку
Lua:
if text:find('%[.+%] Усатый нянь .+: время') then
    f, n = text:match('%[(.+)%] Усатый нянь (.+): время')
    sampAddChatMessage('['..f..'] Усатый нянь '..n..': время', -1)
end

то что тебе надо в регулярку: помечай в скобки и давай ей регулярку (какую хочешь, то и пиши (для вывода регулярки), можешь для себя понятней писать) и выводи её куда тебе надо. Это просто тебе для примера

 

qqware

Участник
11
11
как добавить картинку на фон, именно картинку именно на фон а не в меню
 

Июнь

Участник
19
16
Как в mimgui получить возможный размер окна по содержимому?
Есть такой флаг - imgui.WindowFlags.AlwaysAutoResize - он подгоняет размеры окна под его содержимое.
Есть ли способ получить размер, который выдал бы imgui.WindowFlags.AlwaysAutoResize, или другой способ, способный подгонять окно по содержимому?

На примере кода ниже нужен способ, который получил бы размер, не расширяя окно.
К примеру, когда мы откроем вкладку (она по содержанию по ширине явно больше, так как там "Сейчас открыта вторая вкладка! ..............."), но размеры окна остались от предыдущей вкладки, так как у нас не встроен флаг/способ, который расширял бы окно автоматически.

И нужно получить высоту/ширину, которую установил бы autoresize. Нужен именно способ, который определяет размер по содержимому.
Считать (calc'ать) каждый текст вручную - такое решение мне не подойдет, и это только в этом случае дело в тексте; в других это могут быть кнопки, вкладки и т. д.

Интересует решение, если таковое есть, с минималистичным кодом (желательно парой строк :) ).
Прибегал к GetContentRegion, но у меня или лыжи не едут, или он измеряет только видимую область.
Вполне возможно, я делал что-то не так. Мб можно как то с помощью effil?
HELP!!


code::
local imgui = require 'mimgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8

local WinState = imgui.new.bool()

imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500, 500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(u8'Пример', WinState)
    
    if imgui.BeginTabBar('Tabs') then
        if imgui.BeginTabItem(u8'Первая') then
            imgui.Text(u8'Сейчас открыта первая вкладка')
            imgui.EndTabItem()
        end
        if imgui.BeginTabItem(u8'Вторая') then
            imgui.Text(u8'Сейчас открыта вторая вкладка! ............................................................. ')
            if imgui.Button('Test') then
                sampAddChatMessage('Вы нажали кнопку во второй вкладке',-1)
            end
            imgui.EndTabItem()
        end
        imgui.EndTabBar()
    end
    imgui.End()
end)

function main()
    sampRegisterChatCommand('cmd', function() WinState[0] = not WinState[0] end)
    wait(-1)
end
 

sep

Известный
714
79
как поймать сообщение от игрока или свае
function sampev.onServerMessage(color, text)
if text:match('ку') then -- не обязательно полную строку, можно определенный отрывок
sampAddChatMessage("привет")
end
итд
 

Masayuki

Участник
97
40
Lua:
function sampev.onServerMessage(color, text)
    if text:find('ку') then
        lua_thread.create(function()
            wait(0)
            sampAddChatMessage("привет")
        end)
    end
end
 
  • Грустно
Реакции: sep