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

M_D

Участник
8
0
Помогите пожалуйста найти красную линию которая растягивается и уменьшается. Проблема в том, что через Textdraw её не находит, что видно на скриншоте. А мне нужно дописать скрипт, так как я не могу найти динамичные координаты красной полоски. Кто знает как найти передвижение красной полоски, подскажите?
IMG_20250926_144013.jpg
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,205
12,533
Помогите пожалуйста найти красную линию которая растягивается и уменьшается. Проблема в том, что через Textdraw её не находит, что видно на скриншоте. А мне нужно дописать скрипт, так как я не могу найти динамичные координаты красной полоски. Кто знает как найти передвижение красной полоски, подскажите?Посмотреть вложение 279074
Все он находит, скачай текстдрав эдитор и потыкай их. Размер самой полоски это скорее всего boxWidth
 

VanoKLR

Известный
1,115
755
Код:
addEventHandler('onReceivePacket', function(id, bs)
    if id == 69 then
    
    end
end)
                                                                 -- так будет работать               
addEventHandler('onReceivePacket', function(id, bs)
    if id == 70 then
    
    end
end)
================================================================
function onReceivePacket(id,bs)
    if id == 155 then
    
    end
end
                                                                         -- будет работает только один (какой не помню)
function onReceivePacket(id,bs)
    if id == 220 then
    
    end
end
======================================================================
--но можно так
function onReceivePacket(id,bs)
    if id == 155 then
    
    elseif id == 221 then
    ... и тд
    
    
    end
end
Вопрос: Какой вариант события лучше, и почему ?

Lua:
function onReceivePacket(id, bs)
end

Или

Lua:
addEventHandler('onReceivePacket', function(id, bs)
end)

Или особой разницы нету, кроме того что через addEventHandler можно вызвать событие в какой-нибудь функции, а не просто при запуске скрипта ?
разницы нету, только в евентхандлере можно несколько раз в скрипте использовать событие, если без него то 2 раза работать не будет

Вопрос: Какой вариант события лучше, и почему ?

Lua:
function onReceivePacket(id, bs)
end

Или

Lua:
addEventHandler('onReceivePacket', function(id, bs)
end)

Или особой разницы нету, кроме того что через addEventHandler можно вызвать событие в какой-нибудь функции, а не просто при запуске скрипта ?
Код:
addEventHandler('onReceivePacket', function(id, bs)
    if id == 69 then
   
    end
end)
                                                                 -- так будет работать              
addEventHandler('onReceivePacket', function(id, bs)
    if id == 70 then
   
    end
end)
================================================================
function onReceivePacket(id,bs)
    if id == 155 then
   
    end
end
                                                                         -- будет работает только один (какой не помню)
function onReceivePacket(id,bs)
    if id == 220 then
   
    end
end
======================================================================
--но можно так
function onReceivePacket(id,bs)
    if id == 155 then
   
    elseif id == 221 then
    ... и тд
   
   
    end
end
разницы нету, только в евентхандлере можно несколько раз в скрипте использовать событие, если без него то 2 раза работать не будет
 
Последнее редактирование:
  • Нравится
Реакции: Funny Rofl

Oleg1337228

Участник
421
20
этот скрипт работает только если играть с Оливией в казино на аризона рп но если я ввожу вместо 1001 (Оливия) айди игрока то он не работает помогите пожалуйста сделайте чтобы ставка кидалась и игроку после того как он принял ставку
 

Вложения

  • CasinoOlivia.lua
    1.8 KB · Просмотры: 6

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,205
12,533
Хотел эмулировать рпс. Через 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

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

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

Oleg1337228

Участник
421
20
сделайте пожалуйста кто может скрипт "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

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

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

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

 

qqware

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

Июнь

Новичок
11
15
Как в 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